summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Blank <mblank@google.com>2012-06-28 10:40:46 -0700
committerMarc Blank <mblank@google.com>2012-06-28 11:15:06 -0700
commitf419287f22ae44f25e1ba1f757ec33c7941bbfa8 (patch)
treea8cc187af29703d848962acdd3f76a527b63b000
parent1c9d351b64d9e7a5befe8e508c7f98da51c8fe59 (diff)
downloadandroid_packages_apps_Email-f419287f22ae44f25e1ba1f757ec33c7941bbfa8.tar.gz
android_packages_apps_Email-f419287f22ae44f25e1ba1f757ec33c7941bbfa8.tar.bz2
android_packages_apps_Email-f419287f22ae44f25e1ba1f757ec33c7941bbfa8.zip
DO NOT MERGE: Move emailcommon2 sources to emailcommon
Change-Id: I06df7e467cd2e0117df8b8db3ddc6ff9da13f1c7
-rw-r--r--Android.mk41
-rw-r--r--AndroidManifest.xml427
-rw-r--r--CleanSpec.mk79
-rw-r--r--email2/Android.mk61
-rw-r--r--email2/AndroidManifest.xml530
-rw-r--r--email2/assets/loading.gifbin1969 -> 0 bytes
-rw-r--r--email2/assets/loading.html17
-rw-r--r--email2/assets/test.html18
-rw-r--r--email2/emailcommon/Android.mk43
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/AccountManagerTypes.java23
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/Api.java29
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/Configuration.java23
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/Device.java112
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/Logging.java47
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/TempDirectory.java42
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/TrafficFlags.java97
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/internet/BinaryTempFileBody.java89
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/internet/MimeBodyPart.java193
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/internet/MimeHeader.java153
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/internet/MimeMessage.java626
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/internet/MimeMultipart.java111
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/internet/MimeUtility.java453
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/internet/Rfc822Output.java377
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/internet/TextBody.java62
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/Address.java428
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/AuthenticationFailedException.java34
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/Body.java26
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/BodyPart.java25
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/CertificateValidationException.java30
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/FetchProfile.java85
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/Fetchable.java24
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/Flag.java79
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/Folder.java209
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/MeetingInfo.java30
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/Message.java159
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/MessageDateComparator.java34
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/MessagingException.java136
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/Multipart.java63
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/PackedString.java176
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/mail/Part.java52
-rwxr-xr-xemail2/emailcommon/src/com/android/emailcommon/provider/Account.java945
-rwxr-xr-xemail2/emailcommon/src/com/android/emailcommon/provider/EmailContent.java1564
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/provider/HostAuth.aidl18
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/provider/HostAuth.java434
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/provider/Mailbox.java640
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/provider/Policy.aidl19
-rwxr-xr-xemail2/emailcommon/src/com/android/emailcommon/provider/Policy.java513
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/provider/ProviderUnavailableException.java21
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/provider/QuickResponse.java217
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/service/AccountServiceProxy.java130
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/service/EmailServiceConstants.java25
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/service/EmailServiceProxy.java482
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/service/EmailServiceStatus.java43
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/service/IAccountService.aidl32
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/service/IEmailService.aidl65
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/service/IEmailServiceCallback.aidl76
-rwxr-xr-xemail2/emailcommon/src/com/android/emailcommon/service/IPolicyService.aidl25
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/service/LegacyPolicySet.java87
-rwxr-xr-xemail2/emailcommon/src/com/android/emailcommon/service/PolicyServiceProxy.java133
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/service/SearchParams.aidl18
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/service/SearchParams.java137
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/service/ServiceProxy.java204
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/service/ServiceUnavailableException.java29
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/service/SyncWindow.java29
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/utility/AttachmentUtilities.java428
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/utility/CertificateRequestor.java68
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/utility/ConversionUtilities.java138
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/utility/DelayedOperations.java106
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/utility/EmailAsyncTask.java274
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/utility/EmailClientConnectionManager.java155
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/utility/IntentUtilities.java166
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/utility/LoggingInputStream.java109
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/utility/SSLSocketFactory.java401
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/utility/SSLUtils.java272
-rwxr-xr-xemail2/emailcommon/src/com/android/emailcommon/utility/TextUtilities.java728
-rw-r--r--email2/emailcommon/src/com/android/emailcommon/utility/Utility.java1153
-rw-r--r--email2/emailsync/Android.mk30
-rw-r--r--email2/emailsync/src/com/android/emailsync/AbstractSyncService.java305
-rw-r--r--email2/emailsync/src/com/android/emailsync/EmailSyncAlarmReceiver.java111
-rw-r--r--email2/emailsync/src/com/android/emailsync/FileLogger.java120
-rw-r--r--email2/emailsync/src/com/android/emailsync/MailboxAlarmReceiver.java42
-rw-r--r--email2/emailsync/src/com/android/emailsync/PartRequest.java51
-rw-r--r--email2/emailsync/src/com/android/emailsync/Request.java36
-rw-r--r--email2/emailsync/src/com/android/emailsync/SyncServiceManager.java2254
-rw-r--r--email2/proguard.flags217
-rw-r--r--email2/res/color/buttontext.xml20
-rw-r--r--email2/res/drawable-hdpi/ic_exchange_minitab_selected.pngbin790 -> 0 bytes
-rw-r--r--email2/res/drawable-hdpi/ic_exchange_selected.pngbin806 -> 0 bytes
-rw-r--r--email2/res/drawable-hdpi/ic_folder_drafts_holo_light.pngbin916 -> 0 bytes
-rw-r--r--email2/res/drawable-hdpi/ic_folder_inbox_holo_light.pngbin786 -> 0 bytes
-rw-r--r--email2/res/drawable-hdpi/ic_folder_outbox_holo_light.pngbin653 -> 0 bytes
-rw-r--r--email2/res/drawable-hdpi/ic_folder_sent_holo_light.pngbin825 -> 0 bytes
-rw-r--r--email2/res/drawable-hdpi/ic_notification_multiple_mail_holo_dark.pngbin400 -> 0 bytes
-rw-r--r--email2/res/drawable-hdpi/stat_notify_email_generic.pngbin771 -> 0 bytes
-rw-r--r--email2/res/drawable-mdpi/ic_exchange_minitab_selected.pngbin933 -> 0 bytes
-rw-r--r--email2/res/drawable-mdpi/ic_exchange_selected.pngbin1403 -> 0 bytes
-rw-r--r--email2/res/drawable-mdpi/ic_folder_drafts_holo_light.pngbin734 -> 0 bytes
-rw-r--r--email2/res/drawable-mdpi/ic_folder_inbox_holo_light.pngbin604 -> 0 bytes
-rw-r--r--email2/res/drawable-mdpi/ic_folder_outbox_holo_light.pngbin540 -> 0 bytes
-rw-r--r--email2/res/drawable-mdpi/ic_folder_sent_holo_light.pngbin629 -> 0 bytes
-rw-r--r--email2/res/drawable-mdpi/ic_notification_multiple_mail_holo_dark.pngbin214 -> 0 bytes
-rw-r--r--email2/res/drawable-mdpi/stat_notify_email_generic.pngbin617 -> 0 bytes
-rw-r--r--email2/res/drawable-nodpi/email_widget_preview.pngbin51557 -> 0 bytes
-rw-r--r--email2/res/drawable-xhdpi/ic_exchange_minitab_selected.pngbin1595 -> 0 bytes
-rw-r--r--email2/res/drawable-xhdpi/ic_exchange_selected.pngbin1865 -> 0 bytes
-rw-r--r--email2/res/drawable-xhdpi/ic_folder_drafts_holo_light.pngbin1179 -> 0 bytes
-rw-r--r--email2/res/drawable-xhdpi/ic_folder_inbox_holo_light.pngbin1006 -> 0 bytes
-rw-r--r--email2/res/drawable-xhdpi/ic_folder_outbox_holo_light.pngbin689 -> 0 bytes
-rw-r--r--email2/res/drawable-xhdpi/ic_folder_sent_holo_light.pngbin911 -> 0 bytes
-rw-r--r--email2/res/drawable-xhdpi/ic_notification_multiple_mail_holo_dark.pngbin385 -> 0 bytes
-rw-r--r--email2/res/drawable-xhdpi/stat_notify_email_generic.pngbin947 -> 0 bytes
-rw-r--r--email2/res/layout-sw600dp-land/account_setup_basics.xml80
-rw-r--r--email2/res/layout-sw600dp-land/account_setup_incoming.xml83
-rw-r--r--email2/res/layout-sw600dp-land/account_setup_names.xml72
-rw-r--r--email2/res/layout-sw600dp-land/account_setup_options.xml80
-rw-r--r--email2/res/layout-sw600dp-land/account_setup_outgoing.xml84
-rw-r--r--email2/res/layout-sw600dp-port/account_setup_basics.xml95
-rw-r--r--email2/res/layout-sw600dp-port/account_setup_incoming.xml96
-rw-r--r--email2/res/layout-sw600dp-port/account_setup_names.xml87
-rw-r--r--email2/res/layout-sw600dp-port/account_setup_options.xml94
-rw-r--r--email2/res/layout-sw600dp-port/account_setup_outgoing.xml96
-rw-r--r--email2/res/layout-sw600dp/account_settings_buttons.xml36
-rw-r--r--email2/res/layout-sw600dp/account_setup_account_type.xml74
-rw-r--r--email2/res/layout-sw600dp/account_setup_basics_common.xml102
-rw-r--r--email2/res/layout-sw600dp/account_setup_incoming_fragment.xml153
-rw-r--r--email2/res/layout-sw600dp/account_setup_names_common.xml57
-rw-r--r--email2/res/layout-sw600dp/account_setup_options_common.xml168
-rw-r--r--email2/res/layout-sw600dp/account_setup_outgoing_fragment.xml121
-rw-r--r--email2/res/layout-sw600dp/account_type.xml23
-rw-r--r--email2/res/layout/account_settings.xml27
-rw-r--r--email2/res/layout/account_settings_buttons.xml36
-rw-r--r--email2/res/layout/account_settings_edit_quick_responses_fragment.xml50
-rw-r--r--email2/res/layout/account_settings_incoming_fragment.xml52
-rw-r--r--email2/res/layout/account_settings_outgoing_fragment.xml52
-rw-r--r--email2/res/layout/account_setup_account_type.xml35
-rw-r--r--email2/res/layout/account_setup_basics.xml74
-rw-r--r--email2/res/layout/account_setup_basics_common.xml62
-rw-r--r--email2/res/layout/account_setup_buttons.xml36
-rw-r--r--email2/res/layout/account_setup_incoming.xml43
-rw-r--r--email2/res/layout/account_setup_incoming_fragment.xml144
-rw-r--r--email2/res/layout/account_setup_names.xml71
-rw-r--r--email2/res/layout/account_setup_options.xml99
-rw-r--r--email2/res/layout/account_setup_outgoing.xml44
-rw-r--r--email2/res/layout/account_setup_outgoing_fragment.xml94
-rw-r--r--email2/res/layout/account_shortcut_picker.xml37
-rw-r--r--email2/res/layout/account_type.xml27
-rw-r--r--email2/res/layout/client_certificate_selector.xml57
-rw-r--r--email2/res/layout/connection_error_banner.xml30
-rw-r--r--email2/res/layout/conversation_item_view_normal.xml102
-rw-r--r--email2/res/layout/conversation_item_view_wide.xml100
-rw-r--r--email2/res/layout/debug.xml64
-rw-r--r--email2/res/layout/insert_quick_response.xml27
-rw-r--r--email2/res/layout/quick_response_edit_dialog.xml32
-rw-r--r--email2/res/layout/quick_response_item.xml49
-rw-r--r--email2/res/menu-sw600dp/account_settings_add_account_option.xml24
-rw-r--r--email2/res/menu/account_settings_add_account_option.xml23
-rw-r--r--email2/res/mipmap-hdpi/ic_launcher_mail.pngbin7010 -> 0 bytes
-rw-r--r--email2/res/mipmap-mdpi/ic_launcher_mail.pngbin3846 -> 0 bytes
-rw-r--r--email2/res/mipmap-xhdpi/ic_launcher_mail.pngbin10781 -> 0 bytes
-rw-r--r--email2/res/values-af/strings.xml495
-rw-r--r--email2/res/values-af/uploader.xml137
-rw-r--r--email2/res/values-am/strings.xml495
-rw-r--r--email2/res/values-am/uploader.xml137
-rw-r--r--email2/res/values-ar/strings.xml495
-rw-r--r--email2/res/values-ar/uploader.xml137
-rw-r--r--email2/res/values-be/strings.xml495
-rw-r--r--email2/res/values-be/uploader.xml139
-rw-r--r--email2/res/values-bg/strings.xml495
-rw-r--r--email2/res/values-bg/uploader.xml137
-rw-r--r--email2/res/values-ca/strings.xml495
-rw-r--r--email2/res/values-ca/uploader.xml137
-rw-r--r--email2/res/values-cs/strings.xml495
-rw-r--r--email2/res/values-cs/uploader.xml137
-rw-r--r--email2/res/values-da/strings.xml495
-rw-r--r--email2/res/values-da/uploader.xml137
-rw-r--r--email2/res/values-de/strings.xml495
-rw-r--r--email2/res/values-de/uploader.xml137
-rw-r--r--email2/res/values-el/strings.xml495
-rw-r--r--email2/res/values-el/uploader.xml137
-rw-r--r--email2/res/values-en-rGB/strings.xml495
-rw-r--r--email2/res/values-en-rGB/uploader.xml137
-rw-r--r--email2/res/values-es-rUS/strings.xml495
-rw-r--r--email2/res/values-es-rUS/uploader.xml137
-rw-r--r--email2/res/values-es/strings.xml495
-rw-r--r--email2/res/values-es/uploader.xml137
-rw-r--r--email2/res/values-et/strings.xml495
-rw-r--r--email2/res/values-et/uploader.xml137
-rw-r--r--email2/res/values-fa/strings.xml495
-rw-r--r--email2/res/values-fa/uploader.xml145
-rw-r--r--email2/res/values-fi/strings.xml495
-rw-r--r--email2/res/values-fi/uploader.xml137
-rw-r--r--email2/res/values-fr/strings.xml495
-rw-r--r--email2/res/values-fr/uploader.xml137
-rw-r--r--email2/res/values-hi/strings.xml495
-rw-r--r--email2/res/values-hi/uploader.xml137
-rw-r--r--email2/res/values-hr/strings.xml495
-rw-r--r--email2/res/values-hr/uploader.xml137
-rw-r--r--email2/res/values-hu/strings.xml495
-rw-r--r--email2/res/values-hu/uploader.xml137
-rw-r--r--email2/res/values-in/strings.xml495
-rw-r--r--email2/res/values-in/uploader.xml137
-rw-r--r--email2/res/values-it/strings.xml495
-rw-r--r--email2/res/values-it/uploader.xml137
-rw-r--r--email2/res/values-iw/strings.xml495
-rw-r--r--email2/res/values-iw/uploader.xml137
-rw-r--r--email2/res/values-ja/uploader.xml137
-rw-r--r--email2/res/values-ko/strings.xml495
-rw-r--r--email2/res/values-ko/uploader.xml137
-rw-r--r--email2/res/values-land/dimensions.xml31
-rw-r--r--email2/res/values-land/styles.xml33
-rw-r--r--email2/res/values-lt/strings.xml495
-rw-r--r--email2/res/values-lt/uploader.xml137
-rw-r--r--email2/res/values-lv/strings.xml495
-rw-r--r--email2/res/values-lv/uploader.xml137
-rw-r--r--email2/res/values-ms/strings.xml495
-rw-r--r--email2/res/values-ms/uploader.xml137
-rw-r--r--email2/res/values-nb/strings.xml495
-rw-r--r--email2/res/values-nb/uploader.xml137
-rw-r--r--email2/res/values-nl/strings.xml495
-rw-r--r--email2/res/values-nl/uploader.xml137
-rw-r--r--email2/res/values-pl/strings.xml495
-rw-r--r--email2/res/values-pl/uploader.xml137
-rw-r--r--email2/res/values-port/dimensions.xml24
-rw-r--r--email2/res/values-pt-rPT/strings.xml495
-rw-r--r--email2/res/values-pt-rPT/uploader.xml141
-rw-r--r--email2/res/values-pt/strings.xml495
-rw-r--r--email2/res/values-pt/uploader.xml137
-rw-r--r--email2/res/values-rm/strings.xml756
-rw-r--r--email2/res/values-rm/uploader.xml267
-rw-r--r--email2/res/values-ro/strings.xml495
-rw-r--r--email2/res/values-ro/uploader.xml137
-rw-r--r--email2/res/values-ru/strings.xml495
-rw-r--r--email2/res/values-ru/uploader.xml137
-rw-r--r--email2/res/values-sk/strings.xml495
-rw-r--r--email2/res/values-sk/uploader.xml137
-rw-r--r--email2/res/values-sl/strings.xml495
-rw-r--r--email2/res/values-sl/uploader.xml137
-rw-r--r--email2/res/values-sr/strings.xml495
-rw-r--r--email2/res/values-sr/uploader.xml137
-rw-r--r--email2/res/values-sv/strings.xml495
-rw-r--r--email2/res/values-sv/uploader.xml137
-rw-r--r--email2/res/values-sw/strings.xml495
-rw-r--r--email2/res/values-sw/uploader.xml137
-rw-r--r--email2/res/values-sw600dp-port/dimensions.xml24
-rw-r--r--email2/res/values-sw600dp/dimensions.xml53
-rw-r--r--email2/res/values-sw600dp/styles.xml60
-rw-r--r--email2/res/values-sw720dp-land/dimensions.xml24
-rw-r--r--email2/res/values-th/strings.xml495
-rw-r--r--email2/res/values-th/uploader.xml137
-rw-r--r--email2/res/values-tl/strings.xml495
-rw-r--r--email2/res/values-tl/uploader.xml137
-rw-r--r--email2/res/values-tr/strings.xml495
-rw-r--r--email2/res/values-tr/uploader.xml137
-rw-r--r--email2/res/values-uk/strings.xml495
-rw-r--r--email2/res/values-uk/uploader.xml137
-rw-r--r--email2/res/values-vi/strings.xml495
-rw-r--r--email2/res/values-vi/uploader.xml137
-rw-r--r--email2/res/values-zh-rCN/uploader.xml137
-rw-r--r--email2/res/values-zh-rTW/strings.xml495
-rw-r--r--email2/res/values-zh-rTW/uploader.xml137
-rw-r--r--email2/res/values-zu/strings.xml495
-rw-r--r--email2/res/values-zu/uploader.xml137
-rw-r--r--email2/res/values/arrays.xml215
-rw-r--r--email2/res/values/attrs.xml66
-rw-r--r--email2/res/values/build_number.xml19
-rw-r--r--email2/res/values/colors.xml46
-rw-r--r--email2/res/values/dimensions.xml53
-rw-r--r--email2/res/values/strings.xml1304
-rw-r--r--email2/res/values/styles.xml49
-rw-r--r--email2/res/values/uploader.xml355
-rw-r--r--email2/res/xml/account_preferences.xml32
-rwxr-xr-xemail2/res/xml/account_settings_preferences.xml158
-rw-r--r--email2/res/xml/authenticator_alternate.xml31
-rw-r--r--email2/res/xml/device_admin.xml28
-rw-r--r--email2/res/xml/eas_authenticator.xml29
-rw-r--r--email2/res/xml/eastest_authenticator.xml29
-rw-r--r--email2/res/xml/general_preferences.xml70
-rw-r--r--email2/res/xml/mailbox_preferences.xml39
-rw-r--r--email2/res/xml/pop_imap_authenticator.xml29
-rw-r--r--email2/res/xml/providers.xml440
-rw-r--r--email2/res/xml/providers_product.xml17
-rw-r--r--email2/res/xml/searchable.xml25
-rw-r--r--email2/res/xml/senders.xml35
-rw-r--r--email2/res/xml/senders_product.xml18
-rw-r--r--email2/res/xml/services.xml104
-rw-r--r--email2/res/xml/syncadapter_pop_imap.xml28
-rw-r--r--email2/res/xml/widget_info.xml25
-rw-r--r--email2/src/com/android/email/AttachmentInfo.java242
-rw-r--r--email2/src/com/android/email/Clock.java32
-rw-r--r--email2/src/com/android/email/EmailAddressValidator.java31
-rw-r--r--email2/src/com/android/email/EmailConnectivityManager.java218
-rw-r--r--email2/src/com/android/email/FixedLengthInputStream.java80
-rw-r--r--email2/src/com/android/email/LegacyConversions.java478
-rw-r--r--email2/src/com/android/email/MessagingExceptionStrings.java57
-rw-r--r--email2/src/com/android/email/NotificationController.java1070
-rw-r--r--email2/src/com/android/email/PeekableInputStream.java80
-rw-r--r--email2/src/com/android/email/Preferences.java381
-rw-r--r--email2/src/com/android/email/RequireManualSyncDialog.java40
-rw-r--r--email2/src/com/android/email/ResourceHelper.java87
-rw-r--r--email2/src/com/android/email/SecurityPolicy.java856
-rw-r--r--email2/src/com/android/email/SingleRunningTask.java61
-rw-r--r--email2/src/com/android/email/StopWatch.java73
-rw-r--r--email2/src/com/android/email/VendorPolicyLoader.java233
-rw-r--r--email2/src/com/android/email/activity/ActivityHelper.java101
-rw-r--r--email2/src/com/android/email/activity/ContactStatusLoader.java162
-rw-r--r--email2/src/com/android/email/activity/EventViewer.java76
-rw-r--r--email2/src/com/android/email/activity/InsertQuickResponseDialog.java151
-rw-r--r--email2/src/com/android/email/activity/UiUtilities.java138
-rw-r--r--email2/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java940
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSecurity.java426
-rw-r--r--email2/src/com/android/email/activity/setup/AccountServerBaseFragment.java435
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSettings.java848
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSettingsEditQuickResponsesFragment.java290
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSettingsFragment.java755
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSettingsUtils.java336
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSetupActivity.java44
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSetupBasics.java744
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSetupIncoming.java200
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java565
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSetupNames.java301
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSetupOptions.java423
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSetupOutgoing.java116
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java374
-rw-r--r--email2/src/com/android/email/activity/setup/AccountSetupType.java138
-rw-r--r--email2/src/com/android/email/activity/setup/DebugFragment.java142
-rw-r--r--email2/src/com/android/email/activity/setup/DuplicateAccountDialogFragment.java67
-rw-r--r--email2/src/com/android/email/activity/setup/EditQuickResponseDialog.java167
-rw-r--r--email2/src/com/android/email/activity/setup/EmailPreferenceFragment.java39
-rw-r--r--email2/src/com/android/email/activity/setup/ForwardingIntent.java30
-rw-r--r--email2/src/com/android/email/activity/setup/GeneralPreferences.java180
-rw-r--r--email2/src/com/android/email/activity/setup/MailboxSettings.java385
-rw-r--r--email2/src/com/android/email/activity/setup/PolicyListPreference.java45
-rw-r--r--email2/src/com/android/email/activity/setup/SetupData.java288
-rw-r--r--email2/src/com/android/email/activity/setup/SpinnerOption.java45
-rw-r--r--email2/src/com/android/email/data/ClosingMatrixCursor.java42
-rw-r--r--email2/src/com/android/email/mail/Sender.java135
-rw-r--r--email2/src/com/android/email/mail/Store.java202
-rw-r--r--email2/src/com/android/email/mail/Transport.java165
-rwxr-xr-xemail2/src/com/android/email/mail/internet/EmailHtmlUtil.java67
-rw-r--r--email2/src/com/android/email/mail/store/ImapConnection.java520
-rw-r--r--email2/src/com/android/email/mail/store/ImapFolder.java1134
-rw-r--r--email2/src/com/android/email/mail/store/ImapStore.java637
-rw-r--r--email2/src/com/android/email/mail/store/Pop3Store.java1082
-rw-r--r--email2/src/com/android/email/mail/store/ServiceStore.java87
-rw-r--r--email2/src/com/android/email/mail/store/imap/ImapConstants.java95
-rw-r--r--email2/src/com/android/email/mail/store/imap/ImapElement.java120
-rw-r--r--email2/src/com/android/email/mail/store/imap/ImapList.java235
-rw-r--r--email2/src/com/android/email/mail/store/imap/ImapMemoryLiteral.java72
-rw-r--r--email2/src/com/android/email/mail/store/imap/ImapResponse.java152
-rw-r--r--email2/src/com/android/email/mail/store/imap/ImapResponseParser.java450
-rw-r--r--email2/src/com/android/email/mail/store/imap/ImapSimpleString.java55
-rw-r--r--email2/src/com/android/email/mail/store/imap/ImapString.java187
-rw-r--r--email2/src/com/android/email/mail/store/imap/ImapTempFileLiteral.java124
-rw-r--r--email2/src/com/android/email/mail/store/imap/ImapUtility.java127
-rw-r--r--email2/src/com/android/email/mail/transport/CountingOutputStream.java40
-rw-r--r--email2/src/com/android/email/mail/transport/DiscourseLogger.java120
-rw-r--r--email2/src/com/android/email/mail/transport/EOLConvertingOutputStream.java49
-rw-r--r--email2/src/com/android/email/mail/transport/ExchangeSender.java64
-rw-r--r--email2/src/com/android/email/mail/transport/MailTransport.java370
-rw-r--r--email2/src/com/android/email/mail/transport/SmtpSender.java334
-rw-r--r--email2/src/com/android/email/mail/transport/StatusOutputStream.java44
-rw-r--r--email2/src/com/android/email/provider/AccountBackupRestore.java51
-rw-r--r--email2/src/com/android/email/provider/AccountReconciler.java168
-rw-r--r--email2/src/com/android/email/provider/AttachmentProvider.java334
-rw-r--r--email2/src/com/android/email/provider/ContentCache.java850
-rw-r--r--email2/src/com/android/email/provider/DBHelper.java1292
-rw-r--r--email2/src/com/android/email/provider/EmailProvider.java4067
-rw-r--r--email2/src/com/android/email/provider/Utilities.java150
-rw-r--r--email2/src/com/android/email/service/AccountService.java131
-rw-r--r--email2/src/com/android/email/service/AttachmentDownloadService.java1008
-rw-r--r--email2/src/com/android/email/service/AuthenticatorService.java159
-rw-r--r--email2/src/com/android/email/service/EasAuthenticatorService.java23
-rw-r--r--email2/src/com/android/email/service/EasAuthenticatorServiceAlternate.java23
-rw-r--r--email2/src/com/android/email/service/EasTestAuthenticatorService.java123
-rw-r--r--email2/src/com/android/email/service/EmailBroadcastProcessorService.java211
-rw-r--r--email2/src/com/android/email/service/EmailBroadcastReceiver.java31
-rw-r--r--email2/src/com/android/email/service/EmailServiceStub.java561
-rw-r--r--email2/src/com/android/email/service/EmailServiceUtils.java377
-rw-r--r--email2/src/com/android/email/service/ImapService.java1396
-rw-r--r--email2/src/com/android/email/service/ImapTempFileLiteral.java127
-rw-r--r--email2/src/com/android/email/service/MailService.java157
-rw-r--r--email2/src/com/android/email/service/PolicyService.java58
-rw-r--r--email2/src/com/android/email/service/Pop3Service.java726
-rw-r--r--email2/src/com/android/email/service/PopImapAuthenticatorService.java23
-rw-r--r--email2/src/com/android/email/service/PopImapSyncAdapterService.java250
-rw-r--r--email2/src/com/android/email/view/CertificateSelector.java163
-rw-r--r--email2/src/com/android/email2/ui/CreateShortcutActivityEmail.java50
-rw-r--r--email2/src/com/android/email2/ui/MailActivityEmail.java240
-rw-r--r--email2/src/com/android/email2/ui/MailboxSelectionActivityEmail.java23
-rw-r--r--email2/src/com/android/mail/browse/EmailConversationProvider.java32
-rw-r--r--email2/src/com/android/mail/providers/EmailAccountCacheProvider.java52
-rw-r--r--email2/src/com/android/mail/providers/protos/boot/AccountReceiver.java41
-rw-r--r--email2/src/com/android/mail/utils/LogTag.java28
-rw-r--r--email2/src/com/beetstra/ThirdPartyProject.prop9
-rw-r--r--email2/src/com/beetstra/jutf7/Base64Util.java117
-rw-r--r--email2/src/com/beetstra/jutf7/CharsetProvider.java91
-rw-r--r--email2/src/com/beetstra/jutf7/ModifiedUTF7Charset.java57
-rw-r--r--email2/src/com/beetstra/jutf7/UTF7Charset.java75
-rw-r--r--email2/src/com/beetstra/jutf7/UTF7StyleCharset.java117
-rw-r--r--email2/src/com/beetstra/jutf7/UTF7StyleCharsetDecoder.java195
-rw-r--r--email2/src/com/beetstra/jutf7/UTF7StyleCharsetEncoder.java217
-rw-r--r--emailcommon/Android.mk14
-rw-r--r--emailcommon/src/com/android/emailcommon/Api.java3
-rw-r--r--emailcommon/src/com/android/emailcommon/CalendarProviderStub.java25
-rw-r--r--emailcommon/src/com/android/emailcommon/TrafficFlags.java24
-rw-r--r--emailcommon/src/com/android/emailcommon/internet/MimeUtility.java72
-rw-r--r--emailcommon/src/com/android/emailcommon/internet/Rfc822Output.java142
-rw-r--r--emailcommon/src/com/android/emailcommon/mail/Address.java63
-rw-r--r--emailcommon/src/com/android/emailcommon/mail/MeetingInfo.java1
-rwxr-xr-x[-rw-r--r--]emailcommon/src/com/android/emailcommon/provider/Account.java60
-rwxr-xr-x[-rw-r--r--]emailcommon/src/com/android/emailcommon/provider/EmailContent.java193
-rw-r--r--emailcommon/src/com/android/emailcommon/provider/HostAuth.java27
-rw-r--r--emailcommon/src/com/android/emailcommon/provider/Mailbox.java103
-rwxr-xr-x[-rw-r--r--]emailcommon/src/com/android/emailcommon/provider/Policy.java127
-rw-r--r--emailcommon/src/com/android/emailcommon/service/EmailServiceProxy.java102
-rw-r--r--emailcommon/src/com/android/emailcommon/service/IEmailService.aidl5
-rw-r--r--emailcommon/src/com/android/emailcommon/service/IEmailServiceCallback.aidl8
-rwxr-xr-x[-rw-r--r--]emailcommon/src/com/android/emailcommon/service/IPolicyService.aidl7
-rwxr-xr-x[-rw-r--r--]emailcommon/src/com/android/emailcommon/service/PolicyServiceProxy.java107
-rw-r--r--emailcommon/src/com/android/emailcommon/service/SearchParams.java10
-rw-r--r--emailcommon/src/com/android/emailcommon/utility/AttachmentUtilities.java120
-rw-r--r--emailcommon/src/com/android/emailcommon/utility/EmailClientConnectionManager.java33
-rwxr-xr-x[-rw-r--r--]emailcommon/src/com/android/emailcommon/utility/TextUtilities.java11
-rw-r--r--emailcommon/src/com/android/emailcommon/utility/Utility.java51
-rw-r--r--emailcommon/src/org/apache/commons/io/CopyUtils.java332
-rw-r--r--emailcommon/src/org/apache/commons/io/DirectoryWalker.java620
-rw-r--r--emailcommon/src/org/apache/commons/io/EndianUtils.java489
-rw-r--r--emailcommon/src/org/apache/commons/io/FileCleaner.java154
-rw-r--r--emailcommon/src/org/apache/commons/io/FileCleaningTracker.java259
-rw-r--r--emailcommon/src/org/apache/commons/io/FileDeleteStrategy.java156
-rw-r--r--emailcommon/src/org/apache/commons/io/FileSystemUtils.java457
-rw-r--r--emailcommon/src/org/apache/commons/io/FileUtils.java1890
-rw-r--r--emailcommon/src/org/apache/commons/io/FilenameUtils.java1260
-rw-r--r--emailcommon/src/org/apache/commons/io/HexDump.java149
-rw-r--r--emailcommon/src/org/apache/commons/io/IOCase.java238
-rw-r--r--emailcommon/src/org/apache/commons/io/IOExceptionWithCause.java69
-rw-r--r--emailcommon/src/org/apache/commons/io/IOUtils.java1274
-rw-r--r--emailcommon/src/org/apache/commons/io/LineIterator.java181
-rw-r--r--emailcommon/src/org/apache/commons/io/ThirdPartyProject.prop9
-rw-r--r--emailcommon/src/org/apache/commons/io/comparator/DefaultFileComparator.java66
-rw-r--r--emailcommon/src/org/apache/commons/io/comparator/ExtensionFileComparator.java110
-rw-r--r--emailcommon/src/org/apache/commons/io/comparator/LastModifiedFileComparator.java77
-rw-r--r--emailcommon/src/org/apache/commons/io/comparator/NameFileComparator.java104
-rw-r--r--emailcommon/src/org/apache/commons/io/comparator/PathFileComparator.java105
-rw-r--r--emailcommon/src/org/apache/commons/io/comparator/ReverseComparator.java57
-rw-r--r--emailcommon/src/org/apache/commons/io/comparator/SizeFileComparator.java130
-rw-r--r--emailcommon/src/org/apache/commons/io/comparator/package.html25
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/AbstractFileFilter.java67
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/AgeFileFilter.java150
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/AndFileFilter.java171
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/CanReadFileFilter.java92
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/CanWriteFileFilter.java80
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/ConditionalFileFilter.java67
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/DelegateFileFilter.java104
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/DirectoryFileFilter.java73
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/EmptyFileFilter.java84
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/FalseFileFilter.java72
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/FileFileFilter.java60
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/FileFilterUtils.java361
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/HiddenFileFilter.java76
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/IOFileFilter.java55
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/NameFileFilter.java194
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/NotFileFilter.java78
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/OrFileFilter.java164
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/PrefixFileFilter.java200
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/RegexFileFilter.java122
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/SizeFileFilter.java103
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/SuffixFileFilter.java201
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/TrueFileFilter.java72
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/WildcardFileFilter.java199
-rw-r--r--emailcommon/src/org/apache/commons/io/filefilter/package.html143
-rw-r--r--emailcommon/src/org/apache/commons/io/input/AutoCloseInputStream.java129
-rw-r--r--emailcommon/src/org/apache/commons/io/input/CharSequenceReader.java155
-rw-r--r--emailcommon/src/org/apache/commons/io/input/ClassLoaderObjectInputStream.java77
-rw-r--r--emailcommon/src/org/apache/commons/io/input/CloseShieldInputStream.java52
-rw-r--r--emailcommon/src/org/apache/commons/io/input/ClosedInputStream.java48
-rw-r--r--emailcommon/src/org/apache/commons/io/input/CountingInputStream.java175
-rw-r--r--emailcommon/src/org/apache/commons/io/input/DemuxInputStream.java93
-rw-r--r--emailcommon/src/org/apache/commons/io/input/NullInputStream.java329
-rw-r--r--emailcommon/src/org/apache/commons/io/input/NullReader.java313
-rw-r--r--emailcommon/src/org/apache/commons/io/input/ProxyInputStream.java129
-rw-r--r--emailcommon/src/org/apache/commons/io/input/ProxyReader.java130
-rw-r--r--emailcommon/src/org/apache/commons/io/input/SwappedDataInputStream.java251
-rw-r--r--emailcommon/src/org/apache/commons/io/input/TeeInputStream.java147
-rw-r--r--emailcommon/src/org/apache/commons/io/input/package.html25
-rw-r--r--emailcommon/src/org/apache/commons/io/output/ByteArrayOutputStream.java312
-rw-r--r--emailcommon/src/org/apache/commons/io/output/CloseShieldOutputStream.java52
-rw-r--r--emailcommon/src/org/apache/commons/io/output/ClosedOutputStream.java50
-rw-r--r--emailcommon/src/org/apache/commons/io/output/CountingOutputStream.java154
-rw-r--r--emailcommon/src/org/apache/commons/io/output/DeferredFileOutputStream.java269
-rw-r--r--emailcommon/src/org/apache/commons/io/output/DemuxOutputStream.java105
-rw-r--r--emailcommon/src/org/apache/commons/io/output/FileWriterWithEncoding.java324
-rw-r--r--emailcommon/src/org/apache/commons/io/output/LockableFileWriter.java333
-rw-r--r--emailcommon/src/org/apache/commons/io/output/NullOutputStream.java65
-rw-r--r--emailcommon/src/org/apache/commons/io/output/NullWriter.java96
-rw-r--r--emailcommon/src/org/apache/commons/io/output/ProxyOutputStream.java89
-rw-r--r--emailcommon/src/org/apache/commons/io/output/ProxyWriter.java111
-rw-r--r--emailcommon/src/org/apache/commons/io/output/TeeOutputStream.java94
-rw-r--r--emailcommon/src/org/apache/commons/io/output/ThresholdingOutputStream.java257
-rw-r--r--emailcommon/src/org/apache/commons/io/output/package.html25
-rw-r--r--emailcommon/src/org/apache/commons/io/overview.html32
-rw-r--r--emailcommon/src/org/apache/commons/io/package.html47
-rw-r--r--emailcommon/src/org/apache/james/mime4j/AbstractContentHandler.java113
-rw-r--r--emailcommon/src/org/apache/james/mime4j/BodyDescriptor.java392
-rw-r--r--emailcommon/src/org/apache/james/mime4j/CloseShieldInputStream.java129
-rw-r--r--emailcommon/src/org/apache/james/mime4j/ContentHandler.java177
-rw-r--r--emailcommon/src/org/apache/james/mime4j/EOLConvertingInputStream.java108
-rw-r--r--emailcommon/src/org/apache/james/mime4j/Log.java114
-rw-r--r--emailcommon/src/org/apache/james/mime4j/LogFactory.java29
-rw-r--r--emailcommon/src/org/apache/james/mime4j/MimeBoundaryInputStream.java184
-rw-r--r--emailcommon/src/org/apache/james/mime4j/MimeStreamParser.java325
-rw-r--r--emailcommon/src/org/apache/james/mime4j/RootInputStream.java111
-rw-r--r--emailcommon/src/org/apache/james/mime4j/SimpleContentHandler.java100
-rw-r--r--emailcommon/src/org/apache/james/mime4j/ThirdPartyProject.prop10
-rw-r--r--emailcommon/src/org/apache/james/mime4j/codec/EncoderUtil.java630
-rw-r--r--emailcommon/src/org/apache/james/mime4j/decoder/Base64InputStream.java151
-rw-r--r--emailcommon/src/org/apache/james/mime4j/decoder/ByteQueue.java62
-rw-r--r--emailcommon/src/org/apache/james/mime4j/decoder/DecoderUtil.java279
-rw-r--r--emailcommon/src/org/apache/james/mime4j/decoder/QuotedPrintableInputStream.java229
-rw-r--r--emailcommon/src/org/apache/james/mime4j/decoder/UnboundedFifoByteBuffer.java272
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/AddressListField.java65
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/ContentTransferEncodingField.java88
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/ContentTypeField.java259
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/DateTimeField.java72
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/DefaultFieldParser.java45
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/DelegatingFieldParser.java47
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/Field.java192
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/FieldParser.java21
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/MailboxField.java70
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/MailboxListField.java67
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/UnstructuredField.java49
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/Address.java52
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/AddressList.java138
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/Builder.java243
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/DomainList.java76
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/Group.java75
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/Mailbox.java121
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/MailboxList.java71
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/NamedMailbox.java71
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTaddr_spec.java19
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTaddress.java19
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTaddress_list.java19
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTangle_addr.java19
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTdomain.java19
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTgroup_body.java19
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTlocal_part.java19
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTmailbox.java19
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTname_addr.java19
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTphrase.java19
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTroute.java19
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParser.java977
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParser.jj595
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserConstants.java76
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserTokenManager.java1009
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserTreeConstants.java35
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserVisitor.java19
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/BaseNode.java30
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/JJTAddressListParserState.java123
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/Node.java37
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/ParseException.java207
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/SimpleCharStream.java454
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/SimpleNode.java87
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/Token.java96
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/address/parser/TokenMgrError.java148
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParser.java268
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParserConstants.java62
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParserTokenManager.java877
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ParseException.java207
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/SimpleCharStream.java454
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/Token.java96
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/TokenMgrError.java148
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/datetime/DateTime.java127
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/datetime/parser/DateTimeParser.java570
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/datetime/parser/DateTimeParserConstants.java86
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/datetime/parser/DateTimeParserTokenManager.java882
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/datetime/parser/ParseException.java207
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/datetime/parser/SimpleCharStream.java454
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/datetime/parser/Token.java96
-rw-r--r--emailcommon/src/org/apache/james/mime4j/field/datetime/parser/TokenMgrError.java148
-rw-r--r--emailcommon/src/org/apache/james/mime4j/message/AbstractBody.java47
-rw-r--r--emailcommon/src/org/apache/james/mime4j/message/BinaryBody.java42
-rw-r--r--emailcommon/src/org/apache/james/mime4j/message/Body.java54
-rw-r--r--emailcommon/src/org/apache/james/mime4j/message/BodyPart.java42
-rw-r--r--emailcommon/src/org/apache/james/mime4j/message/Entity.java170
-rw-r--r--emailcommon/src/org/apache/james/mime4j/message/Header.java158
-rw-r--r--emailcommon/src/org/apache/james/mime4j/message/MemoryBinaryBody.java92
-rw-r--r--emailcommon/src/org/apache/james/mime4j/message/MemoryTextBody.java118
-rw-r--r--emailcommon/src/org/apache/james/mime4j/message/Message.java257
-rw-r--r--emailcommon/src/org/apache/james/mime4j/message/Multipart.java203
-rw-r--r--emailcommon/src/org/apache/james/mime4j/message/TempFileBinaryBody.java91
-rw-r--r--emailcommon/src/org/apache/james/mime4j/message/TempFileTextBody.java117
-rw-r--r--emailcommon/src/org/apache/james/mime4j/message/TextBody.java42
-rw-r--r--emailcommon/src/org/apache/james/mime4j/util/CharsetUtil.java1246
-rw-r--r--emailcommon/src/org/apache/james/mime4j/util/PartialInputStream.java63
-rw-r--r--emailcommon/src/org/apache/james/mime4j/util/PositionInputStream.java87
-rw-r--r--emailcommon/src/org/apache/james/mime4j/util/SimpleTempStorage.java238
-rw-r--r--emailcommon/src/org/apache/james/mime4j/util/TempFile.java84
-rw-r--r--emailcommon/src/org/apache/james/mime4j/util/TempPath.java73
-rw-r--r--emailcommon/src/org/apache/james/mime4j/util/TempStorage.java72
-rwxr-xr-xremove-exchange-support.sh61
-rw-r--r--res/drawable-hdpi/attachment_bg_holo.9.pngbin288 -> 0 bytes
-rw-r--r--res/drawable-hdpi/btn_check_off_normal_holo_light.pngbin119 -> 0 bytes
-rw-r--r--res/drawable-hdpi/btn_check_on_normal_holo_light.pngbin374 -> 0 bytes
-rw-r--r--res/drawable-hdpi/btn_maybe_off.pngbin1189 -> 0 bytes
-rw-r--r--res/drawable-hdpi/btn_no_off.png.pngbin1020 -> 0 bytes
-rw-r--r--res/drawable-hdpi/btn_star_off_convo_holo_light.pngbin705 -> 0 bytes
-rw-r--r--res/drawable-hdpi/btn_star_off_normal_email_holo_light.pngbin325 -> 0 bytes
-rw-r--r--res/drawable-hdpi/btn_star_on_convo_holo_light.pngbin1464 -> 0 bytes
-rw-r--r--res/drawable-hdpi/btn_star_on_normal_email_holo_light.pngbin541 -> 0 bytes
-rw-r--r--res/drawable-hdpi/btn_yes_off.png.pngbin1148 -> 0 bytes
-rw-r--r--res/drawable-hdpi/divider_horizontal_holo_light.9.pngbin105 -> 0 bytes
-rw-r--r--res/drawable-hdpi/expander_close_holo_light.9.pngbin425 -> 0 bytes
-rw-r--r--res/drawable-hdpi/expander_open_holo_light.9.pngbin428 -> 0 bytes
-rw-r--r--res/drawable-hdpi/gradient_bg_email_widget_holo.9.pngbin214 -> 0 bytes
-rw-r--r--res/drawable-hdpi/header_bg_email_widget_holo.9.pngbin395 -> 0 bytes
-rw-r--r--res/drawable-hdpi/header_convo_view_sender_bg_holo.9.pngbin141 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_badge_attachment.pngbin239 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_badge_forward_holo_light.pngbin309 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_badge_invite_holo_light.pngbin150 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_badge_reply_forward_holo_light.pngbin312 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_badge_reply_holo_light.pngbin287 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_forward_holo_dark.pngbin417 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_list_combined_inbox.pngbin786 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_mailbox_collapsed_holo_light.pngbin350 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_compose_normal_holo_light.pngbin300 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_mark_read_holo_light.pngbin436 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_mark_unread_holo_light.pngbin393 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_move_to_holo_light.pngbin832 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_refresh_holo_light.pngbin566 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_search_holo_light.pngbin845 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_send_disabled_holo_light.pngbin409 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_send_holo_light.pngbin432 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_send_normal_holo_light.pngbin951 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_star_holo_light.pngbin501 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_star_off_holo_light.pngbin692 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_trash_holo_light.pngbin530 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_newer_arrow_disabled_holo_light.pngbin844 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_newer_arrow_holo_light.pngbin937 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_older_arrow_disabled_holo_light.pngbin830 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_older_arrow_holo_light.pngbin923 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_remove_attachment_holo_light.pngbin806 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_reply.pngbin1540 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_reply_all.pngbin1944 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_reply_all_holo_dark.pngbin526 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_reply_holo_dark.pngbin428 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_show_images_holo_light.pngbin1243 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_spam_normal_holo_light.pngbin260 -> 0 bytes
-rw-r--r--res/drawable-hdpi/list_div_top_btm_email_widget_holo.9.pngbin140 -> 0 bytes
-rw-r--r--res/drawable-mdpi/attachment_bg_holo.9.pngbin266 -> 0 bytes
-rw-r--r--res/drawable-mdpi/btn_check_off_normal_holo_light.pngbin127 -> 0 bytes
-rw-r--r--res/drawable-mdpi/btn_check_on_normal_holo_light.pngbin322 -> 0 bytes
-rw-r--r--res/drawable-mdpi/btn_maybe_off.pngbin817 -> 0 bytes
-rw-r--r--res/drawable-mdpi/btn_no_off.png.pngbin715 -> 0 bytes
-rw-r--r--res/drawable-mdpi/btn_star_off_convo_holo_light.pngbin538 -> 0 bytes
-rw-r--r--res/drawable-mdpi/btn_star_off_normal_email_holo_light.pngbin419 -> 0 bytes
-rw-r--r--res/drawable-mdpi/btn_star_on_convo_holo_light.pngbin1026 -> 0 bytes
-rw-r--r--res/drawable-mdpi/btn_star_on_normal_email_holo_light.pngbin740 -> 0 bytes
-rw-r--r--res/drawable-mdpi/btn_yes_off.png.pngbin807 -> 0 bytes
-rw-r--r--res/drawable-mdpi/divider_horizontal_holo_light.9.pngbin105 -> 0 bytes
-rw-r--r--res/drawable-mdpi/expander_close_holo_light.9.pngbin304 -> 0 bytes
-rw-r--r--res/drawable-mdpi/expander_open_holo_light.9.pngbin304 -> 0 bytes
-rw-r--r--res/drawable-mdpi/gradient_bg_email_widget_holo.9.pngbin181 -> 0 bytes
-rw-r--r--res/drawable-mdpi/header_bg_email_widget_holo.9.pngbin303 -> 0 bytes
-rw-r--r--res/drawable-mdpi/header_convo_view_sender_bg_holo.9.pngbin140 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_badge_attachment.pngbin202 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_badge_forward_holo_light.pngbin218 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_badge_invite_holo_light.pngbin123 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_badge_reply_forward_holo_light.pngbin216 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_badge_reply_holo_light.pngbin215 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_forward_holo_dark.pngbin315 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_list_combined_inbox.pngbin604 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_mailbox_collapsed_holo_light.pngbin314 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_compose_normal_holo_light.pngbin223 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_mark_read_holo_light.pngbin317 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_mark_unread_holo_light.pngbin279 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_move_to_holo_light.pngbin669 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_refresh_holo_light.pngbin404 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_search_holo_light.pngbin562 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_send_disabled_holo_light.pngbin304 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_send_holo_light.pngbin314 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_send_normal_holo_light.pngbin681 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_star_holo_light.pngbin345 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_star_off_holo_light.pngbin441 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_trash_holo_light.pngbin343 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_newer_arrow_disabled_holo_light.pngbin637 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_newer_arrow_holo_light.pngbin697 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_older_arrow_disabled_holo_light.pngbin623 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_older_arrow_holo_light.pngbin679 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_remove_attachment_holo_light.pngbin717 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_reply.pngbin1146 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_reply_all.pngbin1328 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_reply_all_holo_dark.pngbin418 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_reply_holo_dark.pngbin306 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_show_images_holo_light.pngbin1172 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_spam_normal_holo_light.pngbin218 -> 0 bytes
-rw-r--r--res/drawable-mdpi/list_div_top_btm_email_widget_holo.9.pngbin137 -> 0 bytes
-rw-r--r--res/drawable-sw600dp-hdpi/btn_check_off_normal_holo_light.pngbin336 -> 0 bytes
-rw-r--r--res/drawable-sw600dp-hdpi/btn_check_on_normal_holo_light.pngbin693 -> 0 bytes
-rw-r--r--res/drawable-sw600dp-hdpi/btn_star_off_normal_email_holo_light.pngbin705 -> 0 bytes
-rw-r--r--res/drawable-sw600dp-hdpi/btn_star_on_normal_email_holo_light.pngbin1464 -> 0 bytes
-rw-r--r--res/drawable-sw600dp-mdpi/btn_check_off_normal_holo_light.pngbin127 -> 0 bytes
-rw-r--r--res/drawable-sw600dp-mdpi/btn_check_on_normal_holo_light.pngbin322 -> 0 bytes
-rw-r--r--res/drawable-sw600dp-mdpi/btn_star_off_normal_email_holo_light.pngbin377 -> 0 bytes
-rw-r--r--res/drawable-sw600dp-mdpi/btn_star_on_normal_email_holo_light.pngbin607 -> 0 bytes
-rw-r--r--res/drawable-sw600dp-xhdpi/btn_check_off_normal_holo_light.pngbin362 -> 0 bytes
-rw-r--r--res/drawable-sw600dp-xhdpi/btn_check_on_normal_holo_light.pngbin946 -> 0 bytes
-rw-r--r--res/drawable-sw600dp-xhdpi/btn_star_off_normal_email_holo_light.pngbin935 -> 0 bytes
-rw-r--r--res/drawable-sw600dp-xhdpi/btn_star_on_normal_email_holo_light.pngbin2034 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/attachment_bg_holo.9.pngbin391 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/btn_check_off_normal_holo_light.pngbin142 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/btn_check_on_normal_holo_light.pngbin496 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/btn_maybe_off.pngbin1705 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/btn_no_off.png.pngbin1511 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/btn_star_off_convo_holo_light.pngbin935 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/btn_star_off_normal_email_holo_light.pngbin713 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/btn_star_on_convo_holo_light.pngbin2034 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/btn_star_on_normal_email_holo_light.pngbin1902 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/btn_yes_off.png.pngbin1716 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/divider_horizontal_holo_light.9.pngbin174 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/expander_close_holo_light.9.pngbin545 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/expander_open_holo_light.9.pngbin558 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/gradient_bg_email_widget_holo.9.pngbin239 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/header_bg_email_widget_holo.9.pngbin473 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/header_convo_view_sender_bg_holo.9.pngbin141 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_badge_attachment.pngbin335 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_badge_forward_holo_light.pngbin407 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_badge_invite_holo_light.pngbin161 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_badge_reply_forward_holo_light.pngbin394 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_badge_reply_holo_light.pngbin330 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_forward_holo_dark.pngbin1104 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_list_combined_inbox.pngbin1006 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_mailbox_collapsed_holo_light.pngbin385 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_compose_normal_holo_light.pngbin424 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_mark_read_holo_light.pngbin716 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_mark_unread_holo_light.pngbin690 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_move_to_holo_light.pngbin1006 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_refresh_holo_light.pngbin927 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_search_holo_light.pngbin1629 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_send_disabled_holo_light.pngbin703 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_send_holo_light.pngbin741 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_send_normal_holo_light.pngbin1206 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_star_holo_light.pngbin840 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_star_off_holo_light.pngbin1194 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_trash_holo_light.pngbin1295 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_newer_arrow_disabled_holo_light.pngbin1069 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_newer_arrow_holo_light.pngbin1210 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_older_arrow_disabled_holo_light.pngbin1054 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_older_arrow_holo_light.pngbin1191 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_remove_attachment_holo_light.pngbin1187 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_reply.pngbin1996 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_reply_all.pngbin2585 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_reply_all_holo_dark.pngbin1067 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_reply_holo_dark.pngbin826 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_show_images_holo_light.pngbin794 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_spam_normal_holo_light.pngbin399 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/list_div_top_btm_email_widget_holo.9.pngbin141 -> 0 bytes
-rw-r--r--res/drawable/attachment_background.xml33
-rw-r--r--res/drawable/menu_item_newer.xml20
-rw-r--r--res/drawable/menu_item_older.xml20
-rw-r--r--res/layout-land/message_view_header_actions.xml43
-rw-r--r--res/layout-sw600dp-land/account_setup_exchange.xml84
-rw-r--r--res/layout-sw600dp-land/message_view_invitation.xml139
-rw-r--r--res/layout-sw600dp-port/account_setup_exchange.xml96
-rw-r--r--res/layout-sw600dp-port/message_view_invitation.xml139
-rw-r--r--res/layout-sw600dp/account_setup_account_type.xml28
-rw-r--r--res/layout-sw600dp/account_setup_exchange_fragment.xml134
-rw-r--r--res/layout-sw600dp/account_setup_incoming_fragment.xml24
-rw-r--r--res/layout-sw600dp/address_text_view.xml21
-rw-r--r--res/layout-sw600dp/compose_area_buttons.xml43
-rw-r--r--res/layout-sw600dp/message_compose.xml101
-rw-r--r--res/layout-sw600dp/message_view_attachment.xml129
-rw-r--r--res/layout-sw600dp/message_view_fragment.xml228
-rw-r--r--res/layout-sw600dp/message_view_header_actions.xml47
-rw-r--r--res/layout-sw600dp/three_pane.xml26
-rw-r--r--res/layout-sw600dp/waiting_for_sync_message.xml47
-rw-r--r--res/layout-sw800dp-land/three_pane.xml27
-rw-r--r--res/layout-sw800dp-port139
-rw-r--r--res/layout-v14/compose_area_recipients.xml110
-rw-r--r--res/layout/account_settings_exchange_fragment.xml52
-rw-r--r--res/layout/account_setup_account_type.xml29
-rw-r--r--res/layout/account_setup_exchange.xml43
-rw-r--r--res/layout/account_setup_exchange_fragment.xml89
-rw-r--r--res/layout/account_setup_incoming_fragment.xml26
-rw-r--r--res/layout/action_bar_custom_view.xml32
-rw-r--r--res/layout/action_bar_indeterminate_progress.xml30
-rw-r--r--res/layout/action_bar_search.xml24
-rw-r--r--res/layout/action_bar_spinner.xml65
-rw-r--r--res/layout/action_bar_spinner_dropdown.xml69
-rw-r--r--res/layout/action_bar_spinner_dropdown_header.xml20
-rw-r--r--res/layout/compose_area_recipients.xml112
-rw-r--r--res/layout/compose_body.xml23
-rw-r--r--res/layout/compose_from.xml31
-rw-r--r--res/layout/debug.xml16
-rw-r--r--res/layout/email_activity_one_pane.xml42
-rw-r--r--res/layout/email_activity_two_pane.xml45
-rw-r--r--res/layout/mailbox_list_fragment.xml24
-rw-r--r--res/layout/mailbox_list_header.xml22
-rw-r--r--res/layout/mailbox_list_item.xml79
-rw-r--r--res/layout/message_command_button_view.xml65
-rw-r--r--res/layout/message_compose.xml59
-rw-r--r--res/layout/message_file_view.xml29
-rw-r--r--res/layout/message_list_fragment.xml40
-rw-r--r--res/layout/message_list_item_footer.xml39
-rw-r--r--res/layout/message_list_item_normal.xml125
-rw-r--r--res/layout/message_list_item_wide.xml102
-rw-r--r--res/layout/message_list_search_header.xml39
-rw-r--r--res/layout/message_list_warning.xml54
-rw-r--r--res/layout/message_view_attachment.xml122
-rw-r--r--res/layout/message_view_details.xml89
-rw-r--r--res/layout/message_view_fragment.xml198
-rw-r--r--res/layout/message_view_header_actions.xml43
-rw-r--r--res/layout/message_view_header_upper.xml76
-rw-r--r--res/layout/message_view_invitation.xml130
-rw-r--r--res/layout/message_view_subheader.xml85
-rw-r--r--res/layout/quoted_text.xml62
-rw-r--r--res/layout/recipient_dropdown_item.xml47
-rw-r--r--res/layout/recipient_dropdown_item_loading.xml44
-rw-r--r--res/layout/three_pane_collapsible_impl.xml63
-rw-r--r--res/layout/three_pane_impl.xml50
-rw-r--r--res/layout/waiting_for_sync_message.xml53
-rw-r--r--res/layout/widget.xml103
-rw-r--r--res/layout/widget_list_item.xml81
-rw-r--r--res/layout/widget_loading.xml33
-rw-r--r--res/menu-sw600dp/email_activity_options.xml69
-rw-r--r--res/menu-sw600dp/message_compose_option.xml54
-rw-r--r--res/menu-sw600dp/message_view_fragment_option.xml42
-rw-r--r--res/menu/email_activity_options.xml79
-rw-r--r--res/menu/message_compose_option.xml54
-rw-r--r--res/menu/message_header_overflow_menu.xml32
-rw-r--r--res/menu/message_list_fragment_cab_options.xml36
-rw-r--r--res/menu/message_list_fragment_option.xml25
-rw-r--r--res/menu/message_view_fragment_option.xml41
-rw-r--r--res/menu/welcome.xml27
-rw-r--r--res/mipmap-hdpi/ic_launcher_email.pngbin7010 -> 0 bytes
-rw-r--r--res/mipmap-mdpi/ic_launcher_email.pngbin3846 -> 0 bytes
-rw-r--r--res/mipmap-xhdpi/ic_launcher_email.pngbin10781 -> 0 bytes
-rw-r--r--res/values-af/strings.xml101
-rw-r--r--res/values-af/uploader.xml2
-rw-r--r--res/values-am/strings.xml101
-rw-r--r--res/values-am/uploader.xml2
-rw-r--r--res/values-ar/strings.xml101
-rw-r--r--res/values-ar/uploader.xml2
-rw-r--r--res/values-be/strings.xml101
-rw-r--r--res/values-be/uploader.xml2
-rw-r--r--res/values-bg/strings.xml101
-rw-r--r--res/values-bg/uploader.xml2
-rw-r--r--res/values-ca/strings.xml101
-rw-r--r--res/values-ca/uploader.xml2
-rw-r--r--res/values-cs/strings.xml121
-rw-r--r--res/values-cs/uploader.xml2
-rw-r--r--res/values-da/strings.xml103
-rw-r--r--res/values-da/uploader.xml4
-rw-r--r--res/values-de/strings.xml109
-rw-r--r--res/values-de/uploader.xml2
-rw-r--r--res/values-el/strings.xml101
-rw-r--r--res/values-el/uploader.xml2
-rw-r--r--res/values-en-rGB/strings.xml105
-rw-r--r--res/values-en-rGB/uploader.xml2
-rw-r--r--res/values-es-rUS/strings.xml103
-rw-r--r--res/values-es-rUS/uploader.xml2
-rw-r--r--res/values-es/strings.xml121
-rw-r--r--res/values-es/uploader.xml2
-rw-r--r--res/values-et/strings.xml101
-rw-r--r--res/values-et/uploader.xml2
-rw-r--r--res/values-fa/strings.xml101
-rw-r--r--res/values-fa/uploader.xml2
-rw-r--r--res/values-fi/strings.xml101
-rw-r--r--res/values-fi/uploader.xml2
-rw-r--r--res/values-fr/strings.xml101
-rw-r--r--res/values-fr/uploader.xml2
-rw-r--r--res/values-hi/strings.xml101
-rw-r--r--res/values-hi/uploader.xml2
-rw-r--r--res/values-hr/strings.xml101
-rw-r--r--res/values-hr/uploader.xml2
-rw-r--r--res/values-hu/strings.xml101
-rw-r--r--res/values-hu/uploader.xml2
-rw-r--r--res/values-in/strings.xml101
-rw-r--r--res/values-in/uploader.xml20
-rw-r--r--res/values-it/strings.xml101
-rw-r--r--res/values-it/uploader.xml2
-rw-r--r--res/values-iw/strings.xml101
-rw-r--r--res/values-iw/uploader.xml2
-rw-r--r--res/values-ja/strings.xml101
-rw-r--r--res/values-ja/uploader.xml2
-rw-r--r--res/values-ko/strings.xml101
-rw-r--r--res/values-ko/uploader.xml2
-rw-r--r--res/values-land/styles.xml17
-rw-r--r--res/values-lt/strings.xml101
-rw-r--r--res/values-lt/uploader.xml2
-rw-r--r--res/values-lv/strings.xml103
-rw-r--r--res/values-lv/uploader.xml2
-rw-r--r--res/values-ms/strings.xml101
-rw-r--r--res/values-ms/uploader.xml2
-rw-r--r--res/values-nb/strings.xml101
-rw-r--r--res/values-nb/uploader.xml2
-rw-r--r--res/values-nl/strings.xml101
-rw-r--r--res/values-nl/uploader.xml2
-rw-r--r--res/values-pl/strings.xml101
-rw-r--r--res/values-pl/uploader.xml2
-rw-r--r--res/values-pt-rPT/strings.xml101
-rw-r--r--res/values-pt-rPT/uploader.xml2
-rw-r--r--res/values-pt/strings.xml103
-rw-r--r--res/values-pt/uploader.xml2
-rw-r--r--res/values-rm/strings.xml147
-rw-r--r--res/values-rm/uploader.xml2
-rw-r--r--res/values-ro/strings.xml101
-rw-r--r--res/values-ro/uploader.xml2
-rw-r--r--res/values-ru/strings.xml103
-rw-r--r--res/values-ru/uploader.xml2
-rw-r--r--res/values-sk/strings.xml101
-rw-r--r--res/values-sk/uploader.xml2
-rw-r--r--res/values-sl/strings.xml101
-rw-r--r--res/values-sl/uploader.xml2
-rw-r--r--res/values-sr/strings.xml101
-rw-r--r--res/values-sr/uploader.xml2
-rw-r--r--res/values-sv/strings.xml101
-rw-r--r--res/values-sv/uploader.xml2
-rw-r--r--res/values-sw/strings.xml101
-rw-r--r--res/values-sw/uploader.xml2
-rw-r--r--res/values-sw600dp-land/dimensions.xml39
-rw-r--r--res/values-sw600dp-land/styles.xml24
-rw-r--r--res/values-sw600dp-port/dimensions.xml17
-rw-r--r--res/values-sw600dp-port/styles.xml41
-rw-r--r--res/values-sw600dp/bools.xml22
-rw-r--r--res/values-sw600dp/colors.xml19
-rw-r--r--res/values-sw600dp/dimensions.xml25
-rw-r--r--res/values-sw600dp/styles.xml113
-rw-r--r--res/values-sw800dp-land/dimen.xml24
-rw-r--r--res/values-sw800dp-port/styles.xml27
-rw-r--r--res/values-th/strings.xml101
-rw-r--r--res/values-th/uploader.xml2
-rw-r--r--res/values-tl/strings.xml101
-rw-r--r--res/values-tl/uploader.xml2
-rw-r--r--res/values-tr/strings.xml101
-rw-r--r--res/values-tr/uploader.xml2
-rw-r--r--res/values-uk/strings.xml101
-rw-r--r--res/values-uk/uploader.xml2
-rw-r--r--res/values-vi/strings.xml101
-rw-r--r--res/values-vi/uploader.xml2
-rw-r--r--res/values-zh-rCN/strings.xml107
-rw-r--r--res/values-zh-rCN/uploader.xml2
-rw-r--r--res/values-zh-rTW/strings.xml101
-rw-r--r--res/values-zh-rTW/uploader.xml2
-rw-r--r--res/values-zu/strings.xml101
-rw-r--r--res/values-zu/uploader.xml2
-rw-r--r--res/values/arrays.xml39
-rw-r--r--res/values/attrs.xml42
-rw-r--r--res/values/bools.xml22
-rw-r--r--res/values/colors.xml38
-rw-r--r--res/values/dimensions.xml32
-rw-r--r--res/values/strings.xml204
-rw-r--r--res/values/styles.xml178
-rwxr-xr-x[-rw-r--r--]res/xml/account_settings_preferences.xml22
-rw-r--r--res/xml/general_preferences.xml84
-rw-r--r--res/xml/pop_imap_authenticator.xml2
-rw-r--r--res/xml/syncadapter_pop_imap.xml3
-rw-r--r--res/xml/widget_info.xml2
-rw-r--r--src/com/android/email/AttachmentInfo.java2
-rw-r--r--src/com/android/email/Controller.java1889
-rw-r--r--src/com/android/email/ControllerResultUiThreadWrapper.java133
-rw-r--r--src/com/android/email/Email.java278
-rw-r--r--src/com/android/email/EmailAddressAdapter.java81
-rw-r--r--src/com/android/email/EmailConnectivityManager.java6
-rw-r--r--src/com/android/email/FolderProperties.java225
-rw-r--r--src/com/android/email/GroupMessagingListener.java203
-rw-r--r--src/com/android/email/LegacyConversions.java7
-rw-r--r--src/com/android/email/MessageListContext.java187
-rw-r--r--src/com/android/email/MessagingController.java2186
-rw-r--r--src/com/android/email/MessagingListener.java124
-rw-r--r--src/com/android/email/NotificationController.java622
-rw-r--r--src/com/android/email/Preferences.java30
-rw-r--r--src/com/android/email/RecipientAdapter.java57
-rw-r--r--src/com/android/email/RefreshManager.java456
-rw-r--r--src/com/android/email/SecurityPolicy.java235
-rw-r--r--src/com/android/email/SingleRunningTask.java8
-rw-r--r--src/com/android/email/Throttle.java180
-rw-r--r--src/com/android/email/activity/AccountSelectorAdapter.java636
-rw-r--r--src/com/android/email/activity/ActionBarController.java574
-rw-r--r--src/com/android/email/activity/ActivityHelper.java53
-rw-r--r--src/com/android/email/activity/AddressTextView.java74
-rw-r--r--src/com/android/email/activity/AttachmentInfoDialog.java120
-rw-r--r--src/com/android/email/activity/BannerController.java106
-rw-r--r--src/com/android/email/activity/ChipsAddressTextView.java56
-rw-r--r--src/com/android/email/activity/DeleteMessageConfirmationDialog.java93
-rw-r--r--src/com/android/email/activity/EmailActivity.java424
-rw-r--r--src/com/android/email/activity/FragmentInstallable.java44
-rw-r--r--src/com/android/email/activity/MailboxFinder.java264
-rw-r--r--src/com/android/email/activity/MailboxFragmentAdapter.java659
-rw-r--r--src/com/android/email/activity/MailboxListFragment.java1198
-rw-r--r--src/com/android/email/activity/MailboxListItem.java157
-rw-r--r--src/com/android/email/activity/MailboxMoveToAdapter.java164
-rw-r--r--src/com/android/email/activity/MessageCommandButtonView.java121
-rw-r--r--src/com/android/email/activity/MessageCompose.java2365
-rw-r--r--src/com/android/email/activity/MessageFileView.java154
-rw-r--r--src/com/android/email/activity/MessageFileViewFragment.java147
-rw-r--r--src/com/android/email/activity/MessageList.java93
-rw-r--r--src/com/android/email/activity/MessageListFragment.java1574
-rw-r--r--src/com/android/email/activity/MessageListItem.java599
-rw-r--r--src/com/android/email/activity/MessageListItemCoordinates.java306
-rw-r--r--src/com/android/email/activity/MessageOrderManager.java383
-rw-r--r--src/com/android/email/activity/MessageViewFragment.java525
-rw-r--r--src/com/android/email/activity/MessageViewFragmentBase.java1961
-rw-r--r--src/com/android/email/activity/MessagesAdapter.java426
-rw-r--r--src/com/android/email/activity/MoveMessageToDialog.java345
-rw-r--r--src/com/android/email/activity/NfcHandler.java98
-rw-r--r--src/com/android/email/activity/RecentMailboxManager.java169
-rw-r--r--src/com/android/email/activity/ShortcutPicker.java164
-rw-r--r--src/com/android/email/activity/ShortcutPickerFragment.java422
-rw-r--r--src/com/android/email/activity/ThreePaneLayout.java629
-rw-r--r--src/com/android/email/activity/UIControllerBase.java1040
-rw-r--r--src/com/android/email/activity/UIControllerOnePane.java641
-rw-r--r--src/com/android/email/activity/UIControllerTwoPane.java713
-rw-r--r--src/com/android/email/activity/UiUtilities.java42
-rw-r--r--src/com/android/email/activity/Welcome.java430
-rw-r--r--src/com/android/email/activity/setup/AccountCheckSettingsFragment.java30
-rw-r--r--src/com/android/email/activity/setup/AccountSecurity.java37
-rw-r--r--src/com/android/email/activity/setup/AccountServerBaseFragment.java6
-rw-r--r--src/com/android/email/activity/setup/AccountSettings.java101
-rw-r--r--src/com/android/email/activity/setup/AccountSettingsEditQuickResponsesFragment.java6
-rw-r--r--src/com/android/email/activity/setup/AccountSettingsFragment.java423
-rw-r--r--src/com/android/email/activity/setup/AccountSettingsUtils.java37
-rw-r--r--src/com/android/email/activity/setup/AccountSetupAccountType.java148
-rw-r--r--src/com/android/email/activity/setup/AccountSetupBasics.java150
-rw-r--r--src/com/android/email/activity/setup/AccountSetupExchange.java221
-rw-r--r--src/com/android/email/activity/setup/AccountSetupExchangeFragment.java454
-rw-r--r--src/com/android/email/activity/setup/AccountSetupIncoming.java105
-rw-r--r--src/com/android/email/activity/setup/AccountSetupIncomingFragment.java221
-rw-r--r--src/com/android/email/activity/setup/AccountSetupNames.java23
-rw-r--r--src/com/android/email/activity/setup/AccountSetupOptions.java75
-rw-r--r--src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java22
-rw-r--r--src/com/android/email/activity/setup/DebugFragment.java81
-rw-r--r--src/com/android/email/activity/setup/EditQuickResponseDialog.java9
-rw-r--r--src/com/android/email/activity/setup/GeneralPreferences.java103
-rw-r--r--src/com/android/email/activity/setup/MailboxSettings.java17
-rw-r--r--src/com/android/email/activity/setup/SetupData.java27
-rw-r--r--src/com/android/email/data/ThrottlingCursorLoader.java108
-rw-r--r--src/com/android/email/mail/Store.java23
-rw-r--r--src/com/android/email/mail/store/ExchangeStore.java55
-rw-r--r--src/com/android/email/mail/store/ImapConnection.java16
-rw-r--r--src/com/android/email/mail/store/ImapFolder.java8
-rw-r--r--src/com/android/email/mail/store/ImapStore.java6
-rw-r--r--src/com/android/email/mail/store/Pop3Store.java68
-rw-r--r--src/com/android/email/mail/store/ServiceStore.java16
-rw-r--r--src/com/android/email/mail/store/imap/ImapResponseParser.java16
-rw-r--r--src/com/android/email/mail/store/imap/ImapTempFileLiteral.java13
-rw-r--r--src/com/android/email/mail/transport/MailTransport.java18
-rw-r--r--src/com/android/email/mail/transport/SmtpSender.java10
-rw-r--r--src/com/android/email/provider/AccountReconciler.java6
-rw-r--r--src/com/android/email/provider/AttachmentProvider.java2
-rw-r--r--src/com/android/email/provider/ContentCache.java24
-rw-r--r--src/com/android/email/provider/EmailProvider.java3491
-rw-r--r--src/com/android/email/provider/WidgetProvider.java125
-rw-r--r--src/com/android/email/service/AccountService.java9
-rw-r--r--src/com/android/email/service/AttachmentDownloadService.java168
-rw-r--r--src/com/android/email/service/EasAuthenticatorService.java145
-rw-r--r--src/com/android/email/service/EasAuthenticatorServiceAlternate.java8
-rw-r--r--src/com/android/email/service/EasTestAuthenticatorService.java3
-rw-r--r--src/com/android/email/service/EmailBroadcastProcessorService.java37
-rw-r--r--src/com/android/email/service/EmailServiceUtils.java329
-rw-r--r--src/com/android/email/service/MailService.java614
-rw-r--r--src/com/android/email/service/PolicyService.java28
-rw-r--r--src/com/android/email/service/PopImapAuthenticatorService.java123
-rw-r--r--src/com/android/email/service/PopImapSyncAdapterService.java186
-rw-r--r--src/com/android/email/view/NonLockingScrollView.java139
-rw-r--r--src/com/android/email/view/RigidWebView.java103
-rw-r--r--src/com/android/email/view/SizeBoundingFrameLayout.java115
-rw-r--r--src/com/android/email/widget/EmailWidget.java546
-rw-r--r--src/com/android/email/widget/EmailWidgetLoader.java208
-rw-r--r--src/com/android/email/widget/WidgetConfiguration.java125
-rw-r--r--src/com/android/email/widget/WidgetManager.java158
-rw-r--r--tests/Android.mk34
1071 files changed, 9098 insertions, 159333 deletions
diff --git a/Android.mk b/Android.mk
index 843eda77b..7a124eb7a 100644
--- a/Android.mk
+++ b/Android.mk
@@ -14,38 +14,42 @@
LOCAL_PATH := $(call my-dir)
-# Build the Email application itself, along with its tests and the tests for the emailcommon
+# Build the Email application itself, along with its tests and tests for the emailcommon
# static library. All tests can be run via runtest email
include $(CLEAR_VARS)
-# Include res dir from chips
+
+# Include res dir from chips, unified, and photoviewer
chips_dir := ../../../frameworks/ex/chips/res
-mail_common_dir := ../../../frameworks/opt/mailcommon/res
-res_dir := $(chips_dir) $(mail_common_dir) res
+unified_email_dir := ../UnifiedEmail
+photo_dir := ../../../frameworks/ex/photoviewer/res
+res_dir := $(chips_dir) res $(unified_email_dir)/res $(photo_dir)
LOCAL_MODULE_TAGS := optional
-LOCAL_SRC_FILES := $(call all-java-files-under, src/com/android/email)
+LOCAL_SRC_FILES := $(call all-java-files-under, $(unified_email_dir)/src)
+LOCAL_SRC_FILES += $(call all-java-files-under, src/com/android)
LOCAL_SRC_FILES += $(call all-java-files-under, src/com/beetstra)
+
LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dir))
-LOCAL_AAPT_FLAGS := --auto-add-overlay
-LOCAL_AAPT_FLAGS += --extra-packages com.android.ex.chips
-LOCAL_STATIC_JAVA_LIBRARIES := android-common com.android.emailcommon guava android-common-chips
+# Use assets dir from UnifiedEmail
+# (the default package target doesn't seem to deal with multiple asset dirs)
+LOCAL_ASSET_DIR := $(LOCAL_PATH)/$(unified_email_dir)/assets
-LOCAL_PACKAGE_NAME := Email
+LOCAL_AAPT_FLAGS := --auto-add-overlay
+LOCAL_AAPT_FLAGS += --extra-packages com.android.ex.chips:com.android.mail:com.android.email:com.android.ex.photo
+
+LOCAL_STATIC_JAVA_LIBRARIES := android-common com.android.emailcommon2 guava android-common-chips android-common-photoviewer
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v13
-LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+LOCAL_PACKAGE_NAME := Email2
+LOCAL_OVERRIDES_PACKAGES := Email
-LOCAL_SDK_VERSION := current
+LOCAL_PROGUARD_FLAG_FILES := proguard.flags $(unified_email_dir)/proguard.flags
-# The Emma tool analyzes code coverage when running unit tests on the
-# application. This configuration line selects which packages will be analyzed,
-# leaving out code which is tested by other means (e.g. static libraries) that
-# would dilute the coverage results. These options do not affect regular
-# production builds.
-LOCAL_EMMA_COVERAGE_FILTER := +com.android.emailcommon.*,+com.android.email.*, \
- +org.apache.james.mime4j.*,+com.beetstra.jutf7.*,+org.apache.commons.io.*
+LOCAL_SDK_VERSION := 16
include $(BUILD_PACKAGE)
@@ -54,3 +58,4 @@ ifeq ($(strip $(LOCAL_PACKAGE_OVERRIDES)),)
# additionally, build unit tests in a separate .apk
include $(call all-makefiles-under,$(LOCAL_PATH))
endif
+
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8a449c3a8..9889e693c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
+<!--
+ Copyright (C) 2012 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -13,53 +14,31 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-
-<manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.email"
- android:versionCode="410000"
- android:versionName="4.1"
- >
-
- <original-package
- android:name="com.android.email" />
-
- <uses-permission
- android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
- <uses-permission
- android:name="android.permission.ACCESS_NETWORK_STATE"/>
- <uses-permission
- android:name="android.permission.INTERNET"/>
- <uses-permission
- android:name="android.permission.VIBRATE"/>
- <uses-permission
- android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission
- android:name="android.permission.GET_ACCOUNTS" />
+ android:versionCode="500000"
+ android:versionName="5.0" >
+
+ <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+ <uses-permission android:name="android.permission.INTERNET"/>
+ <uses-permission android:name="android.permission.VIBRATE"/>
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
- <uses-permission
- android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
- <uses-permission
- android:name="android.permission.READ_SYNC_SETTINGS" />
- <uses-permission
- android:name="android.permission.WRITE_SYNC_SETTINGS"/>
-
- <uses-permission
- android:name="android.permission.WRITE_CONTACTS"/>
- <uses-permission
- android:name="android.permission.READ_CONTACTS"/>
-
- <uses-permission
- android:name="android.permission.READ_PROFILE"/>
-
- <uses-permission
- android:name="android.permission.NFC"/>
-
- <!-- Only required if a store implements push mail and needs to keep network open -->
- <uses-permission
- android:name="android.permission.WAKE_LOCK"/>
- <uses-permission
- android:name="android.permission.READ_PHONE_STATE"/>
+ <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
+ <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
+ <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
+ <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
+ <uses-permission android:name="android.permission.READ_CONTACTS"/>
+ <uses-permission android:name="android.permission.READ_CALENDAR"/>
+ <uses-permission android:name="android.permission.READ_PROFILE"/>
+ <uses-permission android:name="android.permission.NFC"/>
+ <uses-permission android:name="android.permission.WAKE_LOCK"/>
+ <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
+
+ <!-- This needs to be present when we are doing unbundled releases. -->
+ <uses-sdk android:targetSdkVersion="16" android:minSdkVersion="14" />
<!-- Grant permission to other apps to view attachments -->
<permission
@@ -75,44 +54,148 @@
android:name="android.permission.USE_CREDENTIALS"/>
<!-- Grant permission to system apps to access provider (see provider below) -->
+ <!-- STOPSHIP: Temporarily set protection level to "dangerous" (from "signature") -->
<permission
android:name="com.android.email.permission.ACCESS_PROVIDER"
- android:protectionLevel="signature"
+ android:protectionLevel="dangerous"
android:label="@string/permission_access_provider_label"
android:description="@string/permission_access_provider_desc"/>
<uses-permission
android:name="com.android.email.permission.ACCESS_PROVIDER"/>
- <!-- Note: Actually, android:hardwareAccelerated could be "true", but in order to switch it
- on/off in the debug screen, we have to set it "false" here and enable it at runtime. -->
<application
- android:icon="@mipmap/ic_launcher_email"
+ android:icon="@mipmap/ic_launcher_mail"
android:label="@string/app_name"
- android:name="Email"
- android:theme="@style/EmailTheme"
- android:hardwareAccelerated="false"
- >
+ android:theme="@style/UnifiedEmailTheme"
+ android:hardwareAccelerated="true" >
+ <!-- Enable search in all activities -->
+ <meta-data android:name="android.app.default_searchable"
+ android:value="com.android.email2.ui.MailActivityEmail" />
<activity
- android:name=".activity.Welcome"
+ android:name="com.android.mail.compose.ComposeActivity"
+ android:label="@string/app_name"
+ android:theme="@android:style/Theme.Holo.Light"
>
<intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.LAUNCHER" />
- <category android:name="android.intent.category.APP_EMAIL" />
+ <action
+ android:name="android.intent.action.VIEW" />
+ <action
+ android:name="android.intent.action.SENDTO" />
+ <data
+ android:scheme="mailto" />
+ <category
+ android:name="android.intent.category.DEFAULT" />
+ <category
+ android:name="android.intent.category.BROWSABLE" />
+ </intent-filter>
+ <intent-filter
+ android:label="@string/app_name">
+ <action
+ android:name="android.intent.action.SEND" />
+ <data
+ android:mimeType="*/*" />
+ <category
+ android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <intent-filter
+ android:label="@string/app_name">
+ <action
+ android:name="android.intent.action.SEND_MULTIPLE" />
+ <data
+ android:mimeType="*/*" />
+ <category
+ android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <intent-filter>
+ <action
+ android:name="com.android.email.intent.action.REPLY" />
</intent-filter>
<intent-filter>
+ <action android:name="android.intent.action.SEND" />
+ <category
+ android:name="android.intent.category.DEFAULT" />
+ <data
+ android:scheme="content"
+ android:host="ui.email2.android.com"
+ android:pathPrefix="/compose"
+ />
+ </intent-filter>
+ </activity>
+
+ <activity
+ android:name=".activity.EventViewer"
+ android:label="@string/app_name"
+ android:theme="@android:style/Theme.Holo.Light"
+ >
+ <intent-filter>
<action android:name="android.intent.action.VIEW" />
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.LAUNCHER" />
+ <category
+ android:name="android.intent.category.DEFAULT" />
<data
android:scheme="content"
- android:host="ui.email.android.com"
- android:path="/view/mailbox"
+ android:host="ui.email2.android.com"
+ android:pathPrefix="/event"
/>
</intent-filter>
</activity>
+
+ <!-- TODO: this activity doesn't exist. Determine what to do here -->
+ <activity android:name=".ui.CreateShortcutActivity"
+ android:label="@string/activity_folder_selection" />
+
+ <activity android:name="com.android.mail.ui.FolderSelectionActivity"
+ android:label="@string/activity_folder_selection" />
+
+ <activity android:name="com.android.email2.ui.MailboxSelectionActivityEmail"
+ android:label="@string/app_name" >
+ <intent-filter>
+ <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="com.android.mail.ui.ShortcutNameActivity"
+ android:label="@string/shortcut_name_title"
+ android:theme="@style/ShortcutWidgetTheme">
+ </activity>
+
+ <activity android:name="com.android.mail.ui.MailboxSelectionActivity"
+ android:label="@string/app_name" >
+ <intent-filter>
+ <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="com.android.email2.ui.CreateShortcutActivityEmail"
+ android:theme="@style/ShortcutWidgetTheme"
+ android:label="@string/activity_folder_selection">
+
+ <intent-filter>
+ <action android:name="android.intent.action.CREATE_SHORTCUT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+
+ </activity>
+
+ <activity
+ android:label="@string/app_name"
+ android:name="com.android.email2.ui.MailActivityEmail"
+ android:uiOptions="splitActionBarWhenNarrow">
+ <intent-filter >
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="content"/>
+ <data android:mimeType="application/email-ls" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.SEARCH" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" />
+ </activity>
<!-- Must be exported in order for the AccountManager to launch it -->
<!-- Also available for continuous test systems to force account creation -->
@@ -129,7 +212,7 @@
</intent-filter>
</activity>
<activity
- android:name=".activity.setup.AccountSetupAccountType"
+ android:name=".activity.setup.AccountSetupType"
android:label="@string/account_setup_account_type_title"
>
</activity>
@@ -144,11 +227,6 @@
>
</activity>
<activity
- android:name=".activity.setup.AccountSetupExchange"
- android:label="@string/account_setup_exchange_title"
- >
- </activity>
- <activity
android:name=".activity.setup.AccountSetupOptions"
android:label="@string/account_setup_options_title"
>
@@ -175,7 +253,7 @@
<data
android:scheme="content"
android:host="ui.email.android.com"
- android:path="/settings"
+ android:pathPrefix="/settings"
/>
</intent-filter>
<intent-filter>
@@ -189,96 +267,65 @@
>
</activity>
- <!-- Don't need to set the title; it will be set programatically -->
<activity
- android:name=".activity.ShortcutPicker"
- android:enabled="false"
- android:theme="@android:style/Theme.Holo.Light.DialogWhenLarge"
- >
- <intent-filter
- android:label="@string/account_shortcut_picker_name">
- <action
- android:name="android.intent.action.CREATE_SHORTCUT" />
- <category
- android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- <activity
- android:name=".activity.EmailActivity"
- android:uiOptions="splitActionBarWhenNarrow"
+ android:name=".activity.setup.MailboxSettings"
+ android:label="@string/mailbox_settings_activity_title"
>
</activity>
+
<activity
- android:name=".activity.MessageFileView"
- >
- <intent-filter
- android:label="@string/app_name">
- <action
- android:name="android.intent.action.VIEW" />
- <data
- android:mimeType="application/eml" />
- <data
- android:mimeType="message/rfc822" />
- <category
- android:name="android.intent.category.DEFAULT" />
- </intent-filter>
+ android:name="com.android.mail.photo.MailPhotoViewActivity"
+ android:label="@string/app_name"
+ android:theme="@style/PhotoViewTheme" >
</activity>
- <activity
- android:name=".activity.MessageCompose"
- android:label="@string/compose_title"
- android:enabled="false"
- android:theme="@android:style/Theme.Holo.Light"
- >
+
+ <provider
+ android:authorities="com.android.email2.conversation.provider"
+ android:label="@string/conversation_content_provider"
+ android:multiprocess="false"
+ android:name="com.android.mail.browse.EmailConversationProvider" >
+ <grant-uri-permission android:pathPattern=".*" />
+ </provider>
+
+ <provider
+ android:authorities="com.android.email2.accountcache"
+ android:label="@string/account_cache_provider"
+ android:multiprocess="false"
+ android:name="com.android.mail.providers.EmailAccountCacheProvider" >
+ <grant-uri-permission android:pathPattern=".*" />
+ </provider>
+
+ <!-- The android:name is the name of the Provider class which is stored in
+ UnifiedEmail, and has package name com.android.mail.providers and the class is
+ called SuggestionsProvider. The authority name is specified in the MailAppProvider
+ which is specific to the two apps separately. -->
+ <provider android:name="com.android.mail.providers.SuggestionsProvider"
+ android:authorities="com.android.email.suggestionsprovider" />
+
+ <receiver android:name="com.android.mail.providers.protos.boot.AccountReceiver">
+ <intent-filter>
+ <action android:name="com.android.email2.providers.protos.boot.intent.ACTION_PROVIDER_CREATED" />
+ </intent-filter>
+ </receiver>
+
+ <service android:name="com.android.mail.compose.EmptyService"/>
+ <!-- Widget -->
+ <receiver android:name="com.android.mail.widget.WidgetProvider" android:label="@string/app_name">
<intent-filter>
- <action
- android:name="android.intent.action.VIEW" />
- <action
- android:name="android.intent.action.SENDTO" />
- <data
- android:scheme="mailto" />
- <category
- android:name="android.intent.category.DEFAULT" />
- <category
- android:name="android.intent.category.BROWSABLE" />
- </intent-filter>
- <intent-filter
- android:label="@string/app_name">
- <action
- android:name="android.intent.action.SEND" />
- <data
- android:mimeType="*/*" />
- <category
- android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <intent-filter
- android:label="@string/app_name">
- <action
- android:name="android.intent.action.SEND_MULTIPLE" />
- <data
- android:mimeType="*/*" />
- <category
- android:name="android.intent.category.DEFAULT" />
+ <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<intent-filter>
- <action
- android:name="com.android.email.intent.action.REPLY" />
+ <action android:name="com.android.mail.ACTION_NOTIFY_DATASET_CHANGED" />
+ <data android:mimeType="application/email-ls" />
</intent-filter>
- </activity>
-
- <!-- Only used to support pre-HC shortcuts -->
- <activity
- android:name=".activity.MessageList"
- >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
+ <meta-data android:name="android.appwidget.provider"
+ android:resource="@xml/widget_info" />
+ </receiver>
+ <service android:name="com.android.mail.widget.WidgetService"
+ android:permission="android.permission.BIND_REMOTEVIEWS"
+ android:exported="false" />
- <activity
- android:name=".activity.setup.MailboxSettings"
- android:label="@string/mailbox_settings_activity_title"
- >
- </activity>
+ <!-- From Email application -->
<receiver
android:name=".service.AttachmentDownloadService$Watchdog"
@@ -288,14 +335,16 @@
android:name=".service.EmailBroadcastReceiver"
android:enabled="true">
<intent-filter>
- <action
- android:name="android.intent.action.BOOT_COMPLETED" />
- <action
- android:name="android.intent.action.DEVICE_STORAGE_LOW" />
- <action
- android:name="android.intent.action.DEVICE_STORAGE_OK" />
- <action
- android:name="android.accounts.LOGIN_ACCOUNTS_CHANGED" />
+ <action android:name="android.intent.action.BOOT_COMPLETED" />
+ <action android:name="android.intent.action.DEVICE_STORAGE_LOW" />
+ <action android:name="android.intent.action.DEVICE_STORAGE_OK" />
+ <action android:name="android.accounts.LOGIN_ACCOUNTS_CHANGED" />
+ </intent-filter>
+ <!-- To handle new message notifications -->
+ <intent-filter>
+ <action android:name="com.android.mail.action.update_notification"
+ android:priority="-10" />
+ <data android:mimeType="application/email-ls" />
</intent-filter>
<!-- To handle secret code to activate the debug screen. -->
<intent-filter>
@@ -327,12 +376,6 @@
<service
android:name=".service.MailService"
- android:enabled="false"
- >
- </service>
-
- <service
- android:name=".Controller$ControllerService"
android:enabled="true"
>
</service>
@@ -394,6 +437,28 @@
</intent-filter>
</service>
+ <service
+ android:name=".service.ImapService"
+ android:enabled="true"
+ android:permission="com.android.email.permission.ACCESS_PROVIDER"
+ >
+ <intent-filter>
+ <action
+ android:name="com.android.email.IMAP_INTENT" />
+ </intent-filter>
+ </service>
+
+ <service
+ android:name=".service.Pop3Service"
+ android:enabled="true"
+ android:permission="com.android.email.permission.ACCESS_PROVIDER"
+ >
+ <intent-filter>
+ <action
+ android:name="com.android.email.POP3_INTENT" />
+ </intent-filter>
+ </service>
+
<!--Required stanza to register the EasAuthenticatorService with AccountManager -->
<service
android:name=".service.EasAuthenticatorService"
@@ -461,37 +526,5 @@
android:label="@string/app_name"
/>
- <!-- Email AppWidget definitions -->
- <activity
- android:name=".widget.WidgetConfiguration"
- android:enabled="false"
- android:theme="@android:style/Theme.Holo.Light.DialogWhenLarge"
- >
- <intent-filter
- android:label="@string/account_shortcut_picker_name">
- <action
- android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
- <category
- android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- <service
- android:name=".provider.WidgetProvider$WidgetService"
- android:permission="android.permission.BIND_REMOTEVIEWS"
- android:exported="false"
- />
- <receiver
- android:name=".provider.WidgetProvider" >
- <intent-filter>
- <action
- android:name="android.appwidget.action.APPWIDGET_UPDATE" />
- </intent-filter>
- <intent-filter>
- <action android:name="com.android.email.MESSAGE_LIST_DATASET_CHANGED" />
- </intent-filter>
- <meta-data
- android:name="android.appwidget.provider"
- android:resource="@xml/widget_info" />
- </receiver>
</application>
</manifest>
diff --git a/CleanSpec.mk b/CleanSpec.mk
deleted file mode 100644
index b5064f0a3..000000000
--- a/CleanSpec.mk
+++ /dev/null
@@ -1,79 +0,0 @@
-# Copyright (C) 2007 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# If you don't need to do a full clean build but would like to touch
-# a file or delete some intermediate files, add a clean step to the end
-# of the list. These steps will only be run once, if they haven't been
-# run before.
-#
-# E.g.:
-# $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
-# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
-#
-# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
-# files that are missing or have been moved.
-#
-# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
-# Use $(OUT_DIR) to refer to the "out" directory.
-#
-# If you need to re-do something that's already mentioned, just copy
-# the command and add it to the bottom of the list. E.g., if a change
-# that you made last week required touching a file and a change you
-# made today requires touching the same file, just copy the old
-# touch step and add it to the end of the list.
-#
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
-
-# For example:
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
-#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
-#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
-$(call add-clean-step, rm -rf $(OUT_DIR)/out/target/common/obj/APPS/Email*)
-$(call add-clean-step, rm -rf $(OUT_DIR)/out/target/common/obj/APPS/Email*)
-$(call add-clean-step, rm -rf $(OUT_DIR)/out/target/common/obj/APPS/Exchange*)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/JAVA_LIBRARIES/com.android.emailcommon*)
-$(call add-clean-step, rm -rf $(OUT_DIR)/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes/com/android/emailcommon*)
-$(call add-clean-step, rm -rf $(OUT_DIR)/out/target/common/obj/JAVA_LIBRARIES/com.android.emailcommon*)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/EmailGoogle_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/Email_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/com.android.emailcommon_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/com.android.emailcommon_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/com.android.emailcommon_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/com.android.emailcommon_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/Email_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/EmailGoogle_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/Email_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/EmailGoogle_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/Email2_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/Email_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/EmailGoogle_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/Email2_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/out/target/common/obj/JAVA_LIBRARIES/com.android.emailcommon*)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/EmailGoogle_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/Email2_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/out/target/common/obj/JAVA_LIBRARIES/com.android.emailcommon*)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/EmailGoogle_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/Email2_intermediates)
-$(call add-clean-step, rm -rf $(OUT_DIR)/out/target/common/obj/JAVA_LIBRARIES/com.android.emailcommon*)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/Email*)
-$(call add-clean-step, rm -rf $(OUT_DIR)/out/target/common/obj/JAVA_LIBRARIES/com.android.emailcommon*)
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/Email*)
-
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
diff --git a/email2/Android.mk b/email2/Android.mk
deleted file mode 100644
index 4cf4793be..000000000
--- a/email2/Android.mk
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright 2008, The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH := $(call my-dir)
-
-# Build the Email application itself, along with its tests and tests for the emailcommon
-# static library. All tests can be run via runtest email
-
-include $(CLEAR_VARS)
-
-# Include res dir from chips, unified, and photoviewer
-chips_dir := ../../../../frameworks/ex/chips/res
-unified_email_dir := ../../UnifiedEmail
-photo_dir := ../../../../frameworks/ex/photoviewer/res
-res_dir := $(chips_dir) res $(unified_email_dir)/res $(photo_dir)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := $(call all-java-files-under, $(unified_email_dir)/src)
-LOCAL_SRC_FILES += $(call all-java-files-under, src/com/android)
-LOCAL_SRC_FILES += $(call all-java-files-under, src/com/beetstra)
-
-LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dir))
-
-# Use assets dir from UnifiedEmail
-# (the default package target doesn't seem to deal with multiple asset dirs)
-LOCAL_ASSET_DIR := $(LOCAL_PATH)/$(unified_email_dir)/assets
-
-LOCAL_AAPT_FLAGS := --auto-add-overlay
-LOCAL_AAPT_FLAGS += --extra-packages com.android.ex.chips:com.android.mail:com.android.email:com.android.ex.photo
-
-LOCAL_STATIC_JAVA_LIBRARIES := android-common com.android.emailcommon2 guava android-common-chips android-common-photoviewer
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v13
-
-LOCAL_PACKAGE_NAME := Email2
-LOCAL_OVERRIDES_PACKAGES := Email
-
-LOCAL_PROGUARD_FLAG_FILES := proguard.flags $(unified_email_dir)/proguard.flags
-
-LOCAL_SDK_VERSION := 16
-
-include $(BUILD_PACKAGE)
-
-# only include rules to build other stuff for the original package, not the derived package.
-ifeq ($(strip $(LOCAL_PACKAGE_OVERRIDES)),)
-# additionally, build unit tests in a separate .apk
-include $(call all-makefiles-under,$(LOCAL_PATH))
-endif
-
diff --git a/email2/AndroidManifest.xml b/email2/AndroidManifest.xml
deleted file mode 100644
index 9889e693c..000000000
--- a/email2/AndroidManifest.xml
+++ /dev/null
@@ -1,530 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2012 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.email"
- android:versionCode="500000"
- android:versionName="5.0" >
-
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.VIBRATE"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.GET_ACCOUNTS" />
- <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
- <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
- <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
- <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
- <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
- <uses-permission android:name="android.permission.READ_CONTACTS"/>
- <uses-permission android:name="android.permission.READ_CALENDAR"/>
- <uses-permission android:name="android.permission.READ_PROFILE"/>
- <uses-permission android:name="android.permission.NFC"/>
- <uses-permission android:name="android.permission.WAKE_LOCK"/>
- <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-
- <!-- This needs to be present when we are doing unbundled releases. -->
- <uses-sdk android:targetSdkVersion="16" android:minSdkVersion="14" />
-
- <!-- Grant permission to other apps to view attachments -->
- <permission
- android:name="com.android.email.permission.READ_ATTACHMENT"
- android:permissionGroup="android.permission-group.MESSAGES"
- android:protectionLevel="dangerous"
- android:label="@string/permission_read_attachment_label"
- android:description="@string/permission_read_attachment_desc"/>
- <uses-permission
- android:name="com.android.email.permission.READ_ATTACHMENT"/>
-
- <uses-permission
- android:name="android.permission.USE_CREDENTIALS"/>
-
- <!-- Grant permission to system apps to access provider (see provider below) -->
- <!-- STOPSHIP: Temporarily set protection level to "dangerous" (from "signature") -->
- <permission
- android:name="com.android.email.permission.ACCESS_PROVIDER"
- android:protectionLevel="dangerous"
- android:label="@string/permission_access_provider_label"
- android:description="@string/permission_access_provider_desc"/>
- <uses-permission
- android:name="com.android.email.permission.ACCESS_PROVIDER"/>
-
- <application
- android:icon="@mipmap/ic_launcher_mail"
- android:label="@string/app_name"
- android:theme="@style/UnifiedEmailTheme"
- android:hardwareAccelerated="true" >
- <!-- Enable search in all activities -->
- <meta-data android:name="android.app.default_searchable"
- android:value="com.android.email2.ui.MailActivityEmail" />
- <activity
- android:name="com.android.mail.compose.ComposeActivity"
- android:label="@string/app_name"
- android:theme="@android:style/Theme.Holo.Light"
- >
- <intent-filter>
- <action
- android:name="android.intent.action.VIEW" />
- <action
- android:name="android.intent.action.SENDTO" />
- <data
- android:scheme="mailto" />
- <category
- android:name="android.intent.category.DEFAULT" />
- <category
- android:name="android.intent.category.BROWSABLE" />
- </intent-filter>
- <intent-filter
- android:label="@string/app_name">
- <action
- android:name="android.intent.action.SEND" />
- <data
- android:mimeType="*/*" />
- <category
- android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <intent-filter
- android:label="@string/app_name">
- <action
- android:name="android.intent.action.SEND_MULTIPLE" />
- <data
- android:mimeType="*/*" />
- <category
- android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <intent-filter>
- <action
- android:name="com.android.email.intent.action.REPLY" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.SEND" />
- <category
- android:name="android.intent.category.DEFAULT" />
- <data
- android:scheme="content"
- android:host="ui.email2.android.com"
- android:pathPrefix="/compose"
- />
- </intent-filter>
- </activity>
-
- <activity
- android:name=".activity.EventViewer"
- android:label="@string/app_name"
- android:theme="@android:style/Theme.Holo.Light"
- >
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <category
- android:name="android.intent.category.DEFAULT" />
- <data
- android:scheme="content"
- android:host="ui.email2.android.com"
- android:pathPrefix="/event"
- />
- </intent-filter>
- </activity>
-
- <!-- TODO: this activity doesn't exist. Determine what to do here -->
- <activity android:name=".ui.CreateShortcutActivity"
- android:label="@string/activity_folder_selection" />
-
- <activity android:name="com.android.mail.ui.FolderSelectionActivity"
- android:label="@string/activity_folder_selection" />
-
- <activity android:name="com.android.email2.ui.MailboxSelectionActivityEmail"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
- </intent-filter>
- </activity>
-
- <activity android:name="com.android.mail.ui.ShortcutNameActivity"
- android:label="@string/shortcut_name_title"
- android:theme="@style/ShortcutWidgetTheme">
- </activity>
-
- <activity android:name="com.android.mail.ui.MailboxSelectionActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
- </intent-filter>
- </activity>
-
- <activity android:name="com.android.email2.ui.CreateShortcutActivityEmail"
- android:theme="@style/ShortcutWidgetTheme"
- android:label="@string/activity_folder_selection">
-
- <intent-filter>
- <action android:name="android.intent.action.CREATE_SHORTCUT" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
-
- </activity>
-
- <activity
- android:label="@string/app_name"
- android:name="com.android.email2.ui.MailActivityEmail"
- android:uiOptions="splitActionBarWhenNarrow">
- <intent-filter >
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="content"/>
- <data android:mimeType="application/email-ls" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.SEARCH" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" />
- </activity>
-
- <!-- Must be exported in order for the AccountManager to launch it -->
- <!-- Also available for continuous test systems to force account creation -->
- <activity
- android:name=".activity.setup.AccountSetupBasics"
- android:label="@string/account_setup_basics_title"
- android:exported="true"
- >
- <intent-filter>
- <action
- android:name="com.android.email.CREATE_ACCOUNT" />
- <category
- android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- <activity
- android:name=".activity.setup.AccountSetupType"
- android:label="@string/account_setup_account_type_title"
- >
- </activity>
- <activity
- android:name=".activity.setup.AccountSetupIncoming"
- android:label="@string/account_setup_incoming_title"
- >
- </activity>
- <activity
- android:name=".activity.setup.AccountSetupOutgoing"
- android:label="@string/account_setup_outgoing_title"
- >
- </activity>
- <activity
- android:name=".activity.setup.AccountSetupOptions"
- android:label="@string/account_setup_options_title"
- >
- </activity>
- <activity
- android:name=".activity.setup.AccountSetupNames"
- android:label="@string/account_setup_names_title"
- >
- </activity>
- <activity
- android:name=".activity.setup.AccountSettings"
- android:label="@string/settings_activity_title"
- android:theme="@android:style/Theme.Holo.Light"
- >
- <intent-filter>
- <action
- android:name="com.android.email.activity.setup.ACCOUNT_MANAGER_ENTRY" />
- <category
- android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.EDIT" />
- <category android:name="android.intent.category.DEFAULT" />
- <data
- android:scheme="content"
- android:host="ui.email.android.com"
- android:pathPrefix="/settings"
- />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- <activity
- android:name=".activity.setup.AccountSecurity"
- android.label="@string/account_security_title"
- >
- </activity>
-
- <activity
- android:name=".activity.setup.MailboxSettings"
- android:label="@string/mailbox_settings_activity_title"
- >
- </activity>
-
- <activity
- android:name="com.android.mail.photo.MailPhotoViewActivity"
- android:label="@string/app_name"
- android:theme="@style/PhotoViewTheme" >
- </activity>
-
- <provider
- android:authorities="com.android.email2.conversation.provider"
- android:label="@string/conversation_content_provider"
- android:multiprocess="false"
- android:name="com.android.mail.browse.EmailConversationProvider" >
- <grant-uri-permission android:pathPattern=".*" />
- </provider>
-
- <provider
- android:authorities="com.android.email2.accountcache"
- android:label="@string/account_cache_provider"
- android:multiprocess="false"
- android:name="com.android.mail.providers.EmailAccountCacheProvider" >
- <grant-uri-permission android:pathPattern=".*" />
- </provider>
-
- <!-- The android:name is the name of the Provider class which is stored in
- UnifiedEmail, and has package name com.android.mail.providers and the class is
- called SuggestionsProvider. The authority name is specified in the MailAppProvider
- which is specific to the two apps separately. -->
- <provider android:name="com.android.mail.providers.SuggestionsProvider"
- android:authorities="com.android.email.suggestionsprovider" />
-
- <receiver android:name="com.android.mail.providers.protos.boot.AccountReceiver">
- <intent-filter>
- <action android:name="com.android.email2.providers.protos.boot.intent.ACTION_PROVIDER_CREATED" />
- </intent-filter>
- </receiver>
-
- <service android:name="com.android.mail.compose.EmptyService"/>
- <!-- Widget -->
- <receiver android:name="com.android.mail.widget.WidgetProvider" android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
- </intent-filter>
- <intent-filter>
- <action android:name="com.android.mail.ACTION_NOTIFY_DATASET_CHANGED" />
- <data android:mimeType="application/email-ls" />
- </intent-filter>
- <meta-data android:name="android.appwidget.provider"
- android:resource="@xml/widget_info" />
- </receiver>
- <service android:name="com.android.mail.widget.WidgetService"
- android:permission="android.permission.BIND_REMOTEVIEWS"
- android:exported="false" />
-
- <!-- From Email application -->
-
- <receiver
- android:name=".service.AttachmentDownloadService$Watchdog"
- android:enabled="true"/>
-
- <receiver
- android:name=".service.EmailBroadcastReceiver"
- android:enabled="true">
- <intent-filter>
- <action android:name="android.intent.action.BOOT_COMPLETED" />
- <action android:name="android.intent.action.DEVICE_STORAGE_LOW" />
- <action android:name="android.intent.action.DEVICE_STORAGE_OK" />
- <action android:name="android.accounts.LOGIN_ACCOUNTS_CHANGED" />
- </intent-filter>
- <!-- To handle new message notifications -->
- <intent-filter>
- <action android:name="com.android.mail.action.update_notification"
- android:priority="-10" />
- <data android:mimeType="application/email-ls" />
- </intent-filter>
- <!-- To handle secret code to activate the debug screen. -->
- <intent-filter>
- <action
- android:name="android.provider.Telephony.SECRET_CODE" />
- <!-- "36245" = "email" -->
- <data
- android:scheme="android_secret_code"
- android:host="36245" />
- </intent-filter>
- </receiver>
- <service
- android:name=".service.EmailBroadcastProcessorService" />
-
- <!-- Support for DeviceAdmin / DevicePolicyManager. See SecurityPolicy class for impl. -->
- <receiver
- android:name=".SecurityPolicy$PolicyAdmin"
- android:label="@string/device_admin_label"
- android:description="@string/device_admin_description"
- android:permission="android.permission.BIND_DEVICE_ADMIN" >
- <meta-data
- android:name="android.app.device_admin"
- android:resource="@xml/device_admin" />
- <intent-filter>
- <action
- android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
- </intent-filter>
- </receiver>
-
- <service
- android:name=".service.MailService"
- android:enabled="true"
- >
- </service>
-
- <service
- android:name=".service.AttachmentDownloadService"
- android:enabled="false"
- >
- </service>
-
- <!--Required stanza to register the PopImapAuthenticatorService with AccountManager -->
- <service
- android:name=".service.PopImapAuthenticatorService"
- android:exported="true"
- android:enabled="true"
- >
- <intent-filter>
- <action
- android:name="android.accounts.AccountAuthenticator" />
- </intent-filter>
- <meta-data
- android:name="android.accounts.AccountAuthenticator"
- android:resource="@xml/pop_imap_authenticator"
- />
- </service>
-
- <!--Required stanza to register the PopImapSyncAdapterService with SyncManager -->
- <service
- android:name="com.android.email.service.PopImapSyncAdapterService"
- android:exported="true">
- <intent-filter>
- <action
- android:name="android.content.SyncAdapter" />
- </intent-filter>
- <meta-data android:name="android.content.SyncAdapter"
- android:resource="@xml/syncadapter_pop_imap" />
- </service>
-
- <!-- Require provider permission to use our Policy and Account services -->
- <service
- android:name=".service.PolicyService"
- android:enabled="true"
- android:permission="com.android.email.permission.ACCESS_PROVIDER"
- >
- <intent-filter>
- <action
- android:name="com.android.email.POLICY_INTENT" />
- </intent-filter>
- </service>
-
- <service
- android:name=".service.AccountService"
- android:enabled="true"
- android:permission="com.android.email.permission.ACCESS_PROVIDER"
- >
- <intent-filter>
- <action
- android:name="com.android.email.ACCOUNT_INTENT" />
- </intent-filter>
- </service>
-
- <service
- android:name=".service.ImapService"
- android:enabled="true"
- android:permission="com.android.email.permission.ACCESS_PROVIDER"
- >
- <intent-filter>
- <action
- android:name="com.android.email.IMAP_INTENT" />
- </intent-filter>
- </service>
-
- <service
- android:name=".service.Pop3Service"
- android:enabled="true"
- android:permission="com.android.email.permission.ACCESS_PROVIDER"
- >
- <intent-filter>
- <action
- android:name="com.android.email.POP3_INTENT" />
- </intent-filter>
- </service>
-
- <!--Required stanza to register the EasAuthenticatorService with AccountManager -->
- <service
- android:name=".service.EasAuthenticatorService"
- android:exported="true"
- android:enabled="true"
- >
- <intent-filter>
- <action
- android:name="android.accounts.AccountAuthenticator" />
- </intent-filter>
- <meta-data
- android:name="android.accounts.AccountAuthenticator"
- android:resource="@xml/eas_authenticator"
- />
- </service>
- <!--Required stanza to register the EasTestAuthenticatorService with AccountManager -->
- <service
- android:name=".service.EasTestAuthenticatorService"
- android:exported="true"
- android:enabled="false"
- >
- <intent-filter>
- <action
- android:name="android.accounts.AccountAuthenticator" />
- </intent-filter>
- <meta-data
- android:name="android.accounts.AccountAuthenticator"
- android:resource="@xml/eastest_authenticator"
- />
- </service>
- <!--
- EasAuthenticatorService with the alternative label. Disabled by default,
- and OneTimeInitializer enables it if the vendor policy tells so.
- -->
- <service
- android:name=".service.EasAuthenticatorServiceAlternate"
- android:exported="true"
- android:enabled="false"
- >
- <intent-filter>
- <action
- android:name="android.accounts.AccountAuthenticator" />
- </intent-filter>
- <meta-data
- android:name="android.accounts.AccountAuthenticator"
- android:resource="@xml/authenticator_alternate"
- />
- </service>
-
- <provider
- android:name=".provider.AttachmentProvider"
- android:authorities="com.android.email.attachmentprovider"
- android:multiprocess="true"
- android:grantUriPermissions="true"
- android:readPermission="com.android.email.permission.READ_ATTACHMENT"
- />
-
- <!-- This provider MUST be protected by strict permissions, as granting access to
- it exposes user passwords and other confidential information. -->
- <provider
- android:name=".provider.EmailProvider"
- android:authorities="com.android.email.provider;com.android.email.notifier"
- android:multiprocess="true"
- android:permission="com.android.email.permission.ACCESS_PROVIDER"
- android:label="@string/app_name"
- />
-
- </application>
-</manifest>
diff --git a/email2/assets/loading.gif b/email2/assets/loading.gif
deleted file mode 100644
index ab9982483..000000000
--- a/email2/assets/loading.gif
+++ /dev/null
Binary files differ
diff --git a/email2/assets/loading.html b/email2/assets/loading.html
deleted file mode 100644
index 0cc9cecc3..000000000
--- a/email2/assets/loading.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<html>
- <body bgcolor="white">
- <table width="100%" height="100%">
- <tr>
- <td align="center" valign="center">
- <font color="gray">Loading...</font>
- <br/>
- <br/>
- <br/>
- <br/>
- <br/>
- <img src="loading.gif">
- </td>
- </tr>
- </table>
- </body>
-</html> \ No newline at end of file
diff --git a/email2/assets/test.html b/email2/assets/test.html
deleted file mode 100644
index 09d6f119e..000000000
--- a/email2/assets/test.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<html>
- <body>
-Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Phasellus dui dui, luctus sit amet, hendrerit ac, blandit quis, diam. Duis libero velit, elementum id, mattis ut, fermentum aliquet, tortor. Maecenas tincidunt egestas pede. Integer sagittis ipsum ut lorem. Morbi egestas egestas sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis eget erat ac sem iaculis sollicitudin. Maecenas in velit id mauris cursus tincidunt. Sed ultrices elit in sapien ullamcorper imperdiet. Nunc viverra, lacus id varius elementum, nisl turpis lacinia tellus, sit amet viverra neque odio quis nisl. Quisque facilisis, ipsum non vulputate malesuada, leo augue elementum tortor, nec eleifend tellus lectus non massa.
-<br/><br/>
-Maecenas pulvinar rutrum risus. Phasellus mattis arcu sit amet neque. Aliquam sed quam at nulla laoreet pretium. Proin elit. Integer ullamcorper dolor a pede. Nam lobortis quam ut mauris. Pellentesque non mauris ut lacus hendrerit iaculis. In volutpat nulla et turpis. Fusce mollis. Aliquam sit amet tortor fermentum orci lacinia convallis. Donec tincidunt tortor sed erat sollicitudin gravida. In hac habitasse platea dictumst. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed pulvinar arcu consectetuer dolor. Nunc luctus aliquam leo. In hac habitasse platea dictumst. Praesent et mi sit amet ligula blandit hendrerit. Nam aliquam tincidunt est. Aliquam erat volutpat.
-<br/><br/>
-Curabitur augue. Fusce pulvinar nisi vitae diam. Donec dictum. Sed suscipit convallis magna. Ut hendrerit tortor in mauris. In at diam. Maecenas commodo. Aliquam erat volutpat. Nunc odio eros, vestibulum at, sodales id, congue et, risus. Curabitur feugiat blandit lacus. Nulla gravida placerat enim. Nunc turpis. Praesent malesuada.
-<br/><br/>
-Aenean quis erat. Vivamus non ipsum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed metus magna, porta eu, ultricies vitae, vulputate et, urna. Sed pulvinar, massa at ultricies rhoncus, nunc eros dapibus felis, quis congue risus orci rhoncus nibh. Pellentesque quam ante, laoreet vitae, iaculis a, gravida in, nibh. In hac habitasse platea dictumst. Aliquam erat volutpat. Suspendisse augue neque, posuere eu, sollicitudin quis, sagittis et, massa. Maecenas varius sem sodales ipsum. Donec congue mi nec orci. Nam pede ipsum, varius sed, condimentum ac, rhoncus non, lorem. Integer vestibulum, neque vitae ornare euismod, mauris turpis congue massa, non venenatis arcu lorem eget metus. Sed sollicitudin, enim aliquam pharetra cursus, neque augue bibendum leo, vitae ullamcorper ante felis nec massa. Maecenas vitae urna. Proin tincidunt, urna eu sodales vulputate, nisl tellus pretium ligula, ut venenatis metus nulla eu lectus. Integer urna purus, sagittis ut, posuere sed, sagittis non, mauris. Nunc eros risus, lacinia sit amet, dictum in, faucibus quis, urna. Fusce dictum mattis enim. Vivamus luctus sagittis felis.
-<br/><br/>
-Fusce pulvinar, erat a facilisis congue, lacus libero imperdiet dui, nec luctus justo neque sit amet mauris. Praesent sodales. Sed sed nisl a arcu tempus placerat. Duis sagittis risus. Aliquam tristique. Ut a mi. Integer volutpat, turpis vitae lobortis blandit, lorem sapien suscipit arcu, sit amet dignissim felis mauris vitae ipsum. Sed elit. Mauris elementum, pede nec accumsan pretium, leo metus fringilla erat, at feugiat turpis arcu pretium urna. Morbi lorem tellus, commodo sed, convallis id, suscipit sed, leo. Donec egestas ultricies tellus. Curabitur sapien orci, interdum nec, molestie at, pharetra eu, magna. Duis pharetra orci sed felis posuere malesuada. Donec nec nisi non urna ultricies porttitor. Maecenas lectus. Sed dignissim malesuada justo. Nunc rutrum consectetuer nunc.
-
- <img src="cid:23978198273">
- more text
- <img src="cid:12371982371">
- more text
- </body>
-</html> \ No newline at end of file
diff --git a/email2/emailcommon/Android.mk b/email2/emailcommon/Android.mk
deleted file mode 100644
index 415b03185..000000000
--- a/email2/emailcommon/Android.mk
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2011, The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH := $(call my-dir)
-
-# Build the com.android.emailcommon static library. At the moment, this includes
-# the emailcommon files themselves plus everything under src/org (apache code). All of our
-# AIDL files are also compiled into the static library
-
-include $(CLEAR_VARS)
-
-unified_email_src_dir := ../../../UnifiedEmail/src
-apache_src_dir := ../../../UnifiedEmail/src/org
-
-imported_unified_email_files := \
- $(unified_email_src_dir)/com/android/mail/utils/LogUtils.java \
- $(unified_email_src_dir)/com/android/mail/providers/UIProvider.java
-
-LOCAL_MODULE := com.android.emailcommon2
-LOCAL_STATIC_JAVA_LIBRARIES := guava android-common
-LOCAL_SRC_FILES := $(call all-java-files-under, src/com/android/emailcommon)
-LOCAL_SRC_FILES += \
- src/com/android/emailcommon/service/IEmailService.aidl \
- src/com/android/emailcommon/service/IEmailServiceCallback.aidl \
- src/com/android/emailcommon/service/IPolicyService.aidl \
- src/com/android/emailcommon/service/IAccountService.aidl
-LOCAL_SRC_FILES += $(call all-java-files-under, $(apache_src_dir))
-LOCAL_SRC_FILES += $(imported_unified_email_files)
-
-LOCAL_SDK_VERSION := 14
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/email2/emailcommon/src/com/android/emailcommon/AccountManagerTypes.java b/email2/emailcommon/src/com/android/emailcommon/AccountManagerTypes.java
deleted file mode 100644
index 4ccd480a5..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/AccountManagerTypes.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- /*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon;
-
-public class AccountManagerTypes {
- public static final String TYPE_EXCHANGE = "com.android.exchange";
- public static final String TYPE_POP_IMAP = "com.android.email";
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/Api.java b/email2/emailcommon/src/com/android/emailcommon/Api.java
deleted file mode 100644
index e20452ebe..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/Api.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon;
-
-/**
- * This class will be used for API-related definitions; for now, just the api "level"
- *
- * Level 1: As shipped in HC/MR1
- * Level 2: Adds searchMessages to EmailService
- * Level 3: Adds capabilities query
- *
- */
-public class Api {
- public static final int LEVEL = 3;
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/Configuration.java b/email2/emailcommon/src/com/android/emailcommon/Configuration.java
deleted file mode 100644
index d9469d906..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/Configuration.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon;
-
-public class Configuration {
- // Bundle key for Exchange configuration (boolean value)
- public static final String EXCHANGE_CONFIGURATION_USE_ALTERNATE_STRINGS =
- "com.android.email.EXCHANGE_CONFIGURATION_USE_ALTERNATE_STRINGS";
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/Device.java b/email2/emailcommon/src/com/android/emailcommon/Device.java
deleted file mode 100644
index ba93062ee..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/Device.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- /*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon;
-
-import android.content.Context;
-import android.telephony.TelephonyManager;
-import android.util.Log;
-
-import com.android.emailcommon.utility.Utility;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-
-public class Device {
- private static String sDeviceId = null;
-
- /**
- * EAS requires a unique device id, so that sync is possible from a variety of different
- * devices (e.g. the syncKey is specific to a device) If we're on an emulator or some other
- * device that doesn't provide one, we can create it as android<n> where <n> is system time.
- * This would work on a real device as well, but it would be better to use the "real" id if
- * it's available
- */
- static public synchronized String getDeviceId(Context context) throws IOException {
- if (sDeviceId == null) {
- sDeviceId = getDeviceIdInternal(context);
- }
- return sDeviceId;
- }
-
- static private String getDeviceIdInternal(Context context) throws IOException {
- if (context == null) {
- throw new IllegalStateException("getDeviceId requires a Context");
- }
- File f = context.getFileStreamPath("deviceName");
- BufferedReader rdr = null;
- String id;
- if (f.exists()) {
- if (f.canRead()) {
- rdr = new BufferedReader(new FileReader(f), 128);
- id = rdr.readLine();
- rdr.close();
- if (id == null) {
- // It's very bad if we read a null device id; let's delete that file
- if (!f.delete()) {
- Log.e(Logging.LOG_TAG, "Can't delete null deviceName file; try overwrite.");
- }
- } else {
- return id;
- }
- } else {
- Log.w(Logging.LOG_TAG, f.getAbsolutePath() + ": File exists, but can't read?" +
- " Trying to remove.");
- if (!f.delete()) {
- Log.w(Logging.LOG_TAG, "Remove failed. Tring to overwrite.");
- }
- }
- }
- BufferedWriter w = new BufferedWriter(new FileWriter(f), 128);
- final String consistentDeviceId = getConsistentDeviceId(context);
- if (consistentDeviceId != null) {
- // Use different prefix from random IDs.
- id = "androidc" + consistentDeviceId;
- } else {
- id = "android" + System.currentTimeMillis();
- }
- w.write(id);
- w.close();
- return id;
- }
-
- /**
- * @return Device's unique ID if available. null if the device has no unique ID.
- */
- public static String getConsistentDeviceId(Context context) {
- final String deviceId;
- try {
- TelephonyManager tm =
- (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
- if (tm == null) {
- return null;
- }
- deviceId = tm.getDeviceId();
- if (deviceId == null) {
- return null;
- }
- } catch (Exception e) {
- Log.d(Logging.LOG_TAG, "Error in TelephonyManager.getDeviceId(): " + e.getMessage());
- return null;
- }
- return Utility.getSmallHash(deviceId);
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/Logging.java b/email2/emailcommon/src/com/android/emailcommon/Logging.java
deleted file mode 100644
index 1fae76f84..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/Logging.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon;
-
-public class Logging {
- public static final String LOG_TAG = "Email";
-
- /**
- * Set this to 'true' to enable as much Email logging as possible.
- */
- public static final boolean LOGD;
-
- /**
- * If this is enabled then logging that normally hides sensitive information
- * like passwords will show that information.
- */
- public static final boolean DEBUG_SENSITIVE;
-
- /**
- * If true, logging regarding UI (such as activity/fragment lifecycle) will be enabled.
- *
- * TODO rename it to DEBUG_UI.
- */
- public static final boolean DEBUG_LIFECYCLE;
-
- static {
- // Declare values here to avoid dead code warnings; it means we have some extra
- // "if" statements in the byte code that always evaluate to "if (false)"
- LOGD = false; // DO NOT CHECK IN WITH TRUE
- DEBUG_SENSITIVE = false; // DO NOT CHECK IN WITH TRUE
- DEBUG_LIFECYCLE = false; // DO NOT CHECK IN WITH TRUE
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/TempDirectory.java b/email2/emailcommon/src/com/android/emailcommon/TempDirectory.java
deleted file mode 100644
index 252488c9f..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/TempDirectory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon;
-
-import android.content.Context;
-
-import java.io.File;
-
-/**
- * TempDirectory caches the directory used for caching file. It is set up during application
- * initialization.
- */
-public class TempDirectory {
- private static File sTempDirectory = null;
-
- public static void setTempDirectory(Context context) {
- sTempDirectory = context.getCacheDir();
- }
-
- public static File getTempDirectory() {
- if (sTempDirectory == null) {
- throw new RuntimeException(
- "TempDirectory not set. " +
- "If in a unit test, call Email.setTempDirectory(context) in setUp().");
- }
- return sTempDirectory;
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/TrafficFlags.java b/email2/emailcommon/src/com/android/emailcommon/TrafficFlags.java
deleted file mode 100644
index 6b858c4c2..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/TrafficFlags.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon;
-
-import android.content.Context;
-
-import com.android.emailcommon.provider.Account;
-
-/**
- * Constants for tagging threads for traffic stats, and associated utilities
- *
- * Example usage:
- * TrafficStats.setThreadStatsTag(accountId | DATA_EMAIL | REASON_SYNC);
- */
-public class TrafficFlags {
- // Bits 0->15, account id
- private static final int ACCOUNT_MASK = 0x0000FFFF;
-
- // Bits 18&19, type (0 = EMAIL)
- private static final int DATA_SHIFT = 18;
- private static final int DATA_MASK = 3 << DATA_SHIFT;
- public static final int DATA_EMAIL = 0 << DATA_SHIFT;
- public static final int DATA_CONTACTS = 1 << DATA_SHIFT;
- public static final int DATA_CALENDAR = 2 << DATA_SHIFT;
-
- // Bits 20&21, reason (if protocol != SMTP)
- private static final int REASON_SHIFT = 20;
- private static final int REASON_MASK = 3 << REASON_SHIFT;
- public static final int REASON_SYNC = 0 << REASON_SHIFT;
- public static final int REASON_ATTACHMENT_USER = 1 << REASON_SHIFT;
- // Note: We don't yet use the PRECACHE reason (it's complicated...)
- public static final int REASON_ATTACHMENT_PRECACHE = 2 << REASON_SHIFT;
- private static final String[] REASONS = new String[] {"sync", "attachment", "precache"};
-
- /**
- * Get flags indicating sync of the passed-in account; note that, by default, these flags
- * indicate an email sync; to change the type of sync, simply "or" in DATA_CONTACTS or
- * DATA_CALENDAR (since DATA_EMAIL = 0)
- *
- * @param context the caller's context
- * @param account the account being used
- * @return flags for syncing this account
- */
- public static int getSyncFlags(Context context, Account account) {
- return (int)account.mId | REASON_SYNC;
- }
-
- /**
- * Get flags indicating attachment loading from the passed-in account
- *
- * @param context the caller's context
- * @param account the account being used
- * @return flags for loading an attachment in this account
- */
- public static int getAttachmentFlags(Context context, Account account) {
- return (int)account.mId | REASON_ATTACHMENT_USER;
- }
-
- /**
- * Get flags indicating sending SMTP email from the passed-in account
- *
- * @param context the caller's context
- * @param account the account being used
- * @return flags for sending SMTP email from this account
- */
- public static int getSmtpFlags(Context context, Account account) {
- return (int)account.mId | REASON_SYNC;
- }
-
- public static String toString(int flags) {
- StringBuilder sb = new StringBuilder();
- sb.append("account ");
- sb.append(flags & ACCOUNT_MASK);
- sb.append(',');
- sb.append(REASONS[(flags & REASON_MASK) >> REASON_SHIFT]);
- int maskedData = flags & DATA_MASK;
- if (maskedData != 0) {
- sb.append(',');
- sb.append(maskedData == DATA_CALENDAR ? "calendar" : "contacts");
- }
- return sb.toString();
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/internet/BinaryTempFileBody.java b/email2/emailcommon/src/com/android/emailcommon/internet/BinaryTempFileBody.java
deleted file mode 100644
index f0821edd4..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/internet/BinaryTempFileBody.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.internet;
-
-import com.android.emailcommon.TempDirectory;
-import com.android.emailcommon.mail.Body;
-import com.android.emailcommon.mail.MessagingException;
-
-import org.apache.commons.io.IOUtils;
-
-import android.util.Base64;
-import android.util.Base64OutputStream;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * A Body that is backed by a temp file. The Body exposes a getOutputStream method that allows
- * the user to write to the temp file. After the write the body is available via getInputStream
- * and writeTo one time. After writeTo is called, or the InputStream returned from
- * getInputStream is closed the file is deleted and the Body should be considered disposed of.
- */
-public class BinaryTempFileBody implements Body {
- private File mFile;
-
- /**
- * An alternate way to put data into a BinaryTempFileBody is to simply supply an already-
- * created file. Note that this file will be deleted after it is read.
- * @param filePath The file containing the data to be stored on disk temporarily
- */
- public void setFile(String filePath) {
- mFile = new File(filePath);
- }
-
- public OutputStream getOutputStream() throws IOException {
- mFile = File.createTempFile("body", null, TempDirectory.getTempDirectory());
- mFile.deleteOnExit();
- return new FileOutputStream(mFile);
- }
-
- public InputStream getInputStream() throws MessagingException {
- try {
- return new BinaryTempFileBodyInputStream(new FileInputStream(mFile));
- }
- catch (IOException ioe) {
- throw new MessagingException("Unable to open body", ioe);
- }
- }
-
- public void writeTo(OutputStream out) throws IOException, MessagingException {
- InputStream in = getInputStream();
- Base64OutputStream base64Out = new Base64OutputStream(
- out, Base64.CRLF | Base64.NO_CLOSE);
- IOUtils.copy(in, base64Out);
- base64Out.close();
- mFile.delete();
- }
-
- class BinaryTempFileBodyInputStream extends FilterInputStream {
- public BinaryTempFileBodyInputStream(InputStream in) {
- super(in);
- }
-
- @Override
- public void close() throws IOException {
- super.close();
- mFile.delete();
- }
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/internet/MimeBodyPart.java b/email2/emailcommon/src/com/android/emailcommon/internet/MimeBodyPart.java
deleted file mode 100644
index 01efd554f..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/internet/MimeBodyPart.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.internet;
-
-import com.android.emailcommon.mail.Body;
-import com.android.emailcommon.mail.BodyPart;
-import com.android.emailcommon.mail.MessagingException;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.util.regex.Pattern;
-
-/**
- * TODO this is a close approximation of Message, need to update along with
- * Message.
- */
-public class MimeBodyPart extends BodyPart {
- protected MimeHeader mHeader = new MimeHeader();
- protected MimeHeader mExtendedHeader;
- protected Body mBody;
- protected int mSize;
-
- // regex that matches content id surrounded by "<>" optionally.
- private static final Pattern REMOVE_OPTIONAL_BRACKETS = Pattern.compile("^<?([^>]+)>?$");
- // regex that matches end of line.
- private static final Pattern END_OF_LINE = Pattern.compile("\r?\n");
-
- public MimeBodyPart() throws MessagingException {
- this(null);
- }
-
- public MimeBodyPart(Body body) throws MessagingException {
- this(body, null);
- }
-
- public MimeBodyPart(Body body, String mimeType) throws MessagingException {
- if (mimeType != null) {
- setHeader(MimeHeader.HEADER_CONTENT_TYPE, mimeType);
- }
- setBody(body);
- }
-
- protected String getFirstHeader(String name) throws MessagingException {
- return mHeader.getFirstHeader(name);
- }
-
- public void addHeader(String name, String value) throws MessagingException {
- mHeader.addHeader(name, value);
- }
-
- public void setHeader(String name, String value) throws MessagingException {
- mHeader.setHeader(name, value);
- }
-
- public String[] getHeader(String name) throws MessagingException {
- return mHeader.getHeader(name);
- }
-
- public void removeHeader(String name) throws MessagingException {
- mHeader.removeHeader(name);
- }
-
- public Body getBody() throws MessagingException {
- return mBody;
- }
-
- public void setBody(Body body) throws MessagingException {
- this.mBody = body;
- if (body instanceof com.android.emailcommon.mail.Multipart) {
- com.android.emailcommon.mail.Multipart multipart =
- ((com.android.emailcommon.mail.Multipart)body);
- multipart.setParent(this);
- setHeader(MimeHeader.HEADER_CONTENT_TYPE, multipart.getContentType());
- }
- else if (body instanceof TextBody) {
- String contentType = String.format("%s;\n charset=utf-8", getMimeType());
- String name = MimeUtility.getHeaderParameter(getContentType(), "name");
- if (name != null) {
- contentType += String.format(";\n name=\"%s\"", name);
- }
- setHeader(MimeHeader.HEADER_CONTENT_TYPE, contentType);
- setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64");
- }
- }
-
- public String getContentType() throws MessagingException {
- String contentType = getFirstHeader(MimeHeader.HEADER_CONTENT_TYPE);
- if (contentType == null) {
- return "text/plain";
- } else {
- return contentType;
- }
- }
-
- public String getDisposition() throws MessagingException {
- String contentDisposition = getFirstHeader(MimeHeader.HEADER_CONTENT_DISPOSITION);
- if (contentDisposition == null) {
- return null;
- } else {
- return contentDisposition;
- }
- }
-
- public String getContentId() throws MessagingException {
- String contentId = getFirstHeader(MimeHeader.HEADER_CONTENT_ID);
- if (contentId == null) {
- return null;
- } else {
- // remove optionally surrounding brackets.
- return REMOVE_OPTIONAL_BRACKETS.matcher(contentId).replaceAll("$1");
- }
- }
-
- public String getMimeType() throws MessagingException {
- return MimeUtility.getHeaderParameter(getContentType(), null);
- }
-
- public boolean isMimeType(String mimeType) throws MessagingException {
- return getMimeType().equals(mimeType);
- }
-
- public void setSize(int size) {
- this.mSize = size;
- }
-
- public int getSize() throws MessagingException {
- return mSize;
- }
-
- /**
- * Set extended header
- *
- * @param name Extended header name
- * @param value header value - flattened by removing CR-NL if any
- * remove header if value is null
- * @throws MessagingException
- */
- public void setExtendedHeader(String name, String value) throws MessagingException {
- if (value == null) {
- if (mExtendedHeader != null) {
- mExtendedHeader.removeHeader(name);
- }
- return;
- }
- if (mExtendedHeader == null) {
- mExtendedHeader = new MimeHeader();
- }
- mExtendedHeader.setHeader(name, END_OF_LINE.matcher(value).replaceAll(""));
- }
-
- /**
- * Get extended header
- *
- * @param name Extended header name
- * @return header value - null if header does not exist
- * @throws MessagingException
- */
- public String getExtendedHeader(String name) throws MessagingException {
- if (mExtendedHeader == null) {
- return null;
- }
- return mExtendedHeader.getFirstHeader(name);
- }
-
- /**
- * Write the MimeMessage out in MIME format.
- */
- public void writeTo(OutputStream out) throws IOException, MessagingException {
- BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out), 1024);
- mHeader.writeTo(out);
- writer.write("\r\n");
- writer.flush();
- if (mBody != null) {
- mBody.writeTo(out);
- }
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/internet/MimeHeader.java b/email2/emailcommon/src/com/android/emailcommon/internet/MimeHeader.java
deleted file mode 100644
index b0ad7772e..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/internet/MimeHeader.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.internet;
-
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.utility.Utility;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-
-public class MimeHeader {
- /**
- * Application specific header that contains Store specific information about an attachment.
- * In IMAP this contains the IMAP BODYSTRUCTURE part id so that the ImapStore can later
- * retrieve the attachment at will from the server.
- * The info is recorded from this header on LocalStore.appendMessages and is put back
- * into the MIME data by LocalStore.fetch.
- */
- public static final String HEADER_ANDROID_ATTACHMENT_STORE_DATA = "X-Android-Attachment-StoreData";
- /**
- * Application specific header that is used to tag body parts for quoted/forwarded messages.
- */
- public static final String HEADER_ANDROID_BODY_QUOTED_PART = "X-Android-Body-Quoted-Part";
-
- public static final String HEADER_CONTENT_TYPE = "Content-Type";
- public static final String HEADER_CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding";
- public static final String HEADER_CONTENT_DISPOSITION = "Content-Disposition";
- public static final String HEADER_CONTENT_ID = "Content-ID";
-
- /**
- * Fields that should be omitted when writing the header using writeTo()
- */
- private static final String[] WRITE_OMIT_FIELDS = {
-// HEADER_ANDROID_ATTACHMENT_DOWNLOADED,
-// HEADER_ANDROID_ATTACHMENT_ID,
- HEADER_ANDROID_ATTACHMENT_STORE_DATA
- };
-
- protected final ArrayList<Field> mFields = new ArrayList<Field>();
-
- public void clear() {
- mFields.clear();
- }
-
- public String getFirstHeader(String name) throws MessagingException {
- String[] header = getHeader(name);
- if (header == null) {
- return null;
- }
- return header[0];
- }
-
- public void addHeader(String name, String value) throws MessagingException {
- mFields.add(new Field(name, value));
- }
-
- public void setHeader(String name, String value) throws MessagingException {
- if (name == null || value == null) {
- return;
- }
- removeHeader(name);
- addHeader(name, value);
- }
-
- public String[] getHeader(String name) throws MessagingException {
- ArrayList<String> values = new ArrayList<String>();
- for (Field field : mFields) {
- if (field.name.equalsIgnoreCase(name)) {
- values.add(field.value);
- }
- }
- if (values.size() == 0) {
- return null;
- }
- return values.toArray(new String[] {});
- }
-
- public void removeHeader(String name) throws MessagingException {
- ArrayList<Field> removeFields = new ArrayList<Field>();
- for (Field field : mFields) {
- if (field.name.equalsIgnoreCase(name)) {
- removeFields.add(field);
- }
- }
- mFields.removeAll(removeFields);
- }
-
- /**
- * Write header into String
- *
- * @return CR-NL separated header string except the headers in writeOmitFields
- * null if header is empty
- */
- public String writeToString() {
- if (mFields.size() == 0) {
- return null;
- }
- StringBuilder builder = new StringBuilder();
- for (Field field : mFields) {
- if (!Utility.arrayContains(WRITE_OMIT_FIELDS, field.name)) {
- builder.append(field.name + ": " + field.value + "\r\n");
- }
- }
- return builder.toString();
- }
-
- public void writeTo(OutputStream out) throws IOException, MessagingException {
- BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out), 1024);
- for (Field field : mFields) {
- if (!Utility.arrayContains(WRITE_OMIT_FIELDS, field.name)) {
- writer.write(field.name + ": " + field.value + "\r\n");
- }
- }
- writer.flush();
- }
-
- private static class Field {
- final String name;
- final String value;
-
- public Field(String name, String value) {
- this.name = name;
- this.value = value;
- }
-
- @Override
- public String toString() {
- return name + "=" + value;
- }
- }
-
- @Override
- public String toString() {
- return (mFields == null) ? null : mFields.toString();
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/internet/MimeMessage.java b/email2/emailcommon/src/com/android/emailcommon/internet/MimeMessage.java
deleted file mode 100644
index 412092da4..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/internet/MimeMessage.java
+++ /dev/null
@@ -1,626 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.internet;
-
-import com.android.emailcommon.mail.Address;
-import com.android.emailcommon.mail.Body;
-import com.android.emailcommon.mail.BodyPart;
-import com.android.emailcommon.mail.Message;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.mail.Multipart;
-import com.android.emailcommon.mail.Part;
-
-import org.apache.james.mime4j.BodyDescriptor;
-import org.apache.james.mime4j.ContentHandler;
-import org.apache.james.mime4j.EOLConvertingInputStream;
-import org.apache.james.mime4j.MimeStreamParser;
-import org.apache.james.mime4j.field.DateTimeField;
-import org.apache.james.mime4j.field.Field;
-
-import android.text.TextUtils;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-import java.util.Stack;
-import java.util.regex.Pattern;
-
-/**
- * An implementation of Message that stores all of its metadata in RFC 822 and
- * RFC 2045 style headers.
- *
- * NOTE: Automatic generation of a local message-id is becoming unwieldy and should be removed.
- * It would be better to simply do it explicitly on local creation of new outgoing messages.
- */
-public class MimeMessage extends Message {
- private MimeHeader mHeader;
- private MimeHeader mExtendedHeader;
-
- // NOTE: The fields here are transcribed out of headers, and values stored here will supercede
- // the values found in the headers. Use caution to prevent any out-of-phase errors. In
- // particular, any adds/changes/deletes here must be echoed by changes in the parse() function.
- private Address[] mFrom;
- private Address[] mTo;
- private Address[] mCc;
- private Address[] mBcc;
- private Address[] mReplyTo;
- private Date mSentDate;
- private Body mBody;
- protected int mSize;
- private boolean mInhibitLocalMessageId = false;
-
- // Shared random source for generating local message-id values
- private static final java.util.Random sRandom = new java.util.Random();
-
- // In MIME, en_US-like date format should be used. In other words "MMM" should be encoded to
- // "Jan", not the other localized format like "Ene" (meaning January in locale es).
- // This conversion is used when generating outgoing MIME messages. Incoming MIME date
- // headers are parsed by org.apache.james.mime4j.field.DateTimeField which does not have any
- // localization code.
- private static final SimpleDateFormat DATE_FORMAT =
- new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
-
- // regex that matches content id surrounded by "<>" optionally.
- private static final Pattern REMOVE_OPTIONAL_BRACKETS = Pattern.compile("^<?([^>]+)>?$");
- // regex that matches end of line.
- private static final Pattern END_OF_LINE = Pattern.compile("\r?\n");
-
- public MimeMessage() {
- mHeader = null;
- }
-
- /**
- * Generate a local message id. This is only used when none has been assigned, and is
- * installed lazily. Any remote (typically server-assigned) message id takes precedence.
- * @return a long, locally-generated message-ID value
- */
- private String generateMessageId() {
- StringBuffer sb = new StringBuffer();
- sb.append("<");
- for (int i = 0; i < 24; i++) {
- // We'll use a 5-bit range (0..31)
- int value = sRandom.nextInt() & 31;
- char c = "0123456789abcdefghijklmnopqrstuv".charAt(value);
- sb.append(c);
- }
- sb.append(".");
- sb.append(Long.toString(System.currentTimeMillis()));
- sb.append("@email.android.com>");
- return sb.toString();
- }
-
- /**
- * Parse the given InputStream using Apache Mime4J to build a MimeMessage.
- *
- * @param in
- * @throws IOException
- * @throws MessagingException
- */
- public MimeMessage(InputStream in) throws IOException, MessagingException {
- parse(in);
- }
-
- protected void parse(InputStream in) throws IOException, MessagingException {
- // Before parsing the input stream, clear all local fields that may be superceded by
- // the new incoming message.
- getMimeHeaders().clear();
- mInhibitLocalMessageId = true;
- mFrom = null;
- mTo = null;
- mCc = null;
- mBcc = null;
- mReplyTo = null;
- mSentDate = null;
- mBody = null;
-
- MimeStreamParser parser = new MimeStreamParser();
- parser.setContentHandler(new MimeMessageBuilder());
- parser.parse(new EOLConvertingInputStream(in));
- }
-
- /**
- * Return the internal mHeader value, with very lazy initialization.
- * The goal is to save memory by not creating the headers until needed.
- */
- private MimeHeader getMimeHeaders() {
- if (mHeader == null) {
- mHeader = new MimeHeader();
- }
- return mHeader;
- }
-
- @Override
- public Date getReceivedDate() throws MessagingException {
- return null;
- }
-
- @Override
- public Date getSentDate() throws MessagingException {
- if (mSentDate == null) {
- try {
- DateTimeField field = (DateTimeField)Field.parse("Date: "
- + MimeUtility.unfoldAndDecode(getFirstHeader("Date")));
- mSentDate = field.getDate();
- } catch (Exception e) {
-
- }
- }
- return mSentDate;
- }
-
- @Override
- public void setSentDate(Date sentDate) throws MessagingException {
- setHeader("Date", DATE_FORMAT.format(sentDate));
- this.mSentDate = sentDate;
- }
-
- @Override
- public String getContentType() throws MessagingException {
- String contentType = getFirstHeader(MimeHeader.HEADER_CONTENT_TYPE);
- if (contentType == null) {
- return "text/plain";
- } else {
- return contentType;
- }
- }
-
- public String getDisposition() throws MessagingException {
- String contentDisposition = getFirstHeader(MimeHeader.HEADER_CONTENT_DISPOSITION);
- if (contentDisposition == null) {
- return null;
- } else {
- return contentDisposition;
- }
- }
-
- public String getContentId() throws MessagingException {
- String contentId = getFirstHeader(MimeHeader.HEADER_CONTENT_ID);
- if (contentId == null) {
- return null;
- } else {
- // remove optionally surrounding brackets.
- return REMOVE_OPTIONAL_BRACKETS.matcher(contentId).replaceAll("$1");
- }
- }
-
- public String getMimeType() throws MessagingException {
- return MimeUtility.getHeaderParameter(getContentType(), null);
- }
-
- public int getSize() throws MessagingException {
- return mSize;
- }
-
- /**
- * Returns a list of the given recipient type from this message. If no addresses are
- * found the method returns an empty array.
- */
- @Override
- public Address[] getRecipients(RecipientType type) throws MessagingException {
- if (type == RecipientType.TO) {
- if (mTo == null) {
- mTo = Address.parse(MimeUtility.unfold(getFirstHeader("To")));
- }
- return mTo;
- } else if (type == RecipientType.CC) {
- if (mCc == null) {
- mCc = Address.parse(MimeUtility.unfold(getFirstHeader("CC")));
- }
- return mCc;
- } else if (type == RecipientType.BCC) {
- if (mBcc == null) {
- mBcc = Address.parse(MimeUtility.unfold(getFirstHeader("BCC")));
- }
- return mBcc;
- } else {
- throw new MessagingException("Unrecognized recipient type.");
- }
- }
-
- @Override
- public void setRecipients(RecipientType type, Address[] addresses) throws MessagingException {
- final int TO_LENGTH = 4; // "To: "
- final int CC_LENGTH = 4; // "Cc: "
- final int BCC_LENGTH = 5; // "Bcc: "
- if (type == RecipientType.TO) {
- if (addresses == null || addresses.length == 0) {
- removeHeader("To");
- this.mTo = null;
- } else {
- setHeader("To", MimeUtility.fold(Address.toHeader(addresses), TO_LENGTH));
- this.mTo = addresses;
- }
- } else if (type == RecipientType.CC) {
- if (addresses == null || addresses.length == 0) {
- removeHeader("CC");
- this.mCc = null;
- } else {
- setHeader("CC", MimeUtility.fold(Address.toHeader(addresses), CC_LENGTH));
- this.mCc = addresses;
- }
- } else if (type == RecipientType.BCC) {
- if (addresses == null || addresses.length == 0) {
- removeHeader("BCC");
- this.mBcc = null;
- } else {
- setHeader("BCC", MimeUtility.fold(Address.toHeader(addresses), BCC_LENGTH));
- this.mBcc = addresses;
- }
- } else {
- throw new MessagingException("Unrecognized recipient type.");
- }
- }
-
- /**
- * Returns the unfolded, decoded value of the Subject header.
- */
- @Override
- public String getSubject() throws MessagingException {
- return MimeUtility.unfoldAndDecode(getFirstHeader("Subject"));
- }
-
- @Override
- public void setSubject(String subject) throws MessagingException {
- final int HEADER_NAME_LENGTH = 9; // "Subject: "
- setHeader("Subject", MimeUtility.foldAndEncode2(subject, HEADER_NAME_LENGTH));
- }
-
- @Override
- public Address[] getFrom() throws MessagingException {
- if (mFrom == null) {
- String list = MimeUtility.unfold(getFirstHeader("From"));
- if (list == null || list.length() == 0) {
- list = MimeUtility.unfold(getFirstHeader("Sender"));
- }
- mFrom = Address.parse(list);
- }
- return mFrom;
- }
-
- @Override
- public void setFrom(Address from) throws MessagingException {
- final int FROM_LENGTH = 6; // "From: "
- if (from != null) {
- setHeader("From", MimeUtility.fold(from.toHeader(), FROM_LENGTH));
- this.mFrom = new Address[] {
- from
- };
- } else {
- this.mFrom = null;
- }
- }
-
- @Override
- public Address[] getReplyTo() throws MessagingException {
- if (mReplyTo == null) {
- mReplyTo = Address.parse(MimeUtility.unfold(getFirstHeader("Reply-to")));
- }
- return mReplyTo;
- }
-
- @Override
- public void setReplyTo(Address[] replyTo) throws MessagingException {
- final int REPLY_TO_LENGTH = 10; // "Reply-to: "
- if (replyTo == null || replyTo.length == 0) {
- removeHeader("Reply-to");
- mReplyTo = null;
- } else {
- setHeader("Reply-to", MimeUtility.fold(Address.toHeader(replyTo), REPLY_TO_LENGTH));
- mReplyTo = replyTo;
- }
- }
-
- /**
- * Set the mime "Message-ID" header
- * @param messageId the new Message-ID value
- * @throws MessagingException
- */
- @Override
- public void setMessageId(String messageId) throws MessagingException {
- setHeader("Message-ID", messageId);
- }
-
- /**
- * Get the mime "Message-ID" header. This value will be preloaded with a locally-generated
- * random ID, if the value has not previously been set. Local generation can be inhibited/
- * overridden by explicitly clearing the headers, removing the message-id header, etc.
- * @return the Message-ID header string, or null if explicitly has been set to null
- */
- @Override
- public String getMessageId() throws MessagingException {
- String messageId = getFirstHeader("Message-ID");
- if (messageId == null && !mInhibitLocalMessageId) {
- messageId = generateMessageId();
- setMessageId(messageId);
- }
- return messageId;
- }
-
- @Override
- public void saveChanges() throws MessagingException {
- throw new MessagingException("saveChanges not yet implemented");
- }
-
- @Override
- public Body getBody() throws MessagingException {
- return mBody;
- }
-
- @Override
- public void setBody(Body body) throws MessagingException {
- this.mBody = body;
- if (body instanceof Multipart) {
- Multipart multipart = ((Multipart)body);
- multipart.setParent(this);
- setHeader(MimeHeader.HEADER_CONTENT_TYPE, multipart.getContentType());
- setHeader("MIME-Version", "1.0");
- }
- else if (body instanceof TextBody) {
- setHeader(MimeHeader.HEADER_CONTENT_TYPE, String.format("%s;\n charset=utf-8",
- getMimeType()));
- setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64");
- }
- }
-
- protected String getFirstHeader(String name) throws MessagingException {
- return getMimeHeaders().getFirstHeader(name);
- }
-
- @Override
- public void addHeader(String name, String value) throws MessagingException {
- getMimeHeaders().addHeader(name, value);
- }
-
- @Override
- public void setHeader(String name, String value) throws MessagingException {
- getMimeHeaders().setHeader(name, value);
- }
-
- @Override
- public String[] getHeader(String name) throws MessagingException {
- return getMimeHeaders().getHeader(name);
- }
-
- @Override
- public void removeHeader(String name) throws MessagingException {
- getMimeHeaders().removeHeader(name);
- if ("Message-ID".equalsIgnoreCase(name)) {
- mInhibitLocalMessageId = true;
- }
- }
-
- /**
- * Set extended header
- *
- * @param name Extended header name
- * @param value header value - flattened by removing CR-NL if any
- * remove header if value is null
- * @throws MessagingException
- */
- public void setExtendedHeader(String name, String value) throws MessagingException {
- if (value == null) {
- if (mExtendedHeader != null) {
- mExtendedHeader.removeHeader(name);
- }
- return;
- }
- if (mExtendedHeader == null) {
- mExtendedHeader = new MimeHeader();
- }
- mExtendedHeader.setHeader(name, END_OF_LINE.matcher(value).replaceAll(""));
- }
-
- /**
- * Get extended header
- *
- * @param name Extended header name
- * @return header value - null if header does not exist
- * @throws MessagingException
- */
- public String getExtendedHeader(String name) throws MessagingException {
- if (mExtendedHeader == null) {
- return null;
- }
- return mExtendedHeader.getFirstHeader(name);
- }
-
- /**
- * Set entire extended headers from String
- *
- * @param headers Extended header and its value - "CR-NL-separated pairs
- * if null or empty, remove entire extended headers
- * @throws MessagingException
- */
- public void setExtendedHeaders(String headers) throws MessagingException {
- if (TextUtils.isEmpty(headers)) {
- mExtendedHeader = null;
- } else {
- mExtendedHeader = new MimeHeader();
- for (String header : END_OF_LINE.split(headers)) {
- String[] tokens = header.split(":", 2);
- if (tokens.length != 2) {
- throw new MessagingException("Illegal extended headers: " + headers);
- }
- mExtendedHeader.setHeader(tokens[0].trim(), tokens[1].trim());
- }
- }
- }
-
- /**
- * Get entire extended headers as String
- *
- * @return "CR-NL-separated extended headers - null if extended header does not exist
- */
- public String getExtendedHeaders() {
- if (mExtendedHeader != null) {
- return mExtendedHeader.writeToString();
- }
- return null;
- }
-
- /**
- * Write message header and body to output stream
- *
- * @param out Output steam to write message header and body.
- */
- public void writeTo(OutputStream out) throws IOException, MessagingException {
- BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out), 1024);
- // Force creation of local message-id
- getMessageId();
- getMimeHeaders().writeTo(out);
- // mExtendedHeader will not be write out to external output stream,
- // because it is intended to internal use.
- writer.write("\r\n");
- writer.flush();
- if (mBody != null) {
- mBody.writeTo(out);
- }
- }
-
- public InputStream getInputStream() throws MessagingException {
- return null;
- }
-
- class MimeMessageBuilder implements ContentHandler {
- private Stack<Object> stack = new Stack<Object>();
-
- public MimeMessageBuilder() {
- }
-
- private void expect(Class c) {
- if (!c.isInstance(stack.peek())) {
- throw new IllegalStateException("Internal stack error: " + "Expected '"
- + c.getName() + "' found '" + stack.peek().getClass().getName() + "'");
- }
- }
-
- public void startMessage() {
- if (stack.isEmpty()) {
- stack.push(MimeMessage.this);
- } else {
- expect(Part.class);
- try {
- MimeMessage m = new MimeMessage();
- ((Part)stack.peek()).setBody(m);
- stack.push(m);
- } catch (MessagingException me) {
- throw new Error(me);
- }
- }
- }
-
- public void endMessage() {
- expect(MimeMessage.class);
- stack.pop();
- }
-
- public void startHeader() {
- expect(Part.class);
- }
-
- public void field(String fieldData) {
- expect(Part.class);
- try {
- String[] tokens = fieldData.split(":", 2);
- ((Part)stack.peek()).addHeader(tokens[0], tokens[1].trim());
- } catch (MessagingException me) {
- throw new Error(me);
- }
- }
-
- public void endHeader() {
- expect(Part.class);
- }
-
- public void startMultipart(BodyDescriptor bd) {
- expect(Part.class);
-
- Part e = (Part)stack.peek();
- try {
- MimeMultipart multiPart = new MimeMultipart(e.getContentType());
- e.setBody(multiPart);
- stack.push(multiPart);
- } catch (MessagingException me) {
- throw new Error(me);
- }
- }
-
- public void body(BodyDescriptor bd, InputStream in) throws IOException {
- expect(Part.class);
- Body body = MimeUtility.decodeBody(in, bd.getTransferEncoding());
- try {
- ((Part)stack.peek()).setBody(body);
- } catch (MessagingException me) {
- throw new Error(me);
- }
- }
-
- public void endMultipart() {
- stack.pop();
- }
-
- public void startBodyPart() {
- expect(MimeMultipart.class);
-
- try {
- MimeBodyPart bodyPart = new MimeBodyPart();
- ((MimeMultipart)stack.peek()).addBodyPart(bodyPart);
- stack.push(bodyPart);
- } catch (MessagingException me) {
- throw new Error(me);
- }
- }
-
- public void endBodyPart() {
- expect(BodyPart.class);
- stack.pop();
- }
-
- public void epilogue(InputStream is) throws IOException {
- expect(MimeMultipart.class);
- StringBuffer sb = new StringBuffer();
- int b;
- while ((b = is.read()) != -1) {
- sb.append((char)b);
- }
- // ((Multipart) stack.peek()).setEpilogue(sb.toString());
- }
-
- public void preamble(InputStream is) throws IOException {
- expect(MimeMultipart.class);
- StringBuffer sb = new StringBuffer();
- int b;
- while ((b = is.read()) != -1) {
- sb.append((char)b);
- }
- try {
- ((MimeMultipart)stack.peek()).setPreamble(sb.toString());
- } catch (MessagingException me) {
- throw new Error(me);
- }
- }
-
- public void raw(InputStream is) throws IOException {
- throw new UnsupportedOperationException("Not supported");
- }
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/internet/MimeMultipart.java b/email2/emailcommon/src/com/android/emailcommon/internet/MimeMultipart.java
deleted file mode 100644
index e6977ee4f..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/internet/MimeMultipart.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.internet;
-
-import com.android.emailcommon.mail.BodyPart;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.mail.Multipart;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-
-public class MimeMultipart extends Multipart {
- protected String mPreamble;
-
- protected String mContentType;
-
- protected String mBoundary;
-
- protected String mSubType;
-
- public MimeMultipart() throws MessagingException {
- mBoundary = generateBoundary();
- setSubType("mixed");
- }
-
- public MimeMultipart(String contentType) throws MessagingException {
- this.mContentType = contentType;
- try {
- mSubType = MimeUtility.getHeaderParameter(contentType, null).split("/")[1];
- mBoundary = MimeUtility.getHeaderParameter(contentType, "boundary");
- if (mBoundary == null) {
- throw new MessagingException("MultiPart does not contain boundary: " + contentType);
- }
- } catch (Exception e) {
- throw new MessagingException(
- "Invalid MultiPart Content-Type; must contain subtype and boundary. ("
- + contentType + ")", e);
- }
- }
-
- public String generateBoundary() {
- StringBuffer sb = new StringBuffer();
- sb.append("----");
- for (int i = 0; i < 30; i++) {
- sb.append(Integer.toString((int)(Math.random() * 35), 36));
- }
- return sb.toString().toUpperCase();
- }
-
- public String getPreamble() throws MessagingException {
- return mPreamble;
- }
-
- public void setPreamble(String preamble) throws MessagingException {
- this.mPreamble = preamble;
- }
-
- @Override
- public String getContentType() throws MessagingException {
- return mContentType;
- }
-
- public void setSubType(String subType) throws MessagingException {
- this.mSubType = subType;
- mContentType = String.format("multipart/%s; boundary=\"%s\"", subType, mBoundary);
- }
-
- public void writeTo(OutputStream out) throws IOException, MessagingException {
- BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out), 1024);
-
- if (mPreamble != null) {
- writer.write(mPreamble + "\r\n");
- }
-
- for (int i = 0, count = mParts.size(); i < count; i++) {
- BodyPart bodyPart = mParts.get(i);
- writer.write("--" + mBoundary + "\r\n");
- writer.flush();
- bodyPart.writeTo(out);
- writer.write("\r\n");
- }
-
- writer.write("--" + mBoundary + "--\r\n");
- writer.flush();
- }
-
- public InputStream getInputStream() throws MessagingException {
- return null;
- }
-
- public String getSubTypeForTest() {
- return mSubType;
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/internet/MimeUtility.java b/email2/emailcommon/src/com/android/emailcommon/internet/MimeUtility.java
deleted file mode 100644
index b96e01e59..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/internet/MimeUtility.java
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.internet;
-
-import android.text.TextUtils;
-import android.util.Base64;
-import android.util.Base64DataException;
-import android.util.Base64InputStream;
-import android.util.Log;
-
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.Body;
-import com.android.emailcommon.mail.BodyPart;
-import com.android.emailcommon.mail.Message;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.mail.Multipart;
-import com.android.emailcommon.mail.Part;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.james.mime4j.codec.EncoderUtil;
-import org.apache.james.mime4j.decoder.DecoderUtil;
-import org.apache.james.mime4j.decoder.QuotedPrintableInputStream;
-import org.apache.james.mime4j.util.CharsetUtil;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class MimeUtility {
-
- public static final String MIME_TYPE_RFC822 = "message/rfc822";
- private final static Pattern PATTERN_CR_OR_LF = Pattern.compile("\r|\n");
-
- /**
- * Replace sequences of CRLF+WSP with WSP. Tries to preserve original string
- * object whenever possible.
- */
- public static String unfold(String s) {
- if (s == null) {
- return null;
- }
- Matcher patternMatcher = PATTERN_CR_OR_LF.matcher(s);
- if (patternMatcher.find()) {
- patternMatcher.reset();
- s = patternMatcher.replaceAll("");
- }
- return s;
- }
-
- public static String decode(String s) {
- if (s == null) {
- return null;
- }
- return DecoderUtil.decodeEncodedWords(s);
- }
-
- public static String unfoldAndDecode(String s) {
- return decode(unfold(s));
- }
-
- // TODO implement proper foldAndEncode
- // NOTE: When this really works, we *must* remove all calls to foldAndEncode2() to prevent
- // duplication of encoding.
- public static String foldAndEncode(String s) {
- return s;
- }
-
- /**
- * INTERIM version of foldAndEncode that will be used only by Subject: headers.
- * This is safer than implementing foldAndEncode() (see above) and risking unknown damage
- * to other headers.
- *
- * TODO: Copy this code to foldAndEncode(), get rid of this function, confirm all working OK.
- *
- * @param s original string to encode and fold
- * @param usedCharacters number of characters already used up by header name
-
- * @return the String ready to be transmitted
- */
- public static String foldAndEncode2(String s, int usedCharacters) {
- // james.mime4j.codec.EncoderUtil.java
- // encode: encodeIfNecessary(text, usage, numUsedInHeaderName)
- // Usage.TEXT_TOKENlooks like the right thing for subjects
- // use WORD_ENTITY for address/names
-
- String encoded = EncoderUtil.encodeIfNecessary(s, EncoderUtil.Usage.TEXT_TOKEN,
- usedCharacters);
-
- return fold(encoded, usedCharacters);
- }
-
- /**
- * INTERIM: From newer version of org.apache.james (but we don't want to import
- * the entire MimeUtil class).
- *
- * Splits the specified string into a multiple-line representation with
- * lines no longer than 76 characters (because the line might contain
- * encoded words; see <a href='http://www.faqs.org/rfcs/rfc2047.html'>RFC
- * 2047</a> section 2). If the string contains non-whitespace sequences
- * longer than 76 characters a line break is inserted at the whitespace
- * character following the sequence resulting in a line longer than 76
- * characters.
- *
- * @param s
- * string to split.
- * @param usedCharacters
- * number of characters already used up. Usually the number of
- * characters for header field name plus colon and one space.
- * @return a multiple-line representation of the given string.
- */
- public static String fold(String s, int usedCharacters) {
- final int maxCharacters = 76;
-
- final int length = s.length();
- if (usedCharacters + length <= maxCharacters)
- return s;
-
- StringBuilder sb = new StringBuilder();
-
- int lastLineBreak = -usedCharacters;
- int wspIdx = indexOfWsp(s, 0);
- while (true) {
- if (wspIdx == length) {
- sb.append(s.substring(Math.max(0, lastLineBreak)));
- return sb.toString();
- }
-
- int nextWspIdx = indexOfWsp(s, wspIdx + 1);
-
- if (nextWspIdx - lastLineBreak > maxCharacters) {
- sb.append(s.substring(Math.max(0, lastLineBreak), wspIdx));
- sb.append("\r\n");
- lastLineBreak = wspIdx;
- }
-
- wspIdx = nextWspIdx;
- }
- }
-
- /**
- * INTERIM: From newer version of org.apache.james (but we don't want to import
- * the entire MimeUtil class).
- *
- * Search for whitespace.
- */
- private static int indexOfWsp(String s, int fromIndex) {
- final int len = s.length();
- for (int index = fromIndex; index < len; index++) {
- char c = s.charAt(index);
- if (c == ' ' || c == '\t')
- return index;
- }
- return len;
- }
-
- /**
- * Returns the named parameter of a header field. If name is null the first
- * parameter is returned, or if there are no additional parameters in the
- * field the entire field is returned. Otherwise the named parameter is
- * searched for in a case insensitive fashion and returned. If the parameter
- * cannot be found the method returns null.
- *
- * TODO: quite inefficient with the inner trimming & splitting.
- * TODO: Also has a latent bug: uses "startsWith" to match the name, which can false-positive.
- * TODO: The doc says that for a null name you get the first param, but you get the header.
- * Should probably just fix the doc, but if other code assumes that behavior, fix the code.
- * TODO: Need to decode %-escaped strings, as in: filename="ab%22d".
- * ('+' -> ' ' conversion too? check RFC)
- *
- * @param header
- * @param name
- * @return the entire header (if name=null), the found parameter, or null
- */
- public static String getHeaderParameter(String header, String name) {
- if (header == null) {
- return null;
- }
- String[] parts = unfold(header).split(";");
- if (name == null) {
- return parts[0].trim();
- }
- String lowerCaseName = name.toLowerCase();
- for (String part : parts) {
- if (part.trim().toLowerCase().startsWith(lowerCaseName)) {
- String[] parameterParts = part.split("=", 2);
- if (parameterParts.length < 2) {
- return null;
- }
- String parameter = parameterParts[1].trim();
- if (parameter.startsWith("\"") && parameter.endsWith("\"")) {
- return parameter.substring(1, parameter.length() - 1);
- } else {
- return parameter;
- }
- }
- }
- return null;
- }
-
- public static Part findFirstPartByMimeType(Part part, String mimeType)
- throws MessagingException {
- if (part.getBody() instanceof Multipart) {
- Multipart multipart = (Multipart)part.getBody();
- for (int i = 0, count = multipart.getCount(); i < count; i++) {
- BodyPart bodyPart = multipart.getBodyPart(i);
- Part ret = findFirstPartByMimeType(bodyPart, mimeType);
- if (ret != null) {
- return ret;
- }
- }
- }
- else if (part.getMimeType().equalsIgnoreCase(mimeType)) {
- return part;
- }
- return null;
- }
-
- public static Part findPartByContentId(Part part, String contentId) throws Exception {
- if (part.getBody() instanceof Multipart) {
- Multipart multipart = (Multipart)part.getBody();
- for (int i = 0, count = multipart.getCount(); i < count; i++) {
- BodyPart bodyPart = multipart.getBodyPart(i);
- Part ret = findPartByContentId(bodyPart, contentId);
- if (ret != null) {
- return ret;
- }
- }
- }
- String cid = part.getContentId();
- if (contentId.equals(cid)) {
- return part;
- }
- return null;
- }
-
- /**
- * Reads the Part's body and returns a String based on any charset conversion that needed
- * to be done.
- * @param part The part containing a body
- * @return a String containing the converted text in the body, or null if there was no text
- * or an error during conversion.
- */
- public static String getTextFromPart(Part part) {
- try {
- if (part != null && part.getBody() != null) {
- InputStream in = part.getBody().getInputStream();
- String mimeType = part.getMimeType();
- if (mimeType != null && MimeUtility.mimeTypeMatches(mimeType, "text/*")) {
- /*
- * Now we read the part into a buffer for further processing. Because
- * the stream is now wrapped we'll remove any transfer encoding at this point.
- */
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- IOUtils.copy(in, out);
- in.close();
- in = null; // we want all of our memory back, and close might not release
-
- /*
- * We've got a text part, so let's see if it needs to be processed further.
- */
- String charset = getHeaderParameter(part.getContentType(), "charset");
- if (charset != null) {
- /*
- * See if there is conversion from the MIME charset to the Java one.
- */
- charset = CharsetUtil.toJavaCharset(charset);
- }
- /*
- * No encoding, so use us-ascii, which is the standard.
- */
- if (charset == null) {
- charset = "ASCII";
- }
- /*
- * Convert and return as new String
- */
- String result = out.toString(charset);
- out.close();
- return result;
- }
- }
-
- }
- catch (OutOfMemoryError oom) {
- /*
- * If we are not able to process the body there's nothing we can do about it. Return
- * null and let the upper layers handle the missing content.
- */
- Log.e(Logging.LOG_TAG, "Unable to getTextFromPart " + oom.toString());
- }
- catch (Exception e) {
- /*
- * If we are not able to process the body there's nothing we can do about it. Return
- * null and let the upper layers handle the missing content.
- */
- Log.e(Logging.LOG_TAG, "Unable to getTextFromPart " + e.toString());
- }
- return null;
- }
-
- /**
- * Returns true if the given mimeType matches the matchAgainst specification. The comparison
- * ignores case and the matchAgainst string may include "*" for a wildcard (e.g. "image/*").
- *
- * @param mimeType A MIME type to check.
- * @param matchAgainst A MIME type to check against. May include wildcards.
- * @return true if the mimeType matches
- */
- public static boolean mimeTypeMatches(String mimeType, String matchAgainst) {
- Pattern p = Pattern.compile(matchAgainst.replaceAll("\\*", "\\.\\*"),
- Pattern.CASE_INSENSITIVE);
- return p.matcher(mimeType).matches();
- }
-
- /**
- * Returns true if the given mimeType matches any of the matchAgainst specifications. The
- * comparison ignores case and the matchAgainst strings may include "*" for a wildcard
- * (e.g. "image/*").
- *
- * @param mimeType A MIME type to check.
- * @param matchAgainst An array of MIME types to check against. May include wildcards.
- * @return true if the mimeType matches any of the matchAgainst strings
- */
- public static boolean mimeTypeMatches(String mimeType, String[] matchAgainst) {
- for (String matchType : matchAgainst) {
- if (mimeTypeMatches(mimeType, matchType)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Given an input stream and a transfer encoding, return a wrapped input stream for that
- * encoding (or the original if none is required)
- * @param in the input stream
- * @param contentTransferEncoding the content transfer encoding
- * @return a properly wrapped stream
- */
- public static InputStream getInputStreamForContentTransferEncoding(InputStream in,
- String contentTransferEncoding) {
- if (contentTransferEncoding != null) {
- contentTransferEncoding =
- MimeUtility.getHeaderParameter(contentTransferEncoding, null);
- if ("quoted-printable".equalsIgnoreCase(contentTransferEncoding)) {
- in = new QuotedPrintableInputStream(in);
- }
- else if ("base64".equalsIgnoreCase(contentTransferEncoding)) {
- in = new Base64InputStream(in, Base64.DEFAULT);
- }
- }
- return in;
- }
-
- /**
- * Removes any content transfer encoding from the stream and returns a Body.
- */
- public static Body decodeBody(InputStream in, String contentTransferEncoding)
- throws IOException {
- /*
- * We'll remove any transfer encoding by wrapping the stream.
- */
- in = getInputStreamForContentTransferEncoding(in, contentTransferEncoding);
- BinaryTempFileBody tempBody = new BinaryTempFileBody();
- OutputStream out = tempBody.getOutputStream();
- try {
- IOUtils.copy(in, out);
- } catch (Base64DataException bde) {
- // TODO Need to fix this somehow
- //String warning = "\n\n" + Email.getMessageDecodeErrorString();
- //out.write(warning.getBytes());
- } finally {
- out.close();
- }
- return tempBody;
- }
-
- /**
- * Recursively scan a Part (usually a Message) and sort out which of its children will be
- * "viewable" and which will be attachments.
- *
- * @param part The part to be broken down
- * @param viewables This arraylist will be populated with all parts that appear to be
- * the "message" (e.g. text/plain & text/html)
- * @param attachments This arraylist will be populated with all parts that appear to be
- * attachments (including inlines)
- * @throws MessagingException
- */
- public static void collectParts(Part part, ArrayList<Part> viewables,
- ArrayList<Part> attachments) throws MessagingException {
- String disposition = part.getDisposition();
- String dispositionType = MimeUtility.getHeaderParameter(disposition, null);
- // If a disposition is not specified, default to "inline"
- boolean inline =
- TextUtils.isEmpty(dispositionType) || "inline".equalsIgnoreCase(dispositionType);
- // The lower-case mime type
- String mimeType = part.getMimeType().toLowerCase();
-
- if (part.getBody() instanceof Multipart) {
- // If the part is Multipart but not alternative it's either mixed or
- // something we don't know about, which means we treat it as mixed
- // per the spec. We just process its pieces recursively.
- MimeMultipart mp = (MimeMultipart)part.getBody();
- boolean foundHtml = false;
- if (mp.getSubTypeForTest().equals("alternative")) {
- for (int i = 0; i < mp.getCount(); i++) {
- if (mp.getBodyPart(i).isMimeType("text/html")) {
- foundHtml = true;
- break;
- }
- }
- }
- for (int i = 0; i < mp.getCount(); i++) {
- // See if we have text and html
- BodyPart bp = mp.getBodyPart(i);
- // If there's html, don't bother loading text
- if (foundHtml && bp.isMimeType("text/plain")) {
- continue;
- }
- collectParts(bp, viewables, attachments);
- }
- } else if (part.getBody() instanceof Message) {
- // If the part is an embedded message we just continue to process
- // it, pulling any viewables or attachments into the running list.
- Message message = (Message)part.getBody();
- collectParts(message, viewables, attachments);
- } else if (inline && (mimeType.startsWith("text") || (mimeType.startsWith("image")))) {
- // We'll treat text and images as viewables
- viewables.add(part);
- } else {
- // Everything else is an attachment.
- attachments.add(part);
- }
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/internet/Rfc822Output.java b/email2/emailcommon/src/com/android/emailcommon/internet/Rfc822Output.java
deleted file mode 100644
index a3167d6cb..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/internet/Rfc822Output.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.internet;
-
-import android.content.ContentUris;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.util.Base64;
-import android.util.Base64OutputStream;
-
-import com.android.emailcommon.mail.Address;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.Body;
-import com.android.emailcommon.provider.EmailContent.Message;
-
-import org.apache.commons.io.IOUtils;
-
-import java.io.BufferedOutputStream;
-import java.io.ByteArrayInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Utility class to output RFC 822 messages from provider email messages
- */
-public class Rfc822Output {
-
- // In MIME, en_US-like date format should be used. In other words "MMM" should be encoded to
- // "Jan", not the other localized format like "Ene" (meaning January in locale es).
- private static final SimpleDateFormat DATE_FORMAT =
- new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
-
- private static final String WHERE_NOT_SMART_FORWARD = "(" + Attachment.FLAGS + "&" +
- Attachment.FLAG_SMART_FORWARD + ")=0";
-
- /** A less-than-perfect pattern to pull out <body> content */
- private static final Pattern BODY_PATTERN = Pattern.compile(
- "(?:<\\s*body[^>]*>)(.*)(?:<\\s*/\\s*body\\s*>)",
- Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
- /** Match group in {@code BODDY_PATTERN} for the body HTML */
- private static final int BODY_PATTERN_GROUP = 1;
- /** Index of the plain text version of the message body */
- private final static int INDEX_BODY_TEXT = 0;
- /** Index of the HTML version of the message body */
- private final static int INDEX_BODY_HTML = 1;
- /** Single digit [0-9] to ensure uniqueness of the MIME boundary */
- /*package*/ static byte sBoundaryDigit;
-
- /**
- * Returns just the content between the <body></body> tags. This is not perfect and breaks
- * with malformed HTML or if there happens to be special characters in the attributes of
- * the <body> tag (e.g. a '>' in a java script block).
- */
- /*package*/ static String getHtmlBody(String html) {
- Matcher match = BODY_PATTERN.matcher(html);
- if (match.find()) {
- return match.group(BODY_PATTERN_GROUP); // Found body; return
- } else {
- return html; // Body not found; return the full HTML and hope for the best
- }
- }
-
- /**
- * Gets both the plain text and HTML versions of the message body.
- */
- /*package*/ static String[] buildBodyText(Body body, int flags, boolean useSmartReply) {
- if (body == null) {
- return new String[2];
- }
- String[] messageBody = new String[] { body.mTextContent, body.mHtmlContent };
- if (useSmartReply && body.mQuotedTextStartPos > 0) {
- if (messageBody[0] != null) {
- messageBody[0] = messageBody[0].substring(0, body.mQuotedTextStartPos);
- } else if (messageBody[1] != null) {
- messageBody[1] = messageBody[1].substring(0, body.mQuotedTextStartPos);
- }
- }
- return messageBody;
- }
-
- /**
- * Write the entire message to an output stream. This method provides buffering, so it is
- * not necessary to pass in a buffered output stream here.
- *
- * @param context system context for accessing the provider
- * @param messageId the message to write out
- * @param out the output stream to write the message to
- * @param useSmartReply whether or not quoted text is appended to a reply/forward
- */
- public static void writeTo(Context context, long messageId, OutputStream out,
- boolean useSmartReply, boolean sendBcc) throws IOException, MessagingException {
- Message message = Message.restoreMessageWithId(context, messageId);
- if (message == null) {
- // throw something?
- return;
- }
-
- OutputStream stream = new BufferedOutputStream(out, 1024);
- Writer writer = new OutputStreamWriter(stream);
-
- // Write the fixed headers. Ordering is arbitrary (the legacy code iterated through a
- // hashmap here).
-
- String date = DATE_FORMAT.format(new Date(message.mTimeStamp));
- writeHeader(writer, "Date", date);
-
- writeEncodedHeader(writer, "Subject", message.mSubject);
-
- writeHeader(writer, "Message-ID", message.mMessageId);
-
- writeAddressHeader(writer, "From", message.mFrom);
- writeAddressHeader(writer, "To", message.mTo);
- writeAddressHeader(writer, "Cc", message.mCc);
- // Address fields. Note that we skip bcc unless the sendBcc argument is true
- // SMTP should NOT send bcc headers, but EAS must send it!
- if (sendBcc) {
- writeAddressHeader(writer, "Bcc", message.mBcc);
- }
- writeAddressHeader(writer, "Reply-To", message.mReplyTo);
- writeHeader(writer, "MIME-Version", "1.0");
-
- // Analyze message and determine if we have multiparts
- Body body = Body.restoreBodyWithMessageId(context, message.mId);
- String[] bodyText = buildBodyText(body, message.mFlags, useSmartReply);
-
- Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, messageId);
- Cursor attachmentsCursor = context.getContentResolver().query(uri,
- Attachment.CONTENT_PROJECTION, WHERE_NOT_SMART_FORWARD, null, null);
-
- try {
- int attachmentCount = attachmentsCursor.getCount();
- boolean multipart = attachmentCount > 0;
- String multipartBoundary = null;
- String multipartType = "mixed";
-
- // Simplified case for no multipart - just emit text and be done.
- if (!multipart) {
- writeTextWithHeaders(writer, stream, bodyText);
- } else {
- // continue with multipart headers, then into multipart body
- multipartBoundary = getNextBoundary();
-
- // Move to the first attachment; this must succeed because multipart is true
- attachmentsCursor.moveToFirst();
- if (attachmentCount == 1) {
- // If we've got one attachment and it's an ics "attachment", we want to send
- // this as multipart/alternative instead of multipart/mixed
- int flags = attachmentsCursor.getInt(Attachment.CONTENT_FLAGS_COLUMN);
- if ((flags & Attachment.FLAG_ICS_ALTERNATIVE_PART) != 0) {
- multipartType = "alternative";
- }
- }
-
- writeHeader(writer, "Content-Type",
- "multipart/" + multipartType + "; boundary=\"" + multipartBoundary + "\"");
- // Finish headers and prepare for body section(s)
- writer.write("\r\n");
-
- // first multipart element is the body
- if (bodyText[INDEX_BODY_TEXT] != null || bodyText[INDEX_BODY_HTML] != null) {
- writeBoundary(writer, multipartBoundary, false);
- writeTextWithHeaders(writer, stream, bodyText);
- }
-
- // Write out the attachments until we run out
- do {
- writeBoundary(writer, multipartBoundary, false);
- Attachment attachment =
- Attachment.getContent(attachmentsCursor, Attachment.class);
- writeOneAttachment(context, writer, stream, attachment);
- writer.write("\r\n");
- } while (attachmentsCursor.moveToNext());
-
- // end of multipart section
- writeBoundary(writer, multipartBoundary, true);
- }
- } finally {
- attachmentsCursor.close();
- }
-
- writer.flush();
- out.flush();
- }
-
- /**
- * Write a single attachment and its payload
- */
- private static void writeOneAttachment(Context context, Writer writer, OutputStream out,
- Attachment attachment) throws IOException, MessagingException {
- writeHeader(writer, "Content-Type",
- attachment.mMimeType + ";\n name=\"" + attachment.mFileName + "\"");
- writeHeader(writer, "Content-Transfer-Encoding", "base64");
- // Most attachments (real files) will send Content-Disposition. The suppression option
- // is used when sending calendar invites.
- if ((attachment.mFlags & Attachment.FLAG_ICS_ALTERNATIVE_PART) == 0) {
- writeHeader(writer, "Content-Disposition",
- "attachment;"
- + "\n filename=\"" + attachment.mFileName + "\";"
- + "\n size=" + Long.toString(attachment.mSize));
- }
- if (attachment.mContentId != null) {
- writeHeader(writer, "Content-ID", attachment.mContentId);
- }
- writer.append("\r\n");
-
- // Set up input stream and write it out via base64
- InputStream inStream = null;
- try {
- // Use content, if provided; otherwise, use the contentUri
- if (attachment.mContentBytes != null) {
- inStream = new ByteArrayInputStream(attachment.mContentBytes);
- } else {
- // try to open the file
- Uri fileUri = Uri.parse(attachment.mContentUri);
- inStream = context.getContentResolver().openInputStream(fileUri);
- }
- // switch to output stream for base64 text output
- writer.flush();
- Base64OutputStream base64Out = new Base64OutputStream(
- out, Base64.CRLF | Base64.NO_CLOSE);
- // copy base64 data and close up
- IOUtils.copy(inStream, base64Out);
- base64Out.close();
-
- // The old Base64OutputStream wrote an extra CRLF after
- // the output. It's not required by the base-64 spec; not
- // sure if it's required by RFC 822 or not.
- out.write('\r');
- out.write('\n');
- out.flush();
- }
- catch (FileNotFoundException fnfe) {
- // Ignore this - empty file is OK
- }
- catch (IOException ioe) {
- throw new MessagingException("Invalid attachment.", ioe);
- }
- }
-
- /**
- * Write a single header with no wrapping or encoding
- *
- * @param writer the output writer
- * @param name the header name
- * @param value the header value
- */
- private static void writeHeader(Writer writer, String name, String value) throws IOException {
- if (value != null && value.length() > 0) {
- writer.append(name);
- writer.append(": ");
- writer.append(value);
- writer.append("\r\n");
- }
- }
-
- /**
- * Write a single header using appropriate folding & encoding
- *
- * @param writer the output writer
- * @param name the header name
- * @param value the header value
- */
- private static void writeEncodedHeader(Writer writer, String name, String value)
- throws IOException {
- if (value != null && value.length() > 0) {
- writer.append(name);
- writer.append(": ");
- writer.append(MimeUtility.foldAndEncode2(value, name.length() + 2));
- writer.append("\r\n");
- }
- }
-
- /**
- * Unpack, encode, and fold address(es) into a header
- *
- * @param writer the output writer
- * @param name the header name
- * @param value the header value (a packed list of addresses)
- */
- private static void writeAddressHeader(Writer writer, String name, String value)
- throws IOException {
- if (value != null && value.length() > 0) {
- writer.append(name);
- writer.append(": ");
- writer.append(MimeUtility.fold(Address.packedToHeader(value), name.length() + 2));
- writer.append("\r\n");
- }
- }
-
- /**
- * Write a multipart boundary
- *
- * @param writer the output writer
- * @param boundary the boundary string
- * @param end false if inner boundary, true if final boundary
- */
- private static void writeBoundary(Writer writer, String boundary, boolean end)
- throws IOException {
- writer.append("--");
- writer.append(boundary);
- if (end) {
- writer.append("--");
- }
- writer.append("\r\n");
- }
-
- /**
- * Write the body text.
- *
- * Note this always uses base64, even when not required. Slightly less efficient for
- * US-ASCII text, but handles all formats even when non-ascii chars are involved. A small
- * optimization might be to prescan the string for safety and send raw if possible.
- *
- * @param writer the output writer
- * @param out the output stream inside the writer (used for byte[] access)
- * @param bodyText Plain text and HTML versions of the original text of the message
- */
- private static void writeTextWithHeaders(Writer writer, OutputStream out, String[] bodyText)
- throws IOException {
- boolean html = false;
- String text = bodyText[INDEX_BODY_TEXT];
- if (text == null) {
- text = bodyText[INDEX_BODY_HTML];
- html = true;
- }
- if (text == null) {
- writer.write("\r\n"); // a truly empty message
- } else {
- // first multipart element is the body
- String mimeType = "text/" + (html ? "html" : "plain");
- writeHeader(writer, "Content-Type", mimeType + "; charset=utf-8");
- writeHeader(writer, "Content-Transfer-Encoding", "base64");
- writer.write("\r\n");
- byte[] textBytes = text.getBytes("UTF-8");
- writer.flush();
- out.write(Base64.encode(textBytes, Base64.CRLF));
- }
- }
-
- /**
- * Returns a unique boundary string.
- */
- /*package*/ static String getNextBoundary() {
- StringBuilder boundary = new StringBuilder();
- boundary.append("--_com.android.email_").append(System.nanoTime());
- synchronized (Rfc822Output.class) {
- boundary = boundary.append(sBoundaryDigit);
- sBoundaryDigit = (byte)((sBoundaryDigit + 1) % 10);
- }
- return boundary.toString();
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/internet/TextBody.java b/email2/emailcommon/src/com/android/emailcommon/internet/TextBody.java
deleted file mode 100644
index 09c265c8e..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/internet/TextBody.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.internet;
-
-import com.android.emailcommon.mail.Body;
-import com.android.emailcommon.mail.MessagingException;
-
-import android.util.Base64;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-
-public class TextBody implements Body {
- String mBody;
-
- public TextBody(String body) {
- this.mBody = body;
- }
-
- public void writeTo(OutputStream out) throws IOException, MessagingException {
- byte[] bytes = mBody.getBytes("UTF-8");
- out.write(Base64.encode(bytes, Base64.CRLF));
- }
-
- /**
- * Get the text of the body in it's unencoded format.
- * @return
- */
- public String getText() {
- return mBody;
- }
-
- /**
- * Returns an InputStream that reads this body's text in UTF-8 format.
- */
- public InputStream getInputStream() throws MessagingException {
- try {
- byte[] b = mBody.getBytes("UTF-8");
- return new ByteArrayInputStream(b);
- }
- catch (UnsupportedEncodingException usee) {
- return null;
- }
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/Address.java b/email2/emailcommon/src/com/android/emailcommon/mail/Address.java
deleted file mode 100644
index 5245c5691..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/Address.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-import android.text.TextUtils;
-import android.text.util.Rfc822Token;
-import android.text.util.Rfc822Tokenizer;
-
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-import org.apache.james.mime4j.codec.EncoderUtil;
-import org.apache.james.mime4j.decoder.DecoderUtil;
-
-import java.util.ArrayList;
-import java.util.regex.Pattern;
-
-/**
- * This class represent email address.
- *
- * RFC822 email address may have following format.
- * "name" <address> (comment)
- * "name" <address>
- * name <address>
- * address
- * Name and comment part should be MIME/base64 encoded in header if necessary.
- *
- */
-public class Address {
- /**
- * Address part, in the form local_part@domain_part. No surrounding angle brackets.
- */
- private String mAddress;
-
- /**
- * Name part. No surrounding double quote, and no MIME/base64 encoding.
- * This must be null if Address has no name part.
- */
- private String mPersonal;
-
- // Regex that matches address surrounded by '<>' optionally. '^<?([^>]+)>?$'
- private static final Pattern REMOVE_OPTIONAL_BRACKET = Pattern.compile("^<?([^>]+)>?$");
- // Regex that matches personal name surrounded by '""' optionally. '^"?([^"]+)"?$'
- private static final Pattern REMOVE_OPTIONAL_DQUOTE = Pattern.compile("^\"?([^\"]*)\"?$");
- // Regex that matches escaped character '\\([\\"])'
- private static final Pattern UNQUOTE = Pattern.compile("\\\\([\\\\\"])");
-
- private static final Address[] EMPTY_ADDRESS_ARRAY = new Address[0];
-
- // delimiters are chars that do not appear in an email address, used by pack/unpack
- private static final char LIST_DELIMITER_EMAIL = '\1';
- private static final char LIST_DELIMITER_PERSONAL = '\2';
-
- public Address(String address, String personal) {
- setAddress(address);
- setPersonal(personal);
- }
-
- public Address(String address) {
- setAddress(address);
- }
-
- public String getAddress() {
- return mAddress;
- }
-
- public void setAddress(String address) {
- mAddress = REMOVE_OPTIONAL_BRACKET.matcher(address).replaceAll("$1");
- }
-
- /**
- * Get name part as UTF-16 string. No surrounding double quote, and no MIME/base64 encoding.
- *
- * @return Name part of email address. Returns null if it is omitted.
- */
- public String getPersonal() {
- return mPersonal;
- }
-
- /**
- * Set name part from UTF-16 string. Optional surrounding double quote will be removed.
- * It will be also unquoted and MIME/base64 decoded.
- *
- * @param personal name part of email address as UTF-16 string. Null is acceptable.
- */
- public void setPersonal(String personal) {
- if (personal != null) {
- personal = REMOVE_OPTIONAL_DQUOTE.matcher(personal).replaceAll("$1");
- personal = UNQUOTE.matcher(personal).replaceAll("$1");
- personal = DecoderUtil.decodeEncodedWords(personal);
- if (personal.length() == 0) {
- personal = null;
- }
- }
- mPersonal = personal;
- }
-
- /**
- * This method is used to check that all the addresses that the user
- * entered in a list (e.g. To:) are valid, so that none is dropped.
- */
- public static boolean isAllValid(String addressList) {
- // This code mimics the parse() method below.
- // I don't know how to better avoid the code-duplication.
- if (addressList != null && addressList.length() > 0) {
- Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(addressList);
- for (int i = 0, length = tokens.length; i < length; ++i) {
- Rfc822Token token = tokens[i];
- String address = token.getAddress();
- if (!TextUtils.isEmpty(address) && !isValidAddress(address)) {
- return false;
- }
- }
- }
- return true;
- }
-
- /**
- * Parse a comma-delimited list of addresses in RFC822 format and return an
- * array of Address objects.
- *
- * @param addressList Address list in comma-delimited string.
- * @return An array of 0 or more Addresses.
- */
- public static Address[] parse(String addressList) {
- if (addressList == null || addressList.length() == 0) {
- return EMPTY_ADDRESS_ARRAY;
- }
- Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(addressList);
- ArrayList<Address> addresses = new ArrayList<Address>();
- for (int i = 0, length = tokens.length; i < length; ++i) {
- Rfc822Token token = tokens[i];
- String address = token.getAddress();
- if (!TextUtils.isEmpty(address)) {
- if (isValidAddress(address)) {
- String name = token.getName();
- if (TextUtils.isEmpty(name)) {
- name = null;
- }
- addresses.add(new Address(address, name));
- }
- }
- }
- return addresses.toArray(new Address[] {});
- }
-
- /**
- * Checks whether a string email address is valid.
- * E.g. name@domain.com is valid.
- */
- @VisibleForTesting
- static boolean isValidAddress(String address) {
- // Note: Some email provider may violate the standard, so here we only check that
- // address consists of two part that are separated by '@', and domain part contains
- // at least one '.'.
- int len = address.length();
- int firstAt = address.indexOf('@');
- int lastAt = address.lastIndexOf('@');
- int firstDot = address.indexOf('.', lastAt + 1);
- int lastDot = address.lastIndexOf('.');
- return firstAt > 0 && firstAt == lastAt && lastAt + 1 < firstDot
- && firstDot <= lastDot && lastDot < len - 1;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof Address) {
- // It seems that the spec says that the "user" part is case-sensitive,
- // while the domain part in case-insesitive.
- // So foo@yahoo.com and Foo@yahoo.com are different.
- // This may seem non-intuitive from the user POV, so we
- // may re-consider it if it creates UI trouble.
- // A problem case is "replyAll" sending to both
- // a@b.c and to A@b.c, which turn out to be the same on the server.
- // Leave unchanged for now (i.e. case-sensitive).
- return getAddress().equals(((Address) o).getAddress());
- }
- return super.equals(o);
- }
-
- public int hashCode() {
- return getAddress().hashCode();
- }
-
- /**
- * Get human readable address string.
- * Do not use this for email header.
- *
- * @return Human readable address string. Not quoted and not encoded.
- */
- @Override
- public String toString() {
- if (mPersonal != null && !mPersonal.equals(mAddress)) {
- if (mPersonal.matches(".*[\\(\\)<>@,;:\\\\\".\\[\\]].*")) {
- return Utility.quoteString(mPersonal) + " <" + mAddress + ">";
- } else {
- return mPersonal + " <" + mAddress + ">";
- }
- } else {
- return mAddress;
- }
- }
-
- /**
- * Get human readable comma-delimited address string.
- *
- * @param addresses Address array
- * @return Human readable comma-delimited address string.
- */
- public static String toString(Address[] addresses) {
- return toString(addresses, ",");
- }
-
- /**
- * Get human readable address strings joined with the specified separator.
- *
- * @param addresses Address array
- * @param separator Separator
- * @return Human readable comma-delimited address string.
- */
- public static String toString(Address[] addresses, String separator) {
- if (addresses == null || addresses.length == 0) {
- return null;
- }
- if (addresses.length == 1) {
- return addresses[0].toString();
- }
- StringBuffer sb = new StringBuffer(addresses[0].toString());
- for (int i = 1; i < addresses.length; i++) {
- sb.append(separator);
- // TODO: investigate why this .trim() is needed.
- sb.append(addresses[i].toString().trim());
- }
- return sb.toString();
- }
-
- /**
- * Get RFC822/MIME compatible address string.
- *
- * @return RFC822/MIME compatible address string.
- * It may be surrounded by double quote or quoted and MIME/base64 encoded if necessary.
- */
- public String toHeader() {
- if (mPersonal != null) {
- return EncoderUtil.encodeAddressDisplayName(mPersonal) + " <" + mAddress + ">";
- } else {
- return mAddress;
- }
- }
-
- /**
- * Get RFC822/MIME compatible comma-delimited address string.
- *
- * @param addresses Address array
- * @return RFC822/MIME compatible comma-delimited address string.
- * it may be surrounded by double quoted or quoted and MIME/base64 encoded if necessary.
- */
- public static String toHeader(Address[] addresses) {
- if (addresses == null || addresses.length == 0) {
- return null;
- }
- if (addresses.length == 1) {
- return addresses[0].toHeader();
- }
- StringBuffer sb = new StringBuffer(addresses[0].toHeader());
- for (int i = 1; i < addresses.length; i++) {
- // We need space character to be able to fold line.
- sb.append(", ");
- sb.append(addresses[i].toHeader());
- }
- return sb.toString();
- }
-
- /**
- * Get Human friendly address string.
- *
- * @return the personal part of this Address, or the address part if the
- * personal part is not available
- */
- public String toFriendly() {
- if (mPersonal != null && mPersonal.length() > 0) {
- return mPersonal;
- } else {
- return mAddress;
- }
- }
-
- /**
- * Creates a comma-delimited list of addresses in the "friendly" format (see toFriendly() for
- * details on the per-address conversion).
- *
- * @param addresses Array of Address[] values
- * @return A comma-delimited string listing all of the addresses supplied. Null if source
- * was null or empty.
- */
- public static String toFriendly(Address[] addresses) {
- if (addresses == null || addresses.length == 0) {
- return null;
- }
- if (addresses.length == 1) {
- return addresses[0].toFriendly();
- }
- StringBuffer sb = new StringBuffer(addresses[0].toFriendly());
- for (int i = 1; i < addresses.length; i++) {
- sb.append(", ");
- sb.append(addresses[i].toFriendly());
- }
- return sb.toString();
- }
-
- /**
- * Returns exactly the same result as Address.toString(Address.unpack(packedList)).
- */
- public static String unpackToString(String packedList) {
- return toString(unpack(packedList));
- }
-
- /**
- * Returns exactly the same result as Address.pack(Address.parse(textList)).
- */
- public static String parseAndPack(String textList) {
- return Address.pack(Address.parse(textList));
- }
-
- /**
- * Returns null if the packedList has 0 addresses, otherwise returns the first address.
- * The same as Address.unpack(packedList)[0] for non-empty list.
- * This is an utility method that offers some performance optimization opportunities.
- */
- public static Address unpackFirst(String packedList) {
- Address[] array = unpack(packedList);
- return array.length > 0 ? array[0] : null;
- }
-
- /**
- * Convert a packed list of addresses to a form suitable for use in an RFC822 header.
- * This implementation is brute-force, and could be replaced with a more efficient version
- * if desired.
- */
- public static String packedToHeader(String packedList) {
- return toHeader(unpack(packedList));
- }
-
- /**
- * Unpacks an address list that is either CSV of RFC822 addresses OR (for backward
- * compatibility) previously packed with pack()
- * @param addressList string packed with pack() or CSV of RFC822 addresses
- * @return array of addresses resulting from unpack
- */
- public static Address[] unpack(String addressList) {
- if (addressList == null || addressList.length() == 0) {
- return EMPTY_ADDRESS_ARRAY;
- }
- // IF we're CSV, just parse
- if ((addressList.indexOf(LIST_DELIMITER_PERSONAL) == -1) &&
- (addressList.indexOf(LIST_DELIMITER_EMAIL) == -1)) {
- return Address.parse(addressList);
- }
- // Otherwise, do backward-compatibile unpack
- ArrayList<Address> addresses = new ArrayList<Address>();
- int length = addressList.length();
- int pairStartIndex = 0;
- int pairEndIndex = 0;
-
- /* addressEndIndex is only re-scanned (indexOf()) when a LIST_DELIMITER_PERSONAL
- is used, not for every email address; i.e. not for every iteration of the while().
- This reduces the theoretical complexity from quadratic to linear,
- and provides some speed-up in practice by removing redundant scans of the string.
- */
- int addressEndIndex = addressList.indexOf(LIST_DELIMITER_PERSONAL);
-
- while (pairStartIndex < length) {
- pairEndIndex = addressList.indexOf(LIST_DELIMITER_EMAIL, pairStartIndex);
- if (pairEndIndex == -1) {
- pairEndIndex = length;
- }
- Address address;
- if (addressEndIndex == -1 || pairEndIndex <= addressEndIndex) {
- // in this case the DELIMITER_PERSONAL is in a future pair,
- // so don't use personal, and don't update addressEndIndex
- address = new Address(addressList.substring(pairStartIndex, pairEndIndex), null);
- } else {
- address = new Address(addressList.substring(pairStartIndex, addressEndIndex),
- addressList.substring(addressEndIndex + 1, pairEndIndex));
- // only update addressEndIndex when we use the LIST_DELIMITER_PERSONAL
- addressEndIndex = addressList.indexOf(LIST_DELIMITER_PERSONAL, pairEndIndex + 1);
- }
- addresses.add(address);
- pairStartIndex = pairEndIndex + 1;
- }
- return addresses.toArray(EMPTY_ADDRESS_ARRAY);
- }
-
- /**
- * Generate a String containing RFC822 addresses separated by commas
- * NOTE: We used to "pack" these addresses in an app-specific format, but no longer do so
- */
- public static String pack(Address[] addresses) {
- return Address.toHeader(addresses);
- }
-
- /**
- * Produces the same result as pack(array), but only packs one (this) address.
- */
- public String pack() {
- final String address = getAddress();
- final String personal = getPersonal();
- if (personal == null) {
- return address;
- } else {
- return address + LIST_DELIMITER_PERSONAL + personal;
- }
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/AuthenticationFailedException.java b/email2/emailcommon/src/com/android/emailcommon/mail/AuthenticationFailedException.java
deleted file mode 100644
index af8d96c09..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/AuthenticationFailedException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-
-public class AuthenticationFailedException extends MessagingException {
- public static final long serialVersionUID = -1;
-
- public AuthenticationFailedException(String message) {
- super(MessagingException.AUTHENTICATION_FAILED, message);
- }
-
- public AuthenticationFailedException(int exceptionType, String message) {
- super(exceptionType, message);
- }
-
- public AuthenticationFailedException(String message, Throwable throwable) {
- super(MessagingException.AUTHENTICATION_FAILED, message, throwable);
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/Body.java b/email2/emailcommon/src/com/android/emailcommon/mail/Body.java
deleted file mode 100644
index 841ab42a7..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/Body.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-public interface Body {
- public InputStream getInputStream() throws MessagingException;
- public void writeTo(OutputStream out) throws IOException, MessagingException;
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/BodyPart.java b/email2/emailcommon/src/com/android/emailcommon/mail/BodyPart.java
deleted file mode 100644
index f698a139d..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/BodyPart.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-public abstract class BodyPart implements Part {
- protected Multipart mParent;
-
- public Multipart getParent() {
- return mParent;
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/CertificateValidationException.java b/email2/emailcommon/src/com/android/emailcommon/mail/CertificateValidationException.java
deleted file mode 100644
index 83c6224df..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/CertificateValidationException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-
-public class CertificateValidationException extends MessagingException {
- public static final long serialVersionUID = -1;
-
- public CertificateValidationException(String message) {
- super(MessagingException.CERTIFICATE_VALIDATION_ERROR, message);
- }
-
- public CertificateValidationException(String message, Throwable throwable) {
- super(MessagingException.CERTIFICATE_VALIDATION_ERROR, message, throwable);
- }
-} \ No newline at end of file
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/FetchProfile.java b/email2/emailcommon/src/com/android/emailcommon/mail/FetchProfile.java
deleted file mode 100644
index bfa48d30f..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/FetchProfile.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-import java.util.ArrayList;
-
-/**
- * <pre>
- * A FetchProfile is a list of items that should be downloaded in bulk for a set of messages.
- * FetchProfile can contain the following objects:
- * FetchProfile.Item: Described below.
- * Message: Indicates that the body of the entire message should be fetched.
- * Synonymous with FetchProfile.Item.BODY.
- * Part: Indicates that the given Part should be fetched. The provider
- * is expected have previously created the given BodyPart and stored
- * any information it needs to download the content.
- * </pre>
- */
-public class FetchProfile extends ArrayList<Fetchable> {
- /**
- * Default items available for pre-fetching. It should be expected that any
- * item fetched by using these items could potentially include all of the
- * previous items.
- */
- public enum Item implements Fetchable {
- /**
- * Download the flags of the message.
- */
- FLAGS,
-
- /**
- * Download the envelope of the message. This should include at minimum
- * the size and the following headers: date, subject, from, content-type, to, cc
- */
- ENVELOPE,
-
- /**
- * Download the structure of the message. This maps directly to IMAP's BODYSTRUCTURE
- * and may map to other providers.
- * The provider should, if possible, fill in a properly formatted MIME structure in
- * the message without actually downloading any message data. If the provider is not
- * capable of this operation it should specifically set the body of the message to null
- * so that upper levels can detect that a full body download is needed.
- */
- STRUCTURE,
-
- /**
- * A sane portion of the entire message, cut off at a provider determined limit.
- * This should generaly be around 50kB.
- */
- BODY_SANE,
-
- /**
- * The entire message.
- */
- BODY,
- }
-
- /**
- * @return the first {@link Part} in this collection, or null if it doesn't contain
- * {@link Part}.
- */
- public Part getFirstPart() {
- for (Fetchable o : this) {
- if (o instanceof Part) {
- return (Part) o;
- }
- }
- return null;
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/Fetchable.java b/email2/emailcommon/src/com/android/emailcommon/mail/Fetchable.java
deleted file mode 100644
index 4314f93f5..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/Fetchable.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-/**
- * Interface for classes that can be added to {@link FetchProfile}.
- * i.e. {@link Part} and its subclasses, and {@link FetchProfile.Item}.
- */
-public interface Fetchable {
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/Flag.java b/email2/emailcommon/src/com/android/emailcommon/mail/Flag.java
deleted file mode 100644
index bcdcb8b7e..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/Flag.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-/**
- * Flags that can be applied to Messages.
- */
-public enum Flag {
-
- // If adding new flags: ALL FLAGS MUST BE UPPER CASE.
-
- DELETED,
- SEEN,
- ANSWERED,
- FLAGGED,
- DRAFT,
- RECENT,
-
- /*
- * The following flags are for internal library use only.
- * TODO Eventually we should creates a Flags class that extends ArrayList that allows
- * these flags and Strings to represent user defined flags. At that point the below
- * flags should become user defined flags.
- */
- /**
- * Delete and remove from the LocalStore immediately.
- */
- X_DESTROYED,
-
- /**
- * Sending of an unsent message failed. It will be retried. Used to show status.
- */
- X_SEND_FAILED,
-
- /**
- * Sending of an unsent message is in progress.
- */
- X_SEND_IN_PROGRESS,
-
- /**
- * Indicates that a message is fully downloaded from the server and can be viewed normally.
- * This does not include attachments, which are never downloaded fully.
- */
- X_DOWNLOADED_FULL,
-
- /**
- * Indicates that a message is partially downloaded from the server and can be viewed but
- * more content is available on the server.
- * This does not include attachments, which are never downloaded fully.
- */
- X_DOWNLOADED_PARTIAL,
-
- /**
- * General purpose flag that can be used by any remote store. The flag will be
- * saved and restored by the LocalStore.
- */
- X_STORE_1,
-
- /**
- * General purpose flag that can be used by any remote store. The flag will be
- * saved and restored by the LocalStore.
- */
- X_STORE_2,
-
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/Folder.java b/email2/emailcommon/src/com/android/emailcommon/mail/Folder.java
deleted file mode 100644
index c58988d96..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/Folder.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-import com.android.emailcommon.service.SearchParams;
-import com.google.common.annotations.VisibleForTesting;
-
-
-public abstract class Folder {
- public enum OpenMode {
- READ_WRITE, READ_ONLY,
- }
-
- public enum FolderType {
- HOLDS_FOLDERS, HOLDS_MESSAGES,
- }
-
- /**
- * Identifiers of "special" folders.
- */
- public enum FolderRole {
- INBOX, // NOTE: The folder's name must be INBOX
- TRASH,
- SENT,
- DRAFTS,
-
- OUTBOX, // Local folders only - not used in remote Stores
- OTHER, // this folder has no specific role
- UNKNOWN // the role of this folder is unknown
- }
-
- /**
- * Callback for each message retrieval.
- *
- * Not all {@link Folder} implementations may invoke it.
- */
- public interface MessageRetrievalListener {
- public void messageRetrieved(Message message);
- public void loadAttachmentProgress(int progress);
- }
-
- /**
- * Forces an open of the MailProvider. If the provider is already open this
- * function returns without doing anything.
- *
- * @param mode READ_ONLY or READ_WRITE
- * @param callbacks Pointer to callbacks class. This may be used by the folder between this
- * time and when close() is called. This is only used for remote stores - should be null
- * for LocalStore.LocalFolder.
- */
- public abstract void open(OpenMode mode)
- throws MessagingException;
-
- /**
- * Forces a close of the MailProvider. Any further access will attempt to
- * reopen the MailProvider.
- *
- * @param expunge If true all deleted messages will be expunged.
- */
- public abstract void close(boolean expunge) throws MessagingException;
-
- /**
- * @return True if further commands are not expected to have to open the
- * connection.
- */
- @VisibleForTesting
- public abstract boolean isOpen();
-
- /**
- * Returns the mode the folder was opened with. This may be different than the mode the open
- * was requested with.
- */
- public abstract OpenMode getMode() throws MessagingException;
-
- /**
- * Reports if the Store is able to create folders of the given type.
- * Does not actually attempt to create a folder.
- * @param type
- * @return true if can create, false if cannot create
- */
- public abstract boolean canCreate(FolderType type);
-
- /**
- * Attempt to create the given folder remotely using the given type.
- * @return true if created, false if cannot create (e.g. server side)
- */
- public abstract boolean create(FolderType type) throws MessagingException;
-
- public abstract boolean exists() throws MessagingException;
-
- /**
- * Returns the number of messages in the selected folder.
- */
- public abstract int getMessageCount() throws MessagingException;
-
- public abstract int getUnreadMessageCount() throws MessagingException;
-
- public abstract Message getMessage(String uid) throws MessagingException;
-
- /**
- * Fetches the given list of messages. The specified listener is notified as
- * each fetch completes. Messages are downloaded as (as) lightweight (as
- * possible) objects to be filled in with later requests. In most cases this
- * means that only the UID is downloaded.
- */
- public abstract Message[] getMessages(int start, int end, MessageRetrievalListener listener)
- throws MessagingException;
-
- public abstract Message[] getMessages(SearchParams params,MessageRetrievalListener listener)
- throws MessagingException;
-
- public abstract Message[] getMessages(String[] uids, MessageRetrievalListener listener)
- throws MessagingException;
-
- /**
- * Return a set of messages based on the state of the flags.
- * Note: Not typically implemented in remote stores, so not abstract.
- *
- * @param setFlags The flags that should be set for a message to be selected (can be null)
- * @param clearFlags The flags that should be clear for a message to be selected (can be null)
- * @param listener
- * @return A list of messages matching the desired flag states.
- * @throws MessagingException
- */
- public Message[] getMessages(Flag[] setFlags, Flag[] clearFlags,
- MessageRetrievalListener listener) throws MessagingException {
- throw new MessagingException("Not implemented");
- }
-
- public abstract void appendMessages(Message[] messages) throws MessagingException;
-
- /**
- * Copies the given messages to the destination folder.
- */
- public abstract void copyMessages(Message[] msgs, Folder folder,
- MessageUpdateCallbacks callbacks) throws MessagingException;
-
- public abstract void setFlags(Message[] messages, Flag[] flags, boolean value)
- throws MessagingException;
-
- public abstract Message[] expunge() throws MessagingException;
-
- public abstract void fetch(Message[] messages, FetchProfile fp,
- MessageRetrievalListener listener) throws MessagingException;
-
- public abstract void delete(boolean recurse) throws MessagingException;
-
- public abstract String getName();
-
- public abstract Flag[] getPermanentFlags() throws MessagingException;
-
- /**
- * This method returns a string identifying the name of a "role" folder
- * (such as inbox, draft, sent, or trash). Stores that do not implement this
- * feature can be used - the account UI will provide default strings. To
- * let the server identify specific folder roles, simply override this method.
- *
- * @return The server- or protocol- specific role for this folder. If some roles are known
- * but this is not one of them, return FolderRole.OTHER. If roles are unsupported here,
- * return FolderRole.UNKNOWN.
- */
- public FolderRole getRole() {
- return FolderRole.UNKNOWN;
- }
-
- /**
- * Create an empty message of the appropriate type for the Folder.
- */
- public abstract Message createMessage(String uid) throws MessagingException;
-
- /**
- * Callback interface by which a folder can report UID changes caused by certain operations.
- */
- public interface MessageUpdateCallbacks {
- /**
- * The operation caused the message's UID to change
- * @param message The message for which the UID changed
- * @param newUid The new UID for the message
- */
- public void onMessageUidChange(Message message, String newUid) throws MessagingException;
-
- /**
- * The operation could not be completed because the message doesn't exist
- * (for example, it was already deleted from the server side.)
- * @param message The message that does not exist
- * @throws MessagingException
- */
- public void onMessageNotFound(Message message) throws MessagingException;
- }
-
- @Override
- public String toString() {
- return getName();
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/MeetingInfo.java b/email2/emailcommon/src/com/android/emailcommon/mail/MeetingInfo.java
deleted file mode 100644
index 87637f7a1..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/MeetingInfo.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-public class MeetingInfo {
- // Predefined tags; others can be added
- public static final String MEETING_DTSTAMP = "DTSTAMP";
- public static final String MEETING_UID = "UID";
- public static final String MEETING_ORGANIZER_EMAIL = "ORGMAIL";
- public static final String MEETING_DTSTART = "DTSTART";
- public static final String MEETING_DTEND = "DTEND";
- public static final String MEETING_TITLE = "TITLE";
- public static final String MEETING_LOCATION = "LOC";
- public static final String MEETING_RESPONSE_REQUESTED = "RESPONSE";
- public static final String MEETING_ALL_DAY = "ALLDAY";
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/Message.java b/email2/emailcommon/src/com/android/emailcommon/mail/Message.java
deleted file mode 100644
index 09aef87d1..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/Message.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-import java.util.Date;
-import java.util.HashSet;
-
-public abstract class Message implements Part, Body {
- public static final Message[] EMPTY_ARRAY = new Message[0];
-
- public enum RecipientType {
- TO, CC, BCC,
- }
-
- protected String mUid;
-
- private HashSet<Flag> mFlags = null;
-
- protected Date mInternalDate;
-
- protected Folder mFolder;
-
- public String getUid() {
- return mUid;
- }
-
- public void setUid(String uid) {
- this.mUid = uid;
- }
-
- public Folder getFolder() {
- return mFolder;
- }
-
- public abstract String getSubject() throws MessagingException;
-
- public abstract void setSubject(String subject) throws MessagingException;
-
- public Date getInternalDate() {
- return mInternalDate;
- }
-
- public void setInternalDate(Date internalDate) {
- this.mInternalDate = internalDate;
- }
-
- public abstract Date getReceivedDate() throws MessagingException;
-
- public abstract Date getSentDate() throws MessagingException;
-
- public abstract void setSentDate(Date sentDate) throws MessagingException;
-
- public abstract Address[] getRecipients(RecipientType type) throws MessagingException;
-
- public abstract void setRecipients(RecipientType type, Address[] addresses)
- throws MessagingException;
-
- public void setRecipient(RecipientType type, Address address) throws MessagingException {
- setRecipients(type, new Address[] {
- address
- });
- }
-
- public abstract Address[] getFrom() throws MessagingException;
-
- public abstract void setFrom(Address from) throws MessagingException;
-
- public abstract Address[] getReplyTo() throws MessagingException;
-
- public abstract void setReplyTo(Address[] from) throws MessagingException;
-
- public abstract Body getBody() throws MessagingException;
-
- public abstract String getContentType() throws MessagingException;
-
- public abstract void addHeader(String name, String value) throws MessagingException;
-
- public abstract void setHeader(String name, String value) throws MessagingException;
-
- public abstract String[] getHeader(String name) throws MessagingException;
-
- public abstract void removeHeader(String name) throws MessagingException;
-
- // Always use these instead of getHeader("Message-ID") or setHeader("Message-ID");
- public abstract void setMessageId(String messageId) throws MessagingException;
- public abstract String getMessageId() throws MessagingException;
-
- public abstract void setBody(Body body) throws MessagingException;
-
- public boolean isMimeType(String mimeType) throws MessagingException {
- return getContentType().startsWith(mimeType);
- }
-
- private HashSet<Flag> getFlagSet() {
- if (mFlags == null) {
- mFlags = new HashSet<Flag>();
- }
- return mFlags;
- }
-
- /*
- * TODO Refactor Flags at some point to be able to store user defined flags.
- */
- public Flag[] getFlags() {
- return getFlagSet().toArray(new Flag[] {});
- }
-
- /**
- * Set/clear a flag directly, without involving overrides of {@link #setFlag} in subclasses.
- * Only used for testing.
- */
- public final void setFlagDirectlyForTest(Flag flag, boolean set) throws MessagingException {
- if (set) {
- getFlagSet().add(flag);
- } else {
- getFlagSet().remove(flag);
- }
- }
-
- public void setFlag(Flag flag, boolean set) throws MessagingException {
- setFlagDirectlyForTest(flag, set);
- }
-
- /**
- * This method calls setFlag(Flag, boolean)
- * @param flags
- * @param set
- */
- public void setFlags(Flag[] flags, boolean set) throws MessagingException {
- for (Flag flag : flags) {
- setFlag(flag, set);
- }
- }
-
- public boolean isSet(Flag flag) {
- return getFlagSet().contains(flag);
- }
-
- public abstract void saveChanges() throws MessagingException;
-
- @Override
- public String toString() {
- return getClass().getSimpleName() + ':' + mUid;
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/MessageDateComparator.java b/email2/emailcommon/src/com/android/emailcommon/mail/MessageDateComparator.java
deleted file mode 100644
index 0b1a55115..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/MessageDateComparator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-import java.util.Comparator;
-
-public class MessageDateComparator implements Comparator<Message> {
- public int compare(Message o1, Message o2) {
- try {
- if (o1.getSentDate() == null) {
- return 1;
- } else if (o2.getSentDate() == null) {
- return -1;
- } else
- return o2.getSentDate().compareTo(o1.getSentDate());
- } catch (Exception e) {
- return 0;
- }
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/MessagingException.java b/email2/emailcommon/src/com/android/emailcommon/mail/MessagingException.java
deleted file mode 100644
index 4a8cebade..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/MessagingException.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-
-/**
- * This exception is used for most types of failures that occur during server interactions.
- *
- * Data passed through this exception should be considered non-localized. Any strings should
- * either be internal-only (for debugging) or server-generated.
- *
- * TO DO: Does it make sense to further collapse AuthenticationFailedException and
- * CertificateValidationException and any others into this?
- */
-public class MessagingException extends Exception {
- public static final long serialVersionUID = -1;
-
- public static final int NO_ERROR = -1;
- /** Any exception that does not specify a specific issue */
- public static final int UNSPECIFIED_EXCEPTION = 0;
- /** Connection or IO errors */
- public static final int IOERROR = 1;
- /** The configuration requested TLS but the server did not support it. */
- public static final int TLS_REQUIRED = 2;
- /** Authentication is required but the server did not support it. */
- public static final int AUTH_REQUIRED = 3;
- /** General security failures */
- public static final int GENERAL_SECURITY = 4;
- /** Authentication failed */
- public static final int AUTHENTICATION_FAILED = 5;
- /** Attempt to create duplicate account */
- public static final int DUPLICATE_ACCOUNT = 6;
- /** Required security policies reported - advisory only */
- public static final int SECURITY_POLICIES_REQUIRED = 7;
- /** Required security policies not supported */
- public static final int SECURITY_POLICIES_UNSUPPORTED = 8;
- /** The protocol (or protocol version) isn't supported */
- public static final int PROTOCOL_VERSION_UNSUPPORTED = 9;
- /** The server's SSL certificate couldn't be validated */
- public static final int CERTIFICATE_VALIDATION_ERROR = 10;
- /** Authentication failed during autodiscover */
- public static final int AUTODISCOVER_AUTHENTICATION_FAILED = 11;
- /** Autodiscover completed with a result (non-error) */
- public static final int AUTODISCOVER_AUTHENTICATION_RESULT = 12;
- /** Ambiguous failure; server error or bad credentials */
- public static final int AUTHENTICATION_FAILED_OR_SERVER_ERROR = 13;
- /** The server refused access */
- public static final int ACCESS_DENIED = 14;
- /** The server refused access */
- public static final int ATTACHMENT_NOT_FOUND = 15;
- /** A client SSL certificate is required for connections to the server */
- public static final int CLIENT_CERTIFICATE_REQUIRED = 16;
- /** The client SSL certificate specified is invalid */
- public static final int CLIENT_CERTIFICATE_ERROR = 17;
-
- protected int mExceptionType;
- // Exception type-specific data
- protected Object mExceptionData;
-
- public MessagingException(String message, Throwable throwable) {
- this(UNSPECIFIED_EXCEPTION, message, throwable);
- }
-
- public MessagingException(int exceptionType, String message, Throwable throwable) {
- super(message, throwable);
- mExceptionType = exceptionType;
- mExceptionData = null;
- }
-
- /**
- * Constructs a MessagingException with an exceptionType and a null message.
- * @param exceptionType The exception type to set for this exception.
- */
- public MessagingException(int exceptionType) {
- this(exceptionType, null, null);
- }
-
- /**
- * Constructs a MessagingException with a message.
- * @param message the message for this exception
- */
- public MessagingException(String message) {
- this(UNSPECIFIED_EXCEPTION, message, null);
- }
-
- /**
- * Constructs a MessagingException with an exceptionType and a message.
- * @param exceptionType The exception type to set for this exception.
- */
- public MessagingException(int exceptionType, String message) {
- this(exceptionType, message, null);
- }
-
- /**
- * Constructs a MessagingException with an exceptionType, a message, and data
- * @param exceptionType The exception type to set for this exception.
- * @param message the message for the exception (or null)
- * @param data exception-type specific data for the exception (or null)
- */
- public MessagingException(int exceptionType, String message, Object data) {
- super(message);
- mExceptionType = exceptionType;
- mExceptionData = data;
- }
-
- /**
- * Return the exception type. Will be OTHER_EXCEPTION if not explicitly set.
- *
- * @return Returns the exception type.
- */
- public int getExceptionType() {
- return mExceptionType;
- }
- /**
- * Return the exception data. Will be null if not explicitly set.
- *
- * @return Returns the exception data.
- */
- public Object getExceptionData() {
- return mExceptionData;
- }
-} \ No newline at end of file
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/Multipart.java b/email2/emailcommon/src/com/android/emailcommon/mail/Multipart.java
deleted file mode 100644
index 4a1a06714..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/Multipart.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-import java.util.ArrayList;
-
-public abstract class Multipart implements Body {
- protected Part mParent;
-
- protected ArrayList<BodyPart> mParts = new ArrayList<BodyPart>();
-
- protected String mContentType;
-
- public void addBodyPart(BodyPart part) throws MessagingException {
- mParts.add(part);
- }
-
- public void addBodyPart(BodyPart part, int index) throws MessagingException {
- mParts.add(index, part);
- }
-
- public BodyPart getBodyPart(int index) throws MessagingException {
- return mParts.get(index);
- }
-
- public String getContentType() throws MessagingException {
- return mContentType;
- }
-
- public int getCount() throws MessagingException {
- return mParts.size();
- }
-
- public boolean removeBodyPart(BodyPart part) throws MessagingException {
- return mParts.remove(part);
- }
-
- public void removeBodyPart(int index) throws MessagingException {
- mParts.remove(index);
- }
-
- public Part getParent() throws MessagingException {
- return mParent;
- }
-
- public void setParent(Part parent) throws MessagingException {
- this.mParent = parent;
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/PackedString.java b/email2/emailcommon/src/com/android/emailcommon/mail/PackedString.java
deleted file mode 100644
index de5fe4692..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/PackedString.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A utility class for creating and modifying Strings that are tagged and packed together.
- *
- * Uses non-printable (control chars) for internal delimiters; Intended for regular displayable
- * strings only, so please use base64 or other encoding if you need to hide any binary data here.
- *
- * Binary compatible with Address.pack() format, which should migrate to use this code.
- */
-public class PackedString {
-
- /**
- * Packing format is:
- * element : [ value ] or [ value TAG-DELIMITER tag ]
- * packed-string : [ element ] [ ELEMENT-DELIMITER [ element ] ]*
- */
- private static final char DELIMITER_ELEMENT = '\1';
- private static final char DELIMITER_TAG = '\2';
-
- private String mString;
- private HashMap<String, String> mExploded;
- private static final HashMap<String, String> EMPTY_MAP = new HashMap<String, String>();
-
- /**
- * Create a packed string using an already-packed string (e.g. from database)
- * @param string packed string
- */
- public PackedString(String string) {
- mString = string;
- mExploded = null;
- }
-
- /**
- * Get the value referred to by a given tag. If the tag does not exist, return null.
- * @param tag identifier of string of interest
- * @return returns value, or null if no string is found
- */
- public String get(String tag) {
- if (mExploded == null) {
- mExploded = explode(mString);
- }
- return mExploded.get(tag);
- }
-
- /**
- * Return a map of all of the values referred to by a given tag. This is a shallow
- * copy, don't edit the values.
- * @return a map of the values in the packed string
- */
- public Map<String, String> unpack() {
- if (mExploded == null) {
- mExploded = explode(mString);
- }
- return new HashMap<String,String>(mExploded);
- }
-
- /**
- * Read out all values into a map.
- */
- private static HashMap<String, String> explode(String packed) {
- if (packed == null || packed.length() == 0) {
- return EMPTY_MAP;
- }
- HashMap<String, String> map = new HashMap<String, String>();
-
- int length = packed.length();
- int elementStartIndex = 0;
- int elementEndIndex = 0;
- int tagEndIndex = packed.indexOf(DELIMITER_TAG);
-
- while (elementStartIndex < length) {
- elementEndIndex = packed.indexOf(DELIMITER_ELEMENT, elementStartIndex);
- if (elementEndIndex == -1) {
- elementEndIndex = length;
- }
- String tag;
- String value;
- if (tagEndIndex == -1 || elementEndIndex <= tagEndIndex) {
- // in this case the DELIMITER_PERSONAL is in a future pair (or not found)
- // so synthesize a positional tag for the value, and don't update tagEndIndex
- value = packed.substring(elementStartIndex, elementEndIndex);
- tag = Integer.toString(map.size());
- } else {
- value = packed.substring(elementStartIndex, tagEndIndex);
- tag = packed.substring(tagEndIndex + 1, elementEndIndex);
- // scan forward for next tag, if any
- tagEndIndex = packed.indexOf(DELIMITER_TAG, elementEndIndex + 1);
- }
- map.put(tag, value);
- elementStartIndex = elementEndIndex + 1;
- }
-
- return map;
- }
-
- /**
- * Builder class for creating PackedString values. Can also be used for editing existing
- * PackedString representations.
- */
- static public class Builder {
- HashMap<String, String> mMap;
-
- /**
- * Create a builder that's empty (for filling)
- */
- public Builder() {
- mMap = new HashMap<String, String>();
- }
-
- /**
- * Create a builder using the values of an existing PackedString (for editing).
- */
- public Builder(String packed) {
- mMap = explode(packed);
- }
-
- /**
- * Add a tagged value
- * @param tag identifier of string of interest
- * @param value the value to record in this position. null to delete entry.
- */
- public void put(String tag, String value) {
- if (value == null) {
- mMap.remove(tag);
- } else {
- mMap.put(tag, value);
- }
- }
-
- /**
- * Get the value referred to by a given tag. If the tag does not exist, return null.
- * @param tag identifier of string of interest
- * @return returns value, or null if no string is found
- */
- public String get(String tag) {
- return mMap.get(tag);
- }
-
- /**
- * Pack the values and return a single, encoded string
- */
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- for (Map.Entry<String,String> entry : mMap.entrySet()) {
- if (sb.length() > 0) {
- sb.append(DELIMITER_ELEMENT);
- }
- sb.append(entry.getValue());
- sb.append(DELIMITER_TAG);
- sb.append(entry.getKey());
- }
- return sb.toString();
- }
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/mail/Part.java b/email2/emailcommon/src/com/android/emailcommon/mail/Part.java
deleted file mode 100644
index eeb233ca9..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/mail/Part.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.mail;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-public interface Part extends Fetchable {
- public void addHeader(String name, String value) throws MessagingException;
-
- public void removeHeader(String name) throws MessagingException;
-
- public void setHeader(String name, String value) throws MessagingException;
-
- public Body getBody() throws MessagingException;
-
- public String getContentType() throws MessagingException;
-
- public String getDisposition() throws MessagingException;
-
- public String getContentId() throws MessagingException;
-
- public String[] getHeader(String name) throws MessagingException;
-
- public void setExtendedHeader(String name, String value) throws MessagingException;
-
- public String getExtendedHeader(String name) throws MessagingException;
-
- public int getSize() throws MessagingException;
-
- public boolean isMimeType(String mimeType) throws MessagingException;
-
- public String getMimeType() throws MessagingException;
-
- public void setBody(Body body) throws MessagingException;
-
- public void writeTo(OutputStream out) throws IOException, MessagingException;
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/provider/Account.java b/email2/emailcommon/src/com/android/emailcommon/provider/Account.java
deleted file mode 100755
index 7c7710a4d..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/provider/Account.java
+++ /dev/null
@@ -1,945 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.provider;
-
-import android.content.ContentProviderOperation;
-import android.content.ContentProviderResult;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.OperationApplicationException;
-import android.database.Cursor;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.net.Uri;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.RemoteException;
-
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.utility.Utility;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-public final class Account extends EmailContent implements AccountColumns, Parcelable {
- public static final String TABLE_NAME = "Account";
- public static final Uri CONTENT_URI = Uri.parse(EmailContent.CONTENT_URI + "/account");
- public static final Uri ADD_TO_FIELD_URI =
- Uri.parse(EmailContent.CONTENT_URI + "/accountIdAddToField");
- public static final Uri RESET_NEW_MESSAGE_COUNT_URI =
- Uri.parse(EmailContent.CONTENT_URI + "/resetNewMessageCount");
- public static final Uri NOTIFIER_URI =
- Uri.parse(EmailContent.CONTENT_NOTIFIER_URI + "/account");
- public static final Uri DEFAULT_ACCOUNT_ID_URI =
- Uri.parse(EmailContent.CONTENT_URI + "/account/default");
-
- // Define all pseudo account IDs here to avoid conflict with one another.
- /**
- * Pseudo account ID to represent a "combined account" that includes messages and mailboxes
- * from all defined accounts.
- *
- * <em>IMPORTANT</em>: This must never be stored to the database.
- */
- public static final long ACCOUNT_ID_COMBINED_VIEW = 0x1000000000000000L;
- /**
- * Pseudo account ID to represent "no account". This may be used any time the account ID
- * may not be known or when we want to specifically select "no" account.
- *
- * <em>IMPORTANT</em>: This must never be stored to the database.
- */
- public static final long NO_ACCOUNT = -1L;
-
- // Whether or not the user has asked for notifications of new mail in this account
- public final static int FLAGS_NOTIFY_NEW_MAIL = 1<<0;
- // Whether or not the user has asked for vibration notifications with all new mail
- public final static int FLAGS_VIBRATE_ALWAYS = 1<<1;
- // Bit mask for the account's deletion policy (see DELETE_POLICY_x below)
- public static final int FLAGS_DELETE_POLICY_MASK = 1<<2 | 1<<3;
- public static final int FLAGS_DELETE_POLICY_SHIFT = 2;
- // Whether the account is in the process of being created; any account reconciliation code
- // MUST ignore accounts with this bit set; in addition, ContentObservers for this data
- // SHOULD consider the state of this flag during operation
- public static final int FLAGS_INCOMPLETE = 1<<4;
- // Security hold is used when the device is not in compliance with security policies
- // required by the server; in this state, the user MUST be alerted to the need to update
- // security settings. Sync adapters SHOULD NOT attempt to sync when this flag is set.
- public static final int FLAGS_SECURITY_HOLD = 1<<5;
- // Whether or not the user has asked for vibration notifications when the ringer is silent
- public static final int FLAGS_VIBRATE_WHEN_SILENT = 1<<6;
- // Whether the account supports "smart forward" (i.e. the server appends the original
- // message along with any attachments to the outgoing message)
- public static final int FLAGS_SUPPORTS_SMART_FORWARD = 1<<7;
- // Whether the account should try to cache attachments in the background
- public static final int FLAGS_BACKGROUND_ATTACHMENTS = 1<<8;
- // Available to sync adapter
- public static final int FLAGS_SYNC_ADAPTER = 1<<9;
- // Sync disabled is a status commanded by the server; the sync adapter SHOULD NOT try to
- // sync mailboxes in this account automatically. A manual sync request to sync a mailbox
- // with sync disabled SHOULD try to sync and report any failure result via the UI.
- public static final int FLAGS_SYNC_DISABLED = 1<<10;
- // Whether or not server-side search is supported by this account
- public static final int FLAGS_SUPPORTS_SEARCH = 1<<11;
- // Whether or not server-side search supports global search (i.e. all mailboxes); only valid
- // if FLAGS_SUPPORTS_SEARCH is true
- public static final int FLAGS_SUPPORTS_GLOBAL_SEARCH = 1<<12;
-
- // Deletion policy (see FLAGS_DELETE_POLICY_MASK, above)
- public static final int DELETE_POLICY_NEVER = 0;
- public static final int DELETE_POLICY_7DAYS = 1<<0; // not supported
- public static final int DELETE_POLICY_ON_DELETE = 1<<1;
-
- // Sentinel values for the mSyncInterval field of both Account records
- public static final int CHECK_INTERVAL_NEVER = -1;
- public static final int CHECK_INTERVAL_PUSH = -2;
-
- public String mDisplayName;
- public String mEmailAddress;
- public String mSyncKey;
- public int mSyncLookback;
- public int mSyncInterval;
- public long mHostAuthKeyRecv;
- public long mHostAuthKeySend;
- public int mFlags;
- public boolean mIsDefault; // note: callers should use getDefaultAccountId()
- public String mCompatibilityUuid;
- public String mSenderName;
- public String mRingtoneUri;
- public String mProtocolVersion;
- public int mNewMessageCount;
- public String mSecuritySyncKey;
- public String mSignature;
- public long mPolicyKey;
-
- // Convenience for creating/working with an account
- public transient HostAuth mHostAuthRecv;
- public transient HostAuth mHostAuthSend;
- public transient Policy mPolicy;
- // Might hold the corresponding AccountManager account structure
- public transient android.accounts.Account mAmAccount;
-
- public static final int CONTENT_ID_COLUMN = 0;
- public static final int CONTENT_DISPLAY_NAME_COLUMN = 1;
- public static final int CONTENT_EMAIL_ADDRESS_COLUMN = 2;
- public static final int CONTENT_SYNC_KEY_COLUMN = 3;
- public static final int CONTENT_SYNC_LOOKBACK_COLUMN = 4;
- public static final int CONTENT_SYNC_INTERVAL_COLUMN = 5;
- public static final int CONTENT_HOST_AUTH_KEY_RECV_COLUMN = 6;
- public static final int CONTENT_HOST_AUTH_KEY_SEND_COLUMN = 7;
- public static final int CONTENT_FLAGS_COLUMN = 8;
- public static final int CONTENT_IS_DEFAULT_COLUMN = 9;
- public static final int CONTENT_COMPATIBILITY_UUID_COLUMN = 10;
- public static final int CONTENT_SENDER_NAME_COLUMN = 11;
- public static final int CONTENT_RINGTONE_URI_COLUMN = 12;
- public static final int CONTENT_PROTOCOL_VERSION_COLUMN = 13;
- public static final int CONTENT_NEW_MESSAGE_COUNT_COLUMN = 14;
- public static final int CONTENT_SECURITY_SYNC_KEY_COLUMN = 15;
- public static final int CONTENT_SIGNATURE_COLUMN = 16;
- public static final int CONTENT_POLICY_KEY = 17;
-
- public static final String[] CONTENT_PROJECTION = new String[] {
- RECORD_ID, AccountColumns.DISPLAY_NAME,
- AccountColumns.EMAIL_ADDRESS, AccountColumns.SYNC_KEY, AccountColumns.SYNC_LOOKBACK,
- AccountColumns.SYNC_INTERVAL, AccountColumns.HOST_AUTH_KEY_RECV,
- AccountColumns.HOST_AUTH_KEY_SEND, AccountColumns.FLAGS, AccountColumns.IS_DEFAULT,
- AccountColumns.COMPATIBILITY_UUID, AccountColumns.SENDER_NAME,
- AccountColumns.RINGTONE_URI, AccountColumns.PROTOCOL_VERSION,
- AccountColumns.NEW_MESSAGE_COUNT, AccountColumns.SECURITY_SYNC_KEY,
- AccountColumns.SIGNATURE, AccountColumns.POLICY_KEY
- };
-
- public static final int CONTENT_MAILBOX_TYPE_COLUMN = 1;
-
- /**
- * This projection is for listing account id's only
- */
- public static final String[] ID_TYPE_PROJECTION = new String[] {
- RECORD_ID, MailboxColumns.TYPE
- };
-
- public static final int ACCOUNT_FLAGS_COLUMN_ID = 0;
- public static final int ACCOUNT_FLAGS_COLUMN_FLAGS = 1;
- public static final String[] ACCOUNT_FLAGS_PROJECTION = new String[] {
- AccountColumns.ID, AccountColumns.FLAGS};
-
- public static final String MAILBOX_SELECTION =
- MessageColumns.MAILBOX_KEY + " =?";
-
- public static final String UNREAD_COUNT_SELECTION =
- MessageColumns.MAILBOX_KEY + " =? and " + MessageColumns.FLAG_READ + "= 0";
-
- private static final String UUID_SELECTION = AccountColumns.COMPATIBILITY_UUID + " =?";
-
- public static final String SECURITY_NONZERO_SELECTION =
- Account.POLICY_KEY + " IS NOT NULL AND " + Account.POLICY_KEY + "!=0";
-
- private static final String FIND_INBOX_SELECTION =
- MailboxColumns.TYPE + " = " + Mailbox.TYPE_INBOX +
- " AND " + MailboxColumns.ACCOUNT_KEY + " =?";
-
- /**
- * no public constructor since this is a utility class
- */
- public Account() {
- mBaseUri = CONTENT_URI;
-
- // other defaults (policy)
- mRingtoneUri = "content://settings/system/notification_sound";
- mSyncInterval = -1;
- mSyncLookback = -1;
- mFlags = FLAGS_NOTIFY_NEW_MAIL;
- mCompatibilityUuid = UUID.randomUUID().toString();
- }
-
- public static Account restoreAccountWithId(Context context, long id) {
- return EmailContent.restoreContentWithId(context, Account.class,
- Account.CONTENT_URI, Account.CONTENT_PROJECTION, id);
- }
-
- /**
- * Returns {@code true} if the given account ID is a "normal" account. Normal accounts
- * always have an ID greater than {@code 0} and not equal to any pseudo account IDs
- * (such as {@link #ACCOUNT_ID_COMBINED_VIEW})
- */
- public static boolean isNormalAccount(long accountId) {
- return (accountId > 0L) && (accountId != ACCOUNT_ID_COMBINED_VIEW);
- }
-
- /**
- * Refresh an account that has already been loaded. This is slightly less expensive
- * that generating a brand-new account object.
- */
- public void refresh(Context context) {
- Cursor c = context.getContentResolver().query(getUri(), Account.CONTENT_PROJECTION,
- null, null, null);
- try {
- c.moveToFirst();
- restore(c);
- } finally {
- if (c != null) {
- c.close();
- }
- }
- }
-
- @Override
- public void restore(Cursor cursor) {
- mId = cursor.getLong(CONTENT_ID_COLUMN);
- mBaseUri = CONTENT_URI;
- mDisplayName = cursor.getString(CONTENT_DISPLAY_NAME_COLUMN);
- mEmailAddress = cursor.getString(CONTENT_EMAIL_ADDRESS_COLUMN);
- mSyncKey = cursor.getString(CONTENT_SYNC_KEY_COLUMN);
- mSyncLookback = cursor.getInt(CONTENT_SYNC_LOOKBACK_COLUMN);
- mSyncInterval = cursor.getInt(CONTENT_SYNC_INTERVAL_COLUMN);
- mHostAuthKeyRecv = cursor.getLong(CONTENT_HOST_AUTH_KEY_RECV_COLUMN);
- mHostAuthKeySend = cursor.getLong(CONTENT_HOST_AUTH_KEY_SEND_COLUMN);
- mFlags = cursor.getInt(CONTENT_FLAGS_COLUMN);
- mIsDefault = cursor.getInt(CONTENT_IS_DEFAULT_COLUMN) == 1;
- mCompatibilityUuid = cursor.getString(CONTENT_COMPATIBILITY_UUID_COLUMN);
- mSenderName = cursor.getString(CONTENT_SENDER_NAME_COLUMN);
- mRingtoneUri = cursor.getString(CONTENT_RINGTONE_URI_COLUMN);
- mProtocolVersion = cursor.getString(CONTENT_PROTOCOL_VERSION_COLUMN);
- mNewMessageCount = cursor.getInt(CONTENT_NEW_MESSAGE_COUNT_COLUMN);
- mSecuritySyncKey = cursor.getString(CONTENT_SECURITY_SYNC_KEY_COLUMN);
- mSignature = cursor.getString(CONTENT_SIGNATURE_COLUMN);
- mPolicyKey = cursor.getLong(CONTENT_POLICY_KEY);
- }
-
- private long getId(Uri u) {
- return Long.parseLong(u.getPathSegments().get(1));
- }
-
- /**
- * @return the user-visible name for the account
- */
- public String getDisplayName() {
- return mDisplayName;
- }
-
- /**
- * Set the description. Be sure to call save() to commit to database.
- * @param description the new description
- */
- public void setDisplayName(String description) {
- mDisplayName = description;
- }
-
- /**
- * @return the email address for this account
- */
- public String getEmailAddress() {
- return mEmailAddress;
- }
-
- /**
- * Set the Email address for this account. Be sure to call save() to commit to database.
- * @param emailAddress the new email address for this account
- */
- public void setEmailAddress(String emailAddress) {
- mEmailAddress = emailAddress;
- }
-
- /**
- * @return the sender's name for this account
- */
- public String getSenderName() {
- return mSenderName;
- }
-
- /**
- * Set the sender's name. Be sure to call save() to commit to database.
- * @param name the new sender name
- */
- public void setSenderName(String name) {
- mSenderName = name;
- }
-
- public String getSignature() {
- return mSignature;
- }
-
- public void setSignature(String signature) {
- mSignature = signature;
- }
-
- /**
- * @return the minutes per check (for polling)
- * TODO define sentinel values for "never", "push", etc. See Account.java
- */
- public int getSyncInterval() {
- return mSyncInterval;
- }
-
- /**
- * Set the minutes per check (for polling). Be sure to call save() to commit to database.
- * TODO define sentinel values for "never", "push", etc. See Account.java
- * @param minutes the number of minutes between polling checks
- */
- public void setSyncInterval(int minutes) {
- mSyncInterval = minutes;
- }
-
- /**
- * @return One of the {@code Account.SYNC_WINDOW_*} constants that represents the sync
- * lookback window.
- * TODO define sentinel values for "all", "1 month", etc. See Account.java
- */
- public int getSyncLookback() {
- return mSyncLookback;
- }
-
- /**
- * Set the sync lookback window. Be sure to call save() to commit to database.
- * TODO define sentinel values for "all", "1 month", etc. See Account.java
- * @param value One of the {@link com.android.emailcommon.service.SyncWindow} constants
- */
- public void setSyncLookback(int value) {
- mSyncLookback = value;
- }
-
- /**
- * @return the flags for this account
- * @see #FLAGS_NOTIFY_NEW_MAIL
- * @see #FLAGS_VIBRATE_ALWAYS
- * @see #FLAGS_VIBRATE_WHEN_SILENT
- */
- public int getFlags() {
- return mFlags;
- }
-
- /**
- * Set the flags for this account
- * @see #FLAGS_NOTIFY_NEW_MAIL
- * @see #FLAGS_VIBRATE_ALWAYS
- * @see #FLAGS_VIBRATE_WHEN_SILENT
- * @param newFlags the new value for the flags
- */
- public void setFlags(int newFlags) {
- mFlags = newFlags;
- }
-
- /**
- * @return the ringtone Uri for this account
- */
- public String getRingtone() {
- return mRingtoneUri;
- }
-
- /**
- * Set the ringtone Uri for this account
- * @param newUri the new URI string for the ringtone for this account
- */
- public void setRingtone(String newUri) {
- mRingtoneUri = newUri;
- }
-
- /**
- * Set the "delete policy" as a simple 0,1,2 value set.
- * @param newPolicy the new delete policy
- */
- public void setDeletePolicy(int newPolicy) {
- mFlags &= ~FLAGS_DELETE_POLICY_MASK;
- mFlags |= (newPolicy << FLAGS_DELETE_POLICY_SHIFT) & FLAGS_DELETE_POLICY_MASK;
- }
-
- /**
- * Return the "delete policy" as a simple 0,1,2 value set.
- * @return the current delete policy
- */
- public int getDeletePolicy() {
- return (mFlags & FLAGS_DELETE_POLICY_MASK) >> FLAGS_DELETE_POLICY_SHIFT;
- }
-
- /**
- * Return the Uuid associated with this account. This is primarily for compatibility
- * with accounts set up by previous versions, because there are externals references
- * to the Uuid (e.g. desktop shortcuts).
- */
- public String getUuid() {
- return mCompatibilityUuid;
- }
-
- public HostAuth getOrCreateHostAuthSend(Context context) {
- if (mHostAuthSend == null) {
- if (mHostAuthKeySend != 0) {
- mHostAuthSend = HostAuth.restoreHostAuthWithId(context, mHostAuthKeySend);
- } else {
- mHostAuthSend = new HostAuth();
- }
- }
- return mHostAuthSend;
- }
-
- public HostAuth getOrCreateHostAuthRecv(Context context) {
- if (mHostAuthRecv == null) {
- if (mHostAuthKeyRecv != 0) {
- mHostAuthRecv = HostAuth.restoreHostAuthWithId(context, mHostAuthKeyRecv);
- } else {
- mHostAuthRecv = new HostAuth();
- }
- }
- return mHostAuthRecv;
- }
-
- /**
- * For compatibility while converting to provider model, generate a "local store URI"
- *
- * @return a string in the form of a Uri, as used by the other parts of the email app
- */
- public String getLocalStoreUri(Context context) {
- return "local://localhost/" + context.getDatabasePath(getUuid() + ".db");
- }
-
- /**
- * @return true if the account supports "search".
- */
- public static boolean supportsServerSearch(Context context, long accountId) {
- Account account = Account.restoreAccountWithId(context, accountId);
- if (account == null) return false;
- return (account.mFlags & Account.FLAGS_SUPPORTS_SEARCH) != 0;
- }
-
- /**
- * Set the account to be the default account. If this is set to "true", when the account
- * is saved, all other accounts will have the same value set to "false".
- * @param newDefaultState the new default state - if true, others will be cleared.
- */
- public void setDefaultAccount(boolean newDefaultState) {
- mIsDefault = newDefaultState;
- }
-
- /**
- * @return {@link Uri} to this {@link Account} in the
- * {@code content://com.android.email.provider/account/UUID} format, which is safe to use
- * for desktop shortcuts.
- *
- * <p>We don't want to store _id in shortcuts, because
- * {@link com.android.email.provider.AccountBackupRestore} won't preserve it.
- */
- public Uri getShortcutSafeUri() {
- return getShortcutSafeUriFromUuid(mCompatibilityUuid);
- }
-
- /**
- * @return {@link Uri} to an {@link Account} with a {@code uuid}.
- */
- public static Uri getShortcutSafeUriFromUuid(String uuid) {
- return CONTENT_URI.buildUpon().appendEncodedPath(uuid).build();
- }
-
- /**
- * Parse {@link Uri} in the {@code content://com.android.email.provider/account/ID} format
- * where ID = account id (used on Eclair, Android 2.0-2.1) or UUID, and return _id of
- * the {@link Account} associated with it.
- *
- * @param context context to access DB
- * @param uri URI of interest
- * @return _id of the {@link Account} associated with ID, or -1 if none found.
- */
- public static long getAccountIdFromShortcutSafeUri(Context context, Uri uri) {
- // Make sure the URI is in the correct format.
- if (!"content".equals(uri.getScheme())
- || !AUTHORITY.equals(uri.getAuthority())) {
- return -1;
- }
-
- final List<String> ps = uri.getPathSegments();
- if (ps.size() != 2 || !"account".equals(ps.get(0))) {
- return -1;
- }
-
- // Now get the ID part.
- final String id = ps.get(1);
-
- // First, see if ID can be parsed as long. (Eclair-style)
- // (UUIDs have '-' in them, so they are always non-parsable.)
- try {
- return Long.parseLong(id);
- } catch (NumberFormatException ok) {
- // OK, it's not a long. Continue...
- }
-
- // Now id is a UUId.
- return getAccountIdFromUuid(context, id);
- }
-
- /**
- * @return ID of the account with the given UUID.
- */
- public static long getAccountIdFromUuid(Context context, String uuid) {
- return Utility.getFirstRowLong(context,
- CONTENT_URI, ID_PROJECTION,
- UUID_SELECTION, new String[] {uuid}, null, 0, -1L);
- }
-
- /**
- * Return the id of the default account. If one hasn't been explicitly specified, return
- * the first one in the database (the logic is provided within EmailProvider)
- * @param context the caller's context
- * @return the id of the default account, or Account.NO_ACCOUNT if there are no accounts
- */
- static public long getDefaultAccountId(Context context) {
- Cursor c = context.getContentResolver().query(
- Account.DEFAULT_ACCOUNT_ID_URI, Account.ID_PROJECTION, null, null, null);
- try {
- if (c != null && c.moveToFirst()) {
- return c.getLong(Account.ID_PROJECTION_COLUMN);
- }
- } finally {
- c.close();
- }
- return Account.NO_ACCOUNT;
- }
-
- /**
- * Given an account id, return the account's protocol
- * @param context the caller's context
- * @param accountId the id of the account to be examined
- * @return the account's protocol (or null if the Account or HostAuth do not exist)
- */
- public static String getProtocol(Context context, long accountId) {
- Account account = Account.restoreAccountWithId(context, accountId);
- if (account != null) {
- return account.getProtocol(context);
- }
- return null;
- }
-
- /**
- * Return the account's protocol
- * @param context the caller's context
- * @return the account's protocol (or null if the HostAuth doesn't not exist)
- */
- public String getProtocol(Context context) {
- HostAuth hostAuth = HostAuth.restoreHostAuthWithId(context, mHostAuthKeyRecv);
- if (hostAuth != null) {
- return hostAuth.mProtocol;
- }
- return null;
- }
-
- /**
- * Return the account ID for a message with a given id
- *
- * @param context the caller's context
- * @param messageId the id of the message
- * @return the account ID, or -1 if the account doesn't exist
- */
- public static long getAccountIdForMessageId(Context context, long messageId) {
- return Message.getKeyColumnLong(context, messageId, MessageColumns.ACCOUNT_KEY);
- }
-
- /**
- * Return the account for a message with a given id
- * @param context the caller's context
- * @param messageId the id of the message
- * @return the account, or null if the account doesn't exist
- */
- public static Account getAccountForMessageId(Context context, long messageId) {
- long accountId = getAccountIdForMessageId(context, messageId);
- if (accountId != -1) {
- return Account.restoreAccountWithId(context, accountId);
- }
- return null;
- }
-
- /**
- * @return true if an {@code accountId} is assigned to any existing account.
- */
- public static boolean isValidId(Context context, long accountId) {
- return null != Utility.getFirstRowLong(context, CONTENT_URI, ID_PROJECTION,
- ID_SELECTION, new String[] {Long.toString(accountId)}, null,
- ID_PROJECTION_COLUMN);
- }
-
- /**
- * Check a single account for security hold status.
- */
- public static boolean isSecurityHold(Context context, long accountId) {
- return (Utility.getFirstRowLong(context,
- ContentUris.withAppendedId(Account.CONTENT_URI, accountId),
- ACCOUNT_FLAGS_PROJECTION, null, null, null, ACCOUNT_FLAGS_COLUMN_FLAGS, 0L)
- & Account.FLAGS_SECURITY_HOLD) != 0;
- }
-
- /**
- * @return id of the "inbox" mailbox, or -1 if not found.
- */
- public static long getInboxId(Context context, long accountId) {
- return Utility.getFirstRowLong(context, Mailbox.CONTENT_URI, ID_PROJECTION,
- FIND_INBOX_SELECTION, new String[] {Long.toString(accountId)}, null,
- ID_PROJECTION_COLUMN, -1L);
- }
-
- /**
- * Clear all account hold flags that are set.
- *
- * (This will trigger watchers, and in particular will cause EAS to try and resync the
- * account(s).)
- */
- public static void clearSecurityHoldOnAllAccounts(Context context) {
- ContentResolver resolver = context.getContentResolver();
- Cursor c = resolver.query(Account.CONTENT_URI, ACCOUNT_FLAGS_PROJECTION,
- SECURITY_NONZERO_SELECTION, null, null);
- try {
- while (c.moveToNext()) {
- int flags = c.getInt(ACCOUNT_FLAGS_COLUMN_FLAGS);
-
- if (0 != (flags & FLAGS_SECURITY_HOLD)) {
- ContentValues cv = new ContentValues();
- cv.put(AccountColumns.FLAGS, flags & ~FLAGS_SECURITY_HOLD);
- long accountId = c.getLong(ACCOUNT_FLAGS_COLUMN_ID);
- Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, accountId);
- resolver.update(uri, cv, null, null);
- }
- }
- } finally {
- c.close();
- }
- }
-
- /**
- * Given an account id, determine whether the account is currently prohibited from automatic
- * sync, due to roaming while the account's policy disables this
- * @param context the caller's context
- * @param accountId the account id
- * @return true if the account can't automatically sync due to roaming; false otherwise
- */
- public static boolean isAutomaticSyncDisabledByRoaming(Context context, long accountId) {
- Account account = Account.restoreAccountWithId(context, accountId);
- // Account being deleted; just return
- if (account == null) return false;
- long policyKey = account.mPolicyKey;
- // If no security policy, we're good
- if (policyKey <= 0) return false;
-
- ConnectivityManager cm =
- (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo info = cm.getActiveNetworkInfo();
- // If we're not on mobile, we're good
- if (info == null || (info.getType() != ConnectivityManager.TYPE_MOBILE)) return false;
- // If we're not roaming, we're good
- if (!info.isRoaming()) return false;
- Policy policy = Policy.restorePolicyWithId(context, policyKey);
- // Account being deleted; just return
- if (policy == null) return false;
- return policy.mRequireManualSyncWhenRoaming;
- }
-
- /**
- * Override update to enforce a single default account, and do it atomically
- */
- @Override
- public int update(Context context, ContentValues cv) {
- if (cv.containsKey(AccountColumns.IS_DEFAULT) &&
- cv.getAsBoolean(AccountColumns.IS_DEFAULT)) {
- ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
- ContentValues cv1 = new ContentValues();
- cv1.put(AccountColumns.IS_DEFAULT, false);
- // Clear the default flag in all accounts
- ops.add(ContentProviderOperation.newUpdate(CONTENT_URI).withValues(cv1).build());
- // Update this account
- ops.add(ContentProviderOperation
- .newUpdate(ContentUris.withAppendedId(CONTENT_URI, mId))
- .withValues(cv).build());
- try {
- context.getContentResolver().applyBatch(AUTHORITY, ops);
- return 1;
- } catch (RemoteException e) {
- // There is nothing to be done here; fail by returning 0
- } catch (OperationApplicationException e) {
- // There is nothing to be done here; fail by returning 0
- }
- return 0;
- }
- return super.update(context, cv);
- }
-
- /*
- * Override this so that we can store the HostAuth's first and link them to the Account
- * (non-Javadoc)
- * @see com.android.email.provider.EmailContent#save(android.content.Context)
- */
- @Override
- public Uri save(Context context) {
- if (isSaved()) {
- throw new UnsupportedOperationException();
- }
- // This logic is in place so I can (a) short circuit the expensive stuff when
- // possible, and (b) override (and throw) if anyone tries to call save() or update()
- // directly for Account, which are unsupported.
- if (mHostAuthRecv == null && mHostAuthSend == null && mIsDefault == false &&
- mPolicy != null) {
- return super.save(context);
- }
-
- int index = 0;
- int recvIndex = -1;
- int sendIndex = -1;
-
- // Create operations for saving the send and recv hostAuths
- // Also, remember which operation in the array they represent
- ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
- if (mHostAuthRecv != null) {
- recvIndex = index++;
- ops.add(ContentProviderOperation.newInsert(mHostAuthRecv.mBaseUri)
- .withValues(mHostAuthRecv.toContentValues())
- .build());
- }
- if (mHostAuthSend != null) {
- sendIndex = index++;
- ops.add(ContentProviderOperation.newInsert(mHostAuthSend.mBaseUri)
- .withValues(mHostAuthSend.toContentValues())
- .build());
- }
-
- // Create operations for making this the only default account
- // Note, these are always updates because they change existing accounts
- if (mIsDefault) {
- index++;
- ContentValues cv1 = new ContentValues();
- cv1.put(AccountColumns.IS_DEFAULT, 0);
- ops.add(ContentProviderOperation.newUpdate(CONTENT_URI).withValues(cv1).build());
- }
-
- // Now do the Account
- ContentValues cv = null;
- if (recvIndex >= 0 || sendIndex >= 0) {
- cv = new ContentValues();
- if (recvIndex >= 0) {
- cv.put(Account.HOST_AUTH_KEY_RECV, recvIndex);
- }
- if (sendIndex >= 0) {
- cv.put(Account.HOST_AUTH_KEY_SEND, sendIndex);
- }
- }
-
- ContentProviderOperation.Builder b = ContentProviderOperation.newInsert(mBaseUri);
- b.withValues(toContentValues());
- if (cv != null) {
- b.withValueBackReferences(cv);
- }
- ops.add(b.build());
-
- try {
- ContentProviderResult[] results =
- context.getContentResolver().applyBatch(AUTHORITY, ops);
- // If saving, set the mId's of the various saved objects
- if (recvIndex >= 0) {
- long newId = getId(results[recvIndex].uri);
- mHostAuthKeyRecv = newId;
- mHostAuthRecv.mId = newId;
- }
- if (sendIndex >= 0) {
- long newId = getId(results[sendIndex].uri);
- mHostAuthKeySend = newId;
- mHostAuthSend.mId = newId;
- }
- Uri u = results[index].uri;
- mId = getId(u);
- return u;
- } catch (RemoteException e) {
- // There is nothing to be done here; fail by returning null
- } catch (OperationApplicationException e) {
- // There is nothing to be done here; fail by returning null
- }
- return null;
- }
-
- @Override
- public ContentValues toContentValues() {
- ContentValues values = new ContentValues();
- values.put(AccountColumns.DISPLAY_NAME, mDisplayName);
- values.put(AccountColumns.EMAIL_ADDRESS, mEmailAddress);
- values.put(AccountColumns.SYNC_KEY, mSyncKey);
- values.put(AccountColumns.SYNC_LOOKBACK, mSyncLookback);
- values.put(AccountColumns.SYNC_INTERVAL, mSyncInterval);
- values.put(AccountColumns.HOST_AUTH_KEY_RECV, mHostAuthKeyRecv);
- values.put(AccountColumns.HOST_AUTH_KEY_SEND, mHostAuthKeySend);
- values.put(AccountColumns.FLAGS, mFlags);
- values.put(AccountColumns.IS_DEFAULT, mIsDefault);
- values.put(AccountColumns.COMPATIBILITY_UUID, mCompatibilityUuid);
- values.put(AccountColumns.SENDER_NAME, mSenderName);
- values.put(AccountColumns.RINGTONE_URI, mRingtoneUri);
- values.put(AccountColumns.PROTOCOL_VERSION, mProtocolVersion);
- values.put(AccountColumns.NEW_MESSAGE_COUNT, mNewMessageCount);
- values.put(AccountColumns.SECURITY_SYNC_KEY, mSecuritySyncKey);
- values.put(AccountColumns.SIGNATURE, mSignature);
- values.put(AccountColumns.POLICY_KEY, mPolicyKey);
- return values;
- }
-
- /**
- * Supports Parcelable
- */
- @Override
- public int describeContents() {
- return 0;
- }
-
- /**
- * Supports Parcelable
- */
- public static final Parcelable.Creator<Account> CREATOR
- = new Parcelable.Creator<Account>() {
- @Override
- public Account createFromParcel(Parcel in) {
- return new Account(in);
- }
-
- @Override
- public Account[] newArray(int size) {
- return new Account[size];
- }
- };
-
- /**
- * Supports Parcelable
- */
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- // mBaseUri is not parceled
- dest.writeLong(mId);
- dest.writeString(mDisplayName);
- dest.writeString(mEmailAddress);
- dest.writeString(mSyncKey);
- dest.writeInt(mSyncLookback);
- dest.writeInt(mSyncInterval);
- dest.writeLong(mHostAuthKeyRecv);
- dest.writeLong(mHostAuthKeySend);
- dest.writeInt(mFlags);
- dest.writeByte(mIsDefault ? (byte)1 : (byte)0);
- dest.writeString(mCompatibilityUuid);
- dest.writeString(mSenderName);
- dest.writeString(mRingtoneUri);
- dest.writeString(mProtocolVersion);
- dest.writeInt(mNewMessageCount);
- dest.writeString(mSecuritySyncKey);
- dest.writeString(mSignature);
- dest.writeLong(mPolicyKey);
-
- if (mHostAuthRecv != null) {
- dest.writeByte((byte)1);
- mHostAuthRecv.writeToParcel(dest, flags);
- } else {
- dest.writeByte((byte)0);
- }
-
- if (mHostAuthSend != null) {
- dest.writeByte((byte)1);
- mHostAuthSend.writeToParcel(dest, flags);
- } else {
- dest.writeByte((byte)0);
- }
- }
-
- /**
- * Supports Parcelable
- */
- public Account(Parcel in) {
- mBaseUri = Account.CONTENT_URI;
- mId = in.readLong();
- mDisplayName = in.readString();
- mEmailAddress = in.readString();
- mSyncKey = in.readString();
- mSyncLookback = in.readInt();
- mSyncInterval = in.readInt();
- mHostAuthKeyRecv = in.readLong();
- mHostAuthKeySend = in.readLong();
- mFlags = in.readInt();
- mIsDefault = in.readByte() == 1;
- mCompatibilityUuid = in.readString();
- mSenderName = in.readString();
- mRingtoneUri = in.readString();
- mProtocolVersion = in.readString();
- mNewMessageCount = in.readInt();
- mSecuritySyncKey = in.readString();
- mSignature = in.readString();
- mPolicyKey = in.readLong();
-
- mHostAuthRecv = null;
- if (in.readByte() == 1) {
- mHostAuthRecv = new HostAuth(in);
- }
-
- mHostAuthSend = null;
- if (in.readByte() == 1) {
- mHostAuthSend = new HostAuth(in);
- }
- }
-
- /**
- * For debugger support only - DO NOT use for code.
- */
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder('[');
- if (mHostAuthRecv != null && mHostAuthRecv.mProtocol != null) {
- sb.append(mHostAuthRecv.mProtocol);
- sb.append(':');
- }
- if (mDisplayName != null) sb.append(mDisplayName);
- sb.append(':');
- if (mEmailAddress != null) sb.append(mEmailAddress);
- sb.append(':');
- if (mSenderName != null) sb.append(mSenderName);
- sb.append(']');
- return sb.toString();
- }
-} \ No newline at end of file
diff --git a/email2/emailcommon/src/com/android/emailcommon/provider/EmailContent.java b/email2/emailcommon/src/com/android/emailcommon/provider/EmailContent.java
deleted file mode 100755
index 7a6d4555e..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/provider/EmailContent.java
+++ /dev/null
@@ -1,1564 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.provider;
-
-import android.content.ContentProviderOperation;
-import android.content.ContentProviderResult;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.OperationApplicationException;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Environment;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.RemoteException;
-
-import com.android.emailcommon.utility.TextUtilities;
-import com.android.emailcommon.utility.Utility;
-import com.android.mail.providers.UIProvider;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.io.File;
-import java.util.ArrayList;
-
-
-/**
- * EmailContent is the superclass of the various classes of content stored by EmailProvider.
- *
- * It is intended to include 1) column definitions for use with the Provider, and 2) convenience
- * methods for saving and retrieving content from the Provider.
- *
- * This class will be used by 1) the Email process (which includes the application and
- * EmaiLProvider) as well as 2) the Exchange process (which runs independently). It will
- * necessarily be cloned for use in these two cases.
- *
- * Conventions used in naming columns:
- * RECORD_ID is the primary key for all Email records
- * The SyncColumns interface is used by all classes that are synced to the server directly
- * (Mailbox and Email)
- *
- * <name>_KEY always refers to a foreign key
- * <name>_ID always refers to a unique identifier (whether on client, server, etc.)
- *
- */
-public abstract class EmailContent {
-
- public static final String AUTHORITY = "com.android.email.provider";
- // The notifier authority is used to send notifications regarding changes to messages (insert,
- // delete, or update) and is intended as an optimization for use by clients of message list
- // cursors (initially, the email AppWidget).
- public static final String NOTIFIER_AUTHORITY = "com.android.email.notifier";
-
- public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
- public static final String PARAMETER_LIMIT = "limit";
-
- public static final Uri CONTENT_NOTIFIER_URI = Uri.parse("content://" + NOTIFIER_AUTHORITY);
-
- public static final Uri MAILBOX_NOTIFICATION_URI =
- Uri.parse("content://" + EmailContent.AUTHORITY + "/mailboxNotification");
- public static final String[] NOTIFICATION_PROJECTION =
- new String[] {MailboxColumns.ID, MailboxColumns.UNREAD_COUNT, MailboxColumns.MESSAGE_COUNT};
- public static final int NOTIFICATION_MAILBOX_ID_COLUMN = 0;
- public static final int NOTIFICATION_MAILBOX_UNREAD_COUNT_COLUMN = 1;
- public static final int NOTIFICATION_MAILBOX_MESSAGE_COUNT_COLUMN = 2;
-
- public static final Uri MAILBOX_MOST_RECENT_MESSAGE_URI =
- Uri.parse("content://" + EmailContent.AUTHORITY + "/mailboxMostRecentMessage");
-
- public static final Uri ACCOUNT_CHECK_URI =
- Uri.parse("content://" + EmailContent.AUTHORITY + "/accountCheck");
-
- public static final String PROVIDER_PERMISSION = "com.android.email.permission.ACCESS_PROVIDER";
-
- // All classes share this
- public static final String RECORD_ID = "_id";
-
- public static final String[] COUNT_COLUMNS = new String[]{"count(*)"};
-
- /**
- * This projection can be used with any of the EmailContent classes, when all you need
- * is a list of id's. Use ID_PROJECTION_COLUMN to access the row data.
- */
- public static final String[] ID_PROJECTION = new String[] {
- RECORD_ID
- };
- public static final int ID_PROJECTION_COLUMN = 0;
-
- public static final String ID_SELECTION = RECORD_ID + " =?";
-
- public static final String FIELD_COLUMN_NAME = "field";
- public static final String ADD_COLUMN_NAME = "add";
- public static final String SET_COLUMN_NAME = "set";
-
- public static final int SYNC_STATUS_NONE = UIProvider.SyncStatus.NO_SYNC;
- public static final int SYNC_STATUS_USER = UIProvider.SyncStatus.USER_REFRESH;
- public static final int SYNC_STATUS_BACKGROUND = UIProvider.SyncStatus.BACKGROUND_SYNC;
-
- public static final int LAST_SYNC_RESULT_SUCCESS = UIProvider.LastSyncResult.SUCCESS;
- public static final int LAST_SYNC_RESULT_AUTH_ERROR = UIProvider.LastSyncResult.AUTH_ERROR;
- public static final int LAST_SYNC_RESULT_SECURITY_ERROR =
- UIProvider.LastSyncResult.SECURITY_ERROR;
- public static final int LAST_SYNC_RESULT_CONNECTION_ERROR =
- UIProvider.LastSyncResult.CONNECTION_ERROR;
- public static final int LAST_SYNC_RESULT_INTERNAL_ERROR =
- UIProvider.LastSyncResult.INTERNAL_ERROR;
-
- // Newly created objects get this id
- public static final int NOT_SAVED = -1;
- // The base Uri that this piece of content came from
- public Uri mBaseUri;
- // Lazily initialized uri for this Content
- private Uri mUri = null;
- // The id of the Content
- public long mId = NOT_SAVED;
-
- // Write the Content into a ContentValues container
- public abstract ContentValues toContentValues();
- // Read the Content from a ContentCursor
- public abstract void restore (Cursor cursor);
-
- // The Uri is lazily initialized
- public Uri getUri() {
- if (mUri == null) {
- mUri = ContentUris.withAppendedId(mBaseUri, mId);
- }
- return mUri;
- }
-
- public boolean isSaved() {
- return mId != NOT_SAVED;
- }
-
-
- /**
- * Restore a subclass of EmailContent from the database
- * @param context the caller's context
- * @param klass the class to restore
- * @param contentUri the content uri of the EmailContent subclass
- * @param contentProjection the content projection for the EmailContent subclass
- * @param id the unique id of the object
- * @return the instantiated object
- */
- public static <T extends EmailContent> T restoreContentWithId(Context context,
- Class<T> klass, Uri contentUri, String[] contentProjection, long id) {
- Uri u = ContentUris.withAppendedId(contentUri, id);
- Cursor c = context.getContentResolver().query(u, contentProjection, null, null, null);
- if (c == null) throw new ProviderUnavailableException();
- try {
- if (c.moveToFirst()) {
- return getContent(c, klass);
- } else {
- return null;
- }
- } finally {
- c.close();
- }
- }
-
-
- // The Content sub class must have a no-arg constructor
- static public <T extends EmailContent> T getContent(Cursor cursor, Class<T> klass) {
- try {
- T content = klass.newInstance();
- content.mId = cursor.getLong(0);
- content.restore(cursor);
- return content;
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InstantiationException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- public Uri save(Context context) {
- if (isSaved()) {
- throw new UnsupportedOperationException();
- }
- Uri res = context.getContentResolver().insert(mBaseUri, toContentValues());
- mId = Long.parseLong(res.getPathSegments().get(1));
- return res;
- }
-
- public int update(Context context, ContentValues contentValues) {
- if (!isSaved()) {
- throw new UnsupportedOperationException();
- }
- return context.getContentResolver().update(getUri(), contentValues, null, null);
- }
-
- static public int update(Context context, Uri baseUri, long id, ContentValues contentValues) {
- return context.getContentResolver()
- .update(ContentUris.withAppendedId(baseUri, id), contentValues, null, null);
- }
-
- static public int delete(Context context, Uri baseUri, long id) {
- return context.getContentResolver()
- .delete(ContentUris.withAppendedId(baseUri, id), null, null);
- }
-
- /**
- * Generic count method that can be used for any ContentProvider
- *
- * @param context the calling Context
- * @param uri the Uri for the provider query
- * @param selection as with a query call
- * @param selectionArgs as with a query call
- * @return the number of items matching the query (or zero)
- */
- static public int count(Context context, Uri uri, String selection, String[] selectionArgs) {
- return Utility.getFirstRowLong(context,
- uri, COUNT_COLUMNS, selection, selectionArgs, null, 0, Long.valueOf(0)).intValue();
- }
-
- /**
- * Same as {@link #count(Context, Uri, String, String[])} without selection.
- */
- static public int count(Context context, Uri uri) {
- return count(context, uri, null, null);
- }
-
- static public Uri uriWithLimit(Uri uri, int limit) {
- return uri.buildUpon().appendQueryParameter(EmailContent.PARAMETER_LIMIT,
- Integer.toString(limit)).build();
- }
-
- /**
- * no public constructor since this is a utility class
- */
- protected EmailContent() {
- }
-
- public interface SyncColumns {
- public static final String ID = "_id";
- // source id (string) : the source's name of this item
- public static final String SERVER_ID = "syncServerId";
- // source's timestamp (long) for this item
- public static final String SERVER_TIMESTAMP = "syncServerTimeStamp";
- }
-
- public interface BodyColumns {
- public static final String ID = "_id";
- // Foreign key to the message corresponding to this body
- public static final String MESSAGE_KEY = "messageKey";
- // The html content itself
- public static final String HTML_CONTENT = "htmlContent";
- // The plain text content itself
- public static final String TEXT_CONTENT = "textContent";
- // Replied-to or forwarded body (in html form)
- @Deprecated
- public static final String HTML_REPLY = "htmlReply";
- // Replied-to or forwarded body (in text form)
- @Deprecated
- public static final String TEXT_REPLY = "textReply";
- // A reference to a message's unique id used in reply/forward.
- // Protocol code can be expected to use this column in determining whether a message can be
- // deleted safely (i.e. isn't referenced by other messages)
- public static final String SOURCE_MESSAGE_KEY = "sourceMessageKey";
- // The text to be placed between a reply/forward response and the original message
- @Deprecated
- public static final String INTRO_TEXT = "introText";
- // The start of quoted text within our text content
- public static final String QUOTED_TEXT_START_POS = "quotedTextStartPos";
- }
-
- public static final class Body extends EmailContent implements BodyColumns {
- public static final String TABLE_NAME = "Body";
-
- @SuppressWarnings("hiding")
- public static final Uri CONTENT_URI = Uri.parse(EmailContent.CONTENT_URI + "/body");
-
- public static final int CONTENT_ID_COLUMN = 0;
- public static final int CONTENT_MESSAGE_KEY_COLUMN = 1;
- public static final int CONTENT_HTML_CONTENT_COLUMN = 2;
- public static final int CONTENT_TEXT_CONTENT_COLUMN = 3;
- @Deprecated
- public static final int CONTENT_HTML_REPLY_COLUMN = 4;
- @Deprecated
- public static final int CONTENT_TEXT_REPLY_COLUMN = 5;
- public static final int CONTENT_SOURCE_KEY_COLUMN = 6;
- @Deprecated
- public static final int CONTENT_INTRO_TEXT_COLUMN = 7;
- public static final int CONTENT_QUOTED_TEXT_START_POS_COLUMN = 8;
-
- public static final String[] CONTENT_PROJECTION = new String[] {
- RECORD_ID, BodyColumns.MESSAGE_KEY, BodyColumns.HTML_CONTENT, BodyColumns.TEXT_CONTENT,
- BodyColumns.HTML_REPLY, BodyColumns.TEXT_REPLY, BodyColumns.SOURCE_MESSAGE_KEY,
- BodyColumns.INTRO_TEXT, BodyColumns.QUOTED_TEXT_START_POS
- };
-
- public static final String[] COMMON_PROJECTION_TEXT = new String[] {
- RECORD_ID, BodyColumns.TEXT_CONTENT
- };
- public static final String[] COMMON_PROJECTION_HTML = new String[] {
- RECORD_ID, BodyColumns.HTML_CONTENT
- };
- @Deprecated
- public static final String[] COMMON_PROJECTION_REPLY_TEXT = new String[] {
- RECORD_ID, BodyColumns.TEXT_REPLY
- };
- @Deprecated
- public static final String[] COMMON_PROJECTION_REPLY_HTML = new String[] {
- RECORD_ID, BodyColumns.HTML_REPLY
- };
- @Deprecated
- public static final String[] COMMON_PROJECTION_INTRO = new String[] {
- RECORD_ID, BodyColumns.INTRO_TEXT
- };
- public static final String[] COMMON_PROJECTION_SOURCE = new String[] {
- RECORD_ID, BodyColumns.SOURCE_MESSAGE_KEY
- };
- public static final int COMMON_PROJECTION_COLUMN_TEXT = 1;
-
- private static final String[] PROJECTION_SOURCE_KEY =
- new String[] { BodyColumns.SOURCE_MESSAGE_KEY };
-
- public long mMessageKey;
- public String mHtmlContent;
- public String mTextContent;
- @Deprecated
- public String mHtmlReply;
- @Deprecated
- public String mTextReply;
- public int mQuotedTextStartPos;
-
- /**
- * Points to the ID of the message being replied to or forwarded. Will always be set,
- * even if {@link #mHtmlReply} and {@link #mTextReply} are null (indicating the user doesn't
- * want to include quoted text.
- */
- public long mSourceKey;
- @Deprecated
- public String mIntroText;
-
- public Body() {
- mBaseUri = CONTENT_URI;
- }
-
- @Override
- public ContentValues toContentValues() {
- ContentValues values = new ContentValues();
-
- // Assign values for each row.
- values.put(BodyColumns.MESSAGE_KEY, mMessageKey);
- values.put(BodyColumns.HTML_CONTENT, mHtmlContent);
- values.put(BodyColumns.TEXT_CONTENT, mTextContent);
- values.put(BodyColumns.HTML_REPLY, mHtmlReply);
- values.put(BodyColumns.TEXT_REPLY, mTextReply);
- values.put(BodyColumns.SOURCE_MESSAGE_KEY, mSourceKey);
- values.put(BodyColumns.INTRO_TEXT, mIntroText);
- return values;
- }
-
- /**
- * Given a cursor, restore a Body from it
- * @param cursor a cursor which must NOT be null
- * @return the Body as restored from the cursor
- */
- private static Body restoreBodyWithCursor(Cursor cursor) {
- try {
- if (cursor.moveToFirst()) {
- return getContent(cursor, Body.class);
- } else {
- return null;
- }
- } finally {
- cursor.close();
- }
- }
-
- public static Body restoreBodyWithId(Context context, long id) {
- Uri u = ContentUris.withAppendedId(Body.CONTENT_URI, id);
- Cursor c = context.getContentResolver().query(u, Body.CONTENT_PROJECTION,
- null, null, null);
- if (c == null) throw new ProviderUnavailableException();
- return restoreBodyWithCursor(c);
- }
-
- public static Body restoreBodyWithMessageId(Context context, long messageId) {
- Cursor c = context.getContentResolver().query(Body.CONTENT_URI,
- Body.CONTENT_PROJECTION, Body.MESSAGE_KEY + "=?",
- new String[] {Long.toString(messageId)}, null);
- if (c == null) throw new ProviderUnavailableException();
- return restoreBodyWithCursor(c);
- }
-
- /**
- * Returns the bodyId for the given messageId, or -1 if no body is found.
- */
- public static long lookupBodyIdWithMessageId(Context context, long messageId) {
- return Utility.getFirstRowLong(context, Body.CONTENT_URI,
- ID_PROJECTION, Body.MESSAGE_KEY + "=?",
- new String[] {Long.toString(messageId)}, null, ID_PROJECTION_COLUMN,
- Long.valueOf(-1));
- }
-
- /**
- * Updates the Body for a messageId with the given ContentValues.
- * If the message has no body, a new body is inserted for the message.
- * Warning: the argument "values" is modified by this method, setting MESSAGE_KEY.
- */
- public static void updateBodyWithMessageId(Context context, long messageId,
- ContentValues values) {
- ContentResolver resolver = context.getContentResolver();
- long bodyId = lookupBodyIdWithMessageId(context, messageId);
- values.put(BodyColumns.MESSAGE_KEY, messageId);
- if (bodyId == -1) {
- resolver.insert(CONTENT_URI, values);
- } else {
- final Uri uri = ContentUris.withAppendedId(CONTENT_URI, bodyId);
- resolver.update(uri, values, null, null);
- }
- }
-
- @VisibleForTesting
- public static long restoreBodySourceKey(Context context, long messageId) {
- return Utility.getFirstRowLong(context, Body.CONTENT_URI,
- Body.PROJECTION_SOURCE_KEY,
- Body.MESSAGE_KEY + "=?", new String[] {Long.toString(messageId)}, null, 0,
- Long.valueOf(0));
- }
-
- private static String restoreTextWithMessageId(Context context, long messageId,
- String[] projection) {
- Cursor c = context.getContentResolver().query(Body.CONTENT_URI, projection,
- Body.MESSAGE_KEY + "=?", new String[] {Long.toString(messageId)}, null);
- if (c == null) throw new ProviderUnavailableException();
- try {
- if (c.moveToFirst()) {
- return c.getString(COMMON_PROJECTION_COLUMN_TEXT);
- } else {
- return null;
- }
- } finally {
- c.close();
- }
- }
-
- public static String restoreBodyTextWithMessageId(Context context, long messageId) {
- return restoreTextWithMessageId(context, messageId, Body.COMMON_PROJECTION_TEXT);
- }
-
- public static String restoreBodyHtmlWithMessageId(Context context, long messageId) {
- return restoreTextWithMessageId(context, messageId, Body.COMMON_PROJECTION_HTML);
- }
-
- @Deprecated
- public static String restoreReplyTextWithMessageId(Context context, long messageId) {
- return restoreTextWithMessageId(context, messageId, Body.COMMON_PROJECTION_REPLY_TEXT);
- }
-
- @Deprecated
- public static String restoreReplyHtmlWithMessageId(Context context, long messageId) {
- return restoreTextWithMessageId(context, messageId, Body.COMMON_PROJECTION_REPLY_HTML);
- }
-
- @Deprecated
- public static String restoreIntroTextWithMessageId(Context context, long messageId) {
- return restoreTextWithMessageId(context, messageId, Body.COMMON_PROJECTION_INTRO);
- }
-
- @Override
- public void restore(Cursor cursor) {
- mBaseUri = EmailContent.Body.CONTENT_URI;
- mMessageKey = cursor.getLong(CONTENT_MESSAGE_KEY_COLUMN);
- mHtmlContent = cursor.getString(CONTENT_HTML_CONTENT_COLUMN);
- mTextContent = cursor.getString(CONTENT_TEXT_CONTENT_COLUMN);
- mHtmlReply = cursor.getString(CONTENT_HTML_REPLY_COLUMN);
- mTextReply = cursor.getString(CONTENT_TEXT_REPLY_COLUMN);
- mSourceKey = cursor.getLong(CONTENT_SOURCE_KEY_COLUMN);
- mIntroText = cursor.getString(CONTENT_INTRO_TEXT_COLUMN);
- mQuotedTextStartPos = cursor.getInt(CONTENT_QUOTED_TEXT_START_POS_COLUMN);
- }
-
- public boolean update() {
- // TODO Auto-generated method stub
- return false;
- }
- }
-
- public interface MessageColumns {
- public static final String ID = "_id";
- // Basic columns used in message list presentation
- // The name as shown to the user in a message list
- public static final String DISPLAY_NAME = "displayName";
- // The time (millis) as shown to the user in a message list [INDEX]
- public static final String TIMESTAMP = "timeStamp";
- // Message subject
- public static final String SUBJECT = "subject";
- // Boolean, unread = 0, read = 1 [INDEX]
- public static final String FLAG_READ = "flagRead";
- // Load state, see constants below (unloaded, partial, complete, deleted)
- public static final String FLAG_LOADED = "flagLoaded";
- // Boolean, unflagged = 0, flagged (favorite) = 1
- public static final String FLAG_FAVORITE = "flagFavorite";
- // Boolean, no attachment = 0, attachment = 1
- public static final String FLAG_ATTACHMENT = "flagAttachment";
- // Bit field for flags which we'll not be selecting on
- public static final String FLAGS = "flags";
-
- // Sync related identifiers
- // Saved draft info (reusing the never-used "clientId" column)
- public static final String DRAFT_INFO = "clientId";
- // The message-id in the message's header
- public static final String MESSAGE_ID = "messageId";
-
- // References to other Email objects in the database
- // Foreign key to the Mailbox holding this message [INDEX]
- public static final String MAILBOX_KEY = "mailboxKey";
- // Foreign key to the Account holding this message
- public static final String ACCOUNT_KEY = "accountKey";
-
- // Address lists, packed with Address.pack()
- public static final String FROM_LIST = "fromList";
- public static final String TO_LIST = "toList";
- public static final String CC_LIST = "ccList";
- public static final String BCC_LIST = "bccList";
- public static final String REPLY_TO_LIST = "replyToList";
- // Meeting invitation related information (for now, start time in ms)
- public static final String MEETING_INFO = "meetingInfo";
- // A text "snippet" derived from the body of the message
- public static final String SNIPPET = "snippet";
- // A column that can be used by sync adapters to store search-related information about
- // a retrieved message (the messageKey for search results will be a TYPE_SEARCH mailbox
- // and the sync adapter might, for example, need more information about the original source
- // of the message)
- public static final String PROTOCOL_SEARCH_INFO = "protocolSearchInfo";
- // Simple thread topic
- public static final String THREAD_TOPIC = "threadTopic";
- }
-
- public static final class Message extends EmailContent implements SyncColumns, MessageColumns {
- public static final String TABLE_NAME = "Message";
- public static final String UPDATED_TABLE_NAME = "Message_Updates";
- public static final String DELETED_TABLE_NAME = "Message_Deletes";
-
- // To refer to a specific message, use ContentUris.withAppendedId(CONTENT_URI, id)
- @SuppressWarnings("hiding")
- public static final Uri CONTENT_URI = Uri.parse(EmailContent.CONTENT_URI + "/message");
- public static final Uri CONTENT_URI_LIMIT_1 = uriWithLimit(CONTENT_URI, 1);
- public static final Uri SYNCED_CONTENT_URI =
- Uri.parse(EmailContent.CONTENT_URI + "/syncedMessage");
- public static final Uri DELETED_CONTENT_URI =
- Uri.parse(EmailContent.CONTENT_URI + "/deletedMessage");
- public static final Uri UPDATED_CONTENT_URI =
- Uri.parse(EmailContent.CONTENT_URI + "/updatedMessage");
- public static final Uri NOTIFIER_URI =
- Uri.parse(EmailContent.CONTENT_NOTIFIER_URI + "/message");
-
- public static final String KEY_TIMESTAMP_DESC = MessageColumns.TIMESTAMP + " desc";
-
- public static final int CONTENT_ID_COLUMN = 0;
- public static final int CONTENT_DISPLAY_NAME_COLUMN = 1;
- public static final int CONTENT_TIMESTAMP_COLUMN = 2;
- public static final int CONTENT_SUBJECT_COLUMN = 3;
- public static final int CONTENT_FLAG_READ_COLUMN = 4;
- public static final int CONTENT_FLAG_LOADED_COLUMN = 5;
- public static final int CONTENT_FLAG_FAVORITE_COLUMN = 6;
- public static final int CONTENT_FLAG_ATTACHMENT_COLUMN = 7;
- public static final int CONTENT_FLAGS_COLUMN = 8;
- public static final int CONTENT_SERVER_ID_COLUMN = 9;
- public static final int CONTENT_DRAFT_INFO_COLUMN = 10;
- public static final int CONTENT_MESSAGE_ID_COLUMN = 11;
- public static final int CONTENT_MAILBOX_KEY_COLUMN = 12;
- public static final int CONTENT_ACCOUNT_KEY_COLUMN = 13;
- public static final int CONTENT_FROM_LIST_COLUMN = 14;
- public static final int CONTENT_TO_LIST_COLUMN = 15;
- public static final int CONTENT_CC_LIST_COLUMN = 16;
- public static final int CONTENT_BCC_LIST_COLUMN = 17;
- public static final int CONTENT_REPLY_TO_COLUMN = 18;
- public static final int CONTENT_SERVER_TIMESTAMP_COLUMN = 19;
- public static final int CONTENT_MEETING_INFO_COLUMN = 20;
- public static final int CONTENT_SNIPPET_COLUMN = 21;
- public static final int CONTENT_PROTOCOL_SEARCH_INFO_COLUMN = 22;
- public static final int CONTENT_THREAD_TOPIC_COLUMN = 23;
-
- public static final String[] CONTENT_PROJECTION = new String[] {
- RECORD_ID,
- MessageColumns.DISPLAY_NAME, MessageColumns.TIMESTAMP,
- MessageColumns.SUBJECT, MessageColumns.FLAG_READ,
- MessageColumns.FLAG_LOADED, MessageColumns.FLAG_FAVORITE,
- MessageColumns.FLAG_ATTACHMENT, MessageColumns.FLAGS,
- SyncColumns.SERVER_ID, MessageColumns.DRAFT_INFO,
- MessageColumns.MESSAGE_ID, MessageColumns.MAILBOX_KEY,
- MessageColumns.ACCOUNT_KEY, MessageColumns.FROM_LIST,
- MessageColumns.TO_LIST, MessageColumns.CC_LIST,
- MessageColumns.BCC_LIST, MessageColumns.REPLY_TO_LIST,
- SyncColumns.SERVER_TIMESTAMP, MessageColumns.MEETING_INFO,
- MessageColumns.SNIPPET, MessageColumns.PROTOCOL_SEARCH_INFO,
- MessageColumns.THREAD_TOPIC
- };
-
- public static final int LIST_ID_COLUMN = 0;
- public static final int LIST_DISPLAY_NAME_COLUMN = 1;
- public static final int LIST_TIMESTAMP_COLUMN = 2;
- public static final int LIST_SUBJECT_COLUMN = 3;
- public static final int LIST_READ_COLUMN = 4;
- public static final int LIST_LOADED_COLUMN = 5;
- public static final int LIST_FAVORITE_COLUMN = 6;
- public static final int LIST_ATTACHMENT_COLUMN = 7;
- public static final int LIST_FLAGS_COLUMN = 8;
- public static final int LIST_MAILBOX_KEY_COLUMN = 9;
- public static final int LIST_ACCOUNT_KEY_COLUMN = 10;
- public static final int LIST_SERVER_ID_COLUMN = 11;
- public static final int LIST_SNIPPET_COLUMN = 12;
-
- // Public projection for common list columns
- public static final String[] LIST_PROJECTION = new String[] {
- RECORD_ID,
- MessageColumns.DISPLAY_NAME, MessageColumns.TIMESTAMP,
- MessageColumns.SUBJECT, MessageColumns.FLAG_READ,
- MessageColumns.FLAG_LOADED, MessageColumns.FLAG_FAVORITE,
- MessageColumns.FLAG_ATTACHMENT, MessageColumns.FLAGS,
- MessageColumns.MAILBOX_KEY, MessageColumns.ACCOUNT_KEY,
- SyncColumns.SERVER_ID, MessageColumns.SNIPPET
- };
-
- public static final int ID_COLUMNS_ID_COLUMN = 0;
- public static final int ID_COLUMNS_SYNC_SERVER_ID = 1;
- public static final String[] ID_COLUMNS_PROJECTION = new String[] {
- RECORD_ID, SyncColumns.SERVER_ID
- };
-
- public static final int ID_MAILBOX_COLUMN_ID = 0;
- public static final int ID_MAILBOX_COLUMN_MAILBOX_KEY = 1;
- public static final String[] ID_MAILBOX_PROJECTION = new String[] {
- RECORD_ID, MessageColumns.MAILBOX_KEY
- };
-
- public static final String[] ID_COLUMN_PROJECTION = new String[] { RECORD_ID };
-
- private static final String ACCOUNT_KEY_SELECTION =
- MessageColumns.ACCOUNT_KEY + "=?";
-
- /**
- * Selection for messages that are loaded
- *
- * POP messages at the initial stage have very little information. (Server UID only)
- * Use this to make sure they're not visible on any UI.
- * This means unread counts on the mailbox list can be different from the
- * number of messages in the message list, but it should be transient...
- */
- public static final String FLAG_LOADED_SELECTION =
- MessageColumns.FLAG_LOADED + " IN ("
- + Message.FLAG_LOADED_PARTIAL + "," + Message.FLAG_LOADED_COMPLETE
- + ")";
-
- public static final String ALL_FAVORITE_SELECTION =
- MessageColumns.FLAG_FAVORITE + "=1 AND "
- + MessageColumns.MAILBOX_KEY + " NOT IN ("
- + "SELECT " + MailboxColumns.ID + " FROM " + Mailbox.TABLE_NAME + ""
- + " WHERE " + MailboxColumns.TYPE + " = " + Mailbox.TYPE_TRASH
- + ")"
- + " AND " + FLAG_LOADED_SELECTION;
-
- /** Selection to retrieve all messages in "inbox" for any account */
- public static final String ALL_INBOX_SELECTION =
- MessageColumns.MAILBOX_KEY + " IN ("
- + "SELECT " + MailboxColumns.ID + " FROM " + Mailbox.TABLE_NAME
- + " WHERE " + MailboxColumns.TYPE + " = " + Mailbox.TYPE_INBOX
- + ")"
- + " AND " + FLAG_LOADED_SELECTION;
-
- /** Selection to retrieve all messages in "drafts" for any account */
- public static final String ALL_DRAFT_SELECTION =
- MessageColumns.MAILBOX_KEY + " IN ("
- + "SELECT " + MailboxColumns.ID + " FROM " + Mailbox.TABLE_NAME
- + " WHERE " + MailboxColumns.TYPE + " = " + Mailbox.TYPE_DRAFTS
- + ")"
- + " AND " + FLAG_LOADED_SELECTION;
-
- /** Selection to retrieve all messages in "outbox" for any account */
- public static final String ALL_OUTBOX_SELECTION =
- MessageColumns.MAILBOX_KEY + " IN ("
- + "SELECT " + MailboxColumns.ID + " FROM " + Mailbox.TABLE_NAME
- + " WHERE " + MailboxColumns.TYPE + " = " + Mailbox.TYPE_OUTBOX
- + ")"; // NOTE No flag_loaded test for outboxes.
-
- /** Selection to retrieve unread messages in "inbox" for any account */
- public static final String ALL_UNREAD_SELECTION =
- MessageColumns.FLAG_READ + "=0 AND " + ALL_INBOX_SELECTION;
-
- /** Selection to retrieve unread messages in "inbox" for one account */
- public static final String PER_ACCOUNT_UNREAD_SELECTION =
- ACCOUNT_KEY_SELECTION + " AND " + ALL_UNREAD_SELECTION;
-
- /** Selection to retrieve all messages in "inbox" for one account */
- public static final String PER_ACCOUNT_INBOX_SELECTION =
- ACCOUNT_KEY_SELECTION + " AND " + ALL_INBOX_SELECTION;
-
- public static final String PER_ACCOUNT_FAVORITE_SELECTION =
- ACCOUNT_KEY_SELECTION + " AND " + ALL_FAVORITE_SELECTION;
-
- // _id field is in AbstractContent
- public String mDisplayName;
- public long mTimeStamp;
- public String mSubject;
- public boolean mFlagRead = false;
- public int mFlagLoaded = FLAG_LOADED_UNLOADED;
- public boolean mFlagFavorite = false;
- public boolean mFlagAttachment = false;
- public int mFlags = 0;
-
- public String mServerId;
- public long mServerTimeStamp;
- public int mDraftInfo;
- public String mMessageId;
-
- public long mMailboxKey;
- public long mAccountKey;
-
- public String mFrom;
- public String mTo;
- public String mCc;
- public String mBcc;
- public String mReplyTo;
-
- // For now, just the start time of a meeting invite, in ms
- public String mMeetingInfo;
-
- public String mSnippet;
-
- public String mProtocolSearchInfo;
-
- public String mThreadTopic;
-
- /**
- * Base64-encoded representation of the byte array provided by servers for identifying
- * messages belonging to the same conversation thread. Currently unsupported and not
- * persisted in the database.
- */
- public String mServerConversationId;
-
- // The following transient members may be used while building and manipulating messages,
- // but they are NOT persisted directly by EmailProvider. See Body for related fields.
- transient public String mText;
- transient public String mHtml;
- transient public String mTextReply;
- transient public String mHtmlReply;
- transient public long mSourceKey;
- transient public ArrayList<Attachment> mAttachments = null;
- transient public String mIntroText;
- transient public int mQuotedTextStartPos;
-
-
- // Values used in mFlagRead
- public static final int UNREAD = 0;
- public static final int READ = 1;
-
- // Values used in mFlagLoaded
- public static final int FLAG_LOADED_UNLOADED = 0;
- public static final int FLAG_LOADED_COMPLETE = 1;
- public static final int FLAG_LOADED_PARTIAL = 2;
- public static final int FLAG_LOADED_DELETED = 3;
-
- // Bits used in mFlags
- // The following three states are mutually exclusive, and indicate whether the message is an
- // original, a reply, or a forward
- public static final int FLAG_TYPE_REPLY = 1<<0;
- public static final int FLAG_TYPE_FORWARD = 1<<1;
- public static final int FLAG_TYPE_MASK = FLAG_TYPE_REPLY | FLAG_TYPE_FORWARD;
- // The following flags indicate messages that are determined to be incoming meeting related
- // (e.g. invites from others)
- public static final int FLAG_INCOMING_MEETING_INVITE = 1<<2;
- public static final int FLAG_INCOMING_MEETING_CANCEL = 1<<3;
- public static final int FLAG_INCOMING_MEETING_MASK =
- FLAG_INCOMING_MEETING_INVITE | FLAG_INCOMING_MEETING_CANCEL;
- // The following flags indicate messages that are outgoing and meeting related
- // (e.g. invites TO others)
- public static final int FLAG_OUTGOING_MEETING_INVITE = 1<<4;
- public static final int FLAG_OUTGOING_MEETING_CANCEL = 1<<5;
- public static final int FLAG_OUTGOING_MEETING_ACCEPT = 1<<6;
- public static final int FLAG_OUTGOING_MEETING_DECLINE = 1<<7;
- public static final int FLAG_OUTGOING_MEETING_TENTATIVE = 1<<8;
- public static final int FLAG_OUTGOING_MEETING_MASK =
- FLAG_OUTGOING_MEETING_INVITE | FLAG_OUTGOING_MEETING_CANCEL |
- FLAG_OUTGOING_MEETING_ACCEPT | FLAG_OUTGOING_MEETING_DECLINE |
- FLAG_OUTGOING_MEETING_TENTATIVE;
- public static final int FLAG_OUTGOING_MEETING_REQUEST_MASK =
- FLAG_OUTGOING_MEETING_INVITE | FLAG_OUTGOING_MEETING_CANCEL;
- // 8 general purpose flags (bits) that may be used at the discretion of the sync adapter
- public static final int FLAG_SYNC_ADAPTER_SHIFT = 9;
- public static final int FLAG_SYNC_ADAPTER_MASK = 255 << FLAG_SYNC_ADAPTER_SHIFT;
- /** If set, the outgoing message should *not* include the quoted original message. */
- public static final int FLAG_NOT_INCLUDE_QUOTED_TEXT = 1 << 17;
- public static final int FLAG_REPLIED_TO = 1 << 18;
- public static final int FLAG_FORWARDED = 1 << 19;
-
- // Outgoing, original message
- public static final int FLAG_TYPE_ORIGINAL = 1 << 20;
- // Outgoing, reply all message; note, FLAG_TYPE_REPLY should also be set for backward
- // compatibility
- public static final int FLAG_TYPE_REPLY_ALL = 1 << 21;
-
- // Flag used in draftInfo to indicate that the reference message should be appended
- public static final int DRAFT_INFO_APPEND_REF_MESSAGE = 1 << 24;
- public static final int DRAFT_INFO_QUOTE_POS_MASK = 0xFFFFFF;
-
- /** a pseudo ID for "no message". */
- public static final long NO_MESSAGE = -1L;
-
- public Message() {
- mBaseUri = CONTENT_URI;
- }
-
- @Override
- public ContentValues toContentValues() {
- ContentValues values = new ContentValues();
-
- // Assign values for each row.
- values.put(MessageColumns.DISPLAY_NAME, mDisplayName);
- values.put(MessageColumns.TIMESTAMP, mTimeStamp);
- values.put(MessageColumns.SUBJECT, mSubject);
- values.put(MessageColumns.FLAG_READ, mFlagRead);
- values.put(MessageColumns.FLAG_LOADED, mFlagLoaded);
- values.put(MessageColumns.FLAG_FAVORITE, mFlagFavorite);
- values.put(MessageColumns.FLAG_ATTACHMENT, mFlagAttachment);
- values.put(MessageColumns.FLAGS, mFlags);
-
- values.put(SyncColumns.SERVER_ID, mServerId);
- values.put(SyncColumns.SERVER_TIMESTAMP, mServerTimeStamp);
- values.put(MessageColumns.DRAFT_INFO, mDraftInfo);
- values.put(MessageColumns.MESSAGE_ID, mMessageId);
-
- values.put(MessageColumns.MAILBOX_KEY, mMailboxKey);
- values.put(MessageColumns.ACCOUNT_KEY, mAccountKey);
-
- values.put(MessageColumns.FROM_LIST, mFrom);
- values.put(MessageColumns.TO_LIST, mTo);
- values.put(MessageColumns.CC_LIST, mCc);
- values.put(MessageColumns.BCC_LIST, mBcc);
- values.put(MessageColumns.REPLY_TO_LIST, mReplyTo);
-
- values.put(MessageColumns.MEETING_INFO, mMeetingInfo);
-
- values.put(MessageColumns.SNIPPET, mSnippet);
-
- values.put(MessageColumns.PROTOCOL_SEARCH_INFO, mProtocolSearchInfo);
-
- values.put(MessageColumns.THREAD_TOPIC, mThreadTopic);
- return values;
- }
-
- public static Message restoreMessageWithId(Context context, long id) {
- return EmailContent.restoreContentWithId(context, Message.class,
- Message.CONTENT_URI, Message.CONTENT_PROJECTION, id);
- }
-
- @Override
- public void restore(Cursor cursor) {
- mBaseUri = CONTENT_URI;
- mId = cursor.getLong(CONTENT_ID_COLUMN);
- mDisplayName = cursor.getString(CONTENT_DISPLAY_NAME_COLUMN);
- mTimeStamp = cursor.getLong(CONTENT_TIMESTAMP_COLUMN);
- mSubject = cursor.getString(CONTENT_SUBJECT_COLUMN);
- mFlagRead = cursor.getInt(CONTENT_FLAG_READ_COLUMN) == 1;
- mFlagLoaded = cursor.getInt(CONTENT_FLAG_LOADED_COLUMN);
- mFlagFavorite = cursor.getInt(CONTENT_FLAG_FAVORITE_COLUMN) == 1;
- mFlagAttachment = cursor.getInt(CONTENT_FLAG_ATTACHMENT_COLUMN) == 1;
- mFlags = cursor.getInt(CONTENT_FLAGS_COLUMN);
- mServerId = cursor.getString(CONTENT_SERVER_ID_COLUMN);
- mServerTimeStamp = cursor.getLong(CONTENT_SERVER_TIMESTAMP_COLUMN);
- mDraftInfo = cursor.getInt(CONTENT_DRAFT_INFO_COLUMN);
- mMessageId = cursor.getString(CONTENT_MESSAGE_ID_COLUMN);
- mMailboxKey = cursor.getLong(CONTENT_MAILBOX_KEY_COLUMN);
- mAccountKey = cursor.getLong(CONTENT_ACCOUNT_KEY_COLUMN);
- mFrom = cursor.getString(CONTENT_FROM_LIST_COLUMN);
- mTo = cursor.getString(CONTENT_TO_LIST_COLUMN);
- mCc = cursor.getString(CONTENT_CC_LIST_COLUMN);
- mBcc = cursor.getString(CONTENT_BCC_LIST_COLUMN);
- mReplyTo = cursor.getString(CONTENT_REPLY_TO_COLUMN);
- mMeetingInfo = cursor.getString(CONTENT_MEETING_INFO_COLUMN);
- mSnippet = cursor.getString(CONTENT_SNIPPET_COLUMN);
- mProtocolSearchInfo = cursor.getString(CONTENT_PROTOCOL_SEARCH_INFO_COLUMN);
- mThreadTopic = cursor.getString(CONTENT_THREAD_TOPIC_COLUMN);
- }
-
- public boolean update() {
- // TODO Auto-generated method stub
- return false;
- }
-
- /*
- * Override this so that we can store the Body first and link it to the Message
- * Also, attachments when we get there...
- * (non-Javadoc)
- * @see com.android.email.provider.EmailContent#save(android.content.Context)
- */
- @Override
- public Uri save(Context context) {
-
- boolean doSave = !isSaved();
-
- // This logic is in place so I can (a) short circuit the expensive stuff when
- // possible, and (b) override (and throw) if anyone tries to call save() or update()
- // directly for Message, which are unsupported.
- if (mText == null && mHtml == null && mTextReply == null && mHtmlReply == null &&
- (mAttachments == null || mAttachments.isEmpty())) {
- if (doSave) {
- return super.save(context);
- } else {
- // Call update, rather than super.update in case we ever override it
- if (update(context, toContentValues()) == 1) {
- return getUri();
- }
- return null;
- }
- }
-
- ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
- addSaveOps(ops);
- try {
- ContentProviderResult[] results =
- context.getContentResolver().applyBatch(AUTHORITY, ops);
- // If saving, set the mId's of the various saved objects
- if (doSave) {
- Uri u = results[0].uri;
- mId = Long.parseLong(u.getPathSegments().get(1));
- if (mAttachments != null) {
- int resultOffset = 2;
- for (Attachment a : mAttachments) {
- // Save the id of the attachment record
- u = results[resultOffset++].uri;
- if (u != null) {
- a.mId = Long.parseLong(u.getPathSegments().get(1));
- }
- a.mMessageKey = mId;
- }
- }
- return u;
- } else {
- return null;
- }
- } catch (RemoteException e) {
- // There is nothing to be done here; fail by returning null
- } catch (OperationApplicationException e) {
- // There is nothing to be done here; fail by returning null
- }
- return null;
- }
-
- /**
- * Save or update a message
- * @param ops an array of CPOs that we'll add to
- */
- public void addSaveOps(ArrayList<ContentProviderOperation> ops) {
- boolean isNew = !isSaved();
- ContentProviderOperation.Builder b;
- // First, save/update the message
- if (isNew) {
- b = ContentProviderOperation.newInsert(mBaseUri);
- } else {
- b = ContentProviderOperation.newUpdate(mBaseUri)
- .withSelection(Message.RECORD_ID + "=?", new String[] {Long.toString(mId)});
- }
- // Generate the snippet here, before we create the CPO for Message
- if (mText != null) {
- mSnippet = TextUtilities.makeSnippetFromPlainText(mText);
- } else if (mHtml != null) {
- mSnippet = TextUtilities.makeSnippetFromHtmlText(mHtml);
- }
- ops.add(b.withValues(toContentValues()).build());
-
- // Create and save the body
- ContentValues cv = new ContentValues();
- if (mText != null) {
- cv.put(Body.TEXT_CONTENT, mText);
- }
- if (mHtml != null) {
- cv.put(Body.HTML_CONTENT, mHtml);
- }
- if (mSourceKey != 0) {
- cv.put(Body.SOURCE_MESSAGE_KEY, mSourceKey);
- }
- if (mQuotedTextStartPos != 0) {
- cv.put(Body.QUOTED_TEXT_START_POS, mQuotedTextStartPos);
- }
- b = ContentProviderOperation.newInsert(Body.CONTENT_URI);
- // Put our message id in the Body
- if (!isNew) {
- cv.put(Body.MESSAGE_KEY, mId);
- }
- b.withValues(cv);
- // We'll need this if we're new
- int messageBackValue = ops.size() - 1;
- // If we're new, create a back value entry
- if (isNew) {
- ContentValues backValues = new ContentValues();
- backValues.put(Body.MESSAGE_KEY, messageBackValue);
- b.withValueBackReferences(backValues);
- }
- // And add the Body operation
- ops.add(b.build());
-
- // Create the attaachments, if any
- if (mAttachments != null) {
- for (Attachment att: mAttachments) {
- if (!isNew) {
- att.mMessageKey = mId;
- }
- b = ContentProviderOperation.newInsert(Attachment.CONTENT_URI)
- .withValues(att.toContentValues());
- if (isNew) {
- b.withValueBackReference(Attachment.MESSAGE_KEY, messageBackValue);
- }
- ops.add(b.build());
- }
- }
- }
-
- /**
- * @return number of favorite (starred) messages throughout all accounts.
- */
- public static int getFavoriteMessageCount(Context context) {
- return count(context, Message.CONTENT_URI, ALL_FAVORITE_SELECTION, null);
- }
-
- /**
- * @return number of favorite (starred) messages for an account
- */
- public static int getFavoriteMessageCount(Context context, long accountId) {
- return count(context, Message.CONTENT_URI, PER_ACCOUNT_FAVORITE_SELECTION,
- new String[]{Long.toString(accountId)});
- }
-
- public static long getKeyColumnLong(Context context, long messageId, String column) {
- String[] columns =
- Utility.getRowColumns(context, Message.CONTENT_URI, messageId, column);
- if (columns != null && columns[0] != null) {
- return Long.parseLong(columns[0]);
- }
- return -1;
- }
-
- /**
- * Returns the where clause for a message list selection.
- *
- * Accesses the detabase to determine the mailbox type. DO NOT CALL FROM UI THREAD.
- */
- public static String buildMessageListSelection(
- Context context, long accountId, long mailboxId) {
-
- if (mailboxId == Mailbox.QUERY_ALL_INBOXES) {
- return Message.ALL_INBOX_SELECTION;
- }
- if (mailboxId == Mailbox.QUERY_ALL_DRAFTS) {
- return Message.ALL_DRAFT_SELECTION;
- }
- if (mailboxId == Mailbox.QUERY_ALL_OUTBOX) {
- return Message.ALL_OUTBOX_SELECTION;
- }
- if (mailboxId == Mailbox.QUERY_ALL_UNREAD) {
- return Message.ALL_UNREAD_SELECTION;
- }
- // TODO: we only support per-account starred mailbox right now, but presumably, we
- // can surface the same thing for unread.
- if (mailboxId == Mailbox.QUERY_ALL_FAVORITES) {
- if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- return Message.ALL_FAVORITE_SELECTION;
- }
-
- final StringBuilder selection = new StringBuilder();
- selection.append(MessageColumns.ACCOUNT_KEY).append('=').append(accountId)
- .append(" AND ")
- .append(Message.ALL_FAVORITE_SELECTION);
- return selection.toString();
- }
-
- // Now it's a regular mailbox.
- final StringBuilder selection = new StringBuilder();
-
- selection.append(MessageColumns.MAILBOX_KEY).append('=').append(mailboxId);
-
- if (Mailbox.getMailboxType(context, mailboxId) != Mailbox.TYPE_OUTBOX) {
- selection.append(" AND ").append(Message.FLAG_LOADED_SELECTION);
- }
- return selection.toString();
- }
- }
-
- public interface AttachmentColumns {
- public static final String ID = "_id";
- // The display name of the attachment
- public static final String FILENAME = "fileName";
- // The mime type of the attachment
- public static final String MIME_TYPE = "mimeType";
- // The size of the attachment in bytes
- public static final String SIZE = "size";
- // The (internal) contentId of the attachment (inline attachments will have these)
- public static final String CONTENT_ID = "contentId";
- // The location of the loaded attachment (probably a file)
- @SuppressWarnings("hiding")
- public static final String CONTENT_URI = "contentUri";
- // A foreign key into the Message table (the message owning this attachment)
- public static final String MESSAGE_KEY = "messageKey";
- // The location of the attachment on the server side
- // For IMAP, this is a part number (e.g. 2.1); for EAS, it's the internal file name
- public static final String LOCATION = "location";
- // The transfer encoding of the attachment
- public static final String ENCODING = "encoding";
- // Not currently used
- public static final String CONTENT = "content";
- // Flags
- public static final String FLAGS = "flags";
- // Content that is actually contained in the Attachment row
- public static final String CONTENT_BYTES = "content_bytes";
- // A foreign key into the Account table (for the message owning this attachment)
- public static final String ACCOUNT_KEY = "accountKey";
- // The UIProvider state of the attachment
- public static final String UI_STATE = "uiState";
- // The UIProvider destination of the attachment
- public static final String UI_DESTINATION = "uiDestination";
- // The UIProvider downloaded size of the attachment
- public static final String UI_DOWNLOADED_SIZE = "uiDownloadedSize";
- }
-
- public static final class Attachment extends EmailContent
- implements AttachmentColumns, Parcelable {
- public static final String TABLE_NAME = "Attachment";
- @SuppressWarnings("hiding")
- public static final Uri CONTENT_URI = Uri.parse(EmailContent.CONTENT_URI + "/attachment");
- // This must be used with an appended id: ContentUris.withAppendedId(MESSAGE_ID_URI, id)
- public static final Uri MESSAGE_ID_URI = Uri.parse(
- EmailContent.CONTENT_URI + "/attachment/message");
-
- public String mFileName;
- public String mMimeType;
- public long mSize;
- public String mContentId;
- public String mContentUri;
- public long mMessageKey;
- public String mLocation;
- public String mEncoding;
- public String mContent; // Not currently used
- public int mFlags;
- public byte[] mContentBytes;
- public long mAccountKey;
- public int mUiState;
- public int mUiDestination;
- public int mUiDownloadedSize;
-
- public static final int CONTENT_ID_COLUMN = 0;
- public static final int CONTENT_FILENAME_COLUMN = 1;
- public static final int CONTENT_MIME_TYPE_COLUMN = 2;
- public static final int CONTENT_SIZE_COLUMN = 3;
- public static final int CONTENT_CONTENT_ID_COLUMN = 4;
- public static final int CONTENT_CONTENT_URI_COLUMN = 5;
- public static final int CONTENT_MESSAGE_ID_COLUMN = 6;
- public static final int CONTENT_LOCATION_COLUMN = 7;
- public static final int CONTENT_ENCODING_COLUMN = 8;
- public static final int CONTENT_CONTENT_COLUMN = 9; // Not currently used
- public static final int CONTENT_FLAGS_COLUMN = 10;
- public static final int CONTENT_CONTENT_BYTES_COLUMN = 11;
- public static final int CONTENT_ACCOUNT_KEY_COLUMN = 12;
- public static final int CONTENT_UI_STATE_COLUMN = 13;
- public static final int CONTENT_UI_DESTINATION_COLUMN = 14;
- public static final int CONTENT_UI_DOWNLOADED_SIZE_COLUMN = 15;
- public static final String[] CONTENT_PROJECTION = new String[] {
- RECORD_ID, AttachmentColumns.FILENAME, AttachmentColumns.MIME_TYPE,
- AttachmentColumns.SIZE, AttachmentColumns.CONTENT_ID, AttachmentColumns.CONTENT_URI,
- AttachmentColumns.MESSAGE_KEY, AttachmentColumns.LOCATION, AttachmentColumns.ENCODING,
- AttachmentColumns.CONTENT, AttachmentColumns.FLAGS, AttachmentColumns.CONTENT_BYTES,
- AttachmentColumns.ACCOUNT_KEY, AttachmentColumns.UI_STATE,
- AttachmentColumns.UI_DESTINATION, AttachmentColumns.UI_DOWNLOADED_SIZE
- };
-
- // All attachments with an empty URI, regardless of mailbox
- public static final String PRECACHE_SELECTION =
- AttachmentColumns.CONTENT_URI + " isnull AND " + Attachment.FLAGS + "=0";
- // Attachments with an empty URI that are in an inbox
- public static final String PRECACHE_INBOX_SELECTION =
- PRECACHE_SELECTION + " AND " + AttachmentColumns.MESSAGE_KEY + " IN ("
- + "SELECT " + MessageColumns.ID + " FROM " + Message.TABLE_NAME
- + " WHERE " + Message.ALL_INBOX_SELECTION
- + ")";
-
- // Bits used in mFlags
- // WARNING: AttachmentDownloadService relies on the fact that ALL of the flags below
- // disqualify attachments for precaching. If you add a flag that does NOT disqualify an
- // attachment for precaching, you MUST change the PRECACHE_SELECTION definition above
-
- // Instruct Rfc822Output to 1) not use Content-Disposition and 2) use multipart/alternative
- // with this attachment. This is only valid if there is one and only one attachment and
- // that attachment has this flag set
- public static final int FLAG_ICS_ALTERNATIVE_PART = 1<<0;
- // Indicate that this attachment has been requested for downloading by the user; this is
- // the highest priority for attachment downloading
- public static final int FLAG_DOWNLOAD_USER_REQUEST = 1<<1;
- // Indicate that this attachment needs to be downloaded as part of an outgoing forwarded
- // message
- public static final int FLAG_DOWNLOAD_FORWARD = 1<<2;
- // Indicates that the attachment download failed in a non-recoverable manner
- public static final int FLAG_DOWNLOAD_FAILED = 1<<3;
- // Allow "room" for some additional download-related flags here
- // Indicates that the attachment will be smart-forwarded
- public static final int FLAG_SMART_FORWARD = 1<<8;
- // Indicates that the attachment cannot be forwarded due to a policy restriction
- public static final int FLAG_POLICY_DISALLOWS_DOWNLOAD = 1<<9;
- /**
- * no public constructor since this is a utility class
- */
- public Attachment() {
- mBaseUri = CONTENT_URI;
- }
-
- /**
- * Restore an Attachment from the database, given its unique id
- * @param context
- * @param id
- * @return the instantiated Attachment
- */
- public static Attachment restoreAttachmentWithId(Context context, long id) {
- return EmailContent.restoreContentWithId(context, Attachment.class,
- Attachment.CONTENT_URI, Attachment.CONTENT_PROJECTION, id);
- }
-
- /**
- * Restore all the Attachments of a message given its messageId
- */
- public static Attachment[] restoreAttachmentsWithMessageId(Context context,
- long messageId) {
- Uri uri = ContentUris.withAppendedId(MESSAGE_ID_URI, messageId);
- Cursor c = context.getContentResolver().query(uri, CONTENT_PROJECTION,
- null, null, null);
- try {
- int count = c.getCount();
- Attachment[] attachments = new Attachment[count];
- for (int i = 0; i < count; ++i) {
- c.moveToNext();
- Attachment attach = new Attachment();
- attach.restore(c);
- attachments[i] = attach;
- }
- return attachments;
- } finally {
- c.close();
- }
- }
-
- /**
- * Creates a unique file in the external store by appending a hyphen
- * and a number to the given filename.
- * @param filename
- * @return a new File object, or null if one could not be created
- */
- public static File createUniqueFile(String filename) {
- // TODO Handle internal storage, as required
- if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
- File directory = Environment.getExternalStorageDirectory();
- File file = new File(directory, filename);
- if (!file.exists()) {
- return file;
- }
- // Get the extension of the file, if any.
- int index = filename.lastIndexOf('.');
- String name = filename;
- String extension = "";
- if (index != -1) {
- name = filename.substring(0, index);
- extension = filename.substring(index);
- }
- for (int i = 2; i < Integer.MAX_VALUE; i++) {
- file = new File(directory, name + '-' + i + extension);
- if (!file.exists()) {
- return file;
- }
- }
- return null;
- }
- return null;
- }
-
- @Override
- public void restore(Cursor cursor) {
- mBaseUri = CONTENT_URI;
- mId = cursor.getLong(CONTENT_ID_COLUMN);
- mFileName= cursor.getString(CONTENT_FILENAME_COLUMN);
- mMimeType = cursor.getString(CONTENT_MIME_TYPE_COLUMN);
- mSize = cursor.getLong(CONTENT_SIZE_COLUMN);
- mContentId = cursor.getString(CONTENT_CONTENT_ID_COLUMN);
- mContentUri = cursor.getString(CONTENT_CONTENT_URI_COLUMN);
- mMessageKey = cursor.getLong(CONTENT_MESSAGE_ID_COLUMN);
- mLocation = cursor.getString(CONTENT_LOCATION_COLUMN);
- mEncoding = cursor.getString(CONTENT_ENCODING_COLUMN);
- mContent = cursor.getString(CONTENT_CONTENT_COLUMN);
- mFlags = cursor.getInt(CONTENT_FLAGS_COLUMN);
- mContentBytes = cursor.getBlob(CONTENT_CONTENT_BYTES_COLUMN);
- mAccountKey = cursor.getLong(CONTENT_ACCOUNT_KEY_COLUMN);
- mUiState = cursor.getInt(CONTENT_UI_STATE_COLUMN);
- mUiDestination = cursor.getInt(CONTENT_UI_DESTINATION_COLUMN);
- mUiDownloadedSize = cursor.getInt(CONTENT_UI_DOWNLOADED_SIZE_COLUMN);
- }
-
- @Override
- public ContentValues toContentValues() {
- ContentValues values = new ContentValues();
- values.put(AttachmentColumns.FILENAME, mFileName);
- values.put(AttachmentColumns.MIME_TYPE, mMimeType);
- values.put(AttachmentColumns.SIZE, mSize);
- values.put(AttachmentColumns.CONTENT_ID, mContentId);
- values.put(AttachmentColumns.CONTENT_URI, mContentUri);
- values.put(AttachmentColumns.MESSAGE_KEY, mMessageKey);
- values.put(AttachmentColumns.LOCATION, mLocation);
- values.put(AttachmentColumns.ENCODING, mEncoding);
- values.put(AttachmentColumns.CONTENT, mContent);
- values.put(AttachmentColumns.FLAGS, mFlags);
- values.put(AttachmentColumns.CONTENT_BYTES, mContentBytes);
- values.put(AttachmentColumns.ACCOUNT_KEY, mAccountKey);
- values.put(AttachmentColumns.UI_STATE, mUiState);
- values.put(AttachmentColumns.UI_DESTINATION, mUiDestination);
- values.put(AttachmentColumns.UI_DOWNLOADED_SIZE, mUiDownloadedSize);
- return values;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- // mBaseUri is not parceled
- dest.writeLong(mId);
- dest.writeString(mFileName);
- dest.writeString(mMimeType);
- dest.writeLong(mSize);
- dest.writeString(mContentId);
- dest.writeString(mContentUri);
- dest.writeLong(mMessageKey);
- dest.writeString(mLocation);
- dest.writeString(mEncoding);
- dest.writeString(mContent);
- dest.writeInt(mFlags);
- dest.writeLong(mAccountKey);
- if (mContentBytes == null) {
- dest.writeInt(-1);
- } else {
- dest.writeInt(mContentBytes.length);
- dest.writeByteArray(mContentBytes);
- }
- dest.writeInt(mUiState);
- dest.writeInt(mUiDestination);
- dest.writeInt(mUiDownloadedSize);
- }
-
- public Attachment(Parcel in) {
- mBaseUri = EmailContent.Attachment.CONTENT_URI;
- mId = in.readLong();
- mFileName = in.readString();
- mMimeType = in.readString();
- mSize = in.readLong();
- mContentId = in.readString();
- mContentUri = in.readString();
- mMessageKey = in.readLong();
- mLocation = in.readString();
- mEncoding = in.readString();
- mContent = in.readString();
- mFlags = in.readInt();
- mAccountKey = in.readLong();
- final int contentBytesLen = in.readInt();
- if (contentBytesLen == -1) {
- mContentBytes = null;
- } else {
- mContentBytes = new byte[contentBytesLen];
- in.readByteArray(mContentBytes);
- }
- mUiState = in.readInt();
- mUiDestination = in.readInt();
- mUiDownloadedSize = in.readInt();
- }
-
- public static final Parcelable.Creator<EmailContent.Attachment> CREATOR
- = new Parcelable.Creator<EmailContent.Attachment>() {
- @Override
- public EmailContent.Attachment createFromParcel(Parcel in) {
- return new EmailContent.Attachment(in);
- }
-
- @Override
- public EmailContent.Attachment[] newArray(int size) {
- return new EmailContent.Attachment[size];
- }
- };
-
- @Override
- public String toString() {
- return "[" + mFileName + ", " + mMimeType + ", " + mSize + ", " + mContentId + ", "
- + mContentUri + ", " + mMessageKey + ", " + mLocation + ", " + mEncoding + ", "
- + mFlags + ", " + mContentBytes + ", " + mAccountKey + "," + mUiState + ","
- + mUiDestination + "," + mUiDownloadedSize + "]";
- }
- }
-
- public interface AccountColumns {
- public static final String ID = "_id";
- // The display name of the account (user-settable)
- public static final String DISPLAY_NAME = "displayName";
- // The email address corresponding to this account
- public static final String EMAIL_ADDRESS = "emailAddress";
- // A server-based sync key on an account-wide basis (EAS needs this)
- public static final String SYNC_KEY = "syncKey";
- // The default sync lookback period for this account
- public static final String SYNC_LOOKBACK = "syncLookback";
- // The default sync frequency for this account, in minutes
- public static final String SYNC_INTERVAL = "syncInterval";
- // A foreign key into the account manager, having host, login, password, port, and ssl flags
- public static final String HOST_AUTH_KEY_RECV = "hostAuthKeyRecv";
- // (optional) A foreign key into the account manager, having host, login, password, port,
- // and ssl flags
- public static final String HOST_AUTH_KEY_SEND = "hostAuthKeySend";
- // Flags
- public static final String FLAGS = "flags";
- // Default account
- public static final String IS_DEFAULT = "isDefault";
- // Old-Style UUID for compatibility with previous versions
- public static final String COMPATIBILITY_UUID = "compatibilityUuid";
- // User name (for outgoing messages)
- public static final String SENDER_NAME = "senderName";
- // Ringtone
- public static final String RINGTONE_URI = "ringtoneUri";
- // Protocol version (arbitrary string, used by EAS currently)
- public static final String PROTOCOL_VERSION = "protocolVersion";
- // The number of new messages (reported by the sync/download engines
- public static final String NEW_MESSAGE_COUNT = "newMessageCount";
- // Legacy flags defining security (provisioning) requirements of this account; this
- // information is now found in the Policy table; POLICY_KEY (below) is the foreign key
- @Deprecated
- public static final String SECURITY_FLAGS = "securityFlags";
- // Server-based sync key for the security policies currently enforced
- public static final String SECURITY_SYNC_KEY = "securitySyncKey";
- // Signature to use with this account
- public static final String SIGNATURE = "signature";
- // A foreign key into the Policy table
- public static final String POLICY_KEY = "policyKey";
- }
-
- public interface QuickResponseColumns {
- // The QuickResponse text
- static final String TEXT = "quickResponse";
- // A foreign key into the Account table owning the QuickResponse
- static final String ACCOUNT_KEY = "accountKey";
- }
-
- public interface MailboxColumns {
- public static final String ID = "_id";
- // The display name of this mailbox [INDEX]
- static final String DISPLAY_NAME = "displayName";
- // The server's identifier for this mailbox
- public static final String SERVER_ID = "serverId";
- // The server's identifier for the parent of this mailbox (null = top-level)
- public static final String PARENT_SERVER_ID = "parentServerId";
- // A foreign key for the parent of this mailbox (-1 = top-level, 0=uninitialized)
- public static final String PARENT_KEY = "parentKey";
- // A foreign key to the Account that owns this mailbox
- public static final String ACCOUNT_KEY = "accountKey";
- // The type (role) of this mailbox
- public static final String TYPE = "type";
- // The hierarchy separator character
- public static final String DELIMITER = "delimiter";
- // Server-based sync key or validity marker (e.g. "SyncKey" for EAS, "uidvalidity" for IMAP)
- public static final String SYNC_KEY = "syncKey";
- // The sync lookback period for this mailbox (or null if using the account default)
- public static final String SYNC_LOOKBACK = "syncLookback";
- // The sync frequency for this mailbox (or null if using the account default)
- public static final String SYNC_INTERVAL = "syncInterval";
- // The time of last successful sync completion (millis)
- public static final String SYNC_TIME = "syncTime";
- // Cached unread count
- public static final String UNREAD_COUNT = "unreadCount";
- // Visibility of this folder in a list of folders [INDEX]
- public static final String FLAG_VISIBLE = "flagVisible";
- // Other states, as a bit field, e.g. CHILDREN_VISIBLE, HAS_CHILDREN
- public static final String FLAGS = "flags";
- // Backward compatible
- public static final String VISIBLE_LIMIT = "visibleLimit";
- // Sync status (can be used as desired by sync services)
- public static final String SYNC_STATUS = "syncStatus";
- // Number of messages in the mailbox.
- public static final String MESSAGE_COUNT = "messageCount";
- // The last time a message in this mailbox has been read (in millis)
- public static final String LAST_TOUCHED_TIME = "lastTouchedTime";
- // The UIProvider sync status
- public static final String UI_SYNC_STATUS = "uiSyncStatus";
- // The UIProvider last sync result
- public static final String UI_LAST_SYNC_RESULT = "uiLastSyncResult";
- // The UIProvider sync status
- public static final String LAST_NOTIFIED_MESSAGE_KEY = "lastNotifiedMessageKey";
- // The UIProvider last sync result
- public static final String LAST_NOTIFIED_MESSAGE_COUNT = "lastNotifiedMessageCount";
- // The total number of messages in the remote mailbox
- public static final String TOTAL_COUNT = "totalCount";
- // The full hierarchical name of this folder, in the form a/b/c
- public static final String HIERARCHICAL_NAME = "hierarchicalName";
- }
-
- public interface HostAuthColumns {
- public static final String ID = "_id";
- // The protocol (e.g. "imap", "pop3", "eas", "smtp"
- static final String PROTOCOL = "protocol";
- // The host address
- static final String ADDRESS = "address";
- // The port to use for the connection
- static final String PORT = "port";
- // General purpose flags
- static final String FLAGS = "flags";
- // The login (user name)
- static final String LOGIN = "login";
- // Password
- static final String PASSWORD = "password";
- // A domain or path, if required (used in IMAP and EAS)
- static final String DOMAIN = "domain";
- // An alias to a local client certificate for SSL
- static final String CLIENT_CERT_ALIAS = "certAlias";
- // DEPRECATED - Will not be set or stored
- static final String ACCOUNT_KEY = "accountKey";
- }
-
- public interface PolicyColumns {
- public static final String ID = "_id";
- public static final String PASSWORD_MODE = "passwordMode";
- public static final String PASSWORD_MIN_LENGTH = "passwordMinLength";
- public static final String PASSWORD_EXPIRATION_DAYS = "passwordExpirationDays";
- public static final String PASSWORD_HISTORY = "passwordHistory";
- public static final String PASSWORD_COMPLEX_CHARS = "passwordComplexChars";
- public static final String PASSWORD_MAX_FAILS = "passwordMaxFails";
- public static final String MAX_SCREEN_LOCK_TIME = "maxScreenLockTime";
- public static final String REQUIRE_REMOTE_WIPE = "requireRemoteWipe";
- public static final String REQUIRE_ENCRYPTION = "requireEncryption";
- public static final String REQUIRE_ENCRYPTION_EXTERNAL = "requireEncryptionExternal";
- // ICS additions
- // Note: the appearance of these columns does not imply that we support these features; only
- // that we store them in the Policy structure
- public static final String REQUIRE_MANUAL_SYNC_WHEN_ROAMING = "requireManualSyncRoaming";
- public static final String DONT_ALLOW_CAMERA = "dontAllowCamera";
- public static final String DONT_ALLOW_ATTACHMENTS = "dontAllowAttachments";
- public static final String DONT_ALLOW_HTML = "dontAllowHtml";
- public static final String MAX_ATTACHMENT_SIZE = "maxAttachmentSize";
- public static final String MAX_TEXT_TRUNCATION_SIZE = "maxTextTruncationSize";
- public static final String MAX_HTML_TRUNCATION_SIZE = "maxHTMLTruncationSize";
- public static final String MAX_EMAIL_LOOKBACK = "maxEmailLookback";
- public static final String MAX_CALENDAR_LOOKBACK = "maxCalendarLookback";
- // Indicates that the server allows password recovery, not that we support it
- public static final String PASSWORD_RECOVERY_ENABLED = "passwordRecoveryEnabled";
- // Tokenized strings indicating protocol specific policies enforced/unsupported
- public static final String PROTOCOL_POLICIES_ENFORCED = "protocolPoliciesEnforced";
- public static final String PROTOCOL_POLICIES_UNSUPPORTED = "protocolPoliciesUnsupported";
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/provider/HostAuth.aidl b/email2/emailcommon/src/com/android/emailcommon/provider/HostAuth.aidl
deleted file mode 100644
index 88eb88fe0..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/provider/HostAuth.aidl
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.provider;
-
-parcelable HostAuth; \ No newline at end of file
diff --git a/email2/emailcommon/src/com/android/emailcommon/provider/HostAuth.java b/email2/emailcommon/src/com/android/emailcommon/provider/HostAuth.java
deleted file mode 100644
index 1d054424f..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/provider/HostAuth.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.emailcommon.provider;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-
-import com.android.emailcommon.provider.EmailContent.HostAuthColumns;
-import com.android.emailcommon.utility.SSLUtils;
-import com.android.emailcommon.utility.Utility;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-public final class HostAuth extends EmailContent implements HostAuthColumns, Parcelable {
- public static final String TABLE_NAME = "HostAuth";
- public static final Uri CONTENT_URI = Uri.parse(EmailContent.CONTENT_URI + "/hostauth");
-
- // These legacy constants should be used in code created prior to Email2
- public static final String LEGACY_SCHEME_IMAP = "imap";
- public static final String LEGACY_SCHEME_POP3 = "pop3";
- public static final String LEGACY_SCHEME_EAS = "eas";
- public static final String LEGACY_SCHEME_SMTP = "smtp";
-
- // These constants should, over time, be replaced by information in services.xml
- public static final String SCHEME_IMAP = "imap";
- public static final String SCHEME_POP3 = "pop3";
- public static final String SCHEME_EAS = "eas";
-
- public static final String SCHEME_TRUST_ALL_CERTS = "trustallcerts";
-
- public static final int PORT_UNKNOWN = -1;
-
- public static final int FLAG_NONE = 0x00; // No flags
- public static final int FLAG_SSL = 0x01; // Use SSL
- public static final int FLAG_TLS = 0x02; // Use TLS
- public static final int FLAG_AUTHENTICATE = 0x04; // Use name/password for authentication
- public static final int FLAG_TRUST_ALL = 0x08; // Trust all certificates
- // Mask of settings directly configurable by the user
- public static final int USER_CONFIG_MASK = 0x0b;
-
- public String mProtocol;
- public String mAddress;
- public int mPort;
- public int mFlags;
- public String mLogin;
- public String mPassword;
- public String mDomain;
- public String mClientCertAlias = null;
-
- public static final int CONTENT_ID_COLUMN = 0;
- public static final int CONTENT_PROTOCOL_COLUMN = 1;
- public static final int CONTENT_ADDRESS_COLUMN = 2;
- public static final int CONTENT_PORT_COLUMN = 3;
- public static final int CONTENT_FLAGS_COLUMN = 4;
- public static final int CONTENT_LOGIN_COLUMN = 5;
- public static final int CONTENT_PASSWORD_COLUMN = 6;
- public static final int CONTENT_DOMAIN_COLUMN = 7;
- public static final int CONTENT_CLIENT_CERT_ALIAS_COLUMN = 8;
-
- public static final String[] CONTENT_PROJECTION = new String[] {
- RECORD_ID, HostAuthColumns.PROTOCOL, HostAuthColumns.ADDRESS, HostAuthColumns.PORT,
- HostAuthColumns.FLAGS, HostAuthColumns.LOGIN,
- HostAuthColumns.PASSWORD, HostAuthColumns.DOMAIN, HostAuthColumns.CLIENT_CERT_ALIAS
- };
-
- /**
- * no public constructor since this is a utility class
- */
- public HostAuth() {
- mBaseUri = CONTENT_URI;
-
- // other defaults policy)
- mPort = PORT_UNKNOWN;
- }
-
- /**
- * Restore a HostAuth from the database, given its unique id
- * @param context
- * @param id
- * @return the instantiated HostAuth
- */
- public static HostAuth restoreHostAuthWithId(Context context, long id) {
- return EmailContent.restoreContentWithId(context, HostAuth.class,
- HostAuth.CONTENT_URI, HostAuth.CONTENT_PROJECTION, id);
- }
-
-
- /**
- * Returns the scheme for the specified flags.
- */
- public static String getSchemeString(String protocol, int flags) {
- return getSchemeString(protocol, flags, null);
- }
-
- /**
- * Builds a URI scheme name given the parameters for a {@code HostAuth}.
- * If a {@code clientAlias} is provided, this indicates that a secure connection must be used.
- */
- public static String getSchemeString(String protocol, int flags, String clientAlias) {
- String security = "";
- switch (flags & USER_CONFIG_MASK) {
- case FLAG_SSL:
- security = "+ssl+";
- break;
- case FLAG_SSL | FLAG_TRUST_ALL:
- security = "+ssl+trustallcerts";
- break;
- case FLAG_TLS:
- security = "+tls+";
- break;
- case FLAG_TLS | FLAG_TRUST_ALL:
- security = "+tls+trustallcerts";
- break;
- }
-
- if (!TextUtils.isEmpty(clientAlias)) {
- if (TextUtils.isEmpty(security)) {
- throw new IllegalArgumentException(
- "Can't specify a certificate alias for a non-secure connection");
- }
- if (!security.endsWith("+")) {
- security += "+";
- }
- security += SSLUtils.escapeForSchemeName(clientAlias);
- }
-
- return protocol + security;
- }
-
- /**
- * Returns the flags for the specified scheme.
- */
- public static int getSchemeFlags(String scheme) {
- String[] schemeParts = scheme.split("\\+");
- int flags = HostAuth.FLAG_NONE;
- if (schemeParts.length >= 2) {
- String part1 = schemeParts[1];
- if ("ssl".equals(part1)) {
- flags |= HostAuth.FLAG_SSL;
- } else if ("tls".equals(part1)) {
- flags |= HostAuth.FLAG_TLS;
- }
- if (schemeParts.length >= 3) {
- String part2 = schemeParts[2];
- if (SCHEME_TRUST_ALL_CERTS.equals(part2)) {
- flags |= HostAuth.FLAG_TRUST_ALL;
- }
- }
- }
- return flags;
- }
-
- @Override
- public void restore(Cursor cursor) {
- mBaseUri = CONTENT_URI;
- mId = cursor.getLong(CONTENT_ID_COLUMN);
- mProtocol = cursor.getString(CONTENT_PROTOCOL_COLUMN);
- mAddress = cursor.getString(CONTENT_ADDRESS_COLUMN);
- mPort = cursor.getInt(CONTENT_PORT_COLUMN);
- mFlags = cursor.getInt(CONTENT_FLAGS_COLUMN);
- mLogin = cursor.getString(CONTENT_LOGIN_COLUMN);
- mPassword = cursor.getString(CONTENT_PASSWORD_COLUMN);
- mDomain = cursor.getString(CONTENT_DOMAIN_COLUMN);
- mClientCertAlias = cursor.getString(CONTENT_CLIENT_CERT_ALIAS_COLUMN);
- }
-
- @Override
- public ContentValues toContentValues() {
- ContentValues values = new ContentValues();
- values.put(HostAuthColumns.PROTOCOL, mProtocol);
- values.put(HostAuthColumns.ADDRESS, mAddress);
- values.put(HostAuthColumns.PORT, mPort);
- values.put(HostAuthColumns.FLAGS, mFlags);
- values.put(HostAuthColumns.LOGIN, mLogin);
- values.put(HostAuthColumns.PASSWORD, mPassword);
- values.put(HostAuthColumns.DOMAIN, mDomain);
- values.put(HostAuthColumns.CLIENT_CERT_ALIAS, mClientCertAlias);
- values.put(HostAuthColumns.ACCOUNT_KEY, 0); // Need something to satisfy the DB
- return values;
- }
-
- /**
- * Sets the user name and password from URI user info string
- */
- public void setLogin(String userInfo) {
- String userName = null;
- String userPassword = null;
- if (!TextUtils.isEmpty(userInfo)) {
- String[] userInfoParts = userInfo.split(":", 2);
- userName = userInfoParts[0];
- if (userInfoParts.length > 1) {
- userPassword = userInfoParts[1];
- }
- }
- setLogin(userName, userPassword);
- }
-
- /**
- * Sets the user name and password
- */
- public void setLogin(String userName, String userPassword) {
- mLogin = userName;
- mPassword = userPassword;
-
- if (mLogin == null) {
- mFlags &= ~FLAG_AUTHENTICATE;
- } else {
- mFlags |= FLAG_AUTHENTICATE;
- }
- }
-
- /**
- * Returns the login information. [0] is the username and [1] is the password. If
- * {@link #FLAG_AUTHENTICATE} is not set, {@code null} is returned.
- */
- public String[] getLogin() {
- if ((mFlags & FLAG_AUTHENTICATE) != 0) {
- String trimUser = (mLogin != null) ? mLogin.trim() : "";
- String password = (mPassword != null) ? mPassword : "";
- return new String[] { trimUser, password };
- }
- return null;
- }
-
- public void setConnection(String protocol, String address, int port, int flags) {
- setConnection(protocol, address, port, flags, null);
- }
-
- /**
- * Sets the internal connection parameters based on the specified parameter values.
- * @param protocol the mail protocol to use (e.g. "eas", "imap").
- * @param address the address of the server
- * @param port the port for the connection
- * @param flags flags indicating the security and type of the connection
- * @param clientCertAlias an optional alias to use if a client user certificate is to be
- * presented during connection establishment. If this is non-empty, it must be the case
- * that flags indicates use of a secure connection
- */
- public void setConnection(String protocol, String address,
- int port, int flags, String clientCertAlias) {
- // Set protocol, security, and additional flags based on uri scheme
- mProtocol = protocol;
-
- mFlags &= ~(FLAG_SSL | FLAG_TLS | FLAG_TRUST_ALL);
- mFlags |= (flags & USER_CONFIG_MASK);
-
- boolean useSecureConnection = (flags & (FLAG_SSL | FLAG_TLS)) != 0;
- if (!useSecureConnection && !TextUtils.isEmpty(clientCertAlias)) {
- throw new IllegalArgumentException("Can't use client alias on non-secure connections");
- }
-
- mAddress = address;
- mPort = port;
- if (mPort == PORT_UNKNOWN) {
- boolean useSSL = ((mFlags & FLAG_SSL) != 0);
- if (LEGACY_SCHEME_SMTP.equals(mProtocol)) {
- mPort = useSSL ? 465 : 587;
- }
- }
-
- mClientCertAlias = clientCertAlias;
- }
-
- /** Returns {@code true} if this is an EAS connection; otherwise, {@code false}. */
- public boolean isEasConnection() {
- return SCHEME_EAS.equals(mProtocol);
- }
-
- /** Convenience method to determine if SSL is used. */
- public boolean shouldUseSsl() {
- return (mFlags & FLAG_SSL) != 0;
- }
-
- /** Convenience method to determine if all server certs should be used. */
- public boolean shouldTrustAllServerCerts() {
- return (mFlags & FLAG_TRUST_ALL) != 0;
- }
-
- /**
- * Supports Parcelable
- */
- @Override
- public int describeContents() {
- return 0;
- }
-
- /**
- * Supports Parcelable
- */
- public static final Parcelable.Creator<HostAuth> CREATOR
- = new Parcelable.Creator<HostAuth>() {
- @Override
- public HostAuth createFromParcel(Parcel in) {
- return new HostAuth(in);
- }
-
- @Override
- public HostAuth[] newArray(int size) {
- return new HostAuth[size];
- }
- };
-
- /**
- * Supports Parcelable
- */
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- // mBaseUri is not parceled
- dest.writeLong(mId);
- dest.writeString(mProtocol);
- dest.writeString(mAddress);
- dest.writeInt(mPort);
- dest.writeInt(mFlags);
- dest.writeString(mLogin);
- dest.writeString(mPassword);
- dest.writeString(mDomain);
- dest.writeString(mClientCertAlias);
- }
-
- /**
- * Supports Parcelable
- */
- public HostAuth(Parcel in) {
- mBaseUri = CONTENT_URI;
- mId = in.readLong();
- mProtocol = in.readString();
- mAddress = in.readString();
- mPort = in.readInt();
- mFlags = in.readInt();
- mLogin = in.readString();
- mPassword = in.readString();
- mDomain = in.readString();
- mClientCertAlias = in.readString();
- }
-
- @Override
- public boolean equals(Object o) {
- if (!(o instanceof HostAuth)) {
- return false;
- }
- HostAuth that = (HostAuth)o;
- return mPort == that.mPort
- && mFlags == that.mFlags
- && Utility.areStringsEqual(mProtocol, that.mProtocol)
- && Utility.areStringsEqual(mAddress, that.mAddress)
- && Utility.areStringsEqual(mLogin, that.mLogin)
- && Utility.areStringsEqual(mPassword, that.mPassword)
- && Utility.areStringsEqual(mDomain, that.mDomain)
- && Utility.areStringsEqual(mClientCertAlias, that.mClientCertAlias);
- }
-
- /**
- * The flag, password, and client cert alias are the only items likely to change after a
- * HostAuth is created
- */
- @Override
- public int hashCode() {
- int hashCode = 29;
- if (mPassword != null) {
- hashCode += mPassword.hashCode();
- }
- if (mClientCertAlias != null) {
- hashCode += (mClientCertAlias.hashCode() << 8);
- }
- return (hashCode << 8) + mFlags;
- }
-
- /**
- * Legacy URI parser. Used in parsing template from provider.xml
- * Example string:
- * "eas+ssl+trustallcerts://user:password@server/domain:123"
- *
- * Note that the use of client certificate is specified in the URI, a secure connection type
- * must be used.
- */
- public static void setHostAuthFromString(HostAuth auth, String uriString)
- throws URISyntaxException {
- URI uri = new URI(uriString);
- String path = uri.getPath();
- String domain = null;
- if (!TextUtils.isEmpty(path)) {
- // Strip off the leading slash that begins the path.
- domain = path.substring(1);
- }
- auth.mDomain = domain;
- auth.setLogin(uri.getUserInfo());
-
- String scheme = uri.getScheme();
- auth.setConnection(scheme, uri.getHost(), uri.getPort());
- }
-
- /**
- * Legacy code for setting connection values from a "scheme" (see above)
- */
- public void setConnection(String scheme, String host, int port) {
- String[] schemeParts = scheme.split("\\+");
- String protocol = schemeParts[0];
- String clientCertAlias = null;
- int flags = getSchemeFlags(scheme);
-
- // Example scheme: "eas+ssl+trustallcerts" or "eas+tls+trustallcerts+client-cert-alias"
- if (schemeParts.length > 3) {
- clientCertAlias = schemeParts[3];
- } else if (schemeParts.length > 2) {
- if (!SCHEME_TRUST_ALL_CERTS.equals(schemeParts[2])) {
- mClientCertAlias = schemeParts[2];
- }
- }
-
- setConnection(protocol, host, port, flags, clientCertAlias);
- }
-
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/provider/Mailbox.java b/email2/emailcommon/src/com/android/emailcommon/provider/Mailbox.java
deleted file mode 100644
index 0c2513508..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/provider/Mailbox.java
+++ /dev/null
@@ -1,640 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.emailcommon.provider;
-
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.util.Log;
-
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.EmailContent.SyncColumns;
-import com.android.emailcommon.utility.Utility;
-
-public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns, Parcelable {
- public static final String TABLE_NAME = "Mailbox";
- public static final Uri CONTENT_URI = Uri.parse(EmailContent.CONTENT_URI + "/mailbox");
- public static final Uri ADD_TO_FIELD_URI =
- Uri.parse(EmailContent.CONTENT_URI + "/mailboxIdAddToField");
- public static final Uri FROM_ACCOUNT_AND_TYPE_URI =
- Uri.parse(EmailContent.CONTENT_URI + "/mailboxIdFromAccountAndType");
-
- public String mDisplayName;
- public String mServerId;
- public String mParentServerId;
- public long mParentKey;
- public long mAccountKey;
- public int mType;
- public int mDelimiter;
- public String mSyncKey;
- public int mSyncLookback;
- public int mSyncInterval;
- public long mSyncTime;
- public boolean mFlagVisible = true;
- public int mFlags;
- public int mVisibleLimit;
- public String mSyncStatus;
- public long mLastTouchedTime;
- public int mUiSyncStatus;
- public int mUiLastSyncResult;
- public long mLastNotifiedMessageKey;
- public int mLastNotifiedMessageCount;
- public int mTotalCount;
- public String mHierarchicalName;
-
- public static final int CONTENT_ID_COLUMN = 0;
- public static final int CONTENT_DISPLAY_NAME_COLUMN = 1;
- public static final int CONTENT_SERVER_ID_COLUMN = 2;
- public static final int CONTENT_PARENT_SERVER_ID_COLUMN = 3;
- public static final int CONTENT_ACCOUNT_KEY_COLUMN = 4;
- public static final int CONTENT_TYPE_COLUMN = 5;
- public static final int CONTENT_DELIMITER_COLUMN = 6;
- public static final int CONTENT_SYNC_KEY_COLUMN = 7;
- public static final int CONTENT_SYNC_LOOKBACK_COLUMN = 8;
- public static final int CONTENT_SYNC_INTERVAL_COLUMN = 9;
- public static final int CONTENT_SYNC_TIME_COLUMN = 10;
- public static final int CONTENT_FLAG_VISIBLE_COLUMN = 11;
- public static final int CONTENT_FLAGS_COLUMN = 12;
- public static final int CONTENT_VISIBLE_LIMIT_COLUMN = 13;
- public static final int CONTENT_SYNC_STATUS_COLUMN = 14;
- public static final int CONTENT_PARENT_KEY_COLUMN = 15;
- public static final int CONTENT_LAST_TOUCHED_TIME_COLUMN = 16;
- public static final int CONTENT_UI_SYNC_STATUS_COLUMN = 17;
- public static final int CONTENT_UI_LAST_SYNC_RESULT_COLUMN = 18;
- public static final int CONTENT_LAST_NOTIFIED_MESSAGE_KEY_COLUMN = 19;
- public static final int CONTENT_LAST_NOTIFIED_MESSAGE_COUNT_COLUMN = 20;
- public static final int CONTENT_TOTAL_COUNT_COLUMN = 21;
- public static final int CONTENT_HIERARCHICAL_NAME_COLUMN = 22;
-
- /**
- * <em>NOTE</em>: If fields are added or removed, the method {@link #getHashes()}
- * MUST be updated.
- */
- public static final String[] CONTENT_PROJECTION = new String[] {
- RECORD_ID, MailboxColumns.DISPLAY_NAME, MailboxColumns.SERVER_ID,
- MailboxColumns.PARENT_SERVER_ID, MailboxColumns.ACCOUNT_KEY, MailboxColumns.TYPE,
- MailboxColumns.DELIMITER, MailboxColumns.SYNC_KEY, MailboxColumns.SYNC_LOOKBACK,
- MailboxColumns.SYNC_INTERVAL, MailboxColumns.SYNC_TIME,
- MailboxColumns.FLAG_VISIBLE, MailboxColumns.FLAGS, MailboxColumns.VISIBLE_LIMIT,
- MailboxColumns.SYNC_STATUS, MailboxColumns.PARENT_KEY, MailboxColumns.LAST_TOUCHED_TIME,
- MailboxColumns.UI_SYNC_STATUS, MailboxColumns.UI_LAST_SYNC_RESULT,
- MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY, MailboxColumns.LAST_NOTIFIED_MESSAGE_COUNT,
- MailboxColumns.TOTAL_COUNT, MailboxColumns.HIERARCHICAL_NAME
- };
-
- private static final String ACCOUNT_AND_MAILBOX_TYPE_SELECTION =
- MailboxColumns.ACCOUNT_KEY + " =? AND " +
- MailboxColumns.TYPE + " =?";
- private static final String MAILBOX_TYPE_SELECTION =
- MailboxColumns.TYPE + " =?";
- /** Selection by server pathname for a given account */
- public static final String PATH_AND_ACCOUNT_SELECTION =
- MailboxColumns.SERVER_ID + "=? and " + MailboxColumns.ACCOUNT_KEY + "=?";
-
- private static final String[] MAILBOX_SUM_OF_UNREAD_COUNT_PROJECTION = new String [] {
- "sum(" + MailboxColumns.UNREAD_COUNT + ")"
- };
- private static final int UNREAD_COUNT_COUNT_COLUMN = 0;
- private static final String[] MAILBOX_SUM_OF_MESSAGE_COUNT_PROJECTION = new String [] {
- "sum(" + MailboxColumns.MESSAGE_COUNT + ")"
- };
- private static final int MESSAGE_COUNT_COUNT_COLUMN = 0;
-
- private static final String[] MAILBOX_TYPE_PROJECTION = new String [] {
- MailboxColumns.TYPE
- };
- private static final int MAILBOX_TYPE_TYPE_COLUMN = 0;
-
- private static final String[] MAILBOX_DISPLAY_NAME_PROJECTION = new String [] {
- MailboxColumns.DISPLAY_NAME
- };
- private static final int MAILBOX_DISPLAY_NAME_COLUMN = 0;
-
- public static final long NO_MAILBOX = -1;
-
- // Sentinel values for the mSyncInterval field of both Mailbox records
- public static final int CHECK_INTERVAL_NEVER = -1;
- public static final int CHECK_INTERVAL_PUSH = -2;
- // The following two sentinel values are used by EAS
- // Ping indicates that the EAS mailbox is synced based on a "ping" from the server
- public static final int CHECK_INTERVAL_PING = -3;
- // Push-Hold indicates an EAS push or ping Mailbox shouldn't sync just yet
- public static final int CHECK_INTERVAL_PUSH_HOLD = -4;
-
- // Sentinel for PARENT_KEY. Use NO_MAILBOX for toplevel mailboxes (i.e. no parents).
- public static final long PARENT_KEY_UNINITIALIZED = 0L;
-
- private static final String WHERE_TYPE_AND_ACCOUNT_KEY =
- MailboxColumns.TYPE + "=? and " + MailboxColumns.ACCOUNT_KEY + "=?";
-
- public static final Integer[] INVALID_DROP_TARGETS = new Integer[] {Mailbox.TYPE_DRAFTS,
- Mailbox.TYPE_OUTBOX, Mailbox.TYPE_SENT};
-
- public static final String USER_VISIBLE_MAILBOX_SELECTION =
- MailboxColumns.TYPE + "<" + Mailbox.TYPE_NOT_EMAIL +
- " AND " + MailboxColumns.FLAG_VISIBLE + "=1";
-
- // Types of mailboxes. The list is ordered to match a typical UI presentation, e.g.
- // placing the inbox at the top.
- // Arrays of "special_mailbox_display_names" and "special_mailbox_icons" are depends on
- // types Id of mailboxes.
- /** No type specified */
- public static final int TYPE_NONE = -1;
- /** The "main" mailbox for the account, almost always referred to as "Inbox" */
- public static final int TYPE_INBOX = 0;
- // Types of mailboxes
- /** Generic mailbox that holds mail */
- public static final int TYPE_MAIL = 1;
- /** Parent-only mailbox; does not hold any mail */
- public static final int TYPE_PARENT = 2;
- /** Drafts mailbox */
- public static final int TYPE_DRAFTS = 3;
- /** Local mailbox associated with the account's outgoing mail */
- public static final int TYPE_OUTBOX = 4;
- /** Sent mail; mail that was sent from the account */
- public static final int TYPE_SENT = 5;
- /** Deleted mail */
- public static final int TYPE_TRASH = 6;
- /** Junk mail */
- public static final int TYPE_JUNK = 7;
- /** Search results */
- public static final int TYPE_SEARCH = 8;
- /** Starred (virtual */
- public static final int TYPE_STARRED = 9;
-
- // Types after this are used for non-mail mailboxes (as in EAS)
- public static final int TYPE_NOT_EMAIL = 0x40;
- public static final int TYPE_CALENDAR = 0x41;
- public static final int TYPE_CONTACTS = 0x42;
- public static final int TYPE_TASKS = 0x43;
- public static final int TYPE_EAS_ACCOUNT_MAILBOX = 0x44;
- public static final int TYPE_UNKNOWN = 0x45;
-
- public static final int TYPE_NOT_SYNCABLE = 0x100;
- // A mailbox that holds Messages that are attachments
- public static final int TYPE_ATTACHMENT = 0x101;
-
- // Default "touch" time for system mailboxes
- public static final int DRAFTS_DEFAULT_TOUCH_TIME = 2;
- public static final int SENT_DEFAULT_TOUCH_TIME = 1;
-
- // Bit field flags; each is defined below
- // Warning: Do not read these flags until POP/IMAP/EAS all populate them
- /** No flags set */
- public static final int FLAG_NONE = 0;
- /** Has children in the mailbox hierarchy */
- public static final int FLAG_HAS_CHILDREN = 1<<0;
- /** Children are visible in the UI */
- public static final int FLAG_CHILDREN_VISIBLE = 1<<1;
- /** cannot receive "pushed" mail */
- public static final int FLAG_CANT_PUSH = 1<<2;
- /** can hold emails (i.e. some parent mailboxes cannot themselves contain mail) */
- public static final int FLAG_HOLDS_MAIL = 1<<3;
- /** can be used as a target for moving messages within the account */
- public static final int FLAG_ACCEPTS_MOVED_MAIL = 1<<4;
- /** can be used as a target for appending messages */
- public static final int FLAG_ACCEPTS_APPENDED_MAIL = 1<<5;
- /** has user settings (sync lookback, etc.) */
- public static final int FLAG_SUPPORTS_SETTINGS = 1<<6;
-
- // Magic mailbox ID's
- // NOTE: This is a quick solution for merged mailboxes. I would rather implement this
- // with a more generic way of packaging and sharing queries between activities
- public static final long QUERY_ALL_INBOXES = -2;
- public static final long QUERY_ALL_UNREAD = -3;
- public static final long QUERY_ALL_FAVORITES = -4;
- public static final long QUERY_ALL_DRAFTS = -5;
- public static final long QUERY_ALL_OUTBOX = -6;
-
- public Mailbox() {
- mBaseUri = CONTENT_URI;
- }
-
- /**
- * Restore a Mailbox from the database, given its unique id
- * @param context
- * @param id
- * @return the instantiated Mailbox
- */
- public static Mailbox restoreMailboxWithId(Context context, long id) {
- return EmailContent.restoreContentWithId(context, Mailbox.class,
- Mailbox.CONTENT_URI, Mailbox.CONTENT_PROJECTION, id);
- }
-
- /**
- * Builds a new mailbox with "typical" settings for a system mailbox, such as a local "Drafts"
- * mailbox. This is useful for protocols like POP3 or IMAP who don't have certain local
- * system mailboxes synced with the server.
- * Note: the mailbox is not persisted - clients must call {@link #save} themselves.
- */
- public static Mailbox newSystemMailbox(long accountId, int mailboxType, String name) {
- if (mailboxType == Mailbox.TYPE_MAIL) {
- throw new IllegalArgumentException("Cannot specify TYPE_MAIL for a system mailbox");
- }
- Mailbox box = new Mailbox();
- box.mAccountKey = accountId;
- box.mType = mailboxType;
- box.mSyncInterval = Account.CHECK_INTERVAL_NEVER;
- box.mFlagVisible = true;
- box.mServerId = box.mDisplayName = name;
- box.mParentKey = Mailbox.NO_MAILBOX;
- box.mFlags = Mailbox.FLAG_HOLDS_MAIL;
- return box;
- }
-
- /**
- * Returns a Mailbox from the database, given its pathname and account id. All mailbox
- * paths for a particular account must be unique. Paths are stored in the column
- * {@link MailboxColumns#SERVER_ID} for want of yet another column in the table.
- * @param context
- * @param accountId the ID of the account
- * @param path the fully qualified, remote pathname
- */
- public static Mailbox restoreMailboxForPath(Context context, long accountId, String path) {
- Cursor c = context.getContentResolver().query(
- Mailbox.CONTENT_URI,
- Mailbox.CONTENT_PROJECTION,
- Mailbox.PATH_AND_ACCOUNT_SELECTION,
- new String[] { path, Long.toString(accountId) },
- null);
- if (c == null) throw new ProviderUnavailableException();
- try {
- Mailbox mailbox = null;
- if (c.moveToFirst()) {
- mailbox = getContent(c, Mailbox.class);
- if (c.moveToNext()) {
- Log.w(Logging.LOG_TAG, "Multiple mailboxes named \"" + path + "\"");
- }
- } else {
- Log.i(Logging.LOG_TAG, "Could not find mailbox at \"" + path + "\"");
- }
- return mailbox;
- } finally {
- c.close();
- }
- }
-
- /**
- * Returns a {@link Mailbox} for the given path. If the path is not in the database, a new
- * mailbox will be created.
- */
- public static Mailbox getMailboxForPath(Context context, long accountId, String path) {
- Mailbox mailbox = restoreMailboxForPath(context, accountId, path);
- if (mailbox == null) {
- mailbox = new Mailbox();
- }
- return mailbox;
- }
-
- @Override
- public void restore(Cursor cursor) {
- mBaseUri = CONTENT_URI;
- mId = cursor.getLong(CONTENT_ID_COLUMN);
- mDisplayName = cursor.getString(CONTENT_DISPLAY_NAME_COLUMN);
- mServerId = cursor.getString(CONTENT_SERVER_ID_COLUMN);
- mParentServerId = cursor.getString(CONTENT_PARENT_SERVER_ID_COLUMN);
- mParentKey = cursor.getLong(CONTENT_PARENT_KEY_COLUMN);
- mAccountKey = cursor.getLong(CONTENT_ACCOUNT_KEY_COLUMN);
- mType = cursor.getInt(CONTENT_TYPE_COLUMN);
- mDelimiter = cursor.getInt(CONTENT_DELIMITER_COLUMN);
- mSyncKey = cursor.getString(CONTENT_SYNC_KEY_COLUMN);
- mSyncLookback = cursor.getInt(CONTENT_SYNC_LOOKBACK_COLUMN);
- mSyncInterval = cursor.getInt(CONTENT_SYNC_INTERVAL_COLUMN);
- mSyncTime = cursor.getLong(CONTENT_SYNC_TIME_COLUMN);
- mFlagVisible = cursor.getInt(CONTENT_FLAG_VISIBLE_COLUMN) == 1;
- mFlags = cursor.getInt(CONTENT_FLAGS_COLUMN);
- mVisibleLimit = cursor.getInt(CONTENT_VISIBLE_LIMIT_COLUMN);
- mSyncStatus = cursor.getString(CONTENT_SYNC_STATUS_COLUMN);
- mLastTouchedTime = cursor.getLong(CONTENT_LAST_TOUCHED_TIME_COLUMN);
- mUiSyncStatus = cursor.getInt(CONTENT_UI_SYNC_STATUS_COLUMN);
- mUiLastSyncResult = cursor.getInt(CONTENT_UI_LAST_SYNC_RESULT_COLUMN);
- mLastNotifiedMessageKey = cursor.getLong(CONTENT_LAST_NOTIFIED_MESSAGE_KEY_COLUMN);
- mLastNotifiedMessageCount = cursor.getInt(CONTENT_LAST_NOTIFIED_MESSAGE_COUNT_COLUMN);
- mTotalCount = cursor.getInt(CONTENT_TOTAL_COUNT_COLUMN);
- mHierarchicalName = cursor.getString(CONTENT_HIERARCHICAL_NAME_COLUMN);
- }
-
- @Override
- public ContentValues toContentValues() {
- ContentValues values = new ContentValues();
- values.put(MailboxColumns.DISPLAY_NAME, mDisplayName);
- values.put(MailboxColumns.SERVER_ID, mServerId);
- values.put(MailboxColumns.PARENT_SERVER_ID, mParentServerId);
- values.put(MailboxColumns.PARENT_KEY, mParentKey);
- values.put(MailboxColumns.ACCOUNT_KEY, mAccountKey);
- values.put(MailboxColumns.TYPE, mType);
- values.put(MailboxColumns.DELIMITER, mDelimiter);
- values.put(MailboxColumns.SYNC_KEY, mSyncKey);
- values.put(MailboxColumns.SYNC_LOOKBACK, mSyncLookback);
- values.put(MailboxColumns.SYNC_INTERVAL, mSyncInterval);
- values.put(MailboxColumns.SYNC_TIME, mSyncTime);
- values.put(MailboxColumns.FLAG_VISIBLE, mFlagVisible);
- values.put(MailboxColumns.FLAGS, mFlags);
- values.put(MailboxColumns.VISIBLE_LIMIT, mVisibleLimit);
- values.put(MailboxColumns.SYNC_STATUS, mSyncStatus);
- values.put(MailboxColumns.LAST_TOUCHED_TIME, mLastTouchedTime);
- values.put(MailboxColumns.UI_SYNC_STATUS, mUiSyncStatus);
- values.put(MailboxColumns.UI_LAST_SYNC_RESULT, mUiLastSyncResult);
- values.put(MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY, mLastNotifiedMessageKey);
- values.put(MailboxColumns.LAST_NOTIFIED_MESSAGE_COUNT, mLastNotifiedMessageCount);
- values.put(MailboxColumns.TOTAL_COUNT, mTotalCount);
- values.put(MailboxColumns.HIERARCHICAL_NAME, mHierarchicalName);
- return values;
- }
-
- /**
- * Convenience method to return the id of a given type of Mailbox for a given Account; the
- * common Mailbox types (Inbox, Outbox, Sent, Drafts, Trash, and Search) are all cached by
- * EmailProvider; therefore, we warn if the mailbox is not found in the cache
- *
- * @param context the caller's context, used to get a ContentResolver
- * @param accountId the id of the account to be queried
- * @param type the mailbox type, as defined above
- * @return the id of the mailbox, or -1 if not found
- */
- public static long findMailboxOfType(Context context, long accountId, int type) {
- // First use special URI
- Uri uri = FROM_ACCOUNT_AND_TYPE_URI.buildUpon().appendPath(Long.toString(accountId))
- .appendPath(Integer.toString(type)).build();
- Cursor c = context.getContentResolver().query(uri, ID_PROJECTION, null, null, null);
- if (c != null) {
- try {
- c.moveToFirst();
- Long mailboxId = c.getLong(ID_PROJECTION_COLUMN);
- if (mailboxId != null
- && mailboxId != 0L
- && mailboxId != NO_MAILBOX) {
- return mailboxId;
- }
- } finally {
- c.close();
- }
- }
- // Fallback to querying the database directly.
- String[] bindArguments = new String[] {Long.toString(type), Long.toString(accountId)};
- return Utility.getFirstRowLong(context, Mailbox.CONTENT_URI,
- ID_PROJECTION, WHERE_TYPE_AND_ACCOUNT_KEY, bindArguments, null,
- ID_PROJECTION_COLUMN, NO_MAILBOX);
- }
-
- /**
- * Convenience method that returns the mailbox found using the method above
- */
- public static Mailbox restoreMailboxOfType(Context context, long accountId, int type) {
- long mailboxId = findMailboxOfType(context, accountId, type);
- if (mailboxId != Mailbox.NO_MAILBOX) {
- return Mailbox.restoreMailboxWithId(context, mailboxId);
- }
- return null;
- }
-
- public static int getUnreadCountByAccountAndMailboxType(Context context, long accountId,
- int type) {
- return Utility.getFirstRowInt(context, Mailbox.CONTENT_URI,
- MAILBOX_SUM_OF_UNREAD_COUNT_PROJECTION,
- ACCOUNT_AND_MAILBOX_TYPE_SELECTION,
- new String[] { String.valueOf(accountId), String.valueOf(type) },
- null, UNREAD_COUNT_COUNT_COLUMN, 0);
- }
-
- public static int getUnreadCountByMailboxType(Context context, int type) {
- return Utility.getFirstRowInt(context, Mailbox.CONTENT_URI,
- MAILBOX_SUM_OF_UNREAD_COUNT_PROJECTION,
- MAILBOX_TYPE_SELECTION,
- new String[] { String.valueOf(type) }, null, UNREAD_COUNT_COUNT_COLUMN, 0);
- }
-
- public static int getMessageCountByMailboxType(Context context, int type) {
- return Utility.getFirstRowInt(context, Mailbox.CONTENT_URI,
- MAILBOX_SUM_OF_MESSAGE_COUNT_PROJECTION,
- MAILBOX_TYPE_SELECTION,
- new String[] { String.valueOf(type) }, null, MESSAGE_COUNT_COUNT_COLUMN, 0);
- }
-
- /**
- * Return the mailbox for a message with a given id
- * @param context the caller's context
- * @param messageId the id of the message
- * @return the mailbox, or null if the mailbox doesn't exist
- */
- public static Mailbox getMailboxForMessageId(Context context, long messageId) {
- long mailboxId = Message.getKeyColumnLong(context, messageId,
- MessageColumns.MAILBOX_KEY);
- if (mailboxId != -1) {
- return Mailbox.restoreMailboxWithId(context, mailboxId);
- }
- return null;
- }
-
- /**
- * @return mailbox type, or -1 if mailbox not found.
- */
- public static int getMailboxType(Context context, long mailboxId) {
- Uri url = ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId);
- return Utility.getFirstRowInt(context, url, MAILBOX_TYPE_PROJECTION,
- null, null, null, MAILBOX_TYPE_TYPE_COLUMN, -1);
- }
-
- /**
- * @return mailbox display name, or null if mailbox not found.
- */
- public static String getDisplayName(Context context, long mailboxId) {
- Uri url = ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId);
- return Utility.getFirstRowString(context, url, MAILBOX_DISPLAY_NAME_PROJECTION,
- null, null, null, MAILBOX_DISPLAY_NAME_COLUMN);
- }
-
- /**
- * @param mailboxId ID of a mailbox. This method accepts magic mailbox IDs, such as
- * {@link #QUERY_ALL_INBOXES}. (They're all non-refreshable.)
- * @return true if a mailbox is refreshable.
- */
- public static boolean isRefreshable(Context context, long mailboxId) {
- if (mailboxId < 0) {
- return false; // magic mailboxes
- }
- switch (getMailboxType(context, mailboxId)) {
- case -1: // not found
- case TYPE_DRAFTS:
- case TYPE_OUTBOX:
- return false;
- }
- return true;
- }
-
- /**
- * @return whether or not this mailbox supports moving messages out of it
- */
- public boolean canHaveMessagesMoved() {
- switch (mType) {
- case TYPE_INBOX:
- case TYPE_MAIL:
- case TYPE_TRASH:
- case TYPE_JUNK:
- return true;
- }
- return false; // TYPE_DRAFTS, TYPE_OUTBOX, TYPE_SENT, etc
- }
-
- /**
- * @return true if messages in a mailbox of a type can be replied/forwarded.
- */
- public static boolean isMailboxTypeReplyAndForwardable(int type) {
- return (type != TYPE_TRASH) && (type != TYPE_DRAFTS);
- }
-
- /**
- * Returns a set of hashes that can identify this mailbox. These can be used to
- * determine if any of the fields have been modified.
- */
- public Object[] getHashes() {
- Object[] hash = new Object[CONTENT_PROJECTION.length];
-
- hash[CONTENT_ID_COLUMN]
- = mId;
- hash[CONTENT_DISPLAY_NAME_COLUMN]
- = mDisplayName;
- hash[CONTENT_SERVER_ID_COLUMN]
- = mServerId;
- hash[CONTENT_PARENT_SERVER_ID_COLUMN]
- = mParentServerId;
- hash[CONTENT_ACCOUNT_KEY_COLUMN]
- = mAccountKey;
- hash[CONTENT_TYPE_COLUMN]
- = mType;
- hash[CONTENT_DELIMITER_COLUMN]
- = mDelimiter;
- hash[CONTENT_SYNC_KEY_COLUMN]
- = mSyncKey;
- hash[CONTENT_SYNC_LOOKBACK_COLUMN]
- = mSyncLookback;
- hash[CONTENT_SYNC_INTERVAL_COLUMN]
- = mSyncInterval;
- hash[CONTENT_SYNC_TIME_COLUMN]
- = mSyncTime;
- hash[CONTENT_FLAG_VISIBLE_COLUMN]
- = mFlagVisible;
- hash[CONTENT_FLAGS_COLUMN]
- = mFlags;
- hash[CONTENT_VISIBLE_LIMIT_COLUMN]
- = mVisibleLimit;
- hash[CONTENT_SYNC_STATUS_COLUMN]
- = mSyncStatus;
- hash[CONTENT_PARENT_KEY_COLUMN]
- = mParentKey;
- hash[CONTENT_LAST_TOUCHED_TIME_COLUMN]
- = mLastTouchedTime;
- hash[CONTENT_UI_SYNC_STATUS_COLUMN]
- = mUiSyncStatus;
- hash[CONTENT_UI_LAST_SYNC_RESULT_COLUMN]
- = mUiLastSyncResult;
- hash[CONTENT_LAST_NOTIFIED_MESSAGE_KEY_COLUMN]
- = mLastNotifiedMessageKey;
- hash[CONTENT_LAST_NOTIFIED_MESSAGE_COUNT_COLUMN]
- = mLastNotifiedMessageCount;
- hash[CONTENT_TOTAL_COUNT_COLUMN]
- = mTotalCount;
- hash[CONTENT_HIERARCHICAL_NAME_COLUMN]
- = mHierarchicalName;
- return hash;
- }
-
- // Parcelable
- @Override
- public int describeContents() {
- return 0;
- }
-
- // Parcelable
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeParcelable(mBaseUri, flags);
- dest.writeLong(mId);
- dest.writeString(mDisplayName);
- dest.writeString(mServerId);
- dest.writeString(mParentServerId);
- dest.writeLong(mParentKey);
- dest.writeLong(mAccountKey);
- dest.writeInt(mType);
- dest.writeInt(mDelimiter);
- dest.writeString(mSyncKey);
- dest.writeInt(mSyncLookback);
- dest.writeInt(mSyncInterval);
- dest.writeLong(mSyncTime);
- dest.writeInt(mFlagVisible ? 1 : 0);
- dest.writeInt(mFlags);
- dest.writeInt(mVisibleLimit);
- dest.writeString(mSyncStatus);
- dest.writeLong(mLastTouchedTime);
- dest.writeInt(mUiSyncStatus);
- dest.writeInt(mUiLastSyncResult);
- dest.writeLong(mLastNotifiedMessageKey);
- dest.writeInt(mLastNotifiedMessageCount);
- dest.writeInt(mTotalCount);
- dest.writeString(mHierarchicalName);
- }
-
- public Mailbox(Parcel in) {
- mBaseUri = in.readParcelable(null);
- mId = in.readLong();
- mDisplayName = in.readString();
- mServerId = in.readString();
- mParentServerId = in.readString();
- mParentKey = in.readLong();
- mAccountKey = in.readLong();
- mType = in.readInt();
- mDelimiter = in.readInt();
- mSyncKey = in.readString();
- mSyncLookback = in.readInt();
- mSyncInterval = in.readInt();
- mSyncTime = in.readLong();
- mFlagVisible = in.readInt() == 1;
- mFlags = in.readInt();
- mVisibleLimit = in.readInt();
- mSyncStatus = in.readString();
- mLastTouchedTime = in.readLong();
- mUiSyncStatus = in.readInt();
- mUiLastSyncResult = in.readInt();
- mLastNotifiedMessageKey = in.readLong();
- mLastNotifiedMessageCount = in.readInt();
- mTotalCount = in.readInt();
- mHierarchicalName = in.readString();
- }
-
- public static final Parcelable.Creator<Mailbox> CREATOR = new Parcelable.Creator<Mailbox>() {
- @Override
- public Mailbox createFromParcel(Parcel source) {
- return new Mailbox(source);
- }
-
- @Override
- public Mailbox[] newArray(int size) {
- return new Mailbox[size];
- }
- };
-
- @Override
- public String toString() {
- return "[Mailbox " + mId + ": " + mDisplayName + "]";
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/provider/Policy.aidl b/email2/emailcommon/src/com/android/emailcommon/provider/Policy.aidl
deleted file mode 100644
index 02be51b9a..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/provider/Policy.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.provider;
-
-parcelable Policy;
-
diff --git a/email2/emailcommon/src/com/android/emailcommon/provider/Policy.java b/email2/emailcommon/src/com/android/emailcommon/provider/Policy.java
deleted file mode 100755
index d43290f9f..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/provider/Policy.java
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.provider;
-import android.app.admin.DevicePolicyManager;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.emailcommon.utility.TextUtilities;
-import com.android.emailcommon.utility.Utility;
-
-import java.util.ArrayList;
-
-/**
- * The Policy class represents a set of security requirements that are associated with an Account.
- * The requirements may be either device-specific (e.g. password) or application-specific (e.g.
- * a limit on the sync window for the Account)
- */
-public final class Policy extends EmailContent implements EmailContent.PolicyColumns, Parcelable {
- public static final boolean DEBUG_POLICY = false; // DO NOT SUBMIT WITH THIS SET TO TRUE
- public static final String TAG = "Email/Policy";
-
- public static final String TABLE_NAME = "Policy";
- @SuppressWarnings("hiding")
- public static final Uri CONTENT_URI = Uri.parse(EmailContent.CONTENT_URI + "/policy");
-
- /* Convert days to mSec (used for password expiration) */
- private static final long DAYS_TO_MSEC = 24 * 60 * 60 * 1000;
- /* Small offset (2 minutes) added to policy expiration to make user testing easier. */
- private static final long EXPIRATION_OFFSET_MSEC = 2 * 60 * 1000;
-
- public static final int PASSWORD_MODE_NONE = 0;
- public static final int PASSWORD_MODE_SIMPLE = 1;
- public static final int PASSWORD_MODE_STRONG = 2;
-
- public static final char POLICY_STRING_DELIMITER = '\1';
-
- public int mPasswordMode;
- public int mPasswordMinLength;
- public int mPasswordMaxFails;
- public int mPasswordExpirationDays;
- public int mPasswordHistory;
- public int mPasswordComplexChars;
- public int mMaxScreenLockTime;
- public boolean mRequireRemoteWipe;
- public boolean mRequireEncryption;
- public boolean mRequireEncryptionExternal;
- public boolean mRequireManualSyncWhenRoaming;
- public boolean mDontAllowCamera;
- public boolean mDontAllowAttachments;
- public boolean mDontAllowHtml;
- public int mMaxAttachmentSize;
- public int mMaxTextTruncationSize;
- public int mMaxHtmlTruncationSize;
- public int mMaxEmailLookback;
- public int mMaxCalendarLookback;
- public boolean mPasswordRecoveryEnabled;
- public String mProtocolPoliciesEnforced;
- public String mProtocolPoliciesUnsupported;
-
- public static final int CONTENT_ID_COLUMN = 0;
- public static final int CONTENT_PASSWORD_MODE_COLUMN = 1;
- public static final int CONTENT_PASSWORD_MIN_LENGTH_COLUMN = 2;
- public static final int CONTENT_PASSWORD_EXPIRATION_DAYS_COLUMN = 3;
- public static final int CONTENT_PASSWORD_HISTORY_COLUMN = 4;
- public static final int CONTENT_PASSWORD_COMPLEX_CHARS_COLUMN = 5;
- public static final int CONTENT_PASSWORD_MAX_FAILS_COLUMN = 6;
- public static final int CONTENT_MAX_SCREEN_LOCK_TIME_COLUMN = 7;
- public static final int CONTENT_REQUIRE_REMOTE_WIPE_COLUMN = 8;
- public static final int CONTENT_REQUIRE_ENCRYPTION_COLUMN = 9;
- public static final int CONTENT_REQUIRE_ENCRYPTION_EXTERNAL_COLUMN = 10;
- public static final int CONTENT_REQUIRE_MANUAL_SYNC_WHEN_ROAMING = 11;
- public static final int CONTENT_DONT_ALLOW_CAMERA_COLUMN = 12;
- public static final int CONTENT_DONT_ALLOW_ATTACHMENTS_COLUMN = 13;
- public static final int CONTENT_DONT_ALLOW_HTML_COLUMN = 14;
- public static final int CONTENT_MAX_ATTACHMENT_SIZE_COLUMN = 15;
- public static final int CONTENT_MAX_TEXT_TRUNCATION_SIZE_COLUMN = 16;
- public static final int CONTENT_MAX_HTML_TRUNCATION_SIZE_COLUMN = 17;
- public static final int CONTENT_MAX_EMAIL_LOOKBACK_COLUMN = 18;
- public static final int CONTENT_MAX_CALENDAR_LOOKBACK_COLUMN = 19;
- public static final int CONTENT_PASSWORD_RECOVERY_ENABLED_COLUMN = 20;
- public static final int CONTENT_PROTOCOL_POLICIES_ENFORCED_COLUMN = 21;
- public static final int CONTENT_PROTOCOL_POLICIES_UNSUPPORTED_COLUMN = 22;
-
- public static final String[] CONTENT_PROJECTION = new String[] {RECORD_ID,
- PolicyColumns.PASSWORD_MODE, PolicyColumns.PASSWORD_MIN_LENGTH,
- PolicyColumns.PASSWORD_EXPIRATION_DAYS, PolicyColumns.PASSWORD_HISTORY,
- PolicyColumns.PASSWORD_COMPLEX_CHARS, PolicyColumns.PASSWORD_MAX_FAILS,
- PolicyColumns.MAX_SCREEN_LOCK_TIME, PolicyColumns.REQUIRE_REMOTE_WIPE,
- PolicyColumns.REQUIRE_ENCRYPTION, PolicyColumns.REQUIRE_ENCRYPTION_EXTERNAL,
- PolicyColumns.REQUIRE_MANUAL_SYNC_WHEN_ROAMING, PolicyColumns.DONT_ALLOW_CAMERA,
- PolicyColumns.DONT_ALLOW_ATTACHMENTS, PolicyColumns.DONT_ALLOW_HTML,
- PolicyColumns.MAX_ATTACHMENT_SIZE, PolicyColumns.MAX_TEXT_TRUNCATION_SIZE,
- PolicyColumns.MAX_HTML_TRUNCATION_SIZE, PolicyColumns.MAX_EMAIL_LOOKBACK,
- PolicyColumns.MAX_CALENDAR_LOOKBACK, PolicyColumns.PASSWORD_RECOVERY_ENABLED,
- PolicyColumns.PROTOCOL_POLICIES_ENFORCED, PolicyColumns.PROTOCOL_POLICIES_UNSUPPORTED
- };
-
- public static final Policy NO_POLICY = new Policy();
-
- private static final String[] ATTACHMENT_RESET_PROJECTION =
- new String[] {EmailContent.RECORD_ID, AttachmentColumns.SIZE, AttachmentColumns.FLAGS};
- private static final int ATTACHMENT_RESET_PROJECTION_ID = 0;
- private static final int ATTACHMENT_RESET_PROJECTION_SIZE = 1;
- private static final int ATTACHMENT_RESET_PROJECTION_FLAGS = 2;
-
- public Policy() {
- mBaseUri = CONTENT_URI;
- // By default, the password mode is "none"
- mPasswordMode = PASSWORD_MODE_NONE;
- // All server policies require the ability to wipe the device
- mRequireRemoteWipe = true;
- }
-
- public static Policy restorePolicyWithId(Context context, long id) {
- return EmailContent.restoreContentWithId(context, Policy.class, Policy.CONTENT_URI,
- Policy.CONTENT_PROJECTION, id);
- }
-
- public static long getAccountIdWithPolicyKey(Context context, long id) {
- return Utility.getFirstRowLong(context, Account.CONTENT_URI, Account.ID_PROJECTION,
- AccountColumns.POLICY_KEY + "=?", new String[] {Long.toString(id)}, null,
- Account.ID_PROJECTION_COLUMN, Account.NO_ACCOUNT);
- }
-
- public static ArrayList<String> addPolicyStringToList(String policyString,
- ArrayList<String> policyList) {
- if (policyString != null) {
- int start = 0;
- int len = policyString.length();
- while(start < len) {
- int end = policyString.indexOf(POLICY_STRING_DELIMITER, start);
- if (end > start) {
- policyList.add(policyString.substring(start, end));
- start = end + 1;
- } else {
- break;
- }
- }
- }
- return policyList;
- }
-
- // We override this method to insure that we never write invalid policy data to the provider
- @Override
- public Uri save(Context context) {
- normalize();
- return super.save(context);
- }
-
- /**
- * Review all attachment records for this account, and reset the "don't allow download" flag
- * as required by the account's new security policies
- * @param context the caller's context
- * @param account the account whose attachments need to be reviewed
- * @param policy the new policy for this account
- */
- public static void setAttachmentFlagsForNewPolicy(Context context, Account account,
- Policy policy) {
- // A nasty bit of work; start with all attachments for a given account
- ContentResolver resolver = context.getContentResolver();
- Cursor c = resolver.query(Attachment.CONTENT_URI, ATTACHMENT_RESET_PROJECTION,
- AttachmentColumns.ACCOUNT_KEY + "=?", new String[] {Long.toString(account.mId)},
- null);
- ContentValues cv = new ContentValues();
- try {
- // Get maximum allowed size (0 if we don't allow attachments at all)
- int policyMax = policy.mDontAllowAttachments ? 0 : (policy.mMaxAttachmentSize > 0) ?
- policy.mMaxAttachmentSize : Integer.MAX_VALUE;
- while (c.moveToNext()) {
- int flags = c.getInt(ATTACHMENT_RESET_PROJECTION_FLAGS);
- int size = c.getInt(ATTACHMENT_RESET_PROJECTION_SIZE);
- boolean wasRestricted = (flags & Attachment.FLAG_POLICY_DISALLOWS_DOWNLOAD) != 0;
- boolean isRestricted = size > policyMax;
- if (isRestricted != wasRestricted) {
- if (isRestricted) {
- flags |= Attachment.FLAG_POLICY_DISALLOWS_DOWNLOAD;
- } else {
- flags &= ~Attachment.FLAG_POLICY_DISALLOWS_DOWNLOAD;
- }
- long id = c.getLong(ATTACHMENT_RESET_PROJECTION_ID);
- cv.put(AttachmentColumns.FLAGS, flags);
- resolver.update(ContentUris.withAppendedId(Attachment.CONTENT_URI, id),
- cv, null, null);
- }
- }
- } finally {
- c.close();
- }
- }
-
- /**
- * Normalize the Policy. If the password mode is "none", zero out all password-related fields;
- * zero out complex characters for simple passwords.
- */
- public void normalize() {
- if (mPasswordMode == PASSWORD_MODE_NONE) {
- mPasswordMaxFails = 0;
- mMaxScreenLockTime = 0;
- mPasswordMinLength = 0;
- mPasswordComplexChars = 0;
- mPasswordHistory = 0;
- mPasswordExpirationDays = 0;
- } else {
- if ((mPasswordMode != PASSWORD_MODE_SIMPLE) &&
- (mPasswordMode != PASSWORD_MODE_STRONG)) {
- throw new IllegalArgumentException("password mode");
- }
- // If we're only requiring a simple password, set complex chars to zero; note
- // that EAS can erroneously send non-zero values in this case
- if (mPasswordMode == PASSWORD_MODE_SIMPLE) {
- mPasswordComplexChars = 0;
- }
- }
- }
-
- @Override
- public boolean equals(Object other) {
- if (!(other instanceof Policy)) return false;
- Policy otherPolicy = (Policy)other;
- // Policies here are enforced by the DPM
- if (mRequireEncryption != otherPolicy.mRequireEncryption) return false;
- if (mRequireEncryptionExternal != otherPolicy.mRequireEncryptionExternal) return false;
- if (mRequireRemoteWipe != otherPolicy.mRequireRemoteWipe) return false;
- if (mMaxScreenLockTime != otherPolicy.mMaxScreenLockTime) return false;
- if (mPasswordComplexChars != otherPolicy.mPasswordComplexChars) return false;
- if (mPasswordExpirationDays != otherPolicy.mPasswordExpirationDays) return false;
- if (mPasswordHistory != otherPolicy.mPasswordHistory) return false;
- if (mPasswordMaxFails != otherPolicy.mPasswordMaxFails) return false;
- if (mPasswordMinLength != otherPolicy.mPasswordMinLength) return false;
- if (mPasswordMode != otherPolicy.mPasswordMode) return false;
- if (mDontAllowCamera != otherPolicy.mDontAllowCamera) return false;
-
- // Policies here are enforced by the Exchange sync manager
- // They should eventually be removed from Policy and replaced with some opaque data
- if (mRequireManualSyncWhenRoaming != otherPolicy.mRequireManualSyncWhenRoaming) {
- return false;
- }
- if (mDontAllowAttachments != otherPolicy.mDontAllowAttachments) return false;
- if (mDontAllowHtml != otherPolicy.mDontAllowHtml) return false;
- if (mMaxAttachmentSize != otherPolicy.mMaxAttachmentSize) return false;
- if (mMaxTextTruncationSize != otherPolicy.mMaxTextTruncationSize) return false;
- if (mMaxHtmlTruncationSize != otherPolicy.mMaxHtmlTruncationSize) return false;
- if (mMaxEmailLookback != otherPolicy.mMaxEmailLookback) return false;
- if (mMaxCalendarLookback != otherPolicy.mMaxCalendarLookback) return false;
- if (mPasswordRecoveryEnabled != otherPolicy.mPasswordRecoveryEnabled) return false;
-
- if (!TextUtilities.stringOrNullEquals(mProtocolPoliciesEnforced,
- otherPolicy.mProtocolPoliciesEnforced)) {
- return false;
- }
- if (!TextUtilities.stringOrNullEquals(mProtocolPoliciesUnsupported,
- otherPolicy.mProtocolPoliciesUnsupported)) {
- return false;
- }
- return true;
- }
-
- @Override
- public int hashCode() {
- int code = mRequireEncryption ? 1 : 0;
- code += (mRequireEncryptionExternal ? 1 : 0) << 1;
- code += (mRequireRemoteWipe ? 1 : 0) << 2;
- code += (mMaxScreenLockTime << 3);
- code += (mPasswordComplexChars << 6);
- code += (mPasswordExpirationDays << 12);
- code += (mPasswordHistory << 15);
- code += (mPasswordMaxFails << 18);
- code += (mPasswordMinLength << 22);
- code += (mPasswordMode << 26);
- // Don't need to include the other fields
- return code;
- }
-
- @Override
- public void restore(Cursor cursor) {
- mBaseUri = CONTENT_URI;
- mId = cursor.getLong(CONTENT_ID_COLUMN);
- mPasswordMode = cursor.getInt(CONTENT_PASSWORD_MODE_COLUMN);
- mPasswordMinLength = cursor.getInt(CONTENT_PASSWORD_MIN_LENGTH_COLUMN);
- mPasswordMaxFails = cursor.getInt(CONTENT_PASSWORD_MAX_FAILS_COLUMN);
- mPasswordHistory = cursor.getInt(CONTENT_PASSWORD_HISTORY_COLUMN);
- mPasswordExpirationDays = cursor.getInt(CONTENT_PASSWORD_EXPIRATION_DAYS_COLUMN);
- mPasswordComplexChars = cursor.getInt(CONTENT_PASSWORD_COMPLEX_CHARS_COLUMN);
- mMaxScreenLockTime = cursor.getInt(CONTENT_MAX_SCREEN_LOCK_TIME_COLUMN);
- mRequireRemoteWipe = cursor.getInt(CONTENT_REQUIRE_REMOTE_WIPE_COLUMN) == 1;
- mRequireEncryption = cursor.getInt(CONTENT_REQUIRE_ENCRYPTION_COLUMN) == 1;
- mRequireEncryptionExternal =
- cursor.getInt(CONTENT_REQUIRE_ENCRYPTION_EXTERNAL_COLUMN) == 1;
- mRequireManualSyncWhenRoaming =
- cursor.getInt(CONTENT_REQUIRE_MANUAL_SYNC_WHEN_ROAMING) == 1;
- mDontAllowCamera = cursor.getInt(CONTENT_DONT_ALLOW_CAMERA_COLUMN) == 1;
- mDontAllowAttachments = cursor.getInt(CONTENT_DONT_ALLOW_ATTACHMENTS_COLUMN) == 1;
- mDontAllowHtml = cursor.getInt(CONTENT_DONT_ALLOW_HTML_COLUMN) == 1;
- mMaxAttachmentSize = cursor.getInt(CONTENT_MAX_ATTACHMENT_SIZE_COLUMN);
- mMaxTextTruncationSize = cursor.getInt(CONTENT_MAX_TEXT_TRUNCATION_SIZE_COLUMN);
- mMaxHtmlTruncationSize = cursor.getInt(CONTENT_MAX_HTML_TRUNCATION_SIZE_COLUMN);
- mMaxEmailLookback = cursor.getInt(CONTENT_MAX_EMAIL_LOOKBACK_COLUMN);
- mMaxCalendarLookback = cursor.getInt(CONTENT_MAX_CALENDAR_LOOKBACK_COLUMN);
- mPasswordRecoveryEnabled = cursor.getInt(CONTENT_PASSWORD_RECOVERY_ENABLED_COLUMN) == 1;
- mProtocolPoliciesEnforced = cursor.getString(CONTENT_PROTOCOL_POLICIES_ENFORCED_COLUMN);
- mProtocolPoliciesUnsupported =
- cursor.getString(CONTENT_PROTOCOL_POLICIES_UNSUPPORTED_COLUMN);
- }
-
- @Override
- public ContentValues toContentValues() {
- ContentValues values = new ContentValues();
- values.put(PolicyColumns.PASSWORD_MODE, mPasswordMode);
- values.put(PolicyColumns.PASSWORD_MIN_LENGTH, mPasswordMinLength);
- values.put(PolicyColumns.PASSWORD_MAX_FAILS, mPasswordMaxFails);
- values.put(PolicyColumns.PASSWORD_HISTORY, mPasswordHistory);
- values.put(PolicyColumns.PASSWORD_EXPIRATION_DAYS, mPasswordExpirationDays);
- values.put(PolicyColumns.PASSWORD_COMPLEX_CHARS, mPasswordComplexChars);
- values.put(PolicyColumns.MAX_SCREEN_LOCK_TIME, mMaxScreenLockTime);
- values.put(PolicyColumns.REQUIRE_REMOTE_WIPE, mRequireRemoteWipe);
- values.put(PolicyColumns.REQUIRE_ENCRYPTION, mRequireEncryption);
- values.put(PolicyColumns.REQUIRE_ENCRYPTION_EXTERNAL, mRequireEncryptionExternal);
- values.put(PolicyColumns.REQUIRE_MANUAL_SYNC_WHEN_ROAMING, mRequireManualSyncWhenRoaming);
- values.put(PolicyColumns.DONT_ALLOW_CAMERA, mDontAllowCamera);
- values.put(PolicyColumns.DONT_ALLOW_ATTACHMENTS, mDontAllowAttachments);
- values.put(PolicyColumns.DONT_ALLOW_HTML, mDontAllowHtml);
- values.put(PolicyColumns.MAX_ATTACHMENT_SIZE, mMaxAttachmentSize);
- values.put(PolicyColumns.MAX_TEXT_TRUNCATION_SIZE, mMaxTextTruncationSize);
- values.put(PolicyColumns.MAX_HTML_TRUNCATION_SIZE, mMaxHtmlTruncationSize);
- values.put(PolicyColumns.MAX_EMAIL_LOOKBACK, mMaxEmailLookback);
- values.put(PolicyColumns.MAX_CALENDAR_LOOKBACK, mMaxCalendarLookback);
- values.put(PolicyColumns.PASSWORD_RECOVERY_ENABLED, mPasswordRecoveryEnabled);
- values.put(PolicyColumns.PROTOCOL_POLICIES_ENFORCED, mProtocolPoliciesEnforced);
- values.put(PolicyColumns.PROTOCOL_POLICIES_UNSUPPORTED, mProtocolPoliciesUnsupported);
- return values;
- }
-
- /**
- * Helper to map our internal encoding to DevicePolicyManager password modes.
- */
- public int getDPManagerPasswordQuality() {
- switch (mPasswordMode) {
- case PASSWORD_MODE_SIMPLE:
- return DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
- case PASSWORD_MODE_STRONG:
- if (mPasswordComplexChars == 0) {
- return DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC;
- } else {
- return DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
- }
- default:
- return DevicePolicyManager .PASSWORD_QUALITY_UNSPECIFIED;
- }
- }
-
- /**
- * Helper to map expiration times to the millisecond values used by DevicePolicyManager.
- */
- public long getDPManagerPasswordExpirationTimeout() {
- long result = mPasswordExpirationDays * DAYS_TO_MSEC;
- // Add a small offset to the password expiration. This makes it easier to test
- // by changing (for example) 1 day to 1 day + 5 minutes. If you set an expiration
- // that is within the warning period, you should get a warning fairly quickly.
- if (result > 0) {
- result += EXPIRATION_OFFSET_MSEC;
- }
- return result;
- }
-
- private void appendPolicy(StringBuilder sb, String code, int value) {
- sb.append(code);
- sb.append(":");
- sb.append(value);
- sb.append(" ");
- }
-
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder("[");
- if (equals(NO_POLICY)) {
- sb.append("No policies]");
- } else {
- if (mPasswordMode == PASSWORD_MODE_NONE) {
- sb.append("Pwd none ");
- } else {
- appendPolicy(sb, "Pwd strong", mPasswordMode == PASSWORD_MODE_STRONG ? 1 : 0);
- appendPolicy(sb, "len", mPasswordMinLength);
- appendPolicy(sb, "cmpx", mPasswordComplexChars);
- appendPolicy(sb, "expy", mPasswordExpirationDays);
- appendPolicy(sb, "hist", mPasswordHistory);
- appendPolicy(sb, "fail", mPasswordMaxFails);
- appendPolicy(sb, "idle", mMaxScreenLockTime);
- }
- if (mRequireEncryption) {
- sb.append("encrypt ");
- }
- if (mRequireEncryptionExternal) {
- sb.append("encryptsd ");
- }
- if (mDontAllowCamera) {
- sb.append("nocamera ");
- }
- if (mDontAllowAttachments) {
- sb.append("noatts ");
- }
- if (mRequireManualSyncWhenRoaming) {
- sb.append("nopushroam ");
- }
- if (mMaxAttachmentSize > 0) {
- appendPolicy(sb, "attmax", mMaxAttachmentSize);
- }
- sb.append("]");
- }
- return sb.toString();
- }
-
- /**
- * Supports Parcelable
- */
- @Override
- public int describeContents() {
- return 0;
- }
-
- /**
- * Supports Parcelable
- */
- public static final Parcelable.Creator<Policy> CREATOR = new Parcelable.Creator<Policy>() {
- public Policy createFromParcel(Parcel in) {
- return new Policy(in);
- }
-
- public Policy[] newArray(int size) {
- return new Policy[size];
- }
- };
-
- /**
- * Supports Parcelable
- */
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- // mBaseUri is not parceled
- dest.writeLong(mId);
- dest.writeInt(mPasswordMode);
- dest.writeInt(mPasswordMinLength);
- dest.writeInt(mPasswordMaxFails);
- dest.writeInt(mPasswordHistory);
- dest.writeInt(mPasswordExpirationDays);
- dest.writeInt(mPasswordComplexChars);
- dest.writeInt(mMaxScreenLockTime);
- dest.writeInt(mRequireRemoteWipe ? 1 : 0);
- dest.writeInt(mRequireEncryption ? 1 : 0);
- dest.writeInt(mRequireEncryptionExternal ? 1 : 0);
- dest.writeInt(mRequireManualSyncWhenRoaming ? 1 : 0);
- dest.writeInt(mDontAllowCamera ? 1 : 0);
- dest.writeInt(mDontAllowAttachments ? 1 : 0);
- dest.writeInt(mDontAllowHtml ? 1 : 0);
- dest.writeInt(mMaxAttachmentSize);
- dest.writeInt(mMaxTextTruncationSize);
- dest.writeInt(mMaxHtmlTruncationSize);
- dest.writeInt(mMaxEmailLookback);
- dest.writeInt(mMaxCalendarLookback);
- dest.writeInt(mPasswordRecoveryEnabled ? 1 : 0);
- dest.writeString(mProtocolPoliciesEnforced);
- dest.writeString(mProtocolPoliciesUnsupported);
- }
-
- /**
- * Supports Parcelable
- */
- public Policy(Parcel in) {
- mBaseUri = CONTENT_URI;
- mId = in.readLong();
- mPasswordMode = in.readInt();
- mPasswordMinLength = in.readInt();
- mPasswordMaxFails = in.readInt();
- mPasswordHistory = in.readInt();
- mPasswordExpirationDays = in.readInt();
- mPasswordComplexChars = in.readInt();
- mMaxScreenLockTime = in.readInt();
- mRequireRemoteWipe = in.readInt() == 1;
- mRequireEncryption = in.readInt() == 1;
- mRequireEncryptionExternal = in.readInt() == 1;
- mRequireManualSyncWhenRoaming = in.readInt() == 1;
- mDontAllowCamera = in.readInt() == 1;
- mDontAllowAttachments = in.readInt() == 1;
- mDontAllowHtml = in.readInt() == 1;
- mMaxAttachmentSize = in.readInt();
- mMaxTextTruncationSize = in.readInt();
- mMaxHtmlTruncationSize = in.readInt();
- mMaxEmailLookback = in.readInt();
- mMaxCalendarLookback = in.readInt();
- mPasswordRecoveryEnabled = in.readInt() == 1;
- mProtocolPoliciesEnforced = in.readString();
- mProtocolPoliciesUnsupported = in.readString();
- }
-} \ No newline at end of file
diff --git a/email2/emailcommon/src/com/android/emailcommon/provider/ProviderUnavailableException.java b/email2/emailcommon/src/com/android/emailcommon/provider/ProviderUnavailableException.java
deleted file mode 100644
index 8f33d3466..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/provider/ProviderUnavailableException.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.provider;
-
-public class ProviderUnavailableException extends RuntimeException {
- private static final long serialVersionUID = 1L;
-} \ No newline at end of file
diff --git a/email2/emailcommon/src/com/android/emailcommon/provider/QuickResponse.java b/email2/emailcommon/src/com/android/emailcommon/provider/QuickResponse.java
deleted file mode 100644
index e88e01d95..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/provider/QuickResponse.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.emailcommon.provider;
-
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.QuickResponseColumns;
-import com.google.common.base.Objects;
-
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * A user-modifiable message that may be quickly inserted into the body while user is composing
- * a message. Tied to a specific account.
- */
-public final class QuickResponse extends EmailContent
- implements QuickResponseColumns, Parcelable {
- public static final String TABLE_NAME = "QuickResponse";
- @SuppressWarnings("hiding")
- public static final Uri CONTENT_URI = Uri.parse(EmailContent.CONTENT_URI
- + "/quickresponse");
- public static final Uri ACCOUNT_ID_URI = Uri.parse(
- EmailContent.CONTENT_URI + "/quickresponse/account");
-
- private String mText;
- private long mAccountKey;
-
- private static final int CONTENT_ID_COLUMN = 0;
- private static final int CONTENT_QUICK_RESPONSE_COLUMN = 1;
- private static final int CONTENT_ACCOUNT_KEY_COLUMN = 2;
- public static final String[] CONTENT_PROJECTION = new String[] {
- RECORD_ID,
- QuickResponseColumns.TEXT,
- QuickResponseColumns.ACCOUNT_KEY
- };
-
- /**
- * Creates an empty QuickResponse. Restore should be called after.
- */
- private QuickResponse() {
- // empty
- }
-
- /**
- * Constructor used by CREATOR for parceling.
- */
- private QuickResponse(Parcel in) {
- mBaseUri = CONTENT_URI;
- mId = in.readLong();
- mText = in.readString();
- mAccountKey = in.readLong();
- }
-
- /**
- * Creates QuickResponse associated with a particular account using the given string.
- */
- public QuickResponse(long accountKey, String quickResponse) {
- mBaseUri = CONTENT_URI;
- mAccountKey = accountKey;
- mText = quickResponse;
- }
-
- /**
- * @see com.android.emailcommon.provider.EmailContent#restore(android.database.Cursor)
- */
- @Override
- public void restore(Cursor cursor) {
- mBaseUri = CONTENT_URI;
- mId = cursor.getLong(CONTENT_ID_COLUMN);
- mText = cursor.getString(CONTENT_QUICK_RESPONSE_COLUMN);
- mAccountKey = cursor.getLong(CONTENT_ACCOUNT_KEY_COLUMN);
- }
-
- /**
- * @see com.android.emailcommon.provider.EmailContent#toContentValues()
- */
- @Override
- public ContentValues toContentValues() {
- ContentValues values = new ContentValues();
-
- values.put(QuickResponseColumns.TEXT, mText);
- values.put(QuickResponseColumns.ACCOUNT_KEY, mAccountKey);
-
- return values;
- }
-
- @Override
- public String toString() {
- return mText;
- }
-
- /**
- * Given an array of QuickResponses, returns the an array of the String values
- * corresponding to each QuickResponse.
- */
- public static String[] getQuickResponseStrings(QuickResponse[] quickResponses) {
- int count = quickResponses.length;
- String[] quickResponseStrings = new String[count];
- for (int i = 0; i < count; i++) {
- quickResponseStrings[i] = quickResponses[i].toString();
- }
-
- return quickResponseStrings;
- }
-
- /**
- * @param context
- * @param accountId
- * @return array of QuickResponses for the account with id accountId
- */
- public static QuickResponse[] restoreQuickResponsesWithAccountId(Context context,
- long accountId) {
- Uri uri = ContentUris.withAppendedId(ACCOUNT_ID_URI, accountId);
- Cursor c = context.getContentResolver().query(uri, CONTENT_PROJECTION,
- null, null, null);
-
- try {
- int count = c.getCount();
- QuickResponse[] quickResponses = new QuickResponse[count];
- for (int i = 0; i < count; ++i) {
- c.moveToNext();
- QuickResponse quickResponse = new QuickResponse();
- quickResponse.restore(c);
- quickResponses[i] = quickResponse;
- }
- return quickResponses;
- } finally {
- c.close();
- }
- }
-
- /**
- * Returns the base URI for this QuickResponse
- */
- public Uri getBaseUri() {
- return mBaseUri;
- }
-
- /**
- * Returns the unique id for this QuickResponse
- */
- public long getId() {
- return mId;
- }
-
- @Override
- public boolean equals(Object objectThat) {
- if (this == objectThat) return true;
- if (!(objectThat instanceof QuickResponse)) return false;
-
- QuickResponse that = (QuickResponse) objectThat;
- return
- mText.equals(that.mText) &&
- mId == that.mId &&
- mAccountKey == that.mAccountKey;
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(mId, mText, mAccountKey);
- }
-
- /**
- * Implements Parcelable. Not used.
- */
- @Override
- public int describeContents() {
- return 0;
- }
-
- /**
- * Implements Parcelable.
- */
- public void writeToParcel(Parcel dest, int flags) {
- // mBaseUri is not parceled
- dest.writeLong(mId);
- dest.writeString(mText);
- dest.writeLong(mAccountKey);
- }
-
- /**
- * Implements Parcelable
- */
- public static final Parcelable.Creator<QuickResponse> CREATOR
- = new Parcelable.Creator<QuickResponse>() {
- @Override
- public QuickResponse createFromParcel(Parcel in) {
- return new QuickResponse(in);
- }
-
- @Override
- public QuickResponse[] newArray(int size) {
- return new QuickResponse[size];
- }
- };
-
-} \ No newline at end of file
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/AccountServiceProxy.java b/email2/emailcommon/src/com/android/emailcommon/service/AccountServiceProxy.java
deleted file mode 100644
index f4eb93009..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/AccountServiceProxy.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.service;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
-
-public class AccountServiceProxy extends ServiceProxy implements IAccountService {
-
- public static final String ACCOUNT_INTENT = "com.android.email.ACCOUNT_INTENT";
- public static final int DEFAULT_ACCOUNT_COLOR = 0xFF0000FF;
-
- private IAccountService mService = null;
- private Object mReturn;
-
- public AccountServiceProxy(Context _context) {
- super(_context, new Intent(ACCOUNT_INTENT));
- }
-
- @Override
- public void onConnected(IBinder binder) {
- mService = IAccountService.Stub.asInterface(binder);
- }
-
- @Override
- public IBinder asBinder() {
- return null;
- }
-
- @Override
- public void notifyLoginFailed(final long accountId) {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException {
- mService.notifyLoginFailed(accountId);
- }
- }, "notifyLoginFailed");
- }
-
- @Override
- public void notifyLoginSucceeded(final long accountId) {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException {
- mService.notifyLoginSucceeded(accountId);
- }
- }, "notifyLoginSucceeded");
- }
-
- // The following call is synchronous, and should not be made from the UI thread
- @Override
- public void reconcileAccounts(final String protocol, final String accountManagerType) {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException {
- mService.reconcileAccounts(protocol, accountManagerType);
- }
- }, "reconcileAccounts");
- waitForCompletion();
- }
-
- // The following call is synchronous, and should not be made from the UI thread
- @Override
- public int getAccountColor(final long accountId) {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException{
- mReturn = mService.getAccountColor(accountId);
- }
- }, "getAccountColor");
- waitForCompletion();
- if (mReturn == null) {
- return DEFAULT_ACCOUNT_COLOR;
- } else {
- return (Integer)mReturn;
- }
- }
-
- // The following call is synchronous, and should not be made from the UI thread
- @Override
- public Bundle getConfigurationData(final String accountType) {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException{
- mReturn = mService.getConfigurationData(accountType);
- }
- }, "getConfigurationData");
- waitForCompletion();
- if (mReturn == null) {
- return null;
- } else {
- return (Bundle)mReturn;
- }
- }
-
- // The following call is synchronous, and should not be made from the UI thread
- @Override
- public String getDeviceId() {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException{
- mReturn = mService.getDeviceId();
- }
- }, "getDeviceId");
- waitForCompletion();
- if (mReturn == null) {
- return null;
- } else {
- return (String)mReturn;
- }
- }
-}
-
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/EmailServiceConstants.java b/email2/emailcommon/src/com/android/emailcommon/service/EmailServiceConstants.java
deleted file mode 100644
index 8e8d552da..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/EmailServiceConstants.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.service;
-
-public class EmailServiceConstants {
- /** "Not responded yet", used ONLY for UI. */
- public static final int MEETING_REQUEST_NOT_RESPONDED = 0;
- public static final int MEETING_REQUEST_ACCEPTED = 1;
- public static final int MEETING_REQUEST_TENTATIVE = 2;
- public static final int MEETING_REQUEST_DECLINED = 3;
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/EmailServiceProxy.java b/email2/emailcommon/src/com/android/emailcommon/service/EmailServiceProxy.java
deleted file mode 100644
index 2ec8d6b90..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/EmailServiceProxy.java
+++ /dev/null
@@ -1,482 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.service;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.emailcommon.Api;
-import com.android.emailcommon.Device;
-import com.android.emailcommon.TempDirectory;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Policy;
-
-import java.io.IOException;
-
-/**
- * The EmailServiceProxy class provides a simple interface for the UI to call into the various
- * EmailService classes (e.g. ExchangeService for EAS). It wraps the service connect/disconnect
- * process so that the caller need not be concerned with it.
- *
- * Use the class like this:
- * new EmailServiceProxy(context, class).loadAttachment(attachmentId, callback)
- *
- * Methods without a return value return immediately (i.e. are asynchronous); methods with a
- * return value wait for a result from the Service (i.e. they should not be called from the UI
- * thread) with a default timeout of 30 seconds (settable)
- *
- * An EmailServiceProxy object cannot be reused (trying to do so generates a RemoteException)
- */
-
-public class EmailServiceProxy extends ServiceProxy implements IEmailService {
- private static final String TAG = "EmailServiceProxy";
-
- public static final String AUTO_DISCOVER_BUNDLE_ERROR_CODE = "autodiscover_error_code";
- public static final String AUTO_DISCOVER_BUNDLE_HOST_AUTH = "autodiscover_host_auth";
-
- public static final String VALIDATE_BUNDLE_RESULT_CODE = "validate_result_code";
- public static final String VALIDATE_BUNDLE_POLICY_SET = "validate_policy_set";
- public static final String VALIDATE_BUNDLE_ERROR_MESSAGE = "validate_error_message";
- public static final String VALIDATE_BUNDLE_UNSUPPORTED_POLICIES =
- "validate_unsupported_policies";
-
- private final IEmailServiceCallback mCallback;
- private Object mReturn = null;
- private IEmailService mService;
- private final boolean isRemote;
-
- // Standard debugging
- public static final int DEBUG_BIT = 1;
- // Verbose (parser) logging
- public static final int DEBUG_VERBOSE_BIT = 2;
- // File (SD card) logging
- public static final int DEBUG_FILE_BIT = 4;
- // Enable strict mode
- public static final int DEBUG_ENABLE_STRICT_MODE = 8;
-
- // The first two constructors are used with local services that can be referenced by class
- public EmailServiceProxy(Context _context, Class<?> _class) {
- this(_context, _class, null);
- }
-
- public EmailServiceProxy(Context _context, Class<?> _class, IEmailServiceCallback _callback) {
- super(_context, new Intent(_context, _class));
- mCallback = _callback;
- isRemote = false;
- }
-
- // The following two constructors are used with remote services that must be referenced by
- // a known action or by a prebuilt intent
- public EmailServiceProxy(Context _context, Intent _intent, IEmailServiceCallback _callback) {
- super(_context, _intent);
- try {
- Device.getDeviceId(_context);
- TempDirectory.setTempDirectory(_context);
- } catch (IOException e) {
- }
- mCallback = _callback;
- isRemote = true;
- }
-
- public EmailServiceProxy(Context _context, String _action, IEmailServiceCallback _callback) {
- super(_context, new Intent(_action));
- try {
- Device.getDeviceId(_context);
- TempDirectory.setTempDirectory(_context);
- } catch (IOException e) {
- }
- mCallback = _callback;
- isRemote = true;
- }
-
- @Override
- public void onConnected(IBinder binder) {
- mService = IEmailService.Stub.asInterface(binder);
- }
-
- public boolean isRemote() {
- return isRemote;
- }
-
- @Override
- public int getApiLevel() {
- return Api.LEVEL;
- }
-
- /**
- * Request an attachment to be loaded; the service MUST give higher priority to
- * non-background loading. The service MUST use the loadAttachmentStatus callback when
- * loading has started and stopped and SHOULD send callbacks with progress information if
- * possible.
- *
- * @param attachmentId the id of the attachment record
- * @param background whether or not this request corresponds to a background action (i.e.
- * prefetch) vs a foreground action (user request)
- */
- @Override
- public void loadAttachment(final long attachmentId, final boolean background)
- throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException {
- try {
- if (mCallback != null) mService.setCallback(mCallback);
- mService.loadAttachment(attachmentId, background);
- } catch (RemoteException e) {
- try {
- // Try to send a callback (if set)
- if (mCallback != null) {
- mCallback.loadAttachmentStatus(-1, attachmentId,
- EmailServiceStatus.REMOTE_EXCEPTION, 0);
- }
- } catch (RemoteException e1) {
- }
- }
- }
- }, "loadAttachment");
- }
-
- /**
- * Request the sync of a mailbox; the service MUST send the syncMailboxStatus callback
- * indicating "starting" and "finished" (or error), regardless of whether the mailbox is
- * actually syncable.
- *
- * @param mailboxId the id of the mailbox record
- * @param userRequest whether or not the user specifically asked for the sync
- */
- @Override
- public void startSync(final long mailboxId, final boolean userRequest) throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException {
- if (mCallback != null) mService.setCallback(mCallback);
- mService.startSync(mailboxId, userRequest);
- }
- }, "startSync");
- }
-
- /**
- * Request the immediate termination of a mailbox sync. Although the service is not required to
- * acknowledge this request, it MUST send a "finished" (or error) syncMailboxStatus callback if
- * the sync was started via the startSync service call.
- *
- * @param mailboxId the id of the mailbox record
- * @param userRequest whether or not the user specifically asked for the sync
- */
- @Override
- public void stopSync(final long mailboxId) throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException {
- if (mCallback != null) mService.setCallback(mCallback);
- mService.stopSync(mailboxId);
- }
- }, "stopSync");
- }
-
- /**
- * Validate a user account, given a protocol, host address, port, ssl status, and credentials.
- * The result of this call is returned in a Bundle which MUST include a result code and MAY
- * include a PolicySet that is required by the account. A successful validation implies a host
- * address that serves the specified protocol and credentials sufficient to be authorized
- * by the server to do so.
- *
- * @param hostAuth the hostauth object to validate
- * @return a Bundle as described above
- */
- @Override
- public Bundle validate(final HostAuth hostAuth) throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException{
- if (mCallback != null) mService.setCallback(mCallback);
- mReturn = mService.validate(hostAuth);
- }
- }, "validate");
- waitForCompletion();
- if (mReturn == null) {
- Bundle bundle = new Bundle();
- bundle.putInt(VALIDATE_BUNDLE_RESULT_CODE, MessagingException.UNSPECIFIED_EXCEPTION);
- return bundle;
- } else {
- Bundle bundle = (Bundle) mReturn;
- bundle.setClassLoader(Policy.class.getClassLoader());
- Log.v(TAG, "validate returns " + bundle.getInt(VALIDATE_BUNDLE_RESULT_CODE));
- return bundle;
- }
- }
-
- /**
- * Attempt to determine a user's host address and credentials from an email address and
- * password. The result is returned in a Bundle which MUST include an error code and MAY (on
- * success) include a HostAuth record sufficient to enable the service to validate the user's
- * account.
- *
- * @param userName the user's email address
- * @param password the user's password
- * @return a Bundle as described above
- */
- @Override
- public Bundle autoDiscover(final String userName, final String password)
- throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException{
- if (mCallback != null) mService.setCallback(mCallback);
- mReturn = mService.autoDiscover(userName, password);
- }
- }, "autoDiscover");
- waitForCompletion();
- if (mReturn == null) {
- return null;
- } else {
- Bundle bundle = (Bundle) mReturn;
- bundle.setClassLoader(HostAuth.class.getClassLoader());
- Log.v(TAG, "autoDiscover returns " + bundle.getInt(AUTO_DISCOVER_BUNDLE_ERROR_CODE));
- return bundle;
- }
- }
-
- /**
- * Request that the service reload the folder list for the specified account. The service
- * MUST use the syncMailboxListStatus callback to indicate "starting" and "finished"
- *
- * @param accoundId the id of the account whose folder list is to be updated
- */
- @Override
- public void updateFolderList(final long accountId) throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException {
- if (mCallback != null) mService.setCallback(mCallback);
- mService.updateFolderList(accountId);
- }
- }, "updateFolderList");
- }
-
- /**
- * Specify the debug flags selected by the user. The service SHOULD log debug information as
- * requested.
- *
- * @param flags an integer whose bits represent logging flags as defined in DEBUG_* flags above
- */
- @Override
- public void setLogging(final int flags) throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException {
- if (mCallback != null) mService.setCallback(mCallback);
- mService.setLogging(flags);
- }
- }, "setLogging");
- }
-
- /**
- * Set the global callback object to be used by the service; the service MUST always use the
- * most recently set callback object
- *
- * @param cb a callback object through which all service callbacks are executed
- */
- @Override
- public void setCallback(final IEmailServiceCallback cb) throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException {
- mService.setCallback(cb);
- }
- }, "setCallback");
- }
-
- /**
- * Alert the sync adapter that the account's host information has (or may have) changed; the
- * service MUST stop all in-process or pending syncs, clear error states related to the
- * account and its mailboxes, and restart necessary sync adapters (e.g. pushed mailboxes)
- *
- * @param accountId the id of the account whose host information has changed
- */
- @Override
- public void hostChanged(final long accountId) throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException {
- mService.hostChanged(accountId);
- }
- }, "hostChanged");
- }
-
- /**
- * Send a meeting response for the specified message
- *
- * @param messageId the id of the message containing the meeting request
- * @param response the response code, as defined in EmailServiceConstants
- */
- @Override
- public void sendMeetingResponse(final long messageId, final int response)
- throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException {
- if (mCallback != null) mService.setCallback(mCallback);
- mService.sendMeetingResponse(messageId, response);
- }
- }, "sendMeetingResponse");
- }
-
- /**
- * Request the sync adapter to load a complete message
- *
- * @param messageId the id of the message to be loaded
- */
- @Override
- public void loadMore(final long messageId) throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException {
- if (mCallback != null) mService.setCallback(mCallback);
- mService.loadMore(messageId);
- }
- }, "startSync");
- }
-
- /**
- * Not yet used
- *
- * @param accountId the account in which the folder is to be created
- * @param name the name of the folder to be created
- */
- @Override
- public boolean createFolder(long accountId, String name) throws RemoteException {
- return false;
- }
-
- /**
- * Not yet used
- *
- * @param accountId the account in which the folder resides
- * @param name the name of the folder to be deleted
- */
- @Override
- public boolean deleteFolder(long accountId, String name) throws RemoteException {
- return false;
- }
-
- /**
- * Not yet used
- *
- * @param accountId the account in which the folder resides
- * @param oldName the name of the existing folder
- * @param newName the new name for the folder
- */
- @Override
- public boolean renameFolder(long accountId, String oldName, String newName)
- throws RemoteException {
- return false;
- }
-
- /**
- * Request the service to delete the account's PIM (personal information management) data. This
- * data includes any data that is 1) associated with the account and 2) created/stored by the
- * service or its sync adapters and 3) not stored in the EmailProvider database (e.g. contact
- * and calendar information).
- *
- * @param accountId the account whose data is to be deleted
- */
- @Override
- public void deleteAccountPIMData(final long accountId) throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException {
- mService.deleteAccountPIMData(accountId);
- }
- }, "deleteAccountPIMData");
- }
-
- /**
- * Search for messages given a query string. The string is interpreted as the logical AND of
- * terms separated by white space. The search is performed on the specified mailbox in the
- * specified account (including subfolders, as specified by the includeSubfolders parameter).
- * At most numResults messages matching the query term(s) will be added to the mailbox specified
- * as destMailboxId. If mailboxId is -1, the entire account will be searched. If firstResult is
- * specified and non-zero, results will be added starting with the firstResult'th match (i.e.
- * for the continuation of a previous search)
- *
- * @param accountId the id of the account to be searched
- * @param searchParams the search specification
- * @param destMailboxId the id of the mailbox into which search results are appended
- * @return the total number of matches for this search (regardless of how many were requested)
- */
- @Override
- public int searchMessages(final long accountId, final SearchParams searchParams,
- final long destMailboxId) throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException{
- if (mCallback != null) mService.setCallback(mCallback);
- mReturn = mService.searchMessages(accountId, searchParams, destMailboxId);
- }
- }, "searchMessages");
- waitForCompletion();
- if (mReturn == null) {
- return 0;
- } else {
- return (Integer)mReturn;
- }
- }
-
- /**
- * Request the service to send mail in the specified account's Outbox
- *
- * @param accountId the account whose outgoing mail should be sent
- */
- @Override
- public void sendMail(final long accountId) throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException{
- if (mCallback != null) mService.setCallback(mCallback);
- mService.sendMail(accountId);
- }
- }, "sendMail");
- }
-
- @Override
- public int getCapabilities(final long accountId) throws RemoteException {
- setTask(new ProxyTask() {
- @Override
- public void run() throws RemoteException{
- if (mCallback != null) mService.setCallback(mCallback);
- mReturn = mService.getCapabilities(accountId);
- }
- }, "getCapabilities");
- waitForCompletion();
- if (mReturn == null) {
- return 0;
- } else {
- return (Integer)mReturn;
- }
- }
-
- @Override
- public IBinder asBinder() {
- return null;
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/EmailServiceStatus.java b/email2/emailcommon/src/com/android/emailcommon/service/EmailServiceStatus.java
deleted file mode 100644
index 8cd577c8d..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/EmailServiceStatus.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2008-2009 Marc Blank
- * Licensed to The Android Open Source Project.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.service;
-
-/**
- * Definitions of service status codes returned to IEmailServiceCallback's status method
- */
-public interface EmailServiceStatus {
- public static final int SUCCESS = 0;
- public static final int IN_PROGRESS = 1;
-
- public static final int MESSAGE_NOT_FOUND = 0x10;
- public static final int ATTACHMENT_NOT_FOUND = 0x11;
- public static final int FOLDER_NOT_DELETED = 0x12;
- public static final int FOLDER_NOT_RENAMED = 0x13;
- public static final int FOLDER_NOT_CREATED = 0x14;
- public static final int REMOTE_EXCEPTION = 0x15;
- public static final int LOGIN_FAILED = 0x16;
- public static final int SECURITY_FAILURE = 0x17;
- public static final int ACCOUNT_UNINITIALIZED = 0x18;
- public static final int ACCESS_DENIED = 0x19;
-
- // Maybe we should automatically retry these?
- public static final int CONNECTION_ERROR = 0x20;
-
- // Client certificates used to authenticate cannot be retrieved from the system.
- public static final int CLIENT_CERTIFICATE_ERROR = 0x21;
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/IAccountService.aidl b/email2/emailcommon/src/com/android/emailcommon/service/IAccountService.aidl
deleted file mode 100644
index a29baf58c..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/IAccountService.aidl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.service;
-
-import android.os.Bundle;
-
-interface IAccountService {
- oneway void notifyLoginFailed(long accountId);
- oneway void notifyLoginSucceeded(long accountId);
-
- void reconcileAccounts(String protocol, String accountManagerType);
-
- int getAccountColor(long accountId);
-
- Bundle getConfigurationData(String accountType);
-
- String getDeviceId();
-} \ No newline at end of file
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/IEmailService.aidl b/email2/emailcommon/src/com/android/emailcommon/service/IEmailService.aidl
deleted file mode 100644
index ad21ecdee..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/IEmailService.aidl
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2008-2010 Marc Blank
- * Licensed to The Android Open Source Project.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.service;
-
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.service.IEmailServiceCallback;
-import com.android.emailcommon.service.SearchParams;
-import android.os.Bundle;
-
-interface IEmailService {
- Bundle validate(in HostAuth hostauth);
-
- oneway void startSync(long mailboxId, boolean userRequest);
- oneway void stopSync(long mailboxId);
-
- oneway void loadMore(long messageId);
- oneway void loadAttachment(long attachmentId, boolean background);
-
- oneway void updateFolderList(long accountId);
-
- boolean createFolder(long accountId, String name);
- boolean deleteFolder(long accountId, String name);
- boolean renameFolder(long accountId, String oldName, String newName);
-
- // Must not be oneway; unless an exception is thrown, the caller is guaranteed that the callback
- // has been registered
- void setCallback(IEmailServiceCallback cb);
-
- oneway void setLogging(int on);
-
- oneway void hostChanged(long accountId);
-
- Bundle autoDiscover(String userName, String password);
-
- oneway void sendMeetingResponse(long messageId, int response);
-
- // Must not be oneway; unless an exception is thrown, the caller is guaranteed that the action
- // has been completed
- void deleteAccountPIMData(long accountId);
-
- int getApiLevel();
-
- // API level 2
- int searchMessages(long accountId, in SearchParams params, long destMailboxId);
-
- void sendMail(long accountId);
-
- // API level 3
- int getCapabilities(long accountId);
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/IEmailServiceCallback.aidl b/email2/emailcommon/src/com/android/emailcommon/service/IEmailServiceCallback.aidl
deleted file mode 100644
index c713f5211..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/IEmailServiceCallback.aidl
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2008-2009 Marc Blank
- * Licensed to The Android Open Source Project.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.service;
-
-oneway interface IEmailServiceCallback {
- /*
- * Ordinary results:
- * statuscode = 1, progress = 0: "starting"
- * statuscode = 0, progress = n/a: "finished"
- *
- * If there is an error, it must be reported as follows:
- * statuscode = err, progress = n/a: "stopping due to error"
- *
- * *Optionally* a callback can also include intermediate values from 1..99 e.g.
- * statuscode = 1, progress = 0: "starting"
- * statuscode = 1, progress = 30: "working"
- * statuscode = 1, progress = 60: "working"
- * statuscode = 0, progress = n/a: "finished"
- */
-
- /**
- * Callback to indicate that an account is being synced (updating folder list)
- * accountId = the account being synced
- * statusCode = 0 for OK, 1 for progress, other codes for error
- * progress = 0 for "start", 1..100 for optional progress reports
- */
- void syncMailboxListStatus(long accountId, int statusCode, int progress);
-
- /**
- * Callback to indicate that a mailbox is being synced
- * mailboxId = the mailbox being synced
- * statusCode = 0 for OK, 1 for progress, other codes for error
- * progress = 0 for "start", 1..100 for optional progress reports
- */
- void syncMailboxStatus(long mailboxId, int statusCode, int progress);
-
- /**
- * Callback to indicate that a particular attachment is being synced
- * messageId = the message that owns the attachment
- * attachmentId = the attachment being synced
- * statusCode = 0 for OK, 1 for progress, other codes for error
- * progress = 0 for "start", 1..100 for optional progress reports
- */
- void loadAttachmentStatus(long messageId, long attachmentId, int statusCode, int progress);
-
- /**
- * Callback to indicate that a particular message is being sent
- * messageId = the message being sent
- * statusCode = 0 for OK, 1 for progress, other codes for error
- * progress = 0 for "start", 1..100 for optional progress reports
- */
- void sendMessageStatus(long messageId, String subject, int statusCode, int progress);
-
- /**
- * Callback to indicate that a particular message is being loaded
- * messageId = the message being sent
- * statusCode = 0 for OK, 1 for progress, other codes for error
- * progress = 0 for "start", 1..100 for optional progress reports
- */
- void loadMessageStatus(long messageId, int statusCode, int progress);
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/IPolicyService.aidl b/email2/emailcommon/src/com/android/emailcommon/service/IPolicyService.aidl
deleted file mode 100755
index 9d4be36e4..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/IPolicyService.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.emailcommon.service;
-
-import com.android.emailcommon.provider.Policy;
-
-interface IPolicyService {
- boolean isActive(in Policy policies);
- void setAccountHoldFlag(long accountId, boolean newState);
- void setAccountPolicy(long accountId, in Policy policy, String securityKey);
- oneway void remoteWipe();
-} \ No newline at end of file
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/LegacyPolicySet.java b/email2/emailcommon/src/com/android/emailcommon/service/LegacyPolicySet.java
deleted file mode 100644
index e5d443688..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/LegacyPolicySet.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.service;
-
-import com.android.emailcommon.provider.Policy;
-
-/**
- * Legacy class for policy storage as a bit field of flags
- */
-public class LegacyPolicySet {
-
- // Security (provisioning) flags
- // bits 0..4: password length (0=no password required)
- public static final int PASSWORD_LENGTH_MASK = 31;
- public static final int PASSWORD_LENGTH_SHIFT = 0;
- public static final int PASSWORD_LENGTH_MAX = 30;
- // bits 5..8: password mode
- public static final int PASSWORD_MODE_SHIFT = 5;
- public static final int PASSWORD_MODE_MASK = 15 << PASSWORD_MODE_SHIFT;
- public static final int PASSWORD_MODE_NONE = 0 << PASSWORD_MODE_SHIFT;
- public static final int PASSWORD_MODE_SIMPLE = 1 << PASSWORD_MODE_SHIFT;
- public static final int PASSWORD_MODE_STRONG = 2 << PASSWORD_MODE_SHIFT;
- // bits 9..13: password failures -> wipe device (0=disabled)
- public static final int PASSWORD_MAX_FAILS_SHIFT = 9;
- public static final int PASSWORD_MAX_FAILS_MASK = 31 << PASSWORD_MAX_FAILS_SHIFT;
- public static final int PASSWORD_MAX_FAILS_MAX = 31;
- // bits 14..24: seconds to screen lock (0=not required)
- public static final int SCREEN_LOCK_TIME_SHIFT = 14;
- public static final int SCREEN_LOCK_TIME_MASK = 2047 << SCREEN_LOCK_TIME_SHIFT;
- public static final int SCREEN_LOCK_TIME_MAX = 2047;
- // bit 25: remote wipe capability required
- public static final int REQUIRE_REMOTE_WIPE = 1 << 25;
- // bit 26..35: password expiration (days; 0=not required)
- public static final int PASSWORD_EXPIRATION_SHIFT = 26;
- public static final long PASSWORD_EXPIRATION_MASK = 1023L << PASSWORD_EXPIRATION_SHIFT;
- public static final int PASSWORD_EXPIRATION_MAX = 1023;
- // bit 36..43: password history (length; 0=not required)
- public static final int PASSWORD_HISTORY_SHIFT = 36;
- public static final long PASSWORD_HISTORY_MASK = 255L << PASSWORD_HISTORY_SHIFT;
- public static final int PASSWORD_HISTORY_MAX = 255;
- // bit 44..48: min complex characters (0=not required)
- public static final int PASSWORD_COMPLEX_CHARS_SHIFT = 44;
- public static final long PASSWORD_COMPLEX_CHARS_MASK = 31L << PASSWORD_COMPLEX_CHARS_SHIFT;
- public static final int PASSWORD_COMPLEX_CHARS_MAX = 31;
- // bit 49: requires device encryption (internal)
- public static final long REQUIRE_ENCRYPTION = 1L << 49;
- // bit 50: requires external storage encryption
- public static final long REQUIRE_ENCRYPTION_EXTERNAL = 1L << 50;
-
- /**
- * Convert legacy policy flags to a Policy
- * @param flags legacy policy flags
- * @return a Policy representing the legacy policy flag
- */
- public static Policy flagsToPolicy(long flags) {
- Policy policy = new Policy();
- policy.mPasswordMode = ((int) (flags & PASSWORD_MODE_MASK)) >> PASSWORD_MODE_SHIFT;
- policy.mPasswordMinLength = (int) ((flags & PASSWORD_LENGTH_MASK) >> PASSWORD_LENGTH_SHIFT);
- policy.mPasswordMaxFails =
- (int) ((flags & PASSWORD_MAX_FAILS_MASK) >> PASSWORD_MAX_FAILS_SHIFT);
- policy.mPasswordComplexChars =
- (int) ((flags & PASSWORD_COMPLEX_CHARS_MASK) >> PASSWORD_COMPLEX_CHARS_SHIFT);
- policy.mPasswordHistory = (int) ((flags & PASSWORD_HISTORY_MASK) >> PASSWORD_HISTORY_SHIFT);
- policy.mPasswordExpirationDays =
- (int) ((flags & PASSWORD_EXPIRATION_MASK) >> PASSWORD_EXPIRATION_SHIFT);
- policy.mMaxScreenLockTime =
- (int) ((flags & SCREEN_LOCK_TIME_MASK) >> SCREEN_LOCK_TIME_SHIFT);
- policy.mRequireRemoteWipe = 0 != (flags & REQUIRE_REMOTE_WIPE);
- policy.mRequireEncryption = 0 != (flags & REQUIRE_ENCRYPTION);
- policy.mRequireEncryptionExternal = 0 != (flags & REQUIRE_ENCRYPTION_EXTERNAL);
- return policy;
- }
-}
-
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/PolicyServiceProxy.java b/email2/emailcommon/src/com/android/emailcommon/service/PolicyServiceProxy.java
deleted file mode 100755
index 26e820dee..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/PolicyServiceProxy.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.service;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.Policy;
-
-public class PolicyServiceProxy extends ServiceProxy implements IPolicyService {
- private static final boolean DEBUG_PROXY = false; // DO NOT CHECK THIS IN SET TO TRUE
- private static final String TAG = "PolicyServiceProxy";
-
- // The intent used by sync adapter services to connect to the PolicyService
- public static final String POLICY_INTENT = "com.android.email.POLICY_INTENT";
-
- private IPolicyService mService = null;
- private Object mReturn = null;
-
- public PolicyServiceProxy(Context _context) {
- super(_context, new Intent(POLICY_INTENT));
- }
-
- @Override
- public void onConnected(IBinder binder) {
- mService = IPolicyService.Stub.asInterface(binder);
- }
-
- public IBinder asBinder() {
- return null;
- }
-
- @Override
- public boolean isActive(final Policy arg0) throws RemoteException {
- setTask(new ProxyTask() {
- public void run() throws RemoteException {
- mReturn = mService.isActive(arg0);
- }
- }, "isActive");
- waitForCompletion();
- if (DEBUG_PROXY) {
- Log.v(TAG, "isActive: " + ((mReturn == null) ? "null" : mReturn));
- }
- if (mReturn == null) {
- throw new ServiceUnavailableException("isActive");
- } else {
- return (Boolean)mReturn;
- }
- }
-
- @Override
- public void setAccountPolicy(final long accountId, final Policy policy,
- final String securityKey) throws RemoteException {
- setTask(new ProxyTask() {
- public void run() throws RemoteException {
- mService.setAccountPolicy(accountId, policy, securityKey);
- }
- }, "setAccountPolicy");
- waitForCompletion();
- }
-
- @Override
- public void remoteWipe() throws RemoteException {
- setTask(new ProxyTask() {
- public void run() throws RemoteException {
- mService.remoteWipe();
- }
- }, "remoteWipe");
- }
-
- @Override
- public void setAccountHoldFlag(final long arg0, final boolean arg1) throws RemoteException {
- setTask(new ProxyTask() {
- public void run() throws RemoteException {
- mService.setAccountHoldFlag(arg0, arg1);
- }
- }, "setAccountHoldFlag");
- }
-
- // Static methods that encapsulate the proxy calls above
- public static boolean isActive(Context context, Policy policies) {
- try {
- return new PolicyServiceProxy(context).isActive(policies);
- } catch (RemoteException e) {
- }
- return false;
- }
-
- public static void setAccountHoldFlag(Context context, Account account, boolean newState) {
- try {
- new PolicyServiceProxy(context).setAccountHoldFlag(account.mId, newState);
- } catch (RemoteException e) {
- throw new IllegalStateException("PolicyService transaction failed");
- }
- }
-
- public static void remoteWipe(Context context) {
- try {
- new PolicyServiceProxy(context).remoteWipe();
- } catch (RemoteException e) {
- throw new IllegalStateException("PolicyService transaction failed");
- }
- }
-
- public static void setAccountPolicy(Context context, long accountId, Policy policy,
- String securityKey) {
- try {
- new PolicyServiceProxy(context).setAccountPolicy(accountId, policy, securityKey);
- return;
- } catch (RemoteException e) {
- }
- throw new IllegalStateException("PolicyService transaction failed");
- }
-}
-
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/SearchParams.aidl b/email2/emailcommon/src/com/android/emailcommon/service/SearchParams.aidl
deleted file mode 100644
index 77dedaedb..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/SearchParams.aidl
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.emailcommon.service;
-
-parcelable SearchParams; \ No newline at end of file
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/SearchParams.java b/email2/emailcommon/src/com/android/emailcommon/service/SearchParams.java
deleted file mode 100644
index eacf01df9..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/SearchParams.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.service;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.emailcommon.provider.Mailbox;
-import com.google.common.base.Objects;
-
-public class SearchParams implements Parcelable {
- public static final long ALL_MAILBOXES = Mailbox.NO_MAILBOX;
-
- private static final int DEFAULT_LIMIT = 10; // Need input on what this number should be
- private static final int DEFAULT_OFFSET = 0;
-
- // The id of the mailbox to be searched; if -1, all mailboxes MUST be searched
- public final long mMailboxId;
- // If true, all subfolders of the specified mailbox MUST be searched
- public boolean mIncludeChildren = true;
- // The search terms (the search MUST only select messages whose contents include all of the
- // search terms in the query)
- public final String mFilter;
- // The maximum number of results to be created by this search
- public int mLimit = DEFAULT_LIMIT;
- // If zero, specifies a "new" search; otherwise, asks for a continuation of the previous
- // query(ies) starting with the mOffset'th match (0 based)
- public int mOffset = DEFAULT_OFFSET;
- // The total number of results for this search
- public int mTotalCount = 0;
- // The id of the "search" mailbox being used
- public long mSearchMailboxId;
-
- /**
- * Error codes returned by the searchMessages API
- */
- public static class SearchParamsError {
- public static final int CANT_SEARCH_ALL_MAILBOXES = -1;
- public static final int CANT_SEARCH_CHILDREN = -2;
- }
-
- public SearchParams(long mailboxId, String filter) {
- mMailboxId = mailboxId;
- mFilter = filter;
- }
-
- public SearchParams(long mailboxId, String filter, long searchMailboxId) {
- mMailboxId = mailboxId;
- mFilter = filter;
- mSearchMailboxId = searchMailboxId;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o == this) {
- return true;
- }
- if ((o == null) || !(o instanceof SearchParams)) {
- return false;
- }
-
- SearchParams os = (SearchParams) o;
- return mMailboxId == os.mMailboxId
- && mIncludeChildren == os.mIncludeChildren
- && mFilter.equals(os.mFilter)
- && mLimit == os.mLimit
- && mOffset == os.mOffset;
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(mMailboxId, mFilter, mOffset);
- }
-
- @Override
- public String toString() {
- return "[SearchParams " + mMailboxId + ":" + mFilter + " (" + mOffset + ", " + mLimit + "]";
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- /**
- * Supports Parcelable
- */
- public static final Parcelable.Creator<SearchParams> CREATOR
- = new Parcelable.Creator<SearchParams>() {
- @Override
- public SearchParams createFromParcel(Parcel in) {
- return new SearchParams(in);
- }
-
- @Override
- public SearchParams[] newArray(int size) {
- return new SearchParams[size];
- }
- };
-
- /**
- * Supports Parcelable
- */
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeLong(mMailboxId);
- dest.writeInt(mIncludeChildren ? 1 : 0);
- dest.writeString(mFilter);
- dest.writeInt(mLimit);
- dest.writeInt(mOffset);
- }
-
- /**
- * Supports Parcelable
- */
- public SearchParams(Parcel in) {
- mMailboxId = in.readLong();
- mIncludeChildren = in.readInt() == 1;
- mFilter = in.readString();
- mLimit = in.readInt();
- mOffset = in.readInt();
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/ServiceProxy.java b/email2/emailcommon/src/com/android/emailcommon/service/ServiceProxy.java
deleted file mode 100644
index 8e3bcffb8..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/ServiceProxy.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- /*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.service;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.Debug;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-
-/**
- * The EmailServiceProxy class provides a simple interface for the UI to call into the various
- * EmailService classes (e.g. ExchangeService for EAS). It wraps the service connect/disconnect
- * process so that the caller need not be concerned with it.
- *
- * Use the class like this:
- * new EmailServiceClass(context, class).loadAttachment(attachmentId, callback)
- *
- * Methods without a return value return immediately (i.e. are asynchronous); methods with a
- * return value wait for a result from the Service (i.e. they should not be called from the UI
- * thread) with a default timeout of 30 seconds (settable)
- *
- * An EmailServiceProxy object cannot be reused (trying to do so generates a RemoteException)
- */
-
-public abstract class ServiceProxy {
- private static final boolean DEBUG_PROXY = false; // DO NOT CHECK THIS IN SET TO TRUE
- private final String mTag;
-
- private final Context mContext;
- protected final Intent mIntent;
- private Runnable mRunnable = new ProxyRunnable();
- private ProxyTask mTask;
- private String mName = " unnamed";
- private final ServiceConnection mConnection = new ProxyConnection();
- // Service call timeout (in seconds)
- private int mTimeout = 45;
- private long mStartTime;
- private boolean mDead = false;
-
- public abstract void onConnected(IBinder binder);
-
- public ServiceProxy(Context _context, Intent _intent) {
- mContext = _context;
- mIntent = _intent;
- mTag = getClass().getSimpleName();
- if (Debug.isDebuggerConnected()) {
- mTimeout <<= 2;
- }
- }
-
- private class ProxyConnection implements ServiceConnection {
- public void onServiceConnected(ComponentName name, IBinder binder) {
- onConnected(binder);
- if (DEBUG_PROXY) {
- Log.v(mTag, "Connected: " + name.getShortClassName());
- }
- // Run our task on a new thread
- new Thread(new Runnable() {
- public void run() {
- try {
- runTask();
- } finally {
- endTask();
- }
- }}).start();
- }
-
- public void onServiceDisconnected(ComponentName name) {
- if (DEBUG_PROXY) {
- Log.v(mTag, "Disconnected: " + name.getShortClassName());
- }
- }
- }
-
- public interface ProxyTask {
- public void run() throws RemoteException;
- }
-
- private class ProxyRunnable implements Runnable {
- @Override
- public void run() {
- try {
- mTask.run();
- } catch (RemoteException e) {
- }
- }
- }
-
- public ServiceProxy setTimeout(int secs) {
- mTimeout = secs;
- return this;
- }
-
- public int getTimeout() {
- return mTimeout;
- }
-
- public void endTask() {
- try {
- mContext.unbindService(mConnection);
- } catch (IllegalArgumentException e) {
- // This can happen if the user ended the activity that was using the service
- // This is harmless, but we've got to catch it
- }
-
- mDead = true;
- synchronized(mConnection) {
- if (DEBUG_PROXY) {
- Log.v(mTag, "Task " + mName + " completed; disconnecting");
- }
- mConnection.notify();
- }
- }
-
- private void runTask() {
- Thread thread = new Thread(mRunnable);
- thread.start();
- try {
- thread.join();
- } catch (InterruptedException e) {
- }
- }
-
- public boolean setTask(ProxyTask task, String name) {
- mName = name;
- return setTask(task);
- }
-
- public boolean setTask(ProxyTask task) throws IllegalStateException {
- if (mDead) {
- throw new IllegalStateException();
- }
- mTask = task;
- mStartTime = System.currentTimeMillis();
- if (DEBUG_PROXY) {
- Log.v(mTag, "Bind requested for task " + mName);
- }
- return mContext.bindService(mIntent, mConnection, Context.BIND_AUTO_CREATE);
- }
-
- public void waitForCompletion() {
- synchronized (mConnection) {
- long time = System.currentTimeMillis();
- try {
- if (DEBUG_PROXY) {
- Log.v(mTag, "Waiting for task " + mName + " to complete...");
- }
- mConnection.wait(mTimeout * 1000L);
- } catch (InterruptedException e) {
- // Can be ignored safely
- }
- if (DEBUG_PROXY) {
- Log.v(mTag, "Wait for " + mName + " finished in " +
- (System.currentTimeMillis() - time) + "ms");
- }
- }
- }
-
- public void close() throws RemoteException {
- if (mDead) {
- throw new RemoteException();
- }
- endTask();
- }
-
- /**
- * Connection test; return indicates whether the remote service can be connected to
- * @return the result of trying to connect to the remote service
- */
- public boolean test() {
- try {
- return setTask(new ProxyTask() {
- public void run() throws RemoteException {
- if (DEBUG_PROXY) {
- Log.v(mTag, "Connection test succeeded in " +
- (System.currentTimeMillis() - mStartTime) + "ms");
- }
- }
- }, "test");
- } catch (Exception e) {
- // For any failure, return false.
- return false;
- }
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/ServiceUnavailableException.java b/email2/emailcommon/src/com/android/emailcommon/service/ServiceUnavailableException.java
deleted file mode 100644
index 1ba22a7bf..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/ServiceUnavailableException.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.service;
-
-/**
- * An Exception thrown when a service proxy requires a result and there's a remote exception; this
- * prevents the caller from receiving an invalid result.
- */
-public class ServiceUnavailableException extends RuntimeException {
- private static final long serialVersionUID = 1L;
-
- public ServiceUnavailableException(String string) {
- super(string);
- }
-} \ No newline at end of file
diff --git a/email2/emailcommon/src/com/android/emailcommon/service/SyncWindow.java b/email2/emailcommon/src/com/android/emailcommon/service/SyncWindow.java
deleted file mode 100644
index 52839b204..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/service/SyncWindow.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.service;
-
-public class SyncWindow {
- public static final int SYNC_WINDOW_AUTO = -2;
- public static final int SYNC_WINDOW_USER = -1;
- public static final int SYNC_WINDOW_UNKNOWN = 0;
- public static final int SYNC_WINDOW_1_DAY = 1;
- public static final int SYNC_WINDOW_3_DAYS = 2;
- public static final int SYNC_WINDOW_1_WEEK = 3;
- public static final int SYNC_WINDOW_2_WEEKS = 4;
- public static final int SYNC_WINDOW_1_MONTH = 5;
- public static final int SYNC_WINDOW_ALL = 6;
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/utility/AttachmentUtilities.java b/email2/emailcommon/src/com/android/emailcommon/utility/AttachmentUtilities.java
deleted file mode 100644
index f43458323..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/utility/AttachmentUtilities.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.utility;
-
-import android.app.DownloadManager;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.media.MediaScannerConnection;
-import android.net.Uri;
-import android.os.Environment;
-import android.text.TextUtils;
-import android.util.Log;
-import android.webkit.MimeTypeMap;
-
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
-import com.android.emailcommon.provider.EmailContent.Body;
-import com.android.emailcommon.provider.EmailContent.BodyColumns;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.mail.providers.UIProvider;
-
-import org.apache.commons.io.IOUtils;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-public class AttachmentUtilities {
- public static final String AUTHORITY = "com.android.email.attachmentprovider";
- public static final Uri CONTENT_URI = Uri.parse( "content://" + AUTHORITY);
-
- public static final String FORMAT_RAW = "RAW";
- public static final String FORMAT_THUMBNAIL = "THUMBNAIL";
-
- public static class Columns {
- public static final String _ID = "_id";
- public static final String DATA = "_data";
- public static final String DISPLAY_NAME = "_display_name";
- public static final String SIZE = "_size";
- }
-
- /**
- * The MIME type(s) of attachments we're willing to send via attachments.
- *
- * Any attachments may be added via Intents with Intent.ACTION_SEND or ACTION_SEND_MULTIPLE.
- */
- public static final String[] ACCEPTABLE_ATTACHMENT_SEND_INTENT_TYPES = new String[] {
- "*/*",
- };
- /**
- * The MIME type(s) of attachments we're willing to send from the internal UI.
- *
- * NOTE: At the moment it is not possible to open a chooser with a list of filter types, so
- * the chooser is only opened with the first item in the list.
- */
- public static final String[] ACCEPTABLE_ATTACHMENT_SEND_UI_TYPES = new String[] {
- "image/*",
- "video/*",
- };
- /**
- * The MIME type(s) of attachments we're willing to view.
- */
- public static final String[] ACCEPTABLE_ATTACHMENT_VIEW_TYPES = new String[] {
- "*/*",
- };
- /**
- * The MIME type(s) of attachments we're not willing to view.
- */
- public static final String[] UNACCEPTABLE_ATTACHMENT_VIEW_TYPES = new String[] {
- };
- /**
- * The MIME type(s) of attachments we're willing to download to SD.
- */
- public static final String[] ACCEPTABLE_ATTACHMENT_DOWNLOAD_TYPES = new String[] {
- "*/*",
- };
- /**
- * The MIME type(s) of attachments we're not willing to download to SD.
- */
- public static final String[] UNACCEPTABLE_ATTACHMENT_DOWNLOAD_TYPES = new String[] {
- };
- /**
- * Filename extensions of attachments we're never willing to download (potential malware).
- * Entries in this list are compared to the end of the lower-cased filename, so they must
- * be lower case, and should not include a "."
- */
- public static final String[] UNACCEPTABLE_ATTACHMENT_EXTENSIONS = new String[] {
- // File types that contain malware
- "ade", "adp", "bat", "chm", "cmd", "com", "cpl", "dll", "exe",
- "hta", "ins", "isp", "jse", "lib", "mde", "msc", "msp",
- "mst", "pif", "scr", "sct", "shb", "sys", "vb", "vbe",
- "vbs", "vxd", "wsc", "wsf", "wsh",
- // File types of common compression/container formats (again, to avoid malware)
- "zip", "gz", "z", "tar", "tgz", "bz2",
- };
- /**
- * Filename extensions of attachments that can be installed.
- * Entries in this list are compared to the end of the lower-cased filename, so they must
- * be lower case, and should not include a "."
- */
- public static final String[] INSTALLABLE_ATTACHMENT_EXTENSIONS = new String[] {
- "apk",
- };
- /**
- * The maximum size of an attachment we're willing to download (either View or Save)
- * Attachments that are base64 encoded (most) will be about 1.375x their actual size
- * so we should probably factor that in. A 5MB attachment will generally be around
- * 6.8MB downloaded but only 5MB saved.
- */
- public static final int MAX_ATTACHMENT_DOWNLOAD_SIZE = (5 * 1024 * 1024);
- /**
- * The maximum size of an attachment we're willing to upload (measured as stored on disk).
- * Attachments that are base64 encoded (most) will be about 1.375x their actual size
- * so we should probably factor that in. A 5MB attachment will generally be around
- * 6.8MB uploaded.
- */
- public static final int MAX_ATTACHMENT_UPLOAD_SIZE = (5 * 1024 * 1024);
-
- public static Uri getAttachmentUri(long accountId, long id) {
- return CONTENT_URI.buildUpon()
- .appendPath(Long.toString(accountId))
- .appendPath(Long.toString(id))
- .appendPath(FORMAT_RAW)
- .build();
- }
-
- public static Uri getAttachmentThumbnailUri(long accountId, long id,
- int width, int height) {
- return CONTENT_URI.buildUpon()
- .appendPath(Long.toString(accountId))
- .appendPath(Long.toString(id))
- .appendPath(FORMAT_THUMBNAIL)
- .appendPath(Integer.toString(width))
- .appendPath(Integer.toString(height))
- .build();
- }
-
- /**
- * Return the filename for a given attachment. This should be used by any code that is
- * going to *write* attachments.
- *
- * This does not create or write the file, or even the directories. It simply builds
- * the filename that should be used.
- */
- public static File getAttachmentFilename(Context context, long accountId, long attachmentId) {
- return new File(getAttachmentDirectory(context, accountId), Long.toString(attachmentId));
- }
-
- /**
- * Return the directory for a given attachment. This should be used by any code that is
- * going to *write* attachments.
- *
- * This does not create or write the directory. It simply builds the pathname that should be
- * used.
- */
- public static File getAttachmentDirectory(Context context, long accountId) {
- return context.getDatabasePath(accountId + ".db_att");
- }
-
- /**
- * Helper to convert unknown or unmapped attachments to something useful based on filename
- * extensions. The mime type is inferred based upon the table below. It's not perfect, but
- * it helps.
- *
- * <pre>
- * |---------------------------------------------------------|
- * | E X T E N S I O N |
- * |---------------------------------------------------------|
- * | .eml | known(.png) | unknown(.abc) | none |
- * | M |-----------------------------------------------------------------------|
- * | I | none | msg/rfc822 | image/png | app/abc | app/oct-str |
- * | M |-------------| (always | | | |
- * | E | app/oct-str | overrides | | | |
- * | T |-------------| | |-----------------------------|
- * | Y | text/plain | | | text/plain |
- * | P |-------------| |-------------------------------------------|
- * | E | any/type | | any/type |
- * |---|-----------------------------------------------------------------------|
- * </pre>
- *
- * NOTE: Since mime types on Android are case-*sensitive*, return values are always in
- * lower case.
- *
- * @param fileName The given filename
- * @param mimeType The given mime type
- * @return A likely mime type for the attachment
- */
- public static String inferMimeType(final String fileName, final String mimeType) {
- String resultType = null;
- String fileExtension = getFilenameExtension(fileName);
- boolean isTextPlain = "text/plain".equalsIgnoreCase(mimeType);
-
- if ("eml".equals(fileExtension)) {
- resultType = "message/rfc822";
- } else {
- boolean isGenericType =
- isTextPlain || "application/octet-stream".equalsIgnoreCase(mimeType);
- // If the given mime type is non-empty and non-generic, return it
- if (isGenericType || TextUtils.isEmpty(mimeType)) {
- if (!TextUtils.isEmpty(fileExtension)) {
- // Otherwise, try to find a mime type based upon the file extension
- resultType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);
- if (TextUtils.isEmpty(resultType)) {
- // Finally, if original mimetype is text/plain, use it; otherwise synthesize
- resultType = isTextPlain ? mimeType : "application/" + fileExtension;
- }
- }
- } else {
- resultType = mimeType;
- }
- }
-
- // No good guess could be made; use an appropriate generic type
- if (TextUtils.isEmpty(resultType)) {
- resultType = isTextPlain ? "text/plain" : "application/octet-stream";
- }
- return resultType.toLowerCase();
- }
-
- /**
- * Extract and return filename's extension, converted to lower case, and not including the "."
- *
- * @return extension, or null if not found (or null/empty filename)
- */
- public static String getFilenameExtension(String fileName) {
- String extension = null;
- if (!TextUtils.isEmpty(fileName)) {
- int lastDot = fileName.lastIndexOf('.');
- if ((lastDot > 0) && (lastDot < fileName.length() - 1)) {
- extension = fileName.substring(lastDot + 1).toLowerCase();
- }
- }
- return extension;
- }
-
- /**
- * Resolve attachment id to content URI. Returns the resolved content URI (from the attachment
- * DB) or, if not found, simply returns the incoming value.
- *
- * @param attachmentUri
- * @return resolved content URI
- *
- * TODO: Throws an SQLite exception on a missing DB file (e.g. unknown URI) instead of just
- * returning the incoming uri, as it should.
- */
- public static Uri resolveAttachmentIdToContentUri(ContentResolver resolver, Uri attachmentUri) {
- Cursor c = resolver.query(attachmentUri,
- new String[] { Columns.DATA },
- null, null, null);
- if (c != null) {
- try {
- if (c.moveToFirst()) {
- final String strUri = c.getString(0);
- if (strUri != null) {
- return Uri.parse(strUri);
- }
- }
- } finally {
- c.close();
- }
- }
- return attachmentUri;
- }
-
- /**
- * In support of deleting a message, find all attachments and delete associated attachment
- * files.
- * @param context
- * @param accountId the account for the message
- * @param messageId the message
- */
- public static void deleteAllAttachmentFiles(Context context, long accountId, long messageId) {
- Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, messageId);
- Cursor c = context.getContentResolver().query(uri, Attachment.ID_PROJECTION,
- null, null, null);
- try {
- while (c.moveToNext()) {
- long attachmentId = c.getLong(Attachment.ID_PROJECTION_COLUMN);
- File attachmentFile = getAttachmentFilename(context, accountId, attachmentId);
- // Note, delete() throws no exceptions for basic FS errors (e.g. file not found)
- // it just returns false, which we ignore, and proceed to the next file.
- // This entire loop is best-effort only.
- attachmentFile.delete();
- }
- } finally {
- c.close();
- }
- }
-
- /**
- * In support of deleting a mailbox, find all messages and delete their attachments.
- *
- * @param context
- * @param accountId the account for the mailbox
- * @param mailboxId the mailbox for the messages
- */
- public static void deleteAllMailboxAttachmentFiles(Context context, long accountId,
- long mailboxId) {
- Cursor c = context.getContentResolver().query(Message.CONTENT_URI,
- Message.ID_COLUMN_PROJECTION, MessageColumns.MAILBOX_KEY + "=?",
- new String[] { Long.toString(mailboxId) }, null);
- try {
- while (c.moveToNext()) {
- long messageId = c.getLong(Message.ID_PROJECTION_COLUMN);
- deleteAllAttachmentFiles(context, accountId, messageId);
- }
- } finally {
- c.close();
- }
- }
-
- /**
- * In support of deleting or wiping an account, delete all related attachments.
- *
- * @param context
- * @param accountId the account to scrub
- */
- public static void deleteAllAccountAttachmentFiles(Context context, long accountId) {
- File[] files = getAttachmentDirectory(context, accountId).listFiles();
- if (files == null) return;
- for (File file : files) {
- boolean result = file.delete();
- if (!result) {
- Log.e(Logging.LOG_TAG, "Failed to delete attachment file " + file.getName());
- }
- }
- }
-
- private static long copyFile(InputStream in, OutputStream out) throws IOException {
- long size = IOUtils.copy(in, out);
- in.close();
- out.flush();
- out.close();
- return size;
- }
-
- /**
- * Save the attachment to its final resting place (cache or sd card)
- */
- public static void saveAttachment(Context context, InputStream in, Attachment attachment) {
- Uri uri = ContentUris.withAppendedId(Attachment.CONTENT_URI, attachment.mId);
- ContentValues cv = new ContentValues();
- long attachmentId = attachment.mId;
- long accountId = attachment.mAccountKey;
- String contentUri = null;
- long size;
- try {
- ContentResolver resolver = context.getContentResolver();
- if (attachment.mUiDestination == UIProvider.AttachmentDestination.CACHE) {
- Uri attUri = getAttachmentUri(accountId, attachmentId);
- size = copyFile(in, resolver.openOutputStream(attUri));
- contentUri = attUri.toString();
- } else if (Utility.isExternalStorageMounted()) {
- File downloads = Environment.getExternalStoragePublicDirectory(
- Environment.DIRECTORY_DOWNLOADS);
- downloads.mkdirs();
- File file = Utility.createUniqueFile(downloads, attachment.mFileName);
- size = copyFile(in, new FileOutputStream(file));
- String absolutePath = file.getAbsolutePath();
-
- // Although the download manager can scan media files, scanning only happens
- // after the user clicks on the item in the Downloads app. So, we run the
- // attachment through the media scanner ourselves so it gets added to
- // gallery / music immediately.
- MediaScannerConnection.scanFile(context, new String[] {absolutePath},
- null, null);
-
- DownloadManager dm =
- (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
- long id = dm.addCompletedDownload(attachment.mFileName, attachment.mFileName,
- false /* do not use media scanner */,
- attachment.mMimeType, absolutePath, size,
- true /* show notification */);
- contentUri = dm.getUriForDownloadedFile(id).toString();
-
- } else {
- Log.w(Logging.LOG_TAG, "Trying to save an attachment without external storage?");
- throw new IOException();
- }
-
- // Update the attachment
- cv.put(AttachmentColumns.SIZE, size);
- cv.put(AttachmentColumns.CONTENT_URI, contentUri);
- cv.put(AttachmentColumns.UI_STATE, UIProvider.AttachmentState.SAVED);
- } catch (IOException e) {
- // Handle failures here...
- cv.put(AttachmentColumns.UI_STATE, UIProvider.AttachmentState.FAILED);
- }
- context.getContentResolver().update(uri, cv, null, null);
-
- // If this is an inline attachment, update the body
- if (contentUri != null && attachment.mContentId != null) {
- Body body = Body.restoreBodyWithMessageId(context, attachment.mMessageKey);
- if (body != null && body.mHtmlContent != null) {
- cv.clear();
- String html = body.mHtmlContent;
- String contentIdRe =
- "\\s+(?i)src=\"cid(?-i):\\Q" + attachment.mContentId + "\\E\"";
- String srcContentUri = " src=\"" + contentUri + "\"";
- html = html.replaceAll(contentIdRe, srcContentUri);
- cv.put(BodyColumns.HTML_CONTENT, html);
- context.getContentResolver().update(
- ContentUris.withAppendedId(Body.CONTENT_URI, body.mId), cv, null, null);
- }
- }
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/utility/CertificateRequestor.java b/email2/emailcommon/src/com/android/emailcommon/utility/CertificateRequestor.java
deleted file mode 100644
index b78895b3a..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/utility/CertificateRequestor.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.emailcommon.utility;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.security.KeyChain;
-import android.security.KeyChainAliasCallback;
-
-/**
- * A headless Activity which simply calls into the framework {@link KeyChain} service to select
- * a certificate to use for establishing secure connections in the Email app.
- */
-public class CertificateRequestor extends Activity implements KeyChainAliasCallback {
-
- public static final String ACTION_REQUEST_CERT = "com.android.emailcommon.REQUEST_CERT";
-
- public static final String EXTRA_HOST = "CertificateRequestor.host";
- public static final String EXTRA_PORT = "CertificateRequestor.port";
-
- public static final String RESULT_ALIAS = "CertificateRequestor.alias";
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- Intent i = getIntent();
- String host = i.getStringExtra(EXTRA_HOST);
- int port = i.getIntExtra(EXTRA_PORT, -1);
-
- KeyChain.choosePrivateKeyAlias(
- this, this,
- null /* keytypes */, null /* issuers */,
- host, port,
- null /* alias */);
- }
-
- /**
- * Callback for the certificate request. Does not happen on the UI thread.
- */
- @Override
- public void alias(String alias) {
- if (alias == null) {
- setResult(RESULT_CANCELED);
- } else {
- Intent data = new Intent();
- data.putExtra(RESULT_ALIAS, alias);
- setResult(RESULT_OK, data);
- }
- finish();
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/utility/ConversionUtilities.java b/email2/emailcommon/src/com/android/emailcommon/utility/ConversionUtilities.java
deleted file mode 100644
index 41ba12d14..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/utility/ConversionUtilities.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.utility;
-
-import com.android.emailcommon.internet.MimeHeader;
-import com.android.emailcommon.internet.MimeUtility;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.mail.Part;
-import com.android.emailcommon.provider.EmailContent;
-
-import android.text.TextUtils;
-
-import java.util.ArrayList;
-
-public class ConversionUtilities {
- /**
- * Values for HEADER_ANDROID_BODY_QUOTED_PART to tag body parts
- */
- public static final String BODY_QUOTED_PART_REPLY = "quoted-reply";
- public static final String BODY_QUOTED_PART_FORWARD = "quoted-forward";
- public static final String BODY_QUOTED_PART_INTRO = "quoted-intro";
-
- /**
- * Helper function to append text to a StringBuffer, creating it if necessary.
- * Optimization: The majority of the time we are *not* appending - we should have a path
- * that deals with single strings.
- */
- private static StringBuffer appendTextPart(StringBuffer sb, String newText) {
- if (newText == null) {
- return sb;
- }
- else if (sb == null) {
- sb = new StringBuffer(newText);
- } else {
- if (sb.length() > 0) {
- sb.append('\n');
- }
- sb.append(newText);
- }
- return sb;
- }
-
- /**
- * Copy body text (plain and/or HTML) from MimeMessage to provider Message
- */
- public static boolean updateBodyFields(EmailContent.Body body,
- EmailContent.Message localMessage, ArrayList<Part> viewables)
- throws MessagingException {
-
- body.mMessageKey = localMessage.mId;
-
- StringBuffer sbHtml = null;
- StringBuffer sbText = null;
- StringBuffer sbHtmlReply = null;
- StringBuffer sbTextReply = null;
- StringBuffer sbIntroText = null;
-
- for (Part viewable : viewables) {
- String text = MimeUtility.getTextFromPart(viewable);
- String[] replyTags = viewable.getHeader(MimeHeader.HEADER_ANDROID_BODY_QUOTED_PART);
- String replyTag = null;
- if (replyTags != null && replyTags.length > 0) {
- replyTag = replyTags[0];
- }
- // Deploy text as marked by the various tags
- boolean isHtml = "text/html".equalsIgnoreCase(viewable.getMimeType());
-
- if (replyTag != null) {
- boolean isQuotedReply = BODY_QUOTED_PART_REPLY.equalsIgnoreCase(replyTag);
- boolean isQuotedForward = BODY_QUOTED_PART_FORWARD.equalsIgnoreCase(replyTag);
- boolean isQuotedIntro = BODY_QUOTED_PART_INTRO.equalsIgnoreCase(replyTag);
-
- if (isQuotedReply || isQuotedForward) {
- if (isHtml) {
- sbHtmlReply = appendTextPart(sbHtmlReply, text);
- } else {
- sbTextReply = appendTextPart(sbTextReply, text);
- }
- // Set message flags as well
- localMessage.mFlags &= ~EmailContent.Message.FLAG_TYPE_MASK;
- localMessage.mFlags |= isQuotedReply
- ? EmailContent.Message.FLAG_TYPE_REPLY
- : EmailContent.Message.FLAG_TYPE_FORWARD;
- continue;
- }
- if (isQuotedIntro) {
- sbIntroText = appendTextPart(sbIntroText, text);
- continue;
- }
- }
-
- // Most of the time, just process regular body parts
- if (isHtml) {
- sbHtml = appendTextPart(sbHtml, text);
- } else {
- sbText = appendTextPart(sbText, text);
- }
- }
-
- // write the combined data to the body part
- if (!TextUtils.isEmpty(sbText)) {
- String text = sbText.toString();
- body.mTextContent = text;
- localMessage.mSnippet = TextUtilities.makeSnippetFromPlainText(text);
- }
- if (!TextUtils.isEmpty(sbHtml)) {
- String text = sbHtml.toString();
- body.mHtmlContent = text;
- if (localMessage.mSnippet == null) {
- localMessage.mSnippet = TextUtilities.makeSnippetFromHtmlText(text);
- }
- }
- if (sbHtmlReply != null && sbHtmlReply.length() != 0) {
- body.mHtmlReply = sbHtmlReply.toString();
- }
- if (sbTextReply != null && sbTextReply.length() != 0) {
- body.mTextReply = sbTextReply.toString();
- }
- if (sbIntroText != null && sbIntroText.length() != 0) {
- body.mIntroText = sbIntroText.toString();
- }
- return true;
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/utility/DelayedOperations.java b/email2/emailcommon/src/com/android/emailcommon/utility/DelayedOperations.java
deleted file mode 100644
index 29324a315..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/utility/DelayedOperations.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.utility;
-
-import com.google.common.annotations.VisibleForTesting;
-
-import android.os.Handler;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-
-/**
- * Class that helps post {@link Runnable}s to a {@link Handler}, and cancel pending ones
- * at once.
- */
-public class DelayedOperations {
- private final Handler mHandler;
-
- @VisibleForTesting
- final LinkedList<QueuedOperation> mPendingOperations = new LinkedList<QueuedOperation>();
-
- private class QueuedOperation implements Runnable {
- private final Runnable mActualRannable;
-
- public QueuedOperation(Runnable actualRannable) {
- mActualRannable = actualRannable;
- }
-
- @Override
- public void run() {
- mPendingOperations.remove(this);
- mActualRannable.run();
- }
-
- public void cancel() {
- mPendingOperations.remove(this);
- cancelRunnable(this);
- }
- }
-
- public DelayedOperations(Handler handler) {
- mHandler = handler;
- }
-
- /**
- * Post a {@link Runnable} to the handler. Equivalent to {@link Handler#post(Runnable)}.
- */
- public void post(Runnable r) {
- final QueuedOperation qo = new QueuedOperation(r);
- mPendingOperations.add(qo);
- postRunnable(qo);
- }
-
- /**
- * Cancel a runnable that's been posted with {@link #post(Runnable)}.
- *
- * Equivalent to {@link Handler#removeCallbacks(Runnable)}.
- */
- public void removeCallbacks(Runnable r) {
- QueuedOperation found = null;
- for (QueuedOperation qo : mPendingOperations) {
- if (qo.mActualRannable == r) {
- found = qo;
- break;
- }
- }
- if (found != null) {
- found.cancel();
- }
- }
-
- /**
- * Cancel all pending {@link Runnable}s.
- */
- public void removeCallbacks() {
- // To avoid ConcurrentModificationException
- final ArrayList<QueuedOperation> temp = new ArrayList<QueuedOperation>(mPendingOperations);
- for (QueuedOperation qo : temp) {
- qo.cancel();
- }
- }
-
- /** Overridden by test, as Handler is not mockable. */
- void postRunnable(Runnable r) {
- mHandler.post(r);
- }
-
- /** Overridden by test, as Handler is not mockable. */
- void cancelRunnable(Runnable r) {
- mHandler.removeCallbacks(r);
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/utility/EmailAsyncTask.java b/email2/emailcommon/src/com/android/emailcommon/utility/EmailAsyncTask.java
deleted file mode 100644
index 3d2e69cfb..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/utility/EmailAsyncTask.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.utility;
-
-import android.os.AsyncTask;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-
-/**
- * {@link AsyncTask} substitution for the email app.
- *
- * Modeled after {@link AsyncTask}; the basic usage is the same, with extra features:
- * - Bulk cancellation of multiple tasks. This is mainly used by UI to cancel pending tasks
- * in onDestroy() or similar places.
- * - Instead of {@link AsyncTask#onPostExecute}, it has {@link #onSuccess(Object)}, as the
- * regular {@link AsyncTask#onPostExecute} is a bit hard to predict when it'll be called and
- * whel it won't.
- *
- * Note this class is missing some of the {@link AsyncTask} features, e.g. it lacks
- * {@link AsyncTask#onProgressUpdate}. Add these when necessary.
- */
-public abstract class EmailAsyncTask<Params, Progress, Result> {
- private static final Executor SERIAL_EXECUTOR = AsyncTask.SERIAL_EXECUTOR;
- private static final Executor PARALLEL_EXECUTOR = AsyncTask.THREAD_POOL_EXECUTOR;
-
- /**
- * Tracks {@link EmailAsyncTask}.
- *
- * Call {@link #cancellAllInterrupt()} to cancel all tasks registered.
- */
- public static class Tracker {
- private final LinkedList<EmailAsyncTask<?, ?, ?>> mTasks =
- new LinkedList<EmailAsyncTask<?, ?, ?>>();
-
- private void add(EmailAsyncTask<?, ?, ?> task) {
- synchronized (mTasks) {
- mTasks.add(task);
- }
- }
-
- private void remove(EmailAsyncTask<?, ?, ?> task) {
- synchronized (mTasks) {
- mTasks.remove(task);
- }
- }
-
- /**
- * Cancel all registered tasks.
- */
- public void cancellAllInterrupt() {
- synchronized (mTasks) {
- for (EmailAsyncTask<?, ?, ?> task : mTasks) {
- task.cancel(true);
- }
- mTasks.clear();
- }
- }
-
- /**
- * Cancel all instances of the same class as {@code current} other than
- * {@code current} itself.
- */
- /* package */ void cancelOthers(EmailAsyncTask<?, ?, ?> current) {
- final Class<?> clazz = current.getClass();
- synchronized (mTasks) {
- final ArrayList<EmailAsyncTask<?, ?, ?>> toRemove =
- new ArrayList<EmailAsyncTask<?, ?, ?>>();
- for (EmailAsyncTask<?, ?, ?> task : mTasks) {
- if ((task != current) && task.getClass().equals(clazz)) {
- task.cancel(true);
- toRemove.add(task);
- }
- }
- for (EmailAsyncTask<?, ?, ?> task : toRemove) {
- mTasks.remove(task);
- }
- }
- }
-
- /* package */ int getTaskCountForTest() {
- return mTasks.size();
- }
-
- /* package */ boolean containsTaskForTest(EmailAsyncTask<?, ?, ?> task) {
- return mTasks.contains(task);
- }
- }
-
- private final Tracker mTracker;
-
- private static class InnerTask<Params2, Progress2, Result2>
- extends AsyncTask<Params2, Progress2, Result2> {
- private final EmailAsyncTask<Params2, Progress2, Result2> mOwner;
-
- public InnerTask(EmailAsyncTask<Params2, Progress2, Result2> owner) {
- mOwner = owner;
- }
-
- @Override
- protected Result2 doInBackground(Params2... params) {
- return mOwner.doInBackground(params);
- }
-
- @Override
- public void onCancelled(Result2 result) {
- mOwner.unregisterSelf();
- mOwner.onCancelled(result);
- }
-
- @Override
- public void onPostExecute(Result2 result) {
- mOwner.unregisterSelf();
- if (mOwner.mCancelled) {
- mOwner.onCancelled(result);
- } else {
- mOwner.onSuccess(result);
- }
- }
- }
-
- private final InnerTask<Params, Progress, Result> mInnerTask;
- private volatile boolean mCancelled;
-
- public EmailAsyncTask(Tracker tracker) {
- mTracker = tracker;
- if (mTracker != null) {
- mTracker.add(this);
- }
- mInnerTask = new InnerTask<Params, Progress, Result>(this);
- }
-
- /* package */ final void unregisterSelf() {
- if (mTracker != null) {
- mTracker.remove(this);
- }
- }
-
- /** @see AsyncTask#doInBackground */
- protected abstract Result doInBackground(Params... params);
-
-
- /** @see AsyncTask#cancel(boolean) */
- public final void cancel(boolean mayInterruptIfRunning) {
- mCancelled = true;
- mInnerTask.cancel(mayInterruptIfRunning);
- }
-
- /** @see AsyncTask#onCancelled */
- protected void onCancelled(Result result) {
- }
-
- /**
- * Similar to {@link AsyncTask#onPostExecute}, but this will never be executed if
- * {@link #cancel(boolean)} has been called before its execution, even if
- * {@link #doInBackground(Object...)} has completed when cancelled.
- *
- * @see AsyncTask#onPostExecute
- */
- protected void onSuccess(Result result) {
- }
-
- /**
- * execute on {@link #PARALLEL_EXECUTOR}
- *
- * @see AsyncTask#execute
- */
- public final EmailAsyncTask<Params, Progress, Result> executeParallel(Params... params) {
- return executeInternal(PARALLEL_EXECUTOR, false, params);
- }
-
- /**
- * execute on {@link #SERIAL_EXECUTOR}
- *
- * @see AsyncTask#execute
- */
- public final EmailAsyncTask<Params, Progress, Result> executeSerial(Params... params) {
- return executeInternal(SERIAL_EXECUTOR, false, params);
- }
-
- /**
- * Cancel all previously created instances of the same class tracked by the same
- * {@link Tracker}, and then {@link #executeParallel}.
- */
- public final EmailAsyncTask<Params, Progress, Result> cancelPreviousAndExecuteParallel(
- Params... params) {
- return executeInternal(PARALLEL_EXECUTOR, true, params);
- }
-
- /**
- * Cancel all previously created instances of the same class tracked by the same
- * {@link Tracker}, and then {@link #executeSerial}.
- */
- public final EmailAsyncTask<Params, Progress, Result> cancelPreviousAndExecuteSerial(
- Params... params) {
- return executeInternal(SERIAL_EXECUTOR, true, params);
- }
-
- private final EmailAsyncTask<Params, Progress, Result> executeInternal(Executor executor,
- boolean cancelPrevious, Params... params) {
- if (cancelPrevious) {
- if (mTracker == null) {
- throw new IllegalStateException();
- } else {
- mTracker.cancelOthers(this);
- }
- }
- mInnerTask.executeOnExecutor(executor, params);
- return this;
- }
-
- /**
- * Runs a {@link Runnable} in a bg thread, using {@link #PARALLEL_EXECUTOR}.
- */
- public static EmailAsyncTask<Void, Void, Void> runAsyncParallel(Runnable runnable) {
- return runAsyncInternal(PARALLEL_EXECUTOR, runnable);
- }
-
- /**
- * Runs a {@link Runnable} in a bg thread, using {@link #SERIAL_EXECUTOR}.
- */
- public static EmailAsyncTask<Void, Void, Void> runAsyncSerial(Runnable runnable) {
- return runAsyncInternal(SERIAL_EXECUTOR, runnable);
- }
-
- private static EmailAsyncTask<Void, Void, Void> runAsyncInternal(Executor executor,
- final Runnable runnable) {
- EmailAsyncTask<Void, Void, Void> task = new EmailAsyncTask<Void, Void, Void>(null) {
- @Override
- protected Void doInBackground(Void... params) {
- runnable.run();
- return null;
- }
- };
- return task.executeInternal(executor, false, (Void[]) null);
- }
-
- /**
- * Wait until {@link #doInBackground} finishes and returns the results of the computation.
- *
- * @see AsyncTask#get
- */
- public final Result get() throws InterruptedException, ExecutionException {
- return mInnerTask.get();
- }
-
- /* package */ final Result callDoInBackgroundForTest(Params... params) {
- return mInnerTask.doInBackground(params);
- }
-
- /* package */ final void callOnCancelledForTest(Result result) {
- mInnerTask.onCancelled(result);
- }
-
- /* package */ final void callOnPostExecuteForTest(Result result) {
- mInnerTask.onPostExecute(result);
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/utility/EmailClientConnectionManager.java b/email2/emailcommon/src/com/android/emailcommon/utility/EmailClientConnectionManager.java
deleted file mode 100644
index 5e0429019..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/utility/EmailClientConnectionManager.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.emailcommon.utility;
-
-import android.content.Context;
-import android.net.SSLCertificateSocketFactory;
-import android.util.Log;
-
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.utility.SSLUtils.KeyChainKeyManager;
-import com.android.emailcommon.utility.SSLUtils.TrackingKeyManager;
-
-import org.apache.http.conn.scheme.PlainSocketFactory;
-import org.apache.http.conn.scheme.Scheme;
-import org.apache.http.conn.scheme.SchemeRegistry;
-import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
-import org.apache.http.params.HttpParams;
-
-import java.security.cert.CertificateException;
-
-import javax.net.ssl.KeyManager;
-
-/**
- * A thread-safe client connection manager that manages the use of client certificates from the
- * {@link android.security.KeyChain} for SSL connections.
- */
-public class EmailClientConnectionManager extends ThreadSafeClientConnManager {
-
- private static final int STANDARD_PORT = 80;
- private static final int STANDARD_SSL_PORT = 443;
- private static final boolean LOG_ENABLED = false;
-
- /**
- * A {@link KeyManager} to track client certificate requests from servers.
- */
- private final TrackingKeyManager mTrackingKeyManager;
-
- /**
- * Not publicly instantiable except via {@link #newInstance(HttpParams)}
- */
- private EmailClientConnectionManager(
- HttpParams params, SchemeRegistry registry, TrackingKeyManager keyManager) {
- super(params, registry);
- mTrackingKeyManager = keyManager;
- }
-
- public static EmailClientConnectionManager newInstance(HttpParams params, boolean ssl,
- int port) {
- TrackingKeyManager keyManager = new TrackingKeyManager();
-
- // Create a registry for our three schemes; http and https will use built-in factories
- SchemeRegistry registry = new SchemeRegistry();
- registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(),
- ssl ? STANDARD_PORT : port));
- // Register https with the secure factory
- registry.register(new Scheme("https",
- SSLUtils.getHttpSocketFactory(false, keyManager), ssl ? port : STANDARD_SSL_PORT));
- // Register the httpts scheme with our insecure factory
- registry.register(new Scheme("httpts",
- SSLUtils.getHttpSocketFactory(true /*insecure*/, keyManager),
- ssl ? port : STANDARD_SSL_PORT));
-
- return new EmailClientConnectionManager(params, registry, keyManager);
- }
-
- /**
- * Ensures that a client SSL certificate is known to be used for the specified connection
- * manager.
- * A {@link SchemeRegistry} is used to denote which client certificates to use for a given
- * connection, so clients of this connection manager should use
- * {@link #makeSchemeForClientCert(String, boolean)}.
- */
- public synchronized void registerClientCert(Context context, HostAuth hostAuth)
- throws CertificateException {
- SchemeRegistry registry = getSchemeRegistry();
- String schemeName = makeSchemeForClientCert(hostAuth.mClientCertAlias,
- hostAuth.shouldTrustAllServerCerts());
- Scheme existing = registry.get(schemeName);
- if (existing == null) {
- if (LOG_ENABLED) {
- Log.i(Logging.LOG_TAG, "Registering socket factory for certificate alias ["
- + hostAuth.mClientCertAlias + "]");
- }
- KeyManager keyManager =
- KeyChainKeyManager.fromAlias(context, hostAuth.mClientCertAlias);
- SSLCertificateSocketFactory underlying = SSLUtils.getSSLSocketFactory(
- hostAuth.shouldTrustAllServerCerts());
- underlying.setKeyManagers(new KeyManager[] { keyManager });
- registry.register(
- new Scheme(schemeName, new SSLSocketFactory(underlying), hostAuth.mPort));
- }
- }
-
- /**
- * Unregisters a custom connection type that uses a client certificate on the connection
- * manager.
- * @see #registerClientCert(Context, String, boolean)
- */
- public synchronized void unregisterClientCert(
- String clientCertAlias, boolean trustAllServerCerts) {
- SchemeRegistry registry = getSchemeRegistry();
- String schemeName = makeSchemeForClientCert(clientCertAlias, trustAllServerCerts);
- Scheme existing = registry.get(schemeName);
- if (existing != null) {
- registry.unregister(schemeName);
- }
- }
-
- /**
- * Builds a custom scheme name to be used in a connection manager according to the connection
- * parameters.
- */
- public static String makeScheme(
- boolean useSsl, boolean trustAllServerCerts, String clientCertAlias) {
- if (clientCertAlias != null) {
- return makeSchemeForClientCert(clientCertAlias, trustAllServerCerts);
- } else {
- return useSsl ? (trustAllServerCerts ? "httpts" : "https") : "http";
- }
- }
-
- /**
- * Builds a unique scheme name for an SSL connection that uses a client user certificate.
- */
- private static String makeSchemeForClientCert(
- String clientCertAlias, boolean trustAllServerCerts) {
- String safeAlias = SSLUtils.escapeForSchemeName(clientCertAlias);
- return (trustAllServerCerts ? "httpts" : "https") + "+clientCert+" + safeAlias;
- }
-
- /**
- * @param since A timestamp in millis from epoch from which to check
- * @return whether or not this connection manager has detected any unsatisfied requests for
- * a client SSL certificate by any servers
- */
- public synchronized boolean hasDetectedUnsatisfiedCertReq(long since) {
- return mTrackingKeyManager.getLastCertReqTime() >= since;
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/utility/IntentUtilities.java b/email2/emailcommon/src/com/android/emailcommon/utility/IntentUtilities.java
deleted file mode 100644
index d38caad46..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/utility/IntentUtilities.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.utility;
-
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.text.TextUtils;
-
-public final class IntentUtilities {
- // Format for activity URIs: content://ui.email.android.com/...
- private static final String ACTIVITY_INTENT_SCHEME = "content";
- private static final String ACTIVITY_INTENT_HOST = "ui.email.android.com";
-
- private static final String ACCOUNT_ID_PARAM = "ACCOUNT_ID";
- private static final String MAILBOX_ID_PARAM = "MAILBOX_ID";
- private static final String MESSAGE_ID_PARAM = "MESSAGE_ID";
- private static final String ACCOUNT_UUID_PARAM = "ACCOUNT_UUID";
-
- private IntentUtilities() {
- }
-
- /**
- * @return a URI builder for "content://ui.email.android.com/..."
- */
- public static Uri.Builder createActivityIntentUrlBuilder(String path) {
- final Uri.Builder b = new Uri.Builder();
- b.scheme(ACTIVITY_INTENT_SCHEME);
- b.authority(ACTIVITY_INTENT_HOST);
- b.path(path);
- return b;
- }
-
- /**
- * Add the account ID parameter.
- */
- public static void setAccountId(Uri.Builder b, long accountId) {
- if (accountId != -1) {
- b.appendQueryParameter(ACCOUNT_ID_PARAM, Long.toString(accountId));
- }
- }
-
- /**
- * Add the mailbox ID parameter.
- */
- public static void setMailboxId(Uri.Builder b, long mailboxId) {
- if (mailboxId != -1) {
- b.appendQueryParameter(MAILBOX_ID_PARAM, Long.toString(mailboxId));
- }
- }
-
- /**
- * Add the message ID parameter.
- */
- public static void setMessageId(Uri.Builder b, long messageId) {
- if (messageId != -1) {
- b.appendQueryParameter(MESSAGE_ID_PARAM, Long.toString(messageId));
- }
- }
-
- /**
- * Add the account UUID parameter.
- */
- public static void setAccountUuid(Uri.Builder b, String mUuid) {
- if (TextUtils.isEmpty(mUuid)) {
- throw new IllegalArgumentException();
- }
- b.appendQueryParameter(ACCOUNT_UUID_PARAM, mUuid);
- }
-
- /**
- * Retrieve the account ID.
- */
- public static long getAccountIdFromIntent(Intent intent) {
- return getLongFromIntent(intent, ACCOUNT_ID_PARAM);
- }
-
- /**
- * Retrieve the mailbox ID.
- */
- public static long getMailboxIdFromIntent(Intent intent) {
- return getLongFromIntent(intent, MAILBOX_ID_PARAM);
- }
-
- /**
- * Retrieve the message ID.
- */
- public static long getMessageIdFromIntent(Intent intent) {
- return getLongFromIntent(intent, MESSAGE_ID_PARAM);
- }
-
- /**
- * Retrieve the account UUID, or null if the UUID param is not found.
- */
- public static String getAccountUuidFromIntent(Intent intent) {
- final Uri uri = intent.getData();
- if (uri == null) {
- return null;
- }
- String uuid = uri.getQueryParameter(ACCOUNT_UUID_PARAM);
- return TextUtils.isEmpty(uuid) ? null : uuid;
- }
-
- private static long getLongFromIntent(Intent intent, String paramName) {
- long value = -1;
- if (intent.getData() != null) {
- value = getLongParamFromUri(intent.getData(), paramName, -1);
- }
- return value;
- }
-
- private static long getLongParamFromUri(Uri uri, String paramName, long defaultValue) {
- final String value = uri.getQueryParameter(paramName);
- if (!TextUtils.isEmpty(value)) {
- try {
- return Long.parseLong(value);
- } catch (NumberFormatException e) {
- // return default
- }
- }
- return defaultValue;
- }
-
- /**
- * Create an {@link Intent} to launch an activity as the main entry point. Existing activities
- * will all be closed.
- */
- public static Intent createRestartAppIntent(Context context, Class<? extends Activity> clazz) {
- Intent i = new Intent(context, clazz);
- prepareRestartAppIntent(i);
- return i;
- }
-
- /**
- * Create an {@link Intent} to launch an activity as the main entry point. Existing activities
- * will all be closed.
- */
- public static Intent createRestartAppIntent(Uri data) {
- Intent i = new Intent(Intent.ACTION_MAIN, data);
- prepareRestartAppIntent(i);
- return i;
- }
-
- private static void prepareRestartAppIntent(Intent i) {
- i.setAction(Intent.ACTION_MAIN);
- i.addCategory(Intent.CATEGORY_LAUNCHER);
- i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/utility/LoggingInputStream.java b/email2/emailcommon/src/com/android/emailcommon/utility/LoggingInputStream.java
deleted file mode 100644
index 212efa183..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/utility/LoggingInputStream.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.utility;
-
-import com.android.emailcommon.Logging;
-
-import android.util.Log;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Simple class used for debugging only that affords us a view of the raw IMAP or POP3 stream,
- * in addition to the tokenized version.
- *
- * Use of this class *MUST* be restricted to logging-enabled situations only.
- */
-public class LoggingInputStream extends FilterInputStream {
- private StringBuilder mSb;
- private boolean mDumpEmptyLines;
- private final String mTag;
-
- public LoggingInputStream(InputStream in) {
- this(in, "RAW", false);
- }
-
- public LoggingInputStream(InputStream in, String tag, boolean dumpEmptyLines) {
- super(in);
- mTag = tag + " ";
- mDumpEmptyLines = dumpEmptyLines;
- initBuffer();
- Log.d(Logging.LOG_TAG, mTag + "dump start");
- }
-
- private void initBuffer() {
- mSb = new StringBuilder(mTag);
- }
-
- /**
- * Collect chars as read, and log them when EOL reached.
- */
- @Override
- public int read() throws IOException {
- int oneByte = super.read();
- logRaw(oneByte);
- return oneByte;
- }
-
- /**
- * Collect chars as read, and log them when EOL reached.
- */
- @Override
- public int read(byte[] b, int offset, int length) throws IOException {
- int bytesRead = super.read(b, offset, length);
- int copyBytes = bytesRead;
- while (copyBytes > 0) {
- logRaw(b[offset] & 0xFF);
- copyBytes--;
- offset++;
- }
-
- return bytesRead;
- }
-
- /**
- * Write and clear the buffer
- */
- private void logRaw(int oneByte) {
- if (oneByte == '\r') {
- // Don't log.
- } else if (oneByte == '\n') {
- flushLog();
- } else if (0x20 <= oneByte && oneByte <= 0x7e) { // Printable ASCII.
- mSb.append((char)oneByte);
- } else {
- // email protocols are supposed to be all 7bits, but there are wrong implementations
- // that do send 8 bit characters...
- mSb.append("\\x" + Utility.byteToHex(oneByte));
- }
- }
-
- private void flushLog() {
- if (mDumpEmptyLines || (mSb.length() > mTag.length())) {
- Log.d(Logging.LOG_TAG, mSb.toString());
- initBuffer();
- }
- }
-
- @Override
- public void close() throws IOException {
- super.close();
- flushLog();
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/utility/SSLSocketFactory.java b/email2/emailcommon/src/com/android/emailcommon/utility/SSLSocketFactory.java
deleted file mode 100644
index 624745577..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/utility/SSLSocketFactory.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/conn/ssl/SSLSocketFactory.java $
- * $Revision: 659194 $
- * $Date: 2008-05-22 11:33:47 -0700 (Thu, 22 May 2008) $
- *
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- * This class was copied from org.apache.http.conn.ssl, because it didn't have a suitable
- * constructor.
- */
-
-package com.android.emailcommon.utility;
-
-import org.apache.http.conn.scheme.HostNameResolver;
-import org.apache.http.conn.scheme.LayeredSocketFactory;
-import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
-import org.apache.http.conn.ssl.BrowserCompatHostnameVerifier;
-import org.apache.http.conn.ssl.StrictHostnameVerifier;
-import org.apache.http.conn.ssl.X509HostnameVerifier;
-import org.apache.http.params.HttpConnectionParams;
-import org.apache.http.params.HttpParams;
-
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.KeyManager;
-import javax.net.ssl.KeyManagerFactory;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSocket;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.TrustManagerFactory;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.net.UnknownHostException;
-import java.security.KeyManagementException;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.security.UnrecoverableKeyException;
-
-/**
- * Layered socket factory for TLS/SSL connections, based on JSSE.
- *.
- * <p>
- * SSLSocketFactory can be used to validate the identity of the HTTPS
- * server against a list of trusted certificates and to authenticate to
- * the HTTPS server using a private key.
- * </p>
- *
- * <p>
- * SSLSocketFactory will enable server authentication when supplied with
- * a {@link KeyStore truststore} file containg one or several trusted
- * certificates. The client secure socket will reject the connection during
- * the SSL session handshake if the target HTTPS server attempts to
- * authenticate itself with a non-trusted certificate.
- * </p>
- *
- * <p>
- * Use JDK keytool utility to import a trusted certificate and generate a truststore file:
- * <pre>
- * keytool -import -alias "my server cert" -file server.crt -keystore my.truststore
- * </pre>
- * </p>
- *
- * <p>
- * SSLSocketFactory will enable client authentication when supplied with
- * a {@link KeyStore keystore} file containg a private key/public certificate
- * pair. The client secure socket will use the private key to authenticate
- * itself to the target HTTPS server during the SSL session handshake if
- * requested to do so by the server.
- * The target HTTPS server will in its turn verify the certificate presented
- * by the client in order to establish client's authenticity
- * </p>
- *
- * <p>
- * Use the following sequence of actions to generate a keystore file
- * </p>
- * <ul>
- * <li>
- * <p>
- * Use JDK keytool utility to generate a new key
- * <pre>keytool -genkey -v -alias "my client key" -validity 365 -keystore my.keystore</pre>
- * For simplicity use the same password for the key as that of the keystore
- * </p>
- * </li>
- * <li>
- * <p>
- * Issue a certificate signing request (CSR)
- * <pre>keytool -certreq -alias "my client key" -file mycertreq.csr -keystore my.keystore</pre>
- * </p>
- * </li>
- * <li>
- * <p>
- * Send the certificate request to the trusted Certificate Authority for signature.
- * One may choose to act as her own CA and sign the certificate request using a PKI
- * tool, such as OpenSSL.
- * </p>
- * </li>
- * <li>
- * <p>
- * Import the trusted CA root certificate
- * <pre>keytool -import -alias "my trusted ca" -file caroot.crt -keystore my.keystore</pre>
- * </p>
- * </li>
- * <li>
- * <p>
- * Import the PKCS#7 file containg the complete certificate chain
- * <pre>keytool -import -alias "my client key" -file mycert.p7 -keystore my.keystore</pre>
- * </p>
- * </li>
- * <li>
- * <p>
- * Verify the content the resultant keystore file
- * <pre>keytool -list -v -keystore my.keystore</pre>
- * </p>
- * </li>
- * </ul>
- * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
- * @author Julius Davies
- */
-
-public class SSLSocketFactory implements LayeredSocketFactory {
-
- public static final String TLS = "TLS";
- public static final String SSL = "SSL";
- public static final String SSLV2 = "SSLv2";
-
- public static final X509HostnameVerifier ALLOW_ALL_HOSTNAME_VERIFIER
- = new AllowAllHostnameVerifier();
-
- public static final X509HostnameVerifier BROWSER_COMPATIBLE_HOSTNAME_VERIFIER
- = new BrowserCompatHostnameVerifier();
-
- public static final X509HostnameVerifier STRICT_HOSTNAME_VERIFIER
- = new StrictHostnameVerifier();
- /**
- * The factory using the default JVM settings for secure connections.
- */
- private static final SSLSocketFactory DEFAULT_FACTORY = new SSLSocketFactory();
-
- /**
- * Gets an singleton instance of the SSLProtocolSocketFactory.
- * @return a SSLProtocolSocketFactory
- */
- public static SSLSocketFactory getSocketFactory() {
- return DEFAULT_FACTORY;
- }
-
- private final SSLContext sslcontext;
- private final javax.net.ssl.SSLSocketFactory socketfactory;
- private final HostNameResolver nameResolver;
- private X509HostnameVerifier hostnameVerifier = BROWSER_COMPATIBLE_HOSTNAME_VERIFIER;
-
- public SSLSocketFactory(
- String algorithm,
- final KeyStore keystore,
- final String keystorePassword,
- final KeyStore truststore,
- final SecureRandom random,
- final HostNameResolver nameResolver)
- throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException
- {
- super();
- if (algorithm == null) {
- algorithm = TLS;
- }
- KeyManager[] keymanagers = null;
- if (keystore != null) {
- keymanagers = createKeyManagers(keystore, keystorePassword);
- }
- TrustManager[] trustmanagers = null;
- if (truststore != null) {
- trustmanagers = createTrustManagers(truststore);
- }
- sslcontext = SSLContext.getInstance(algorithm);
- sslcontext.init(keymanagers, trustmanagers, random);
- socketfactory = sslcontext.getSocketFactory();
- this.nameResolver = nameResolver;
- }
-
- public SSLSocketFactory(
- final KeyStore keystore,
- final String keystorePassword,
- final KeyStore truststore)
- throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException
- {
- this(TLS, keystore, keystorePassword, truststore, null, null);
- }
-
- public SSLSocketFactory(final KeyStore keystore, final String keystorePassword)
- throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException
- {
- this(TLS, keystore, keystorePassword, null, null, null);
- }
-
- public SSLSocketFactory(final KeyStore truststore)
- throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException
- {
- this(TLS, null, null, truststore, null, null);
- }
-
- /**
- * Constructs an HttpClient SSLSocketFactory backed by the given JSSE
- * SSLSocketFactory.
- */
- public SSLSocketFactory(javax.net.ssl.SSLSocketFactory socketfactory) {
- super();
- sslcontext = null;
- this.socketfactory = socketfactory;
- nameResolver = null;
- }
-
- /**
- * Creates the default SSL socket factory.
- * This constructor is used exclusively to instantiate the factory for
- * {@link #getSocketFactory getSocketFactory}.
- */
- private SSLSocketFactory() {
- super();
- sslcontext = null;
- socketfactory = HttpsURLConnection.getDefaultSSLSocketFactory();
- nameResolver = null;
- }
-
- private static KeyManager[] createKeyManagers(final KeyStore keystore, final String password)
- throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException {
- if (keystore == null) {
- throw new IllegalArgumentException("Keystore may not be null");
- }
- KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(
- KeyManagerFactory.getDefaultAlgorithm());
- kmfactory.init(keystore, password != null ? password.toCharArray(): null);
- return kmfactory.getKeyManagers();
- }
-
- private static TrustManager[] createTrustManagers(final KeyStore keystore)
- throws KeyStoreException, NoSuchAlgorithmException {
- if (keystore == null) {
- throw new IllegalArgumentException("Keystore may not be null");
- }
- TrustManagerFactory tmfactory = TrustManagerFactory.getInstance(
- TrustManagerFactory.getDefaultAlgorithm());
- tmfactory.init(keystore);
- return tmfactory.getTrustManagers();
- }
-
-
- // non-javadoc, see interface org.apache.http.conn.SocketFactory
- public Socket createSocket()
- throws IOException {
-
- // the cast makes sure that the factory is working as expected
- return socketfactory.createSocket();
- }
-
-
- // non-javadoc, see interface org.apache.http.conn.SocketFactory
- public Socket connectSocket(
- final Socket sock,
- final String host,
- final int port,
- final InetAddress localAddress,
- int localPort,
- final HttpParams params
- ) throws IOException {
-
- if (host == null) {
- throw new IllegalArgumentException("Target host may not be null.");
- }
- if (params == null) {
- throw new IllegalArgumentException("Parameters may not be null.");
- }
-
- SSLSocket sslsock = (SSLSocket)
- ((sock != null) ? sock : createSocket());
-
- if ((localAddress != null) || (localPort > 0)) {
-
- // we need to bind explicitly
- if (localPort < 0)
- localPort = 0; // indicates "any"
-
- InetSocketAddress isa =
- new InetSocketAddress(localAddress, localPort);
- sslsock.bind(isa);
- }
-
- int connTimeout = HttpConnectionParams.getConnectionTimeout(params);
- int soTimeout = HttpConnectionParams.getSoTimeout(params);
-
- InetSocketAddress remoteAddress;
- if (nameResolver != null) {
- remoteAddress = new InetSocketAddress(nameResolver.resolve(host), port);
- } else {
- remoteAddress = new InetSocketAddress(host, port);
- }
-
- sslsock.connect(remoteAddress, connTimeout);
-
- sslsock.setSoTimeout(soTimeout);
- try {
- hostnameVerifier.verify(host, sslsock);
- // verifyHostName() didn't blowup - good!
- } catch (IOException iox) {
- // close the socket before re-throwing the exception
- try { sslsock.close(); } catch (Exception x) { /*ignore*/ }
- throw iox;
- }
-
- return sslsock;
- }
-
-
- /**
- * Checks whether a socket connection is secure.
- * This factory creates TLS/SSL socket connections
- * which, by default, are considered secure.
- * <br/>
- * Derived classes may override this method to perform
- * runtime checks, for example based on the cypher suite.
- *
- * @param sock the connected socket
- *
- * @return <code>true</code>
- *
- * @throws IllegalArgumentException if the argument is invalid
- */
- public boolean isSecure(Socket sock)
- throws IllegalArgumentException {
-
- if (sock == null) {
- throw new IllegalArgumentException("Socket may not be null.");
- }
- // This instanceof check is in line with createSocket() above.
- if (!(sock instanceof SSLSocket)) {
- throw new IllegalArgumentException
- ("Socket not created by this factory.");
- }
- // This check is performed last since it calls the argument object.
- if (sock.isClosed()) {
- throw new IllegalArgumentException("Socket is closed.");
- }
-
- return true;
-
- } // isSecure
-
-
- // non-javadoc, see interface LayeredSocketFactory
- public Socket createSocket(
- final Socket socket,
- final String host,
- final int port,
- final boolean autoClose
- ) throws IOException, UnknownHostException {
- SSLSocket sslSocket = (SSLSocket) socketfactory.createSocket(
- socket,
- host,
- port,
- autoClose
- );
- hostnameVerifier.verify(host, sslSocket);
- // verifyHostName() didn't blowup - good!
- return sslSocket;
- }
-
- public void setHostnameVerifier(X509HostnameVerifier hostnameVerifier) {
- if ( hostnameVerifier == null ) {
- throw new IllegalArgumentException("Hostname verifier may not be null");
- }
- this.hostnameVerifier = hostnameVerifier;
- }
-
- public X509HostnameVerifier getHostnameVerifier() {
- return hostnameVerifier;
- }
-
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/utility/SSLUtils.java b/email2/emailcommon/src/com/android/emailcommon/utility/SSLUtils.java
deleted file mode 100644
index b21c68f33..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/utility/SSLUtils.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.utility;
-
-import android.content.Context;
-import android.net.SSLCertificateSocketFactory;
-import android.security.KeyChain;
-import android.security.KeyChainException;
-import android.util.Log;
-
-import com.google.common.annotations.VisibleForTesting;
-
-import java.net.InetAddress;
-import java.net.Socket;
-import java.security.Principal;
-import java.security.PrivateKey;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-import java.util.Arrays;
-
-import javax.net.ssl.KeyManager;
-import javax.net.ssl.X509ExtendedKeyManager;
-
-public class SSLUtils {
- private static SSLCertificateSocketFactory sInsecureFactory;
- private static SSLCertificateSocketFactory sSecureFactory;
-
- private static final boolean LOG_ENABLED = false;
- private static final String TAG = "Email.Ssl";
-
- /**
- * Returns a {@link javax.net.ssl.SSLSocketFactory}.
- * Optionally bypass all SSL certificate checks.
- *
- * @param insecure if true, bypass all SSL certificate checks
- */
- public synchronized static SSLCertificateSocketFactory getSSLSocketFactory(
- boolean insecure) {
- if (insecure) {
- if (sInsecureFactory == null) {
- sInsecureFactory = (SSLCertificateSocketFactory)
- SSLCertificateSocketFactory.getInsecure(0, null);
- }
- return sInsecureFactory;
- } else {
- if (sSecureFactory == null) {
- sSecureFactory = (SSLCertificateSocketFactory)
- SSLCertificateSocketFactory.getDefault(0, null);
- }
- return sSecureFactory;
- }
- }
-
- /**
- * Returns a {@link org.apache.http.conn.ssl.SSLSocketFactory SSLSocketFactory} for use with the
- * Apache HTTP stack.
- */
- public static SSLSocketFactory getHttpSocketFactory(boolean insecure, KeyManager keyManager) {
- SSLCertificateSocketFactory underlying = getSSLSocketFactory(insecure);
- if (keyManager != null) {
- underlying.setKeyManagers(new KeyManager[] { keyManager });
- }
- SSLSocketFactory wrapped = new SSLSocketFactory(underlying);
- if (insecure) {
- wrapped.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
- }
- return wrapped;
- }
-
- /**
- * Escapes the contents a string to be used as a safe scheme name in the URI according to
- * http://tools.ietf.org/html/rfc3986#section-3.1
- *
- * This does not ensure that the first character is a letter (which is required by the RFC).
- */
- @VisibleForTesting
- public static String escapeForSchemeName(String s) {
- // According to the RFC, scheme names are case-insensitive.
- s = s.toLowerCase();
-
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < s.length(); i++) {
- char c = s.charAt(i);
- if (Character.isLetter(c) || Character.isDigit(c)
- || ('-' == c) || ('.' == c)) {
- // Safe - use as is.
- sb.append(c);
- } else if ('+' == c) {
- // + is used as our escape character, so double it up.
- sb.append("++");
- } else {
- // Unsafe - escape.
- sb.append('+').append((int) c);
- }
- }
- return sb.toString();
- }
-
- private static abstract class StubKeyManager extends X509ExtendedKeyManager {
- @Override public abstract String chooseClientAlias(
- String[] keyTypes, Principal[] issuers, Socket socket);
-
- @Override public abstract X509Certificate[] getCertificateChain(String alias);
-
- @Override public abstract PrivateKey getPrivateKey(String alias);
-
-
- // The following methods are unused.
-
- @Override
- public final String chooseServerAlias(
- String keyType, Principal[] issuers, Socket socket) {
- // not a client SSLSocket callback
- throw new UnsupportedOperationException();
- }
-
- @Override
- public final String[] getClientAliases(String keyType, Principal[] issuers) {
- // not a client SSLSocket callback
- throw new UnsupportedOperationException();
- }
-
- @Override
- public final String[] getServerAliases(String keyType, Principal[] issuers) {
- // not a client SSLSocket callback
- throw new UnsupportedOperationException();
- }
- }
-
- /**
- * A dummy {@link KeyManager} which keeps track of the last time a server has requested
- * a client certificate.
- */
- public static class TrackingKeyManager extends StubKeyManager {
- private volatile long mLastTimeCertRequested = 0L;
-
- @Override
- public String chooseClientAlias(String[] keyTypes, Principal[] issuers, Socket socket) {
- if (LOG_ENABLED) {
- InetAddress address = socket.getInetAddress();
- Log.i(TAG, "TrackingKeyManager: requesting a client cert alias for "
- + address.getCanonicalHostName());
- }
- mLastTimeCertRequested = System.currentTimeMillis();
- return null;
- }
-
- @Override
- public X509Certificate[] getCertificateChain(String alias) {
- if (LOG_ENABLED) {
- Log.i(TAG, "TrackingKeyManager: returning a null cert chain");
- }
- return null;
- }
-
- @Override
- public PrivateKey getPrivateKey(String alias) {
- if (LOG_ENABLED) {
- Log.i(TAG, "TrackingKeyManager: returning a null private key");
- }
- return null;
- }
-
- /**
- * @return the last time that this {@link KeyManager} detected a request by a server
- * for a client certificate (in millis since epoch).
- */
- public long getLastCertReqTime() {
- return mLastTimeCertRequested;
- }
- }
-
- /**
- * A {@link KeyManager} that reads uses credentials stored in the system {@link KeyChain}.
- */
- public static class KeyChainKeyManager extends StubKeyManager {
- private final String mClientAlias;
- private final X509Certificate[] mCertificateChain;
- private final PrivateKey mPrivateKey;
-
- /**
- * Builds an instance of a KeyChainKeyManager using the given certificate alias.
- * If for any reason retrieval of the credentials from the system {@link KeyChain} fails,
- * a {@code null} value will be returned.
- */
- public static KeyChainKeyManager fromAlias(Context context, String alias)
- throws CertificateException {
- X509Certificate[] certificateChain;
- try {
- certificateChain = KeyChain.getCertificateChain(context, alias);
- } catch (KeyChainException e) {
- logError(alias, "certificate chain", e);
- throw new CertificateException(e);
- } catch (InterruptedException e) {
- logError(alias, "certificate chain", e);
- throw new CertificateException(e);
- }
-
- PrivateKey privateKey;
- try {
- privateKey = KeyChain.getPrivateKey(context, alias);
- } catch (KeyChainException e) {
- logError(alias, "private key", e);
- throw new CertificateException(e);
- } catch (InterruptedException e) {
- logError(alias, "private key", e);
- throw new CertificateException(e);
- }
-
- if (certificateChain == null || privateKey == null) {
- throw new CertificateException("Can't access certificate from keystore");
- }
-
- return new KeyChainKeyManager(alias, certificateChain, privateKey);
- }
-
- private static void logError(String alias, String type, Exception ex) {
- // Avoid logging PII when explicit logging is not on.
- if (LOG_ENABLED) {
- Log.e(TAG, "Unable to retrieve " + type + " for [" + alias + "] due to " + ex);
- } else {
- Log.e(TAG, "Unable to retrieve " + type + " due to " + ex);
- }
- }
-
- private KeyChainKeyManager(
- String clientAlias, X509Certificate[] certificateChain, PrivateKey privateKey) {
- mClientAlias = clientAlias;
- mCertificateChain = certificateChain;
- mPrivateKey = privateKey;
- }
-
-
- @Override
- public String chooseClientAlias(String[] keyTypes, Principal[] issuers, Socket socket) {
- if (LOG_ENABLED) {
- Log.i(TAG, "Requesting a client cert alias for " + Arrays.toString(keyTypes));
- }
- return mClientAlias;
- }
-
- @Override
- public X509Certificate[] getCertificateChain(String alias) {
- if (LOG_ENABLED) {
- Log.i(TAG, "Requesting a client certificate chain for alias [" + alias + "]");
- }
- return mCertificateChain;
- }
-
- @Override
- public PrivateKey getPrivateKey(String alias) {
- if (LOG_ENABLED) {
- Log.i(TAG, "Requesting a client private key for alias [" + alias + "]");
- }
- return mPrivateKey;
- }
- }
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/utility/TextUtilities.java b/email2/emailcommon/src/com/android/emailcommon/utility/TextUtilities.java
deleted file mode 100755
index 0aa919098..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/utility/TextUtilities.java
+++ /dev/null
@@ -1,728 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.utility;
-
-import com.google.common.annotations.VisibleForTesting;
-
-import android.graphics.Color;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.SpannableStringBuilder;
-import android.text.TextUtils;
-import android.text.style.BackgroundColorSpan;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-public class TextUtilities {
- // Highlight color is yellow, as in other apps.
- // TODO Push for this to be a global (style-related?) constant
- public static final int HIGHLIGHT_COLOR_INT = Color.YELLOW;
- // We AND off the "alpha" from the color (i.e. 0xFFFFFF00 -> 0x00FFFF00)
- /*package*/ static final String HIGHLIGHT_COLOR_STRING =
- '#' + Integer.toHexString(HIGHLIGHT_COLOR_INT & 0x00FFFFFF);
-
- // This is how many chars we'll allow in a snippet
- private static final int MAX_SNIPPET_LENGTH = 200;
- // For some reason, isWhitespace() returns false with the following...
- /*package*/ static final char NON_BREAKING_SPACE_CHARACTER = (char)160;
-
- // Tags whose content must be stripped as well
- static final String[] STRIP_TAGS =
- new String[] {"title", "script", "style", "applet", "head"};
- // The number of characters we peel off for testing against STRIP_TAGS; this should be the
- // maximum size of the strings in STRIP_TAGS
- static final int MAX_STRIP_TAG_LENGTH = 6;
-
- static final Map<String, Character> ESCAPE_STRINGS;
- static {
- // HTML character entity references as defined in HTML 4
- // see http://www.w3.org/TR/REC-html40/sgml/entities.html
- ESCAPE_STRINGS = new HashMap<String, Character>(252);
-
- ESCAPE_STRINGS.put("&nbsp", '\u00A0');
- ESCAPE_STRINGS.put("&iexcl", '\u00A1');
- ESCAPE_STRINGS.put("&cent", '\u00A2');
- ESCAPE_STRINGS.put("&pound", '\u00A3');
- ESCAPE_STRINGS.put("&curren", '\u00A4');
- ESCAPE_STRINGS.put("&yen", '\u00A5');
- ESCAPE_STRINGS.put("&brvbar", '\u00A6');
- ESCAPE_STRINGS.put("&sect", '\u00A7');
- ESCAPE_STRINGS.put("&uml", '\u00A8');
- ESCAPE_STRINGS.put("&copy", '\u00A9');
- ESCAPE_STRINGS.put("&ordf", '\u00AA');
- ESCAPE_STRINGS.put("&laquo", '\u00AB');
- ESCAPE_STRINGS.put("&not", '\u00AC');
- ESCAPE_STRINGS.put("&shy", '\u00AD');
- ESCAPE_STRINGS.put("&reg", '\u00AE');
- ESCAPE_STRINGS.put("&macr", '\u00AF');
- ESCAPE_STRINGS.put("&deg", '\u00B0');
- ESCAPE_STRINGS.put("&plusmn", '\u00B1');
- ESCAPE_STRINGS.put("&sup2", '\u00B2');
- ESCAPE_STRINGS.put("&sup3", '\u00B3');
- ESCAPE_STRINGS.put("&acute", '\u00B4');
- ESCAPE_STRINGS.put("&micro", '\u00B5');
- ESCAPE_STRINGS.put("&para", '\u00B6');
- ESCAPE_STRINGS.put("&middot", '\u00B7');
- ESCAPE_STRINGS.put("&cedil", '\u00B8');
- ESCAPE_STRINGS.put("&sup1", '\u00B9');
- ESCAPE_STRINGS.put("&ordm", '\u00BA');
- ESCAPE_STRINGS.put("&raquo", '\u00BB');
- ESCAPE_STRINGS.put("&frac14", '\u00BC');
- ESCAPE_STRINGS.put("&frac12", '\u00BD');
- ESCAPE_STRINGS.put("&frac34", '\u00BE');
- ESCAPE_STRINGS.put("&iquest", '\u00BF');
- ESCAPE_STRINGS.put("&Agrave", '\u00C0');
- ESCAPE_STRINGS.put("&Aacute", '\u00C1');
- ESCAPE_STRINGS.put("&Acirc", '\u00C2');
- ESCAPE_STRINGS.put("&Atilde", '\u00C3');
- ESCAPE_STRINGS.put("&Auml", '\u00C4');
- ESCAPE_STRINGS.put("&Aring", '\u00C5');
- ESCAPE_STRINGS.put("&AElig", '\u00C6');
- ESCAPE_STRINGS.put("&Ccedil", '\u00C7');
- ESCAPE_STRINGS.put("&Egrave", '\u00C8');
- ESCAPE_STRINGS.put("&Eacute", '\u00C9');
- ESCAPE_STRINGS.put("&Ecirc", '\u00CA');
- ESCAPE_STRINGS.put("&Euml", '\u00CB');
- ESCAPE_STRINGS.put("&Igrave", '\u00CC');
- ESCAPE_STRINGS.put("&Iacute", '\u00CD');
- ESCAPE_STRINGS.put("&Icirc", '\u00CE');
- ESCAPE_STRINGS.put("&Iuml", '\u00CF');
- ESCAPE_STRINGS.put("&ETH", '\u00D0');
- ESCAPE_STRINGS.put("&Ntilde", '\u00D1');
- ESCAPE_STRINGS.put("&Ograve", '\u00D2');
- ESCAPE_STRINGS.put("&Oacute", '\u00D3');
- ESCAPE_STRINGS.put("&Ocirc", '\u00D4');
- ESCAPE_STRINGS.put("&Otilde", '\u00D5');
- ESCAPE_STRINGS.put("&Ouml", '\u00D6');
- ESCAPE_STRINGS.put("&times", '\u00D7');
- ESCAPE_STRINGS.put("&Oslash", '\u00D8');
- ESCAPE_STRINGS.put("&Ugrave", '\u00D9');
- ESCAPE_STRINGS.put("&Uacute", '\u00DA');
- ESCAPE_STRINGS.put("&Ucirc", '\u00DB');
- ESCAPE_STRINGS.put("&Uuml", '\u00DC');
- ESCAPE_STRINGS.put("&Yacute", '\u00DD');
- ESCAPE_STRINGS.put("&THORN", '\u00DE');
- ESCAPE_STRINGS.put("&szlig", '\u00DF');
- ESCAPE_STRINGS.put("&agrave", '\u00E0');
- ESCAPE_STRINGS.put("&aacute", '\u00E1');
- ESCAPE_STRINGS.put("&acirc", '\u00E2');
- ESCAPE_STRINGS.put("&atilde", '\u00E3');
- ESCAPE_STRINGS.put("&auml", '\u00E4');
- ESCAPE_STRINGS.put("&aring", '\u00E5');
- ESCAPE_STRINGS.put("&aelig", '\u00E6');
- ESCAPE_STRINGS.put("&ccedil", '\u00E7');
- ESCAPE_STRINGS.put("&egrave", '\u00E8');
- ESCAPE_STRINGS.put("&eacute", '\u00E9');
- ESCAPE_STRINGS.put("&ecirc", '\u00EA');
- ESCAPE_STRINGS.put("&euml", '\u00EB');
- ESCAPE_STRINGS.put("&igrave", '\u00EC');
- ESCAPE_STRINGS.put("&iacute", '\u00ED');
- ESCAPE_STRINGS.put("&icirc", '\u00EE');
- ESCAPE_STRINGS.put("&iuml", '\u00EF');
- ESCAPE_STRINGS.put("&eth", '\u00F0');
- ESCAPE_STRINGS.put("&ntilde", '\u00F1');
- ESCAPE_STRINGS.put("&ograve", '\u00F2');
- ESCAPE_STRINGS.put("&oacute", '\u00F3');
- ESCAPE_STRINGS.put("&ocirc", '\u00F4');
- ESCAPE_STRINGS.put("&otilde", '\u00F5');
- ESCAPE_STRINGS.put("&ouml", '\u00F6');
- ESCAPE_STRINGS.put("&divide", '\u00F7');
- ESCAPE_STRINGS.put("&oslash", '\u00F8');
- ESCAPE_STRINGS.put("&ugrave", '\u00F9');
- ESCAPE_STRINGS.put("&uacute", '\u00FA');
- ESCAPE_STRINGS.put("&ucirc", '\u00FB');
- ESCAPE_STRINGS.put("&uuml", '\u00FC');
- ESCAPE_STRINGS.put("&yacute", '\u00FD');
- ESCAPE_STRINGS.put("&thorn", '\u00FE');
- ESCAPE_STRINGS.put("&yuml", '\u00FF');
- ESCAPE_STRINGS.put("&fnof", '\u0192');
- ESCAPE_STRINGS.put("&Alpha", '\u0391');
- ESCAPE_STRINGS.put("&Beta", '\u0392');
- ESCAPE_STRINGS.put("&Gamma", '\u0393');
- ESCAPE_STRINGS.put("&Delta", '\u0394');
- ESCAPE_STRINGS.put("&Epsilon", '\u0395');
- ESCAPE_STRINGS.put("&Zeta", '\u0396');
- ESCAPE_STRINGS.put("&Eta", '\u0397');
- ESCAPE_STRINGS.put("&Theta", '\u0398');
- ESCAPE_STRINGS.put("&Iota", '\u0399');
- ESCAPE_STRINGS.put("&Kappa", '\u039A');
- ESCAPE_STRINGS.put("&Lambda", '\u039B');
- ESCAPE_STRINGS.put("&Mu", '\u039C');
- ESCAPE_STRINGS.put("&Nu", '\u039D');
- ESCAPE_STRINGS.put("&Xi", '\u039E');
- ESCAPE_STRINGS.put("&Omicron", '\u039F');
- ESCAPE_STRINGS.put("&Pi", '\u03A0');
- ESCAPE_STRINGS.put("&Rho", '\u03A1');
- ESCAPE_STRINGS.put("&Sigma", '\u03A3');
- ESCAPE_STRINGS.put("&Tau", '\u03A4');
- ESCAPE_STRINGS.put("&Upsilon", '\u03A5');
- ESCAPE_STRINGS.put("&Phi", '\u03A6');
- ESCAPE_STRINGS.put("&Chi", '\u03A7');
- ESCAPE_STRINGS.put("&Psi", '\u03A8');
- ESCAPE_STRINGS.put("&Omega", '\u03A9');
- ESCAPE_STRINGS.put("&alpha", '\u03B1');
- ESCAPE_STRINGS.put("&beta", '\u03B2');
- ESCAPE_STRINGS.put("&gamma", '\u03B3');
- ESCAPE_STRINGS.put("&delta", '\u03B4');
- ESCAPE_STRINGS.put("&epsilon", '\u03B5');
- ESCAPE_STRINGS.put("&zeta", '\u03B6');
- ESCAPE_STRINGS.put("&eta", '\u03B7');
- ESCAPE_STRINGS.put("&theta", '\u03B8');
- ESCAPE_STRINGS.put("&iota", '\u03B9');
- ESCAPE_STRINGS.put("&kappa", '\u03BA');
- ESCAPE_STRINGS.put("&lambda", '\u03BB');
- ESCAPE_STRINGS.put("&mu", '\u03BC');
- ESCAPE_STRINGS.put("&nu", '\u03BD');
- ESCAPE_STRINGS.put("&xi", '\u03BE');
- ESCAPE_STRINGS.put("&omicron", '\u03BF');
- ESCAPE_STRINGS.put("&pi", '\u03C0');
- ESCAPE_STRINGS.put("&rho", '\u03C1');
- ESCAPE_STRINGS.put("&sigmaf", '\u03C2');
- ESCAPE_STRINGS.put("&sigma", '\u03C3');
- ESCAPE_STRINGS.put("&tau", '\u03C4');
- ESCAPE_STRINGS.put("&upsilon", '\u03C5');
- ESCAPE_STRINGS.put("&phi", '\u03C6');
- ESCAPE_STRINGS.put("&chi", '\u03C7');
- ESCAPE_STRINGS.put("&psi", '\u03C8');
- ESCAPE_STRINGS.put("&omega", '\u03C9');
- ESCAPE_STRINGS.put("&thetasym", '\u03D1');
- ESCAPE_STRINGS.put("&upsih", '\u03D2');
- ESCAPE_STRINGS.put("&piv", '\u03D6');
- ESCAPE_STRINGS.put("&bull", '\u2022');
- ESCAPE_STRINGS.put("&hellip", '\u2026');
- ESCAPE_STRINGS.put("&prime", '\u2032');
- ESCAPE_STRINGS.put("&Prime", '\u2033');
- ESCAPE_STRINGS.put("&oline", '\u203E');
- ESCAPE_STRINGS.put("&frasl", '\u2044');
- ESCAPE_STRINGS.put("&weierp", '\u2118');
- ESCAPE_STRINGS.put("&image", '\u2111');
- ESCAPE_STRINGS.put("&real", '\u211C');
- ESCAPE_STRINGS.put("&trade", '\u2122');
- ESCAPE_STRINGS.put("&alefsym", '\u2135');
- ESCAPE_STRINGS.put("&larr", '\u2190');
- ESCAPE_STRINGS.put("&uarr", '\u2191');
- ESCAPE_STRINGS.put("&rarr", '\u2192');
- ESCAPE_STRINGS.put("&darr", '\u2193');
- ESCAPE_STRINGS.put("&harr", '\u2194');
- ESCAPE_STRINGS.put("&crarr", '\u21B5');
- ESCAPE_STRINGS.put("&lArr", '\u21D0');
- ESCAPE_STRINGS.put("&uArr", '\u21D1');
- ESCAPE_STRINGS.put("&rArr", '\u21D2');
- ESCAPE_STRINGS.put("&dArr", '\u21D3');
- ESCAPE_STRINGS.put("&hArr", '\u21D4');
- ESCAPE_STRINGS.put("&forall", '\u2200');
- ESCAPE_STRINGS.put("&part", '\u2202');
- ESCAPE_STRINGS.put("&exist", '\u2203');
- ESCAPE_STRINGS.put("&empty", '\u2205');
- ESCAPE_STRINGS.put("&nabla", '\u2207');
- ESCAPE_STRINGS.put("&isin", '\u2208');
- ESCAPE_STRINGS.put("&notin", '\u2209');
- ESCAPE_STRINGS.put("&ni", '\u220B');
- ESCAPE_STRINGS.put("&prod", '\u220F');
- ESCAPE_STRINGS.put("&sum", '\u2211');
- ESCAPE_STRINGS.put("&minus", '\u2212');
- ESCAPE_STRINGS.put("&lowast", '\u2217');
- ESCAPE_STRINGS.put("&radic", '\u221A');
- ESCAPE_STRINGS.put("&prop", '\u221D');
- ESCAPE_STRINGS.put("&infin", '\u221E');
- ESCAPE_STRINGS.put("&ang", '\u2220');
- ESCAPE_STRINGS.put("&and", '\u2227');
- ESCAPE_STRINGS.put("&or", '\u2228');
- ESCAPE_STRINGS.put("&cap", '\u2229');
- ESCAPE_STRINGS.put("&cup", '\u222A');
- ESCAPE_STRINGS.put("&int", '\u222B');
- ESCAPE_STRINGS.put("&there4", '\u2234');
- ESCAPE_STRINGS.put("&sim", '\u223C');
- ESCAPE_STRINGS.put("&cong", '\u2245');
- ESCAPE_STRINGS.put("&asymp", '\u2248');
- ESCAPE_STRINGS.put("&ne", '\u2260');
- ESCAPE_STRINGS.put("&equiv", '\u2261');
- ESCAPE_STRINGS.put("&le", '\u2264');
- ESCAPE_STRINGS.put("&ge", '\u2265');
- ESCAPE_STRINGS.put("&sub", '\u2282');
- ESCAPE_STRINGS.put("&sup", '\u2283');
- ESCAPE_STRINGS.put("&nsub", '\u2284');
- ESCAPE_STRINGS.put("&sube", '\u2286');
- ESCAPE_STRINGS.put("&supe", '\u2287');
- ESCAPE_STRINGS.put("&oplus", '\u2295');
- ESCAPE_STRINGS.put("&otimes", '\u2297');
- ESCAPE_STRINGS.put("&perp", '\u22A5');
- ESCAPE_STRINGS.put("&sdot", '\u22C5');
- ESCAPE_STRINGS.put("&lceil", '\u2308');
- ESCAPE_STRINGS.put("&rceil", '\u2309');
- ESCAPE_STRINGS.put("&lfloor", '\u230A');
- ESCAPE_STRINGS.put("&rfloor", '\u230B');
- ESCAPE_STRINGS.put("&lang", '\u2329');
- ESCAPE_STRINGS.put("&rang", '\u232A');
- ESCAPE_STRINGS.put("&loz", '\u25CA');
- ESCAPE_STRINGS.put("&spades", '\u2660');
- ESCAPE_STRINGS.put("&clubs", '\u2663');
- ESCAPE_STRINGS.put("&hearts", '\u2665');
- ESCAPE_STRINGS.put("&diams", '\u2666');
- ESCAPE_STRINGS.put("&quot", '\u0022');
- ESCAPE_STRINGS.put("&amp", '\u0026');
- ESCAPE_STRINGS.put("&lt", '\u003C');
- ESCAPE_STRINGS.put("&gt", '\u003E');
- ESCAPE_STRINGS.put("&OElig", '\u0152');
- ESCAPE_STRINGS.put("&oelig", '\u0153');
- ESCAPE_STRINGS.put("&Scaron", '\u0160');
- ESCAPE_STRINGS.put("&scaron", '\u0161');
- ESCAPE_STRINGS.put("&Yuml", '\u0178');
- ESCAPE_STRINGS.put("&circ", '\u02C6');
- ESCAPE_STRINGS.put("&tilde", '\u02DC');
- ESCAPE_STRINGS.put("&ensp", '\u2002');
- ESCAPE_STRINGS.put("&emsp", '\u2003');
- ESCAPE_STRINGS.put("&thinsp", '\u2009');
- ESCAPE_STRINGS.put("&zwnj", '\u200C');
- ESCAPE_STRINGS.put("&zwj", '\u200D');
- ESCAPE_STRINGS.put("&lrm", '\u200E');
- ESCAPE_STRINGS.put("&rlm", '\u200F');
- ESCAPE_STRINGS.put("&ndash", '\u2013');
- ESCAPE_STRINGS.put("&mdash", '\u2014');
- ESCAPE_STRINGS.put("&lsquo", '\u2018');
- ESCAPE_STRINGS.put("&rsquo", '\u2019');
- ESCAPE_STRINGS.put("&sbquo", '\u201A');
- ESCAPE_STRINGS.put("&ldquo", '\u201C');
- ESCAPE_STRINGS.put("&rdquo", '\u201D');
- ESCAPE_STRINGS.put("&bdquo", '\u201E');
- ESCAPE_STRINGS.put("&dagger", '\u2020');
- ESCAPE_STRINGS.put("&Dagger", '\u2021');
- ESCAPE_STRINGS.put("&permil", '\u2030');
- ESCAPE_STRINGS.put("&lsaquo", '\u2039');
- ESCAPE_STRINGS.put("&rsaquo", '\u203A');
- ESCAPE_STRINGS.put("&euro", '\u20AC');
- }
-
- /**
- * Code to generate a short 'snippet' from either plain text or html text
- *
- * If the sync protocol can get plain text, that's great, but we'll still strip out extraneous
- * whitespace. If it's HTML, we'll 1) strip out tags, 2) turn entities into the appropriate
- * characters, and 3) strip out extraneous whitespace, all in one pass
- *
- * Why not use an existing class? The best answer is performance; yet another answer is
- * correctness (e.g. Html.textFromHtml simply doesn't generate well-stripped text). But
- * performance is key; we frequently sync text that is 10K or (much) longer, yet we really only
- * care about a small amount of text for the snippet. So it's critically important that we just
- * stop when we've gotten enough; existing methods that exist will go through the entire
- * incoming string, at great (and useless, in this case) expense.
- */
-
- public static String makeSnippetFromHtmlText(String text) {
- return makeSnippetFromText(text, true);
- }
-
- public static String makeSnippetFromPlainText(String text) {
- return makeSnippetFromText(text, false);
- }
-
- /**
- * Find the end of this tag; there are two alternatives: <tag .../> or <tag ...> ... </tag>
- * @param htmlText some HTML text
- * @param tag the HTML tag
- * @param startPos the start position in the HTML text where the tag starts
- * @return the position just before the end of the tag or -1 if not found
- */
- /*package*/ static int findTagEnd(String htmlText, String tag, int startPos) {
- if (tag.endsWith(" ")) {
- tag = tag.substring(0, tag.length() - 1);
- }
- int length = htmlText.length();
- char prevChar = 0;
- for (int i = startPos; i < length; i++) {
- char c = htmlText.charAt(i);
- if (c == '>') {
- if (prevChar == '/') {
- return i - 1;
- }
- break;
- }
- prevChar = c;
- }
- // We didn't find /> at the end of the tag so find </tag>
- return htmlText.indexOf("/" + tag, startPos);
- }
-
- public static String makeSnippetFromText(String text, boolean stripHtml) {
- // Handle null and empty string
- if (TextUtils.isEmpty(text)) return "";
-
- final int length = text.length();
- // Use char[] instead of StringBuilder purely for performance; fewer method calls, etc.
- char[] buffer = new char[MAX_SNIPPET_LENGTH];
- // skipCount is an array of a single int; that int is set inside stripHtmlEntity and is
- // used to determine how many characters can be "skipped" due to the transformation of the
- // entity to a single character. When Java allows multiple return values, we can make this
- // much cleaner :-)
- int[] skipCount = new int[1];
- int bufferCount = 0;
- // Start with space as last character to avoid leading whitespace
- char last = ' ';
- // Indicates whether we're in the middle of an HTML tag
- boolean inTag = false;
-
- // Walk through the text until we're done with the input OR we've got a large enough snippet
- for (int i = 0; i < length && bufferCount < MAX_SNIPPET_LENGTH; i++) {
- char c = text.charAt(i);
- if (stripHtml && !inTag && (c == '<')) {
- // Find tags to strip; they will begin with <! or !- or </ or <letter
- if (i < (length - 1)) {
- char peek = text.charAt(i + 1);
- if (peek == '!' || peek == '-' || peek == '/' || Character.isLetter(peek)) {
- inTag = true;
- // Strip content of title, script, style and applet tags
- if (i < (length - (MAX_STRIP_TAG_LENGTH + 2))) {
- String tag = text.substring(i + 1, i + MAX_STRIP_TAG_LENGTH + 1);
- String tagLowerCase = tag.toLowerCase();
- boolean stripContent = false;
- for (String stripTag: STRIP_TAGS) {
- if (tagLowerCase.startsWith(stripTag)) {
- stripContent = true;
- tag = tag.substring(0, stripTag.length());
- break;
- }
- }
- if (stripContent) {
- // Look for the end of this tag
- int endTagPosition = findTagEnd(text, tag, i);
- if (endTagPosition < 0) {
- break;
- } else {
- i = endTagPosition;
- }
- }
- }
- }
- }
- } else if (stripHtml && inTag && (c == '>')) {
- // Terminate stripping here
- inTag = false;
- continue;
- }
-
- if (inTag) {
- // We just skip by everything while we're in a tag
- continue;
- } else if (stripHtml && (c == '&')) {
- // Handle a possible HTML entity here
- // We always get back a character to use; we also get back a "skip count",
- // indicating how many characters were eaten from the entity
- c = stripHtmlEntity(text, i, skipCount);
- i += skipCount[0];
- }
-
- if (Character.isWhitespace(c) || (c == NON_BREAKING_SPACE_CHARACTER)) {
- // The idea is to find the content in the message, not the whitespace, so we'll
- // turn any combination of contiguous whitespace into a single space
- if (last == ' ') {
- continue;
- } else {
- // Make every whitespace character a simple space
- c = ' ';
- }
- } else if ((c == '-' || c == '=') && (last == c)) {
- // Lots of messages (especially digests) have whole lines of --- or ===
- // We'll get rid of those duplicates here
- continue;
- }
-
- // After all that, maybe we've got a character for our snippet
- buffer[bufferCount++] = c;
- last = c;
- }
-
- // Lose trailing space and return our snippet
- if ((bufferCount > 0) && (last == ' ')) {
- bufferCount--;
- }
- return new String(buffer, 0, bufferCount);
- }
-
- static /*package*/ char stripHtmlEntity(String text, int pos, int[] skipCount) {
- int length = text.length();
- // Ugly, but we store our skip count in this array; we can't use a static here, because
- // multiple threads might be calling in
- skipCount[0] = 0;
- // All entities are <= 8 characters long, so that's how far we'll look for one (+ & and ;)
- int end = pos + 10;
- String entity = null;
- // Isolate the entity
- for (int i = pos; (i < length) && (i < end); i++) {
- if (text.charAt(i) == ';') {
- entity = text.substring(pos, i);
- break;
- }
- }
- if (entity == null) {
- // This wasn't really an HTML entity
- return '&';
- } else {
- // Skip count is the length of the entity
- Character mapping = ESCAPE_STRINGS.get(entity);
- int entityLength = entity.length();
- if (mapping != null) {
- skipCount[0] = entityLength;
- return mapping;
- } else if ((entityLength > 2) && (entity.charAt(1) == '#')) {
- // &#nn; means ascii nn (decimal) and &#xnn means ascii nn (hex)
- char c = '?';
- try {
- int i;
- if ((entity.charAt(2) == 'x') && (entityLength > 3)) {
- i = Integer.parseInt(entity.substring(3), 16);
- } else {
- i = Integer.parseInt(entity.substring(2));
- }
- c = (char)i;
- } catch (NumberFormatException e) {
- // We'll just return the ? in this case
- }
- skipCount[0] = entityLength;
- return c;
- }
- }
- // Worst case, we return the original start character, ampersand
- return '&';
- }
-
- /**
- * Given a string of HTML text and a query containing any number of search terms, returns
- * an HTML string in which those search terms are highlighted (intended for use in a WebView)
- *
- * @param text the HTML text to process
- * @param query the search terms
- * @return HTML text with the search terms highlighted
- */
- @VisibleForTesting
- public static String highlightTermsInHtml(String text, String query) {
- try {
- return highlightTerms(text, query, true).toString();
- } catch (IOException e) {
- // Can't happen, but we must catch this
- return text;
- }
- }
-
- /**
- * Given a string of plain text and a query containing any number of search terms, returns
- * a CharSequence in which those search terms are highlighted (intended for use in a TextView)
- *
- * @param text the text to process
- * @param query the search terms
- * @return a CharSequence with the search terms highlighted
- */
- public static CharSequence highlightTermsInText(String text, String query) {
- try {
- return highlightTerms(text, query, false);
- } catch (IOException e) {
- // Can't happen, but we must catch this
- return text;
- }
- }
-
- static class SearchTerm {
- final String mTerm;
- final String mTermLowerCase;
- final int mLength;
- int mMatchLength = 0;
- int mMatchStart = -1;
-
- SearchTerm(String term, boolean html) {
- mTerm = term;
- mTermLowerCase = term.toLowerCase();
- mLength = term.length();
- }
- }
-
- /**
- * Generate a version of the incoming text in which all search terms in a query are highlighted.
- * If the input is HTML, we return a StringBuilder with additional markup as required
- * If the input is text, we return a SpannableStringBuilder with additional spans as required
- *
- * @param text the text to be processed
- * @param query the query, which can contain multiple terms separated by whitespace
- * @param html whether or not the text to be processed is HTML
- * @return highlighted text
- *
- * @throws IOException as Appendable requires this
- */
- public static CharSequence highlightTerms(String text, String query, boolean html)
- throws IOException {
- // Handle null and empty string
- if (TextUtils.isEmpty(text)) return "";
- final int length = text.length();
-
- // Break up the query into search terms
- ArrayList<SearchTerm> terms = new ArrayList<SearchTerm>();
- if (query != null) {
- StringTokenizer st = new StringTokenizer(query);
- while (st.hasMoreTokens()) {
- terms.add(new SearchTerm(st.nextToken(), html));
- }
- }
-
- // Our appendable depends on whether we're building HTML text (for webview) or spannable
- // text (for UI)
- final Appendable sb = html ? new StringBuilder() : new SpannableStringBuilder();
- // Indicates whether we're in the middle of an HTML tag
- boolean inTag = false;
- // The position of the last input character copied to output
- int lastOut = -1;
-
- // Walk through the text until we're done with the input
- // Just copy any HTML tags directly into the output; search for terms in the remaining text
- for (int i = 0; i < length; i++) {
- char chr = text.charAt(i);
- if (html) {
- if (!inTag && (chr == '<')) {
- // Find tags; they will begin with <! or !- or </ or <letter
- if (i < (length - 1)) {
- char peek = text.charAt(i + 1);
- if (peek == '!' || peek == '-' || peek == '/' || Character.isLetter(peek)) {
- inTag = true;
- // Skip content of title, script, style and applet tags
- if (i < (length - (MAX_STRIP_TAG_LENGTH + 2))) {
- String tag = text.substring(i + 1, i + MAX_STRIP_TAG_LENGTH + 1);
- String tagLowerCase = tag.toLowerCase();
- boolean stripContent = false;
- for (String stripTag: STRIP_TAGS) {
- if (tagLowerCase.startsWith(stripTag)) {
- stripContent = true;
- tag = tag.substring(0, stripTag.length());
- break;
- }
- }
- if (stripContent) {
- // Look for the end of this tag
- int endTagPosition = findTagEnd(text, tag, i);
- if (endTagPosition < 0) {
- sb.append(text.substring(i));
- break;
- } else {
- sb.append(text.substring(i, endTagPosition - 1));
- i = endTagPosition - 1;
- chr = text.charAt(i);
- }
- }
- }
- }
- }
- } else if (inTag && (chr == '>')) {
- inTag = false;
- }
-
- if (inTag) {
- sb.append(chr);
- continue;
- }
- }
-
- // After all that, we've got some "body" text
- char chrLowerCase = Character.toLowerCase(chr);
- // Whether or not the current character should be appended to the output; we inhibit
- // this while any search terms match
- boolean appendNow = true;
- // Look through search terms for matches
- for (SearchTerm t: terms) {
- if (chrLowerCase == t.mTermLowerCase.charAt(t.mMatchLength)) {
- if (t.mMatchLength++ == 0) {
- // New match start
- t.mMatchStart = i;
- }
- if (t.mMatchLength == t.mLength) {
- String matchText = text.substring(t.mMatchStart, t.mMatchStart + t.mLength);
- // Completed match; add highlight and reset term
- if (t.mMatchStart <= lastOut) {
- matchText = text.substring(lastOut + 1, i + 1);
- }
- /*else*/
- if (matchText.length() == 0) {} else
- if (html) {
- sb.append("<span style=\"background-color: " + HIGHLIGHT_COLOR_STRING +
- "\">");
- sb.append(matchText);
- sb.append("</span>");
- } else {
- SpannableString highlightSpan = new SpannableString(matchText);
- highlightSpan.setSpan(new BackgroundColorSpan(HIGHLIGHT_COLOR_INT), 0,
- highlightSpan.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- sb.append(highlightSpan);
- }
- lastOut = t.mMatchStart + t.mLength - 1;
- t.mMatchLength = 0;
- t.mMatchStart = -1;
- }
- appendNow = false;
- } else {
- if (t.mMatchStart >= 0) {
- // We're no longer matching; check for other matches in progress
- int leastOtherStart = -1;
- for (SearchTerm ot: terms) {
- // Save away the lowest match start for other search terms
- if ((ot != t) && (ot.mMatchStart >= 0) && ((leastOtherStart < 0) ||
- (ot.mMatchStart <= leastOtherStart))) {
- leastOtherStart = ot.mMatchStart;
- }
- }
- int matchEnd = t.mMatchStart + t.mMatchLength;
- if (leastOtherStart < 0 || leastOtherStart > matchEnd) {
- // Append the whole thing
- if (t.mMatchStart > lastOut) {
- sb.append(text.substring(t.mMatchStart, matchEnd));
- lastOut = matchEnd;
- }
- } else if (leastOtherStart == t.mMatchStart) {
- // Ok to append the current char
- } else if (leastOtherStart < t.mMatchStart) {
- // We're already covered by another search term, so don't append
- appendNow = false;
- } else if (t.mMatchStart > lastOut) {
- // Append the piece of our term that's not already covered
- sb.append(text.substring(t.mMatchStart, leastOtherStart));
- lastOut = leastOtherStart;
- }
- }
- // Reset this term
- t.mMatchLength = 0;
- t.mMatchStart = -1;
- }
- }
-
- if (appendNow) {
- sb.append(chr);
- lastOut = i;
- }
- }
-
- return (CharSequence)sb;
- }
-
- /**
- * Determine whether two Strings (either of which might be null) are the same; this is true
- * when both are null or both are Strings that are equal.
- */
- public static boolean stringOrNullEquals(String a, String b) {
- if (a == null && b == null) return true;
- if (a != null && b != null && a.equals(b)) return true;
- return false;
- }
-
-}
diff --git a/email2/emailcommon/src/com/android/emailcommon/utility/Utility.java b/email2/emailcommon/src/com/android/emailcommon/utility/Utility.java
deleted file mode 100644
index b74d4b3e0..000000000
--- a/email2/emailcommon/src/com/android/emailcommon/utility/Utility.java
+++ /dev/null
@@ -1,1153 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon.utility;
-
-import android.app.Activity;
-import android.app.Fragment;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.CursorWrapper;
-import android.graphics.Typeface;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.StrictMode;
-import android.provider.OpenableColumns;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.SpannableStringBuilder;
-import android.text.TextUtils;
-import android.text.style.StyleSpan;
-import android.util.Base64;
-import android.util.Log;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
-import com.android.emailcommon.provider.EmailContent.HostAuthColumns;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.provider.ProviderUnavailableException;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileDescriptor;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.GregorianCalendar;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.TimeZone;
-import java.util.regex.Pattern;
-
-public class Utility {
- public static final Charset UTF_8 = Charset.forName("UTF-8");
- public static final Charset ASCII = Charset.forName("US-ASCII");
-
- public static final String[] EMPTY_STRINGS = new String[0];
- public static final Long[] EMPTY_LONGS = new Long[0];
-
- // "GMT" + "+" or "-" + 4 digits
- private static final Pattern DATE_CLEANUP_PATTERN_WRONG_TIMEZONE =
- Pattern.compile("GMT([-+]\\d{4})$");
-
- private static Handler sMainThreadHandler;
-
- /**
- * @return a {@link Handler} tied to the main thread.
- */
- public static Handler getMainThreadHandler() {
- if (sMainThreadHandler == null) {
- // No need to synchronize -- it's okay to create an extra Handler, which will be used
- // only once and then thrown away.
- sMainThreadHandler = new Handler(Looper.getMainLooper());
- }
- return sMainThreadHandler;
- }
-
- public final static String readInputStream(InputStream in, String encoding) throws IOException {
- InputStreamReader reader = new InputStreamReader(in, encoding);
- StringBuffer sb = new StringBuffer();
- int count;
- char[] buf = new char[512];
- while ((count = reader.read(buf)) != -1) {
- sb.append(buf, 0, count);
- }
- return sb.toString();
- }
-
- public final static boolean arrayContains(Object[] a, Object o) {
- int index = arrayIndex(a, o);
- return (index >= 0);
- }
-
- public final static int arrayIndex(Object[] a, Object o) {
- for (int i = 0, count = a.length; i < count; i++) {
- if (a[i].equals(o)) {
- return i;
- }
- }
- return -1;
- }
-
- /**
- * Returns a concatenated string containing the output of every Object's
- * toString() method, each separated by the given separator character.
- */
- public static String combine(Object[] parts, char separator) {
- if (parts == null) {
- return null;
- }
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < parts.length; i++) {
- sb.append(parts[i].toString());
- if (i < parts.length - 1) {
- sb.append(separator);
- }
- }
- return sb.toString();
- }
- public static String base64Decode(String encoded) {
- if (encoded == null) {
- return null;
- }
- byte[] decoded = Base64.decode(encoded, Base64.DEFAULT);
- return new String(decoded);
- }
-
- public static String base64Encode(String s) {
- if (s == null) {
- return s;
- }
- return Base64.encodeToString(s.getBytes(), Base64.NO_WRAP);
- }
-
- public static boolean isTextViewNotEmpty(TextView view) {
- return !TextUtils.isEmpty(view.getText());
- }
-
- public static boolean isPortFieldValid(TextView view) {
- CharSequence chars = view.getText();
- if (TextUtils.isEmpty(chars)) return false;
- Integer port;
- // In theory, we can't get an illegal value here, since the field is monitored for valid
- // numeric input. But this might be used elsewhere without such a check.
- try {
- port = Integer.parseInt(chars.toString());
- } catch (NumberFormatException e) {
- return false;
- }
- return port > 0 && port < 65536;
- }
-
- /**
- * Validate a hostname name field.
- *
- * Because we just use the {@link URI} class for validation, it'll accept some invalid
- * host names, but it works well enough...
- */
- public static boolean isServerNameValid(TextView view) {
- return isServerNameValid(view.getText().toString());
- }
-
- public static boolean isServerNameValid(String serverName) {
- serverName = serverName.trim();
- if (TextUtils.isEmpty(serverName)) {
- return false;
- }
- try {
- URI uri = new URI(
- "http",
- null,
- serverName,
- -1,
- null, // path
- null, // query
- null);
- return true;
- } catch (URISyntaxException e) {
- return false;
- }
- }
-
- /**
- * Ensures that the given string starts and ends with the double quote character. The string is
- * not modified in any way except to add the double quote character to start and end if it's not
- * already there.
- *
- * TODO: Rename this, because "quoteString()" can mean so many different things.
- *
- * sample -> "sample"
- * "sample" -> "sample"
- * ""sample"" -> "sample"
- * "sample"" -> "sample"
- * sa"mp"le -> "sa"mp"le"
- * "sa"mp"le" -> "sa"mp"le"
- * (empty string) -> ""
- * " -> ""
- */
- public static String quoteString(String s) {
- if (s == null) {
- return null;
- }
- if (!s.matches("^\".*\"$")) {
- return "\"" + s + "\"";
- }
- else {
- return s;
- }
- }
-
- /**
- * A fast version of URLDecoder.decode() that works only with UTF-8 and does only two
- * allocations. This version is around 3x as fast as the standard one and I'm using it
- * hundreds of times in places that slow down the UI, so it helps.
- */
- public static String fastUrlDecode(String s) {
- try {
- byte[] bytes = s.getBytes("UTF-8");
- byte ch;
- int length = 0;
- for (int i = 0, count = bytes.length; i < count; i++) {
- ch = bytes[i];
- if (ch == '%') {
- int h = (bytes[i + 1] - '0');
- int l = (bytes[i + 2] - '0');
- if (h > 9) {
- h -= 7;
- }
- if (l > 9) {
- l -= 7;
- }
- bytes[length] = (byte) ((h << 4) | l);
- i += 2;
- }
- else if (ch == '+') {
- bytes[length] = ' ';
- }
- else {
- bytes[length] = bytes[i];
- }
- length++;
- }
- return new String(bytes, 0, length, "UTF-8");
- }
- catch (UnsupportedEncodingException uee) {
- return null;
- }
- }
- private final static String HOSTAUTH_WHERE_CREDENTIALS = HostAuthColumns.ADDRESS + " like ?"
- + " and " + HostAuthColumns.LOGIN + " like ? ESCAPE '\\'"
- + " and " + HostAuthColumns.PROTOCOL + " not like \"smtp\"";
- private final static String ACCOUNT_WHERE_HOSTAUTH = AccountColumns.HOST_AUTH_KEY_RECV + "=?";
-
- /**
- * Look for an existing account with the same username & server
- *
- * @param context a system context
- * @param allowAccountId this account Id will not trigger (when editing an existing account)
- * @param hostName the server's address
- * @param userLogin the user's login string
- * @result null = no matching account found. Account = matching account
- */
- public static Account findExistingAccount(Context context, long allowAccountId,
- String hostName, String userLogin) {
- ContentResolver resolver = context.getContentResolver();
- String userName = userLogin.replace("_", "\\_");
- Cursor c = resolver.query(HostAuth.CONTENT_URI, HostAuth.ID_PROJECTION,
- HOSTAUTH_WHERE_CREDENTIALS, new String[] { hostName, userName }, null);
- if (c == null) throw new ProviderUnavailableException();
- try {
- while (c.moveToNext()) {
- long hostAuthId = c.getLong(HostAuth.ID_PROJECTION_COLUMN);
- // Find account with matching hostauthrecv key, and return it
- Cursor c2 = resolver.query(Account.CONTENT_URI, Account.ID_PROJECTION,
- ACCOUNT_WHERE_HOSTAUTH, new String[] { Long.toString(hostAuthId) }, null);
- try {
- while (c2.moveToNext()) {
- long accountId = c2.getLong(Account.ID_PROJECTION_COLUMN);
- if (accountId != allowAccountId) {
- Account account = Account.restoreAccountWithId(context, accountId);
- if (account != null) {
- return account;
- }
- }
- }
- } finally {
- c2.close();
- }
- }
- } finally {
- c.close();
- }
-
- return null;
- }
-
- /**
- * Generate a random message-id header for locally-generated messages.
- */
- public static String generateMessageId() {
- StringBuffer sb = new StringBuffer();
- sb.append("<");
- for (int i = 0; i < 24; i++) {
- sb.append(Integer.toString((int)(Math.random() * 35), 36));
- }
- sb.append(".");
- sb.append(Long.toString(System.currentTimeMillis()));
- sb.append("@email.android.com>");
- return sb.toString();
- }
-
- /**
- * Generate a time in milliseconds from a date string that represents a date/time in GMT
- * @param date string in format 20090211T180303Z (rfc2445, iCalendar).
- * @return the time in milliseconds (since Jan 1, 1970)
- */
- public static long parseDateTimeToMillis(String date) {
- GregorianCalendar cal = parseDateTimeToCalendar(date);
- return cal.getTimeInMillis();
- }
-
- /**
- * Generate a GregorianCalendar from a date string that represents a date/time in GMT
- * @param date string in format 20090211T180303Z (rfc2445, iCalendar).
- * @return the GregorianCalendar
- */
- public static GregorianCalendar parseDateTimeToCalendar(String date) {
- GregorianCalendar cal = new GregorianCalendar(Integer.parseInt(date.substring(0, 4)),
- Integer.parseInt(date.substring(4, 6)) - 1, Integer.parseInt(date.substring(6, 8)),
- Integer.parseInt(date.substring(9, 11)), Integer.parseInt(date.substring(11, 13)),
- Integer.parseInt(date.substring(13, 15)));
- cal.setTimeZone(TimeZone.getTimeZone("GMT"));
- return cal;
- }
-
- /**
- * Generate a time in milliseconds from an email date string that represents a date/time in GMT
- * @param date string in format 2010-02-23T16:00:00.000Z (ISO 8601, rfc3339)
- * @return the time in milliseconds (since Jan 1, 1970)
- */
- public static long parseEmailDateTimeToMillis(String date) {
- GregorianCalendar cal = new GregorianCalendar(Integer.parseInt(date.substring(0, 4)),
- Integer.parseInt(date.substring(5, 7)) - 1, Integer.parseInt(date.substring(8, 10)),
- Integer.parseInt(date.substring(11, 13)), Integer.parseInt(date.substring(14, 16)),
- Integer.parseInt(date.substring(17, 19)));
- cal.setTimeZone(TimeZone.getTimeZone("GMT"));
- return cal.getTimeInMillis();
- }
-
- private static byte[] encode(Charset charset, String s) {
- if (s == null) {
- return null;
- }
- final ByteBuffer buffer = charset.encode(CharBuffer.wrap(s));
- final byte[] bytes = new byte[buffer.limit()];
- buffer.get(bytes);
- return bytes;
- }
-
- private static String decode(Charset charset, byte[] b) {
- if (b == null) {
- return null;
- }
- final CharBuffer cb = charset.decode(ByteBuffer.wrap(b));
- return new String(cb.array(), 0, cb.length());
- }
-
- /** Converts a String to UTF-8 */
- public static byte[] toUtf8(String s) {
- return encode(UTF_8, s);
- }
-
- /** Builds a String from UTF-8 bytes */
- public static String fromUtf8(byte[] b) {
- return decode(UTF_8, b);
- }
-
- /** Converts a String to ASCII bytes */
- public static byte[] toAscii(String s) {
- return encode(ASCII, s);
- }
-
- /** Builds a String from ASCII bytes */
- public static String fromAscii(byte[] b) {
- return decode(ASCII, b);
- }
-
- /**
- * @return true if the input is the first (or only) byte in a UTF-8 character
- */
- public static boolean isFirstUtf8Byte(byte b) {
- // If the top 2 bits is '10', it's not a first byte.
- return (b & 0xc0) != 0x80;
- }
-
- public static String byteToHex(int b) {
- return byteToHex(new StringBuilder(), b).toString();
- }
-
- public static StringBuilder byteToHex(StringBuilder sb, int b) {
- b &= 0xFF;
- sb.append("0123456789ABCDEF".charAt(b >> 4));
- sb.append("0123456789ABCDEF".charAt(b & 0xF));
- return sb;
- }
-
- public static String replaceBareLfWithCrlf(String str) {
- return str.replace("\r", "").replace("\n", "\r\n");
- }
-
- /**
- * Cancel an {@link AsyncTask}. If it's already running, it'll be interrupted.
- */
- public static void cancelTaskInterrupt(AsyncTask<?, ?, ?> task) {
- cancelTask(task, true);
- }
-
- /**
- * Cancel an {@link EmailAsyncTask}. If it's already running, it'll be interrupted.
- */
- public static void cancelTaskInterrupt(EmailAsyncTask<?, ?, ?> task) {
- if (task != null) {
- task.cancel(true);
- }
- }
-
- /**
- * Cancel an {@link AsyncTask}.
- *
- * @param mayInterruptIfRunning <tt>true</tt> if the thread executing this
- * task should be interrupted; otherwise, in-progress tasks are allowed
- * to complete.
- */
- public static void cancelTask(AsyncTask<?, ?, ?> task, boolean mayInterruptIfRunning) {
- if (task != null && task.getStatus() != AsyncTask.Status.FINISHED) {
- task.cancel(mayInterruptIfRunning);
- }
- }
-
- public static String getSmallHash(final String value) {
- final MessageDigest sha;
- try {
- sha = MessageDigest.getInstance("SHA-1");
- } catch (NoSuchAlgorithmException impossible) {
- return null;
- }
- sha.update(Utility.toUtf8(value));
- final int hash = getSmallHashFromSha1(sha.digest());
- return Integer.toString(hash);
- }
-
- /**
- * @return a non-negative integer generated from 20 byte SHA-1 hash.
- */
- /* package for testing */ static int getSmallHashFromSha1(byte[] sha1) {
- final int offset = sha1[19] & 0xf; // SHA1 is 20 bytes.
- return ((sha1[offset] & 0x7f) << 24)
- | ((sha1[offset + 1] & 0xff) << 16)
- | ((sha1[offset + 2] & 0xff) << 8)
- | ((sha1[offset + 3] & 0xff));
- }
-
- /**
- * Try to make a date MIME(RFC 2822/5322)-compliant.
- *
- * It fixes:
- * - "Thu, 10 Dec 09 15:08:08 GMT-0700" to "Thu, 10 Dec 09 15:08:08 -0700"
- * (4 digit zone value can't be preceded by "GMT")
- * We got a report saying eBay sends a date in this format
- */
- public static String cleanUpMimeDate(String date) {
- if (TextUtils.isEmpty(date)) {
- return date;
- }
- date = DATE_CLEANUP_PATTERN_WRONG_TIMEZONE.matcher(date).replaceFirst("$1");
- return date;
- }
-
- public static ByteArrayInputStream streamFromAsciiString(String ascii) {
- return new ByteArrayInputStream(toAscii(ascii));
- }
-
- /**
- * A thread safe way to show a Toast. Can be called from any thread.
- *
- * @param context context
- * @param resId Resource ID of the message string.
- */
- public static void showToast(Context context, int resId) {
- showToast(context, context.getResources().getString(resId));
- }
-
- /**
- * A thread safe way to show a Toast. Can be called from any thread.
- *
- * @param context context
- * @param message Message to show.
- */
- public static void showToast(final Context context, final String message) {
- getMainThreadHandler().post(new Runnable() {
- @Override
- public void run() {
- Toast.makeText(context, message, Toast.LENGTH_LONG).show();
- }
- });
- }
-
- /**
- * Run {@code r} on a worker thread, returning the AsyncTask
- * @return the AsyncTask; this is primarily for use by unit tests, which require the
- * result of the task
- *
- * @deprecated use {@link EmailAsyncTask#runAsyncParallel} or
- * {@link EmailAsyncTask#runAsyncSerial}
- */
- @Deprecated
- public static AsyncTask<Void, Void, Void> runAsync(final Runnable r) {
- return new AsyncTask<Void, Void, Void>() {
- @Override protected Void doInBackground(Void... params) {
- r.run();
- return null;
- }
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
-
- /**
- * Interface used in {@link #createUniqueFile} instead of {@link File#createNewFile()} to make
- * it testable.
- */
- /* package */ interface NewFileCreator {
- public static final NewFileCreator DEFAULT = new NewFileCreator() {
- @Override public boolean createNewFile(File f) throws IOException {
- return f.createNewFile();
- }
- };
- public boolean createNewFile(File f) throws IOException ;
- }
-
- /**
- * Creates a new empty file with a unique name in the given directory by appending a hyphen and
- * a number to the given filename.
- *
- * @return a new File object, or null if one could not be created
- */
- public static File createUniqueFile(File directory, String filename) throws IOException {
- return createUniqueFileInternal(NewFileCreator.DEFAULT, directory, filename);
- }
-
- /* package */ static File createUniqueFileInternal(NewFileCreator nfc,
- File directory, String filename) throws IOException {
- File file = new File(directory, filename);
- if (nfc.createNewFile(file)) {
- return file;
- }
- // Get the extension of the file, if any.
- int index = filename.lastIndexOf('.');
- String format;
- if (index != -1) {
- String name = filename.substring(0, index);
- String extension = filename.substring(index);
- format = name + "-%d" + extension;
- } else {
- format = filename + "-%d";
- }
-
- for (int i = 2; i < Integer.MAX_VALUE; i++) {
- file = new File(directory, String.format(format, i));
- if (nfc.createNewFile(file)) {
- return file;
- }
- }
- return null;
- }
-
- public interface CursorGetter<T> {
- T get(Cursor cursor, int column);
- }
-
- private static final CursorGetter<Long> LONG_GETTER = new CursorGetter<Long>() {
- @Override
- public Long get(Cursor cursor, int column) {
- return cursor.getLong(column);
- }
- };
-
- private static final CursorGetter<Integer> INT_GETTER = new CursorGetter<Integer>() {
- @Override
- public Integer get(Cursor cursor, int column) {
- return cursor.getInt(column);
- }
- };
-
- private static final CursorGetter<String> STRING_GETTER = new CursorGetter<String>() {
- @Override
- public String get(Cursor cursor, int column) {
- return cursor.getString(column);
- }
- };
-
- private static final CursorGetter<byte[]> BLOB_GETTER = new CursorGetter<byte[]>() {
- @Override
- public byte[] get(Cursor cursor, int column) {
- return cursor.getBlob(column);
- }
- };
-
- /**
- * @return if {@code original} is to the EmailProvider, add "?limit=1". Otherwise just returns
- * {@code original}.
- *
- * Other providers don't support the limit param. Also, changing URI passed from other apps
- * can cause permission errors.
- */
- /* package */ static Uri buildLimitOneUri(Uri original) {
- if ("content".equals(original.getScheme()) &&
- EmailContent.AUTHORITY.equals(original.getAuthority())) {
- return EmailContent.uriWithLimit(original, 1);
- }
- return original;
- }
-
- /**
- * @return a generic in column {@code column} of the first result row, if the query returns at
- * least 1 row. Otherwise returns {@code defaultValue}.
- */
- public static <T extends Object> T getFirstRowColumn(Context context, Uri uri,
- String[] projection, String selection, String[] selectionArgs, String sortOrder,
- int column, T defaultValue, CursorGetter<T> getter) {
- // Use PARAMETER_LIMIT to restrict the query to the single row we need
- uri = buildLimitOneUri(uri);
- Cursor c = context.getContentResolver().query(uri, projection, selection, selectionArgs,
- sortOrder);
- if (c != null) {
- try {
- if (c.moveToFirst()) {
- return getter.get(c, column);
- }
- } finally {
- c.close();
- }
- }
- return defaultValue;
- }
-
- /**
- * {@link #getFirstRowColumn} for a Long with null as a default value.
- */
- public static Long getFirstRowLong(Context context, Uri uri, String[] projection,
- String selection, String[] selectionArgs, String sortOrder, int column) {
- return getFirstRowColumn(context, uri, projection, selection, selectionArgs,
- sortOrder, column, null, LONG_GETTER);
- }
-
- /**
- * {@link #getFirstRowColumn} for a Long with a provided default value.
- */
- public static Long getFirstRowLong(Context context, Uri uri, String[] projection,
- String selection, String[] selectionArgs, String sortOrder, int column,
- Long defaultValue) {
- return getFirstRowColumn(context, uri, projection, selection, selectionArgs,
- sortOrder, column, defaultValue, LONG_GETTER);
- }
-
- /**
- * {@link #getFirstRowColumn} for an Integer with null as a default value.
- */
- public static Integer getFirstRowInt(Context context, Uri uri, String[] projection,
- String selection, String[] selectionArgs, String sortOrder, int column) {
- return getFirstRowColumn(context, uri, projection, selection, selectionArgs,
- sortOrder, column, null, INT_GETTER);
- }
-
- /**
- * {@link #getFirstRowColumn} for an Integer with a provided default value.
- */
- public static Integer getFirstRowInt(Context context, Uri uri, String[] projection,
- String selection, String[] selectionArgs, String sortOrder, int column,
- Integer defaultValue) {
- return getFirstRowColumn(context, uri, projection, selection, selectionArgs,
- sortOrder, column, defaultValue, INT_GETTER);
- }
-
- /**
- * {@link #getFirstRowColumn} for a String with null as a default value.
- */
- public static String getFirstRowString(Context context, Uri uri, String[] projection,
- String selection, String[] selectionArgs, String sortOrder, int column) {
- return getFirstRowString(context, uri, projection, selection, selectionArgs, sortOrder,
- column, null);
- }
-
- /**
- * {@link #getFirstRowColumn} for a String with a provided default value.
- */
- public static String getFirstRowString(Context context, Uri uri, String[] projection,
- String selection, String[] selectionArgs, String sortOrder, int column,
- String defaultValue) {
- return getFirstRowColumn(context, uri, projection, selection, selectionArgs,
- sortOrder, column, defaultValue, STRING_GETTER);
- }
-
- /**
- * {@link #getFirstRowColumn} for a byte array with a provided default value.
- */
- public static byte[] getFirstRowBlob(Context context, Uri uri, String[] projection,
- String selection, String[] selectionArgs, String sortOrder, int column,
- byte[] defaultValue) {
- return getFirstRowColumn(context, uri, projection, selection, selectionArgs, sortOrder,
- column, defaultValue, BLOB_GETTER);
- }
-
- public static boolean attachmentExists(Context context, Attachment attachment) {
- if (attachment == null) {
- return false;
- } else if (attachment.mContentBytes != null) {
- return true;
- } else if (TextUtils.isEmpty(attachment.mContentUri)) {
- return false;
- }
- try {
- Uri fileUri = Uri.parse(attachment.mContentUri);
- try {
- InputStream inStream = context.getContentResolver().openInputStream(fileUri);
- try {
- inStream.close();
- } catch (IOException e) {
- // Nothing to be done if can't close the stream
- }
- return true;
- } catch (FileNotFoundException e) {
- return false;
- }
- } catch (RuntimeException re) {
- Log.w(Logging.LOG_TAG, "attachmentExists RuntimeException=" + re);
- return false;
- }
- }
-
- /**
- * Check whether the message with a given id has unloaded attachments. If the message is
- * a forwarded message, we look instead at the messages's source for the attachments. If the
- * message or forward source can't be found, we return false
- * @param context the caller's context
- * @param messageId the id of the message
- * @return whether or not the message has unloaded attachments
- */
- public static boolean hasUnloadedAttachments(Context context, long messageId) {
- Message msg = Message.restoreMessageWithId(context, messageId);
- if (msg == null) return false;
- Attachment[] atts = Attachment.restoreAttachmentsWithMessageId(context, messageId);
- for (Attachment att: atts) {
- if (!attachmentExists(context, att)) {
- // If the attachment doesn't exist and isn't marked for download, we're in trouble
- // since the outbound message will be stuck indefinitely in the Outbox. Instead,
- // we'll just delete the attachment and continue; this is far better than the
- // alternative. In theory, this situation shouldn't be possible.
- if ((att.mFlags & (Attachment.FLAG_DOWNLOAD_FORWARD |
- Attachment.FLAG_DOWNLOAD_USER_REQUEST)) == 0) {
- Log.d(Logging.LOG_TAG, "Unloaded attachment isn't marked for download: " +
- att.mFileName + ", #" + att.mId);
- Attachment.delete(context, Attachment.CONTENT_URI, att.mId);
- } else if (att.mContentUri != null) {
- // In this case, the attachment file is gone from the cache; let's clear the
- // contentUri; this should be a very unusual case
- ContentValues cv = new ContentValues();
- cv.putNull(AttachmentColumns.CONTENT_URI);
- Attachment.update(context, Attachment.CONTENT_URI, att.mId, cv);
- }
- return true;
- }
- }
- return false;
- }
-
- /**
- * Convenience method wrapping calls to retrieve columns from a single row, via EmailProvider.
- * The arguments are exactly the same as to contentResolver.query(). Results are returned in
- * an array of Strings corresponding to the columns in the projection. If the cursor has no
- * rows, null is returned.
- */
- public static String[] getRowColumns(Context context, Uri contentUri, String[] projection,
- String selection, String[] selectionArgs) {
- String[] values = new String[projection.length];
- ContentResolver cr = context.getContentResolver();
- Cursor c = cr.query(contentUri, projection, selection, selectionArgs, null);
- try {
- if (c.moveToFirst()) {
- for (int i = 0; i < projection.length; i++) {
- values[i] = c.getString(i);
- }
- } else {
- return null;
- }
- } finally {
- c.close();
- }
- return values;
- }
-
- /**
- * Convenience method for retrieving columns from a particular row in EmailProvider.
- * Passed in here are a base uri (e.g. Message.CONTENT_URI), the unique id of a row, and
- * a projection. This method calls the previous one with the appropriate URI.
- */
- public static String[] getRowColumns(Context context, Uri baseUri, long id,
- String ... projection) {
- return getRowColumns(context, ContentUris.withAppendedId(baseUri, id), projection, null,
- null);
- }
-
- public static boolean isExternalStorageMounted() {
- return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
- }
-
- /**
- * Class that supports running any operation for each account.
- */
- public abstract static class ForEachAccount extends AsyncTask<Void, Void, Long[]> {
- private final Context mContext;
-
- public ForEachAccount(Context context) {
- mContext = context;
- }
-
- @Override
- protected final Long[] doInBackground(Void... params) {
- ArrayList<Long> ids = new ArrayList<Long>();
- Cursor c = mContext.getContentResolver().query(Account.CONTENT_URI,
- Account.ID_PROJECTION, null, null, null);
- try {
- while (c.moveToNext()) {
- ids.add(c.getLong(Account.ID_PROJECTION_COLUMN));
- }
- } finally {
- c.close();
- }
- return ids.toArray(EMPTY_LONGS);
- }
-
- @Override
- protected final void onPostExecute(Long[] ids) {
- if (ids != null && !isCancelled()) {
- for (long id : ids) {
- performAction(id);
- }
- }
- onFinished();
- }
-
- /**
- * This method will be called for each account.
- */
- protected abstract void performAction(long accountId);
-
- /**
- * Called when the iteration is finished.
- */
- protected void onFinished() {
- }
- }
-
- /**
- * Updates the last seen message key in the mailbox data base for the INBOX of the currently
- * shown account. If the account is {@link Account#ACCOUNT_ID_COMBINED_VIEW}, the INBOX for
- * all accounts are updated.
- * @return an {@link EmailAsyncTask} for test only.
- */
- public static EmailAsyncTask<Void, Void, Void> updateLastNotifiedMessageKey(
- final Context context, final long mailboxId) {
- return EmailAsyncTask.runAsyncParallel(new Runnable() {
- private void updateLastSeenMessageKeyForMailbox(long mailboxId) {
- ContentResolver resolver = context.getContentResolver();
- if (mailboxId == Mailbox.QUERY_ALL_INBOXES) {
- Cursor c = resolver.query(
- Mailbox.CONTENT_URI, EmailContent.ID_PROJECTION, Mailbox.TYPE + "=?",
- new String[] { Integer.toString(Mailbox.TYPE_INBOX) }, null);
- if (c == null) throw new ProviderUnavailableException();
- try {
- while (c.moveToNext()) {
- final long id = c.getLong(EmailContent.ID_PROJECTION_COLUMN);
- updateLastSeenMessageKeyForMailbox(id);
- }
- } finally {
- c.close();
- }
- } else if (mailboxId > 0L) {
- Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
- // mailbox has been removed
- if (mailbox == null) {
- return;
- }
- // We use the highest _id for the account the mailbox table as the "last seen
- // message key". We don't care if the message has been read or not. We only
- // need a point at which we can compare against in the future. By setting this
- // value, we are claiming that every message before this has potentially been
- // seen by the user.
- long mostRecentMessageId = Utility.getFirstRowLong(context,
- ContentUris.withAppendedId(
- EmailContent.MAILBOX_MOST_RECENT_MESSAGE_URI, mailboxId),
- Message.ID_COLUMN_PROJECTION, null, null, null,
- Message.ID_MAILBOX_COLUMN_ID, -1L);
- long lastNotifiedMessageId = mailbox.mLastNotifiedMessageKey;
- // Only update the db if the value has changed
- if (mostRecentMessageId != lastNotifiedMessageId) {
- Log.d(Logging.LOG_TAG, "Most recent = " + mostRecentMessageId +
- ", last notified: " + lastNotifiedMessageId +
- "; updating last notified");
- ContentValues values = mailbox.toContentValues();
- values.put(MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY, mostRecentMessageId);
- resolver.update(
- Mailbox.CONTENT_URI,
- values,
- EmailContent.ID_SELECTION,
- new String[] { Long.toString(mailbox.mId) });
- } else {
- Log.d(Logging.LOG_TAG, "Most recent = last notified; no change");
- }
- }
- }
-
- @Override
- public void run() {
- updateLastSeenMessageKeyForMailbox(mailboxId);
- }
- });
- }
-
- public static long[] toPrimitiveLongArray(Collection<Long> collection) {
- // Need to do this manually because we're converting to a primitive long array, not
- // a Long array.
- final int size = collection.size();
- final long[] ret = new long[size];
- // Collection doesn't have get(i). (Iterable doesn't have size())
- int i = 0;
- for (Long value : collection) {
- ret[i++] = value;
- }
- return ret;
- }
-
- public static Set<Long> toLongSet(long[] array) {
- // Need to do this manually because we're converting from a primitive long array, not
- // a Long array.
- final int size = array.length;
- HashSet<Long> ret = new HashSet<Long>(size);
- for (int i = 0; i < size; i++) {
- ret.add(array[i]);
- }
- return ret;
- }
-
- /**
- * Workaround for the {@link ListView#smoothScrollToPosition} randomly scroll the view bug
- * if it's called right after {@link ListView#setAdapter}.
- */
- public static void listViewSmoothScrollToPosition(final Activity activity,
- final ListView listView, final int position) {
- // Workarond: delay-call smoothScrollToPosition()
- new Handler().post(new Runnable() {
- @Override
- public void run() {
- if (activity.isFinishing()) {
- return; // Activity being destroyed
- }
- listView.smoothScrollToPosition(position);
- }
- });
- }
-
- private static final String[] ATTACHMENT_META_NAME_PROJECTION = {
- OpenableColumns.DISPLAY_NAME
- };
- private static final int ATTACHMENT_META_NAME_COLUMN_DISPLAY_NAME = 0;
-
- /**
- * @return Filename of a content of {@code contentUri}. If the provider doesn't provide the
- * filename, returns the last path segment of the URI.
- */
- public static String getContentFileName(Context context, Uri contentUri) {
- String name = getFirstRowString(context, contentUri, ATTACHMENT_META_NAME_PROJECTION, null,
- null, null, ATTACHMENT_META_NAME_COLUMN_DISPLAY_NAME);
- if (name == null) {
- name = contentUri.getLastPathSegment();
- }
- return name;
- }
-
- /**
- * Append a bold span to a {@link SpannableStringBuilder}.
- */
- public static SpannableStringBuilder appendBold(SpannableStringBuilder ssb, String text) {
- if (!TextUtils.isEmpty(text)) {
- SpannableString ss = new SpannableString(text);
- ss.setSpan(new StyleSpan(Typeface.BOLD), 0, ss.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- ssb.append(ss);
- }
-
- return ssb;
- }
-
- /**
- * Stringify a cursor for logging purpose.
- */
- public static String dumpCursor(Cursor c) {
- StringBuilder sb = new StringBuilder();
- sb.append("[");
- while (c != null) {
- sb.append(c.getClass()); // Class name may not be available if toString() is overridden
- sb.append("/");
- sb.append(c.toString());
- if (c.isClosed()) {
- sb.append(" (closed)");
- }
- if (c instanceof CursorWrapper) {
- c = ((CursorWrapper) c).getWrappedCursor();
- sb.append(", ");
- } else {
- break;
- }
- }
- sb.append("]");
- return sb.toString();
- }
-
- /**
- * Cursor wrapper that remembers where it was closed.
- *
- * Use {@link #get} to create a wrapped cursor.
- * USe {@link #getTraceIfAvailable} to get the stack trace.
- * Use {@link #log} to log if/where it was closed.
- */
- public static class CloseTraceCursorWrapper extends CursorWrapper {
- private static final boolean TRACE_ENABLED = false;
-
- private Exception mTrace;
-
- private CloseTraceCursorWrapper(Cursor cursor) {
- super(cursor);
- }
-
- @Override
- public void close() {
- mTrace = new Exception("STACK TRACE");
- super.close();
- }
-
- public static Exception getTraceIfAvailable(Cursor c) {
- if (c instanceof CloseTraceCursorWrapper) {
- return ((CloseTraceCursorWrapper) c).mTrace;
- } else {
- return null;
- }
- }
-
- public static void log(Cursor c) {
- if (c == null) {
- return;
- }
- if (c.isClosed()) {
- Log.w(Logging.LOG_TAG, "Cursor was closed here: Cursor=" + c,
- getTraceIfAvailable(c));
- } else {
- Log.w(Logging.LOG_TAG, "Cursor not closed. Cursor=" + c);
- }
- }
-
- public static Cursor get(Cursor original) {
- return TRACE_ENABLED ? new CloseTraceCursorWrapper(original) : original;
- }
-
- /* package */ static CloseTraceCursorWrapper alwaysCreateForTest(Cursor original) {
- return new CloseTraceCursorWrapper(original);
- }
- }
-
- /**
- * Test that the given strings are equal in a null-pointer safe fashion.
- */
- public static boolean areStringsEqual(String s1, String s2) {
- return (s1 != null && s1.equals(s2)) || (s1 == null && s2 == null);
- }
-
- public static void enableStrictMode(boolean enabled) {
- StrictMode.setThreadPolicy(enabled
- ? new StrictMode.ThreadPolicy.Builder().detectAll().build()
- : StrictMode.ThreadPolicy.LAX);
- StrictMode.setVmPolicy(enabled
- ? new StrictMode.VmPolicy.Builder().detectAll().build()
- : StrictMode.VmPolicy.LAX);
- }
-
- public static String dumpFragment(Fragment f) {
- StringWriter sw = new StringWriter();
- PrintWriter w = new PrintWriter(sw);
- f.dump("", new FileDescriptor(), w, new String[0]);
- return sw.toString();
- }
-
- /**
- * Builds an "in" expression for SQLite.
- *
- * e.g. "ID" + 1,2,3 -> "ID in (1,2,3)". If {@code values} is empty or null, it returns an
- * empty string.
- */
- public static String buildInSelection(String columnName, Collection<? extends Number> values) {
- if ((values == null) || (values.size() == 0)) {
- return "";
- }
- StringBuilder sb = new StringBuilder();
- sb.append(columnName);
- sb.append(" in (");
- String sep = "";
- for (Number n : values) {
- sb.append(sep);
- sb.append(n.toString());
- sep = ",";
- }
- sb.append(')');
- return sb.toString();
- }
-}
diff --git a/email2/emailsync/Android.mk b/email2/emailsync/Android.mk
deleted file mode 100644
index 0076c5d72..000000000
--- a/email2/emailsync/Android.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2012, The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH := $(call my-dir)
-
-# Build the com.android.emailcommon static library. At the moment, this includes
-# the emailcommon files themselves plus everything under src/org (apache code). All of our
-# AIDL files are also compiled into the static library
-
-include $(CLEAR_VARS)
-
-
-LOCAL_MODULE := com.android.emailsync
-LOCAL_SRC_FILES := $(call all-java-files-under, src/com/android/emailsync)
-LOCAL_STATIC_JAVA_LIBRARIES := com.android.emailcommon2
-
-LOCAL_SDK_VERSION := 14
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/email2/emailsync/src/com/android/emailsync/AbstractSyncService.java b/email2/emailsync/src/com/android/emailsync/AbstractSyncService.java
deleted file mode 100644
index 7cbf13ac5..000000000
--- a/email2/emailsync/src/com/android/emailsync/AbstractSyncService.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Copyright (C) 2008-2009 Marc Blank
- * Licensed to The Android Open Source Project.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailsync;
-
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.os.Bundle;
-import android.util.Log;
-
-import java.util.concurrent.LinkedBlockingQueue;
-
-/**
- * Base class for all protocol services SyncManager (extends Service, implements
- * Runnable) instantiates subclasses to run a sync (either timed, or push, or
- * mail placed in outbox, etc.) EasSyncService is currently implemented; my goal
- * would be to move IMAP to this structure when it comes time to introduce push
- * functionality.
- */
-public abstract class AbstractSyncService implements Runnable {
-
- public String TAG = "AbstractSyncService";
-
- public static final int SECONDS = 1000;
- public static final int MINUTES = 60*SECONDS;
- public static final int HOURS = 60*MINUTES;
- public static final int DAYS = 24*HOURS;
-
- public static final int CONNECT_TIMEOUT = 30*SECONDS;
- public static final int NETWORK_WAIT = 15*SECONDS;
-
- public static final String EAS_PROTOCOL = "eas";
- public static final int EXIT_DONE = 0;
- public static final int EXIT_IO_ERROR = 1;
- public static final int EXIT_LOGIN_FAILURE = 2;
- public static final int EXIT_EXCEPTION = 3;
- public static final int EXIT_SECURITY_FAILURE = 4;
- public static final int EXIT_ACCESS_DENIED = 5;
-
- public Mailbox mMailbox;
- protected long mMailboxId;
- protected int mExitStatus = EXIT_EXCEPTION;
- protected String mMailboxName;
- public Account mAccount;
- public Context mContext;
- public int mChangeCount = 0;
- public volatile int mSyncReason = 0;
- protected volatile boolean mStop = false;
- public volatile Thread mThread;
- protected final Object mSynchronizer = new Object();
- // Whether or not the sync service is valid (usable)
- public boolean mIsValid = true;
-
- public boolean mUserLog = true; // STOPSHIP
- public boolean mFileLog = false;
-
- protected volatile long mRequestTime = 0;
- protected LinkedBlockingQueue<Request> mRequestQueue = new LinkedBlockingQueue<Request>();
-
- /**
- * Sent by SyncManager to request that the service stop itself cleanly
- */
- public abstract void stop();
-
- /**
- * Sent by SyncManager to indicate that an alarm has fired for this service, and that its
- * pending (network) operation has timed out. The service is NOT automatically stopped,
- * although the behavior is service dependent.
- *
- * @return true if the operation was stopped normally; false if the thread needed to be
- * interrupted.
- */
- public abstract boolean alarm();
-
- /**
- * Sent by SyncManager to request that the service reset itself cleanly; the meaning of this
- * operation is service dependent.
- */
- public abstract void reset();
-
- /**
- * Called to validate an account; abstract to allow each protocol to do what
- * is necessary. For consistency with the Email app's original
- * functionality, success is indicated by a failure to throw an Exception
- * (ugh). Parameters are self-explanatory
- *
- * @param hostAuth
- * @return a Bundle containing a result code and, depending on the result, a PolicySet or an
- * error message
- */
- public abstract Bundle validateAccount(HostAuth hostAuth, Context context);
-
- /**
- * Called to clear the syncKey for the calendar associated with this service; this is necessary
- * because changes to calendar sync state cause a reset of data.
- */
- public abstract void resetCalendarSyncKey();
-
- public AbstractSyncService(Context _context, Mailbox _mailbox) {
- mContext = _context;
- mMailbox = _mailbox;
- mMailboxId = _mailbox.mId;
- mMailboxName = _mailbox.mServerId;
- mAccount = Account.restoreAccountWithId(_context, _mailbox.mAccountKey);
- }
-
- // Will be required when subclasses are instantiated by name
- public AbstractSyncService(String prefix) {
- }
-
- /**
- * The UI can call this static method to perform account validation. This method wraps each
- * protocol's validateAccount method. Arguments are self-explanatory, except where noted.
- *
- * @param klass the protocol class (EasSyncService.class for example)
- * @param hostAuth
- * @param context
- * @return a Bundle containing a result code and, depending on the result, a PolicySet or an
- * error message
- */
- public static Bundle validate(Class<? extends AbstractSyncService> klass,
- HostAuth hostAuth, Context context) {
- AbstractSyncService svc;
- try {
- svc = klass.newInstance();
- return svc.validateAccount(hostAuth, context);
- } catch (IllegalAccessException e) {
- } catch (InstantiationException e) {
- }
- return null;
- }
-
- public static class ValidationResult {
- static final int NO_FAILURE = 0;
- static final int CONNECTION_FAILURE = 1;
- static final int VALIDATION_FAILURE = 2;
- static final int EXCEPTION = 3;
-
- static final ValidationResult succeeded = new ValidationResult(true, NO_FAILURE, null);
- boolean success;
- int failure = NO_FAILURE;
- String reason = null;
- Exception exception = null;
-
- ValidationResult(boolean _success, int _failure, String _reason) {
- success = _success;
- failure = _failure;
- reason = _reason;
- }
-
- ValidationResult(boolean _success) {
- success = _success;
- }
-
- ValidationResult(Exception e) {
- success = false;
- failure = EXCEPTION;
- exception = e;
- }
-
- public boolean isSuccess() {
- return success;
- }
-
- public String getReason() {
- return reason;
- }
- }
-
- public boolean isStopped() {
- return mStop;
- }
-
- public Object getSynchronizer() {
- return mSynchronizer;
- }
-
- /**
- * Convenience methods to do user logging (i.e. connection activity). Saves a bunch of
- * repetitive code.
- */
- public void userLog(String string, int code, String string2) {
- if (mUserLog) {
- userLog(string + code + string2);
- }
- }
-
- public void userLog(String string, int code) {
- if (mUserLog) {
- userLog(string + code);
- }
- }
-
- public void userLog(String str, Exception e) {
- if (mUserLog) {
- Log.e(TAG, str, e);
- } else {
- Log.e(TAG, str + e);
- }
- if (mFileLog) {
- FileLogger.log(e);
- }
- }
-
- /**
- * Standard logging for EAS.
- * If user logging is active, we concatenate any arguments and log them using Log.d
- * We also check for file logging, and log appropriately
- * @param strings strings to concatenate and log
- */
- public void userLog(String ...strings) {
- if (mUserLog) {
- String logText;
- if (strings.length == 1) {
- logText = strings[0];
- } else {
- StringBuilder sb = new StringBuilder(64);
- for (String string: strings) {
- sb.append(string);
- }
- logText = sb.toString();
- }
- Log.d(TAG, logText);
- if (mFileLog) {
- FileLogger.log(TAG, logText);
- }
- }
- }
-
- /**
- * Error log is used for serious issues that should always be logged
- * @param str the string to log
- */
- public void errorLog(String str) {
- Log.e(TAG, str);
- if (mFileLog) {
- FileLogger.log(TAG, str);
- }
- }
-
- /**
- * Waits for up to 10 seconds for network connectivity; returns whether or not there is
- * network connectivity.
- *
- * @return whether there is network connectivity
- */
- public boolean hasConnectivity() {
- ConnectivityManager cm =
- (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
- int tries = 0;
- while (tries++ < 1) {
- // Use the same test as in ExchangeService#waitForConnectivity
- // TODO: Create common code for this test in emailcommon
- NetworkInfo info = cm.getActiveNetworkInfo();
- if (info != null) {
- return true;
- }
- try {
- Thread.sleep(10*SECONDS);
- } catch (InterruptedException e) {
- }
- }
- return false;
- }
-
- /**
- * Request handling (common functionality)
- * Can be overridden if desired
- */
-
- public void addRequest(Request req) {
- mRequestQueue.offer(req);
- }
-
- public void removeRequest(Request req) {
- mRequestQueue.remove(req);
- }
-
- public boolean hasPendingRequests() {
- return !mRequestQueue.isEmpty();
- }
-
- public void clearRequests() {
- mRequestQueue.clear();
- }
-}
diff --git a/email2/emailsync/src/com/android/emailsync/EmailSyncAlarmReceiver.java b/email2/emailsync/src/com/android/emailsync/EmailSyncAlarmReceiver.java
deleted file mode 100644
index 639c9cfc2..000000000
--- a/email2/emailsync/src/com/android/emailsync/EmailSyncAlarmReceiver.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2008-2009 Marc Blank
- * Licensed to The Android Open Source Project.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailsync;
-
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.util.Log;
-
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.emailcommon.provider.ProviderUnavailableException;
-
-import java.util.ArrayList;
-
-/**
- * EmailSyncAlarmReceiver (USAR) is used by the SyncManager to start up-syncs of user-modified data
- * back to the Exchange server.
- *
- * Here's how this works for Email, for example:
- *
- * 1) User modifies or deletes an email from the UI.
- * 2) SyncManager, which has a ContentObserver watching the Message class, is alerted to a change
- * 3) SyncManager sets an alarm (to be received by USAR) for a few seconds in the
- * future (currently 15), the delay preventing excess syncing (think of it as a debounce mechanism).
- * 4) ESAR Receiver's onReceive method is called
- * 5) ESAR goes through all change and deletion records and compiles a list of mailboxes which have
- * changes to be uploaded.
- * 6) ESAR calls SyncManager to start syncs of those mailboxes
- *
- * If EmailProvider isn't available, the upsyncs will happen the next time ExchangeService starts
- *
- */
-public class EmailSyncAlarmReceiver extends BroadcastReceiver {
- final String[] MAILBOX_DATA_PROJECTION = {MessageColumns.MAILBOX_KEY};
-
- @Override
- public void onReceive(final Context context, Intent intent) {
- new Thread(new Runnable() {
- public void run() {
- handleReceive(context);
- }
- }).start();
- }
-
- private void handleReceive(Context context) {
- ArrayList<Long> mailboxesToNotify = new ArrayList<Long>();
- ContentResolver cr = context.getContentResolver();
-
- // Get a selector for EAS accounts (we don't want to sync on changes to POP/IMAP messages)
- String selector = SyncServiceManager.getAccountSelector();
-
- try {
- // Find all of the deletions
- Cursor c = cr.query(Message.DELETED_CONTENT_URI, MAILBOX_DATA_PROJECTION, selector,
- null, null);
- if (c == null) throw new ProviderUnavailableException();
- try {
- // Keep track of which mailboxes to notify; we'll only notify each one once
- while (c.moveToNext()) {
- long mailboxId = c.getLong(0);
- if (!mailboxesToNotify.contains(mailboxId)) {
- mailboxesToNotify.add(mailboxId);
- }
- }
- } finally {
- c.close();
- }
-
- // Now, find changed messages
- c = cr.query(Message.UPDATED_CONTENT_URI, MAILBOX_DATA_PROJECTION, selector,
- null, null);
- if (c == null) throw new ProviderUnavailableException();
- try {
- // Keep track of which mailboxes to notify; we'll only notify each one once
- while (c.moveToNext()) {
- long mailboxId = c.getLong(0);
- if (!mailboxesToNotify.contains(mailboxId)) {
- mailboxesToNotify.add(mailboxId);
- }
- }
- } finally {
- c.close();
- }
-
- // Request service from the mailbox
- for (Long mailboxId: mailboxesToNotify) {
- SyncServiceManager.serviceRequest(mailboxId, SyncServiceManager.SYNC_UPSYNC);
- }
- } catch (ProviderUnavailableException e) {
- Log.e("EmailSyncAlarmReceiver", "EmailProvider unavailable; aborting alarm receiver");
- }
- }
-}
diff --git a/email2/emailsync/src/com/android/emailsync/FileLogger.java b/email2/emailsync/src/com/android/emailsync/FileLogger.java
deleted file mode 100644
index db8b62605..000000000
--- a/email2/emailsync/src/com/android/emailsync/FileLogger.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailsync;
-
-import android.content.Context;
-import android.os.Environment;
-
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Date;
-
-public class FileLogger {
- private static FileLogger LOGGER = null;
- private static FileWriter sLogWriter = null;
- public static String LOG_FILE_NAME =
- Environment.getExternalStorageDirectory() + "/emaillog.txt";
-
- public synchronized static FileLogger getLogger (Context c) {
- LOGGER = new FileLogger();
- return LOGGER;
- }
-
- private FileLogger() {
- try {
- sLogWriter = new FileWriter(LOG_FILE_NAME, true);
- } catch (IOException e) {
- // Doesn't matter
- }
- }
-
- static public synchronized void close() {
- if (sLogWriter != null) {
- try {
- sLogWriter.close();
- } catch (IOException e) {
- // Doesn't matter
- }
- sLogWriter = null;
- }
- }
-
- static public synchronized void log(Exception e) {
- if (sLogWriter != null) {
- log("Exception", "Stack trace follows...");
- PrintWriter pw = new PrintWriter(sLogWriter);
- e.printStackTrace(pw);
- pw.flush();
- }
- }
-
- @SuppressWarnings("deprecation")
- static public synchronized void log(String prefix, String str) {
- if (LOGGER == null) {
- LOGGER = new FileLogger();
- log("Logger", "\r\n\r\n --- New Log ---");
- }
- Date d = new Date();
- int hr = d.getHours();
- int min = d.getMinutes();
- int sec = d.getSeconds();
-
- // I don't use DateFormat here because (in my experience), it's much slower
- StringBuffer sb = new StringBuffer(256);
- sb.append('[');
- sb.append(hr);
- sb.append(':');
- if (min < 10)
- sb.append('0');
- sb.append(min);
- sb.append(':');
- if (sec < 10) {
- sb.append('0');
- }
- sb.append(sec);
- sb.append("] ");
- if (prefix != null) {
- sb.append(prefix);
- sb.append("| ");
- }
- sb.append(str);
- sb.append("\r\n");
- String s = sb.toString();
-
- if (sLogWriter != null) {
- try {
- sLogWriter.write(s);
- sLogWriter.flush();
- } catch (IOException e) {
- // Something might have happened to the sdcard
- if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
- // If the card is mounted and we can create the writer, retry
- LOGGER = new FileLogger();
- if (sLogWriter != null) {
- try {
- log("FileLogger", "Exception writing log; recreating...");
- log(prefix, str);
- } catch (Exception e1) {
- // Nothing to do at this point
- }
- }
- }
- }
- }
- }
-}
diff --git a/email2/emailsync/src/com/android/emailsync/MailboxAlarmReceiver.java b/email2/emailsync/src/com/android/emailsync/MailboxAlarmReceiver.java
deleted file mode 100644
index 17a2590eb..000000000
--- a/email2/emailsync/src/com/android/emailsync/MailboxAlarmReceiver.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2008-2009 Marc Blank
- * Licensed to The Android Open Source Project.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailsync;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-
-/**
- * MailboxAlarmReceiver is used to "wake up" the ExchangeService at the appropriate time(s). It may
- * also be used for individual sync adapters, but this isn't implemented at the present time.
- *
- */
-public class MailboxAlarmReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- long mailboxId = intent.getLongExtra("mailbox", SyncServiceManager.EXTRA_MAILBOX_ID);
- // EXCHANGE_SERVICE_MAILBOX_ID tells us that the service is asking to be started
- if (mailboxId == SyncServiceManager.SYNC_SERVICE_MAILBOX_ID) {
- context.startService(new Intent(context, SyncServiceManager.class));
- } else {
- SyncServiceManager.alert(context, mailboxId);
- }
- }
-}
-
diff --git a/email2/emailsync/src/com/android/emailsync/PartRequest.java b/email2/emailsync/src/com/android/emailsync/PartRequest.java
deleted file mode 100644
index 955f62d87..000000000
--- a/email2/emailsync/src/com/android/emailsync/PartRequest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2008-2009 Marc Blank
- * Licensed to The Android Open Source Project.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailsync;
-
-import com.android.emailcommon.provider.EmailContent.Attachment;
-
-/**
- * PartRequest is the EAS wrapper for attachment loading requests. In addition to information about
- * the attachment to be loaded, it also contains the callback to be used for status/progress
- * updates to the UI.
- */
-public class PartRequest extends Request {
- public final Attachment mAttachment;
- public final String mDestination;
- public final String mContentUriString;
- public final String mLocation;
-
- public PartRequest(Attachment _att, String _destination, String _contentUriString) {
- super(_att.mMessageKey);
- mAttachment = _att;
- mLocation = mAttachment.mLocation;
- mDestination = _destination;
- mContentUriString = _contentUriString;
- }
-
- // PartRequests are unique by their attachment id (i.e. multiple attachments might be queued
- // for a particular message, but any individual attachment can only be loaded once)
- public boolean equals(Object o) {
- if (!(o instanceof PartRequest)) return false;
- return ((PartRequest)o).mAttachment.mId == mAttachment.mId;
- }
-
- public int hashCode() {
- return (int)mAttachment.mId;
- }
-}
diff --git a/email2/emailsync/src/com/android/emailsync/Request.java b/email2/emailsync/src/com/android/emailsync/Request.java
deleted file mode 100644
index f686a36cc..000000000
--- a/email2/emailsync/src/com/android/emailsync/Request.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailsync;
-
-/**
- * Requests for mailbox actions are handled by subclasses of this abstract class.
- * Three subclasses are now defined: PartRequest (attachment load), MeetingResponseRequest
- * (respond to a meeting invitation), and MessageMoveRequest (move a message to another folder)
- */
-public abstract class Request {
- public final long mTimeStamp = System.currentTimeMillis();
- public final long mMessageId;
-
- public Request(long messageId) {
- mMessageId = messageId;
- }
-
- // Subclasses of Request may have different semantics regarding equality; therefore,
- // we force them to implement the equals method
- public abstract boolean equals(Object o);
- public abstract int hashCode();
-}
diff --git a/email2/emailsync/src/com/android/emailsync/SyncServiceManager.java b/email2/emailsync/src/com/android/emailsync/SyncServiceManager.java
deleted file mode 100644
index 4a0efcdce..000000000
--- a/email2/emailsync/src/com/android/emailsync/SyncServiceManager.java
+++ /dev/null
@@ -1,2254 +0,0 @@
-/*
- * Copyright (C) 2008-2009 Marc Blank
- * Licensed to The Android Open Source Project.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailsync;
-
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.app.Service;
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.database.ContentObserver;
-import android.database.Cursor;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.net.NetworkInfo.State;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-import android.os.Process;
-import android.os.RemoteException;
-import android.provider.CalendarContract;
-import android.provider.CalendarContract.Calendars;
-import android.provider.CalendarContract.Events;
-import android.provider.ContactsContract;
-import android.util.Log;
-
-import com.android.emailcommon.TempDirectory;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.Body;
-import com.android.emailcommon.provider.EmailContent.BodyColumns;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.emailcommon.provider.EmailContent.SyncColumns;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.provider.Policy;
-import com.android.emailcommon.provider.ProviderUnavailableException;
-import com.android.emailcommon.service.AccountServiceProxy;
-import com.android.emailcommon.service.EmailServiceProxy;
-import com.android.emailcommon.service.EmailServiceStatus;
-import com.android.emailcommon.service.IEmailServiceCallback;
-import com.android.emailcommon.service.IEmailServiceCallback.Stub;
-import com.android.emailcommon.service.PolicyServiceProxy;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.EmailClientConnectionManager;
-import com.android.emailcommon.utility.Utility;
-
-import org.apache.http.conn.params.ConnManagerPNames;
-import org.apache.http.conn.params.ConnPerRoute;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.HttpParams;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * The SyncServiceManager handles the lifecycle of various sync adapters used by services that
- * cannot rely on the system SyncManager
- *
- * SyncServiceManager uses ContentObservers to detect changes to accounts, mailboxes, & messages in
- * order to maintain proper 2-way syncing of data. (More documentation to follow)
- *
- */
-public abstract class SyncServiceManager extends Service implements Runnable {
-
- private static final String TAG = "SyncServiceManager";
-
- // The SyncServiceManager's mailbox "id"
- public static final int EXTRA_MAILBOX_ID = -1;
- public static final int SYNC_SERVICE_MAILBOX_ID = 0;
-
- private static final int SECONDS = 1000;
- private static final int MINUTES = 60*SECONDS;
- private static final int ONE_DAY_MINUTES = 1440;
-
- private static final int SYNC_SERVICE_HEARTBEAT_TIME = 15*MINUTES;
- private static final int CONNECTIVITY_WAIT_TIME = 10*MINUTES;
-
- // Sync hold constants for services with transient errors
- private static final int HOLD_DELAY_MAXIMUM = 4*MINUTES;
-
- // Reason codes when SyncServiceManager.kick is called (mainly for debugging)
- // UI has changed data, requiring an upsync of changes
- public static final int SYNC_UPSYNC = 0;
- // A scheduled sync (when not using push)
- public static final int SYNC_SCHEDULED = 1;
- // Mailbox was marked push
- public static final int SYNC_PUSH = 2;
- // A ping (EAS push signal) was received
- public static final int SYNC_PING = 3;
- // Misc.
- public static final int SYNC_KICK = 4;
- // A part request (attachment load, for now) was sent to SyncServiceManager
- public static final int SYNC_SERVICE_PART_REQUEST = 5;
-
- // Requests >= SYNC_CALLBACK_START generate callbacks to the UI
- public static final int SYNC_CALLBACK_START = 6;
- // startSync was requested of SyncServiceManager (other than due to user request)
- public static final int SYNC_SERVICE_START_SYNC = SYNC_CALLBACK_START + 0;
- // startSync was requested of SyncServiceManager (due to user request)
- public static final int SYNC_UI_REQUEST = SYNC_CALLBACK_START + 1;
-
- protected static final String WHERE_IN_ACCOUNT_AND_PUSHABLE =
- MailboxColumns.ACCOUNT_KEY + "=? and type in (" + Mailbox.TYPE_INBOX + ','
- + Mailbox.TYPE_EAS_ACCOUNT_MAILBOX + ',' + Mailbox.TYPE_CONTACTS + ','
- + Mailbox.TYPE_CALENDAR + ')';
- protected static final String WHERE_IN_ACCOUNT_AND_TYPE_INBOX =
- MailboxColumns.ACCOUNT_KEY + "=? and type = " + Mailbox.TYPE_INBOX ;
- private static final String WHERE_MAILBOX_KEY = Message.MAILBOX_KEY + "=?";
- private static final String WHERE_NOT_INTERVAL_NEVER_AND_ACCOUNT_KEY_IN =
- "(" + MailboxColumns.TYPE + '=' + Mailbox.TYPE_OUTBOX
- + " or " + MailboxColumns.SYNC_INTERVAL + "!=" + Mailbox.CHECK_INTERVAL_NEVER + ')'
- + " and " + MailboxColumns.ACCOUNT_KEY + " in (";
-
- public static final int SEND_FAILED = 1;
- public static final String MAILBOX_KEY_AND_NOT_SEND_FAILED =
- MessageColumns.MAILBOX_KEY + "=? and (" + SyncColumns.SERVER_ID + " is null or " +
- SyncColumns.SERVER_ID + "!=" + SEND_FAILED + ')';
-
- public static final String CALENDAR_SELECTION =
- Calendars.ACCOUNT_NAME + "=? AND " + Calendars.ACCOUNT_TYPE + "=?";
- private static final String WHERE_CALENDAR_ID = Events.CALENDAR_ID + "=?";
-
- // Offsets into the syncStatus data for EAS that indicate type, exit status, and change count
- // The format is S<type_char>:<exit_char>:<change_count>
- public static final int STATUS_TYPE_CHAR = 1;
- public static final int STATUS_EXIT_CHAR = 3;
- public static final int STATUS_CHANGE_COUNT_OFFSET = 5;
-
- // Ready for ping
- public static final int PING_STATUS_OK = 0;
- // Service already running (can't ping)
- public static final int PING_STATUS_RUNNING = 1;
- // Service waiting after I/O error (can't ping)
- public static final int PING_STATUS_WAITING = 2;
- // Service had a fatal error; can't run
- public static final int PING_STATUS_UNABLE = 3;
- // Service is disabled by user (checkbox)
- public static final int PING_STATUS_DISABLED = 4;
-
- private static final int MAX_CLIENT_CONNECTION_MANAGER_SHUTDOWNS = 1;
-
- // We synchronize on this for all actions affecting the service and error maps
- private static final Object sSyncLock = new Object();
- // All threads can use this lock to wait for connectivity
- public static final Object sConnectivityLock = new Object();
- public static boolean sConnectivityHold = false;
-
- // Keeps track of running services (by mailbox id)
- public final HashMap<Long, AbstractSyncService> mServiceMap =
- new HashMap<Long, AbstractSyncService>();
- // Keeps track of services whose last sync ended with an error (by mailbox id)
- /*package*/ public ConcurrentHashMap<Long, SyncError> mSyncErrorMap =
- new ConcurrentHashMap<Long, SyncError>();
- // Keeps track of which services require a wake lock (by mailbox id)
- private final HashMap<Long, Boolean> mWakeLocks = new HashMap<Long, Boolean>();
- // Keeps track of PendingIntents for mailbox alarms (by mailbox id)
- private final HashMap<Long, PendingIntent> mPendingIntents = new HashMap<Long, PendingIntent>();
- // The actual WakeLock obtained by SyncServiceManager
- private WakeLock mWakeLock = null;
- // Keep our cached list of active Accounts here
- public final AccountList mAccountList = new AccountList();
-
- // Observers that we use to look for changed mail-related data
- private final Handler mHandler = new Handler();
- private AccountObserver mAccountObserver;
- private MailboxObserver mMailboxObserver;
- private SyncedMessageObserver mSyncedMessageObserver;
-
- // Concurrent because CalendarSyncAdapter can modify the map during a wipe
- private final ConcurrentHashMap<Long, CalendarObserver> mCalendarObservers =
- new ConcurrentHashMap<Long, CalendarObserver>();
-
- public ContentResolver mResolver;
-
- // The singleton SyncServiceManager object, with its thread and stop flag
- protected static SyncServiceManager INSTANCE;
- protected static Thread sServiceThread = null;
- // Cached unique device id
- protected static String sDeviceId = null;
- // HashMap of ConnectionManagers that all EAS threads can use (by ssl/port pair)
- private static HashMap<Integer, EmailClientConnectionManager> sClientConnectionManagers =
- new HashMap<Integer, EmailClientConnectionManager>();
- // Count of ClientConnectionManager shutdowns
- private static volatile int sClientConnectionManagerShutdownCount = 0;
-
- private static volatile boolean sStartingUp = false;
- private static volatile boolean sStop = false;
-
- // The reason for SyncServiceManager's next wakeup call
- private String mNextWaitReason;
- // Whether we have an unsatisfied "kick" pending
- private boolean mKicked = false;
-
- // Receiver of connectivity broadcasts
- private ConnectivityReceiver mConnectivityReceiver = null;
- private ConnectivityReceiver mBackgroundDataSettingReceiver = null;
- private volatile boolean mBackgroundData = true;
- // The most current NetworkInfo (from ConnectivityManager)
- private NetworkInfo mNetworkInfo;
-
- // For sync logging
- protected static boolean sUserLog = false;
- protected static boolean sFileLog = false;
-
- /**
- * Return an AccountObserver for this manager; the subclass must implement the newAccount()
- * method, which is called whenever the observer discovers that a new account has been created.
- * The subclass should do any housekeeping necessary
- * @param handler a Handler
- * @return the AccountObserver
- */
- public abstract AccountObserver getAccountObserver(Handler handler);
-
- /**
- * Perform any housekeeping necessary upon startup of the manager
- */
- public abstract void onStartup();
-
- /**
- * Returns a String that can be used as a WHERE clause in SQLite that selects accounts whose
- * syncs are managed by this manager
- * @return the account selector String
- */
- public abstract String getAccountsSelector();
-
- /**
- * Returns an appropriate sync service for the passed in mailbox
- * @param context the caller's context
- * @param mailbox the Mailbox to be synced
- * @return a service that will sync the Mailbox
- */
- public abstract AbstractSyncService getServiceForMailbox(Context context, Mailbox mailbox);
-
- /**
- * Return a list of all Accounts in EmailProvider. Because the result of this call may be used
- * in account reconciliation, an exception is thrown if the result cannot be guaranteed accurate
- * @param context the caller's context
- * @param accounts a list that Accounts will be added into
- * @return the list of Accounts
- * @throws ProviderUnavailableException if the list of Accounts cannot be guaranteed valid
- */
- public abstract AccountList collectAccounts(Context context, AccountList accounts);
-
- /**
- * Returns the AccountManager type (e.g. com.android.exchange) for this sync service
- */
- public abstract String getAccountManagerType();
-
- /**
- * Returns the intent action used for this sync service
- */
- public abstract String getServiceIntentAction();
-
- /**
- * Returns the callback proxy used for communicating back with the Email app
- */
- public abstract Stub getCallbackProxy();
-
- public class AccountList extends ArrayList<Account> {
- private static final long serialVersionUID = 1L;
-
- @Override
- public boolean add(Account account) {
- // Cache the account manager account
- account.mAmAccount = new android.accounts.Account(
- account.mEmailAddress, getAccountManagerType());
- super.add(account);
- return true;
- }
-
- public boolean contains(long id) {
- for (Account account : this) {
- if (account.mId == id) {
- return true;
- }
- }
- return false;
- }
-
- public Account getById(long id) {
- for (Account account : this) {
- if (account.mId == id) {
- return account;
- }
- }
- return null;
- }
-
- public Account getByName(String accountName) {
- for (Account account : this) {
- if (account.mEmailAddress.equalsIgnoreCase(accountName)) {
- return account;
- }
- }
- return null;
- }
- }
-
- public static void setUserDebug(int state) {
- sUserLog = (state & EmailServiceProxy.DEBUG_BIT) != 0;
- sFileLog = (state & EmailServiceProxy.DEBUG_FILE_BIT) != 0;
- if (sFileLog) {
- sUserLog = true;
- }
- Log.d("Sync Debug", "Logging: " + (sUserLog ? "User " : "") + (sFileLog ? "File" : ""));
- }
-
- private boolean onSecurityHold(Account account) {
- return (account.mFlags & Account.FLAGS_SECURITY_HOLD) != 0;
- }
-
- public static String getAccountSelector() {
- SyncServiceManager ssm = INSTANCE;
- if (ssm == null) return "";
- return ssm.getAccountsSelector();
- }
-
- public abstract class AccountObserver extends ContentObserver {
- String mSyncableMailboxSelector = null;
- String mAccountSelector = null;
-
- // Runs when SyncServiceManager first starts
- @SuppressWarnings("deprecation")
- public AccountObserver(Handler handler) {
- super(handler);
- // At startup, we want to see what EAS accounts exist and cache them
- // TODO: Move database work out of UI thread
- Context context = getContext();
- synchronized (mAccountList) {
- try {
- collectAccounts(context, mAccountList);
- } catch (ProviderUnavailableException e) {
- // Just leave if EmailProvider is unavailable
- return;
- }
- // Create an account mailbox for any account without one
- for (Account account : mAccountList) {
- int cnt = Mailbox.count(context, Mailbox.CONTENT_URI, "accountKey="
- + account.mId, null);
- if (cnt == 0) {
- // This case handles a newly created account
- newAccount(account.mId);
- }
- }
- }
- // Run through accounts and update account hold information
- Utility.runAsync(new Runnable() {
- @Override
- public void run() {
- synchronized (mAccountList) {
- for (Account account : mAccountList) {
- if (onSecurityHold(account)) {
- // If we're in a security hold, and our policies are active, release
- // the hold
- if (PolicyServiceProxy.isActive(SyncServiceManager.this, null)) {
- PolicyServiceProxy.setAccountHoldFlag(SyncServiceManager.this,
- account, false);
- log("isActive true; release hold for " + account.mDisplayName);
- }
- }
- }
- }
- }});
- }
-
- /**
- * Returns a String suitable for appending to a where clause that selects for all syncable
- * mailboxes in all eas accounts
- * @return a complex selection string that is not to be cached
- */
- public String getSyncableMailboxWhere() {
- if (mSyncableMailboxSelector == null) {
- StringBuilder sb = new StringBuilder(WHERE_NOT_INTERVAL_NEVER_AND_ACCOUNT_KEY_IN);
- boolean first = true;
- synchronized (mAccountList) {
- for (Account account : mAccountList) {
- if (!first) {
- sb.append(',');
- } else {
- first = false;
- }
- sb.append(account.mId);
- }
- }
- sb.append(')');
- mSyncableMailboxSelector = sb.toString();
- }
- return mSyncableMailboxSelector;
- }
-
- private void onAccountChanged() {
- try {
- maybeStartSyncServiceManagerThread();
- Context context = getContext();
-
- // A change to the list requires us to scan for deletions (stop running syncs)
- // At startup, we want to see what accounts exist and cache them
- AccountList currentAccounts = new AccountList();
- try {
- collectAccounts(context, currentAccounts);
- } catch (ProviderUnavailableException e) {
- // Just leave if EmailProvider is unavailable
- return;
- }
- synchronized (mAccountList) {
- for (Account account : mAccountList) {
- boolean accountIncomplete =
- (account.mFlags & Account.FLAGS_INCOMPLETE) != 0;
- // If the current list doesn't include this account and the account wasn't
- // incomplete, then this is a deletion
- if (!currentAccounts.contains(account.mId) && !accountIncomplete) {
- // The implication is that the account has been deleted; let's find out
- alwaysLog("Observer found deleted account: " + account.mDisplayName);
- // Run the reconciler (the reconciliation itself runs in the Email app)
- runAccountReconcilerSync(SyncServiceManager.this);
- // See if the account is still around
- Account deletedAccount =
- Account.restoreAccountWithId(context, account.mId);
- if (deletedAccount != null) {
- // It is; add it to our account list
- alwaysLog("Account still in provider: " + account.mDisplayName);
- currentAccounts.add(account);
- } else {
- // It isn't; stop syncs and clear our selectors
- alwaysLog("Account deletion confirmed: " + account.mDisplayName);
- stopAccountSyncs(account.mId, true);
- mSyncableMailboxSelector = null;
- mAccountSelector = null;
- }
- } else {
- // Get the newest version of this account
- Account updatedAccount =
- Account.restoreAccountWithId(context, account.mId);
- if (updatedAccount == null) continue;
- if (account.mSyncInterval != updatedAccount.mSyncInterval
- || account.mSyncLookback != updatedAccount.mSyncLookback) {
- // Set the inbox interval to the interval of the Account
- // This setting should NOT affect other boxes
- ContentValues cv = new ContentValues();
- cv.put(MailboxColumns.SYNC_INTERVAL, updatedAccount.mSyncInterval);
- getContentResolver().update(Mailbox.CONTENT_URI, cv,
- WHERE_IN_ACCOUNT_AND_TYPE_INBOX, new String[] {
- Long.toString(account.mId)
- });
- // Stop all current syncs; the appropriate ones will restart
- log("Account " + account.mDisplayName + " changed; stop syncs");
- stopAccountSyncs(account.mId, true);
- }
-
- // See if this account is no longer on security hold
- if (onSecurityHold(account) && !onSecurityHold(updatedAccount)) {
- releaseSyncHolds(SyncServiceManager.this,
- AbstractSyncService.EXIT_SECURITY_FAILURE, account);
- }
-
- // Put current values into our cached account
- account.mSyncInterval = updatedAccount.mSyncInterval;
- account.mSyncLookback = updatedAccount.mSyncLookback;
- account.mFlags = updatedAccount.mFlags;
- }
- }
- // Look for new accounts
- for (Account account : currentAccounts) {
- if (!mAccountList.contains(account.mId)) {
- // Don't forget to cache the HostAuth
- HostAuth ha = HostAuth.restoreHostAuthWithId(getContext(),
- account.mHostAuthKeyRecv);
- if (ha == null) continue;
- account.mHostAuthRecv = ha;
- // This is an addition; create our magic hidden mailbox...
- log("Account observer found new account: " + account.mDisplayName);
- newAccount(account.mId);
- mAccountList.add(account);
- mSyncableMailboxSelector = null;
- mAccountSelector = null;
- }
- }
- // Finally, make sure our account list is up to date
- mAccountList.clear();
- mAccountList.addAll(currentAccounts);
- }
-
- // See if there's anything to do...
- kick("account changed");
- } catch (ProviderUnavailableException e) {
- alwaysLog("Observer failed; provider unavailable");
- }
- }
-
- @Override
- public void onChange(boolean selfChange) {
- new Thread(new Runnable() {
- @Override
- public void run() {
- onAccountChanged();
- }}, "Account Observer").start();
- }
-
- public abstract void newAccount(long acctId);
- }
-
- /**
- * Register a specific Calendar's data observer; we need to recognize when the SYNC_EVENTS
- * column has changed (when sync has turned off or on)
- * @param account the Account whose Calendar we're observing
- */
- private void registerCalendarObserver(Account account) {
- // Get a new observer
- CalendarObserver observer = new CalendarObserver(mHandler, account);
- if (observer.mCalendarId != 0) {
- // If we find the Calendar (and we'd better) register it and store it in the map
- mCalendarObservers.put(account.mId, observer);
- mResolver.registerContentObserver(
- ContentUris.withAppendedId(Calendars.CONTENT_URI, observer.mCalendarId), false,
- observer);
- }
- }
-
- /**
- * Unregister all CalendarObserver's
- */
- static public void unregisterCalendarObservers() {
- SyncServiceManager ssm = INSTANCE;
- if (ssm == null) return;
- ContentResolver resolver = ssm.mResolver;
- for (CalendarObserver observer: ssm.mCalendarObservers.values()) {
- resolver.unregisterContentObserver(observer);
- }
- ssm.mCalendarObservers.clear();
- }
-
- public static Uri asSyncAdapter(Uri uri, String account, String accountType) {
- return uri.buildUpon().appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
- .appendQueryParameter(Calendars.ACCOUNT_NAME, account)
- .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build();
- }
-
- /**
- * Return the syncable state of an account's calendar, as determined by the sync_events column
- * of our Calendar (from CalendarProvider2)
- * Note that the current state of sync_events is cached in our CalendarObserver
- * @param accountId the id of the account whose calendar we are checking
- * @return whether or not syncing of events is enabled
- */
- private boolean isCalendarEnabled(long accountId) {
- CalendarObserver observer = mCalendarObservers.get(accountId);
- if (observer != null) {
- return (observer.mSyncEvents == 1);
- }
- // If there's no observer, there's no Calendar in CalendarProvider2, so we return true
- // to allow Calendar creation
- return true;
- }
-
- private class CalendarObserver extends ContentObserver {
- final long mAccountId;
- final String mAccountName;
- long mCalendarId;
- long mSyncEvents;
-
- public CalendarObserver(Handler handler, Account account) {
- super(handler);
- mAccountId = account.mId;
- mAccountName = account.mEmailAddress;
- // Find the Calendar for this account
- Cursor c = mResolver.query(Calendars.CONTENT_URI,
- new String[] {Calendars._ID, Calendars.SYNC_EVENTS},
- CALENDAR_SELECTION,
- new String[] {account.mEmailAddress, getAccountManagerType()},
- null);
- if (c != null) {
- // Save its id and its sync events status
- try {
- if (c.moveToFirst()) {
- mCalendarId = c.getLong(0);
- mSyncEvents = c.getLong(1);
- }
- } finally {
- c.close();
- }
- }
- }
-
- @Override
- public synchronized void onChange(boolean selfChange) {
- // See if the user has changed syncing of our calendar
- if (!selfChange) {
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- Cursor c = mResolver.query(Calendars.CONTENT_URI,
- new String[] {Calendars.SYNC_EVENTS}, Calendars._ID + "=?",
- new String[] {Long.toString(mCalendarId)}, null);
- if (c == null) return;
- // Get its sync events; if it's changed, we've got work to do
- try {
- if (c.moveToFirst()) {
- long newSyncEvents = c.getLong(0);
- if (newSyncEvents != mSyncEvents) {
- log("_sync_events changed for calendar in " + mAccountName);
- Mailbox mailbox = Mailbox.restoreMailboxOfType(INSTANCE,
- mAccountId, Mailbox.TYPE_CALENDAR);
- // Sanity check for mailbox deletion
- if (mailbox == null) return;
- ContentValues cv = new ContentValues();
- if (newSyncEvents == 0) {
- // When sync is disabled, we're supposed to delete
- // all events in the calendar
- log("Deleting events and setting syncKey to 0 for " +
- mAccountName);
- // First, stop any sync that's ongoing
- stopManualSync(mailbox.mId);
- // Set the syncKey to 0 (reset)
- AbstractSyncService service = getServiceForMailbox(
- INSTANCE, mailbox);
- service.resetCalendarSyncKey();
- // Reset the sync key locally and stop syncing
- cv.put(Mailbox.SYNC_KEY, "0");
- cv.put(Mailbox.SYNC_INTERVAL,
- Mailbox.CHECK_INTERVAL_NEVER);
- mResolver.update(ContentUris.withAppendedId(
- Mailbox.CONTENT_URI, mailbox.mId), cv, null,
- null);
- // Delete all events using the sync adapter
- // parameter so that the deletion is only local
- Uri eventsAsSyncAdapter =
- asSyncAdapter(
- Events.CONTENT_URI,
- mAccountName,
- getAccountManagerType());
- mResolver.delete(eventsAsSyncAdapter, WHERE_CALENDAR_ID,
- new String[] {Long.toString(mCalendarId)});
- } else {
- // Make this a push mailbox and kick; this will start
- // a resync of the Calendar; the account mailbox will
- // ping on this during the next cycle of the ping loop
- cv.put(Mailbox.SYNC_INTERVAL,
- Mailbox.CHECK_INTERVAL_PUSH);
- mResolver.update(ContentUris.withAppendedId(
- Mailbox.CONTENT_URI, mailbox.mId), cv, null,
- null);
- kick("calendar sync changed");
- }
-
- // Save away the new value
- mSyncEvents = newSyncEvents;
- }
- }
- } finally {
- c.close();
- }
- } catch (ProviderUnavailableException e) {
- Log.w(TAG, "Observer failed; provider unavailable");
- }
- }}, "Calendar Observer").start();
- }
- }
- }
-
- private class MailboxObserver extends ContentObserver {
- public MailboxObserver(Handler handler) {
- super(handler);
- }
-
- @Override
- public void onChange(boolean selfChange) {
- // See if there's anything to do...
- if (!selfChange) {
- kick("mailbox changed");
- }
- }
- }
-
- private class SyncedMessageObserver extends ContentObserver {
- Intent syncAlarmIntent = new Intent(INSTANCE, EmailSyncAlarmReceiver.class);
- PendingIntent syncAlarmPendingIntent =
- PendingIntent.getBroadcast(INSTANCE, 0, syncAlarmIntent, 0);
- AlarmManager alarmManager = (AlarmManager)INSTANCE.getSystemService(Context.ALARM_SERVICE);
-
- public SyncedMessageObserver(Handler handler) {
- super(handler);
- }
-
- @Override
- public void onChange(boolean selfChange) {
- alarmManager.set(AlarmManager.RTC_WAKEUP,
- System.currentTimeMillis() + 10*SECONDS, syncAlarmPendingIntent);
- }
- }
-
- static public Account getAccountById(long accountId) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm != null) {
- AccountList accountList = ssm.mAccountList;
- synchronized (accountList) {
- return accountList.getById(accountId);
- }
- }
- return null;
- }
-
- static public Account getAccountByName(String accountName) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm != null) {
- AccountList accountList = ssm.mAccountList;
- synchronized (accountList) {
- return accountList.getByName(accountName);
- }
- }
- return null;
- }
-
- public class SyncStatus {
- static public final int NOT_RUNNING = 0;
- static public final int DIED = 1;
- static public final int SYNC = 2;
- static public final int IDLE = 3;
- }
-
- /*package*/ public class SyncError {
- int reason;
- public boolean fatal = false;
- long holdDelay = 15*SECONDS;
- public long holdEndTime = System.currentTimeMillis() + holdDelay;
-
- public SyncError(int _reason, boolean _fatal) {
- reason = _reason;
- fatal = _fatal;
- }
-
- /**
- * We double the holdDelay from 15 seconds through 4 mins
- */
- void escalate() {
- if (holdDelay < HOLD_DELAY_MAXIMUM) {
- holdDelay *= 2;
- }
- holdEndTime = System.currentTimeMillis() + holdDelay;
- }
- }
-
- private void logSyncHolds() {
- if (sUserLog) {
- log("Sync holds:");
- long time = System.currentTimeMillis();
- for (long mailboxId : mSyncErrorMap.keySet()) {
- Mailbox m = Mailbox.restoreMailboxWithId(this, mailboxId);
- if (m == null) {
- log("Mailbox " + mailboxId + " no longer exists");
- } else {
- SyncError error = mSyncErrorMap.get(mailboxId);
- if (error != null) {
- log("Mailbox " + m.mDisplayName + ", error = " + error.reason
- + ", fatal = " + error.fatal);
- if (error.holdEndTime > 0) {
- log("Hold ends in " + ((error.holdEndTime - time) / 1000) + "s");
- }
- }
- }
- }
- }
- }
-
- /**
- * Release security holds for the specified account
- * @param account the account whose Mailboxes should be released from security hold
- */
- static public void releaseSecurityHold(Account account) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm != null) {
- ssm.releaseSyncHolds(INSTANCE, AbstractSyncService.EXIT_SECURITY_FAILURE,
- account);
- }
- }
-
- /**
- * Release a specific type of hold (the reason) for the specified Account; if the account
- * is null, mailboxes from all accounts with the specified hold will be released
- * @param reason the reason for the SyncError (AbstractSyncService.EXIT_XXX)
- * @param account an Account whose mailboxes should be released (or all if null)
- * @return whether or not any mailboxes were released
- */
- public /*package*/ boolean releaseSyncHolds(Context context, int reason, Account account) {
- boolean holdWasReleased = releaseSyncHoldsImpl(context, reason, account);
- kick("security release");
- return holdWasReleased;
- }
-
- private boolean releaseSyncHoldsImpl(Context context, int reason, Account account) {
- boolean holdWasReleased = false;
- for (long mailboxId: mSyncErrorMap.keySet()) {
- if (account != null) {
- Mailbox m = Mailbox.restoreMailboxWithId(context, mailboxId);
- if (m == null) {
- mSyncErrorMap.remove(mailboxId);
- } else if (m.mAccountKey != account.mId) {
- continue;
- }
- }
- SyncError error = mSyncErrorMap.get(mailboxId);
- if (error != null && error.reason == reason) {
- mSyncErrorMap.remove(mailboxId);
- holdWasReleased = true;
- }
- }
- return holdWasReleased;
- }
-
- public static void log(String str) {
- log(TAG, str);
- }
-
- public static void log(String tag, String str) {
- if (sUserLog) {
- Log.d(tag, str);
- if (sFileLog) {
- FileLogger.log(tag, str);
- }
- }
- }
-
- public static void alwaysLog(String str) {
- if (!sUserLog) {
- Log.d(TAG, str);
- } else {
- log(str);
- }
- }
-
- /**
- * EAS requires a unique device id, so that sync is possible from a variety of different
- * devices (e.g. the syncKey is specific to a device) If we're on an emulator or some other
- * device that doesn't provide one, we can create it as "device".
- * This would work on a real device as well, but it would be better to use the "real" id if
- * it's available
- */
- static public String getDeviceId(Context context) throws IOException {
- if (sDeviceId == null) {
- sDeviceId = new AccountServiceProxy(context).getDeviceId();
- alwaysLog("Received deviceId from Email app: " + sDeviceId);
- }
- return sDeviceId;
- }
-
- static public ConnPerRoute sConnPerRoute = new ConnPerRoute() {
- @Override
- public int getMaxForRoute(HttpRoute route) {
- return 8;
- }
- };
-
- static public synchronized EmailClientConnectionManager getClientConnectionManager(boolean ssl,
- int port) {
- // We'll use a different connection manager for each ssl/port pair
- int key = (ssl ? 0x10000 : 0) + port;
- EmailClientConnectionManager mgr = sClientConnectionManagers.get(key);
- if (mgr == null) {
- // After two tries, kill the process. Most likely, this will happen in the background
- // The service will restart itself after about 5 seconds
- if (sClientConnectionManagerShutdownCount > MAX_CLIENT_CONNECTION_MANAGER_SHUTDOWNS) {
- alwaysLog("Shutting down process to unblock threads");
- Process.killProcess(Process.myPid());
- }
- HttpParams params = new BasicHttpParams();
- params.setIntParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 25);
- params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, sConnPerRoute);
- mgr = EmailClientConnectionManager.newInstance(params, ssl, port);
- log("Creating connection manager for port " + port + ", ssl: " + ssl);
- sClientConnectionManagers.put(key, mgr);
- }
- // Null is a valid return result if we get an exception
- return mgr;
- }
-
- static private synchronized void shutdownConnectionManager() {
- log("Shutting down ClientConnectionManagers");
- for (EmailClientConnectionManager mgr: sClientConnectionManagers.values()) {
- mgr.shutdown();
- }
- sClientConnectionManagers.clear();
- }
-
- public static void stopAccountSyncs(long acctId) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm != null) {
- ssm.stopAccountSyncs(acctId, true);
- }
- }
-
- public void stopAccountSyncs(long acctId, boolean includeAccountMailbox) {
- synchronized (sSyncLock) {
- List<Long> deletedBoxes = new ArrayList<Long>();
- for (Long mid : mServiceMap.keySet()) {
- Mailbox box = Mailbox.restoreMailboxWithId(this, mid);
- if (box != null) {
- if (box.mAccountKey == acctId) {
- if (!includeAccountMailbox &&
- box.mType == Mailbox.TYPE_EAS_ACCOUNT_MAILBOX) {
- AbstractSyncService svc = mServiceMap.get(mid);
- if (svc != null) {
- svc.stop();
- }
- continue;
- }
- AbstractSyncService svc = mServiceMap.get(mid);
- if (svc != null) {
- svc.stop();
- Thread t = svc.mThread;
- if (t != null) {
- t.interrupt();
- }
- }
- deletedBoxes.add(mid);
- }
- }
- }
- for (Long mid : deletedBoxes) {
- releaseMailbox(mid);
- }
- }
- }
-
- /**
- * Informs SyncServiceManager that an account has a new folder list; as a result, any existing
- * folder might have become invalid. Therefore, we act as if the account has been deleted, and
- * then we reinitialize it.
- *
- * @param acctId
- */
- static public void stopNonAccountMailboxSyncsForAccount(long acctId) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm != null) {
- ssm.stopAccountSyncs(acctId, false);
- kick("reload folder list");
- }
- }
-
- private void acquireWakeLock(long id) {
- synchronized (mWakeLocks) {
- Boolean lock = mWakeLocks.get(id);
- if (lock == null) {
- if (mWakeLock == null) {
- PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
- mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MAIL_SERVICE");
- mWakeLock.acquire();
- //log("+WAKE LOCK ACQUIRED");
- }
- mWakeLocks.put(id, true);
- }
- }
- }
-
- private void releaseWakeLock(long id) {
- synchronized (mWakeLocks) {
- Boolean lock = mWakeLocks.get(id);
- if (lock != null) {
- mWakeLocks.remove(id);
- if (mWakeLocks.isEmpty()) {
- if (mWakeLock != null) {
- mWakeLock.release();
- }
- mWakeLock = null;
- //log("+WAKE LOCK RELEASED");
- } else {
- }
- }
- }
- }
-
- static public String alarmOwner(long id) {
- if (id == EXTRA_MAILBOX_ID) {
- return TAG;
- } else {
- String name = Long.toString(id);
- if (sUserLog && INSTANCE != null) {
- Mailbox m = Mailbox.restoreMailboxWithId(INSTANCE, id);
- if (m != null) {
- name = m.mDisplayName + '(' + m.mAccountKey + ')';
- }
- }
- return "Mailbox " + name;
- }
- }
-
- private void clearAlarm(long id) {
- synchronized (mPendingIntents) {
- PendingIntent pi = mPendingIntents.get(id);
- if (pi != null) {
- AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
- alarmManager.cancel(pi);
- //log("+Alarm cleared for " + alarmOwner(id));
- mPendingIntents.remove(id);
- }
- }
- }
-
- private void setAlarm(long id, long millis) {
- synchronized (mPendingIntents) {
- PendingIntent pi = mPendingIntents.get(id);
- if (pi == null) {
- Intent i = new Intent(this, MailboxAlarmReceiver.class);
- i.putExtra("mailbox", id);
- i.setData(Uri.parse("Box" + id));
- pi = PendingIntent.getBroadcast(this, 0, i, 0);
- mPendingIntents.put(id, pi);
-
- AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
- alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + millis, pi);
- //log("+Alarm set for " + alarmOwner(id) + ", " + millis/1000 + "s");
- }
- }
- }
-
- private void clearAlarms() {
- AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
- synchronized (mPendingIntents) {
- for (PendingIntent pi : mPendingIntents.values()) {
- alarmManager.cancel(pi);
- }
- mPendingIntents.clear();
- }
- }
-
- static public void runAwake(long id) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm != null) {
- ssm.acquireWakeLock(id);
- ssm.clearAlarm(id);
- }
- }
-
- static public void runAsleep(long id, long millis) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm != null) {
- ssm.setAlarm(id, millis);
- ssm.releaseWakeLock(id);
- }
- }
-
- static public void clearWatchdogAlarm(long id) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm != null) {
- ssm.clearAlarm(id);
- }
- }
-
- static public void setWatchdogAlarm(long id, long millis) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm != null) {
- ssm.setAlarm(id, millis);
- }
- }
-
- static public void alert(Context context, final long id) {
- final SyncServiceManager ssm = INSTANCE;
- checkSyncServiceManagerServiceRunning();
- if (id < 0) {
- log("SyncServiceManager alert");
- kick("ping SyncServiceManager");
- } else if (ssm == null) {
- context.startService(new Intent(context, SyncServiceManager.class));
- } else {
- final AbstractSyncService service = ssm.mServiceMap.get(id);
- if (service != null) {
- // Handle alerts in a background thread, as we are typically called from a
- // broadcast receiver, and are therefore running in the UI thread
- String threadName = "SyncServiceManager Alert: ";
- if (service.mMailbox != null) {
- threadName += service.mMailbox.mDisplayName;
- }
- new Thread(new Runnable() {
- @Override
- public void run() {
- Mailbox m = Mailbox.restoreMailboxWithId(ssm, id);
- if (m != null) {
- // We ignore drafts completely (doesn't sync). Changes in Outbox are
- // handled in the checkMailboxes loop, so we can ignore these pings.
- if (sUserLog) {
- Log.d(TAG, "Alert for mailbox " + id + " (" + m.mDisplayName + ")");
- }
- if (m.mType == Mailbox.TYPE_DRAFTS || m.mType == Mailbox.TYPE_OUTBOX) {
- String[] args = new String[] {Long.toString(m.mId)};
- ContentResolver resolver = INSTANCE.mResolver;
- resolver.delete(Message.DELETED_CONTENT_URI, WHERE_MAILBOX_KEY,
- args);
- resolver.delete(Message.UPDATED_CONTENT_URI, WHERE_MAILBOX_KEY,
- args);
- return;
- }
- service.mAccount = Account.restoreAccountWithId(INSTANCE, m.mAccountKey);
- service.mMailbox = m;
- // Send the alarm to the sync service
- if (!service.alarm()) {
- // A false return means that we were forced to interrupt the thread
- // In this case, we release the mailbox so that we can start another
- // thread to do the work
- log("Alarm failed; releasing mailbox");
- synchronized(sSyncLock) {
- ssm.releaseMailbox(id);
- }
- // Shutdown the connection manager; this should close all of our
- // sockets and generate IOExceptions all around.
- SyncServiceManager.shutdownConnectionManager();
- }
- }
- }}, threadName).start();
- }
- }
- }
-
- public class ConnectivityReceiver extends BroadcastReceiver {
- @SuppressWarnings("deprecation")
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
- Bundle b = intent.getExtras();
- if (b != null) {
- NetworkInfo a = (NetworkInfo)b.get(ConnectivityManager.EXTRA_NETWORK_INFO);
- String info = "Connectivity alert for " + a.getTypeName();
- State state = a.getState();
- if (state == State.CONNECTED) {
- info += " CONNECTED";
- log(info);
- synchronized (sConnectivityLock) {
- sConnectivityLock.notifyAll();
- }
- kick("connected");
- } else if (state == State.DISCONNECTED) {
- info += " DISCONNECTED";
- log(info);
- kick("disconnected");
- }
- }
- } else if (intent.getAction().equals(
- ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED)) {
- ConnectivityManager cm =
- (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
- mBackgroundData = cm.getBackgroundDataSetting();
- // If background data is now on, we want to kick SyncServiceManager
- if (mBackgroundData) {
- kick("background data on");
- log("Background data on; restart syncs");
- // Otherwise, stop all syncs
- } else {
- log("Background data off: stop all syncs");
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- synchronized (mAccountList) {
- for (Account account : mAccountList)
- SyncServiceManager.stopAccountSyncs(account.mId);
- }
- }});
- }
- }
- }
- }
-
- /**
- * Starts a service thread and enters it into the service map
- * This is the point of instantiation of all sync threads
- * @param service the service to start
- * @param m the Mailbox on which the service will operate
- */
- private void startServiceThread(AbstractSyncService service) {
- synchronized (sSyncLock) {
- Mailbox mailbox = service.mMailbox;
- String mailboxName = mailbox.mDisplayName;
- String accountName = service.mAccount.mDisplayName;
- Thread thread = new Thread(service, mailboxName + "[" + accountName + "]");
- log("Starting thread for " + mailboxName + " in account " + accountName);
- thread.start();
- mServiceMap.put(mailbox.mId, service);
- runAwake(mailbox.mId);
- if (mailbox.mServerId != null && mailbox.mType != Mailbox.TYPE_EAS_ACCOUNT_MAILBOX) {
- stopPing(mailbox.mAccountKey);
- }
- }
- }
-
- /**
- * Stop any ping in progress for the given account
- * @param accountId
- */
- private void stopPing(long accountId) {
- // Go through our active mailboxes looking for the right one
- synchronized (sSyncLock) {
- for (long mailboxId: mServiceMap.keySet()) {
- Mailbox m = Mailbox.restoreMailboxWithId(this, mailboxId);
- if (m != null) {
- String serverId = m.mServerId;
- if (m.mAccountKey == accountId && serverId != null &&
- m.mType == Mailbox.TYPE_EAS_ACCOUNT_MAILBOX) {
- // Here's our account mailbox; reset him (stopping pings)
- AbstractSyncService svc = mServiceMap.get(mailboxId);
- svc.reset();
- }
- }
- }
- }
- }
-
- private void requestSync(Mailbox m, int reason, Request req) {
- int syncStatus = EmailContent.SYNC_STATUS_BACKGROUND;
- // Don't sync if there's no connectivity
- if (sConnectivityHold || (m == null) || sStop) {
- if (reason >= SYNC_CALLBACK_START) {
- try {
- Stub proxy = getCallbackProxy();
- if (proxy != null) {
- proxy.syncMailboxStatus(m.mId, EmailServiceStatus.CONNECTION_ERROR, 0);
- }
- } catch (RemoteException e) {
- // We tried...
- }
- }
- return;
- }
- synchronized (sSyncLock) {
- Account acct = Account.restoreAccountWithId(this, m.mAccountKey);
- if (acct != null) {
- // Always make sure there's not a running instance of this service
- AbstractSyncService service = mServiceMap.get(m.mId);
- if (service == null) {
- service = getServiceForMailbox(this, m);
- if (!service.mIsValid) return;
- service.mSyncReason = reason;
- if (req != null) {
- service.addRequest(req);
- }
- startServiceThread(service);
- if (reason >= SYNC_CALLBACK_START) {
- syncStatus = EmailContent.SYNC_STATUS_USER;
- }
- setMailboxSyncStatus(m.mId, syncStatus);
- }
- }
- }
- }
-
- private void setMailboxSyncStatus(long id, int status) {
- ContentValues values = new ContentValues();
- values.put(Mailbox.UI_SYNC_STATUS, status);
- mResolver.update(ContentUris.withAppendedId(Mailbox.CONTENT_URI, id), values, null, null);
- }
-
- private void setMailboxLastSyncResult(long id, int result) {
- ContentValues values = new ContentValues();
- values.put(Mailbox.UI_LAST_SYNC_RESULT, result);
- mResolver.update(ContentUris.withAppendedId(Mailbox.CONTENT_URI, id), values, null, null);
- }
-
- private void stopServiceThreads() {
- synchronized (sSyncLock) {
- ArrayList<Long> toStop = new ArrayList<Long>();
-
- // Keep track of which services to stop
- for (Long mailboxId : mServiceMap.keySet()) {
- toStop.add(mailboxId);
- }
-
- // Shut down all of those running services
- for (Long mailboxId : toStop) {
- AbstractSyncService svc = mServiceMap.get(mailboxId);
- if (svc != null) {
- log("Stopping " + svc.mAccount.mDisplayName + '/' + svc.mMailbox.mDisplayName);
- svc.stop();
- if (svc.mThread != null) {
- svc.mThread.interrupt();
- }
- }
- releaseWakeLock(mailboxId);
- }
- }
- }
-
- private void waitForConnectivity() {
- boolean waiting = false;
- ConnectivityManager cm =
- (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
- while (!sStop) {
- NetworkInfo info = cm.getActiveNetworkInfo();
- if (info != null) {
- mNetworkInfo = info;
- // We're done if there's an active network
- if (waiting) {
- // If we've been waiting, release any I/O error holds
- releaseSyncHolds(this, AbstractSyncService.EXIT_IO_ERROR, null);
- // And log what's still being held
- logSyncHolds();
- }
- return;
- } else {
- // If this is our first time through the loop, shut down running service threads
- if (!waiting) {
- waiting = true;
- stopServiceThreads();
- }
- // Wait until a network is connected (or 10 mins), but let the device sleep
- // We'll set an alarm just in case we don't get notified (bugs happen)
- synchronized (sConnectivityLock) {
- runAsleep(EXTRA_MAILBOX_ID, CONNECTIVITY_WAIT_TIME+5*SECONDS);
- try {
- log("Connectivity lock...");
- sConnectivityHold = true;
- sConnectivityLock.wait(CONNECTIVITY_WAIT_TIME);
- log("Connectivity lock released...");
- } catch (InterruptedException e) {
- // This is fine; we just go around the loop again
- } finally {
- sConnectivityHold = false;
- }
- runAwake(EXTRA_MAILBOX_ID);
- }
- }
- }
- }
-
- /**
- * Note that there are two ways the EAS SyncServiceManager service can be created:
- *
- * 1) as a background service instantiated via startService (which happens on boot, when the
- * first EAS account is created, etc), in which case the service thread is spun up, mailboxes
- * sync, etc. and
- * 2) to execute an RPC call from the UI, in which case the background service will already be
- * running most of the time (unless we're creating a first EAS account)
- *
- * If the running background service detects that there are no EAS accounts (on boot, if none
- * were created, or afterward if the last remaining EAS account is deleted), it will call
- * stopSelf() to terminate operation.
- *
- * The goal is to ensure that the background service is running at all times when there is at
- * least one EAS account in existence
- *
- * Because there are edge cases in which our process can crash (typically, this has been seen
- * in UI crashes, ANR's, etc.), it's possible for the UI to start up again without the
- * background service having been started. We explicitly try to start the service in Welcome
- * (to handle the case of the app having been reloaded). We also start the service on any
- * startSync call (if it isn't already running)
- */
- @SuppressWarnings("deprecation")
- @Override
- public void onCreate() {
- Utility.runAsync(new Runnable() {
- @Override
- public void run() {
- // Quick checks first, before getting the lock
- if (sStartingUp) return;
- synchronized (sSyncLock) {
- alwaysLog("!!! EAS SyncServiceManager, onCreate");
- // Try to start up properly; we might be coming back from a crash that the Email
- // application isn't aware of.
- startService(new Intent(getServiceIntentAction()));
- if (sStop) {
- return;
- }
- }
- }});
- }
-
- @SuppressWarnings("deprecation")
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- alwaysLog("!!! EAS SyncServiceManager, onStartCommand, startingUp = " + sStartingUp +
- ", running = " + (INSTANCE != null));
- if (!sStartingUp && INSTANCE == null) {
- sStartingUp = true;
- Utility.runAsync(new Runnable() {
- @Override
- public void run() {
- try {
- synchronized (sSyncLock) {
- // SyncServiceManager cannot start unless we connect to AccountService
- if (!new AccountServiceProxy(SyncServiceManager.this).test()) {
- alwaysLog("!!! Email application not found; stopping self");
- stopSelf();
- }
- if (sDeviceId == null) {
- try {
- String deviceId = getDeviceId(SyncServiceManager.this);
- if (deviceId != null) {
- sDeviceId = deviceId;
- }
- } catch (IOException e) {
- }
- if (sDeviceId == null) {
- alwaysLog("!!! deviceId unknown; stopping self and retrying");
- stopSelf();
- // Try to restart ourselves in a few seconds
- Utility.runAsync(new Runnable() {
- @Override
- public void run() {
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- }
- startService(new Intent(getServiceIntentAction()));
- }});
- return;
- }
- }
- // Run the reconciler and clean up mismatched accounts - if we weren't
- // running when accounts were deleted, it won't have been called.
- runAccountReconcilerSync(SyncServiceManager.this);
- // Update other services depending on final account configuration
- maybeStartSyncServiceManagerThread();
- if (sServiceThread == null) {
- log("!!! EAS SyncServiceManager, stopping self");
- stopSelf();
- } else if (sStop) {
- // If we were trying to stop, attempt a restart in 5 secs
- setAlarm(SYNC_SERVICE_MAILBOX_ID, 5*SECONDS);
- }
- }
- } finally {
- sStartingUp = false;
- }
- }});
- }
- return Service.START_STICKY;
- }
-
- public static void reconcileAccounts(Context context) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm != null) {
- ssm.runAccountReconcilerSync(context);
- }
- }
-
- protected abstract void runAccountReconcilerSync(Context context);
-
- @SuppressWarnings("deprecation")
- @Override
- public void onDestroy() {
- log("!!! EAS SyncServiceManager, onDestroy");
- // Handle shutting down off the UI thread
- Utility.runAsync(new Runnable() {
- @Override
- public void run() {
- // Quick checks first, before getting the lock
- if (INSTANCE == null || sServiceThread == null) return;
- synchronized(sSyncLock) {
- // Stop the sync manager thread and return
- if (sServiceThread != null) {
- sStop = true;
- sServiceThread.interrupt();
- }
- }
- }});
- }
-
- void maybeStartSyncServiceManagerThread() {
- // Start our thread...
- // See if there are any EAS accounts; otherwise, just go away
- if (sServiceThread == null || !sServiceThread.isAlive()) {
- AccountList currentAccounts = new AccountList();
- try {
- collectAccounts(this, currentAccounts);
- } catch (ProviderUnavailableException e) {
- // Just leave if EmailProvider is unavailable
- return;
- }
- if (!currentAccounts.isEmpty()) {
- log(sServiceThread == null ? "Starting thread..." : "Restarting thread...");
- sServiceThread = new Thread(this, TAG);
- INSTANCE = this;
- sServiceThread.start();
- }
- }
- }
-
- /**
- * Start up the SyncServiceManager service if it's not already running
- * This is a stopgap for cases in which SyncServiceManager died (due to a crash somewhere in
- * com.android.email) and hasn't been restarted. See the comment for onCreate for details
- */
- static void checkSyncServiceManagerServiceRunning() {
- SyncServiceManager ssm = INSTANCE;
- if (ssm == null) return;
- if (sServiceThread == null) {
- log("!!! checkSyncServiceManagerServiceRunning; starting service...");
- ssm.startService(new Intent(ssm, SyncServiceManager.class));
- }
- }
-
- @SuppressWarnings("deprecation")
- @Override
- public void run() {
- sStop = false;
- alwaysLog("SyncServiceManager thread running");
-
- TempDirectory.setTempDirectory(this);
-
- // Synchronize here to prevent a shutdown from happening while we initialize our observers
- // and receivers
- synchronized (sSyncLock) {
- if (INSTANCE != null) {
- mResolver = getContentResolver();
-
- // Set up our observers; we need them to know when to start/stop various syncs based
- // on the insert/delete/update of mailboxes and accounts
- // We also observe synced messages to trigger upsyncs at the appropriate time
- mAccountObserver = getAccountObserver(mHandler);
- mResolver.registerContentObserver(Account.NOTIFIER_URI, true, mAccountObserver);
- mMailboxObserver = new MailboxObserver(mHandler);
- mResolver.registerContentObserver(Mailbox.CONTENT_URI, false, mMailboxObserver);
- mSyncedMessageObserver = new SyncedMessageObserver(mHandler);
- mResolver.registerContentObserver(Message.SYNCED_CONTENT_URI, true,
- mSyncedMessageObserver);
-
- // Set up receivers for connectivity and background data setting
- mConnectivityReceiver = new ConnectivityReceiver();
- registerReceiver(mConnectivityReceiver, new IntentFilter(
- ConnectivityManager.CONNECTIVITY_ACTION));
-
- mBackgroundDataSettingReceiver = new ConnectivityReceiver();
- registerReceiver(mBackgroundDataSettingReceiver, new IntentFilter(
- ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED));
- // Save away the current background data setting; we'll keep track of it with the
- // receiver we just registered
- ConnectivityManager cm = (ConnectivityManager)getSystemService(
- Context.CONNECTIVITY_SERVICE);
- mBackgroundData = cm.getBackgroundDataSetting();
-
- onStartup();
- }
- }
-
- try {
- // Loop indefinitely until we're shut down
- while (!sStop) {
- runAwake(EXTRA_MAILBOX_ID);
- waitForConnectivity();
- mNextWaitReason = null;
- long nextWait = checkMailboxes();
- try {
- synchronized (this) {
- if (!mKicked) {
- if (nextWait < 0) {
- log("Negative wait? Setting to 1s");
- nextWait = 1*SECONDS;
- }
- if (nextWait > 10*SECONDS) {
- if (mNextWaitReason != null) {
- log("Next awake " + nextWait / 1000 + "s: " + mNextWaitReason);
- }
- runAsleep(EXTRA_MAILBOX_ID, nextWait + (3*SECONDS));
- }
- wait(nextWait);
- }
- }
- } catch (InterruptedException e) {
- // Needs to be caught, but causes no problem
- log("SyncServiceManager interrupted");
- } finally {
- synchronized (this) {
- if (mKicked) {
- //log("Wait deferred due to kick");
- mKicked = false;
- }
- }
- }
- }
- log("Shutdown requested");
- } catch (ProviderUnavailableException pue) {
- // Shutdown cleanly in this case
- // NOTE: Sync adapters will also crash with this error, but that is already handled
- // in the adapters themselves, i.e. they return cleanly via done(). When the Email
- // process starts running again, remote processes will be started again in due course
- Log.e(TAG, "EmailProvider unavailable; shutting down");
- // Ask for our service to be restarted; this should kick-start the Email process as well
- startService(new Intent(this, SyncServiceManager.class));
- } catch (RuntimeException e) {
- // Crash; this is a completely unexpected runtime error
- Log.e(TAG, "RuntimeException in SyncServiceManager", e);
- throw e;
- } finally {
- shutdown();
- }
- }
-
- private void shutdown() {
- synchronized (sSyncLock) {
- // If INSTANCE is null, we've already been shut down
- if (INSTANCE != null) {
- log("SyncServiceManager shutting down...");
-
- // Stop our running syncs
- stopServiceThreads();
-
- // Stop receivers
- if (mConnectivityReceiver != null) {
- unregisterReceiver(mConnectivityReceiver);
- }
- if (mBackgroundDataSettingReceiver != null) {
- unregisterReceiver(mBackgroundDataSettingReceiver);
- }
-
- // Unregister observers
- ContentResolver resolver = getContentResolver();
- if (mSyncedMessageObserver != null) {
- resolver.unregisterContentObserver(mSyncedMessageObserver);
- mSyncedMessageObserver = null;
- }
- if (mAccountObserver != null) {
- resolver.unregisterContentObserver(mAccountObserver);
- mAccountObserver = null;
- }
- if (mMailboxObserver != null) {
- resolver.unregisterContentObserver(mMailboxObserver);
- mMailboxObserver = null;
- }
- unregisterCalendarObservers();
-
- // Clear pending alarms and associated Intents
- clearAlarms();
-
- // Release our wake lock, if we have one
- synchronized (mWakeLocks) {
- if (mWakeLock != null) {
- mWakeLock.release();
- mWakeLock = null;
- }
- }
-
- INSTANCE = null;
- sServiceThread = null;
- sStop = false;
- log("Goodbye");
- }
- }
- }
-
- /**
- * Release a mailbox from the service map and release its wake lock.
- * NOTE: This method MUST be called while holding sSyncLock!
- *
- * @param mailboxId the id of the mailbox to be released
- */
- public void releaseMailbox(long mailboxId) {
- mServiceMap.remove(mailboxId);
- releaseWakeLock(mailboxId);
- }
-
- /**
- * Check whether an Outbox (referenced by a Cursor) has any messages that can be sent
- * @param c the cursor to an Outbox
- * @return true if there is mail to be sent
- */
- private boolean hasSendableMessages(Cursor outboxCursor) {
- Cursor c = mResolver.query(Message.CONTENT_URI, Message.ID_COLUMN_PROJECTION,
- MAILBOX_KEY_AND_NOT_SEND_FAILED,
- new String[] {Long.toString(outboxCursor.getLong(Mailbox.CONTENT_ID_COLUMN))},
- null);
- try {
- while (c.moveToNext()) {
- if (!Utility.hasUnloadedAttachments(this, c.getLong(Message.CONTENT_ID_COLUMN))) {
- return true;
- }
- }
- } finally {
- if (c != null) {
- c.close();
- }
- }
- return false;
- }
-
- /**
- * Taken from ConnectivityManager using public constants
- */
- public static boolean isNetworkTypeMobile(int networkType) {
- switch (networkType) {
- case ConnectivityManager.TYPE_MOBILE:
- case ConnectivityManager.TYPE_MOBILE_MMS:
- case ConnectivityManager.TYPE_MOBILE_SUPL:
- case ConnectivityManager.TYPE_MOBILE_DUN:
- case ConnectivityManager.TYPE_MOBILE_HIPRI:
- return true;
- default:
- return false;
- }
- }
-
- /**
- * Determine whether the account is allowed to sync automatically, as opposed to manually, based
- * on whether the "require manual sync when roaming" policy is in force and applicable
- * @param account the account
- * @return whether or not the account can sync automatically
- */
- /*package*/ public static boolean canAutoSync(Account account) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm == null) {
- return false;
- }
- NetworkInfo networkInfo = ssm.mNetworkInfo;
-
- // Enforce manual sync only while roaming here
- long policyKey = account.mPolicyKey;
- // Quick exit from this check
- if ((policyKey != 0) && (networkInfo != null) &&
- isNetworkTypeMobile(networkInfo.getType())) {
- // We'll cache the Policy data here
- Policy policy = account.mPolicy;
- if (policy == null) {
- policy = Policy.restorePolicyWithId(INSTANCE, policyKey);
- account.mPolicy = policy;
- if (!PolicyServiceProxy.isActive(ssm, policy)) return false;
- }
- if (policy != null && policy.mRequireManualSyncWhenRoaming && networkInfo.isRoaming()) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Convenience method to determine whether Email sync is enabled for a given account
- * @param account the Account in question
- * @return whether Email sync is enabled
- */
- private boolean canSyncEmail(android.accounts.Account account) {
- return ContentResolver.getSyncAutomatically(account, EmailContent.AUTHORITY);
- }
-
- /**
- * Determine whether a mailbox of a given type in a given account can be synced automatically
- * by SyncServiceManager. This is an increasingly complex determination, taking into account
- * security policies and user settings (both within the Email application and in the Settings
- * application)
- *
- * @param account the Account that the mailbox is in
- * @param type the type of the Mailbox
- * @return whether or not to start a sync
- */
- private boolean isMailboxSyncable(Account account, int type) {
- // This 'if' statement performs checks to see whether or not a mailbox is a
- // candidate for syncing based on policies, user settings, & other restrictions
- if (type == Mailbox.TYPE_OUTBOX) {
- // Outbox is always syncable
- return true;
- } else if (type == Mailbox.TYPE_EAS_ACCOUNT_MAILBOX) {
- // Always sync EAS mailbox unless master sync is off
- return ContentResolver.getMasterSyncAutomatically();
- } else if (type == Mailbox.TYPE_CONTACTS || type == Mailbox.TYPE_CALENDAR) {
- // Contacts/Calendar obey this setting from ContentResolver
- if (!ContentResolver.getMasterSyncAutomatically()) {
- return false;
- }
- // Get the right authority for the mailbox
- String authority;
- if (type == Mailbox.TYPE_CONTACTS) {
- authority = ContactsContract.AUTHORITY;
- } else {
- authority = CalendarContract.AUTHORITY;
- if (!mCalendarObservers.containsKey(account.mId)){
- // Make sure we have an observer for this Calendar, as
- // we need to be able to detect sync state changes, sigh
- registerCalendarObserver(account);
- }
- }
- // See if "sync automatically" is set; if not, punt
- if (!ContentResolver.getSyncAutomatically(account.mAmAccount, authority)) {
- return false;
- // See if the calendar is enabled from the Calendar app UI; if not, punt
- } else if ((type == Mailbox.TYPE_CALENDAR) && !isCalendarEnabled(account.mId)) {
- return false;
- }
- // Never automatically sync trash
- } else if (type == Mailbox.TYPE_TRASH) {
- return false;
- // For non-outbox, non-account mail, we do three checks:
- // 1) are we restricted by policy (i.e. manual sync only),
- // 2) has the user checked the "Sync Email" box in Account Settings, and
- // 3) does the user have the master "background data" box checked in Settings
- } else if (!canAutoSync(account) || !canSyncEmail(account.mAmAccount) || !mBackgroundData) {
- return false;
- }
- return true;
- }
-
- private long checkMailboxes () {
- // First, see if any running mailboxes have been deleted
- ArrayList<Long> deletedMailboxes = new ArrayList<Long>();
- synchronized (sSyncLock) {
- for (long mailboxId: mServiceMap.keySet()) {
- Mailbox m = Mailbox.restoreMailboxWithId(this, mailboxId);
- if (m == null) {
- deletedMailboxes.add(mailboxId);
- }
- }
- // If so, stop them or remove them from the map
- for (Long mailboxId: deletedMailboxes) {
- AbstractSyncService svc = mServiceMap.get(mailboxId);
- if (svc == null || svc.mThread == null) {
- releaseMailbox(mailboxId);
- continue;
- } else {
- boolean alive = svc.mThread.isAlive();
- log("Deleted mailbox: " + svc.mMailboxName);
- if (alive) {
- stopManualSync(mailboxId);
- } else {
- log("Removing from serviceMap");
- releaseMailbox(mailboxId);
- }
- }
- }
- }
-
- long nextWait = SYNC_SERVICE_HEARTBEAT_TIME;
- long now = System.currentTimeMillis();
-
- // Start up threads that need it; use a query which finds eas mailboxes where the
- // the sync interval is not "never". This is the set of mailboxes that we control
- if (mAccountObserver == null) {
- log("mAccountObserver null; service died??");
- return nextWait;
- }
-
- Cursor c = getContentResolver().query(Mailbox.CONTENT_URI, Mailbox.CONTENT_PROJECTION,
- mAccountObserver.getSyncableMailboxWhere(), null, null);
- if (c == null) throw new ProviderUnavailableException();
- try {
- while (c.moveToNext()) {
- long mailboxId = c.getLong(Mailbox.CONTENT_ID_COLUMN);
- AbstractSyncService service = null;
- synchronized (sSyncLock) {
- service = mServiceMap.get(mailboxId);
- }
- if (service == null) {
- // Get the cached account
- Account account = getAccountById(c.getInt(Mailbox.CONTENT_ACCOUNT_KEY_COLUMN));
- if (account == null) continue;
-
- // We handle a few types of mailboxes specially
- int mailboxType = c.getInt(Mailbox.CONTENT_TYPE_COLUMN);
- if (!isMailboxSyncable(account, mailboxType)) {
- continue;
- }
-
- // Check whether we're in a hold (temporary or permanent)
- SyncError syncError = mSyncErrorMap.get(mailboxId);
- if (syncError != null) {
- // Nothing we can do about fatal errors
- if (syncError.fatal) continue;
- if (now < syncError.holdEndTime) {
- // If release time is earlier than next wait time,
- // move next wait time up to the release time
- if (syncError.holdEndTime < now + nextWait) {
- nextWait = syncError.holdEndTime - now;
- mNextWaitReason = "Release hold";
- }
- continue;
- } else {
- // Keep the error around, but clear the end time
- syncError.holdEndTime = 0;
- }
- }
-
- // Otherwise, we use the sync interval
- long syncInterval = c.getInt(Mailbox.CONTENT_SYNC_INTERVAL_COLUMN);
- if (syncInterval == Mailbox.CHECK_INTERVAL_PUSH) {
- Mailbox m = EmailContent.getContent(c, Mailbox.class);
- requestSync(m, SYNC_PUSH, null);
- } else if (mailboxType == Mailbox.TYPE_OUTBOX) {
- if (hasSendableMessages(c)) {
- Mailbox m = EmailContent.getContent(c, Mailbox.class);
- startServiceThread(getServiceForMailbox(this, m));
- }
- } else if (syncInterval > 0 && syncInterval <= ONE_DAY_MINUTES) {
- long lastSync = c.getLong(Mailbox.CONTENT_SYNC_TIME_COLUMN);
- long sinceLastSync = now - lastSync;
- long toNextSync = syncInterval*MINUTES - sinceLastSync;
- String name = c.getString(Mailbox.CONTENT_DISPLAY_NAME_COLUMN);
- if (toNextSync <= 0) {
- Mailbox m = EmailContent.getContent(c, Mailbox.class);
- requestSync(m, SYNC_SCHEDULED, null);
- } else if (toNextSync < nextWait) {
- nextWait = toNextSync;
- if (sUserLog) {
- log("Next sync for " + name + " in " + nextWait/1000 + "s");
- }
- mNextWaitReason = "Scheduled sync, " + name;
- } else if (sUserLog) {
- log("Next sync for " + name + " in " + toNextSync/1000 + "s");
- }
- }
- } else {
- Thread thread = service.mThread;
- // Look for threads that have died and remove them from the map
- if (thread != null && !thread.isAlive()) {
- if (sUserLog) {
- log("Dead thread, mailbox released: " +
- c.getString(Mailbox.CONTENT_DISPLAY_NAME_COLUMN));
- }
- releaseMailbox(mailboxId);
- // Restart this if necessary
- if (nextWait > 3*SECONDS) {
- nextWait = 3*SECONDS;
- mNextWaitReason = "Clean up dead thread(s)";
- }
- } else {
- long requestTime = service.mRequestTime;
- if (requestTime > 0) {
- long timeToRequest = requestTime - now;
- if (timeToRequest <= 0) {
- service.mRequestTime = 0;
- service.alarm();
- } else if (requestTime > 0 && timeToRequest < nextWait) {
- if (timeToRequest < 11*MINUTES) {
- nextWait = timeToRequest < 250 ? 250 : timeToRequest;
- mNextWaitReason = "Sync data change";
- } else {
- log("Illegal timeToRequest: " + timeToRequest);
- }
- }
- }
- }
- }
- }
- } finally {
- c.close();
- }
- return nextWait;
- }
-
- static public void serviceRequest(long mailboxId, int reason) {
- serviceRequest(mailboxId, 5*SECONDS, reason);
- }
-
- /**
- * Return a boolean indicating whether the mailbox can be synced
- * @param m the mailbox
- * @return whether or not the mailbox can be synced
- */
- public static boolean isSyncable(Mailbox m) {
- return m.mType != Mailbox.TYPE_DRAFTS
- && m.mType != Mailbox.TYPE_OUTBOX
- && m.mType != Mailbox.TYPE_SEARCH
- && m.mType < Mailbox.TYPE_NOT_SYNCABLE;
- }
-
- static public void serviceRequest(long mailboxId, long ms, int reason) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm == null) return;
- Mailbox m = Mailbox.restoreMailboxWithId(ssm, mailboxId);
- if (m == null || !isSyncable(m)) return;
- try {
- AbstractSyncService service = ssm.mServiceMap.get(mailboxId);
- if (service != null) {
- service.mRequestTime = System.currentTimeMillis() + ms;
- kick("service request");
- } else {
- startManualSync(mailboxId, reason, null);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- static public void serviceRequestImmediate(long mailboxId) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm == null) return;
- AbstractSyncService service = ssm.mServiceMap.get(mailboxId);
- if (service != null) {
- service.mRequestTime = System.currentTimeMillis();
- Mailbox m = Mailbox.restoreMailboxWithId(ssm, mailboxId);
- if (m != null) {
- service.mAccount = Account.restoreAccountWithId(ssm, m.mAccountKey);
- service.mMailbox = m;
- kick("service request immediate");
- }
- }
- }
-
- static public void sendMessageRequest(Request req) {
- SyncServiceManager ssm = INSTANCE;
- Message msg = Message.restoreMessageWithId(ssm, req.mMessageId);
- if (msg == null) return;
- long mailboxId = msg.mMailboxKey;
- Mailbox mailbox = Mailbox.restoreMailboxWithId(ssm, mailboxId);
- if (mailbox == null) return;
-
- // If we're loading an attachment for Outbox, we want to look at the source message
- // to find the loading mailbox
- if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
- long sourceId = Utility.getFirstRowLong(ssm, Body.CONTENT_URI,
- new String[] {BodyColumns.SOURCE_MESSAGE_KEY},
- BodyColumns.MESSAGE_KEY + "=?",
- new String[] {Long.toString(msg.mId)}, null, 0, -1L);
- if (sourceId != -1L) {
- EmailContent.Message sourceMsg =
- EmailContent.Message.restoreMessageWithId(ssm, sourceId);
- if (sourceMsg != null) {
- mailboxId = sourceMsg.mMailboxKey;
- }
- }
- }
-
- AbstractSyncService service = ssm.mServiceMap.get(mailboxId);
- if (service == null) {
- startManualSync(mailboxId, SYNC_SERVICE_PART_REQUEST, req);
- kick("part request");
- } else {
- service.addRequest(req);
- }
- }
-
- /**
- * Determine whether a given Mailbox can be synced, i.e. is not already syncing and is not in
- * an error state
- *
- * @param mailboxId
- * @return whether or not the Mailbox is available for syncing (i.e. is a valid push target)
- */
- static public int pingStatus(long mailboxId) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm == null) return PING_STATUS_OK;
- // Already syncing...
- if (ssm.mServiceMap.get(mailboxId) != null) {
- return PING_STATUS_RUNNING;
- }
- // No errors or a transient error, don't ping...
- SyncError error = ssm.mSyncErrorMap.get(mailboxId);
- if (error != null) {
- if (error.fatal) {
- return PING_STATUS_UNABLE;
- } else if (error.holdEndTime > 0) {
- return PING_STATUS_WAITING;
- }
- }
- return PING_STATUS_OK;
- }
-
- static public void startManualSync(long mailboxId, int reason, Request req) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm == null) return;
- synchronized (sSyncLock) {
- AbstractSyncService svc = ssm.mServiceMap.get(mailboxId);
- if (svc == null) {
- ssm.mSyncErrorMap.remove(mailboxId);
- Mailbox m = Mailbox.restoreMailboxWithId(ssm, mailboxId);
- if (m != null) {
- log("Starting sync for " + m.mDisplayName);
- ssm.requestSync(m, reason, req);
- }
- } else {
- // If this is a ui request, set the sync reason for the service
- if (reason >= SYNC_CALLBACK_START) {
- svc.mSyncReason = reason;
- }
- }
- }
- }
-
- // DO NOT CALL THIS IN A LOOP ON THE SERVICEMAP
- static public void stopManualSync(long mailboxId) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm == null) return;
- synchronized (sSyncLock) {
- AbstractSyncService svc = ssm.mServiceMap.get(mailboxId);
- if (svc != null) {
- log("Stopping sync for " + svc.mMailboxName);
- svc.stop();
- svc.mThread.interrupt();
- ssm.releaseWakeLock(mailboxId);
- }
- }
- }
-
- /**
- * Wake up SyncServiceManager to check for mailboxes needing service
- */
- static public void kick(String reason) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm != null) {
- synchronized (ssm) {
- //INSTANCE.log("Kick: " + reason);
- ssm.mKicked = true;
- ssm.notify();
- }
- }
- if (sConnectivityLock != null) {
- synchronized (sConnectivityLock) {
- sConnectivityLock.notify();
- }
- }
- }
-
- /**
- * Tell SyncServiceManager to remove the mailbox from the map of mailboxes with sync errors
- * @param mailboxId the id of the mailbox
- */
- static public void removeFromSyncErrorMap(long mailboxId) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm != null) {
- ssm.mSyncErrorMap.remove(mailboxId);
- }
- }
-
- private boolean isRunningInServiceThread(long mailboxId) {
- AbstractSyncService syncService = mServiceMap.get(mailboxId);
- Thread thisThread = Thread.currentThread();
- return syncService != null && syncService.mThread != null &&
- thisThread == syncService.mThread;
- }
-
- /**
- * Sent by services indicating that their thread is finished; action depends on the exitStatus
- * of the service.
- *
- * @param svc the service that is finished
- */
- static public void done(AbstractSyncService svc) {
- SyncServiceManager ssm = INSTANCE;
- if (ssm == null) return;
- synchronized(sSyncLock) {
- long mailboxId = svc.mMailboxId;
- // If we're no longer the syncing thread for the mailbox, just return
- if (!ssm.isRunningInServiceThread(mailboxId)) {
- return;
- }
- ssm.releaseMailbox(mailboxId);
- ssm.setMailboxSyncStatus(mailboxId, EmailContent.SYNC_STATUS_NONE);
-
- ConcurrentHashMap<Long, SyncError> errorMap = ssm.mSyncErrorMap;
- SyncError syncError = errorMap.get(mailboxId);
-
- int exitStatus = svc.mExitStatus;
- Mailbox m = Mailbox.restoreMailboxWithId(ssm, mailboxId);
- if (m == null) return;
-
- if (exitStatus != AbstractSyncService.EXIT_LOGIN_FAILURE) {
- long accountId = m.mAccountKey;
- Account account = Account.restoreAccountWithId(ssm, accountId);
- if (account == null) return;
- if (ssm.releaseSyncHolds(ssm,
- AbstractSyncService.EXIT_LOGIN_FAILURE, account)) {
- new AccountServiceProxy(ssm).notifyLoginSucceeded(accountId);
- }
- }
-
- int lastResult = EmailContent.LAST_SYNC_RESULT_SUCCESS;
- // For error states, whether the error is fatal (won't automatically be retried)
- boolean errorIsFatal = true;
- try {
- switch (exitStatus) {
- case AbstractSyncService.EXIT_DONE:
- if (svc.hasPendingRequests()) {
- // TODO Handle this case
- }
- errorMap.remove(mailboxId);
- // If we've had a successful sync, clear the shutdown count
- synchronized (SyncServiceManager.class) {
- sClientConnectionManagerShutdownCount = 0;
- }
- // Leave now; other statuses are errors
- return;
- // I/O errors get retried at increasing intervals
- case AbstractSyncService.EXIT_IO_ERROR:
- if (syncError != null) {
- syncError.escalate();
- log(m.mDisplayName + " held for " + syncError.holdDelay + "ms");
- } else {
- log(m.mDisplayName + " added to syncErrorMap, hold for 15s");
- }
- lastResult = EmailContent.LAST_SYNC_RESULT_CONNECTION_ERROR;
- errorIsFatal = false;
- break;
- // These errors are not retried automatically
- case AbstractSyncService.EXIT_LOGIN_FAILURE:
- new AccountServiceProxy(ssm).notifyLoginFailed(m.mAccountKey);
- lastResult = EmailContent.LAST_SYNC_RESULT_AUTH_ERROR;
- break;
- case AbstractSyncService.EXIT_SECURITY_FAILURE:
- case AbstractSyncService.EXIT_ACCESS_DENIED:
- lastResult = EmailContent.LAST_SYNC_RESULT_SECURITY_ERROR;
- break;
- case AbstractSyncService.EXIT_EXCEPTION:
- lastResult = EmailContent.LAST_SYNC_RESULT_INTERNAL_ERROR;
- break;
- }
- // Add this box to the error map
- errorMap.put(mailboxId, ssm.new SyncError(exitStatus, errorIsFatal));
- } finally {
- // Always set the last result
- ssm.setMailboxLastSyncResult(mailboxId, lastResult);
- kick("sync completed");
- }
- }
- }
-
- /**
- * Given the status string from a Mailbox, return the type code for the last sync
- * @param status the syncStatus column of a Mailbox
- * @return
- */
- static public int getStatusType(String status) {
- if (status == null) {
- return -1;
- } else {
- return status.charAt(STATUS_TYPE_CHAR) - '0';
- }
- }
-
- /**
- * Given the status string from a Mailbox, return the change count for the last sync
- * The change count is the number of adds + deletes + changes in the last sync
- * @param status the syncStatus column of a Mailbox
- * @return
- */
- static public int getStatusChangeCount(String status) {
- try {
- String s = status.substring(STATUS_CHANGE_COUNT_OFFSET);
- return Integer.parseInt(s);
- } catch (RuntimeException e) {
- return -1;
- }
- }
-
- static public Context getContext() {
- return INSTANCE;
- }
-}
diff --git a/email2/proguard.flags b/email2/proguard.flags
deleted file mode 100644
index 4ead936ec..000000000
--- a/email2/proguard.flags
+++ /dev/null
@@ -1,217 +0,0 @@
-#Email-specific proguard flags that are not covered by UnifiedEmail go here
-
--keep class com.android.emailcommon.provider.Account
-
--keepclasseswithmembers class * {
- public static void actionEditIncomingSettings(android.app.Activity, int, com.android.emailcommon.provider.Account);
-}
-
--keepclasseswithmembers class * {
- public static void actionEditOutgoingSettings(android.app.Activity, int, com.android.emailcommon.provider.Account);
-}
-
--keepclasseswithmembers class * {
- public *** newInstance(com.android.emailcommon.provider.Account, android.content.Context);
-}
-
--keepclasseswithmembers class * {
- public *** newInstance(com.android.emailcommon.provider.Account, android.content.Context);
-}
-
--keepclasseswithmembers class android.content.SharedPreferences$Editor {
- *** apply();
-}
-
--keepclasseswithmembers class com.android.emailcommon.utility.Utility$CloseTraceCursorWrapper {
- *** getTraceIfAvailable(android.database.Cursor);
- *** log(android.database.Cursor);
-}
-
--keep class * extends org.apache.james.mime4j.util.TempStorage
-
-# Keep names that are used only by unit tests or by animators
--keep class ** {
- *** *ForTest(...);
- *** *Anim(...);
-}
-
--keepclasseswithmembers class com.android.email.activity.RecentMailboxManager {
- *** touch(long);
- *** getInstance(android.content.Context);
- *** getMostRecent(long, boolean);
-}
-
--keepclasseswithmembers class com.android.email.activity.setup.AccountSetupAccountType {
- *** checkAccountInstanceLimit(com.android.email.mail.Store$StoreInfo);
-}
-
--keepclasseswithmembers class com.android.email.GroupMessagingListener {
- *** removeListener(com.android.email.MessagingListener);
-}
-
--keepclasseswithmembers class com.android.email.Controller {
- *** setProviderContext(android.content.Context);
-}
-
--keepclasseswithmembers class com.android.emailcommon.internet.Rfc822Output {
- *** getHtmlBody(java.lang.String);
- *** buildBodyText(android.content.Context, com.android.emailcommon.provider.EmailContent$Message, boolean);
-}
-
--keepclasseswithmembers class com.android.emailcommon.mail.Address {
- <init>(java.lang.String);
- <init>(java.lang.String,java.lang.String);
- *** parseAndPack(java.lang.String);
-}
-
--keepclasseswithmembers class com.android.email.SecurityPolicy {
- *** setContext(android.content.Context);
-}
-
--keepclasseswithmembers class com.android.email.MessagingController {
- *** injectMockController(com.android.email.MessagingController);
-}
-
--keepclasseswithmembers class com.android.emailcommon.utility.Utility {
- *** dumpCursor(android.database.Cursor);
- *** fromUtf8(byte[]);
- *** isFirstUtf8Byte(byte);
- *** replaceBareLfWithCrlf(java.lang.String);
-}
--keepclasseswithmembers class com.android.emailcommon.utility.Utility$CloseTraceCursorWrapper {
- *** getTraceIfAvailable(android.database.Cursor);
- *** log(android.database.Cursor);
-}
-
--keepclasseswithmembers class com.android.email.provider.EmailProvider {
- *** getReadableDatabase(android.content.Context);
-}
-
--keepclasseswithmembers class com.android.emailcommon.provider.EmailContent$Attachment {
- *** createUniqueFile(java.lang.String);
-}
-
--keepclasseswithmembers class com.android.email.service.AttachmentDownloadService {
- *** addServiceClass(long, java.lang.Class);
-}
-
--keepclasseswithmembers class com.android.email.service.AttachmentDownloadService$AccountManagerStub {
- *** setNumberOfAccounts(int);
-}
-
--keepclasseswithmembers class com.android.email.Preferences {
- *** getAccountByContentUri(android.net.Uri);
-}
-
--keep class com.android.emailcommon.mail.Message$RecipientType
-
--keepclasseswithmembers class com.android.emailcommon.mail.Message {
- *** setRecipient(com.android.emailcommon.mail.Message$RecipientType, com.android.emailcommon.mail.Address);
-}
-
--keepclasseswithmembers class com.android.emailcommon.internet.MimeHeader {
- *** writeToString();
-}
-
--keepclasseswithmembers class com.android.emailcommon.internet.MimeMessage {
- <init>();
- <init>(java.io.InputStream);
- *** getExtendedHeader(java.lang.String);
- *** setExtendedHeader(java.lang.String, java.lang.String);
- *** getExtendedHeaders();
- *** setExtendedHeaders(java.lang.String);
-}
-
--keepclasseswithmembers class com.android.emailcommon.internet.MimeUtility {
- *** foldAndEncode(java.lang.String);
- *** findPartByContentId(com.android.emailcommon.mail.Part, java.lang.String);
- *** findFirstPartByMimeType(com.android.emailcommon.mail.Part, java.lang.String);
-}
-
--keepclasseswithmembers class com.android.email.mail.transport.SmtpSender {
- *** setTransport(com.android.email.mail.Transport);
-}
-
--keepclasseswithmembers class com.android.email.mail.Store {
- *** requireStructurePrefetch();
-}
-
--keepclasseswithmembers class com.android.email.mail.store.ImapStore {
- *** setTransport(com.android.email.mail.Transport);
-}
-
--keepclasseswithmembers class com.android.email.mail.store.ImapFolder {
- *** getMessages(int, int, com.android.emailcommon.mail.Folder$MessageRetrievalListener);
- *** getMessages(com.android.emailcommon.mail.Folder$MessageRetrievalListener);
- *** getMessages(java.lang.String[], com.android.emailcommon.mail.Folder$MessageRetrievalListener);
- *** getUnreadMessageCount();
-}
-
--keepclasseswithmembers class com.android.email.mail.store.Pop3Store {
- *** setTransport(com.android.email.mail.Transport);
-}
-
--keepclasseswithmembers class com.android.email.mail.store.Pop3Store$Pop3Folder {
- *** getMessages(int, int, com.android.emailcommon.mail.Folder$MessageRetrievalListener);
- *** getMessages(com.android.emailcommon.mail.Folder$MessageRetrievalListener);
- *** getMessages(java.lang.String[], com.android.emailcommon.mail.Folder$MessageRetrievalListener);
- *** getUnreadMessageCount();
- *** isOpen();
-}
-
--keep class com.android.emailcommon.mail.Flag
-
--keepclasseswithmembers class com.android.emailcommon.mail.Folder {
- *** getUnreadMessageCount();
- *** delete(boolean);
- *** getRole();
-}
-
--keep class com.android.emailcommon.mail.Folder$FolderRole
-
--keepclasseswithmembers class com.android.emailcommon.mail.PackedString$Builder {
- <init>();
- <init>(java.lang.String);
- *** get(java.lang.String);
- *** put(java.lang.String, java.lang.String);
-}
-
--keepclasseswithmembers class com.android.email.provider.ContentCache$CounterMap {
- *** getCount(...);
- *** size();
-}
-
--keepclasseswithmembers class com.android.emailcommon.provider.Account {
- *** getShortcutSafeUri();
- *** refresh(android.content.Context);
-}
-
--keepclasseswithmembers class com.android.emailcommon.provider.Policy {
- *** setAttachmentFlagsForNewPolicy(android.content.Context,
- com.android.emailcommon.provider.Account,
- com.android.emailcommon.provider.Policy);
- *** clearAccountPolicy(android.content.Context,
- com.android.emailcommon.provider.Account);
-}
-
--keep class org.apache.james.mime4j.field.Field {
- *** getBody();
-}
-
--keepclasseswithmembers class com.android.email.FolderProperties {
- *** getDisplayName(int);
-}
-
-# The following classes are used only by unit tests.
-# We should move them into tests/ if possible.
-
--keep class org.apache.james.mime4j.message.Message {
- *;
-}
-
--keepclasseswithmembers class org.apache.commons.io.IOUtils {
- *** toByteArray(java.io.InputStream);
- *** toByteArray(java.io.Reader);
- *** toByteArray(java.io.Reader, java.lang.String);
- *** toByteArray(java.lang.String);
-}
diff --git a/email2/res/color/buttontext.xml b/email2/res/color/buttontext.xml
deleted file mode 100644
index 25aca0d14..000000000
--- a/email2/res/color/buttontext.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="false" android:color="@color/button_text_disabled_color" />
- <item android:color="@color/button_text_color" />
-</selector>
diff --git a/email2/res/drawable-hdpi/ic_exchange_minitab_selected.png b/email2/res/drawable-hdpi/ic_exchange_minitab_selected.png
deleted file mode 100644
index 9337eac63..000000000
--- a/email2/res/drawable-hdpi/ic_exchange_minitab_selected.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-hdpi/ic_exchange_selected.png b/email2/res/drawable-hdpi/ic_exchange_selected.png
deleted file mode 100644
index ef19e497f..000000000
--- a/email2/res/drawable-hdpi/ic_exchange_selected.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-hdpi/ic_folder_drafts_holo_light.png b/email2/res/drawable-hdpi/ic_folder_drafts_holo_light.png
deleted file mode 100644
index bf2e74767..000000000
--- a/email2/res/drawable-hdpi/ic_folder_drafts_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-hdpi/ic_folder_inbox_holo_light.png b/email2/res/drawable-hdpi/ic_folder_inbox_holo_light.png
deleted file mode 100644
index df0ac0d5d..000000000
--- a/email2/res/drawable-hdpi/ic_folder_inbox_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-hdpi/ic_folder_outbox_holo_light.png b/email2/res/drawable-hdpi/ic_folder_outbox_holo_light.png
deleted file mode 100644
index c8ba6a2a5..000000000
--- a/email2/res/drawable-hdpi/ic_folder_outbox_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-hdpi/ic_folder_sent_holo_light.png b/email2/res/drawable-hdpi/ic_folder_sent_holo_light.png
deleted file mode 100644
index 72d563908..000000000
--- a/email2/res/drawable-hdpi/ic_folder_sent_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-hdpi/ic_notification_multiple_mail_holo_dark.png b/email2/res/drawable-hdpi/ic_notification_multiple_mail_holo_dark.png
deleted file mode 100644
index a733c2add..000000000
--- a/email2/res/drawable-hdpi/ic_notification_multiple_mail_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-hdpi/stat_notify_email_generic.png b/email2/res/drawable-hdpi/stat_notify_email_generic.png
deleted file mode 100644
index d40e2fe1e..000000000
--- a/email2/res/drawable-hdpi/stat_notify_email_generic.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-mdpi/ic_exchange_minitab_selected.png b/email2/res/drawable-mdpi/ic_exchange_minitab_selected.png
deleted file mode 100644
index ef7e11657..000000000
--- a/email2/res/drawable-mdpi/ic_exchange_minitab_selected.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-mdpi/ic_exchange_selected.png b/email2/res/drawable-mdpi/ic_exchange_selected.png
deleted file mode 100644
index 116340678..000000000
--- a/email2/res/drawable-mdpi/ic_exchange_selected.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-mdpi/ic_folder_drafts_holo_light.png b/email2/res/drawable-mdpi/ic_folder_drafts_holo_light.png
deleted file mode 100644
index 6db6c812c..000000000
--- a/email2/res/drawable-mdpi/ic_folder_drafts_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-mdpi/ic_folder_inbox_holo_light.png b/email2/res/drawable-mdpi/ic_folder_inbox_holo_light.png
deleted file mode 100644
index 62f67d29b..000000000
--- a/email2/res/drawable-mdpi/ic_folder_inbox_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-mdpi/ic_folder_outbox_holo_light.png b/email2/res/drawable-mdpi/ic_folder_outbox_holo_light.png
deleted file mode 100644
index a7039e12e..000000000
--- a/email2/res/drawable-mdpi/ic_folder_outbox_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-mdpi/ic_folder_sent_holo_light.png b/email2/res/drawable-mdpi/ic_folder_sent_holo_light.png
deleted file mode 100644
index ca93d583b..000000000
--- a/email2/res/drawable-mdpi/ic_folder_sent_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-mdpi/ic_notification_multiple_mail_holo_dark.png b/email2/res/drawable-mdpi/ic_notification_multiple_mail_holo_dark.png
deleted file mode 100644
index 8071c272d..000000000
--- a/email2/res/drawable-mdpi/ic_notification_multiple_mail_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-mdpi/stat_notify_email_generic.png b/email2/res/drawable-mdpi/stat_notify_email_generic.png
deleted file mode 100644
index e8ede3a2d..000000000
--- a/email2/res/drawable-mdpi/stat_notify_email_generic.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-nodpi/email_widget_preview.png b/email2/res/drawable-nodpi/email_widget_preview.png
deleted file mode 100644
index ba66702dd..000000000
--- a/email2/res/drawable-nodpi/email_widget_preview.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-xhdpi/ic_exchange_minitab_selected.png b/email2/res/drawable-xhdpi/ic_exchange_minitab_selected.png
deleted file mode 100644
index af6e1610f..000000000
--- a/email2/res/drawable-xhdpi/ic_exchange_minitab_selected.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-xhdpi/ic_exchange_selected.png b/email2/res/drawable-xhdpi/ic_exchange_selected.png
deleted file mode 100644
index 1ae1849f7..000000000
--- a/email2/res/drawable-xhdpi/ic_exchange_selected.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-xhdpi/ic_folder_drafts_holo_light.png b/email2/res/drawable-xhdpi/ic_folder_drafts_holo_light.png
deleted file mode 100644
index 52c80368d..000000000
--- a/email2/res/drawable-xhdpi/ic_folder_drafts_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-xhdpi/ic_folder_inbox_holo_light.png b/email2/res/drawable-xhdpi/ic_folder_inbox_holo_light.png
deleted file mode 100644
index 11a61b895..000000000
--- a/email2/res/drawable-xhdpi/ic_folder_inbox_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-xhdpi/ic_folder_outbox_holo_light.png b/email2/res/drawable-xhdpi/ic_folder_outbox_holo_light.png
deleted file mode 100644
index dcd34485d..000000000
--- a/email2/res/drawable-xhdpi/ic_folder_outbox_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-xhdpi/ic_folder_sent_holo_light.png b/email2/res/drawable-xhdpi/ic_folder_sent_holo_light.png
deleted file mode 100644
index 0baa77ce7..000000000
--- a/email2/res/drawable-xhdpi/ic_folder_sent_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-xhdpi/ic_notification_multiple_mail_holo_dark.png b/email2/res/drawable-xhdpi/ic_notification_multiple_mail_holo_dark.png
deleted file mode 100644
index 03bf26cec..000000000
--- a/email2/res/drawable-xhdpi/ic_notification_multiple_mail_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/drawable-xhdpi/stat_notify_email_generic.png b/email2/res/drawable-xhdpi/stat_notify_email_generic.png
deleted file mode 100644
index 0317760ee..000000000
--- a/email2/res/drawable-xhdpi/stat_notify_email_generic.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/layout-sw600dp-land/account_setup_basics.xml b/email2/res/layout-sw600dp-land/account_setup_basics.xml
deleted file mode 100644
index de4007a80..000000000
--- a/email2/res/layout-sw600dp-land/account_setup_basics.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Account setup - XL - landscape - see layout/ for small-screen version -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="@dimen/setup_padding_top"
- android:paddingLeft="@dimen/setup_padding_left"
- android:paddingRight="@dimen/setup_padding_right"
- >
-
- <!-- Headline and hairline divider -->
- <TextView
- android:id="@+id/headline"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_basics_headline"
- android:textAppearance="@style/accountSetupHeadline" />
- <View
- android:id="@+id/top_divider"
- android:layout_below="@+id/headline"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
-
- <!-- Buttons on the right -->
- <Button
- android:id="@+id/manual_setup"
- android:layout_below="@+id/top_divider"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/setup_buttons_padding_top"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/account_setup_basics_manual_setup_action" />
- <Button
- android:id="@+id/next"
- android:layout_below="@+id/manual_setup"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/setup_buttons_vertical_spacing"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/next_action" />
-
- <!-- Frame on the left containing the (common) setup info -->
- <FrameLayout
- android:layout_below="@+id/top_divider"
- android:layout_alignParentLeft="true"
- android:layout_toLeftOf="@+id/manual_setup"
- android:layout_marginRight="64dip"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <include
- layout="@layout/account_setup_basics_common"
- />
- </FrameLayout>
- </RelativeLayout>
-</ScrollView>
diff --git a/email2/res/layout-sw600dp-land/account_setup_incoming.xml b/email2/res/layout-sw600dp-land/account_setup_incoming.xml
deleted file mode 100644
index 327b6d090..000000000
--- a/email2/res/layout-sw600dp-land/account_setup_incoming.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Incoming setup - XL - landscape - see layout/ for small-screen version -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="@dimen/setup_padding_top"
- android:paddingLeft="@dimen/setup_padding_left"
- android:paddingRight="@dimen/setup_padding_right"
- >
-
- <!-- Headline and hairline divider -->
- <TextView
- android:id="@+id/headline"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_incoming_headline"
- android:textAppearance="@style/accountSetupHeadline" />
- <View
- android:id="@+id/top_divider"
- android:layout_below="@+id/headline"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
-
- <!-- Buttons on the right -->
- <Button
- android:id="@+id/previous"
- android:layout_below="@+id/top_divider"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/setup_buttons_padding_top"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/previous_action" />
- <Button
- android:id="@+id/next"
- android:layout_below="@+id/previous"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/setup_buttons_vertical_spacing"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/next_action" />
-
- <!-- Fragment on the left containing the setup info -->
- <FrameLayout
- android:layout_below="@+id/top_divider"
- android:layout_alignParentLeft="true"
- android:layout_toLeftOf="@+id/next"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="16dip"
- android:paddingRight="64dip"
- >
- <fragment
- android:id="@+id/setup_fragment"
- class="com.android.email.activity.setup.AccountSetupIncomingFragment"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </FrameLayout>
- </RelativeLayout>
-</ScrollView> \ No newline at end of file
diff --git a/email2/res/layout-sw600dp-land/account_setup_names.xml b/email2/res/layout-sw600dp-land/account_setup_names.xml
deleted file mode 100644
index 568576423..000000000
--- a/email2/res/layout-sw600dp-land/account_setup_names.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Account Names - XL - landscape - see layout/ for small-screen version -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="@dimen/setup_padding_top"
- android:paddingLeft="@dimen/setup_padding_left"
- android:paddingRight="@dimen/setup_padding_right"
- >
-
- <!-- Headline and hairline divider -->
- <TextView
- android:id="@+id/headline"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_names_headline"
- android:textAppearance="@style/accountSetupHeadline" />
- <View
- android:id="@+id/top_divider"
- android:layout_below="@+id/headline"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
-
- <!-- Button on the right -->
- <Button
- android:id="@+id/next"
- android:layout_below="@+id/top_divider"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/setup_buttons_vertical_spacing"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/next_action" />
-
- <!-- Frame on the left containing the (common) setup info -->
- <FrameLayout
- android:layout_below="@+id/top_divider"
- android:layout_alignParentLeft="true"
- android:layout_toLeftOf="@+id/next"
- android:layout_marginRight="64dip"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <include
- layout="@layout/account_setup_names_common"
- />
- </FrameLayout>
- </RelativeLayout>
-</ScrollView>
diff --git a/email2/res/layout-sw600dp-land/account_setup_options.xml b/email2/res/layout-sw600dp-land/account_setup_options.xml
deleted file mode 100644
index cf13c581b..000000000
--- a/email2/res/layout-sw600dp-land/account_setup_options.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Account Options - XL - landscape - see layout/ for small-screen version -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="@dimen/setup_padding_top"
- android:paddingLeft="@dimen/setup_padding_left"
- android:paddingRight="@dimen/setup_padding_right"
- >
-
- <!-- Headline and hairline divider -->
- <TextView
- android:id="@+id/headline"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_options_headline"
- android:textAppearance="@style/accountSetupHeadline" />
- <View
- android:id="@+id/top_divider"
- android:layout_below="@+id/headline"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
-
- <!-- Buttons on the right -->
- <Button
- android:id="@+id/previous"
- android:layout_below="@+id/top_divider"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/setup_buttons_padding_top"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/previous_action" />
- <Button
- android:id="@+id/next"
- android:layout_below="@+id/previous"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/setup_buttons_vertical_spacing"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/next_action" />
-
- <!-- Frame on the left containing the (common) setup info -->
- <FrameLayout
- android:layout_below="@+id/top_divider"
- android:layout_alignParentLeft="true"
- android:layout_toLeftOf="@+id/next"
- android:layout_marginRight="64dip"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <include
- layout="@layout/account_setup_options_common"
- />
- </FrameLayout>
- </RelativeLayout>
-</ScrollView>
diff --git a/email2/res/layout-sw600dp-land/account_setup_outgoing.xml b/email2/res/layout-sw600dp-land/account_setup_outgoing.xml
deleted file mode 100644
index b290ed5b8..000000000
--- a/email2/res/layout-sw600dp-land/account_setup_outgoing.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Outgoing Setup - XL - landscape - see layout/ for small-screen version -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="@dimen/setup_padding_top"
- android:paddingLeft="@dimen/setup_padding_left"
- android:paddingRight="@dimen/setup_padding_right"
- >
-
- <!-- Headline and hairline divider -->
- <TextView
- android:id="@+id/headline"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_outgoing_headline"
- android:textAppearance="@style/accountSetupHeadline" />
- <View
- android:id="@+id/top_divider"
- android:layout_below="@+id/headline"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
-
- <!-- Buttons on the right -->
- <Button
- android:id="@+id/previous"
- android:layout_below="@+id/top_divider"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/setup_buttons_padding_top"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/previous_action" />
- <Button
- android:id="@+id/next"
- android:layout_below="@+id/previous"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/setup_buttons_vertical_spacing"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/next_action" />
-
- <!-- Fragment on the left containing the setup info -->
- <FrameLayout
- android:layout_below="@+id/top_divider"
- android:layout_alignParentLeft="true"
- android:layout_toLeftOf="@+id/next"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="16dip"
- android:paddingRight="64dip"
- >
- <fragment
- android:id="@+id/setup_fragment"
- class="com.android.email.activity.setup.AccountSetupOutgoingFragment"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- />
- </FrameLayout>
- </RelativeLayout>
-</ScrollView>
diff --git a/email2/res/layout-sw600dp-port/account_setup_basics.xml b/email2/res/layout-sw600dp-port/account_setup_basics.xml
deleted file mode 100644
index 393b7735d..000000000
--- a/email2/res/layout-sw600dp-port/account_setup_basics.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Account setup - XL - portrait - see layout/ for small-screen version -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true"
- >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="@dimen/setup_padding_top"
- android:paddingLeft="@dimen/setup_padding_left"
- android:paddingRight="@dimen/setup_padding_right"
- >
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- >
-
- <!-- Headline and hairline divider -->
- <TextView
- android:id="@+id/headline"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_basics_headline"
- android:textAppearance="@style/accountSetupHeadline" />
- <View
- android:id="@+id/top_divider"
- android:layout_below="@+id/headline"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
-
- <!-- Frame on the top containing the (common) setup info -->
- <FrameLayout
- android:id="@+id/common"
- android:layout_below="@+id/top_divider"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <include
- layout="@layout/account_setup_basics_common"
- />
- </FrameLayout>
- </RelativeLayout>
-
- <!-- Buttons below -->
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/setup_buttons_padding_bottom"
- >
- <!-- Buttons below -->
- <Button
- android:id="@+id/manual_setup"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="@dimen/setup_buttons_padding_left"
- style="@style/accountSetupButton"
- android:text="@string/account_setup_basics_manual_setup_action" />
- <Button
- android:id="@+id/next"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/next_action" />
- </RelativeLayout>
- </LinearLayout>
-</ScrollView> \ No newline at end of file
diff --git a/email2/res/layout-sw600dp-port/account_setup_incoming.xml b/email2/res/layout-sw600dp-port/account_setup_incoming.xml
deleted file mode 100644
index 67e8becf0..000000000
--- a/email2/res/layout-sw600dp-port/account_setup_incoming.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Incoming setup - XL - portrait - see layout/ for small-screen version -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true"
- >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="@dimen/setup_padding_top"
- android:paddingLeft="@dimen/setup_padding_left"
- android:paddingRight="@dimen/setup_padding_right"
- >
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- >
-
- <!-- Headline and hairline divider -->
- <TextView
- android:id="@+id/headline"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_incoming_headline"
- android:textAppearance="@style/accountSetupHeadline" />
- <View
- android:id="@+id/top_divider"
- android:layout_below="@+id/headline"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
-
- <!-- Fragment on the top containing the setup info -->
- <FrameLayout
- android:layout_below="@+id/top_divider"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="16dip"
- android:paddingRight="96dip"
- >
- <fragment
- android:id="@+id/setup_fragment"
- class="com.android.email.activity.setup.AccountSetupIncomingFragment"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- />
- </FrameLayout>
- </RelativeLayout>
-
- <!-- Buttons below -->
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/setup_buttons_padding_bottom"
- >
- <Button
- android:id="@+id/previous"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="@dimen/setup_buttons_padding_left"
- style="@style/accountSetupButton"
- android:text="@string/previous_action" />
- <Button
- android:id="@+id/next"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/next_action" />
- </RelativeLayout>
- </LinearLayout>
-</ScrollView> \ No newline at end of file
diff --git a/email2/res/layout-sw600dp-port/account_setup_names.xml b/email2/res/layout-sw600dp-port/account_setup_names.xml
deleted file mode 100644
index b54a30c47..000000000
--- a/email2/res/layout-sw600dp-port/account_setup_names.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Account Names - XL - portrait - see layout/ for small-screen version -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true"
- >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="@dimen/setup_padding_top"
- android:paddingLeft="@dimen/setup_padding_left"
- android:paddingRight="@dimen/setup_padding_right"
- >
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- >
-
- <!-- Headline and hairline divider -->
- <TextView
- android:id="@+id/headline"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_names_headline"
- android:textAppearance="@style/accountSetupHeadline" />
- <View
- android:id="@+id/top_divider"
- android:layout_below="@+id/headline"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
-
- <!-- Frame on the top containing the (common) setup info -->
- <FrameLayout
- android:id="@+id/common"
- android:layout_below="@+id/top_divider"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <include
- layout="@layout/account_setup_names_common"
- />
- </FrameLayout>
- </RelativeLayout>
-
- <!-- Button below that -->
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/setup_buttons_padding_bottom"
- >
- <Button
- android:id="@+id/next"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/next_action" />
- </RelativeLayout>
- </LinearLayout>
-</ScrollView>
diff --git a/email2/res/layout-sw600dp-port/account_setup_options.xml b/email2/res/layout-sw600dp-port/account_setup_options.xml
deleted file mode 100644
index b6f136d49..000000000
--- a/email2/res/layout-sw600dp-port/account_setup_options.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Account Options - XL - portrait - see layout/ for small-screen version -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true"
- >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="@dimen/setup_padding_top"
- android:paddingLeft="@dimen/setup_padding_left"
- android:paddingRight="@dimen/setup_padding_right"
- >
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- >
-
- <!-- Headline and hairline divider -->
- <TextView
- android:id="@+id/headline"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_options_headline"
- android:textAppearance="@style/accountSetupHeadline" />
- <View
- android:id="@+id/top_divider"
- android:layout_below="@+id/headline"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
-
- <!-- Frame on the top containing the (common) setup info -->
- <FrameLayout
- android:id="@+id/common"
- android:layout_below="@+id/top_divider"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <include
- layout="@layout/account_setup_options_common"
- />
- </FrameLayout>
- </RelativeLayout>
-
- <!-- Buttons below -->
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/setup_buttons_padding_bottom"
- >
- <Button
- android:id="@+id/previous"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="@dimen/setup_buttons_padding_left"
- style="@style/accountSetupButton"
- android:text="@string/previous_action" />
- <Button
- android:id="@+id/next"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/next_action" />
- </RelativeLayout>
- </LinearLayout>
-</ScrollView> \ No newline at end of file
diff --git a/email2/res/layout-sw600dp-port/account_setup_outgoing.xml b/email2/res/layout-sw600dp-port/account_setup_outgoing.xml
deleted file mode 100644
index b7d07c292..000000000
--- a/email2/res/layout-sw600dp-port/account_setup_outgoing.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Outgoing Setup - XL - portrait - see layout/ for small-screen version -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true"
- >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="@dimen/setup_padding_top"
- android:paddingLeft="@dimen/setup_padding_left"
- android:paddingRight="@dimen/setup_padding_right"
- >
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- >
-
- <!-- Headline and hairline divider -->
- <TextView
- android:id="@+id/headline"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_outgoing_headline"
- android:textAppearance="@style/accountSetupHeadline" />
- <View
- android:id="@+id/top_divider"
- android:layout_below="@+id/headline"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
-
- <!-- Fragment on the top containing the setup info -->
- <FrameLayout
- android:layout_below="@+id/top_divider"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="16dip"
- android:paddingRight="96dip"
- >
- <fragment
- android:id="@+id/setup_fragment"
- class="com.android.email.activity.setup.AccountSetupOutgoingFragment"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- />
- </FrameLayout>
- </RelativeLayout>
-
- <!-- Buttons below -->
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/setup_buttons_padding_bottom"
- >
- <Button
- android:id="@+id/previous"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="@dimen/setup_buttons_padding_left"
- style="@style/accountSetupButton"
- android:text="@string/previous_action" />
- <Button
- android:id="@+id/next"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/next_action" />
- </RelativeLayout>
- </LinearLayout>
-</ScrollView> \ No newline at end of file
diff --git a/email2/res/layout-sw600dp/account_settings_buttons.xml b/email2/res/layout-sw600dp/account_settings_buttons.xml
deleted file mode 100644
index 9f66bb3ed..000000000
--- a/email2/res/layout-sw600dp/account_settings_buttons.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="@dimen/settings_buttons_padding_top"
- android:paddingBottom="@dimen/settings_buttons_padding_bottom"
- >
- <Button
- android:id="@+id/cancel"
- style="@style/accountSettingsButton"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="32dip"
- android:text="@string/cancel_action" />
- <Button
- android:id="@+id/done"
- style="@style/accountSettingsButton"
- android:layout_alignParentRight="true"
- android:layout_marginRight="32dip"
- android:text="@string/done_action" />
-</RelativeLayout>
-
diff --git a/email2/res/layout-sw600dp/account_setup_account_type.xml b/email2/res/layout-sw600dp/account_setup_account_type.xml
deleted file mode 100644
index c6d8a6667..000000000
--- a/email2/res/layout-sw600dp/account_setup_account_type.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Account-type picker - tablet - see layout/ for small-screen version -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="@dimen/setup_padding_top"
- android:paddingLeft="@dimen/setup_padding_left"
- android:paddingRight="@dimen/setup_padding_right"
- >
-
- <!-- Headline and hairline divider -->
- <TextView
- android:id="@+id/headline"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_account_type_headline"
- android:textAppearance="@style/accountSetupHeadline" />
- <View
- android:id="@+id/top_divider"
- android:layout_below="@+id/headline"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:background="@color/account_setup_divider_color" />
-
- <!-- Layout on the left containing the setup info -->
- <RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/accountTypes"
- android:layout_below="@+id/top_divider"
- android:layout_alignParentLeft="true"
- android:layout_marginRight="64dip"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" >
- <TextView
- android:id="@+id/instructions"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="16dip"
- android:layout_marginLeft="16dip"
- android:text="@string/account_setup_account_type_instructions"
- android:textAppearance="@style/accountSetupInfoText" />
- </RelativeLayout>
-
- <!-- Previous button (can be below or to the right) -->
- <Button
- android:id="@+id/previous"
- android:layout_marginTop="@dimen/setup_buttons_padding_top"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupTypePrevious"
- android:text="@string/previous_action" />
-
-
-</RelativeLayout>
diff --git a/email2/res/layout-sw600dp/account_setup_basics_common.xml b/email2/res/layout-sw600dp/account_setup_basics_common.xml
deleted file mode 100644
index aed76a6ec..000000000
--- a/email2/res/layout-sw600dp/account_setup_basics_common.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Common data-entry area of initial account setup screen - email, password, default check -->
-<!-- tablet version -->
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="@dimen/setup_item_inset_left"
- android:paddingRight="@dimen/setup_item_inset_right"
- >
- <TextView
- android:id="@+id/instructions"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="16dip"
- android:text="@string/accounts_welcome"
- android:textAppearance="@style/accountSetupInfoText" />
- <TableLayout
- android:id="@+id/email_password_table"
- android:layout_below="@+id/instructions"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="16dip">
-
- <TableRow android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_basics_email_label"
- android:textAppearance="@style/accountSetupLabelText" />
- <EditText
- android:id="@+id/account_email"
- android:layout_width="@dimen/setup_credentials_input_width"
- android:layout_height="wrap_content"
- android:contentDescription="@string/account_setup_basics_email_label"
- android:inputType="textEmailAddress"
- android:imeOptions="actionNext" />
- </TableRow>
- <TableRow android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_basics_password_label"
- android:textAppearance="@style/accountSetupLabelText" />
- <EditText
- android:id="@+id/account_password"
- android:layout_height="wrap_content"
- android:layout_width="@dimen/setup_credentials_input_width"
- android:contentDescription="@string/account_setup_basics_password_label"
- android:inputType="textPassword"
- android:imeOptions="actionDone"
- android:nextFocusDown="@+id/next" />
- </TableRow>
- </TableLayout>
-
- <!-- Note, the next three items should be shown/hidden as a group -->
- <View
- android:id="@+id/account_default_divider_1"
- android:layout_below="@+id/email_password_table"
- android:layout_marginTop="48dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color"
- android:visibility="gone" />
- <CheckBox
- android:id="@+id/account_default"
- android:layout_below="@+id/account_default_divider_1"
- android:layout_marginTop="16dip"
- android:layout_marginBottom="16dip"
- android:layout_marginLeft="32dip"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:text="@string/account_setup_basics_default_label"
- android:textAppearance="@style/accountSetupInfoText"
- android:visibility="gone" />
- <View
- android:id="@+id/account_default_divider_2"
- android:layout_below="@+id/account_default"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color"
- android:visibility="gone" />
-</RelativeLayout>
diff --git a/email2/res/layout-sw600dp/account_setup_incoming_fragment.xml b/email2/res/layout-sw600dp/account_setup_incoming_fragment.xml
deleted file mode 100644
index d9962266d..000000000
--- a/email2/res/layout-sw600dp/account_setup_incoming_fragment.xml
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Incoming server settings - tablet - see layout/ for phone UX variant -->
-<!-- This is used directly by the account setup activity, but during settings it is
- wrapped in an outer layout (account_settings_incoming_fragment) -->
-<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:stretchColumns="1" >
-
- <TableRow
- android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_incoming_username_label" />
- <EditText
- android:id="@+id/account_username"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@string/account_setup_incoming_username_label"
- android:inputType="textEmailAddress"
- android:imeOptions="actionDone" />
- </TableRow>
- <TableRow
- android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_incoming_password_label" />
- <EditText
- android:id="@+id/account_password"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@string/account_setup_incoming_password_label"
- android:inputType="textPassword"
- android:imeOptions="actionDone" />
- </TableRow>
- <TableRow
- android:paddingTop="16dip" >
- <!-- This text may be changed in code if the server is IMAP, etc. -->
- <TextView
- android:id="@+id/account_server_label"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_incoming_server_label" />
- <!-- Note: we use inputType=textUri as the closest approximation to a server name -->
- <EditText
- android:id="@+id/account_server"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@string/account_setup_incoming_server_label"
- android:inputType="textUri"
- android:imeOptions="actionDone" />
- </TableRow>
- <TableRow
- android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_incoming_security_label" />
- <Spinner
- android:id="@+id/account_security_type"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@string/account_setup_incoming_security_label" />
- </TableRow>
- <TableRow
- android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_incoming_port_label" />
- <EditText
- android:id="@+id/account_port"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@string/account_setup_incoming_port_label"
- android:inputType="number"
- android:imeOptions="actionDone" />
- </TableRow>
- <include
- android:id="@+id/client_certificate_selector"
- layout="@layout/client_certificate_selector"
- android:visibility="gone" />
- <TableRow
- android:paddingTop="16dip" >
- <TextView
- android:id="@+id/account_delete_policy_label"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_incoming_delete_policy_label" />
- <Spinner
- android:id="@+id/account_delete_policy"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@string/account_setup_incoming_delete_policy_label" />
- </TableRow>
- <TableRow
- android:id="@+id/imap_path_prefix_section"
- android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_incoming_imap_path_prefix_label" />
- <EditText
- android:id="@+id/imap_path_prefix"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@string/account_setup_incoming_imap_path_prefix_label"
- android:hint="@string/account_setup_incoming_imap_path_prefix_hint"
- android:inputType="text"
- android:imeOptions="actionDone" />
- </TableRow>
- <TableRow
- android:id="@+id/device_id_section"
- android:paddingTop="32dip"
- android:visibility="gone" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_exchange_device_id_label" />
- <!-- TODO - when adding back in styles, this should be slightly different (was "medium") -->
- <TextView
- android:id="@+id/device_id"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#ffbebebe" />
- </TableRow>
-</TableLayout>
-
diff --git a/email2/res/layout-sw600dp/account_setup_names_common.xml b/email2/res/layout-sw600dp/account_setup_names_common.xml
deleted file mode 100644
index 3092f423b..000000000
--- a/email2/res/layout-sw600dp/account_setup_names_common.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Common data-entry area of account name setup screen - account nickname, user name. -->
-<!-- tablet version -->
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="@dimen/setup_item_inset_left"
- android:paddingRight="@dimen/setup_item_inset_right" >
- <TextView
- android:id="@+id/account_description_label"
- android:layout_alignParentTop="true"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_names_account_name_label"
- android:textAppearance="@style/accountSetupLabelText" />
- <EditText
- android:id="@+id/account_description"
- android:layout_below="@+id/account_description_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_names_account_name_label"
- android:inputType="textCapWords"
- android:imeOptions="actionNext" />
- <TextView
- android:id="@+id/account_name_label"
- android:layout_below="@+id/account_description"
- android:layout_marginTop="32dip"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_names_user_name_label"
- android:textAppearance="@style/accountSetupLabelText" />
- <EditText
- android:id="@+id/account_name"
- android:layout_below="@+id/account_name_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_names_user_name_label"
- android:inputType="textPersonName"
- android:imeOptions="actionDone" />
-</RelativeLayout>
-
diff --git a/email2/res/layout-sw600dp/account_setup_options_common.xml b/email2/res/layout-sw600dp/account_setup_options_common.xml
deleted file mode 100644
index 0b73f50ca..000000000
--- a/email2/res/layout-sw600dp/account_setup_options_common.xml
+++ /dev/null
@@ -1,168 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Common data-entry area of account options setup screen - check freq, options, etc. -->
-<!-- tablet version -->
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="@dimen/setup_item_inset_left"
- android:paddingRight="@dimen/setup_item_inset_right"
- >
- <!-- Spinners in a table to line everything up nicely -->
- <TableLayout
- android:id="@+id/spinners_table"
- android:layout_alignParentTop="true"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:stretchColumns="1" >
- <TableRow
- android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_options_mail_check_frequency_label"
- android:textColor="?android:attr/textColorPrimary" />
- <Spinner
- android:id="@+id/account_check_frequency"
- android:layout_height="wrap_content"
- android:layout_width="match_parent" />
- </TableRow>
- <!-- 2nd row is shown only for EAS accounts -->
- <TableRow
- android:id="@+id/account_sync_window_row"
- android:paddingTop="16dip"
- android:visibility="gone" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_options_mail_window_label"
- android:textColor="?android:attr/textColorPrimary" />
- <Spinner
- android:id="@+id/account_sync_window"
- android:layout_height="wrap_content"
- android:layout_width="match_parent" />
- </TableRow>
- </TableLayout>
- <View
- android:id="@+id/account_default_divider_upper"
- android:layout_below="@+id/spinners_table"
- android:layout_marginTop="32dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
- <CheckBox
- android:id="@+id/account_default"
- android:layout_below="@+id/account_default_divider_upper"
- android:layout_marginTop="16dip"
- android:layout_marginBottom="16dip"
- android:layout_marginLeft="32dip"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_options_default_label" />
- <View
- android:id="@+id/account_default_divider"
- android:layout_below="@+id/account_default"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
- <CheckBox
- android:id="@+id/account_notify"
- android:layout_below="@+id/account_default_divider"
- android:layout_marginTop="16dip"
- android:layout_marginBottom="16dip"
- android:layout_marginLeft="32dip"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_options_notify_label" />
- <View
- android:id="@+id/account_notify_divider"
- android:layout_below="@+id/account_notify"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
- <!-- Contacts sync - hide unless EAS -->
- <CheckBox
- android:id="@+id/account_sync_contacts"
- android:layout_below="@+id/account_notify_divider"
- android:layout_marginTop="16dip"
- android:layout_marginBottom="16dip"
- android:layout_marginLeft="32dip"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_options_sync_contacts_label"
- android:visibility="gone" />
- <View
- android:id="@+id/account_sync_contacts_divider"
- android:layout_below="@+id/account_sync_contacts"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color"
- android:visibility="gone" />
- <!-- Calendar sync - hide unless EAS -->
- <CheckBox
- android:id="@+id/account_sync_calendar"
- android:layout_below="@+id/account_sync_contacts_divider"
- android:layout_marginTop="16dip"
- android:layout_marginBottom="16dip"
- android:layout_marginLeft="32dip"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_options_sync_calendar_label"
- android:visibility="gone" />
- <View
- android:id="@+id/account_sync_calendar_divider"
- android:layout_below="@+id/account_sync_calendar"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color"
- android:visibility="gone" />
- <!-- Email sync - always show -->
- <CheckBox
- android:id="@+id/account_sync_email"
- android:layout_below="@+id/account_sync_calendar_divider"
- android:layout_marginTop="16dip"
- android:layout_marginBottom="16dip"
- android:layout_marginLeft="32dip"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_options_sync_email_label" />
- <View
- android:id="@+id/account_sync_email_divider"
- android:layout_below="@+id/account_sync_email"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
- <!-- Auto-download attachments - always show, unless POP3 -->
- <CheckBox
- android:id="@+id/account_background_attachments"
- android:layout_below="@+id/account_sync_email_divider"
- android:layout_marginTop="16dip"
- android:layout_marginBottom="16dip"
- android:layout_marginLeft="32dip"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_options_background_attachments_label" />
- <View
- android:id="@+id/account_background_attachments_divider"
- android:layout_below="@+id/account_sync_email"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
-</RelativeLayout>
diff --git a/email2/res/layout-sw600dp/account_setup_outgoing_fragment.xml b/email2/res/layout-sw600dp/account_setup_outgoing_fragment.xml
deleted file mode 100644
index e33154080..000000000
--- a/email2/res/layout-sw600dp/account_setup_outgoing_fragment.xml
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Incoming server settings - tablet - see layout/ for phone UX variant -->
-<!-- This is used directly by the account setup activity, but during settings it is
- wrapped in an outer layout (account_settings_outgoing_fragment) -->
-<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:stretchColumns="1" >
-
- <TableRow
- android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_outgoing_smtp_server_label" />
- <!-- Note: we use inputType=textUri as the closest approximation to a server name -->
- <EditText
- android:id="@+id/account_server"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:inputType="textUri"
- android:imeOptions="actionDone" />
- </TableRow>
- <TableRow
- android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_outgoing_security_label" />
- <Spinner
- android:id="@+id/account_security_type"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </TableRow>
- <TableRow
- android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_outgoing_port_label" />
- <EditText
- android:id="@+id/account_port"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:inputType="number"
- android:imeOptions="actionDone" />
- </TableRow>
- <!-- Note, this row is not a TableRow, and it will span the entire table - no columns -->
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="32dip"
- android:orientation="vertical" >
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
- <CheckBox
- android:id="@+id/account_require_login"
- android:layout_marginTop="16dip"
- android:layout_marginBottom="16dip"
- android:layout_marginLeft="32dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_outgoing_require_login_label" />
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
- </LinearLayout>
- <TableRow
- android:id="@+id/account_require_login_settings"
- android:paddingTop="16dip"
- android:visibility="gone" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_outgoing_username_label" />
- <EditText
- android:id="@+id/account_username"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:inputType="textEmailAddress"
- android:imeOptions="actionDone" />
- </TableRow>
- <TableRow
- android:id="@+id/account_require_login_settings_2"
- android:paddingTop="16dip"
- android:visibility="gone" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_outgoing_password_label" />
- <EditText
- android:id="@+id/account_password"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:inputType="textPassword"
- android:imeOptions="actionDone" />
- </TableRow>
-</TableLayout>
diff --git a/email2/res/layout-sw600dp/account_type.xml b/email2/res/layout-sw600dp/account_type.xml
deleted file mode 100644
index 805f211a4..000000000
--- a/email2/res/layout-sw600dp/account_type.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- small -->
-
- <Button xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_alignParentLeft="true"
- android:layout_marginTop="@dimen/setup_buttons_vertical_spacing"
- android:layout_marginLeft="48dip"
- style="@style/accountSetupButton" />
diff --git a/email2/res/layout/account_settings.xml b/email2/res/layout/account_settings.xml
deleted file mode 100644
index 5231ea69f..000000000
--- a/email2/res/layout/account_settings.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Simple layout for account preferences, consisting entirely of a single fragment -->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <fragment
- android:id="@+id/settings_fragment"
- class="com.android.email.activity.setup.AccountSettingsFragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- />
-</FrameLayout>
diff --git a/email2/res/layout/account_settings_buttons.xml b/email2/res/layout/account_settings_buttons.xml
deleted file mode 100644
index 66d39cf87..000000000
--- a/email2/res/layout/account_settings_buttons.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:paddingTop="@dimen/settings_buttons_padding_top"
- android:paddingBottom="@dimen/settings_buttons_padding_bottom"
- >
- <Button
- android:id="@+id/cancel"
- style="@style/accountSettingsButton"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:text="@string/cancel_action" />
- <Button
- android:id="@+id/done"
- style="@style/accountSettingsButton"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:text="@string/done_action" />
-</LinearLayout>
diff --git a/email2/res/layout/account_settings_edit_quick_responses_fragment.xml b/email2/res/layout/account_settings_edit_quick_responses_fragment.xml
deleted file mode 100644
index 63dd146c1..000000000
--- a/email2/res/layout/account_settings_edit_quick_responses_fragment.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:paddingTop="@dimen/settings_fragment_padding_top"
- android:paddingLeft="@dimen/settings_fragment_padding_left"
- android:paddingRight="@dimen/settings_fragment_padding_right"
- >
-
- <!-- List of quick responses and empty view for when there are none-->
- <ListView
- android:id="@+id/account_settings_quick_responses_list"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
- <TextView
- android:id="@+id/empty_view"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_weight="1"
- android:layout_gravity="center"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:focusable="true"
- android:visibility="gone"
- android:text="@string/quick_responses_empty_view"
- />
- <Button
- android:id="@+id/create_new"
- android:layout_gravity="center"
- style="@style/accountSettingsButton"
- android:text="@string/create_action"
- />
-</LinearLayout> \ No newline at end of file
diff --git a/email2/res/layout/account_settings_incoming_fragment.xml b/email2/res/layout/account_settings_incoming_fragment.xml
deleted file mode 100644
index 0c9107436..000000000
--- a/email2/res/layout/account_settings_incoming_fragment.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Incoming server settings. This is a wrapper around the "incoming setup" fragment
- that adds scrollview & buttons and makes it more compatible with a 2-pane PreferenceActivity
- such as AccountSettingsXL. -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true"
- >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="@dimen/settings_fragment_padding_top"
- android:paddingLeft="@dimen/settings_fragment_padding_left"
- android:paddingRight="@dimen/settings_fragment_padding_right"
- >
-
- <!-- Fields entry -->
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <include
- layout="@layout/account_setup_incoming_fragment"
- />
- </FrameLayout>
-
- <!-- This spacer fills the viewport and moves the buttons to the bottom -->
- <View
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1" />
-
- <include layout="@layout/account_settings_buttons" />
- </LinearLayout>
-</ScrollView> \ No newline at end of file
diff --git a/email2/res/layout/account_settings_outgoing_fragment.xml b/email2/res/layout/account_settings_outgoing_fragment.xml
deleted file mode 100644
index 393f1a5f7..000000000
--- a/email2/res/layout/account_settings_outgoing_fragment.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Outgoing server settings. This is a wrapper around the "outgoing setup" fragment
- that adds scrollview & buttons and makes it more compatible with a 2-pane PreferenceActivity
- such as AccountSettingsXL. -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true"
- >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="@dimen/settings_fragment_padding_top"
- android:paddingLeft="@dimen/settings_fragment_padding_left"
- android:paddingRight="@dimen/settings_fragment_padding_right"
- >
-
- <!-- Fields entry -->
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <include
- layout="@layout/account_setup_outgoing_fragment"
- />
- </FrameLayout>
-
- <!-- This spacer fills the viewport and moves the buttons to the bottom -->
- <View
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1" />
-
- <include layout="@layout/account_settings_buttons" />
- </LinearLayout>
-</ScrollView> \ No newline at end of file
diff --git a/email2/res/layout/account_setup_account_type.xml b/email2/res/layout/account_setup_account_type.xml
deleted file mode 100644
index c6ff9725a..000000000
--- a/email2/res/layout/account_setup_account_type.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- small -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/accountTypes"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:paddingTop="@dimen/setup_fragment_padding_top"
- android:paddingLeft="@dimen/setup_fragment_padding_left"
- android:paddingRight="@dimen/setup_fragment_padding_right"
- >
- <TextView
- android:text="@string/account_setup_account_type_instructions"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?android:attr/textColorPrimary"
- />
-</LinearLayout>
diff --git a/email2/res/layout/account_setup_basics.xml b/email2/res/layout/account_setup_basics.xml
deleted file mode 100644
index 9deb20a74..000000000
--- a/email2/res/layout/account_setup_basics.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Small-screen holder - see layout-xlarge for large-screen version -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true">
-
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="@dimen/setup_fragment_padding_top"
- android:paddingLeft="@dimen/setup_fragment_padding_left"
- android:paddingRight="@dimen/setup_fragment_padding_right"
- >
-
- <!-- Frame on the left containing the (common) setup info -->
- <!-- TODO need phone-sized UX here -->
- <FrameLayout
- android:id="@+id/common"
- android:layout_below="@+id/top_divider"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- >
- <include
- layout="@layout/account_setup_basics_common"
- />
- </FrameLayout>
-
- <!-- Buttons below -->
- <!-- In order to show these buttons above the IME keyboard, we need to special case the to
- padding to a smaller height. -->
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@+id/common"
- android:orientation="horizontal"
- android:paddingTop="16dip"
- android:paddingBottom="@dimen/settings_buttons_padding_bottom"
- >
- <Button
- android:id="@+id/manual_setup"
- style="@style/accountSetupButton"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:text="@string/account_setup_basics_manual_setup_action" />
- <Button
- android:id="@+id/next"
- style="@style/accountSetupButton"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:text="@string/next_action" />
- </LinearLayout>
-
- </RelativeLayout>
-
-</ScrollView>
diff --git a/email2/res/layout/account_setup_basics_common.xml b/email2/res/layout/account_setup_basics_common.xml
deleted file mode 100644
index 2d9cabf8c..000000000
--- a/email2/res/layout/account_setup_basics_common.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Common data-entry area of initial account setup screen - email, password, default check -->
-<!-- small screen version -->
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="@dimen/setup_item_inset_left"
- android:paddingRight="@dimen/setup_item_inset_right"
- >
- <TextView
- android:id="@+id/instructions"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
- android:textSize="20sp"
- android:text="@string/accounts_welcome"
- android:textAppearance="@style/accountSetupInfoText" />
- <EditText
- android:id="@+id/account_email"
- android:hint="@string/account_setup_basics_email_label"
- android:contentDescription="@string/account_setup_basics_email_label"
- android:inputType="textEmailAddress"
- android:imeOptions="actionNext"
- android:layout_below="@+id/instructions"
- android:layout_height="wrap_content"
- android:layout_width="match_parent" />
- <EditText
- android:id="@+id/account_password"
- android:hint="@string/account_setup_basics_password_label"
- android:contentDescription="@string/account_setup_basics_password_label"
- android:inputType="textPassword"
- android:imeOptions="actionDone"
- android:layout_below="@+id/account_email"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:nextFocusDown="@+id/next" />
- <CheckBox
- android:id="@+id/account_default"
- android:layout_below="@+id/account_password"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_basics_default_label"
- android:visibility="gone" />
-</RelativeLayout>
diff --git a/email2/res/layout/account_setup_buttons.xml b/email2/res/layout/account_setup_buttons.xml
deleted file mode 100644
index 242340bb7..000000000
--- a/email2/res/layout/account_setup_buttons.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:paddingTop="@dimen/settings_buttons_padding_top"
- android:paddingBottom="@dimen/settings_buttons_padding_bottom"
- >
- <Button
- android:id="@+id/previous"
- style="@style/accountSetupButton"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:text="@string/previous_action" />
- <Button
- android:id="@+id/next"
- style="@style/accountSetupButton"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:text="@string/next_action" />
-</LinearLayout>
diff --git a/email2/res/layout/account_setup_incoming.xml b/email2/res/layout/account_setup_incoming.xml
deleted file mode 100644
index 224145c1d..000000000
--- a/email2/res/layout/account_setup_incoming.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<ScrollView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true" >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="@dimen/setup_fragment_padding_top"
- android:paddingLeft="@dimen/setup_fragment_padding_left"
- android:paddingRight="@dimen/setup_fragment_padding_right" >
-
- <fragment
- android:id="@+id/setup_fragment"
- class="com.android.email.activity.setup.AccountSetupIncomingFragment"
- android:layout_alignParentTop="true"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
-
- <include layout="@layout/account_setup_buttons" />
-
- </LinearLayout>
-</ScrollView>
diff --git a/email2/res/layout/account_setup_incoming_fragment.xml b/email2/res/layout/account_setup_incoming_fragment.xml
deleted file mode 100644
index b5e5b48df..000000000
--- a/email2/res/layout/account_setup_incoming_fragment.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Incoming server settings - default - see layout-xlarge/ for XL variant -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:orientation="vertical" >
- <TextView
- android:text="@string/account_setup_incoming_username_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <EditText
- android:id="@+id/account_username"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_incoming_username_label"
- android:inputType="textEmailAddress"
- android:imeOptions="actionNext" />
- <TextView
- android:text="@string/account_setup_incoming_password_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <EditText
- android:id="@+id/account_password"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_incoming_password_label"
- android:inputType="textPassword"
- android:imeOptions="actionNext" />
- <!-- This text may be changed in code if the server is IMAP, etc. -->
- <TextView
- android:id="@+id/account_server_label"
- android:text="@string/account_setup_incoming_server_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <!-- Note: we use inputType=textUri as the closest approximation to a server name -->
- <!-- This contentDescription may be changed in code if the server is IMAP, etc. -->
- <EditText
- android:id="@+id/account_server"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_incoming_server_label"
- android:inputType="textUri"
- android:imeOptions="actionNext" />
- <TextView
- android:text="@string/account_setup_incoming_port_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <EditText
- android:id="@+id/account_port"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_incoming_port_label"
- android:inputType="number"
- android:imeOptions="actionDone" />
- <TextView
- android:text="@string/account_setup_incoming_security_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <Spinner
- android:id="@+id/account_security_type"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_incoming_security_label" />
- <include
- android:id="@+id/client_certificate_selector"
- layout="@layout/client_certificate_selector"
- android:visibility="gone" />
- <TextView
- android:id="@+id/account_delete_policy_label"
- android:text="@string/account_setup_incoming_delete_policy_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <Spinner
- android:id="@+id/account_delete_policy"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_incoming_delete_policy_label" />
- <LinearLayout
- android:id="@+id/imap_path_prefix_section"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
- <TextView
- android:text="@string/account_setup_incoming_imap_path_prefix_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <EditText
- android:id="@+id/imap_path_prefix"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_incoming_imap_path_prefix_label"
- android:hint="@string/account_setup_incoming_imap_path_prefix_hint"
- android:inputType="text"
- android:imeOptions="actionDone" />
- </LinearLayout>
- <LinearLayout
- android:id="@+id/device_id_section"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:visibility="gone">
- <TextView
- android:text="@string/account_setup_exchange_device_id_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textColor="?android:attr/textColorPrimary" />
- <TextView
- android:id="@+id/device_id"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="#ffbebebe" />
- </LinearLayout>
-</LinearLayout>
diff --git a/email2/res/layout/account_setup_names.xml b/email2/res/layout/account_setup_names.xml
deleted file mode 100644
index a43d2e86a..000000000
--- a/email2/res/layout/account_setup_names.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true" >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:orientation="vertical"
- android:paddingTop="@dimen/setup_fragment_padding_top"
- android:paddingLeft="@dimen/setup_fragment_padding_left"
- android:paddingRight="@dimen/setup_fragment_padding_right" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_names_headline"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?android:attr/textColorPrimary" />
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_names_account_name_label"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <EditText
- android:id="@+id/account_description"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_names_account_name_label"
- android:inputType="textCapWords|textNoSuggestions"
- android:imeOptions="actionNext" />
- <TextView
- android:id="@+id/account_name_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_names_user_name_label"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <EditText
- android:id="@+id/account_name"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_names_user_name_label"
- android:inputType="textPersonName"
- android:imeOptions="actionDone" />
-
- <Button
- android:id="@+id/next"
- android:layout_marginTop="16dip"
- android:layout_gravity="right"
- style="@style/accountSetupButton"
- android:text="@string/next_action" />
- </LinearLayout>
-</ScrollView>
diff --git a/email2/res/layout/account_setup_options.xml b/email2/res/layout/account_setup_options.xml
deleted file mode 100644
index a17e3f8a8..000000000
--- a/email2/res/layout/account_setup_options.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<ScrollView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true" >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:orientation="vertical"
- android:paddingTop="@dimen/setup_fragment_padding_top"
- android:paddingLeft="@dimen/setup_fragment_padding_left"
- android:paddingRight="@dimen/setup_fragment_padding_right" >
-
- <TextView
- android:text="@string/account_setup_options_mail_check_frequency_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <Spinner
- android:id="@+id/account_check_frequency"
- android:layout_height="wrap_content"
- android:layout_width="match_parent" />
- <!-- TODO quick fix - phone UX still TBD -->
- <LinearLayout
- android:id="@+id/account_sync_window_row"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:visibility="gone"
- >
- <TextView
- android:id="@+id/account_sync_window_label"
- android:text="@string/account_setup_options_mail_window_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <Spinner
- android:id="@+id/account_sync_window"
- android:layout_height="wrap_content"
- android:layout_width="match_parent" />
- </LinearLayout>
- <CheckBox
- android:id="@+id/account_default"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_options_default_label" />
- <CheckBox
- android:id="@+id/account_notify"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_options_notify_label" />
- <CheckBox
- android:id="@+id/account_sync_contacts"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_options_sync_contacts_label"
- android:visibility="gone" />
- <CheckBox
- android:id="@+id/account_sync_calendar"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_options_sync_calendar_label"
- android:visibility="gone" />
- <CheckBox
- android:id="@+id/account_sync_email"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_options_sync_email_label" />
-
- <CheckBox
- android:id="@+id/account_background_attachments"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_options_background_attachments_label" />
-
- <include layout="@layout/account_setup_buttons" />
-
- </LinearLayout>
-</ScrollView>
diff --git a/email2/res/layout/account_setup_outgoing.xml b/email2/res/layout/account_setup_outgoing.xml
deleted file mode 100644
index d81a69d0c..000000000
--- a/email2/res/layout/account_setup_outgoing.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<ScrollView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true" >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="@dimen/setup_fragment_padding_top"
- android:paddingLeft="@dimen/setup_fragment_padding_left"
- android:paddingRight="@dimen/setup_fragment_padding_right" >
-
- <fragment
- android:id="@+id/setup_fragment"
- class="com.android.email.activity.setup.AccountSetupOutgoingFragment"
- android:layout_alignParentTop="true"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
-
- <include layout="@layout/account_setup_buttons"
- android:layout_below="@+id/setup_fragment" />
-
- </LinearLayout>
-</ScrollView>
diff --git a/email2/res/layout/account_setup_outgoing_fragment.xml b/email2/res/layout/account_setup_outgoing_fragment.xml
deleted file mode 100644
index 22dc60f6c..000000000
--- a/email2/res/layout/account_setup_outgoing_fragment.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Outgoing server settings - default - see layout-xlarge/ for XL variant -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:orientation="vertical" >
- <TextView
- android:text="@string/account_setup_outgoing_smtp_server_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <!-- Note: we use inputType=textUri as the closest approximation to a server name -->
- <EditText
- android:id="@+id/account_server"
- android:inputType="textUri"
- android:imeOptions="actionDone"
- android:layout_height="wrap_content"
- android:layout_width="match_parent" />
- <TextView
- android:text="@string/account_setup_outgoing_port_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <EditText
- android:id="@+id/account_port"
- android:inputType="number"
- android:imeOptions="actionDone"
- android:layout_height="wrap_content"
- android:layout_width="match_parent" />
- <TextView
- android:text="@string/account_setup_outgoing_security_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <Spinner
- android:id="@+id/account_security_type"
- android:layout_height="wrap_content"
- android:layout_width="match_parent" />
- <CheckBox
- android:id="@+id/account_require_login"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_outgoing_require_login_label" />
- <LinearLayout
- android:id="@+id/account_require_login_settings"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:visibility="gone">
- <TextView
- android:text="@string/account_setup_outgoing_username_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <EditText
- android:id="@+id/account_username"
- android:inputType="textEmailAddress"
- android:imeOptions="actionDone"
- android:layout_height="wrap_content"
- android:layout_width="match_parent" />
- <TextView
- android:text="@string/account_setup_outgoing_password_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <EditText
- android:id="@+id/account_password"
- android:inputType="textPassword"
- android:imeOptions="actionDone"
- android:layout_height="wrap_content"
- android:layout_width="match_parent" />
- </LinearLayout>
-</LinearLayout>
diff --git a/email2/res/layout/account_shortcut_picker.xml b/email2/res/layout/account_shortcut_picker.xml
deleted file mode 100644
index da04b06e9..000000000
--- a/email2/res/layout/account_shortcut_picker.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- >
- <FrameLayout
- android:id="@+id/shortcut_list"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
- <!-- TODO selectableItemBackground is a placeholder for the new "cancel" style -->
- <Button
- android:id="@+id/cancel"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/cancel_action"
- android:background="?android:attr/selectableItemBackground"
- />
-</LinearLayout>
diff --git a/email2/res/layout/account_type.xml b/email2/res/layout/account_type.xml
deleted file mode 100644
index 1740ee4fa..000000000
--- a/email2/res/layout/account_type.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- small -->
-
- <Button xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/button"
- android:text="@string/account_setup_options_mail_window_auto"
- android:layout_height="wrap_content"
- android:layout_width="150sp"
- android:layout_marginTop="25dip"
- android:minWidth="@dimen/button_minWidth"
- android:layout_gravity="center_horizontal"
- />
diff --git a/email2/res/layout/client_certificate_selector.xml b/email2/res/layout/client_certificate_selector.xml
deleted file mode 100644
index 1bcd5fac8..000000000
--- a/email2/res/layout/client_certificate_selector.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- A layout to select a certificate, akin to a file selector on web pages. -->
-<!-- Extends LinearLayout -->
-<com.android.email.view.CertificateSelector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_margin="8dip"
- android:gravity="center_vertical" >
-
- <Button
- android:id="@+id/select_button"
- style="@style/accountSetupButton"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:text="@string/account_setup_exchange_use_certificate" />
-
- <TextView
- android:id="@+id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_toLeftOf="@+id/select_button"
- android:textStyle="bold"
- android:text="@string/account_setup_exchange_certificate_title" />
-
- <TextView
- android:id="@+id/certificate_alias"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_below="@+id/title"
- android:layout_alignParentLeft="true"
- android:layout_toLeftOf="@+id/select_button"
- android:textColor="@color/text_secondary_color"
- android:singleLine="true"
- android:ellipsize="end"
- android:text="@string/account_setup_exchange_no_certificate" />
-
-</com.android.email.view.CertificateSelector>
diff --git a/email2/res/layout/connection_error_banner.xml b/email2/res/layout/connection_error_banner.xml
deleted file mode 100644
index 1e34302c1..000000000
--- a/email2/res/layout/connection_error_banner.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- header area -->
- <TextView android:id="@+id/connection_error_text"
- style="?android:attr/listViewWhiteStyle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="gone"
- android:gravity="center"
- android:paddingTop="5dip"
- android:paddingBottom="5dip"
- android:textAppearance="?android:attr/textAppearanceSmallInverse"
- android:background="@color/connection_error_banner" />
-
-</merge>
diff --git a/email2/res/layout/conversation_item_view_normal.xml b/email2/res/layout/conversation_item_view_normal.xml
deleted file mode 100644
index e0652bd87..000000000
--- a/email2/res/layout/conversation_item_view_normal.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2011 Google Inc.
- Licensed to The Android Open Source Project.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- This layout is used as a template to create custom view CanvasConversationHeaderView
- in normal mode. To be able to get the correct measurements, every source field should
- be populated with data here. E.g:
- - Text View should set text to a random long string (android:text="@string/long_string")
- - Image View should set source to a specific asset -->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="@dimen/conversation_item_height"
- android:orientation="vertical">
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical">
- <ImageView
- android:id="@+id/reply_state"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/replystate_margin_top"
- android:layout_marginLeft="@dimen/replystate_margin_left"
- android:layout_marginRight="@dimen/replystate_margin_right"
- android:src="@drawable/ic_badge_reply_holo_light"
- />
- <com.android.mail.browse.SendersView
- android:id="@+id/senders"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- style="@style/SendersStyle"
- android:text="@string/long_string"
- android:textSize="@dimen/senders_font_size"
- android:lines="1"
- android:layout_toRightOf="@id/reply_state" />
- <RelativeLayout
- android:layout_height="wrap_content"
- android:layout_width="@dimen/total_conversationbar_width"
- android:layout_alignParentRight="true">
- <View android:id="@+id/color_bar"
- android:layout_alignParentTop="true"
- android:layout_height="@dimen/color_block_height"
- android:layout_width="@dimen/total_conversationbar_width" />
- <LinearLayout
- android:layout_alignWithParentIfMissing="true"
- android:layout_alignParentTop="true"
- android:layout_height="wrap_content"
- android:layout_width="@dimen/total_conversationbar_width"
- android:layout_alignParentRight="true">
- <ImageView
- android:id="@+id/paperclip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ic_attachment_holo_light"
- android:layout_marginTop="6sp" />
- <TextView
- android:id="@+id/date"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:layout_height="wrap_content"
- android:text="@string/long_string"
- android:textSize="@dimen/date_font_size"
- android:lines="1"
- android:layout_marginRight="16dip"
- android:layout_marginTop="10sp" />
- </LinearLayout>
- </RelativeLayout>
- </RelativeLayout>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <ImageView
- style="@style/CheckmarkStyle"
- android:id="@+id/checkmark"
- android:src="@drawable/btn_check_on_normal_holo_light"/>
- <TextView
- android:id="@+id/subject"
- android:layout_width="@dimen/subject_width"
- style="@style/SubjectStyle"
- android:text="@string/long_string"
- android:lines="2"/>
- <ImageView
- android:id="@+id/star"
- style="@style/StarStyle"
- android:src="@drawable/btn_star_off_normal_email_holo_light" />
- </LinearLayout>
-</LinearLayout>
diff --git a/email2/res/layout/conversation_item_view_wide.xml b/email2/res/layout/conversation_item_view_wide.xml
deleted file mode 100644
index 8033afdec..000000000
--- a/email2/res/layout/conversation_item_view_wide.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2011 Google Inc.
- Licensed to The Android Open Source Project.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- This layout is used as a template to create custom view CanvasConversationHeaderView
- in wide mode. To be able to get the correct measurements, every source field should
- be populated with data here. E.g:
- - Text View should set text to a random long string (android:text="@string/long_string")
- - Image View should set source to a specific asset -->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="64sp"
- android:orientation="horizontal">
- <ImageView
- android:id="@+id/checkmark"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:layout_gravity="center_vertical"
- android:src="@drawable/btn_check_on_normal_holo_light" />
- <com.android.mail.browse.SendersView
- android:id="@+id/senders"
- android:layout_width="224dip"
- android:layout_height="wrap_content"
- android:text="@string/long_string"
- android:textSize="@dimen/wide_senders_font_size"
- android:layout_gravity="center_vertical"
- android:maxLines="2"
- android:layout_marginTop="@dimen/wide_senders_margin_top" />
- <ImageView
- android:id="@+id/reply_state"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:layout_gravity="center_vertical"
- android:src="@drawable/ic_badge_reply_holo_light" />
- <TextView
- android:id="@+id/subject"
- android:layout_width="0dip"
- android:layout_weight="0.7"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:text="@string/long_string"
- android:lines="2"
- android:textColor="@color/subject_text_color_unread"
- android:textSize="@dimen/wide_subject_font_size"
- android:layout_marginTop="2sp"
- android:layout_marginRight="@dimen/wide_subject_margin_right"/>
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:orientation="vertical">
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:layout_gravity="center_vertical">
- <ImageView
- android:id="@+id/paperclip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ic_attachment_holo_light"
- android:layout_gravity="center_vertical"
- android:layout_marginTop="@dimen/wide_attachment_margin_top"/>
- <TextView
- android:id="@+id/date"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:text="@string/date"
- android:layout_marginTop="@dimen/wide_date_margin_top" />
- </LinearLayout>
- </LinearLayout>
- <ImageView
- android:id="@+id/star"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:layout_gravity="center_vertical"
- android:src="@drawable/btn_star_off_normal_email_holo_light" />
-</LinearLayout>
diff --git a/email2/res/layout/debug.xml b/email2/res/layout/debug.xml
deleted file mode 100644
index de315553f..000000000
--- a/email2/res/layout/debug.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <CheckBox
- android:id="@+id/debug_logging"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/debug_enable_debug_logging_label"
- />
- <CheckBox
- android:id="@+id/verbose_logging"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/debug_enable_verbose_logging_label"
- />
- <CheckBox
- android:id="@+id/file_logging"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/debug_enable_file_logging_label"
- />
- <Button
- android:id="@+id/clear_webview_cache"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/debug_clear_webview_cache"
- />
- <CheckBox
- android:id="@+id/debug_disable_graphics_acceleration"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/debug_disable_graphics_acceleration_label"
- />
- <CheckBox
- android:id="@+id/debug_force_one_minute_refresh"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/debug_force_one_minute_refresh_label"
- />
- <CheckBox
- android:id="@+id/debug_enable_strict_mode"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/debug_enable_strict_mode_label"
- />
-</LinearLayout>
diff --git a/email2/res/layout/insert_quick_response.xml b/email2/res/layout/insert_quick_response.xml
deleted file mode 100644
index 887cb04b1..000000000
--- a/email2/res/layout/insert_quick_response.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<TextView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/quick_response_text"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:padding="9dip"
- android:gravity="center_vertical"
- android:lines="2"
- android:ellipsize="end"
- /> \ No newline at end of file
diff --git a/email2/res/layout/quick_response_edit_dialog.xml b/email2/res/layout/quick_response_edit_dialog.xml
deleted file mode 100644
index cdb8fb79f..000000000
--- a/email2/res/layout/quick_response_edit_dialog.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:focusable="true"
- android:paddingLeft="4dip"
- android:paddingTop="6dip"
- android:paddingRight="4dip"
- android:paddingBottom="6dip">
-
- <EditText
- android:id="@+id/quick_response_text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
-
-</RelativeLayout> \ No newline at end of file
diff --git a/email2/res/layout/quick_response_item.xml b/email2/res/layout/quick_response_item.xml
deleted file mode 100644
index 577abb3e6..000000000
--- a/email2/res/layout/quick_response_item.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/line_item"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="?android:attr/listChoiceBackgroundIndicator"
- android:focusable="true"
- android:padding="7dip"
- >
- <ImageView
- android:id="@+id/delete_icon"
- android:layout_height="match_parent"
- android:layout_width="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:background="?android:attr/listChoiceBackgroundIndicator"
- android:focusable="true"
- android:padding="7dip"
- android:src="@drawable/ic_menu_trash_holo_light"
- />
- <TextView
- android:id="@+id/quick_response_text"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_alignParentLeft="true"
- android:layout_toLeftOf="@id/delete_icon"
- android:layout_centerVertical="true"
- style="@style/accountSetupInfoText"
- android:ellipsize="end"
- android:focusable="false"
- android:maxLines="2"
- />
-</RelativeLayout> \ No newline at end of file
diff --git a/email2/res/menu-sw600dp/account_settings_add_account_option.xml b/email2/res/menu-sw600dp/account_settings_add_account_option.xml
deleted file mode 100644
index dc274d81c..000000000
--- a/email2/res/menu-sw600dp/account_settings_add_account_option.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- A menu for Account Settings to provide the "Add Account" option -->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/add_new_account"
- android:title="@string/add_account_action"
- android:showAsAction="ifRoom|withText"
- />
-</menu>
-
diff --git a/email2/res/menu/account_settings_add_account_option.xml b/email2/res/menu/account_settings_add_account_option.xml
deleted file mode 100644
index e93a17b67..000000000
--- a/email2/res/menu/account_settings_add_account_option.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- A menu for Account Settings to provide the "Add Account" option -->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/add_new_account"
- android:title="@string/add_account_action"
- android:showAsAction="always"
- />
-</menu>
diff --git a/email2/res/mipmap-hdpi/ic_launcher_mail.png b/email2/res/mipmap-hdpi/ic_launcher_mail.png
deleted file mode 100644
index 2616df73a..000000000
--- a/email2/res/mipmap-hdpi/ic_launcher_mail.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/mipmap-mdpi/ic_launcher_mail.png b/email2/res/mipmap-mdpi/ic_launcher_mail.png
deleted file mode 100644
index 545902704..000000000
--- a/email2/res/mipmap-mdpi/ic_launcher_mail.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/mipmap-xhdpi/ic_launcher_mail.png b/email2/res/mipmap-xhdpi/ic_launcher_mail.png
deleted file mode 100644
index 91c768e45..000000000
--- a/email2/res/mipmap-xhdpi/ic_launcher_mail.png
+++ /dev/null
Binary files differ
diff --git a/email2/res/values-af/strings.xml b/email2/res/values-af/strings.xml
deleted file mode 100644
index 885484053..000000000
--- a/email2/res/values-af/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Lees e-posaanhegsels"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Laat die program toe om jou e-pos se aanhegsels te lees."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Kry toegang tot e-posverskafferdata"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Laat die program toe om toegang te kry tot jou e-posdatabasis, insluitend ontvangde boodskappe, gestuurde boodskappe, gebruikername en wagwoorde."</string>
- <string name="app_name" msgid="5815426892327290362">"E-pos"</string>
- <string name="compose_title" msgid="427986915662706899">"Skryf"</string>
- <string name="debug_title" msgid="5175710493691536719">"Ontfout"</string>
- <string name="next_action" msgid="3931301986364184415">"Volgende"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Kanselleer"</string>
- <string name="previous_action" msgid="5181616311579820981">"Vorige"</string>
- <string name="send_action" msgid="1729766205562446418">"Stuur"</string>
- <string name="reply_action" msgid="4262472229221507619">"Antwoord"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Antwoord almal"</string>
- <string name="delete_action" msgid="8421026208288857155">"Vee uit"</string>
- <string name="forward_action" msgid="669174181042344116">"Stuur aan"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Sterretjie"</string>
- <string name="done_action" msgid="7497990549515580249">"Gedoen"</string>
- <string name="create_action" msgid="3062715563215392251">"Skep nuwe"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Vee uit"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Geen vinnige reaksies nie."</string>
- <string name="discard_action" msgid="6532206074859505968">"Gooi weg"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Stoor konsep"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Voer vinnige antwoord in"</string>
- <string name="read_action" msgid="4701484794504781686">"Merk as gelees"</string>
- <string name="unread_action" msgid="6280399049357552826">"Merk as ongelees"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Voeg ster by"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Verwyder ster"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Herlaai"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Voeg rekening by"</string>
- <string name="compose_action" msgid="4045702519637388045">"Skryf"</string>
- <string name="search_action" msgid="6325101454876682308">"Soek"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Rekeninginstellings"</string>
- <string name="settings_action" msgid="6334807007967459412">"Instellings"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Sinkroniseeropsies"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Merk as ongelees"</string>
- <string name="move_action" msgid="3059189775933985898">"Skuif"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Voeg Cc/Bcc by"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Heg lêer aan"</string>
- <string name="close_action" msgid="533058985745238100">"Maak toe"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Stuur alle boodskappe"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Kies aanhegsel"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Skuif na"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Laai tans boodskappe…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Verbindingsprobleem."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Kon nie die boodskapteks laai nie. Die boodskap is dalk te groot om te bekyk."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Skuif boodskappe"</item>
- <item quantity="other" msgid="371256717624461324">"Skuif boodskappe"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Skuif word nie op POP3-rekeninge ondersteun nie."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Kan nie skuif nie, omdat keuse verskeie rekeninge bevat."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Boodskappe in Konsepte, Uitkassie en Gestuur kan nie geskuif word nie."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ongelees (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ongelees (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ongelees (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"in <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> rekeninge"</item>
- <item quantity="other" msgid="2723797835410343458">"in <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> rekeninge"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"aan <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> nuwe boodskappe"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Alle rekeninge"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> rekening"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> rekeninge"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Inkassie"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Uitkassie"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Konsepte"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Rommel"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Gestuur"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Rommel"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Ongelees"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Inkassie (ongelees)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Inkassie (almal)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Gekombineerde aansig (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> rekening"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> rekeninge"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Weergawe: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Inkassie"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Gester"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Konsepte"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Uitkassie"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Gekombineerde aansig"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Wys alle vouers"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Rekeninge"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Onlangse vouers (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Alle vouers"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Onlangse vouers"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Onderwerp"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Geen onderwerp"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Laai nog boodskappe"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> gekies"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> gekies"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Geen boodskappe nie"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Aan"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Onderwerp"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Van:"</string>
- <string name="to" msgid="4392614766835725698">"Aan"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Bcc"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Onderwerp"</string>
- <string name="body_hint" msgid="4279864165439577668">"Skryf e-pos"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Oorspronklike boodskap --------"\n"Onderwerp: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Van: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Aan: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> het geskryf:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Sluit aangehaalde teks in"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Sluit teks in"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Voeg ten minste een ontvanger by."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Sekere e-posadresse is ongeldig."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Lêer te groot om aan te heg."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Voer vinnige antwoord in"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> en <xliff:g id="NUMBER">%2$d</xliff:g> ander"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Aan:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Datum:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Van:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Onderwerp:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Kyk"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Installeer"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Speel"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Laai"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Inligting"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Stoor"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Gestoor"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stop"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Aanhegsel gestoor as <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Kon nie aanhegsel stoor nie."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Een of meer aanhegsels in jou aangestuurde boodskap sal afgelaai word voor dit gestuur word."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Boodskap"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Nooi uit"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Aanhegsel <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Aanhegsels <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Wys prente"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Wys altyd"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Wys altyd prente van hierdie sender"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Prente van hierdie sender sal outomaties gewys word."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Sien in kalender"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Kalender-uitnodiging"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Gaan jy?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Ja"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Miskien"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Nee"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Jy het hierdie uitnodiging aanvaar."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Jy het \"miskien\" geantwoord op hierdie uitnodiging"</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Jy het hierdie uitnodiging van die hand gewys."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Wys details"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Boodskapbesonderhede"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Aanhegsel-inligting"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Wi-Fi-verbinding vereis"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Wi-Fi-instellings"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Program-instellings"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Kan nie aanhegsel oopmaak nie."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Jy kan nie hierdie lêer stoor of oopmaak nie, want hierdie tipe aanhegsel kan kwaadwillige sagteware bevat."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Hierdie aanhegsel kan nie gestoor of oopgemaak word nie, weens hierdie rekening se sekuriteitsbeleid."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Hierdie aanhegsel is te groot om op \'n mobiele netwerk af te laai. Jy kan dit aflaai wanneer jy weer aan \'n Wi-Fi-netwerk gekoppel is."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Daar is geen geïnstalleerde program wat hierdie aanhegsel kan oopmaak nie. Probeer om \'n toepaslike program af te laai van Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Hierdie aanhegsel is \'n program. Jy moet \"Onbekende bronne\" in Instellings &gt; Programme kontroleer, voordat jy dit kan installeer."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Programme kan nie direk vanaf e-pos geïnstalleer word nie. Stoor eers hierdie program en installeer dit dan met behulp van die \"Aflaaisels\"-program."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Kon nie die aanhegsel aflaai nie."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Daar was \'n fout tydens die dekodering van die boodskap."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Kyk <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Vee hierdie boodskap uit?"</item>
- <item quantity="other" msgid="4437637377522896262">"Vee hierdie boodskappe uit?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Boodskap uitgevee."</item>
- <item quantity="other" msgid="6574961322865652255">"Boodskappe uitgevee."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Boodskap weggegooi."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Boodskap as konsep gestoor."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Kan nie aanhegsel wys nie."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Kon nie aanhegsel \"<xliff:g id="FILENAME">%s</xliff:g>\" laai nie."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Open tans boodskap..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> boodskap geskuif na <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> boodskappe geskuif na <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Kon een of meer aanhegsels nie aanstuur nie"</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Aanhegsel nie aangestuur nie"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> se aanmelding is onsuksesvol."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Kan nie aanmeld nie"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Nuwer"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Ouer"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Rekening-opstelling"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"E-posrekening"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Jy kan jou rekening in net \'n paar stappe opstel."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-posadres"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Wagwoord"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Stuur e-pos van hierdie rekening by verstek"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Handmatige opstelling"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Voer asseblief \'n geldige e-posadres en wagwoord in."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplikaatrekening"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Jy gebruik reeds hierdie gebruikernaam vir die rekening \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Die wagwoord begin of eindig met een of meer spasies. Baie bedieners ondersteun nie wagwoorde wat spasies bevat nie."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Haal tans rekeninginligting op…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Kontroleer tans inkomende bedienerinstellings…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Kontroleer tans uitgaande bedienerinstellings…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Rekening-opstelling"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Jou rekening is opgestel en die e-pos is op pad!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Gee hierdie rekening \'n naam (opsioneel)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Jou naam (staan op uitgaande boodskappe)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Hierdie veld kan nie leeg wees nie."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Rekening-opstelling"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Rekeningtipe"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Watter soort rekening is dit?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Rekening-opstelling"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Inkomende bedienerinstellings"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Gebruikernaam"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Wagwoord"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Bediener"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Poort"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Sekuriteitstipe"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Geen"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Aanvaar alle sertifikate)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (aanvaar alle sertifikate)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Vee e-pos uit op bediener"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Nooit"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Wanneer ek uit my inkassie uitvee"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP-pad-voorvoegsel"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Opsioneel"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Rekening-opstelling"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Instellings vir uitgaande bediener"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-bediener"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Poort"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Sekuriteitstipe"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Vereis aanmelding"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Gebruikernaam"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Wagwoord"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Rekening-opstelling"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Bedienerinstellings"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Bediener"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domein\\Gebruikernaam"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Gebruik veilige verbinding (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Aanvaar alle SSL-sertifikate"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Kliëntsertifikaat"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Kies"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Gebruik kliëntsertifikaat"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Verwyder"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Geen"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Mobiele toestel se ID"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Rekeninginstellings"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Rekeningopsies"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Kontroleer inkassie elke"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nooit"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Outomaties (stootpos)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Elke 5 minute"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Elke 10 minute"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Elke 15 minute"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Elke 30 minute"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Elke uur"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Stuur e-pos van hierdie rekening by verstek"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Laat my weet wanneer e-pos aankom"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sinkroniseer kontakte uit hierdie rekening"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sinkroniseer kalender uit hierdie rekening"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sinkroniseer e-pos uit hierdie rekening"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Laai aanhegsels outomaties af wanneer aan Wi-Fi gekoppel is"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Kon nie voltooi word nie"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dae om te sinkroniseer"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Outomaties"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Een dag"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Drie dae"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Een week"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Twee weke"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Een maand"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Alle"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Gebruik rekening se verstek"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Gebruikernaam of wagwoord verkeerd."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Gebruikernaam of wagwoord is verkeerd"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Kan nie veilig aan bediener koppel nie."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Kan nie veilig aan bediener koppel nie."\n"<xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"\'n Kliëntsertifikaat word vereis. Wil jy aan die bediener koppel met \'n kliëntsertifikaat?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Die sertifikaat is ongeldig of ontoeganklik."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Die bediener het gereageer met \'n foutboodskap. Kontroleer jou gebruikernaam en wagwoord, en herprobeer dan."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Kan nie aan bediener koppel nie."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Kan nie aan bediener koppel nie."\n"<xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS vereis, maar nie deur bediener ondersteun nie."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Stawingsmetodes word nie deur bediener ondersteun nie."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Kon nie verbinding met bediener open nie vanweë sekuriteitsfout."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Kon nie verbinding met bediener open nie."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Jy het \'n verkeerde bedieneradres ingevoer, of die bediener vereis \'n protokolweergawe wat nie deur e-pos ondersteun word nie."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Jy het nie toestemming om met hierdie bediener te sinkroniseer nie. Kontak jou bediener se administrateur vir meer inligting."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Afstand-sekuriteitsadministrasie"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Die bediener <xliff:g id="SERVER">%s</xliff:g> vereis dat jy dit toelaat om sekere sekuriteitskenmerke van jou Android-toestel afgeleë te beheer. Wil jy hierdie rekening klaar opstel?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Hierdie bediener vereis sekuriteitskenmerke wat jou Android-toestel nie ondersteun nie, insluitende: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Jy kan nie \'n rekening se gebruikernaam verander nie. Om \'n rekening met \'n ander gebruikernaam by te voeg, raak \"Voeg rekening by\"."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"LET WEL: Deaktivering van die e-posprogram se magtiging om jou toestel te administreer, sal alle e-posrekeninge wat dit benodig, uitvee, asook hul e-posse, kontakte, kalendergebeure en ander data."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Sekuriteitsopdatering"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> vereis dat jy jou sekuriteitsinstellings opdateer."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Rekening \"<xliff:g id="ACCOUNT">%s</xliff:g>\" kan nie gesinchroniseer word nie weens sekuriteitvereistes."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Rekening \"<xliff:g id="ACCOUNT">%s</xliff:g>\" vereis opdatering van sekuriteitsinstellings."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Rekening \"<xliff:g id="ACCOUNT">%s</xliff:g>\" het sy sekuriteitsinstellings verander; geen handeling deur die gebruiker is nodig nie."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Sekuriteitsopdatering vereis"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Sekuriteitsbeleide het verander"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Kan nie sekuriteitbeleid nakom nie"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Toestelsekuriteit"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Die bediener <xliff:g id="SERVER">%s</xliff:g> vereis dat jy dit toelaat om sekere sekuriteitskenmerke van jou Android-toestel afgeleë te beheer."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Redigeer details"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" vereis dat jy jou PIN of wagwoord vir skermslot verander."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Wagwoord vir skermslot verval"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Jou skermslot se PIN of wagwoord het verval."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Wagwoord vir skermslot het verval"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Wagwoord vir skermslot verval"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Jy moet jou skermslot-PIN of -wagwoord binnekort verander, anders sal die data vir <xliff:g id="ACCOUNT">%s</xliff:g> uitgevee word. Wil jy dit nou verander?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Wagwoord vir skermslot het verval"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Die data vir <xliff:g id="ACCOUNT">%s</xliff:g> word uit jou toestel gevee. Jy kan dit teruglaai deur jou skermslot-PIN of -wagwoord te verander. Wil jy dit nou verander?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Raak van ongestoorde veranderinge ontslae?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Kon nie aanmeld nie."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Die gebruikernaam of wagwoord vir <xliff:g id="ACCOUNT">%s</xliff:g> is verkeerd. Wil jy dit nou opdateer?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Verstek rekening"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Stuur e-pos by verstek vanaf hierdie rekening"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Laai aanhegsels af"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Laai outomaties aanhegsels van onlangse boodskappe via Wi-Fi af"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"E-poskennisgewings"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Sinkroniseerfrekwensie, kennisgewings, ens."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Stuur berig wanneer e-pos aankom"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Kontroleer inkassie elke"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Inkomende instellings"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Gebruikernaam, wagwoord en ander instellings vir inkomende bediener"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Uitgaande instellings"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Gebruikernaam, wagwoord en ander instellings vir uitgaandebediener-instellings"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Beleide toegepas"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Geen"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nie-ondersteunde beleide"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Geen"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Probeer sinkroniseer"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Raak hier om hierdie rekening te sinkroniseer"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Rekeningnaam"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Jou naam"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Handtekening"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Vinnige reaksies"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Redigeer teks wat jy gereeld invoeg wanneer jy e-pos skryf"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Las teks by die boodskappe wat jy stuur"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Kennisgewingsinstellings"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Datagebruik"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Sekuriteitsbeleide"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Redigeer vinnige antwoord"</string>
- <string name="save_action" msgid="1988862706623227093">"Stoor"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sinkroniseer kontakte"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sinkroniseer kontakte vir hierdie rekening"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sinkroniseer kalender"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sinkroniseer kalendergebeurtenis uit hierdie rekening"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sinkroniseer e-pos"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sinkroniseer e-pos vir hierdie rekening"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibreer"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibreer ook wanneer e-pos aankom"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Altyd"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Net wanneer stil"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Nooit"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibreer"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Kies \'n luitoon"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Bedienerinstellings"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Verwyder rekening"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Die rekening \"<xliff:g id="ACCOUNT">%s</xliff:g>\" sal uit E-pos verwyder word."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Verwyder rekening"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Verwyder rekening"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Sinkroniseeropsies"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Sinkroniseeropsies (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Sinkroniseer-instellings"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Kontroleer gereeldheid"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Dae om te sinkroniseer"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"E-posrekening"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Kies \'n rekening"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Kies \'n vouer"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Rekening is nie gevind nie. Dit is dalk verwyder."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Vouer nie gevind nie. Dit is dalk verwyder."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Slegs sekere \"Plus\"-rekeninge sluit POP-toegang in wat hierdie program in staat stel om te koppel. As jy nie kan aanmeld met jou korrekte e-posadres en wagwoord nie, het jy dalk nie \'n betaalde \"Plus\"-rekening nie. Maak die webblaaier oop om toegang tot hierdie e-posrekeninge te kry."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Voor jy hierdie e-posrekening opstel, besoek asseblief die T-Online-webwerf en skep \'n wagwoord vir POP3-e-postoegang."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Korporatief"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Kon nie die rekening skep nie. Probeer weer."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-pos"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Aktiveer bedienergespesifiseerde veiligheidsbeleide"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Deursoek tans <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> resultaat van <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultate van <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Instellings"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Algemene instellings"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Program"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Outovoortgaan"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Kies watter skerm moet wys nadat jy \'n boodskap uitgevee het"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Versteek merkblokkies"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Raak aan en hou om boodskappe uit lys te kies"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Bevestig voor uitvee"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Boodskappe"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Bevestig voor stuur"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Boodskappe"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Gaan voort na"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Nuwer boodskap"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Ouer boodskap"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Boodskaplys"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Grootte van boodskapteks"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Piepklein teks"</item>
- <item msgid="4415205108584620118">"Klein teks"</item>
- <item msgid="4550219696381691112">"Normale grootte teks"</item>
- <item msgid="6227813549949219991">"Groot teks"</item>
- <item msgid="1197917420815786571">"Baie groot teks"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Grootte van boodskapteks"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Piepklein"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Klein"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normaal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Groot"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Reusagtig"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Antwoord almal"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Maak \"Antwoord-aan-almal\" die verstek opsie vir boodskapantwoorde"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Vra om prente te wys"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Prente in boodskappe sal nie outomaties gewys word nie"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Wys prente\" uitgevee."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> van <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Wag vir sinkronisasie"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Jou e-posadres sal binnekort verskyn."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Raak ikoon om te verander."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Gekombineerde inkassie"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Ongelees"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Gester"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Laai tans…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Raak om op te stel"</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Jy het nog nie \'n e-posrekening opgestel nie."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Deursoek e-pos"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Soek <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Soekresultate vir \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Wag vir resultate"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Sommige bedieners neem \'n lang tyd."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Vouers"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Weier gebruik van die toestel se kamera"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Vereis toestelwagwoord"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Beperk die hergebruik van onlangse wagwoorde"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Vereis dat wagwoorde verval"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Vereis dat \'n ledige toestel sy skerm sluit"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Beperk die aantal kalendergebeurtenisse wat gesinchroniseer word"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Beperk die aantal e-posse wat gesinchroniseer word"</string>
- <string name="quick_1" msgid="3426057697353380951">"Dankie!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Klink vir my goed!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Ek sal dit later lees en jou antwoord."</string>
- <string name="quick_4" msgid="3988974084396883051">"Kom ons skeduleer \'n vergadering om dit te bespreek."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Agtergrond-sinkronisasie vir hierdie rekening is gedeaktiveer tydens swerwing."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Stuur tans antwoord..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Geen boodskappe nie."</string>
-</resources>
diff --git a/email2/res/values-af/uploader.xml b/email2/res/values-af/uploader.xml
deleted file mode 100644
index 904581f4c..000000000
--- a/email2/res/values-af/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Kitsoplaai"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Kitsoplaai-album"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Oplaai"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Klaar"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Laat wag"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d foto\'s • %3$d video\'s"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d foto\'s • %2$d video\'s"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"lae battery"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"fotokwota is oorskry"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"swerwing"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"wag vir Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"uitgestel tot gelaai word"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"wag vir verbinding"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"herprobeer oor %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Wys hangende oplaaisels"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Wys afgehandelde oplaaisels"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Sien aanlyn"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Wys hangende oplaaisels"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Versteek hangende oplaaisels"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Wys details"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Versteek details"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Instellings"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"%s opgelaai"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Rekening"</string>
- <string name="upload" msgid="2615541458361216022">"Laai op"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Kanselleer"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Laai op na "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" vir "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Oplaai-inisialisering het misluk."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Lêer nie beskikbaar nie"</string>
- <string name="account_error" msgid="1904775271866104941">"Kon nie rekeninginligting ophaal nie."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Daar was \'n probleem om by jou rekening aan te meld."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Wag om weer te probeer"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Wag vir WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Oplaai"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Misluk"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Afgehandel"</string>
- <string name="pause_state_running" msgid="711411177620353982">"oplaai"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"handmatig laat wag"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"laat wag - lae battery"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"laat wag - stel uit tot gelaai word"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"laat wag - wag vir verbinding"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"wag tans - PWA-kwota is op"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"laat wag - wag vir Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"laat wag - swerwend"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"wag om te herprobeer"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minuut"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minute"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minute"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Geen dataverbinding nie"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Rekening se skyfkwota is op"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Lêer nie gekry nie"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Diensfout"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Netwerkfout"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Stawing het misluk"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Hangende oplaaisels [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Afgehandelde oplaaisels [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Laat oplaaisels wag"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Hervat oplaaisels"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Laai nou op"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Laai later op"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Moenie oplaai nie"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Sien"</string>
- <string name="manager_retry" msgid="939534318469518843">"Herprobeer"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Oplaai gekanselleer"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Oplaai reeds afgehandel"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sinkroniseer almal"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Vorige sinkronisering:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Lys afgehandelde items is leeg."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Kitsoplaai"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Oplaaisels afgehandel"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Oplaaisels wagtend"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Kitsoplaai is nog nie geaktiveer nie"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Groot lêers sal net oor \'n WiFi-verbinding opgelaai word."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Skandeer tans vir lêers..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Berei tans <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> foto\'s en <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> video\'s voor vir oplaai..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Geen bykomende foto\'s/video\'s hoef opgelaai te word nie."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Kon nie met die bediener kommunikeer nie. Probeer later weer."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Sinkroniseer alle gekanselleer"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sinkroniseer almal"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Sien afgehandel"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Sien hangende"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Algemeen"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Laat wag alle oplaaisels"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Krag"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Laai net op wanneer die foon herlaai word."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Laai net op wanneer Wi-Fi beskikbaar is."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Foto\'s"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Rekening"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Oplaaivoorwaardes"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Fotogrootte"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Video\'s"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Rekening"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Die foto\'s-rekening sal gebruik word om video\'s op te laai."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Oplaaivoorwaardes"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Foto\'s se verbindingsinstellings word vir eers gebruik."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Net foto\'s via mobielnetwerke"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Foto\'s en video\'s via mobielnetwerke"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Foto\'s en video\'s net via Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Meer oor"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Kitsoplaai-weergawe"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Aanbevole: 1600 pixels (vir deling, druk en sluimerskerms)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Oorspronklike grootte (stadigste oplaai)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"wag tans - SD-kaart nie beskikbaar nie"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD-kaart onbeskikbaar"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Kitsoplaai-instellings"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Kitsoplaai"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Laai outomaties nuwe foto\'s en video\'s na \'n private webalbum op"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Oplaaistatus"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Gevorderd"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Mobieloplaaisels"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Swerfoplaaisels"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Laai foto\'s en video\'s op wanneer swerf op datanetwerk"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Battery-oplaaisels"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Laai foto\'s en video\'s op net terwyl battery laai"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Laai bestaande foto\'s op"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Laai nou enige bestaande foto\'s en video\'s van jou foon af op"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Gedeaktiveer"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Laai (%1$d%%) op"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d of %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Wag tans: raak om oplaai te hervat"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Laai bestaande foto\'s op"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Om foto\'s en video\'s op te laai wat nog nie van jou foon na \'n private album op die web opgelaai is nie, kan \'n rukkie neem, maar sal in die agtergrond gedoen word. Is jy seker jy wil voortgaan?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Ja"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Nee"</string>
-</resources>
diff --git a/email2/res/values-am/strings.xml b/email2/res/values-am/strings.xml
deleted file mode 100644
index f38cbcd38..000000000
--- a/email2/res/values-am/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"የኢሜይል ዓባሪዎችን አንብብ"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"የኢሜይል አባሪዎችህን እንዲያነብ ለመተግበሪያ ይፈቅዳል።"</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"የኢሜይል አቅራቢ ውሂብ ድረስ።"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">" የኢሜይል የውሂብ ጎታህን፣ የደረሱ መልዕክቶች፣ የተላኩ መልዕክቶች፣ ተጠቃሚ ስሞች እና የይለፍ ቃሎችን ጨምሮ ለመድረስ ለመተግበሪያ ይፈቅዳል።"</string>
- <string name="app_name" msgid="5815426892327290362">"ኢሜይል"</string>
- <string name="compose_title" msgid="427986915662706899">"ፅሁፍ አዘጋጅ"</string>
- <string name="debug_title" msgid="5175710493691536719">"አርም"</string>
- <string name="next_action" msgid="3931301986364184415">"ቀጥል"</string>
- <string name="okay_action" msgid="8365197396795675617">"እሺ"</string>
- <string name="cancel_action" msgid="6967435583794021865">"ይቅር"</string>
- <string name="previous_action" msgid="5181616311579820981">"ቀዳሚ"</string>
- <string name="send_action" msgid="1729766205562446418">" ላክ"</string>
- <string name="reply_action" msgid="4262472229221507619">"መልስ"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"ለሁሉም ምላሽ ስጥ"</string>
- <string name="delete_action" msgid="8421026208288857155">"ሰርዝ"</string>
- <string name="forward_action" msgid="669174181042344116">"አስተላልፍ"</string>
- <string name="favorite_action" msgid="4664259801498253756">"ኮከብ"</string>
- <string name="done_action" msgid="7497990549515580249">"ተከናውኗል"</string>
- <string name="create_action" msgid="3062715563215392251">"አዲስ ፍጠር"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"ሰርዝ"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"ምንም ፈጣን ምላሾች የሉም።"</string>
- <string name="discard_action" msgid="6532206074859505968">"አስወግድ"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"ረቂቅ አስቀምጥ"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"ፈጣን ምላሽ አስገባ"</string>
- <string name="read_action" msgid="4701484794504781686">"ተነቧል ምልክት"</string>
- <string name="unread_action" msgid="6280399049357552826">"እንዳልተነበበ ምልክት አድርግ"</string>
- <string name="set_star_action" msgid="4660317166196258160">"ኮከብ አክል"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"ኮከብ አስወግድ"</string>
- <string name="refresh_action" msgid="5951383001436708175">"አድስ"</string>
- <string name="add_account_action" msgid="8835736309476033727">"መለያ አክል"</string>
- <string name="compose_action" msgid="4045702519637388045">"ፅሁፍ አዘጋጅ"</string>
- <string name="search_action" msgid="6325101454876682308">" ፈልግ"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"መለያ ቅንብሮች"</string>
- <string name="settings_action" msgid="6334807007967459412">"ቅንብሮች"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"የማመሳሰል አማራጮች"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"እንዳልተነበበ ምልክት አድርግ"</string>
- <string name="move_action" msgid="3059189775933985898">"አንቀሳቅስ"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ካርቦን ቅጂ/ስውር ቅጂ"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"ካርቦን ቅጂ (ካቅ) / ስውር ቅጂ አክል"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"ፋይል አያይዝ"</string>
- <string name="close_action" msgid="533058985745238100">"ዝጋ"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"ሁሉንም መልዕክቶች ላክ"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"አባሪ ምረጥ"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"አንቀሳቅስ ወደ"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"መልዕክቶች በመስቀል ላይ..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"የግንኙነት ችግር::"</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"የፅሁፍ መልዕክት መጫን አልተቻለም። ምናልባት መልዕክቱን ለማየት ከልክ በላይ ትልቅ ይሆናል።"</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"መልዕክት አንቀሳቅስ"</item>
- <item quantity="other" msgid="371256717624461324">"መልዕክቶች አንቀሳቅስ"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"አንቀሳቅስ በPOP3 መለያዎች የሚደገፍ አይደለም።"</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"ምርጫው ብዙ መለያዎች ስለያዘ ማንቀሳቀስ አልተቻለም።"</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"በረቂቅ ውስጥ፣ የወጪ መልእክት ሳጥን እና የተላኩ መልዕክቶች መንቀሳቀስ አይችሉም።"</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ያልተነበበ (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ያልተነበበ (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ያልተነበበ (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"በ<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g>መለያ ውስጥ"</item>
- <item quantity="other" msgid="2723797835410343458">"በ<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g>መለያ ውስጥ"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"ወደ <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> አዲስ መልዕክቶች።"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"ሁሉም መለያዎች"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>መለያ"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> መለያዎች"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"ገቢ መልእክት"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"የወጪ መልዕክት ሳጥን"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"ረቂቆች"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"ጣል"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"ላከ"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"አላስፈላጊ መልዕክት"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"ያልተነበበ"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"ገቢ መልዕክት( ያልተነበበ)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"ገቢ መልዕክት(ሁሉም)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"የተቀላቀለዕይታ (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g>መለያ"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> መለያዎች"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"ሥሪት፡<xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"ገቢ መልእክት"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"ኮከብ የተደረገባቸው"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"ረቂቆች"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"የወጪ መልዕክት ሳጥን"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"የተቀላቀለዕይታ"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"ሁሉንም አቃፊዎች አሳይ"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"መለያዎች"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"የቅርብ ጊዜ አቃፊዎች(<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"ሁሉም አቃፊዎች"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"የቅርብ ጊዜ አቃፊዎች"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"ርዕሰ ጉዳዩ"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"አርዕስት አልባ"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"ተጨማሪ መልዕክቶች ስቀል"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> የተመረጡ"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> የተመረጡ"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"መልዕክቶች የሉም።"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"ወደ"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"ካርቦን ቅጂ"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"ስውር ቅጂ"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"ርዕሰ ጉዳይ"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"ከ፡"</string>
- <string name="to" msgid="4392614766835725698">"ለ"</string>
- <string name="cc" msgid="7017720927911078193">"ካርቦን ቅጂ"</string>
- <string name="bcc" msgid="3098643138241111579">"ስውር ቅጂ"</string>
- <string name="subject_hint" msgid="7253964583324677128">"ርእሰ ጉዳይ"</string>
- <string name="body_hint" msgid="4279864165439577668">"ኢሜይል ፃፍ"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"----------- ዋና መልዕክት---------"\n"ጉዳዩ፡<xliff:g id="SUBJECT">%1$s</xliff:g>"\n" ከ፡<xliff:g id="SENDER">%2$s</xliff:g>"\n"ለ፡<xliff:g id="TO">%3$s</xliff:g>"\n"<xliff:g id="CC_0">%4$s</xliff:g>"\n" ካርቦን ቅጂ፡"\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>ፃፈ፡"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"የተጠቀሰ ጽሁፍ አካትት"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"ፅሁፍ አካት"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"እባክህን ቢያንስ አንድ ተቀባይ አክል።"</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"አንዳንድ ኢሜይል አድራሻዎች ትክክል አይደሉም።"</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"የፋይል መጠንለማያያዝ በጣም ትልቅ ነው።"</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"ፈጣን ምላሽ አስገባ"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> እና <xliff:g id="NUMBER">%2$d</xliff:g> ሌሎች"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"ለ:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"ካርቦን ቅጂ"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"ስውር ቅጂ፡"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"ቀን፡"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"ከ፡"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"ርዕሰ ነገር:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"ዕይታ"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"ጫን"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"ተጫወት"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"ስቀል"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"መረጃ"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"አስቀምጥ"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"ተቀምጧል"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"ቁም"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"አባሪ እንደ <xliff:g id="FILENAME">%s</xliff:g> ተቀምጧል።"</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"ዓባሪውን ማስቀመጥ አልተቻለም።"</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"በሚተላለፈው መልዕክትህ ውስጥ አንድ ወይም ተጨማሪ አባሪዎች ከመላኩ አስቀድሞ ይወርዳሉ።"</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"መልዕክት"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"ጋብዝ"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"አባሪ <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"አባሪዎች <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"ፎቶዎች አሳይ"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"ሁልጊዜ አሳይ"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"ሁልጊዜ ከዚህ ላኪ ፎቶዎችን አሳይ"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"የዚህ ላኪ ፎቶዎች በራስ ሰር ይታያሉ።"</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"የቀን መቁጠሪያ ውስጥ እይ"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"የቀን መቁጠሪያ ግብዣ"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"እየሄደ ነው?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" አዎ"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" ምናልባት"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" አይ"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"ይህን ግብዣ ተቀብለሃል::"</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"ለዚህ ግብዣ \"ምናልባት\" ብለህ መልስ ሰጥተሃል።"</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"ይህን ግብዣ ውድቅ አድርገኸዋል::"</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"ዝርዝሮቹን አሳይ"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"የመልዕክት ዝርዝሮች"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"የአባሪ መረጃ"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"የWi-Fi ተያያዥ ይጠበቃል"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"የWi-Fi ቅንብሮች"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"መተግበሪያ ቅንብሮች"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"አባሪ መክፈት አልተቻለም።"</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"እንዲህ ዓይነቱ ዓባሪ ተንኮል አዘል ሶፍትዌር ሊይዝ ስለሚችል ይህን ፋይል ማስቀመጥ ሆነ መክፈት አትችልም::"</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"በዚህ መለያ የደህንነት ቋሚ መመሪያዎች የተነሳ ይህ ዓባሪ ሊቀመጥ ሆነ ሊከፈት አይችልም::"</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"ይህ አባሪ በተንቀሳቃሽ ስልክ አውታረመረብ ላይ ለማውረድ በጣም ትልቅ ነው። ቀጥሎ ወደWi-Fi አውታረመረብ ሲያያዝ ማውረድ ይችላሉ።"</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"ይህን ዓባሪ መክፈት የሚችል ምንም የተገጠመ መተግበሪያ የለም:: ከAndroid Market ተገቢነት ያለውን መተግበሪያ ለማውረድ ሞክር::"</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"ይህ ዓባሪ መተግበሪያ ነው:: መጫን ከመቻልህ በፊት በቅንጅቶች &gt; መተግበሪያዎች ላይ ያልታወቁ ምንጮች የሚለው ላይ ምልክት ማድረግ አለብህ::"</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"መተግበሪያ ከኢሜይል በቀጥታ ሊጫን አይችልም:: በመጀመሪያ ይህን መተግበሪያ አስቀምጠውና በመቀጠል መተግበሪያ አውርዶችን በመጠቀም ጫነው::"</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"ዓባሪውን ማውረድ አልተቻለም::"</string>
- <string name="message_decode_error" msgid="5016042255170947834">"መልዕክቱን በማመሳጠር ላይ ስህተት ነበር::"</string>
- <string name="eml_view_title" msgid="8827210108543430336">"በዕይታ ላይ፡<xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"ይህን መልዕክት ሰርዝ?"</item>
- <item quantity="other" msgid="4437637377522896262">"እነዚህን መልዕክቶች ሰርዝ?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"መልዕክት ተሰርዟል።"</item>
- <item quantity="other" msgid="6574961322865652255">"መልዕክቶች ተሰርዘዋል።"</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"መልዕክት ተወግዷል።"</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"መልዕክትእንደረቂቅ ተቀምጧል።"</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"ዓባሪውን ማሳየት አይቻልም::"</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"ዓባሪ \" <xliff:g id="FILENAME">%s</xliff:g>\"ን መስቀል አልተቻለም::"</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"መልዕክት በመክፈት ላይ...."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> መልዕክት ወደ<xliff:g id="MAILBOX_NAME">%2$s</xliff:g> ዞርዋል"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g>መልዕክቶች ወደ <xliff:g id="MAILBOX_NAME">%2$s</xliff:g> ዞረዋል"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"አንድ ወይም ከዛ በላይ ዓባሪዎችን ለማስተላለፍ አልተቻለም::"</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"አባሪ አልተላለፈም"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> በመለያ መግባት አልተሳካም።"</string>
- <string name="login_failed_title" msgid="7624349996212476176">"በመለያ መግባት አልተቻለም፡፡"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"በጣም አዲስ"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"የድሮ"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"መለያ አዘጋጅ"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"የኢሜይል መለያ"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"መለያህን በጥቂት ደረጃዎች ብቻ ማዋቀር ትችላለህ።"</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"ኢሜይል አድራሻ"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"የይለፍ ቃል፡"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"ከዚህ መለያ በነባሪ ኢሜይል ላክ"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"በእጅ አዘጋጅ"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"እባክህ ትክክለኛ ኢሜይል አድራሻ እና ይለፍ ቃል ፃፍ።"</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"ተመሳሳይ መለያ"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"ለመለያ \"<xliff:g id="DUPLICATE">%s</xliff:g>\" ይህን ተጠቃሚ ስም ቀደም ሲል እየተጠቀምክበት ነው::"</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"ይህ ይለፍ ቃል በአንድ ወይም ከዛበላይ ቁምፊዎች ይጀምራል ወይም ይጨርሳል። አብዛኛው አገልጋዮች ይልፍ ቃሎችን ከባዶ ቦታዎች ጋር አይደግፉም።"</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"የመለያ መረጃ ሰርስሮ በማውጣት ላይ..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"የገቢ አገልጋይ ቅንብሮች በመመልከት ላይ...."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"የወጪ አገልጋይ ቅንብሮች በመመልከት ላይ...."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"መለያ አዘጋጅ"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"መለያህ ተዋቅሯል፣ ኢሜይልህም መንገድ ላይ ነው!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"ለዚሀመለያ ስም ስጥ(አማራጭ)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"ስምዎ(በወጪ መልዕክቶች ላይ አሳይቷል)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"ይህ መስክ ባዶ መሆን አይችልም።"</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"መለያ አዘጋጅ"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"መለያ አይነት"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"ይህምንአይነት መለያ ነው?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"መለያ አዘጋጅ"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"የገቢ አገልጋይ ቅንብሮች"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"የተጠቃሚ ስም"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"የይለፍ ቃል"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"አገልጋይ"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"ወደብ"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"የደህንነትአይነት"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"አንዱም"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (ሁሉንም ምስክሮች ተቀበል)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (ሁሉንም ምስክሮች ተቀበል)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"ኢሜልል ከአገልጋይ ሰርዝ"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"በፍፁም"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"ከገቢ መልዕክት ውስጥ ስሰርዘው"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"የIMAP ቅድመ ቅጥያዱካ"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"አማራጭ"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"መለያ አዘጋጅ"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"የወጪ አገልጋይ ቅንብሮች"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"የSMTP አገልጋይ"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"ወደብ"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"የደህንነትአይነት"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"ከፍቶ መግባት ይፈልጋል"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"የተጠቃሚ ስም"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"የይለፍ ቃል"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"መለያ አዘጋጅ"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"የአገልጋይ ቅንብሮች"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"አገልጋይ"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"ጎራ\\የተጠቃሚስም"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"ጥብቅ ተያያዥነት(SSL) ተጠቀም"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"ሁሉንም SSL ምስክርተቀበል"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"የደንበኛ ምስክር ወረቀት"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"ምረጥ"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"የደንበኛ ዕውቅና ማረጋገጫ ተጠቀም"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"አስወግድ"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"የለም"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"የተንቀሳቃሽ መሣሪያ መታወቂያ"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"መለያ ቅንብሮች"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"የመለያ አማራጮች"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"የገቢ መልዕክት ምልከታ ድግግሞሽ"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"በፍፁም"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"ራስሰር(ግፋ)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"በየ5 ደቂቃዎቹ"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"በየ10 ደቂቃዎቹ"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"በየ15 ደቂቃዎቹ"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"በየ30 ደቂቃዎቹ"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"በየሰዓቱ"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"ከዚህ መለያ በነባሪ ኢሜይል ላክ"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"ኢሜይል ሲደርስ አሳውቀኝ"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"ከዚህ መለያ ዕውቂያዎች አመሳስል"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"ከዚህ መለያ የቀን አቆጣጠር አመሳስል"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"ከዚህ መለያ ኢሜይል አመሳስል"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"ወደ Wi-Fi ስትገናኝ አባሪዎችን በራስ ሰር አውርድ"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"ማጠናቀቅ አልተቻለም"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"ቀኖች አሳምር"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"ራስ ሰር"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"አንድ ቀን"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"ሦስት ቀን"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"አንድ ሳምንት"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"ሁለት ሳምንቶች"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"አንድ ወር"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"ሁሉም"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"የመለያ ነባሪ ተጠቀም"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"ተጠቃሚ ስም ወይም ይለፍ ቃል የተሳሳተ ነው።"</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"የተጠቃሚው ስም ወይም ይለፍ ቃል የተሳሳተ ነው። "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"ወደ አገልጋዩ በሰላም ማገናኘት አልተቻለም።"</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"ወደ አገልጋዩ በሰላም ማገናኘት አልተቻለም።"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"የተገልጋይ ሰርቲፊኬት ያስፈልጋል። በተገልጋይ ሰርቲፊኬት ወደ አገልጋይ መገናኘት ትፈልጋለህ?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"የዕውቅና ማረጋገጫው ልክ ያልሆነ ወይም ተደራሽ ያልሆነ ነው።"</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"አገልጋዩ ከስህተት ጋር መልሷል፤ የተጠቃሚ ስምህን እና የይለፍ ቃልህን ተመልከት እና እንደገና ሞክር።"</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"ወደ አገልጋይ መገናኘት አይቻልም።"</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"ወደ አገልጋዩ ማገናኘት አይችልም።"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS ይጠየቃል ነገር ግን በአገልጋይ አይደገፍም።"</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"የማረጋገጫ ዘዴዎች በአገልጋዩ አይደገፉም።"</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"በደህንነት ስህተት ምክንያት ወደ አገልጋይ ያለ ግንኙነት መክፈት አልተቻለም::"</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"ከአገልጋይ ጋር ግንኙነት መክፈት አልተቻለም::"</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"የተሳሳተ የአገልጋይ አድራሻ አስገብተሃል ወይም አገልጋዩ ኢሜይሉ የማይደግፈው የፕሮቶኮል ሥሪት ይጠይቃል።"</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"ከዚህ አገልጋይ ጋር ለአስምር ፈቃድ የለህም። እባክህ ለተጨማሪ መረጃ የአገልጋዮን አስተዳዳሪ አግኝ።"</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"የሩቅ አስተዳደር ደህንነት"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"<xliff:g id="SERVER">%s</xliff:g>አገልጋይየAndroid መሣሪያዎ አንዳንድ ገፅታዎች በርቀት ለመቆጣጠር እንዲፈቅዱ ይጠይቃል። ይህን መለያ ጨርሰው ለማቀናበር ይፈልጋሉ?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"ይህ አገልጋይ የአንተ Android መሣሪያ የማይደግፈው የደህንነት ገፅታዎችን ይጠይቃል፣<xliff:g id="ERROR">%s</xliff:g> ጨምሮ።"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"የመለያውን ተጠቃሚ ስም መለወጥ አትችልም። መለያውን በተለየ ተጠቃሚ ስም ለማከል መለያ አክል ንካ።"</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"ማስጠንቀቂያ፣ መሣሪያህን ለማስተዳደር የኢሜይል ትግበራዎችን ኃላፊነት ማቦዘን የሚጠይቁትን ሁሉ የኢሜይል መለያዎች ከኢሜይል፣ ዕውቂያዎች፣ ቀን መቁጠሪያ ክስተቶች፣ እና ሌላ ውሂብ ጋር አብሮ ይሰርዛል።"</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"ደህንነት ዝማኔ"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> የደህንነት ቅንጅቶችህን ማዘመን ይጠይቅሃል።"</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"በደህንነት ጥያቄዎች ምክንያት መለያ «<xliff:g id="ACCOUNT">%s</xliff:g>» ሊመሳሰል አልቻለም።"</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"መለያ \"<xliff:g id="ACCOUNT">%s</xliff:g>\" የደህንነት ቅንብሮችን ማዘመን ይጠይቃል።"</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"መለያ<xliff:g id="ACCOUNT">%s</xliff:g> የደህንነት ቅንብሮቹን ለውጧል፤ምንም የተጠቃሚ እርምጃ አይጠበቅም፡፡"</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"የደህንነት አዘምን ይጠበቃል"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"የደህንነት ቋሚ መመሪያዎች ተለውጠዎል"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"የደህንነት ቋሚ መመሪያዎች ሊሟሉ አይችሉም"</string>
- <string name="account_security_title" msgid="3511543138560418587">"የመሣሪያ ደህንነት"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"<xliff:g id="SERVER">%s</xliff:g> አገልጋይየAndroid መሣሪያዎ አንዳንድገፅታዎች በርቀት ለመቆጣጠር እንዲፈቅዱ ይጠይቃል። ይህን መለያ ጨርሰው ለማቀናበር ይፈልጋሉ?"</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"ዝርዝሮችን አርትዕ"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"<xliff:g id="ACCOUNT">%s</xliff:g> የማያ መቆለፊያ ፒን ወይም ይለፍ ቃል መለወጥን ይጠይቃል።"</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"የማያ ቆልፍ ይለፍ ቃል ጊዜው እያለፈነው"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"የእርስዎ የማያመቆለፊያ PIN ወይም ይለፍ ቃል ጊዜው አልፏል።"</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"የማያ ቆልፍ ይለፍ ቃል ጊዜው አልፏል"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"የማያ ቆልፍ ይለፍ ቃል ጊዜው እያለፈነው"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"በቅርቡ የማሳያህ ቆልፍ ፒን ወይም የይለፍ ቃል መለወጥ ያስፈልግሃል፤ አለበለዚያ የ<xliff:g id="ACCOUNT">%s</xliff:g> ውሂብ ይሰረዛል። አሁን እንዲለወጥ ትፈልጋለህ?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"የማያ ቆልፍ ይለፍ ቃል ጊዜው አልፏል"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"የ<xliff:g id="ACCOUNT">%s</xliff:g> ውሂብ ከመሳሪያህ ላይ እየተሰረዘ ነው። የማያ መቆለፊያ PIN ወይም ይለፍ ቃል በመለወጥ እነበረበት መመለስ ትችላለህ። አሁን መለወጥ ትፈልጋለህ?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"ያልተቀመጠ ለውጦችን ይወገዱ?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"በመለያ መግባት አልተቻለም፡፡"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"የ<xliff:g id="ACCOUNT">%s</xliff:g> የተጠቃሚው ስም ወይም ይለፍ ቃል የተሳሳተ ነው። አሁን ልታዘምናቸው ትፈልጋለህ?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"ነባሪ መለያ"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"ከዚህ መለያ በነባሪኢሜይል ላክ"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"አባሪዎችን አውርድ"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"ራስሰር-አውርድ አባሪዎች ወደ በቅርብ ጊዜ በWi-Fi የተላኩ መልዕክቶች"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"የኢሜይል ማሳወቂያ"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"ድግግሞሽ፣ ማሳወቂያዎች፣ ወዘተ አሳምር።"</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"ኢሜይል ሲመጣ ማሳወቂያ አሳይ"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"የገቢ መልዕክት ምልከታ ድግግሞሽ"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"የገቢ ቅንብሮች"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"የተጠቃሚ ስም፣ ይለፍቃል፣ እና ሌላ የገቢ አገልጋይ ቅንብሮች"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"የወጪ ቅንብሮች"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"የተጠቃሚ ስም፣ ይለፍቃል፣ እና ሌላ የወጪ አገልጋይ ቅንብሮች"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"ቋሚ መመሪያዎችን አስገድድ"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"ምንም"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"ያልተደገፉ ቋሚ መመሪያዎች"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"ምንም"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"ማመሳሰል ሞክር"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"ይህን መለያ ለማመሳሰል እዚጋ ንካ"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"የመለያ ስም"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"ስምዎ"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"ፊርማ"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"ፈጣን ምላሾች"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"ኢሜይል ስትጽፍ በተደጋጋሚ የምታስገባውን ፅሁፍ አርትዕ አድርግ"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"ወደ ሚልኩት መለልዕክቶች ፅሁፍ ይጨምሩ"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"የማሳወቂያ ቅንብሮች"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"የውሂብ አጠቃቀም"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"የደህንነት ቋሚ መመሪያዎች"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"ፈጣን ምላሽ አርትዕ"</string>
- <string name="save_action" msgid="1988862706623227093">"አስቀምጥ"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"ዕውቂያዎች አሳምር"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"ለዚህ መለያ እውቂያዎች አሳምር"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"የቀን አቆጣጠር አሳምር"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"ለዚህ መለያ የቀን መቁጠሪያ ክስተት አመሳስል"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"ኢሜይል አመሳስል"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"ለዚህ መለያ ኢሜይል አሳምር"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"ንዘር"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"ኢሜይል ሲደርስ እንዲሁ ንዘር"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"ዘወትር"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"ፀጥታ ሲሆን ብቻ"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"በፍፁም"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"ንዘር"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"የደወል ቅላጼ ምረጥ"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"የአገልጋይ ቅንብሮች"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"መለያ አስወግድ"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"መለያው \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ከኢሜይል ይወገዳል።"</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"መለያ አስወግድ"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"መለያ አስወግድ"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"አሳምር አማራጮች"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"የ(<xliff:g id="MAILBOXX_NAME">%s</xliff:g>) አሳምር አማራጮች"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"ቅንብሮች አስምር"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"ድግግሞሽ ተመልከት"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"ቀኖች ለአሳምር"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"የኢሜይል መለያ"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"መለያ ምረጥ"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"አቃፊ ምረጥ"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"መለያ አልተገኘም። ተወግዶ ሊሆን ይችላል።"</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"አቃፊ አልተገኘም። ተወግዶ ሊሆን ይችላል።"</string>
- <string name="provider_note_live" msgid="2995297671709325333">"ጥቂት \"Plus\" መለያዎች ይህን ፕሮግራም ለማገናኘት ብቻ የPOP ድረስ ያካትታሉ። ከትክክለኛ ኢሜይል አድራሻህ እና የይለፍ ቃልህን ማስገባት ካልቻልክ የተከፈለበት የ\"Plus\" መለያ ሊኖርህ አይችልም። እባክህ ወደ እነዚህ የመልዕክት መለያዎች መዳረሻ ለማግኘት የድረ አሳሹን አስነሳ።"</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"ይህን ኢሜይል ከመፍጠርህ በፊት፣ የT-Online ድረ ጣቢያን ጎብኝ እና ለPOP3 ኢሜይል ለመድረስ ይለፍ ቃል ፍጠር።"</string>
- <string name="exchange_name" msgid="1190783774800310346">"ኮርፖሬት"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"የማይክሮሶፍት Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"መለያውን መፍጠር አልቻለም:: እባክህ እንደገና ሞክር።"</string>
- <string name="device_admin_label" msgid="8680224994637869414">"ኢሜይል"</string>
- <string name="device_admin_description" msgid="426727923791430306">"በአገልጋይ-የተገለፁ የደህንነት ፖሊሲዎች አንቃ"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"በመፈለግ ላይ<xliff:g id="DOMAIN">%s</xliff:g>..."</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g>ውጤት ከ<xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g>ውጤቶች ከ<xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"ቅንብሮች"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"ጠቅላላ ቅንብሮች"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"መተግበሪያ"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"ራስ- ላቅ"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"መልዕክት ከሰረዝክ በኋላ በየትኛው ማያ ለማሳየት እንደምትፈልግ ምረጥ።"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"ኣመልካች ሳጥኖች ደብቅ"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"በመልዕክቶች ዝርዝሮች ውስጥ ለመምረጥ ንካና ያዝ"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"ከመሰረዝህ በፊት አረጋግጥ"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"መልእክቶች"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"ከመላክህ በፊት አረጋግጥ"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"መልእክቶች"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"ለ የላቀ"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"በጣም አዲስ መልዕክት"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"በጣም የድሮ መልዕክት"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"የመልዕክት ዝርዝር"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"የመልዕክት ፅሁፍ መጠን"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"ደቃቃ ጽሑፍ"</item>
- <item msgid="4415205108584620118">"ትንሽ ጽሑፍ"</item>
- <item msgid="4550219696381691112">"መደበኛ-ምጣኔ ገጽታ ያለው ጽሑፍ"</item>
- <item msgid="6227813549949219991">"ትልቅ ፅሁፍ"</item>
- <item msgid="1197917420815786571">"ግዙፍ ጽሑፍ"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"የመልዕክት ፅሁፍ መጠን"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"ትንሽ"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"አነስተኛ"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"መደበኛ"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"ትልቅ"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"ግዙፍ"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"ለሁሉም ምላሽ ስጥ"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"“ለሁሉም መልስ”ን ለመልዕክት መልሶች ነባሪ አድርግ"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"ስዕሎችን ለማሳየት ጠይቅ"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"በመልዕክቶች ውስጥ ስዕሎች በራስሰር አይታዩም፡፡"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"ፎቶዎች አሳይ\" ጠርቷል።"</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> ከ <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"አስምር በመጠበቅ ላይ"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"የአንተ ኢሜይል በቅርቡ ብቅ ይላል::"</string>
- <string name="widget_other_views" msgid="4988574907386539499">"ለመለወጥ አዶ ንካ::"</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"የተቀላቀለ ገቢ መልዕክት"</string>
- <string name="widget_unread" msgid="4404711399009077833">"ያልተነበበ"</string>
- <string name="widget_starred" msgid="8290352707134011791">"ኮከብ የተደረገባቸው"</string>
- <string name="widget_loading" msgid="2340962056927255554">"በመስቀል ላይ…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"ለማዘጋጀት ንካ::"</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"የኢሜይል መለያ ገና አላዋቀሩም።"</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"ኢሜይል ፈልግ"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"<xliff:g id="ID_1">%1$s</xliff:g> ፈልግ"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"ለ፡\"<xliff:g id="ID_1">%1$s</xliff:g>\"ውጤቶችንፈልግ"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"ውጤቶችን በመጠበቅ ላይ"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"አንዳንድ አገልጋዮች ረጅም ጊዜ ሊወስዱ ይችላሉ።"</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"አቃፊዎች"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"የመሳሪያውን ካሜራ መጠቀምን አትፍቀድ"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"የመሳሪያ የይለፍ ቃል ጠይቅ"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"የቅርብ የይለፍ ቃሎችን ዳግመኛ መጠቀምን ከልክል"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"የይለፍ ቃሎች ጊዜያቸው እንዲያልፍባቸው ይፈልጋል"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"ስራ የፈታን መሳሪያ ማሳያውን እንዲቆልፍ ይጠብቃል"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"የሚመሳሰሉ የቀን መቁጠሪያ ክስተቶችን ቁጥር ወሰን አድርግ"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"የሚመሳሰሉ ኢሜይሎችን ቁጥር ወሰን አድርግ"</string>
- <string name="quick_1" msgid="3426057697353380951">"እናመሰግናለን!"</string>
- <string name="quick_2" msgid="4188036352885736617">"ለኔ ጥሩ ይመስላል!"</string>
- <string name="quick_3" msgid="8061819976353395585">"በኋላ ይሄንን አነባለው እና ወደ አንተ እመለሳለሁ፡፡"</string>
- <string name="quick_4" msgid="3988974084396883051">"ስብሰባ እናዘጋጅ እስቲ ይሄንን ለመወያየት፡፡"</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"ውጫዊ አገልግሎት በማድረግ ጊዜ የዳራ ማመሳሰል ለዚህ መለያ ቦዝኗል፡፡"</string>
- <string name="confirm_response" msgid="5747902757569543165">"ምላሽ በመላክ ላይ..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"መልዕክቶች የሉም።"</string>
-</resources>
diff --git a/email2/res/values-am/uploader.xml b/email2/res/values-am/uploader.xml
deleted file mode 100644
index 6ec5625af..000000000
--- a/email2/res/values-am/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"በፍጥነት ስቀል"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"በፍጥነት አልበም ስቀል"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"በመስቀል ላይ"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"ጨርሷል"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"ለአፍታ ቆሟል"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %1$d ፎቶዎች • %2$d ቪዲዮዎች"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d ፎቶዎች • %2$d ቪዲዮዎች"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"አነስተኛ ባትሪ"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"የፎቶዎች ኮታ በዝቷል"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"በመንቀሳቀስ ላይ"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"WiFi በመጠበቅ ላይ"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"ኃይል እስኪሞላ ድረስ ዘግይቷል"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"ተያያዥ በመጠበቅ ላይ"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"በ%s ድጋሚ በመሞከር ላይ"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"በይደር ያሉ ስቀሎች አሳይ"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"ያለቁ ስቀሎች አሳይ"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"መስመር ላይ እይ"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"በይደር ያሉ ስቀሎች አሳይ"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"በይደር ላይ ያሉ ስቀሎችን ደብቅ"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"ዝርዝሮች አሳይ"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"ዝርዝሮች ደብቅ"</string>
- <string name="menu_settings" msgid="5088116127086866634">"ቅንብሮች"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"%s ተሰቅሏል"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"መለያ"</string>
- <string name="upload" msgid="2615541458361216022">"ስቀል"</string>
- <string name="ok" msgid="2516349681897895312">"እሺ"</string>
- <string name="cancel" msgid="1207103189404543868">"ይቅር"</string>
- <string name="uploading_to" msgid="3986362895940069510">"ወደ"<b>"%s"</b>" መስቀል"</string>
- <string name="uploading_for" msgid="1735961974624867111">" ለ"<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"የስቀል ማስነሻ አልተሳካም።"</string>
- <string name="toast_file_error" msgid="1315722681020841350">"ፋይል የለም።"</string>
- <string name="account_error" msgid="1904775271866104941">"የመለያ መረጃ ሰርስረህ አውጣ ተስኗል።"</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"ወደ መለያዎ ለመግባት ችግር ነበር።"</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"ድጋሚ ለመሞከር በመጠበቅ ላይ"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"WiFi በመጠበቅ ላይ"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"በመስቀል ላይ"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"ተስኗል"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"ተጠናቋል"</string>
- <string name="pause_state_running" msgid="711411177620353982">"በመስቀል ላይ"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"በእጅ ለአፍታ ቆይቷል"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"ለአፍታ ቆሟል- አነስተኛ ባትሪ"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"ለአፍታ ቆሟል- ኃይል እስኪሞላ ዘግይቷል"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"ለአፍታ ቆሟል- ትይይዝ በመጠበቅ ላይ"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"ለአፍታ ቆሟል- ከPWA ኮታ ውጪ"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"ለአፍታ ቆሟል- wifi በመጠበቅላይ"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">" በእንቅስቃሴ ላይ ለአፍታ ቆሟል"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"ድጋሚ ለመሞከር በመጠበቅ ላይ"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 ደቂቃ"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 ደቂቃዎች"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 ደቂቃዎች"</string>
- <string name="retry_no_data" msgid="630347885498641534">"ምንም የውሂብ ተያያዥነት የለም"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"የመለያ ከዲስክ ኮታ አንሷል"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"ፋይል አልተገኘም"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"የአገልግሎት ስህተት"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"የአውታረ መረብ ስህተት"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"ማረጋገጫ ተስኗል"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"በይደር ያሉ ስቀሎች [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"የተጠናቀቁ ስቀሎች [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"ስቀል ለአፍታ አቁም"</string>
- <string name="manager_resume" msgid="1608630525599824933">"ስቀሎች አስቀጥል"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"አሁን ስቀል"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"ኋላ ስቀል"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"አትስቀል"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"ዕይ"</string>
- <string name="manager_retry" msgid="939534318469518843">"እንደገና ሞክር"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"ስቀል ቀርቷል።"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"ስቀል አስቀድሞ ጨርሷል"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"ሁሉንም አስምር"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"የመጨረሻ አስምር:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"የጨርሰዋል አይነቶች ዝርዝር ባዶ ነው።"</string>
- <string name="notify_uploads" msgid="8593982942665493037">"በፍጥነት ስቀል"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"ስቀል ጨርሷል"</string>
- <string name="notify_paused" msgid="3999817913227671338">"ስቀል ለአፍታ ቆሟል"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"በፍጥነት ስቀልገና አልገበረም"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"ትልቅ ፋይሎች በWiFi ተያያዦች ላይ ብቻ ይሰቀላሉ።"</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"ለፋይሎች በመቃኘት ላይ..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"ለስቀል<xliff:g id="PHOTOCOUNT">%1$d</xliff:g> ፎቶዎች እና <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> ቪዲዮዎች በማዘጋጀት ላይ..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"ምንም ተጨማሪ ፎቶዎች/ቪዲዮዎች መስቀል አያስፈልግም።"</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"ከአገልጋዩ ጋር የመገናኘት ችግር ነበር። እባክዎ ትንሽ ቆይተው እንደገና ይሞክሩ።"</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"ሁሉን አስምር ቀርቷል"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"ሁሉንም አሳምር"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"ዕይታ ተጠናቋል"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"በይደር ያለን እይ"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"አጠቃላይ"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"ሁሉንም ስቀሎች ለአፍታ አቁም"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"ኃይል"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"ስልኩ ቻርጅ ሲደረግ ብቻ ስቀል።"</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Wi-Fi ሲገኝ ብቻ ስቀል።"</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"ፎቶዎች"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"መለያ"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"ሁኔታዎችን ስቀል"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"የስልክ መጠን"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"ቪዲዮዎች"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"መለያ"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"የፎቶዎች መለያ የቪዲዮ ስቀሎችን ይጠቀማል።"</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"ሁኔታዎችን ስቀል"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"የፎቶ ተያያዥነት ቅንብሮች ለአሁን ተጠቅመዋል።"</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"ፎቶዎችን ብቻ በተንቀሳቃሽ አውታረ መረቦች በኩል"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"ፎቶዎች &amp; ቪዲዮዎችን በተንቀሳቃሽ አውታረ መረቦች በኩል"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"ፎቶዎች &amp; ቪዲዮዎችን በWi-Fi በኩልብቻ"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"ስለ"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"የበፍጥነት ስቀል ዕትም"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"የሚመከር: 1600 ፒክስል (አትም እና የማያ ምስሎች)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"ዋና መጠን(ዘገምተኛ ስቀል)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"ለአፍታ ቆሟል- SD ካርድ አልተገኘም"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD ካር ድ የለም"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"የበፍጥነት ስቀል ቅንብሮች"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"በፍጥነት ስቀል"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"በራስ ሰር አዲስ ፎቶዎች &amp; ቪዲዮዎች ወደ ግል የድረ አልበሞች ስቀል"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"ሁኔታስቀል"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"ከፍተኛ"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"የተንቀሳቃሽ ስቀሎች"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"የእንቅስቃሴ ላይ ስቀሎች"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"በውሂብ አውታረመረብ እንቅስቃሴ ላይ ፎቶዎች&amp; ቪዲዮዎች ስቀል"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"ባትሪ ስቀል"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"ኃይል በመሙላት ላይ ብቻ ፎቶዎች&amp; ቪዲዮዎች ስቀል"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"ያሉትን ፎቶዎች ስቀል"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"ያሉትንማንኛውም ፎቶዎች&amp; ቪዲዮዎች ከስልክዎ ላይ ይስቀሉ"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"ቦዝኗል"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s \"%2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"በመስቀል ላይ(%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d of %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"ለአፍታ ቆሟል፡ስቀልንለማስቀጠል ንካ"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"ያሉትን ፎቶዎች ስቀል"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"ከስልክዎ ላይ ወደ ድረ የግል አልበም አስቀድሞያልተሰቀሉ ፎቶዎች እና ቪዲዮዎች የተወሰነ ጊዜ ሊወስዱ ይችላሉ፣ ነገር ግን ከዳራ ይከናወናሉ። እርግጠኛ ነዎት ለመቀጠል ይፈልጋሉ?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"አዎ"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"አይ"</string>
-</resources>
diff --git a/email2/res/values-ar/strings.xml b/email2/res/values-ar/strings.xml
deleted file mode 100644
index 8dbb6e808..000000000
--- a/email2/res/values-ar/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"قراءة مرفقات البريد الإلكتروني"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"للسماح للتطبيق بقراءة مرفقات البريد الإلكتروني."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"الدخول إلى بيانات موفر البريد الإلكتروني"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"للسماح للتطبيق بالدخول إلى قاعدة بيانات بريدك الإلكتروني، بما في ذلك الرسائل المستلمة والرسائل المرسلة وأسماء المستخدمين وكلمات المرور."</string>
- <string name="app_name" msgid="5815426892327290362">"بريد"</string>
- <string name="compose_title" msgid="427986915662706899">"إنشاء"</string>
- <string name="debug_title" msgid="5175710493691536719">"تصحيح الأخطاء"</string>
- <string name="next_action" msgid="3931301986364184415">"التالي"</string>
- <string name="okay_action" msgid="8365197396795675617">"موافق"</string>
- <string name="cancel_action" msgid="6967435583794021865">"إلغاء"</string>
- <string name="previous_action" msgid="5181616311579820981">"السابق"</string>
- <string name="send_action" msgid="1729766205562446418">"إرسال"</string>
- <string name="reply_action" msgid="4262472229221507619">"رد"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"رد على الكل"</string>
- <string name="delete_action" msgid="8421026208288857155">"حذف"</string>
- <string name="forward_action" msgid="669174181042344116">"إعادة توجيه"</string>
- <string name="favorite_action" msgid="4664259801498253756">"تمييز بنجمة"</string>
- <string name="done_action" msgid="7497990549515580249">"تم"</string>
- <string name="create_action" msgid="3062715563215392251">"إنشاء رد جديد"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"حذف"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"ليست هناك ردود سريعة."</string>
- <string name="discard_action" msgid="6532206074859505968">"إلغاء"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"حفظ المسودة"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"إدراج رد سريع"</string>
- <string name="read_action" msgid="4701484794504781686">"وضع علامة كـ \"مقروءة\""</string>
- <string name="unread_action" msgid="6280399049357552826">"وضع علامة كـ \"غير مقروءة\""</string>
- <string name="set_star_action" msgid="4660317166196258160">"إضافة نجمة"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"إزالة النجمة"</string>
- <string name="refresh_action" msgid="5951383001436708175">"تحديث"</string>
- <string name="add_account_action" msgid="8835736309476033727">"إضافة حساب"</string>
- <string name="compose_action" msgid="4045702519637388045">"إنشاء"</string>
- <string name="search_action" msgid="6325101454876682308">"بحث"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"إعدادات الحساب"</string>
- <string name="settings_action" msgid="6334807007967459412">"الإعدادات"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"خيارات المزامنة"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"تعليمها بـ \"غير مقروءة\""</string>
- <string name="move_action" msgid="3059189775933985898">"نقل"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+نسخة إلى/ مخفية"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"إضافة نسخة/ مخفية"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"إرفاق ملف"</string>
- <string name="close_action" msgid="533058985745238100">"إغلاق"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"إرسال جميع الرسائل"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"اختيار مرفق"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"نقل إلى"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"جارٍ تحميل الرسائل..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"مشكلة في الاتصال."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"تعذر تحميل الرسالة النصية. ربما تكون الرسالة كبيرة جدًا بحيث لا يمكن عرضها."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"نقل رسالة"</item>
- <item quantity="other" msgid="371256717624461324">"نقل رسائل"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"النقل غير معتمد مع حسابات POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"تعذر النقل نظرًا لاحتواء التحديد على عدة حسابات."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"لا يمكن نقل الرسائل الموجودة في المسودات والبريد الصادر والبريد المرسل."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> غير مقروءة (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> غير مقروءة (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> غير مقروءة (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"في عدد: <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> من الحسابات"</item>
- <item quantity="other" msgid="2723797835410343458">"في عدد: <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> من الحسابات"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"إلى <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> من الرسائل الجديدة"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"كل الحسابات"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"حساب <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> من الحسابات"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"البريد الوارد"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"البريد الصادر"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"المسودات"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"المهـملات"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"البريد المرسَل"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"البريد غير المهم"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"غير مقروءة"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"البريد الوارد (غير مقروءة)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"البريد الوارد (الكل)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"عرض مجمّع (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"حساب <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> من الحسابات"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"الإصدار: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"صندوق البريد"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"مميّزة بنجمة"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"المسودات"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"البريد الصادر"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"عرض مجمّع"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"عرض جميع المجلدات"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"الحسابات"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"المجلدات الحديثة (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"جميع المجلدات"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"المجلدات الحديثة"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"الموضوع"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"بدون موضوع"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"تحميل المزيد من الرسائل"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"تم تحديد <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="7901361399231876038">"تم تحديد <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"ليس هناك أي رسائل"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"إلى"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"نسخة إلى"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"نسخة مخفية الوجهة"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"الموضوع"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"من:"</string>
- <string name="to" msgid="4392614766835725698">"إلى"</string>
- <string name="cc" msgid="7017720927911078193">"نسخة إلى"</string>
- <string name="bcc" msgid="3098643138241111579">"نسخة مخفية الوجهة"</string>
- <string name="subject_hint" msgid="7253964583324677128">"الموضوع"</string>
- <string name="body_hint" msgid="4279864165439577668">"إنشاء رسالة إلكترونية"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- الرسالة الأصلية --------"\n"الموضوع: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"من: <xliff:g id="SENDER">%2$s</xliff:g>"\n"إلى: <xliff:g id="TO">%3$s</xliff:g>"\n"نسخة إلى: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> كتَب:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"إدراج النص المقتبس"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"تضمين نص"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"أضف مستلمًا واحدًا على الأقل."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"بعض عناوين البريد الإلكتروني غير صالحة"</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"الملف كبير جدًا بحيث لا يمكن إرفاقه."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"إدراج رد سريع"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> و<xliff:g id="NUMBER">%2$d</xliff:g> أخرى"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"إلى:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"نسخة إلى:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"نسخة مخفية:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"التاريخ:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"من:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"الموضوع:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"عرض"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"تثبيت"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"تشغيل"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"تحميل"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"معلومات"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"حفظ"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"تم الحفظ"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"إيقاف"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"تم حفظ المرفق باسم <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"تعذر حفظ المرفق."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"سيتم تنزيل مرفق أو أكثر في الرسالة التي تمت إعادة توجيهها قبل الإرسال."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"الرسالة"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"دعوة"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"مرفق <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"عدد المرفقات: <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"إظهار الصور"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"عرض دومًا"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"عرض صور من هذا المرسل دومًا"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"سيتم عرض الصور من هذا المرسل تلقائيًا."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"عرض في التقويم"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"دعوة تقويم"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"هل تنوي الذهاب؟"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" نعم"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" ربما"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" لا"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"لقد قبلت هذه الدعوة."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"لقد كان ردك هو \"ربما\" على هذه الدعوة."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"لقد رفضت هذه الدعوة."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"عرض التفاصيل"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"تفاصيل الرسالة"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"معلومات المرفق"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"يلزم اتصال بشبكة Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"إعدادات Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"إعدادات التطبيق"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"لا يمكن فتح المرفق."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"لا يمكنك حفظ هذا الملف أو فتحه لأن هذا النوع من المرفقات قد يحتوي على برامج ضارة."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"لا يمكن حفظ هذا المرفق أو فتحه بسبب سياسات أمان هذا الحساب."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"هذا المرفق كبير جدًا بحيث لا يمكن تنزيله عبر شبكة جوال. يمكنك تنزيله في المرة التالية التي تتصل فيها بشبكة Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"ليس هناك تطبيق مثبت يمكنه فتح هذا المرفق. حاول تنزيل تطبيق مناسب من Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"هذا المرفق تطبيق. يجب تحديد \"مصادر غير معروفة\" في الإعدادات &gt; التطبيقات حتى تتمكن من تثبيته."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"لا يمكن تثبيت التطبيق مباشرة من الرسالة الإلكترونية. احفظ أولاً هذا التطبيق ثم ثبته باستخدام تطبيق التنزيلات."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"تعذر تنزيل المرفق."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"حدث خطأ أثناء فك ترميز الرسالة."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"عرض <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"هل تريد حذف هذه الرسالة؟"</item>
- <item quantity="other" msgid="4437637377522896262">"هل تريد حذف هذه الرسائل؟"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"تمّ حذف الرسالة."</item>
- <item quantity="other" msgid="6574961322865652255">"تم حذف الرسائل."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"تمّ إلغاء الرسالة."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"تمّ حفظ الرسالة كمسودة."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"لا يمكن عرض المرفق."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"تعذر تحميل المرفق \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"جارٍ فتح الرسالة…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"تم نقل رسالة <xliff:g id="NUM_MESSAGE">%1$d</xliff:g> إلى <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"تم نقل <xliff:g id="NUM_MESSAGE">%1$d</xliff:g> من الرسائل إلى <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"تتعذر إعادة توجيه واحد أو أكثر من المرفقات."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"لم تتم إعادة توجيه المرفق"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"لم يتم تسجيل <xliff:g id="ACCOUNT_NAME">%s</xliff:g> بنجاح."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"تعذر تسجيل الدخول"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> بايت"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> بايت"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> كيلوبايت"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> كيلوبايت"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> ميغابايت"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> ميغابايت"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> غيغابايت"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> غيغابايت"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"أحدث"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"أقدم"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"إعداد الحساب"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"حساب بريد إلكتروني"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"يمكنك إعداد حسابك من خلال اتباع خطوات قليلة."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"عنوان البريد الإلكتروني"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"كلمة المرور"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"إرسال البريد الإلكتروني من هذا الحساب افتراضيًا"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"إعداد يدوي"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"اكتب عنوان بريد إلكتروني وكلمة مرور صالحين."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"حساب متكرر"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"إنك تستخدم اسم المستخدم هذا للحساب \"<xliff:g id="DUPLICATE">%s</xliff:g>\" فعلاً."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"تبدأ كلمة المرور هذه وتنتهي بحرف مسافة واحد أو أكثر. لا تتوافق العديد من الخوادم مع كلمات المرور التي تحتوي على مسافات."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"جارٍ استرداد معلومات الحساب…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"جارٍ فحص إعدادات خادم البريد الوارد…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"جارٍ فحص إعدادات خادم البريد الصادر…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"إعداد الحساب"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"تمّ إعداد حسابك، وستصلك رسالة إلكترونية بعد قليل."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"تسمية هذا الحساب (اختياري)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"الاسم (يظهر في الرسائل الصادرة)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"لا يمكن أن يكون هذا الحقل فارغًا."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"إعداد الحساب"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"نوع الحساب"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"ما نوع هذا الحساب؟"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"إعداد الحساب"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"إعدادات خادم البريد الوارد"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"اسم المستخدم"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"كلمة المرور"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"الخادم"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"المنفذ"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"نوع الأمان"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"لا شيء"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"طبقة المقابس الآمنة/طبقة النقل الآمنة (قبول جميع الشهادات)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"طبقة المقابس الآمنة/طبقة النقل الآمنة"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (قبول جميع الشهادات)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"حذف البريد إلكتروني من الخادم"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"مطلقًا"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"عند الحذف من بريد الوارد"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"بادئة مسار IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"اختياري"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"إعداد الحساب"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"إعدادات خادم البريد الصادر"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"خادم SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"المنفذ"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"نوع الأمان"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"طلب تسجيل الدخول"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"اسم المستخدم"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"كلمة المرور"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"إعداد الحساب"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"إعدادات الخادم"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"الخادم"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"نطاق/اسم المستخدم"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"استخدام اتصال آمن (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"قبول جميع شهادات طبقة المقابس الآمنة"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"شهادة العميل"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"تحديد"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"استخدام شهادة العميل"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"إزالة"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"بلا"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"معرّف جهاز الجوال"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"إعدادات الحساب"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"خيارات الحساب"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"معدل الإطلاع على البريد الوارد"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"مطلقًا"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"تلقائي (ضغط)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"كل 5 دقائق"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"كل 10 دقائق"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"كل 15 دقيقة"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"كل 30 دقيقة"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"كل ساعة"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"إرسال البريد الإلكتروني من هذا الحساب افتراضيًا"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"تنبيهي عند استلام رسالة إلكترونية"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"مزامنة جهات الاتصال من هذا الحساب"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"مزامنة التقويم من هذا الحساب"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"مزامنة البريد الإلكتروني من هذا الحساب"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"تنزيل المرفقات تلقائيًا عند الاتصال بشبكة Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"تعذر الإنهاء"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"الأيام المطلوب مزامنتها"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"تلقائي"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"يوم واحد"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"ثلاثة أيام"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"أسبوع"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"أسبوعان"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"شهر واحد"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"الكل"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"استخدام الإعدادات الافتراضية للحساب"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"اسم المستخدم غير صحيح أو كلمة مرور غير صحيحة."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"اسم المستخدم غير صحيح أو كلمة المرور غير صحيحة."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"لا يمكن الاتصال بالخادم بأمان."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"لا يمكن الاتصال بالخادم بأمان."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"يستلزم الأمر شهادة عميل. هل تريد الاتصال بالخادم باستخدام شهادة عميل؟"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"الشهادة غير صالحة أو يتعذر الدخول إليها."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"لقد استجاب الخادم بخطأ. تحقق من اسم المستخدم وكلمة المرور ثم أعد المحاولة."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"لا يمكن الاتصال بالخادم."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"لا يمكن الاتصال بالخادم."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"يلزم وجود TLS لكن لا يتيح الخادم استخدامه."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"لا يتيح الخادم استخدام أساليب المصادقة."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"تعذر الاتصال بالخادم نظرًا لحدوث خطأ بالأمان."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"تعذر فتح الاتصال بالخادم."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"لقد كتبت عنوان خادم غير صحيح أو أن الخادم يتطلب إصدار بروتوكول لا يتوافق مع البريد الإلكتروني."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"ليس لديك إذن للمزامنة مع هذا الخادم. اتصل بمشرف الخادم للحصول على مزيد من المعلومات."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"التحكم عن بعد في إدارة الأمان"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"يتطلب الخادم <xliff:g id="SERVER">%s</xliff:g> أن تسمح له بالتحكم في بعض ميزات الأمان بجهاز Android عن بعد. هل تريد إنهاء إعداد هذا الحساب؟"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"يتطلب هذا الخادم ميزات أمان غير معتمدة على جهاز Android، تتضمن: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"لا يمكنك تغيير اسم المستخدم لأحد الحسابات. لإضافة حساب باسم مستخدم مختلف، المس \"إضافة حساب\"."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"تحذير: سيؤدي إلغاء تنشيط صلاحية تطبيق البريد الإلكتروني لإدارة الجهاز إلى حذف جميع حسابات البريد الإلكتروني التي تتطلب الصلاحية، وأيضًا حذف البريد الإلكتروني وجهات الاتصال وأحداث التقويم وغيرها من البيانات."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"تحديث أمني"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"يتطلب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" تحديث إعدادات الأمان."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"تتعذر مزامنة الحساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" بسبب متطلبات الأمان."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"يتطلب الحساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" تحديث إعدادات الأمان."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"غير الحساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" إعدادات الأمان له؛ ولا يلزم اتخاذ أي إجراء من قبل المستخدم."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"يلزم تحديث الأمان"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"لقد تغيرت سياسات الأمان"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"لا يمكن تلبية سياسات الأمان"</string>
- <string name="account_security_title" msgid="3511543138560418587">"أمان الجهاز"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"يتطلب الخادم <xliff:g id="SERVER">%s</xliff:g> أن تسمح له بالتحكم في بعض ميزات الأمان في جهاز Android عن بعد."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"تعديل التفاصيل"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"يتطلب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" تغيير رقم التعريف الشخصي أو كلمة المرور الخاصة بتأمين الشاشة."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"ستنتهي صلاحية كلمة مرور تأمين الشاشة"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"لقد انتهت صلاحية رقم التعريف الشخصي (PIN) أو كلمة مرور لتأمين الشاشة."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"انتهت كلمة مرور تأمين الشاشة"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"ستنتهي صلاحية كلمة مرور تأمين الشاشة"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"يلزمك تغيير رقم التعريف الشخصي لشاشة التأمين أو كلمة المرور قريبًا، وإلا فسيتم محو بيانات <xliff:g id="ACCOUNT">%s</xliff:g>. هل تريد تغييره الآن؟"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"انتهت كلمة مرور تأمين الشاشة"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"تتم الآن إزالة بيانات <xliff:g id="ACCOUNT">%s</xliff:g> من جهازك. يمكنك استعادتها من خلال تغيير رقم التعريف الشخصي لشاشة التأمين أو كلمة المرور. هل تريد تغييره الآن؟"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"أتريد إلغاء أي تغييرات غير محفوظة؟"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"تعذر تسجيل الدخول"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"اسم المستخدم أو كلمة المرور للحساب <xliff:g id="ACCOUNT">%s</xliff:g> غير صحيح؟. هل تريد تحديثهما الآن؟"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"الحساب الافتراضي"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"إرسال البريد الإلكتروني من هذا الحساب افتراضيًا"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"تنزيل المرفقات"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"تنزيل مرفقات الرسائل الأخيرة تلقائيًا عبر WiFi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"إشعارات البريد إلكتروني"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"معدل المزامنة والتنبيهات وما إلى ذلك"</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"إرسال إشعار عند وصول بريد إلكتروني"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"معدل الإطلاع على البريد الوارد"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"إعدادات البريد الوارد"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"اسم المستخدم وكلمة المرور وإعدادات خادم الوارد الأخرى"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"إعدادات البريد الصادر"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"اسم المستخدم وكلمة المرور وإعدادات خادم الصادر الأخرى"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"السياسات المطبقة"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"بلا"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"سياسات غير معتمدة"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"بلا"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"محاولة المزامنة"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"المس هنا لمزامنة الحساب"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"اسم الحساب"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"الاسم"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"التوقيع"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"الردود السريعة"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"تعديل النص الذي تدرجه بشكل متكرر عند إنشاء رسالة إلكترونية"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"إلحاق نص بالرسائل التي يتم إرسالها"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"إعدادات التنبيه"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"استخدام البيانات"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"سياسات الأمان"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"تعديل رد سريع"</string>
- <string name="save_action" msgid="1988862706623227093">"حفظ"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"مزامنة جهات الاتصال"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"مزامنة جهات الاتصال لهذا الحساب"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"مزامنة التقويم"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"مزامنة حدث التقويم لهذا الحساب"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"مزامنة البريد الإلكتروني"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"مزامنة البريد الإلكتروني لهذا الحساب"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"اهتزاز"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"الاهتزاز أيضًا عند استلام بريد إلكتروني"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"دومًا"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"فقط عندما يكون صامتًا"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"مطلقًا"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"اهتزاز"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"اختيار نغمة الرنين"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"إعدادات الخادم"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"إزالة الحساب"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"ستتم إزالة الحساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" من Email."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"إزالة الحساب"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"إزالة الحساب"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"خيارات المزامنة"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"خيارات المزامنة (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"إعدادات المزامنة"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"معدل الاطلاع"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"الأيام المطلوب مزامنتها"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"حساب بريد"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"اختيار حساب"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"تحديد مجلد"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"لم يتم العثور على الحساب. ربما تمت إزالته."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"لم يتم العثور على المجلد. ربما تمت إزالته."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"تتضمن بعض حسابات \"Plus\" الوصول عبر بروتوكول POP والذي يسمح لهذا البرنامج بالاتصال. إذا تعذر عليك تسجيل الدخول باستخدام عنوان البريد الإلكتروني وكلمة المرور الصحيحين، فقد تكون غير ممتلك لحساب \"Plus\" مدفوع. يمكنك تشغيل متصفح الويب لتتمكن من الدخول إلى حسابات البريد هذه."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"قبل إعداد حساب البريد الإلكتروني هذا، انتقل إلى موقع ويب T-Online وأنشئ كلمة مرور للدخول إلى البريد الإلكتروني عبر بروتوكول POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"الشركة"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"تعذر إنشاء الحساب. أعد المحاولة."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"إرسال رسالة إلكترونية"</string>
- <string name="device_admin_description" msgid="426727923791430306">"لتمكين سياسات الأمان الخاصة بالخادم"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"جارِ البحث <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> نتيجة من <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> من النتائج من <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"الإعدادات"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"الإعدادات العامة"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"التطبيق"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"التقدم التلقائي"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"اختيار الشاشة التي تظهر بعد حذف رسالة"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"إخفاء مربعات الاختيار"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"في قوائم الرسائل، المس مع الاستمرار للتحديد"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"تأكيد قبل الحذف"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"الرسائل"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"تأكيد قبل الإرسال"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"الرسائل"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"التوجه إلى"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"رسالة أحدث"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"رسائل أقدم"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"قائمة الرسائل"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"حجم نص الرسالة"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"نص صغير جدًا"</item>
- <item msgid="4415205108584620118">"نص صغير"</item>
- <item msgid="4550219696381691112">"الحجم العادي للنص"</item>
- <item msgid="6227813549949219991">"نص كبير"</item>
- <item msgid="1197917420815786571">"نص ضخم"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"حجم نص الرسالة"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"صغير جدًا"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"صغير"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"عادي"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"كبير"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"ضخم"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"الرد على الكل"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"جعل \"الرد على الكل\" هو الإعداد الافتراضي للرد على الرسائل"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"طلب عرض الصور"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"لن يتم عرض الصور الواردة في الرسائل تلقائيًا"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"تم إلغاء تحديد \"إظهار الصور\"."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> من <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"في انتظار المزامنة"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"ستظهر رسالتك الإلكترونية قريبًا."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"المس الرمز للتغيير."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"بريد وارد مجمّع"</string>
- <string name="widget_unread" msgid="4404711399009077833">"غير مقروءة"</string>
- <string name="widget_starred" msgid="8290352707134011791">"الرسائل المميزة بنجمة"</string>
- <string name="widget_loading" msgid="2340962056927255554">"جارٍ التحميل…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"المس للإعداد."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"لم يتم إعداد حساب بريد إلكتروني حتى الآن."</string>
- <string name="more_than_999" msgid="8704425397397918798">"+999"</string>
- <string name="search_hint" msgid="2200412192574686497">"البحث في البريد الإلكتروني"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"البحث في <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"نتائج البحث عن \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"في انتظار النتائج"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"قد يستغرق بعض الخوادم وقتًا طويلاً."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"المجلدات"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"عدم السماح لاستخدام كاميرا الجهاز"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"يلزم كلمة مرور الجهاز"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"تقييد إعادة استخدام كلمات المرور الأخيرة"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"يلزم انتهاء صلاحية كلمات المرور"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"يلزم جهاز بوضع الخمول لتأمين شاشته"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"تقييد عدد أحداث التقويم المتزامنة"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"تقييد عدد الرسائل الإلكترونية المتزامنة"</string>
- <string name="quick_1" msgid="3426057697353380951">"شكرًا!"</string>
- <string name="quick_2" msgid="4188036352885736617">"يبدو جيدًا بالنسبة إليّ!"</string>
- <string name="quick_3" msgid="8061819976353395585">"سأقرأ هذا لاحقًا، وسأرد عليك."</string>
- <string name="quick_4" msgid="3988974084396883051">"دعونا نعد اجتماعًا لمناقشة هذا الأمر."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"تم تعطيل المزامنة في الخلفية لهذا الحساب أثناء التجوال."</string>
- <string name="confirm_response" msgid="5747902757569543165">"جارٍ إرسال الرد..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"ليست هناك أية رسائل."</string>
-</resources>
diff --git a/email2/res/values-ar/uploader.xml b/email2/res/values-ar/uploader.xml
deleted file mode 100644
index dd150b164..000000000
--- a/email2/res/values-ar/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"تحميل فوري"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"ألبوم التحميل الفوري"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"تحميل"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"التحميلات المنتهية"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"متوقف مؤقتًا"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d من الصور • %3$d من مقاطع الفيديو"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d من الصور • %2$d من مقاطع الفيديو"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"طاقة البطارية منخفضة"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"تم تجاوز حصة الصور"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"التجوال"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"في انتظار اتصال WiFi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"متأخر لحين الشحن"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"في انتظار الاتصال"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"إعادة المحاولة في %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"إظهار التحميلات المعلقة"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"إظهار التحميلات المنتهية"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"عرض عبر الإنترنت"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"إظهار التحميلات المعلقة"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"إخفاء التحميلات المعلقة"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"إظهار التفاصيل"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"إخفاء التفاصيل"</string>
- <string name="menu_settings" msgid="5088116127086866634">"الإعدادات"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"تم تحميل %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"الحساب"</string>
- <string name="upload" msgid="2615541458361216022">"تحميل"</string>
- <string name="ok" msgid="2516349681897895312">"موافق"</string>
- <string name="cancel" msgid="1207103189404543868">"إلغاء"</string>
- <string name="uploading_to" msgid="3986362895940069510">"تحميل إلى "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" لـ "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"أخفقت تهيئة التحميل."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"الملف غير متوفر."</string>
- <string name="account_error" msgid="1904775271866104941">"أخفق استرداد معلومات الحساب."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"حدثت مشكلة أثناء تسجيل الدخول إلى حسابك."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"في انتظار إعادة المحاولة"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"في انتظار اتصال WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"تحميل"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"أخفق"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"مكتمل"</string>
- <string name="pause_state_running" msgid="711411177620353982">"تحميل"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"تم الإيقاف مؤقتًا يدويًا"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"تم الإيقاف مؤقتًا - طاقة البطارية منخفضة"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"تم الإيقاف مؤقتًا - متأخر لحين الشحن"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"تم الإيقاف مؤقتًا - في انتظار الاتصال"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"تم الإيقاف مؤقتًا - نفدت حصة PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"تم الإيقاف مؤقتًا - في انتظار اتصال WiFi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"تم الإيقاف مؤقتًا - تجوال"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"في انتظار إعادة المحاولة"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"دقيقة واحدة"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"دقيقتان"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 دقائق"</string>
- <string name="retry_no_data" msgid="630347885498641534">"ليس هناك اتصال بيانات"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"نفدت الحصة المخصصة للحساب على القرص"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"لم يتم العثور على الملف"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"خطأ في الخدمة"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"خطأ في الشبكة"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"أخفقت المصادقة"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"التحميلات المعلقة [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"التحميلات المكتملة [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"إيقاف التحميلات مؤقتًا"</string>
- <string name="manager_resume" msgid="1608630525599824933">"استئناف التحميلات"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"تحميل الآن"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"التحميل لاحقًا"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"عدم التحميل"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"عرض"</string>
- <string name="manager_retry" msgid="939534318469518843">"إعادة المحاولة"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"تم إلغاء التحميل."</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"انتهى التحميل فعلاً"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"مزامنة الكل"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"آخر مزامنة: "\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"قائمة العناصر المنتهية فارغة."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"تحميل فوري"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"انتهت التحميلات"</string>
- <string name="notify_paused" msgid="3999817913227671338">"تم إيقاف التحميلات مؤقتًا"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"لم يتم تنشيط التحميل الفوري بعد."</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"سيتم تحميل الملفات كبيرة الحجم عبر اتصال WiFi فقط."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"جارٍ الفحص للملفات..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"جارٍ تحضير <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> من الصور و<xliff:g id="VIDEOCOUNT">%2$d</xliff:g> من مقاطع الفيديو للتحميل..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"ليست هناك صور/مقاطع فيديو إضافية يلزم تحميلها."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"حدثت مشكلة أثناء الاتصال بالخادم. الرجاء إعادة المحاولة لاحقًا."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"تم إلغاء مزامنة الكل"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"مزامنة الكل"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"عرض التحميلات المكتملة"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"عرض التحميلات المعلقة"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"عام"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"إيقاف جميع التحميلات مؤقتًا"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"طاقة"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"عدم التحميل إلا أثناء شحن الهاتف."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"تحميل عند توفر اتصال Wi-Fi فقط."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"صور"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"الحساب"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"شروط التحميل"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"حجم الصورة"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"مقاطع فيديو"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"الحساب"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"سيُستخدم حساب الصور لتحميلات الفيديو."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"شروط التحميل"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"يتم استخدام إعدادات اتصال الصور حاليًا."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"تحميل الصور فقط عبر شبكات الجوال"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"تحميل الصور ومقاطع الفيديو عبر شبكات الجوال"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"تحميل الصور ومقاطع الفيديو عبر اتصال Wi-Fi فقط"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"حول"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"إصدار التحميل الفوري"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"الموصى به: 1600 بكسل (للمشاركة وعمليات الطباعة وشاشات التوقف)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"الحجم الأصلي (أبطأ تحميل)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"تم الإيقاف مؤقتًا - بطاقة SD غير متوفرة"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"بطاقة SD غير متوفرة"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"إعدادات التحميل فوري"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"تحميل فوري"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"تحميل الصور ومقاطع الفيديو الجديدة تلقائيًا إلى ألبوم خاص على الويب"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"حالة التحميل"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"متقدمة"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"تحميلات الجوال"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"تحميلات التجوال"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"تحميل الصور ومقاطع الفيديو عند التجوال عبر شبكة بيانات"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"تحميلات عند الشحن"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"تحميل الصور ومقاطع الفيديو عند الشحن فقط"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"تحميل الصور الحالية"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"تحميل أية صور ومقاطع فيديو حالية من الهاتف الآن"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"معطّل"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"تحميل (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d من %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"تم الإيقاف مؤقتًا: المس لاستئناف التحميل"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"تحميل الصور الحالية"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"قد يستغرق تحميل الصور ومقاطع الفيديو التي لم يتم تحميلها فعليًا من الهاتف إلى ألبوم خاص على الويب بعض الوقت، ولكنه سيتم في الخلفية. هل تريد بالتأكيد المتابعة؟"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"نعم"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"لا"</string>
-</resources>
diff --git a/email2/res/values-be/strings.xml b/email2/res/values-be/strings.xml
deleted file mode 100644
index 82f396082..000000000
--- a/email2/res/values-be/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Чытаць далучаныя файлы ў электроннай пошце"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Дазваляе прыкладанням чытаць вашыя далучэнні да электронных лістоў."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Доступ да дадзеных пастаўшчыка паслуг электроннай пошты"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Дазваляе прыкладанням атрымліваць доступ да базы дадзеных вашай электроннай пошты, у тым ліку да атрыманых і адпраўленых паведамленняў, імёнаў карыстальнікаў і пароляў."</string>
- <string name="app_name" msgid="5815426892327290362">"Электронная пошта"</string>
- <string name="compose_title" msgid="427986915662706899">"Напісаць"</string>
- <string name="debug_title" msgid="5175710493691536719">"Адладка"</string>
- <string name="next_action" msgid="3931301986364184415">"Далей"</string>
- <string name="okay_action" msgid="8365197396795675617">"ОК"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Адмяніць"</string>
- <string name="previous_action" msgid="5181616311579820981">"Папярэдняе"</string>
- <string name="send_action" msgid="1729766205562446418">"Адправіць"</string>
- <string name="reply_action" msgid="4262472229221507619">"Адказаць"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Адказаць усім"</string>
- <string name="delete_action" msgid="8421026208288857155">"Выдаліць"</string>
- <string name="forward_action" msgid="669174181042344116">"Наперад"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Пазначыць"</string>
- <string name="done_action" msgid="7497990549515580249">"Зроблена"</string>
- <string name="create_action" msgid="3062715563215392251">"Стварыць"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Выдаліць"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Хуткіх адказаў няма."</string>
- <string name="discard_action" msgid="6532206074859505968">"Адхіліць"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Захаваць праект"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Уставіць хуткі адказ"</string>
- <string name="read_action" msgid="4701484794504781686">"Пазначыць як прачытанае"</string>
- <string name="unread_action" msgid="6280399049357552826">"Пазначыць як непрачытанае"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Дадаць пазнаку"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Зняць пазнаку"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Абнавіць"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Дадаць уліковы запіс"</string>
- <string name="compose_action" msgid="4045702519637388045">"Напісаць"</string>
- <string name="search_action" msgid="6325101454876682308">"Пошук"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Налады ўліковага запісу"</string>
- <string name="settings_action" msgid="6334807007967459412">"Налады"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Параметры сінхранізацыі"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Пазначыць як непрачытанае"</string>
- <string name="move_action" msgid="3059189775933985898">"Перанесці"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Копія/УК"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Дадаць Копію/УК"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Далучыць файл"</string>
- <string name="close_action" msgid="533058985745238100">"Закрыць"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Пераслаць усё"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Выберыце далучэнне"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Перанесці ў"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Загрузка паведамленняў..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Праблема злучэння."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Не атрымалася загрузіць тэкст паведамлення. Магчыма, занадта вялiкае паведамленне."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Перамясціць паведамленне"</item>
- <item quantity="other" msgid="371256717624461324">"Перанесці паведамленні"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Перамяшчэнне не падтрымліваецца ўліковымі запісамі з падтрымкай пратаколу POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Немагчыма перанесці. Выбрана некалькі ўліковых запісаў."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Нельга перамяшчаць паведамленні ў тэчках \"Чарнавікі\", \"Зыходныя\" і \"Адпраўленыя\"."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"Непрачытаных: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"Непрачытаных: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> непрачытаных ( <xliff:g id="ACCOUNT">%2$s</xliff:g> )"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"у <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> улік. зап."</item>
- <item quantity="other" msgid="2723797835410343458">"у <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> улік. зап."</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"да атр. <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> новых паведамленняў"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Усе ўлiковыя запiсы"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"Ул. зап. <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> ул. зап."</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Уваходныя"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Выходныя"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Чарнавікі"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Кошык"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Дасланыя"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Непажаданыя"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Непрачытана"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Уваходныя (непрачытаныя)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Уваходныя (усе)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Камбінаваны выгляд (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"Уліковых запісаў: <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="4145163147488719025">"Уліковых запісаў: <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Версія: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Уваходныя"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Пазначаныя"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Чарнавікі"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Выходныя"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Камбінаваны выгляд"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Паказаць усе папкі"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Уліковыя запісы"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Апошнія папкі (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Усе тэчкі"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Апошнія тэчкі"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Тэма"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Без тэмы"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Загрузіць больш паведамленняў"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"Выбрана паведамленняў: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="7901361399231876038">"Выбрана паведамленняў: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Няма паведамленняў"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Каму"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Копія"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Утоеная копія"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Тэма"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Ад:"</string>
- <string name="to" msgid="4392614766835725698">"Каму"</string>
- <string name="cc" msgid="7017720927911078193">"Копія"</string>
- <string name="bcc" msgid="3098643138241111579">"Утоеная копія"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Тэма"</string>
- <string name="body_hint" msgid="4279864165439577668">"Скласцi ліст"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n" -------- Зыходнае паведамленне -------- "\n"Тэма: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n" Ад: <xliff:g id="SENDER">%2$s</xliff:g>"\n" Каму: <xliff:g id="TO">%3$s</xliff:g>"\n" CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"Карыстальнiк <xliff:g id="SENDER">%s</xliff:g> пісаў: "\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Уключыць цытаваны тэкст"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Уключыць тэкст"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Дадайце хаця б аднаго атрымальнiка."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Некаторыя адрасы электроннай пошты несапраўдныя."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Файл занадта вялікі для далучэння."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Уставіць хуткі адказ"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> і іншыя: <xliff:g id="NUMBER">%2$d</xliff:g>"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Каму:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Копія:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Утоеная копія:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Дата:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Ад:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Тэма:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Выгляд"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Усталяваць"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Прайграць"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Загрузіць"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Звесткі"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Захаваць"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Захавана"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Спыніць"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Укладанне захаванае як <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Немагчыма захаваць далучэнне."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Адзін або некалькі далучаных файлаў у пераадрасаваным паведамленні будуць перад адпраўкай спампаваны."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Паведамленне"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Запрасіць"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Далучаны файл <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Далучаныя файлы <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Паказаць малюнкі"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Заўсёды паказваць"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Заўсёды паказваць фотаздымкi ад гэтага адпраўніка"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Фотаздымкі ад гэтага адпраўніка будуць паказаны аўтаматычна."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Пагледзець у календары"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Запрашэнне ў Каляндар"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Прыйдзеце?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Так"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Магчыма"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Не"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Вы прынялі гэта запрашэнне."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"На гэтае запрашэнне вы адказалі \"Магчыма\"."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Запрашэнне адхілена"</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Паказваць падр."</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Звесткi пра паведамленне"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Звесткі пра далучаны файл"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Падлучыцеся да сеткі Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Налады Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Налады прыкладання"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Немагчыма адкрыць далучаны файл."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Вы не можаце захаваць ці адкрыць гэты файл, таму што далучэннi гэтага тыпу могуць утрымліваць шкоднаснае праграмнае забеспячэнне."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Немагчыма захаваць або адкрыць гэта прыкладанне з-за правiл бяспекi ўлiковага запiсу"</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Гэты далучаны файл занадта вялікі для запампоўкі праз мабільную сетку. Вы можаце спампаваць яго іншым разам, падключыўшыся да сеткі Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Няма ўсталяваных прыкладанняў, з дапамогай якiх можна адкрыць гэта далучэнне. Паспрабуйце спампаваць падыходзячае прыкладанне з Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Далучаны файл з\'яўляецца прыкладаннем. Вы павінны праверыць невядомыя крыніцы ў наладах (раздзел \"Прыкладанні\"), перш чым вы зможаце ўсталяваць яго."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Прыкладанні не могуць быць усталяваны адразу з электроннай пошты. Спачатку захавайце гэтае прыкладанне і ўсталюйце яго з дапамогай прыкладання \"Спампаваннi\"."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Не атрымалася спампаваць далучаны файл."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Памылка расшыфравання паведамлення."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Прагляд файла <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Выдаліць гэта паведамленне?"</item>
- <item quantity="other" msgid="4437637377522896262">"Выдаліць гэтыя паведамленні?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Паведамленне выдаленае."</item>
- <item quantity="other" msgid="6574961322865652255">"Паведамленні выдаленыя."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Паведамленне выдаляецца."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Паведамленне захавана як чарнавік."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Немагчыма паказаць далучаны файл"</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Не атрымалася загрузіць далучаны файл \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Адкрыццё паведамлення..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> паведамленні(яў) перамешчаны ў <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> паведамленні(яў) перамешчаны ў <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Не атрымалася перанакiраваць адзін або некалькі далучаных файлаў."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Далуч. файлы не перасылаюцца"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Няўдалы ўваход з уліковага запісу <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Не атрымалася ўвайсці"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> Б"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> байт"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> Кб"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> Кб"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> Мб"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> МБ"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> Гб"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> Гб"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Больш новы"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Старэйшы"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" ... "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Усталяванне ўліковага запісу"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Уліковы запіс электроннай пошты"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Вы можаце зарэгістраваць свой уліковы запіс усяго за некалькі крокаў."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Адрас электроннай пошты"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Пароль"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Адпраўляць пошту з гэтага ўліковага запісу па змаўчанні"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Самастойнае ўсталяванне"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Увядзіце правільны адрас электроннай пошты і пароль."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Дублікат уліковага запісу"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Вы ўжо выкарыстоўваеце гэта імя карыстальніка ва ўліковым запісе \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Гэты пароль пачынаецца або заканчваецца з адным ці некалькімі прабеламі. Многія серверы не падтрымліваюць паролі з прабеламі."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Атрыманне інфармацыі аб уліковым запісе..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Праверка ўваходных налад сервера..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Праверка выходных налад сервера..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Усталяванне ўліковага запісу"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Уліковы запіс створаны, электронная пошта адпраўляецца."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Дайце гэтаму ўліковаму запісу назву (не абавязкова)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Вашае імя (адлюстроўваецца на выходных паведамленнях)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Гэта поле не можа быць пустым"</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Усталяванне ўліковага запісу"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Тып уліковага запісу"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Які гэта тып уліковага запісу?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Усталяванне ўліковага запісу"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Уваходныя параметры сервера"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Імя карыстальніка"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Пароль"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Сервер"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Порт"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Тып бяспекі"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Няма"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Прымаць усе сертыфікаты)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (прымаць усе сертыфікаты)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Выдаліць электронную пошту з сервера"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Ніколі"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Пры выдаленні з папкі \"Уваходныя\""</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Прэфікс шляху IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Дадатковы"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Усталяванне ўліковага запісу"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Налады сервера выходнай пошты"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Сервер SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Порт"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Тып бяспекі"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Патрабаваць уваход"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Імя карыстальніка"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Пароль"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Усталяванне ўліковага запісу"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Налады сервера"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Сервер"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Дамен\\Імя карыстальніка"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Выкарыстоўваць бяспечнае злучэнне (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Прымаць усе сертыфікаты SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Сертыфікат кліента"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Выбраць"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Выкарыстоўваць кліенцкі сертыфікат"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Выдаліць"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Няма"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Ідэнтыфікатар маб. прылады"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Налады ўліковага запісу"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Параметры ўліковага запісу"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Чашчыннасць праверкі электроннай пошты"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Ніколі"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Аўтаматычна (Push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"кожныя 5 хвілін"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Кожныя 10 хвілін"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Кожныя 15 хвілін"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Кожныя 30 хвілін"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Кожную гадзіну"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Адпраўляць пошту з гэтага ўліковага запісу па змаўчанні"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Паведамляць мне аб атрыманні электроннай пошты"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Сінхранізаваць кантакты з гэтага ўліковага запісу"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Сінхранізаваць каляндар з гэтага ўліковага запісу"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Сінхранізаваць электронную пошту з гэтага ўліковага запісу"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Аўтаматычна спампоўваць далучаныя файлы пры падключэнні да Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Не атрымалася скончыць"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Дні для сінхранізацыі"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Аўтаматычна"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"1 дзень"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Тры дні"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"1 тыдзень"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Два тыдні"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Адзін месяц"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Усе"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Выкарыстоўваць параметры ўліковага запісу па змаўчанню"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Няправiльны пароль цi iмя карыстальнiка."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Імя карыстальніка ці пароль няправільныя."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Не атрымлiваецца ўсталяваць бяспечнае злучэнне з серверам."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Не атрымліваецца ўсталяваць бяспечнае злучэнне з серверам."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Патрабуецца сертыфікат кліента. Жадаеце падключыцца да сервера з сертыфікатам кліента?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Несапраўдны або недаступны сертыфікат."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Адказ сервера змяшчае памылку. Праверце сваe імя карыстальніка і пароль, а потым паспрабуйце яшчэ раз."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Немагчыма падключыцца да сервера."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Не атрымлiваецца падлучыцца да сервера."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS патрабуецца, але не падтрымліваецца серверам."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Сервер не падтрымлiвае метады праверкі сапраўднасці."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Немагчыма адкрыць злучэнне з серверам з-за памылкі бяспекі."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Не атрымалася адкрыць падключэнне да сервера."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Вы ўвялі няправільны адрас сервера, або сервер патрабуе версію пратаколу, якую не падтрымлівае электронная пошта."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"У вас няма дазволу на сінхранізацыю з гэтым серверам. Каб атрымаць дадатковую інфармацыю, звярніцеся да адміністратара сервера."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Выдаленае адміністраванне бяспекі"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Сервер <xliff:g id="SERVER">%s</xliff:g> патрабуе дазволу аддалена кіраваць некаторымі функцыямі бяспекі вашай прылады Android. Вы хочаце завяршыць усталёўку гэтага ўліковага запісу?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Гэты сервер патрабуе функцыі бяспекі, якiя вашая прылада Android не падтрымлівае, у тым ліку: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Вы не можаце змяніць імя карыстальніка ўліковага запісу. Каб дадаць уліковы запіс з іншым імем карыстальніка, выберыце \"Дадаць уліковы запіс\"."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"УВАГА! Адключэнне кіравання прыкладаннем электроннай пошты, прызначаным для адміністравання вашай прылады, прывядзе да выдалення ўсiх уліковых запісаў электроннай пошты, якія яго патрабуюць, разам з электроннай поштай, кантактамі, мерапрыемствамi календара і іншымі дадзенымі."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Абнаўленне бяспекі"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Патрэбна абнавіць налады бяспекі ўлiковага запiсу <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Немагчыма сiнхранiзаваць улiковы запiс \"<xliff:g id="ACCOUNT">%s</xliff:g>\" з-за патрабаванняў бяспекі."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Уліковы запіс \"<xliff:g id="ACCOUNT">%s</xliff:g>\" патрабуе абнаўлення налад бяспекі."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Змянiлiся налады бяспекi для ўлiковага запiсу \"<xliff:g id="ACCOUNT">%s</xliff:g>\". Не патрабуюцца дзеяннi карыстальнiка."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Абнавіце сістэму бяспекі"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Правiлы бяспекі змяніліся"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Немагчыма выконваць правiлы бяспекі"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Бяспека прылады"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Сервер <xliff:g id="SERVER">%s</xliff:g> патрабуе дазволу аддалена кіраваць некаторымі функцыямі бяспекі вашай прылады Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Рэдагаваць дэталі"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"Патрабуецца змянiць свой ​​PIN-код блакавання экрана або пароль для ўлiковага запiсу \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Заканчваецца дзеянне пароля блак. экрана"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Скончыўся тэрмін дзеяння вашага PIN-кода альбо пароля блакавання экрана."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Скончылася дзеянне пароля блак. экрана"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Заканчваецца дзеянне пароля блак. экрана"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Вы павінны змяніць свой ​​PIN-код для блакiроўкi экрана або пароль у бліжэйшы час, iнакш дадзеныя для ўліковага запісу <xliff:g id="ACCOUNT">%s</xliff:g> будуць выдалены. Змяніць PIN-код зараз?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Скончылася дзеянне пароля блак. экрана"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Дадзеныя для ўліковага запісу <xliff:g id="ACCOUNT">%s</xliff:g> выдаляюцца з памяці прылады. Вы можаце аднавіць іх пры змене PIN-кода для блакiроўкi экрана або пароля. Змяніць яго цяпер?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Скасаваць незахаваныя змяненні?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Не атрымалася ўвайсці"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Імя карыстальніка і пароль для ўліковага запісу <xliff:g id="ACCOUNT">%s</xliff:g> няправільныя. Абнавіць іх зараз?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Уліковы запіс па змаўчанні"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Адпраўляць пошту з гэтага ўліковага запісу па змаўчанні"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Спампаваць далучэнні"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Аўтаматычнае спампаванне далучэнняў з апошніх паведамленняў праз Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Апавяшчэннi па электроннай пошце"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Сінхранізаваць частату, паведамленні і г. д."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Дасылаць апавяшчэнне пры атрыманні электроннай пошты"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Частата праверкі ўваходных паведамленняў"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Уваходныя налады"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Імя карыстальніка, пароль і іншыя налады сервера ўвах. паведамл."</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Выходныя налады"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Імя карыстальніка, пароль і іншыя налады сервера вых. паведамл."</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Правiлы парушаны"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Няма"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Правiлы не падтрымліваюцца"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Няма"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Спроба сінхранізацыі"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Націсніце тут, каб сінхранізаваць гэты ўліковы запіс"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Назва уліковага запісу:"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Вашае імя"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Подпіс"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Хуткія адказы"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Змяніць тэкст, які часта ўстаўляецца пры напiсанні паведамлення"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Дадаць тэкст у паведамленні, што вы адпраўляеце"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Налады апавяшчэнняў"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Выкарыстанне дадзеных"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Правiлы бяспекі"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Змяніць хуткі адказ"</string>
- <string name="save_action" msgid="1988862706623227093">"Захаваць"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Сінхранізаваць кантакты"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Сінх. кантактаў для гэтага ўл. зап."</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Сінхранізаваць каляндар"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Сінхр.. мерапр. для гэтага ўл. зап."</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Сінхранізаваць электронную пошту"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Сінхранізацыя электроннай пошты для гэтага ўліковага запісу"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Вібрацыя"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Таксама вібраваць пры атрыманні электроннага лiста"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Заўсёды"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Толькі ў рэжыме без гуку"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Ніколі"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Вібрацыя"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Выбраць рынгтон"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Налады сервера"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Выдаліць уліковы запіс"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Уліковы запіс \"<xliff:g id="ACCOUNT">%s</xliff:g>\" будзе выдалены з электроннай пошты."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Выдаліць уліковы запіс"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Выдаліць уліковы запіс"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Параметры сінхранізацыі"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">" Параметры сінхранізацыi( <xliff:g id="MAILBOXX_NAME">%s</xliff:g> )"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Настройкі сінхранізацыі"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Частата праверкі"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Дні для сінхранізацыі"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Уліковы запіс электроннай пошты"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Выберыце ўліковы запіс"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Выбраць папку"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Уліковы запiс не знойдзены. Магчыма, ён быў выдалены."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Тэчка не знойдзена. Магчыма, яна выдаленая."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Толькі некаторыя ўліковыя запісы Google Plus маюць доступ да пратаколу POP, які дазваляе падключэнне гэтай праграме. Калі не атрымліваецца ўвайсці ў сістэму з правільным адрасам электроннай пошты і паролем, магчыма, уліковы запіс Plus не аплачаны. Запусціце вэб-браўзэр, каб атрымаць доступ да гэтых уліковых запісаў."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Перад наладай гэтага ўліковага запісу электроннай пошты наведайце вэб-сайт T-Online і стварыце пароль для доступу да электроннай пошты па пратаколу POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Карпаратыўны"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Не атрымалася стварыць уліковы запіс. Паспрабуйце яшчэ раз."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Электронная пошта"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Уключае спецыяльныя палітыкі бяспекі сервера"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Пошук у дамене <xliff:g id="DOMAIN">%s</xliff:g>..."</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"Вынікі (<xliff:g id="RESULTS">%1$d</xliff:g>) з дамену <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"Вынікі (<xliff:g id="RESULTS">%1$d</xliff:g>) з дамену <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Налады"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Агульныя налады"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Прыкладанне"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Аўтаматычна рухацца наперад"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Выберыце экран, якi будзе паказвацца пасля выдалення паведамлення"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Схаваць палі"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Націсніце на паведамленне ў спісе i ўтрымлівайце яго, каб выбраць"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Пацвердзіць перад выдаленнем"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Паведамленні"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Пацвердзіць перад адпраўкай"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Паведамленні"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Пераход да"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Навейшае паведамленне"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Больш даўняе паведамленне"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Спіс паведамленняў"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Памер шрыфту паведамленняў"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Малы тэкст"</item>
- <item msgid="4415205108584620118">"Дробны тэкст"</item>
- <item msgid="4550219696381691112">"Нармальны памер тэксту"</item>
- <item msgid="6227813549949219991">"Вялікі шрыфт"</item>
- <item msgid="1197917420815786571">"Вялізны тэкст"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Памер шрыфту паведамленняў"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Малы"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Маленькі"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Звычайны"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Вялікі"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Вялікі"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Адказаць усім"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Устал. \"Адказаць усім\" як парам. па змаўч. для адказаў на паведамл."</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Запытаць паказ малюнкаў"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Малюнкі ў паведамленнях не будуць паказвацца аўтаматычна"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Паказваць малюнкі\" ачышчана."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> з <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Чаканне сінхранізацыі"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Ваш адрас электроннай пошты хутка з\'явіцца."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Каб змяніць, дакранiцеся да значка."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Камбінаваныя ўваходныя"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Непрачытаныя"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Пазначана"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Загрузка..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Націсніце, каб наладзіць."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Вы яшчэ не стварылі ўліковы запіс электроннай пошты."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Пошук у электроннай пошце"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Пошук <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Вынікі пошуку для \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Чаканне вынікаў"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Некаторыя серверы могуць заняць працяглы час."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Папкі"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Забараніць выкарыстанне камеры прылады"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Патрабаваць пароль прылады"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Абмежаваць паўторнае выкарыстанне апошніх пароляў"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Запытаць заканчэнне дзеяння пароля"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Патр. рэж. праст. прыл. для блак. экр."</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Абмежаванне колькасці сінхр. мерапр. календара"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Абмежаванне колькасці сінхр. паведамл. эл. пошты"</string>
- <string name="quick_1" msgid="3426057697353380951">"Дзякуй!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Гучыць нядрэнна!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Я прачытаю гэта пазней i звяжуся з вамi."</string>
- <string name="quick_4" msgid="3988974084396883051">"Давайце прызначым сустрэчу, каб абмеркаваць гэта."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Фонавая сінхранізацыя для гэтага ўліковага запісу адключана ў роўмінгу."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Адпраўка адказу..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Паведамленняў няма."</string>
-</resources>
diff --git a/email2/res/values-be/uploader.xml b/email2/res/values-be/uploader.xml
deleted file mode 100644
index f8aee8e6e..000000000
--- a/email2/res/values-be/uploader.xml
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Імгненная загрузка"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Альбом імгненных загрузак"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Загрузка"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Гатова"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Прыпыненыя"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% ... %2$d фота ... %3$d відэа"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d фатаграфій ... %2$d відэа"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"нізкі зарад батарэі"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"перавышана квота для фатаграфій"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"роўмінг"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"чаканне Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"адкладзена да зарадкі"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"чаканне падключэння"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for summary_subtitle_paused_retry_format (3851931944505090119) -->
- <skip />
- <string name="summary_menu_show_pending" msgid="658361192495996">"Паказаць загрузкі, якія чакаюць"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Паказаць завершаныя загрузкі"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Прагляд у Iнтэрнэце"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Паказаць загрузкі, якія чакаюць"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Схаваць загрузкі, якія чакаюць"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Паказваць падрабязнасці"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Схаваць падрабязнасці"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Налады"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Загружана %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Уліковы запіс"</string>
- <string name="upload" msgid="2615541458361216022">"Загрузіць"</string>
- <string name="ok" msgid="2516349681897895312">"ОК"</string>
- <string name="cancel" msgid="1207103189404543868">"Адмена"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Загрузка на "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" для "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Збой ініцыялізацыі загрузкі."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Файл недаступны."</string>
- <string name="account_error" msgid="1904775271866104941">"Не ўдалося атрымаць інфармацыю пра ўліковым запіс."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Праблема ўвахода ў ваш уліковы запіс."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Чаканне паўтора"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Чаканне Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Загрузка"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Няўдала"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Завершана"</string>
- <string name="pause_state_running" msgid="711411177620353982">"загрузка"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"прыпынены ўручную"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"прыпынена – нізкі зарад батарэі"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"прыпынена – адкладзена да зарадкі"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"прыпынена – чаканне падключэння"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"прыпынена – перавышана квота PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"прыпынена – чаканне Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"прыпынена – роўмінг"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"чаканне паўтора"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 хвіліна"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 хвіліны"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 хвілін"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Няма падключэння дадзеных"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Уліковы запіс вычарпаў дыскавую квоту"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Файл не знойдзены"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Памылка паслугі"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Памылка сеткі"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Памылка аўтарызацыіі"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Чакаецца загрузак: [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Завершана загрузак: [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Прыпыніць загрузкі"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Працягнуць загрузкі"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Загрузіць зараз"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Загрузіць пазней"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Не загружаць"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Выгляд"</string>
- <string name="manager_retry" msgid="939534318469518843">"Паўтор"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Загрузка адмененая"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Загрузка ўжо завершаная"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Сінхранізаваць усё"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Апошняя сінхранізацыя:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Спіс гатовых элементаў пусты."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Імгненная загрузка"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Загрузкі завершаныя"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Загрузкі прыпыненыя"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Імгненная загрузка не была актываваная"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Вялікія файлы будуць загружаныя толькі праз WiFi-злучэнне."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Пошук файлаў..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Падрыхтоўка фатаграфій (<xliff:g id="PHOTOCOUNT">%1$d</xliff:g>) і відэа (<xliff:g id="VIDEOCOUNT">%2$d</xliff:g>) да загрузкі..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Няма дадатковых фатаграфій/відэа для загрузкі."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Узнікла праблема сувязі з серверам. Паспрабуйце пазней."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Сінхранізаваць усе адмененыя"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Сінхранізаваць усё"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Прагледзець завершаныя"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Праглядзець чакаючыя"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Агульныя"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Прыпыніць усе загрузкі"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Сілкаванне"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Загружаць, толькі калі тэлефон заражаецца."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Загружаць, толькі калі Wi-Fi даступны."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Фатаграфіі"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Уліковы запіс"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Умовы загрузкі"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Памер фота"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Відэа"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Уліковы запіс"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Уліковы запіс фота будзе выкарыстаны для загрузкі відэа."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Умовы загрузкі"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Цяпер выкарыстоўваюцца настройкі сувязі фота."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Толькі фатаграфіі праз мабільныя сеткі"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Фота і відэа праз мабільныя сеткі"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Фота і відэа толькі праз Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Інфармацыя"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Версія імг. загр."</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Рэкамендавана: 1600 пікселяў (для публікацыі, друку і заставак)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Арыгінальны памер (самая павольная загрузка)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"прыпынена – SD-карта недаступная"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD-карта недаступная"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Нал. імгн. загр."</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Імгненная загрузка"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Аўтаматычна загружаць новыя фатаграфіі і відэа ў прыватны вэб-альбом"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Стан загрузкі"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Пашыраныя налады"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Мабільныя загрузкі"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Загрузка ў роўмінгу"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Загружаць фота і відэа пры роўмінгу ў сетцы перадачы дадзеных"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Загрузка на акумулятары"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Загружаць фота і відэа толькі падчас зарадкі"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Загрузіць існуючыя фатаграфіі"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Загрузіць зараз усе існуючыя фатаграфіі і відэа з тэлефона"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Адключана"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Загрузка (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d з %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Прыпынена: дакраніцеся, каб аднавіць загрузку"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Загрузіць існуючыя фатаграфіі"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Загрузка фатаграфій і відэа, што яшчэ не загружаны, з вашага тэлефона ў прыватны альбом у вэбе можа заняць некаторы час, але будзе ажыццяўляцца ў фонавым рэжыме. Працягнуць?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Так"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Не"</string>
-</resources>
diff --git a/email2/res/values-bg/strings.xml b/email2/res/values-bg/strings.xml
deleted file mode 100644
index d9dca7a87..000000000
--- a/email2/res/values-bg/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Четене на прикачени файлове в имейла"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Разрешава на приложението да чете прикачените файлове в имейла ви."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Достъп до данни на доставчика на имейл"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Дава на приложението достъп до базата от данни на имейла ви, включително получени и изпратени съобщения, потребителски имена и пароли."</string>
- <string name="app_name" msgid="5815426892327290362">"Имейл"</string>
- <string name="compose_title" msgid="427986915662706899">"Ново съобщение"</string>
- <string name="debug_title" msgid="5175710493691536719">"Отстраняване на грешки"</string>
- <string name="next_action" msgid="3931301986364184415">"Напред"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Отказ"</string>
- <string name="previous_action" msgid="5181616311579820981">"Предишна"</string>
- <string name="send_action" msgid="1729766205562446418">"Изпращане"</string>
- <string name="reply_action" msgid="4262472229221507619">"Отговор"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Отговор до всички"</string>
- <string name="delete_action" msgid="8421026208288857155">"Изтриване"</string>
- <string name="forward_action" msgid="669174181042344116">"Препращане"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Със звезда"</string>
- <string name="done_action" msgid="7497990549515580249">"Готово"</string>
- <string name="create_action" msgid="3062715563215392251">"Създаване на нов"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Изтриване"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Няма бързи отговори."</string>
- <string name="discard_action" msgid="6532206074859505968">"Отхвърляне"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Запазване на чернова"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Вмъкване на бърз отговор"</string>
- <string name="read_action" msgid="4701484794504781686">"Означаване като прочетено"</string>
- <string name="unread_action" msgid="6280399049357552826">"Означаване като непрочетено"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Добавяне на звезда"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Премахване на звездата"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Опресняване"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Добавяне на профил"</string>
- <string name="compose_action" msgid="4045702519637388045">"Ново съобщение"</string>
- <string name="search_action" msgid="6325101454876682308">"Търсене"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Настройки на профил"</string>
- <string name="settings_action" msgid="6334807007967459412">"Настройки"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Опции за синхронизиране"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Непрочетено"</string>
- <string name="move_action" msgid="3059189775933985898">"Местене"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Як/Ск"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Добавяне на Як:/Ск:"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Прикачване на файл"</string>
- <string name="close_action" msgid="533058985745238100">"Затваряне"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Вс. съобщения: Изпр."</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Избор на прикачен файл"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Преместване във:"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Съобщенията се зареждат…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Проблем с връзката."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Текстът на съобщението не можа да бъде зареден. Възможно е то да е твърде голямо за преглед."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Преместване на съобщение"</item>
- <item quantity="other" msgid="371256717624461324">"Преместване на съобщения"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Преместването не се поддържа за профили с POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Не може да се премести, защото изборът съдържа няколко профила."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Съобщенията в „Чернови“, „Изх. поща“ и „Изпратени“ не могат да се местят."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> непрочетено (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> непрочетени (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> непрочетени (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"в <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> профила"</item>
- <item quantity="other" msgid="2723797835410343458">"в <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> профила"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"до <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> нови съобщения"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Всички профили"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> профил"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> профила"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Вх. поща"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Изх. поща"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Чернови"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Кошче"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Изпратени"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Нежелана поща"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Непрочетено"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Вх. поща (непрочетени)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Вх. поща (всички)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Комбиниран изглед (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> профил"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> профила"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Версия: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Вх. поща"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Със звезда"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Чернови"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Изх. поща"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Комбиниран изглед"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Показване на всички папки"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Профили"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Скорошни папки (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Всички папки"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Скорошни папки"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Тема"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Без тема"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Зареждане на още съобщения"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"Избрани: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="7901361399231876038">"Избрани: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Няма съобщения"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"До"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Як"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Ск:"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Тема"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"От:"</string>
- <string name="to" msgid="4392614766835725698">"До"</string>
- <string name="cc" msgid="7017720927911078193">"Як"</string>
- <string name="bcc" msgid="3098643138241111579">"Ск"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Тема"</string>
- <string name="body_hint" msgid="4279864165439577668">"Напишете имейл"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Оригинално съобщение --------"\n"Тема: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"От: <xliff:g id="SENDER">%2$s</xliff:g>"\n"До: <xliff:g id="TO">%3$s</xliff:g>"\n"Як: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> написа:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Включване на цитирания текст"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Включване на текста"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Добавете поне един получател."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Някои имейл адреси са невалидни."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Файлът е твърде голям за прикачване."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Вмъкване на бърз отговор"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> и още <xliff:g id="NUMBER">%2$d</xliff:g> други"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"До:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Як:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Ск:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Дата:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"От:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Тема:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Преглед"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Инсталация"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Пускане"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Зареждане"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Информация"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Запазване"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Запазено"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Стоп"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Запазен прикачен файл: <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Прикач. файл не бе запазен."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Един или повече прикачени файла в препратеното ви съобщение ще бъдат изтеглени преди изпращане."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Съобщение"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Покана"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> прикачен файл"</item>
- <item quantity="other" msgid="974463163535515223">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> прикачени файла"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Показване на изображенията"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Винаги да се показват"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Снимките от този подател да се показват винаги"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Снимките от този подател ще се показват автоматично."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Преглед в Календар"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Покана в календар"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Ще присъствате ли?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Да"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Може би"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Не"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Приехте тази покана."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Отговорихте на тази покана с „Може би“."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Отклонихте тази покана."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Показване на подробностите"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Подробности за съобщението"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Информация за прикачения файл"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Изисква се връзка с Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Настройки за Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Настройки за приложения"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Прикаченият файл не може да се отвори."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Не можете да запазите или отворите прикачения файл, защото е възможно този тип да съдържа злонамерен софтуер."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Прикаченият файл не може да бъде запазен или отворен поради правилата за сигурност на този профил."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Прикаченият файл е твърде голям за изтегляне през мобилна мрежа. Можете да го изтеглите при следващото си свързване с Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Няма инсталирано приложение, което може да отвори този прикачен файл. Опитайте да изтеглите подходящо от Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Този прикачен файл е приложение. Трябва да отметнете „Неизвестни източници“ в „Настройки“ &gt; „Приложения“, преди да можете да го инсталирате."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Приложенията не могат да бъдат инсталирани директно от електронната поща. Първо запазете това приложение и след това го инсталирайте посредством приложението Изтегляния."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Прикаченият файл не можа да бъде изтеглен."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"При декодирането на съобщението възникна грешка."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Преглед на <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Да се изтрие ли това съобщение?"</item>
- <item quantity="other" msgid="4437637377522896262">"Да се изтрият ли тези съобщения?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Съобщението е изтрито."</item>
- <item quantity="other" msgid="6574961322865652255">"Съобщенията са изтрити."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Съобщението е отхвърлено."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Съобщението е запазено като чернова."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Прикаченият файл не може да се покаже."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Прикаченият файл „<xliff:g id="FILENAME">%s</xliff:g>“ не можа да се зареди."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Съобщението се отваря…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> съобщение е преместено в/ъв <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> съобщения са преместени в/ъв <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Един или повече прикачени файла не можаха да се препратят."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Прикаченото не бе препратено"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Не успяхте да влезете в профила си <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Не можах да вляза в профила си"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> Б"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> Б"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> КБ"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> КБ"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> МБ"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> МБ"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> ГБ"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> ГБ"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"По-нови"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"По-стари"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Настройка на профила"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Имейл профил"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Можете да настроите профила си само с няколко стъпки."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Имейл адрес"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Парола"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Изпращане на имейл от този профил по подразбиране"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ръчна настройка"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Въведете валиден имейл адрес и парола."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Дублиращ профил"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Вече използвате това потребителско име за профила „<xliff:g id="DUPLICATE">%s</xliff:g>“."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Тази парола започва или завършва с един или повече знака за интервал. Много сървъри не поддържат пароли с интервали."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Извлича се информация за профила..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Настройките на вх. сървър се проверяват..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Настройките на изх. сървър се проверяват..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Настройка на профила"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Профилът ви е настроен и имейлите са на път!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Именуване на този профил (незадължително)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Името ви (показвано в изходящи съобщения)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Това поле трябва да се попълни."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Настройка на профила"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Тип профил"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Какъв вид профил е това?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Настройка на профила"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Настройки на входящия сървър"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Потребителско име"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Парола"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Сървър"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Порт"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Вид защита"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Няма"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Приемане на всички сертификати)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (Приемане на всички сертификати)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Изтриване на имейл от сървъра"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Никога"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"При изтриване от „Вх. поща“"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"префикс на IMAP път"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"По избор"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Настройка на профила"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Настройки на изходящия сървър"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP сървър"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Порт"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Вид защита"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Изисква влизане в профил"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Потребителско име"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Парола"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Настройка на профила"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Настройки на сървъра"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Сървър"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Домейн/Потребителско име"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Използване на сигурна връзка (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Приемане на всички SSL сертификати"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Сертификат за клиентска програма"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Избиране"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Със сертификат за клиентска прогр."</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Премахване"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Нито един"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Идент. № на мобилното у-во"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Настройки на профила"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Опции за профила"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Честота на проверяване за входяща поща"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Никога"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Автоматично („Push“)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"На всеки 5 мин"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"На всеки 10 мин"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"На всеки 15 мин"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"На всеки 30 мин"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"На всеки час"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Изпращане на имейл от този профил по подразбиране"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Известие при получаване на имейл"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Синхронизиране на контактите в този профил"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Синхронизиране на календара в този профил"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Синхронизиране на имейлите от този профил"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Автоматично изтегляне на прикачените файлове при връзка с Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Не можа да завърши"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Дни за синхронизиране"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Автоматично"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Един ден"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Три дни"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Една седмица"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Две седмици"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Един месец"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Всички"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Стандартното за профила"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Неправилно потребителско име или парола."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Неправилно потребителско име или парола."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Не може да се осъществи безопасна връзка със сървъра."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Не може да се осъществи безопасна връзка със сървъра."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Изисква се сертификат за клиентска програма. Да се установи ли връзка със сървъра чрез него?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Сертификатът е невалиден или недостъпен."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Сървърът отговори с грешка. Проверете потребителското име и паролата си, след което опитайте отново."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Не може да се осъществи връзка със сървъра."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Не може да се осъществи връзка със сървъра."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"Изисква се TLS, но не се поддържа от сървъра."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Сървърът не поддържа методи за удостоверяване."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Не можа да се установи връзка със сървъра поради грешка със сигурността."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Не можа да се установи връзка със сървъра."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Въвели сте неправилен адрес на сървъра или сървърът изисква версия на протокола, която приложението Имейл не поддържа."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Нямате разрешение за синхронизиране с този сървър. Свържете се с администратора на сървъра си за още информация."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Отдалечено администриране на сигурността"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Сървърът <xliff:g id="SERVER">%s</xliff:g> изисква отдалечен контрол над някои от защитните функции на устройството ви с Android. Искате ли да завършите настройването на този профил?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Този сървър изисква защитни функции, които устройството ви с Android не поддържа, включително: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Не можете да промените потребителското име на профил. За да добавите такъв с ново име, докоснете „Добавяне на профил“."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"ПРЕДУПРЕЖДЕНИЕ: Деактивирането на възможността приложението Имейл да администрира устройството ви ще изтрие всички имейл адреси, които го изискват, заедно с имейлите, контактите, събитията от календара и други данни в тях."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Атуализация на защитата"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> изисква да актуализирате защитните си настройки."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Профилът „<xliff:g id="ACCOUNT">%s</xliff:g>“ не може да бъде синхронизиран поради изискванията за сигурност."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Профилът „<xliff:g id="ACCOUNT">%s</xliff:g>“ изисква актуализация на настройките за сигурност."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Настройките за сигурност на профила „<xliff:g id="ACCOUNT">%s</xliff:g>“ са променени. Не е необходимо действие от страна на потребителя."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Актуализирайте за сигурност"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Променени правила за сигурност"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Неизпълнени правила за сигурност"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Сигурност на устройството"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Сървърът <xliff:g id="SERVER">%s</xliff:g> изисква отдалечен контрол над някои от защитните функции на устройството ви с Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Редактиране на подробностите"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"„<xliff:g id="ACCOUNT">%s</xliff:g>“ изисква да промените ПИН кода или паролата си за заключен екран."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Паролата при заключване изтича"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"PIN кодът или паролата за заключен екран изтече."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Паролата изтече"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Паролата за заключен екран изтича"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Трябва скоро да промените ПИН кода или паролата си за заключен екран или данните за <xliff:g id="ACCOUNT">%s</xliff:g> ще бъдат изтрити. Искате ли да извършите промяната сега?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Паролата за заключен екран изтече"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Данните за <xliff:g id="ACCOUNT">%s</xliff:g> се изтриват от устройството ви. Можете да ги възстановите, като промените ПИН кода или паролата си за заключен екран. Искате ли да извършите промяната сега?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Да се отхвърлят ли незапазените промени?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Не можах да вляза в профила си"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Неправилно потребителско име или парола за <xliff:g id="ACCOUNT">%s</xliff:g>. Искате ли да ги актуализирате сега?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Основен профил"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Изпращане на имейл от този профил по подразбиране"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Изтегляне на прикачените файлове"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Автоизтегляне на прик. файлове към скорошни съобщения през Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Известия за имейл"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Честота на синхронизиране, известия и т.н."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Изпращане на известие при получаване на имейл"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Честота на проверяване за входяща поща"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Входящи настройки"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Потребителско име, парола и други настройки на входящия сървър"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Изходящи настройки"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Потребителско име, парола и други настройки на изходящия сървър"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Наложени правила"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Нито едно"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Неподдържани правила"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Нито едно"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Опит за синхронизиране"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Докоснете тук, за да синхронизирате този профил"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Име на профила"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Името ви"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Подпис"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Бързи отговори"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Редактиране на текст, който често вмъквате при писане на имейл"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Прибавяне на текст към изпращаните от вас съобщения"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Настройки за известия"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Използване на данни"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Правила за сигурност"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Редактиране на бърз отговор"</string>
- <string name="save_action" msgid="1988862706623227093">"Запазване"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Синхронизиране на контакти"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Синхр. на контактите за този профил"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Синхронизиране на календар"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Синхр. на календарно събитие за профила"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Синхрон на имейлите"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Синхрон на имейлите за този профил"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Вибриране"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Да вибрира и при нов имейл"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Винаги"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Само при тих режим"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Никога"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Вибриране"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Избор на мелодия"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Настройки на сървъра"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Премахване на профил"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Профилът „<xliff:g id="ACCOUNT">%s</xliff:g>“ ще бъде премахнат от имейла."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Премахване на профила"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Премахване на профила"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Опции за синхронизиране"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Опции за синхронизиране (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Настройки за синхронизиране"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Честота на проверяване"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Дни за синхронизиране"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Имейл"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Избор на профил"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Изберете папка"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Профилът не бе намерен. Може да е премахнат."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Папката не бе намерена. Може да е премахната."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Само някои „Plus“ профили включват достъп чрез POP, позволявайки на тази програма да се свърже. Ако не можете да влезете с правилния си имейл адрес и парола, може да не сте платили за такъв профил. Моля, стартирайте уеб браузъра, за да получите достъп до тези имейл адреси."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Преди да настроите този имейл адрес, посетете уебсайта на T-Online и създайте парола за достъп до имейл чрез POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Фирмен"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Профилът не можа да бъде създаден. Опитайте отново."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Имейл"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Активира определени от сървъра защитни правила"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Търси се <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> резултат от <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> резултата от <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Настройки"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Общи настройки"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Приложение"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Автоматично преминаване"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Изберете екран, който да се показва след изтриване на съобщение"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Квадратчета за отметка: Скриване"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"В списъците със съобщения докоснете и задръжте, за да изберете"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Потвърждаване преди изтриване"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Съобщения"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Потвърждаване преди изпращане"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Съобщения"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Преминаване към"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"По-ново съобщение"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"По-старо съобщение"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Списък със съобщения"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Размер на текста на съобщенията"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Миниатюрен шрифт на текста"</item>
- <item msgid="4415205108584620118">"Малък шрифт на текста"</item>
- <item msgid="4550219696381691112">"Нормален шрифт на текста"</item>
- <item msgid="6227813549949219991">"Голям шрифт на текста"</item>
- <item msgid="1197917420815786571">"Огромен текст"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Размер на текста на съобщенията"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Миниатюрен"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Малък"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Нормален"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Голям"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Огромен"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Отговор до всички"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"„Отговор до всички“ да е стандартната опция при отговор на съобщения"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Питане дали снимките да се показват"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Снимките в съобщенията няма да бъдат показвани автоматично"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"„Показване на снимките“ е изчистено."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> от <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Изчаква се синхронизиране"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Имейлът ви ще се покаже скоро."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Докосн. за промяна."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Комбинирана вх. поща"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Непрочетени"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Със звезда"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Зарежда се…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Докоснете, за да настроите."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Все още не сте настроили имейл профил."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Търсете по имейл"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Търсете във: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Резултати от търсенето за „<xliff:g id="ID_1">%1$s</xliff:g>“"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Резултатите се изчакват"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Някои сървъри може да отнемат много време."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Папки"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Забраняване на използването на камерата"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Изискване на парола за устройството"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Без повторно ползване на скорошни пароли"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Изискване паролите да изтичат"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Неактивно у-во за заключ. на екрана"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Ограничаване на броя синхрон. събития в календара"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Ограничаване на броя синхронизирани имейли"</string>
- <string name="quick_1" msgid="3426057697353380951">"Благодаря!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Звучи добре!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Ще прочета това по-късно и ще се свържа с Вас."</string>
- <string name="quick_4" msgid="3988974084396883051">"Нека да насрочим среща, за да обсъдим това."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Синхронизирането на заден план за този профил е деактивирано при роуминг."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Отговорът се изпраща..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Няма съобщения."</string>
-</resources>
diff --git a/email2/res/values-bg/uploader.xml b/email2/res/values-bg/uploader.xml
deleted file mode 100644
index 74ce71deb..000000000
--- a/email2/res/values-bg/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Незабавно качване"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Албум за незабавни качвания"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Качва се"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Завършени"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"На пауза"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d снимки • %3$d видеоклипа"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d снимки • %2$d видеоклипа"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"изтощена батерия"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"квотата за снимки бе надхвърлена"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"роуминг"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"изчаква се WiFi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"отложено, докато се зарежда"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"изчаква се връзка"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"повторен опит след %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Показване на чакащите качвания"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Показване на завършените качвания"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Преглед онлайн"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Показване на чакащите качвания"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Скриване на чакащите качвания"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Показване на подробностите"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Скриване на подробностите"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Настройки"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Качени: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Профил"</string>
- <string name="upload" msgid="2615541458361216022">"Качване"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Отказ"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Качва се във: "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" за "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s „%2$s“"</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Качването не започна успешно."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Файлът не е наличен."</string>
- <string name="account_error" msgid="1904775271866104941">"Извличането на информация за профила не бе успешно."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Възникна проблем при влизането в профила ви."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Изчаква се за нов опит"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Изчаква се WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Качва се"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Неуспешно"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Завършено"</string>
- <string name="pause_state_running" msgid="711411177620353982">"качва се"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"ръчно поставено на пауза"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"на пауза – изтощена батерия"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"на пауза – отложено, докато се зарежда"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"на пауза – изчаква се връзка"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"на пауза - квотата за Picasa Уеб Албуми е изчерпана"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"на пауза – изчаква се WiFi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"на пауза – роуминг"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"изчаква се за нов опит"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 минута"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 минути"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 минути"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Няма връзка за данни"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Дисковата квота за профила е изчерпана"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Файлът не бе намерен"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Грешка в услугата"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Грешка в мрежата"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Удостоверяването не бе успешно"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Чакащи качвания [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Завършени качвания [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Поставяне на качванията на пауза"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Възобновяване на качванията"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Качване сега"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Качване по-късно"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Без качване"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Преглед"</string>
- <string name="manager_retry" msgid="939534318469518843">"Нов опит"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Качването е анулирано"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Качването вече приключи"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Синхронизиране на всичко"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Последно синхронизиране:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Списъкът със завършените елементи е празен."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Незабавно качване"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Качванията са завършени"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Качванията са на пауза"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Незабавното качване още не е активирано"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Големите файлове ще бъдат качвани само с WiFi връзка."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Сканира се за файлове..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"<xliff:g id="PHOTOCOUNT">%1$d</xliff:g> снимки и <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> видеоклипа се подготвят за качване..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Няма допълнителни снимки/видеоклипове, които трябва да бъдат качени."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Възникна проблем при установяването на връзка със сървъра. Моля, опитайте отново по-късно."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Синхронизирането на всичко бе анулирано"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Синхронизиране на всичко"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Преглед на завършените"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Преглед на чакащите"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Общи"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Поставяне на всички качвания на пауза"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Захранване"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Да се качва само когато телефонът се зарежда."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Да се качва само когато е налице Wi-Fi."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Снимки"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Профил"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Условия за качване"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Размер на снимката"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Видеоклипове"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Профил"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Профилът за снимки ще се използва за качване на видеоклипове."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Условия за качване"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Засега се използват настройките на връзката за снимки."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Само снимки чрез мобилни мрежи"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Снимки и видеоклипове чрез мобилни мрежи"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Снимки и клипове само чрез Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Информация"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Незаб. качв.: Версия"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Препоръчително: 1 600 пиксела (за споделяне, отпечатване и скрийнсейвъри)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Оригинален размер (най-бавно качване)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"на пауза – няма налична SD карта"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Няма налична SD карта"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Незаб. качв.: Настр."</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Незабавно качване"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Автоматично качване на новите снимки и видеоклипове в частен уеб албум"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Състояние на качването"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Разширени"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Мобилни качвания"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Качвания при роуминг"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Качване на видеоклипове и снимки при роуминг в мрежата за данни"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Качване при зареждане"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Качване на снимки и видеоклипове само при зареждане"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Качване на съществуващите снимки"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Качване на всички съществуващи снимки и видеоклипове от телефона ви сега"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Деактивирано"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Качва се (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d от %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"На пауза: Докоснете, за да възобновите качването"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Качване на съществуващите снимки"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Качването на снимки и видеоклипове, които още не са качени от телефона ви в частен албум в мрежата, може да отнеме известно време, но ще бъде извършено на заден план. Наистина ли искате да продължите?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Да"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Не"</string>
-</resources>
diff --git a/email2/res/values-ca/strings.xml b/email2/res/values-ca/strings.xml
deleted file mode 100644
index 3bf2bb50c..000000000
--- a/email2/res/values-ca/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Llegeix els fitxers adjunts al correu electrònic"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permet que l\'aplicació llegeixi els fitxers adjunts al correu electrònic."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Accedeix a les dades del proveïdor de correu electrònic"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permet que l\'aplicació accedeixi a la base de dades del teu correu electrònic, inclosos els missatges rebuts, els missatges enviats, els noms d\'usuari i les contrasenyes."</string>
- <string name="app_name" msgid="5815426892327290362">"Correu electrònic"</string>
- <string name="compose_title" msgid="427986915662706899">"Redacció"</string>
- <string name="debug_title" msgid="5175710493691536719">"Depuració"</string>
- <string name="next_action" msgid="3931301986364184415">"Següent"</string>
- <string name="okay_action" msgid="8365197396795675617">"D\'acord"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Cancel·la"</string>
- <string name="previous_action" msgid="5181616311579820981">"Anterior"</string>
- <string name="send_action" msgid="1729766205562446418">"Envia"</string>
- <string name="reply_action" msgid="4262472229221507619">"Respon"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Respon a tots"</string>
- <string name="delete_action" msgid="8421026208288857155">"Suprimeix"</string>
- <string name="forward_action" msgid="669174181042344116">"Reenvia"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Destaca"</string>
- <string name="done_action" msgid="7497990549515580249">"Fet"</string>
- <string name="create_action" msgid="3062715563215392251">"Crea"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Suprimeix"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"No hi ha respostes ràpides."</string>
- <string name="discard_action" msgid="6532206074859505968">"Descarta"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Desa l\'esborrany"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Insereix resposta ràpida"</string>
- <string name="read_action" msgid="4701484794504781686">"Marca\'l com a llegit"</string>
- <string name="unread_action" msgid="6280399049357552826">"Marca com a no llegit"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Destaca"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"No destaquis"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Actualitza"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Afegeix un compte"</string>
- <string name="compose_action" msgid="4045702519637388045">"Redacta"</string>
- <string name="search_action" msgid="6325101454876682308">"Cerca"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Configuració del compte"</string>
- <string name="settings_action" msgid="6334807007967459412">"Configuració"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Opcions de sincronització"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Marca com a no llegit"</string>
- <string name="move_action" msgid="3059189775933985898">"Mou"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Cco"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Afegeix Cc/Cco"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Adjunta un fitxer"</string>
- <string name="close_action" msgid="533058985745238100">"Tanca"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Envia els missatges"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Selecció d\'un fitxer adjunt"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Mou a"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"S\'estan carregant els missatges…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Problema de connexió."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"No es pot carregar el text del missatge. És possible que el missatge sigui massa gran per visualitzar-lo."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Mou el missatge"</item>
- <item quantity="other" msgid="371256717624461324">"Mou els missatges"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Els comptes POP3 no admeten el desplaçament d\'elements."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"No es pot moure perquè la selecció conté diversos comptes."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Els missatges de les carpetes Esborranys, Bústia de sortida i Enviats no es poden moure."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> no llegits (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> no llegits (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> no llegits (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"a <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> comptes"</item>
- <item quantity="other" msgid="2723797835410343458">"a <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> comptes"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"a <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> missatges nous"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Tots els comptes"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> compte"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> comptes"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Safata d\'entrada"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Bústia de sortida"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Esborranys"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Paperera"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Enviat"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Correu brossa"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"No llegit"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Safata d\'entrada (sense lleg.)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Safata d\'entrada (tots)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Vista combinada (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> compte"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> comptes"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versió: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Safata d\'entrada"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Destacats"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Esborranys"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Bústia de sortida"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Vista combinada"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Mostra totes les carpetes"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Comptes"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Carpetes recents (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Totes les carpetes"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Carpetes recents"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Assumpte"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Sense assumpte"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Carrega més missatges"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> seleccionat"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> seleccionats"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"No hi ha missatges"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Per a"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Cco"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Assumpte"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"De:"</string>
- <string name="to" msgid="4392614766835725698">"Per a:"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Cco"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Assumpte"</string>
- <string name="body_hint" msgid="4279864165439577668">"Redacta un correu electrònic"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Missatge original --------"\n"Assumpte: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"De: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Per a: <xliff:g id="TO">%3$s</xliff:g>"\n"Cc: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> ha escrit:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Inclou el text citat"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Inclou text"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Afegeix com a mínim un destinatari."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Algunes adreces electròniques no són vàlides."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"El fitxer és massa gran per adjuntar-lo."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Inserció d\'una resposta ràpida"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> i <xliff:g id="NUMBER">%2$d</xliff:g> més"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Per a:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Cco:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Data:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"De:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Assumpte:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Mostra"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Instal·la"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Reprodueix"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Carrega"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Informació"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Desa"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Desat"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Atura"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Fitxer adjunt desat com a <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"No es pot desar fitxer adjunt."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Nota: Un o més fitxers adjunts del teu missatge reenviat es baixaran abans de l\'enviament."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Missatge"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Invitació"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Fitxer adjunt <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Fitxers adjunts <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Mostra les imatges"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Mostra sempre"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Mostra sempre les imatges d\'aquest remitent"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Les imatges d\'aquest remitent es mostraran automàticament."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Mostra-ho al calendari"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Invitació de Calendar"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Hi anireu?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Sí"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Potser"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" No"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Has acceptat aquesta invitació."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Has respost \"potser\" a aquesta invitació."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Has rebutjat aquesta invitació."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Mostra detalls"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Detalls del missatge"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Informació del fitxer adjunt"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Cal una connexió Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Configuració Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Configuració d\'aplicació"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"No es pot obrir el fitxer adjunt."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"No pots desar ni obrir aquest fitxer perquè és possible que aquest tipus de fitxer adjunt contingui programari maliciós."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Aquest fitxer adjunt no es pot desar o no es pot obrir a causa de les polítiques de seguretat d\'aquest compte."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Aquest fitxer adjunt és massa gran per baixar-lo a través d\'una xarxa de telefonia mòbil. Podràs baixar-lo la propera vegada que et connectis a una xarxa Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"No hi ha cap aplicació instal·lada que pugui obrir aquest fitxer adjunt. Prova de baixar una aplicació adequada d\'Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Aquest fitxer adjunt és una aplicació. Has de seleccionar Fonts desconegudes a Configuració &gt; Aplicacions per instal·lar-la."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Les aplicacions no poden instal·lar-se directament des del correu electrònic. Primer has de desar l\'aplicació i, a continuació, instal·lar-la mitjançant l\'aplicació Baixades."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"No s\'ha pogut baixar el fitxer adjunt."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"S\'ha produït un error en descodificar el missatge."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Es mostra <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Vols suprimir aquest missatge?"</item>
- <item quantity="other" msgid="4437637377522896262">"Vols suprimir aquests missatges?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Missatge suprimit."</item>
- <item quantity="other" msgid="6574961322865652255">"Missatges suprimits."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Missatge descartat."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Missatge desat com a esborrany."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"No es pot mostrar el fitxer adjunt."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"No s\'ha pogut carregar el fitxer adjunt \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"S\'està obrint el missatge..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> missatge mogut a <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> missatges moguts a <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"No s\'han pogut reenviar un o més fitxers adjunts."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"El fitxer adjunt no s\'ha reenviat"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Error en l\'inici de sessió a <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"No es pot iniciar la sessió"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Més recent"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Més antics"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Configuració del compte"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Compte de correu electrònic"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Pots configurar el teu compte en només un quants passos."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Adreça electrònica"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Contrasenya"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Envia correu electrònic des d\'aquest compte de manera predeterminada"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configuració manual"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Escriu una adreça electrònica i una contrasenya vàlides."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Compte duplicat"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Ja estàs fent servir aquest nom d\'usuari per al compte \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Aquesta contrasenya comença o acaba amb un o més espais en blanc. Molts servidors no admeten les contrasenyes amb espais."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"S\'està recuperant la informació del compte..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"S\'està comprovant la configuració del servidor d\'entrada…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"S\'està comprovant la configuració del servidor de sortida…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Configuració del compte"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"El compte s\'ha configurat i aviat rebràs un correu electrònic."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Assigneu un nom al compte (opcional)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"El vostre nom (visualitzat als missatges de sortida)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Aquest camp no pot estar en blanc."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Configuració del compte"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Tipus de compte"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"De quin tipus de compte es tracta?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Configuració del compte"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Configuració del servidor d\'entrada"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nom d\'usuari"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Contrasenya"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Servidor"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipus de seguretat"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Cap"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (accepta tots els certificats)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (accepta tots els certificats)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Suprimeix el correu electrònic del servidor"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Mai"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Quan el suprimeixi de la safata d\'entrada"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Prefix de camí IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Opcional"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Configuració del compte"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Configuració del servidor de sortida"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Servidor SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipus de seguretat"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Requereix l\'inici de sessió"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nom d\'usuari"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Contrasenya"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Configuració del compte"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Configuració del servidor"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Servidor"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domini\\Nom d\'usuari"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Utilitza una connexió segura (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Accepta tots els certificats SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certificat de client"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Selecciona"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Utilitza un certificat de client"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Elimina"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Cap"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID de dispositiu mòbil"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Configuració del compte"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Opcions del compte"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Freqüència de comprovació de la safata d\'entrada"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Mai"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automàtica (tramesa automàtica)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Cada 5 minuts"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Cada 10 minuts"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Cada 15 minuts"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Cada 30 minuts"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Cada hora"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Envia correu electrònic des d\'aquest compte de manera predeterminada"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Notifica\'m quan arribi un correu electrònic"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sincronitza els contactes d\'aquest compte"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sincronitza el calendari d\'aquest compte"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sincronitza el correu electrònic d\'aquest compte"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Baixa automàticament els fitxers adjunts en connectar-te a Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"No s\'ha pogut acabar"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dies per sincronitzar"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automàtic"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Un dia"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tres dies"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Una setmana"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Dues setmanes"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Un mes"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Tots"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Utilitza l\'opció predeterminada del compte"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"El nom d\'usuari o la contrasenya no són correctes."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"El nom d\'usuari o la contrasenya són incorrectes."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"No es pot establir una connexió segura amb el servidor."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"No es pot establir una connexió segura amb el servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Es necessita un certificat de client. Et vols connectar al servidor amb un certificat de client?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"El certificat no és vàlid o no s\'hi pot accedir."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"El servidor ha contestat amb un error. Comprova el nom d\'usuari i la contrasenya i torna-ho a provar."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"No es pot establir la connexió amb el servidor."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"No es pot connectar amb el servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS necessari, però no compatible amb el servidor."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Els mètodes d\'autenticació no són compatibles amb el servidor."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"No s\'ha pogut obrir la connexió al servidor a causa d\'un error de seguretat."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"No s\'ha pogut obrir la connexió amb el servidor."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Has introduït una adreça de servidor incorrecta o el servidor requereix una versió de protocol que el correu electrònic no admet."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"No tens permís per sincronitzar amb aquest servidor. Contacta amb l\'administrador del servidor per obtenir més informació."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Administració de seguretat remota"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"El servidor <xliff:g id="SERVER">%s</xliff:g> requereix que li permetis controlar de manera remota algunes funcions de seguretat del dispositiu Android. Vols acabar de configurar aquest compte?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"El servidor requereix funcions de seguretat que no són compatibles amb el teu dispositiu Android i que inclouen: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"No pots canviar el nom d\'usuari d\'un compte. Per afegir un compte amb un nom d\'usuari diferent, toca Afegeix un compte."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"ADVERTIMENT: Desactivar l\'autoritat de l\'aplicació de correu electrònic per administrar el dispositiu suprimirà tots els comptes de correu electrònic que ho requereixin, juntament amb els correus electrònics, els contactes, els esdeveniments de calendari i altres dades."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Actualització de seguretat"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> necessita que actualitzis la configuració de seguretat."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"El compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\" no es pot sincronitzar a causa de requisits de seguretat."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Cal actualitzar la configuració de seguretat del compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"El compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ha canviat la configuració de seguretat; no es requereix cap acció de l\'usuari."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Cal actualització de seguretat"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Les polítiques de seguretat han canviat"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"No es compleixen polít. segur."</string>
- <string name="account_security_title" msgid="3511543138560418587">"Seguretat del dispositiu"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"El servidor <xliff:g id="SERVER">%s</xliff:g> requereix que li permetis controlar de manera remota algunes funcions de seguretat del dispositiu Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Edita\'n els detalls"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" necessita que canviïs el PIN o la contrasenya de la pantalla de bloqueig."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"La contrasenya de bloqueig de pantalla està a punt de caducar"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"La contrasenya o el PIN de bloqueig de pantalla ha caducat."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"La contrasenya de bloqueig de pantalla ha caducat"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"La contrasenya de bloqueig de pantalla està a punt de caducar"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Has de canviar la contrasenya o el PIN de bloqueig de pantalla aviat. Si no ho fas, s\'esborraran les dades de <xliff:g id="ACCOUNT">%s</xliff:g>. Vols fer el canvi ara?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"La contrasenya de bloqueig de pantalla ha caducat"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Les dades de <xliff:g id="ACCOUNT">%s</xliff:g> s\'estan esborrant del dispositiu. Pots restaurar-les si canvies la contrasenya o el PIN de bloqueig de pantalla. Vols fer el canvi ara?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Vols descartar els canvis no desats?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"No es pot iniciar la sessió"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"El nom d\'usuari o la contrasenya de <xliff:g id="ACCOUNT">%s</xliff:g> no són correctes. Vols actualitzar-los ara?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Compte predeterminat"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Envia correu electrònic des d\'aquest compte de manera predeterminada"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Baixada de fitxers adjunts"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Baixa automàtic. fitxers adjunts de missatges recents per Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Notificacions de correu electrònic"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Freqüència de sincronització, notificacions, etc."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Envia una notificació quan arribi un correu electrònic"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Freqüència de comprovació de la safata d\'entrada"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Configuració d\'entrada"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nom d\'usuari, contrasenya i altres opcions de configuració del servidor d\'entrada"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Configuració de sortida"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nom d\'usuari, contrasenya i altres opcions de configuració del servidor de sortida"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Polítiques aplicades"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Cap"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Polítiques no compatibles"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Cap"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Intenta la sincronització"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Toca aquí per sincronitzar aquest compte"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Nom del compte"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"El vostre nom"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Signatura"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Respostes ràpides"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edita text que insereixes sovint en redactar correus electrònics"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Annexa text als missatges que envieu"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Configuració de notificacions"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Ús de dades"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Polítiques de seguretat"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Edita una resposta ràpida"</string>
- <string name="save_action" msgid="1988862706623227093">"Desa"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronitza els contactes"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincr. contactes d\'aquest compte"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronitza el calendari"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sincr. esdev. calend. per al compte"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincronitza el correu electrònic"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincr. miss. correu d\'aquest compte"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibra"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibra també quan arribi correu electrònic"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Sempre"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Només quan està en silenci"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Mai"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibra"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Tria un to"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Configuració del servidor"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Elimina el compte"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"El compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\" s\'eliminarà del correu electrònic."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Elimina el compte"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Elimina el compte"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Opcions de sincronització"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Opcions de sincronització (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Configuració de sincronització"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Comprova la freqüència"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Dies per sincronitzar"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Compte"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Tria un compte"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Selecció de carpeta"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"No s\'ha trobat el compte. És possible que s\'hagi eliminat."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"No s\'ha trobat la carpeta. És possible que s\'hagi eliminat."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Només alguns comptes \"Plus\" inclouen l\'accés POP que permet que aquest programa s\'hi connecti. Si no pots iniciar la sessió amb l\'adreça electrònica i la contrasenya correctes, pot ser que no tinguis un compte \"Plus\" de pagament. Inicia el navegador web per accedir a aquests comptes de correu."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Abans de configurar aquest compte de correu electrònic, visita el lloc web de T-Online i crea una contrasenya per a l\'accés al correu electrònic POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Corporatiu"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"No s\'ha pogut crear el compte. Torna-ho a provar."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Correu electrònic"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Activa les polítiques de seguretat especificades pel servidor"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"S\'està cercant <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> resultat de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultats de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Configuració"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Configuració general"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Aplicació"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avança automàticament"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Selecciona quina pantalla s\'ha de mostrar després de suprimir un missatge"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Amaga les caselles de selecció"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"En les llistes de missatges, toca i mantén premut per seleccionar"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirma abans de suprimir"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Missatges"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirma abans d\'enviar"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Missatges"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Vés a"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Missatge més recent"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Missatge més antic"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Llista de missatges"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Mida del text del missatge"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Text minúscul"</item>
- <item msgid="4415205108584620118">"Text petit"</item>
- <item msgid="4550219696381691112">"Text de mida normal"</item>
- <item msgid="6227813549949219991">"Text gran"</item>
- <item msgid="1197917420815786571">"Text enorme"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Mida del text del missatge"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Molt petita"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Petita"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Gran"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Enorme"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Respon a tots"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Fes que \"Respon a tots\" sigui l\'opció predet. per respondre missatges"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Pregunta per mostrar imatges"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"No es mostraran automàticament les imatges dels missatges"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"S\'ha esborrat \"Mostra les imatges\"."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"S\'està esperant per sincronitzar"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"El teu correu electrònic apareixerà aviat."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Toca la icona per canviar."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Safata d\'entrada combinada"</string>
- <string name="widget_unread" msgid="4404711399009077833">"No llegits"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Destacats"</string>
- <string name="widget_loading" msgid="2340962056927255554">"S\'està carregant…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Toca per configurar."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Encara no has configurat un compte de correu electrònic."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Cerca al correu electrònic"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Cerca a <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Resultats de la cerca per a \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"S\'estan esperant els resultats"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Alguns servidors poden trigar molt."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Carpetes"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"No permetis l\'ús de la càmera del dispositiu"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Requereix la contrasenya del dispositiu"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Restringeix la reutilització de contrasenyes recents"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Requereix que les contrasenyes caduquin"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Requereix un dispositiu absent per bloquejar-ne la pantalla"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Limita el nombre d\'esdev. calendari sincronitzats"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Limita el nombre de correus electr. sincronitzats"</string>
- <string name="quick_1" msgid="3426057697353380951">"Gràcies."</string>
- <string name="quick_2" msgid="4188036352885736617">"Em sembla molt bé."</string>
- <string name="quick_3" msgid="8061819976353395585">"Ho llegiré més tard i et respondré."</string>
- <string name="quick_4" msgid="3988974084396883051">"Organitzem una reunió per parlar-ne."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"La sincronització de fons per a aquest compte està desactivada en itinerància."</string>
- <string name="confirm_response" msgid="5747902757569543165">"S\'està enviant la resposta..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"No hi ha missatges."</string>
-</resources>
diff --git a/email2/res/values-ca/uploader.xml b/email2/res/values-ca/uploader.xml
deleted file mode 100644
index 8e251c9c6..000000000
--- a/email2/res/values-ca/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Càrrega instantània"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Àlbum de càrrega instantània"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"S\'està penjant"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Finalitzades"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Aturat"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d fotos • %3$d vídeos"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d fotos • %2$d vídeos"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"bateria baixa"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"s\'ha superat la quota de fotos"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"itinerància"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"s\'està esperant la Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"endarrerida fins a la càrrega"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"s\'està esperant la connexió"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"es tornarà a provar d\'aquí a %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Mostra les càrregues pendents"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Mostra les càrregues finalitzades"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Mostra en línia"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Mostra les càrregues pendents"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Amaga les càrregues pendents"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Mostra els detalls"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Amaga els detalls"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Configuració"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Penjats: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Compte"</string>
- <string name="upload" msgid="2615541458361216022">"Penja"</string>
- <string name="ok" msgid="2516349681897895312">"D\'acord"</string>
- <string name="cancel" msgid="1207103189404543868">"Cancel·la"</string>
- <string name="uploading_to" msgid="3986362895940069510">"S\'està penjant a "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" per a "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$S \"%2$S\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"S\'ha produït un error en inicialitzar la càrrega."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"El fitxer no està disponible."</string>
- <string name="account_error" msgid="1904775271866104941">"No s\'ha pogut recuperar la informació del compte."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"S\'ha produït un problema en iniciar la sessió al compte."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"S\'està esperant per tornar-ho a provar"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Esperant la Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"S\'està penjant"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Ha fallat"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Completat"</string>
- <string name="pause_state_running" msgid="711411177620353982">"s\'està penjant"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"aturat manualment"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"aturat: bateria baixa"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"aturat: endarrerida fins a la càrrega"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"aturat: s\'està esperant la connexió"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"aturat: fora de quota PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"aturat: s\'està esperant la Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"aturat: en itinerància"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"s\'està esperant per tornar a provar"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minut"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minuts"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minuts"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Sense connexió de dades"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"El compte s\'ha quedat sense quota de disc"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Fitxer no trobat"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Error al servei"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Error de xarxa"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Error en l\'autenticació"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Càrregues pendents [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Càrregues finalitzades [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Posa les càrregues en pausa"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Reprèn les càrregues"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Penja-la ara"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Penja més tard"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"No la pengis"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Visualitza"</string>
- <string name="manager_retry" msgid="939534318469518843">"Torna-ho a provar"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"S\'ha cancel·lat la càrrega"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"La càrrega ja ha finalitzat"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sincronitza-ho tot"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Darrera sincronització:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"La llista d\'elements finalitzats és buida."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Càrrega instantània"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Càrregues finalitzades"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Càrregues en pausa"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"La càrrega instantània encara no s\'ha activat"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Els fitxers grans només es penjaran mitjançant una connexió Wi-Fi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"S\'estan cercant fitxers..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"S\'estan preparant <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> fotos i <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> vídeos per a la càrrega..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"No cal penjar fotos/vídeos addicionals."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"S\'ha produït un error en comunicar amb el servidor. Torna-ho a provar més tard."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"S\'ha cancel·lat la Sincronització de tot"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sincronitza-ho tot"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Visualització finalitzada"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Mostra les pendents"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"General"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Pausa totes les càrregues"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Energia"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Penja només quan el telèfon s\'estigui carregant."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Penja només quan la Wi-Fi estigui disponible."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotos"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Compte"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Condicions de càrrega"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Mida de la foto"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Vídeos"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Compte"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"El compte de fotos s\'utilitzarà per a càrregues de vídeos."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Condicions de càrrega"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"S\'està utilitzant la configuració de connectivitat de fotos."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Només fotos mitjançant xarxes mòbils"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotos i vídeos mitjançant xarxes de telefonia mòbil"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Fotos i vídeos només mitjançant Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Quant a"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Versió de càrrega instantània"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Recomanat: 1.600 píxels (per compartir, impressions i estalvis de pantalla)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Mida original (càrrega més lenta)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"aturat: targeta SD no disponible"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Targeta SD no disponible"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Conf. Càrrega instantània"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Càrrega instantània"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Penja automàticament fotos i vídeos nous a un àlbum web privat"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Estat de la càrrega"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Avançada"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Càrregues de mòbil"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Càrregues d\'itinerància"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Penja les fotos i els vídeos a la xarxa de dades en itinerancia"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Pujades amb bateria"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Penja fotos i vídeos només quan s\'etigui carregant"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Càrrega de fotos existents"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Penja fotos i vídeos existents del telèfon ara"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Desactivat"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$S: %2$S"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"S\'està penjant (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d de %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"En pausa: toca per reprendre la càrrega"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Carrega les fotos existents"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Penjar fotos i vídeos que encara no s\'han penjat des del telèfon a un àlbum privat al web pot trigar una mica, però es durà a terme en segon pla. Estàs segur que vols continuar?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Sí"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"No"</string>
-</resources>
diff --git a/email2/res/values-cs/strings.xml b/email2/res/values-cs/strings.xml
deleted file mode 100644
index 0ecc4b5bc..000000000
--- a/email2/res/values-cs/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Číst přílohy e-mailů"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Umožňuje této aplikaci číst přílohy vašich e-mailů."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Přístup k datům poskytovatele e-mailu"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Povoluje aplikaci přístup do databáze e-mailů, a to včetně přijatých a odeslaných zpráv, uživatelských jmen a hesel."</string>
- <string name="app_name" msgid="5815426892327290362">"E-mail"</string>
- <string name="compose_title" msgid="427986915662706899">"Nová zpráva"</string>
- <string name="debug_title" msgid="5175710493691536719">"Ladit"</string>
- <string name="next_action" msgid="3931301986364184415">"Další"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Zrušit"</string>
- <string name="previous_action" msgid="5181616311579820981">"Předchozí"</string>
- <string name="send_action" msgid="1729766205562446418">"Odeslat"</string>
- <string name="reply_action" msgid="4262472229221507619">"Odpovědět"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Odpovědět všem"</string>
- <string name="delete_action" msgid="8421026208288857155">"Smazat"</string>
- <string name="forward_action" msgid="669174181042344116">"Předat dál"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Označit hvězdičkou"</string>
- <string name="done_action" msgid="7497990549515580249">"Hotovo"</string>
- <string name="create_action" msgid="3062715563215392251">"Vytvořit novou"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Smazat"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Žádné rychlé odpovědi."</string>
- <string name="discard_action" msgid="6532206074859505968">"Zahodit"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Uložit koncept"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Vložit rychlou odpověď"</string>
- <string name="read_action" msgid="4701484794504781686">"Označit jako přečtené"</string>
- <string name="unread_action" msgid="6280399049357552826">"Označit jako nepřečtené"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Přidat hvězdičku"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Odebrat hvězdičku"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Aktualizovat"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Přidat účet"</string>
- <string name="compose_action" msgid="4045702519637388045">"Nová zpráva"</string>
- <string name="search_action" msgid="6325101454876682308">"Hledat"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Nastavení účtu"</string>
- <string name="settings_action" msgid="6334807007967459412">"Nastavení"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Možnosti synchronizace"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Označit jako nepřečtené"</string>
- <string name="move_action" msgid="3059189775933985898">"Přesunout"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Kopie/skrytá"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Přidat kopii/skrytou kopii"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Přiložit soubor"</string>
- <string name="close_action" msgid="533058985745238100">"Zavřít"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Poslat všechny zprávy"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Výběr přílohy"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Přesunout do"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Načítání zpráv..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Problém s připojením."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Text zprávy se nepodařilo načíst. Zpráva je možná příliš velká a proto ji nelze zobrazit."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Přesunout zprávu"</item>
- <item quantity="other" msgid="371256717624461324">"Přesunout zprávy"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Účty POP3 přesun nepodporují."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Přesun nelze uskutečnit, protože vybrané zprávy pocházejí z různých účtů."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Zprávy ve složkách Koncepty, Pošta k odeslání a Odeslané nelze přesouvat."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"Nepřečtené zprávy: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g>(<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"Nepřečtené zprávy: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g>(<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"Nepřečtené zprávy: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g>(<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"v(e) <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> účtech"</item>
- <item quantity="other" msgid="2723797835410343458">"v(e) <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> účtech"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"komu: <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"Nové zprávy: <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Všechny účty"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"Účet <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="8548760449976444566">"Počet účtů: <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Doručená pošta"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Pošta k odeslání"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Koncepty"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Koš"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Odeslaná pošta"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Nevyžádaná pošta"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Nepřečtené"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Doručená pošta (nepřečtené)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Doručená pošta (vše)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Kombinované zobrazení (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> účet"</item>
- <item quantity="other" msgid="4145163147488719025">"Počet účtů: <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Verze: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Doručená pošta"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Označené hvězdičkou"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Koncepty"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Pošta k odeslání"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Kombinované zobrazení"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Zobrazit všechny složky"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Účty"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Nejnovější složky (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Všechny složky"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Poslední složky"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Předmět"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Předmět neuveden"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Načíst další zprávy"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"Vybrané zprávy: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="7901361399231876038">"Vybrané zprávy: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Žádné zprávy"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Komu"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Kopie"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Skrytá kopie"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Předmět"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Od:"</string>
- <string name="to" msgid="4392614766835725698">"Komu"</string>
- <string name="cc" msgid="7017720927911078193">"Kopie"</string>
- <string name="bcc" msgid="3098643138241111579">"Skrytá kopie"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Předmět"</string>
- <string name="body_hint" msgid="4279864165439577668">"Napsat zprávu"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Původní zpráva --------"\n"Předmět: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Odesílatel: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Komu: <xliff:g id="TO">%3$s</xliff:g>"\n"Kopie: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>napsal/a:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Zahrnout text v uvozovkách"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Zahrnout text"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Přidejte alespoň jednoho příjemce."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Některé e-mailové adresy jsou neplatné."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Soubor nelze připojit, protože je příliš velký."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Vložit rychlou odpověď"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"Uživatel <xliff:g id="NAME">%1$s</xliff:g> a další uživatelé (<xliff:g id="NUMBER">%2$d</xliff:g>)"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Komu:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Kopie:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Skrytá kopie:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Datum:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Od:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Předmět:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Zobrazit"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Instalovat"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Přehrát"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Načíst"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Informace"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Uložit"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Uloženo"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Zastavit"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Příloha uložena jako <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Přílohu se nepodařilo uložit."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Jedna či více příloh v přeposílané zprávě bude před odesláním stažena."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Zpráva"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Pozvánka"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Příloha: <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Přílohy: <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Zobrazit obrázky"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Vždy zobrazovat"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Vždy zobrazovat obrázky od tohoto odesílatele?"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Obrázky od tohoto odesilatele se zobrazí automaticky."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Zobrazit v Kalendáři"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Pozvánka v kalendáři"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Přijdete?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Ano"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Možná"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Ne"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Tuto pozvánku jste přijali."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Na tuto pozvánku jste odpověděli „možná“."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Tuto pozvánku jste odmítli."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Zobrazit podrobnosti"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Podrobnosti zprávy"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Informace o příloze"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Je požadováno připojení Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Nastavení Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Nastavení aplikace"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Přílohu nelze otevřít."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Tento soubor nemůžete uložit ani otevřít, protože tento typ přílohy může obsahovat škodlivý software."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Tuto přílohu nelze uložit ani otevřít kvůli zásadám zabezpečení účtu."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Tato příloha je příliš velká, aby ji bylo možné stáhnout pomocí mobilní sítě. Můžete ji stáhnout při příštím připojení k síti Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Nemáte nainstalovanou žádnou aplikaci, která by dokázala tuto přílohu otevřít. Zkuste příslušnou aplikaci stáhnout ze služby Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Tato příloha je aplikace. Chcete-li ji nainstalovat, zaškrtněte nejdříve v sekci Nastavení &gt; Aplikace možnost Neznámé zdroje."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Aplikace nelze instalovat přímo z e-mailu. Nejdříve aplikaci uložte a poté ji nainstalujte pomocí aplikace Stahování."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Přílohu nelze stáhnout."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Při dekódování zprávy došlo k chybě."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Zobraz. souboru <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Smazat tuto zprávu?"</item>
- <item quantity="other" msgid="4437637377522896262">"Smazat tyto zprávy?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Zpráva byla smazána."</item>
- <item quantity="other" msgid="6574961322865652255">"Zprávy byly smazány."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Zpráva byla zahozena."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Zpráva byla uložena jako koncept."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Přílohu nelze zobrazit."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Přílohu <xliff:g id="FILENAME">%s</xliff:g> nelze načíst."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Otevírání zprávy..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> zpráva byla přesunuta do schránky <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"Zprávy (<xliff:g id="NUM_MESSAGE">%1$d</xliff:g>) byly přesunuty do schránky <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Nepodařilo se přeposlat jednu nebo více příloh."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Příloha nebyla přeposlána"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Přihlášení k účtu <xliff:g id="ACCOUNT_NAME">%s</xliff:g> se nezdařilo."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Přihlášení se nezdařilo."</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Novější"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Starší"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Nastavení účtu"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"E-mailový účet"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Účet můžete nakonfigurovat v několika snadných krocích."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-mailová adresa"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Heslo"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Použít tento účet jako výchozí pro odesílání e-mailů"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ruční nastavení"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Zadejte platnou e-mailovou adresu a heslo."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplicitní účet"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Toto uživatelské jméno již používáte pro účet <xliff:g id="DUPLICATE">%s</xliff:g>."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Toto heslo začíná nebo končí nejméně jednou mezerou. Většina serverů hesla s mezerami nepodporuje."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Načítání informací o účtu..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Kontrola nastavení serveru příchozí pošty..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Kontrola nastavení serveru odchozí pošty..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Nastavení účtu"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Váš účet je nastaven, e-mail je na cestě!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Pojmenovat tento účet (nepovinné)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Vaše jméno (zobrazované na odchozích zprávách)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Toto pole nesmí být prázdné."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Nastavení účtu"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Typ účtu"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"O jaký typ účtu se jedná?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Nastavení účtu"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Nastavení serveru příchozí pošty"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Uživatelské jméno"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Heslo"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Typ zabezpečení"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Žádný"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Přijímat všechny certifikáty)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (Přijímat všechny certifikáty)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Mazat e-maily ze serveru"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Nikdy"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Při smazání z Doručené pošty"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Předpona cesty IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Nepovinné"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Nastavení účtu"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Nastavení serveru odchozí pošty"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Server SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Typ zabezpečení"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Vyžadovat přihlášení"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Uživatelské jméno"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Heslo"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Nastavení účtu"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Nastavení serveru"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Server"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Doména\\Uživatelské jméno"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Použít zabezpečené připojení (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Přijímat všechny certifikáty protokolu SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certifikát klienta"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Vybrat"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Použít klientský certifikát"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Odebrat"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Žádný"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID mobilního zařízení"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Nastavení účtu"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Možnosti účtu"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Četnost kontroly doručené pošty"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nikdy"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automaticky (v případě potřeby)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Každých 5 minut"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Každých 10 minut"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Každých 15 minut"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Každých 30 minut"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Každou hodinu"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Použít tento účet jako výchozí pro odesílání e-mailů"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Upozornit mě na příchod e-mailu"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synchronizovat kontakty z tohoto účtu"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synchronizovat kalendář z tohoto účtu"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synchronizovat e-mail z tohoto účtu"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Během připojení k síti Wi-Fi automaticky stahovat přílohy"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nelze dokončit"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Počet dní k synchronizaci"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatické"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Jeden den"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tři dny"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Jeden týden"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Dva týdny"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Jeden měsíc"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Vše"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Použít výchozí nastavení účtu"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Uživatelské jméno nebo heslo jsou nesprávné."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Uživatelské jméno nebo heslo jsou nesprávné."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nelze se bezpečně připojit k serveru."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nelze se bezpečně připojit k serveru."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Je vyžadován certifikát klienta. Chcete se k serveru připojit pomocí certifikátu klienta?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certifikát je neplatný nebo nedostupný."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Server odpověděl chybou. Zkontrolujte prosím uživatelské jméno a heslo a zkuste to znovu."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nelze se připojit k serveru."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Nelze se připojit k serveru."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"Služba TLS je požadována, ale není podporována na serveru."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Metody ověřování nejsou na serveru podporovány."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Nelze navázat připojení k serveru z důvodu chyby zabezpečení."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Nelze navázat připojení k serveru."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Zadali jste nesprávnou adresu serveru nebo server požaduje verzi protokolu, kterou aplikace E-mail nepodporuje."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Nemáte oprávnění k synchronizaci s tímto serverem. Vyžádejte si další informace od správce serveru."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Vzdálená správa zabezpečení"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Server <xliff:g id="SERVER">%s</xliff:g> žádá o povolení, aby mohl vzdáleně ovládat některé funkce zabezpečení v zařízení Android. Chcete dokončit nastavení tohoto účtu?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Server vyžaduje funkce zabezpečení, které toto zařízení Android nepodporuje, například: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Uživatelské jméno účtu nemůžete změnit. Chcete-li přidat účet s jiným uživatelským jménem, dotkněte se možnosti Přidat účet."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"UPOZORNĚNÍ: Deaktivujete-li oprávnění aplikace E-mail spravovat toto zařízení, budou smazány všechny účty aplikace E-mail, které toto oprávnění vyžadují. Společně s těmito účty budou smazány i všechny jejich e-maily, kontakty, události v kalendářích a další údaje."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Aktualizace zabezpečení"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Účet <xliff:g id="ACCOUNT">%s</xliff:g> vyžaduje aktualizaci nastavení zabezpečení."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Účet „<xliff:g id="ACCOUNT">%s</xliff:g>“ nelze synchronizovat z důvodu požadavků na zabezpečení."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Účet <xliff:g id="ACCOUNT">%s</xliff:g> požaduje aktualizaci nastavení zabezpečení."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Nastavení zabezpečení účtu <xliff:g id="ACCOUNT">%s</xliff:g> byla změněna. Uživatel nemusí provádět žádnou akci."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Je třeba aktualizovat zabezp."</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Zásady zabezpečení se změnily"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Nelze splnit zásady zabezp."</string>
- <string name="account_security_title" msgid="3511543138560418587">"Zabezpečení zařízení"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Server <xliff:g id="SERVER">%s</xliff:g> žádá o povolení, aby mohl vzdáleně ovládat některé funkce zabezpečení v zařízení Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Upravit podrobnosti"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"Účet <xliff:g id="ACCOUNT">%s</xliff:g> vyžaduje změnu kódu PIN nebo hesla pro uzamčení obrazovky."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Heslo zámku obrazovky brzy vyprší"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Platnost kódu PIN nebo hesla pro uzamčení obrazovky vypršela."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Platnost hesla pro uzamčení obrazovky vypršela"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Heslo zámku obrazovky brzy vyprší"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Je nutné, abyste si brzy změnili kód PIN nebo heslo pro uzamčení obrazovky, jinak dojde k vymazání údajů účtu <xliff:g id="ACCOUNT">%s</xliff:g>. Chcete tuto změnu provést hned?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Platnost hesla zámku obrazovky vypršela"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Ze zařízení jsou mazány údaje účtu <xliff:g id="ACCOUNT">%s</xliff:g>. Můžete je obnovit změnou kódu PIN nebo hesla pro uzamčení obrazovky. Chcete tuto změnu provést hned?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Zahodit neuložené změny?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Přihlášení se nezdařilo."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Uživatelské jméno nebo heslo k účtu <xliff:g id="ACCOUNT">%s</xliff:g> je nesprávné. Chcete je aktualizovat?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Výchozí účet"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Použít tento účet jako výchozí pro odesílání e-mailů"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Stahovat přílohy"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Automaticky stahovat přílohy posledních zpráv pomocí sítě Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"E-mailová upozornění"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Frekvence synchronizace, oznámení apod."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Zaslat upozornění, když přijde e-mail"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Četnost kontroly doručené pošty"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Nastavení příchozí pošty"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Uživatelské jméno, heslo a jiná nastavení serveru příchozí pošty"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Nastavení odchozí pošty"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Uživatelské jméno, heslo a jiná nastavení serveru odchozí pošty"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Vynucené zásady"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Žádné"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Zásady, které nejsou podporované"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Žádné"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Pokusit se synchronizovat"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Pokud chcete účet synchronizovat, dotkněte se tohoto tlačítka"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Název účtu"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Vaše jméno"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Podpis"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Rychlé odpovědi"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Upravit text, který při psaní e-mailů často vkládáte"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Připojit text k odesílaným zprávám"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Nastavení upozornění"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Využití dat"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Zásady zabezpečení"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Upravit rychlou odpověď"</string>
- <string name="save_action" msgid="1988862706623227093">"Uložit"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synchronizovat kontakty"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synchronizovat kontakty pro tento účet"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synchronizovat kalendář"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synch. udál. kalend. pro tento účet"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synchronizovat e-maily"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synchronizovat e-mail pro tento účet"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrace"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Při příchodu e-mailu také vibrovat"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Vždy"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Pouze v tichém režimu"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Nikdy"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibrace"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Vybrat vyzvánění"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Nastavení serveru"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Odebrat účet"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Účet <xliff:g id="ACCOUNT">%s</xliff:g> bude z aplikace Email odebrán."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Odebrat účet"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Odebrat účet"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Možnosti synchronizace"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Možnosti synchronizace (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Nastavení synchronizace"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Frekvence kontrol"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Počet dní k synchronizaci"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"E-mailový účet"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Vybrat účet"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Vyberte složku"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Účet nenalezen. Je možné, že byl odstraněn."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Složka nenalezena. Je možné, že byla odstraněna."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Přístup POP, který umožňuje připojení pomocí tohoto programu, zahrnují pouze některé účty typu Plus. Pokud zadáváte správnou e-mailovou adresu a heslo, ale nemůžete se přihlásit, pravděpodobně nemáte placený účet Plus. K těmto e-mailovým účtům můžete přistupovat prostřednictvím webového prohlížeče."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Před nastavením tohoto e-mailového účtu navštivte stránky T-Online a vytvořte heslo pro přístup k e-mailu prostřednictvím protokolu POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Firemní"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Účet se nepodařilo vytvořit. Zkuste to znovu."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-mail"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Povoluje zásady zabezpečení určené serverem"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Vyhledávání na webu <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> výsledek z webu <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"Počet výsledků: <xliff:g id="RESULTS">%1$d</xliff:g> z webu <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Nastavení"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Obecná nastavení"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Aplikace"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automaticky pokračovat"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Vyberte, kterou obrazovku chcete zobrazit po smazání zprávy."</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Skrýt zaškrtávací políčka"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"V seznamu zpráv provedete výběr klepnutím s podržením."</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Před smazáním potvrdit"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Zprávy"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Před odesláním potvrdit"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Zprávy"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Pokračovat na"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Novější zpráva"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Starší zpráva"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Seznam zpráv"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Velikost textu zprávy"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Drobný text"</item>
- <item msgid="4415205108584620118">"Malý text"</item>
- <item msgid="4550219696381691112">"Text běžné velikosti"</item>
- <item msgid="6227813549949219991">"Velký text"</item>
- <item msgid="1197917420815786571">"Obrovský text"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Velikost textu zprávy"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Velmi malý"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Malý"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normální"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Velký"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Velmi velký"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Odpovědět všem"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Nastavit volbu Odpovědět všem jako výchozí volbu odpovídání na zprávy"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Dotaz na zobrazování obrázků"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Obrázky ve zprávách se nebudou zobrazovat automaticky"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Nastavení Zobrazit obrázky bylo smazáno."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Čekání na synchronizaci"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Vaše e-maily se brzy zobrazí."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Změníte klepnutím na ikonu."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Všechny Doručené p."</string>
- <string name="widget_unread" msgid="4404711399009077833">"Nepřečtené"</string>
- <string name="widget_starred" msgid="8290352707134011791">"S hvězdičkou"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Načítání..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Dotykem nastavíte."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Zatím jste nenastavili e-mailový účet."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Hledat v e-mailu"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Vyhledávat ve složce <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Vyhledat výsledky pro dotaz <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Čekání na výsledky"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Některým serverům může tento proces trvat dlouho."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Složky"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Zakázat používání fotoaparátu v zařízení"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Požadovat heslo zařízení"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Omezit opětovné použití nedávných hesel"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Požadovat omezenou platnost hesel"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Při nečinnosti zamknout obrazovku"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Omezit počet synchronizovaných událostí kalendáře"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Omezit počet synchronizovaných e-mailů"</string>
- <string name="quick_1" msgid="3426057697353380951">"Díky!"</string>
- <string name="quick_2" msgid="4188036352885736617">"To zní dobře!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Přečtu si to později a ozvu se."</string>
- <string name="quick_4" msgid="3988974084396883051">"Můžeme si dohodnout schůzku, abychom to prodiskutovali."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Synchronizace na pozadí je v tomto účtu při roamingu zakázána."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Odesílání odpovědi..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Žádné zprávy."</string>
-</resources>
diff --git a/email2/res/values-cs/uploader.xml b/email2/res/values-cs/uploader.xml
deleted file mode 100644
index f15f9879d..000000000
--- a/email2/res/values-cs/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Okamžité nahrávání"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Album okamžitého nahrávání"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Nahrávání"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Dokončeno"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Pozastaveno"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • Fotografie: %2$d • Videa: %3$d"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"Fotografie:%1$d • Videa: %2$d"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"slabá baterie"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"byla překročena kvóta pro počet fotografií"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"čekání na síť Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"odloženo až do nabití"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"čeká se na připojení"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"další pokus za %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Zobrazit čekající nahrávání"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Zobrazit dokončená nahrávání"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Zobrazit online"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Zobrazit čekající nahrávání"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Skrýt čekající nahrávání"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Zobrazit podrobnosti"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Skrýt podrobnosti"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Nastavení"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Nahráno: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Účet"</string>
- <string name="upload" msgid="2615541458361216022">"Nahrát"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Zrušit"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Nahrávání: "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" pro uživatele "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s „%2$s“"</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Inicializace nahrávání se nezdařila."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Soubor není dostupný."</string>
- <string name="account_error" msgid="1904775271866104941">"Nepodařilo se načíst informace o účtu."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Při přihlašování do účtu došlo k chybě."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Čekání na opakování"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Čekání na připojení k síti Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Nahrávání"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Nezdařilo se"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Dokončeno"</string>
- <string name="pause_state_running" msgid="711411177620353982">"nahrávání"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"ručně pozastaveno"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"pozastaveno – slabá baterie"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"pozastaveno – odloženo až do nabití"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"pozastaveno – čekání na připojení"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"pozastaveno – překročili jste kvótu PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"pozastaveno – čekání na síť Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"pozastaveno – roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"čekání na opakování"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minuta"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minuty"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minut"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Žádné datové připojení"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Účet překročil limit místa na disku"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Soubor nebyl nalezen."</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Chyba služby"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Chyba sítě"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Ověření se nezdařilo."</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Nevyřízená nahrávání [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Dokončená nahrávání [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Pozastavit nahrávání"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Pokračovat v nahrávání"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Nahrát"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Nahrát později"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Nenahrávat"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Zobrazit"</string>
- <string name="manager_retry" msgid="939534318469518843">"Opakovat"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Nahrávání zrušeno"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Nahrávání již bylo dokončeno"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Synchronizovat vše"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Poslední synchronizace:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Seznam dokončených položek je prázdný."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Okamžité nahrávání"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Nahrávání dokončena"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Nahrávání pozastavena"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Okamžité nahrávání zatím nebylo aktivováno"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Velké soubory se nahrají pouze prostřednictvím připojení Wi-Fi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Vyhledávání souborů..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Příprava <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> fotografií a <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> videí k nahrání..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Není potřeba nahrávat žádné další fotografie nebo videa."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Při komunikaci se serverem došlo k potížím. Zkuste to prosím znovu později."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Synchronizace všeho zrušena"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Synchronizovat vše"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Zobrazit dokončená"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Zobrazit čekající"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Obecné"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Pozastavit všechna nahrávání"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Napájení"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Nahrávat pouze při nabíjení telefonu."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Nahrávat, jen když je k dispozici síť Wi-Fi."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotografie"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Účet"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Podmínky nahrávání"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Velikost fotografie"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videa"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Účet"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Videa se nahrají pomocí účtu pro fotografie."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Podmínky nahrávání"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Momentálně se používá nastavení připojení pro fotografie."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Pomocí mobilních sítí nahrávat jen fotky"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotografie a videa prostřednictvím mobilních sítí"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Fotografie a videa jen prostřednictvím sítí Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"O aplikaci"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Verze Okamžitého nahrávání"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Doporučeno: 1600 pixelů (pro sdílení, tisk a spořiče obrazovky)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Původní velikost (nejpomalejší nahrávání)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"pozastaveno – karta SD není dostupná"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Karta SD není dostupná"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Nastav. okamž. nahr."</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Okamžité nahrávání"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Automaticky nahrávat nové fotografie a videa do soukromého webového alba"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Stav nahrávání"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Pokročilé"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Nahrávání pomocí mobilního datového připojení"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Nahrávání při roamingu"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Nahrávat fotky a videa při roamingu v datové síti"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Nahrávání dle baterie"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Fotografie a videa nahrávat jen při nabíjení"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Nahrát existující fotky"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Nahrát všechny existující fotky a videa z telefonu"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Vypnuto"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Nahrávání (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d z celkem %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Pozastaveno. Nahrávání obnovíte dotykem."</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Nahrát existující fotky"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Nahrání zatím nenahraných fotek a videí z telefonu do soukromého alba na webu může chvíli trvat, ale proběhne na pozadí. Chcete pokračovat?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Ano"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Ne"</string>
-</resources>
diff --git a/email2/res/values-da/strings.xml b/email2/res/values-da/strings.xml
deleted file mode 100644
index 920742b27..000000000
--- a/email2/res/values-da/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Læs vedhæftede filer i e-mails"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Tillader, at appen kan læse vedhæftede filer i dine e-mails."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Få adgang til data om e-mailudbyder"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Tillader, at denne app kan få adgang til din e-maildatabase, f.eks. modtagne beskeder, sendte beskeder, brugernavne og adgangskoder."</string>
- <string name="app_name" msgid="5815426892327290362">"E-mail"</string>
- <string name="compose_title" msgid="427986915662706899">"Skriv"</string>
- <string name="debug_title" msgid="5175710493691536719">"Fejlretning"</string>
- <string name="next_action" msgid="3931301986364184415">"Næste"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Annuller"</string>
- <string name="previous_action" msgid="5181616311579820981">"Forrige"</string>
- <string name="send_action" msgid="1729766205562446418">"Send"</string>
- <string name="reply_action" msgid="4262472229221507619">"Svar"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Svar alle"</string>
- <string name="delete_action" msgid="8421026208288857155">"Slet"</string>
- <string name="forward_action" msgid="669174181042344116">"Videresend"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Stjernemarker"</string>
- <string name="done_action" msgid="7497990549515580249">"Færdig"</string>
- <string name="create_action" msgid="3062715563215392251">"Opret nyt"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Slet"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Ingen hurtige svar."</string>
- <string name="discard_action" msgid="6532206074859505968">"Kassér"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Gem kladde"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Indsæt hurtigt svar"</string>
- <string name="read_action" msgid="4701484794504781686">"Markér som læst"</string>
- <string name="unread_action" msgid="6280399049357552826">"Markér som ulæst"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Tilføj stjerne"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Fjern stjerne"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Opdater"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Tilføj konto"</string>
- <string name="compose_action" msgid="4045702519637388045">"Skriv"</string>
- <string name="search_action" msgid="6325101454876682308">"Søg"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Indstillinger for konto"</string>
- <string name="settings_action" msgid="6334807007967459412">"Indstillinger"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Muligheder for synkronisering"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Markér som ulæst"</string>
- <string name="move_action" msgid="3059189775933985898">"Flyt"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Tilføj Cc/Bcc"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Vedhæft fil"</string>
- <string name="close_action" msgid="533058985745238100">"Luk"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Send alle beskeder"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Vælg vedhæftet fil"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Flyt til"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Indlæser meddelelser..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Forbindelsesproblem."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Beskedteksten kunne ikke indlæses. Beskeden er muligvis for stor til at blive vist."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Flyt meddelelse"</item>
- <item quantity="other" msgid="371256717624461324">"Flyt meddelelser"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Flytning understøttes ikke for POP3-konti."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Kan ikke flyttes, fordi det valgte indeholder flere konti."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Beskeder i Kladder, Udbakke og Sendte kan ikke flyttes."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ulæste (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ulæste (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ulæste (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"i <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> konti"</item>
- <item quantity="other" msgid="2723797835410343458">"i <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> konti"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"til <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> nye beskeder"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Alle konti"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> konto"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> konti"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Indbakke"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Udbakke"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Kladder"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Papirkurv"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Sendt"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Junk"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Ulæste"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Indbakke (ulæste)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Indbakke (alle)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Kombineret visning (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> konto"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> konti"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Version: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Indbakke"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Stjernemarkerede"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Kladder"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Udbakke"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Kombineret visning"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Vis alle mapper"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Konti"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Nylige mapper (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Alle mapper"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Seneste mapper"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Emne"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Intet emne"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Indlæs flere beskeder"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> markeret"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> markerede"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Ingen beskeder"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Til"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Emne"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Fra:"</string>
- <string name="to" msgid="4392614766835725698">"Til"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Bcc"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Emne"</string>
- <string name="body_hint" msgid="4279864165439577668">"Skriv e-mail"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Oprindelig meddelelse --------"\n"Emne: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Fra: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Til: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> skrev:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Inkluder citeret tekst"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Medtag tekst"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Tilføj mindst én modtager."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Nogle e-mailadresser er ugyldige."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Filen er for stor til at vedhæfte."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Indsæt hurtigt svar"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> og <xliff:g id="NUMBER">%2$d</xliff:g> andre"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Til:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Dato:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Fra:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Emne:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Vis"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Installer"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Afspil"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Indlæs"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Info"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Gem"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Gemt"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stop"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Vedhæftelse gemmes som <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Vedhæftning kunne ikke gemmes"</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"En eller flere vedhæftede filer i din videresendte besked downloades før afsendelse."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Besked"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Inviter"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Vedhæftning <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Vedhæftede filer <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Vis billeder"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Vis altid"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Vis altid billeder fra denne afsender"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Billeder fra denne afsender vises automatisk."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Vis i Kalender"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Invitation i Kalender"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Skal du med?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Ja"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Måske"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Nej"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Du har accepteret denne invitation."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Du har svaret \"måske\" til denne invitation."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Du har afvist denne invitation."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Vis detaljer"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Beskedoplysninger"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Oplysninger om vedhæftet fil"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Wi-Fi-forbindelse kræves"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Indstillinger for Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Indstillinger for app"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Vedhæftet fil kan ikke åbnes."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Du kan ikke gemme eller åbne denne fil, fordi denne type vedhæftede fil kan indeholde skadelig software."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Denne vedhæftede fil kan ikke gemmes eller åbnes på grund af sikkerhedspolitikken på denne konto."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Denne vedhæftede fil er for stor til at blive downloadet via mobilnetværket. Du kan downloade den, næste gang du har forbindelse til et Wi-Fi-netværk."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Der er ikke installeret en app, der kan åbne denne vedhæftede fil. Prøv at downloade en passende app på Android Marked."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Denne vedhæftede fil er en app. Du skal markere Ukendte kilder i Indstillinger &gt; Apps, før du kan installere den."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Apps kan ikke installeres direkte fra e-mails. Du skal først gemme denne app og derefter installere den ved hjælp af appen Downloads."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Den vedhæftede fil kunne ikke downloades."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Der opstod en fejl under afkodning af beskeden."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Viser <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Vil du slette denne besked?"</item>
- <item quantity="other" msgid="4437637377522896262">"Vil du slette disse beskeder?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Beskeden er slettet."</item>
- <item quantity="other" msgid="6574961322865652255">"Beskederne er slettet."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Besked kasseret."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Beskeden er gemt som kladde."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Den vedhæftede fil kan ikke vises."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Den vedhæftede fil \"<xliff:g id="FILENAME">%s</xliff:g>\" kunne ikke indlæses."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Åbner besked..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> beskeder er flyttet til <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> beskeder er flyttet til <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"En eller flere vedhæftede filer kunne ikke videresendes."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Vedhæftet fil er ikke sendt"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> kunne ikke logge ind."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Login mislykkedes"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> b"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> b"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> Gb"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> Gb"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Nyere"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Ældre"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Kontoindstillinger"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"E-mailkonto"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Du kan nemt og hurtigt oprette din konto."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-mailadresse"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Adgangskode"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Send e-mail fra denne konto som standard"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuel opsætning"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Indtast en gyldig e-mailadresse og adgangskode."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dobbeltforekomst af konto"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Du bruger allerede dette brugernavn til kontoen \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Denne adgangskode starter eller slutter med ét eller flere mellemrum. Mange servere understøtter ikke adgangskoder med mellemrum."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Henter kontooplysninger ..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Kontrollerer indstillinger for indgående server ..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Kontrollerer indstillinger for udgående server ..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Kontoindstillinger"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Din konto er konfigureret, og der er e-mail på vej."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Giv kontoen et navn (valgfrit)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Dit navn (vist på udgående beskeder)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Dette felt må ikke være tomt."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Kontoindstillinger"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Kontotype"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Hvilken slags konto er dette?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Kontoindstillinger"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Indstillinger for indgående server"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Brugernavn"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Adgangskode"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Sikkerhedstype"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ingen"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Accepter alle certifikater)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (accepter alle certifikater)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Slet e-mail fra server"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Aldrig"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Når jeg sletter fra Indbakke"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Præfiks for IMAP-sti"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Valgfrit"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Kontoindstillinger"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Indstillinger for udgående server"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-server"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Sikkerhedstype"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Kræv login"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Brugernavn"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Adgangskode"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Kontoindstillinger"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Serverindstillinger"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Server"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domæne\\brugernavn"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Brug sikker forbindelse (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Accepter alle SSL-certifikater"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Klientcertifikat"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Vælg"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Brug klientcertifikat"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Fjern"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Intet"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Id for mobilenhed"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Indstillinger for konto"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Kontovalgmuligheder"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Kontrolfrekvens for indbakke"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Aldrig"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automatisk (Push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Hvert 5. minut"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Hvert 10. minut"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Hvert 15. minut"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Hvert 30. minut"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Hver time"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Send e-mail fra denne konto som standard"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Giv mig besked ved nye e-mails"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synkroniser kontaktpersoner fra denne konto"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synkroniser kalender fra denne konto"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synkroniser e-mails fra denne konto"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Download vedhæftede filer automatisk, når forbundet til Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Kunne ikke afsluttes"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dage, der skal synkroniseres"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatisk"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"En dag"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tre dage"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"En uge"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"To uger"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"En måned"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Alle"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Anvend kontostandarden"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Brugernavn eller adgangskode er forkert."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Brugernavn eller adgangskode er forkert."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Der kan ikke oprettes en sikker forbindelse til serveren."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Der kan ikke oprettes en sikker forbindelse til serveren."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Der kræves et klientcertifikat. Vil du oprette forbindelse til serveren med et klientcertifikat?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certifikatet er ugyldigt eller ikke tilgængeligt."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Serveren reagerede med en fejl. Kontroller dit brugernavn og din adgangskode, og prøv igen."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Der kan ikke oprettes forbindelse til serveren."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Der kan ikke oprettes forbindelse til serveren."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS er påkrævet, men understøttes ikke af serveren."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Godkendelsesmetoderne understøttes ikke af serveren."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Der kunne ikke oprettes forbindelse til serveren på grund af en sikkerhedsfejl."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Forbindelse til serveren kunne ikke oprettes."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Du har indtastet en forkert serveradresse, eller serveren kræver en protokolversion, som E-mail ikke understøtter."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Du har ikke tilladelse til at synkronisere med denne server. Kontakt din servers administrator for at få flere oplysninger."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Ekstern sikkerhedsadministration"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Serveren <xliff:g id="SERVER">%s</xliff:g> kræver, at du giver den tilladelse til eksternt at kontrollere nogle af Android-enhedens sikkerhedsfunktioner. Vil du afslutte opsætning af denne konto?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Denne server kræver sikkerhedsfunktioner, som din Android-enhed ikke understøtter, f.eks.: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Du kan ikke ændre brugernavnet på en konto. Hvis du vil tilføje en konto med et andet brugernavn, skal du trykke på Tilføj konto."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"ADVARSEL! Hvis du deaktiverer appen E-mails tilladelse til at administrere din enhed, slettes alle konti i E-mail, der kræver dette, sammen med alle e-mails, kontaktpersoner, kalenderbegivenheder og andre data på disse konti."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Sikkerhedsopdatering"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> kræver, at du opdaterer dine sikkerhedsindstillinger."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Kontoen \"<xliff:g id="ACCOUNT">%s</xliff:g>\" kan ikke synkroniseres på grund af sikkerhedskravene."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Kontoen \"<xliff:g id="ACCOUNT">%s</xliff:g>\" kræver opdatering af sikkerhedsindstillingerne."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Kontoen \"<xliff:g id="ACCOUNT">%s</xliff:g>\" har skiftet sikkerhedsindstillinger. Ingen brugerhandling er påkrævet."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Sikkerhedsopdatering kræves"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Sikkerhedpolitikker er ændret"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Politikker kan ikke opfyldes"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Enhedssikkerhed"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Serveren <xliff:g id="SERVER">%s</xliff:g> kræver, at du giver den tilladelse til eksternt at kontrollere nogle af Android-enhedens sikkerhedsfunktioner."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Rediger detaljer"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" kræver, at du ændrer skærmlåsens pinkode eller adgangskode."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Skærmlåskoden er ved at udløbe"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Pinkoden eller adgangskoden til skærmlåsen er udløbet."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Skærmlåskoden er udløbet"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Skærmlåskoden er ved at udløbe"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Du skal ændre pinkoden eller adgangskoden til din skærmlås snart, ellers vil data for <xliff:g id="ACCOUNT">%s</xliff:g> vil blive slettet. Vil du ændre dette nu?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Skærmlåskoden er udløbet"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Dataene for <xliff:g id="ACCOUNT">%s</xliff:g> er ved at blive slettet fra enheden. Du kan gendanne dem ved at ændre skærmlåsens pinkode eller adgangskode. Vil du ændre dette nu?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Vil du kassere ændringer, som ikke er gemt?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Login mislykkedes"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Brugernavn eller adgangskode for <xliff:g id="ACCOUNT">%s</xliff:g> er forkert. Vil du opdatere dem nu?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Standardkonto"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Send e-mail fra denne konto som standard"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Download vedhæftede filer"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Download autom. vedhæftede filer i de seneste beskeder via Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"E-mail-beskeder"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Synkroniseringsinterval, meddelelser osv."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Send en meddelelse ved nye e-mails"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Kontrolfrekvens for indbakke"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Indgående indstillinger"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Brugernavn, adgangskode og indstillinger for indgående server"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Udgående indstillinger"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Brugernavn, adgangskode og indstillinger for udgående server"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Politikker håndhævet"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ingen"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Ikke-understøttede politikker"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ingen"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Forsøg synkronisering"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Tryk her for at synkronisere denne konto"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Kontonavn"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Dit navn"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Signatur"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Hurtige svar"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Rediger tekst, som du ofte indsætter, når du skriver e-mails"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Vedhæft tekst til beskeder, du sender"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Indstillinger for underretninger"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Dataforbrug"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Sikkerhedspolitikker"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Rediger hurtigt svar"</string>
- <string name="save_action" msgid="1988862706623227093">"Gem"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synkroniser kontaktpersoner"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synkroniser kontaktpersoner til denne konto"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synkroniser kalender"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synkroniser begivenhed for konto"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synkroniser e-mails"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synkroniser e-mail for denne konto"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibration"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibrer også, når der kommer e-mail"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Altid"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Kun ved lydløs"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Aldrig"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibration"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Vælg ringetone"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Serverindstillinger"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Fjern konto"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Kontoen \"<xliff:g id="ACCOUNT">%s</xliff:g>\" fjernes fra E-mail."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Fjern konto"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Fjern konto"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Indstillinger for synkronisering"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Indstillinger for synkronisering (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Indstillinger for synkronisering"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Opdateringsfrekvens"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Dage, der skal synkroniseres"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"E-mail-konto"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Vælg en konto"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Vælg en mappe"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Kontoen blev ikke fundet. Den er muligvis blevet fjernet."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Mappen blev ikke fundet. Den kan være blevet fjernet."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Det er kun nogle \"Plus\"-konti med POP-adgang, der tillader, at dette program opretter forbindelse. Hvis du ikke kan logge ind med din rigtige e-mailadresse og adgangskode, har du muligvis ikke en betalt \"Plus\"-konto. Åbn webbrowseren igen for at få adgang til disse e-mailkonti."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Inden du konfigurerer denne e-mailkonto, skal du gå til T-Onlines website og oprette en adgangskode for e-mailadgang via POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Exchange"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Kontoen kunne ikke oprettes. Prøv igen."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-mail"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Muliggør serverspecifikke sikkerhedspolitikker"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Søger efter <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> resultater fra <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultater fra <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Indstillinger"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Generelle indstillinger"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Applikation"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Gå automatisk frem"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Vælg, hvilken skærm der skal vises, når du har slettet en besked"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Skjul afkrydsningsfelter"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Tryk og holde nede for at vælge på lister over samtaler"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Bekræft før sletning"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Meddelelser"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Bekræft før afsendelse"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Meddelelser"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Gå frem til"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Nyere besked"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Ældre besked"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Beskedliste"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Tekststørrelse i besked"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Lillebitte tekst"</item>
- <item msgid="4415205108584620118">"Lille tekst"</item>
- <item msgid="4550219696381691112">"Tekst i normal størrelse"</item>
- <item msgid="6227813549949219991">"Stor tekst"</item>
- <item msgid="1197917420815786571">"Stor tekst"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Tekststørrelse i besked"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Lillebitte"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Lille"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Stor"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Kæmpestor"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Svar alle"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Gør \"Svar alle\" til standardsvar for meddelelser"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Bed om at vise billeder"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Billeder i meddelelser vises ikke automatisk"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Vis billeder\" er ryddet."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> af <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Venter på synkronisering"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Dine e-mails dukker snart op."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Tryk for at skifte."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Kombineret indbakke"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Ulæste"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Stjernemarkeret"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Indlæser..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Tryk for at konfigurere."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Du har ikke oprettet en e-mailkonto endnu."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Søg i e-mail"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Søg i <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Søgeresultater for \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Venter på resultater"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Nogle servere kan være langsomme."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mapper"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Tillad ikke brug af enheden kamera"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Kræv adgangskode for enheden"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Begræns genbrug af seneste adgangskoder"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Kræv, at adgangskoder udløber"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Kræv, at en inaktiv enheds skærm låses"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Begræns antallet af synkron. kalenderbegivenheder"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Begræns antallet af synkroniserede e-mails"</string>
- <string name="quick_1" msgid="3426057697353380951">"Tak!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Det passer mig fint!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Jeg læser dette senere og vender tilbage til dig."</string>
- <string name="quick_4" msgid="3988974084396883051">"Lad os holde et møde for at diskutere dette."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Baggrundssynkronisering for denne konto deaktiveres under roaming."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Sender svar..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Ingen meddelelser."</string>
-</resources>
diff --git a/email2/res/values-da/uploader.xml b/email2/res/values-da/uploader.xml
deleted file mode 100644
index f2a6f1aa6..000000000
--- a/email2/res/values-da/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Øjeblikkelig upload"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Album for Øjeblikkelig upload"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"uploader"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Afsluttet"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Midlertidigt standset"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d billeder • %3$d videoer"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d billeder • %2$d videoer"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"lavt batteriniveau"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"Billedkvote overskredet"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"venter på Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"udsat indtil opladning"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"venter på forbindelse"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"prøver igen om %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Vis afventende uploads"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Vis afsluttede uploads"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Vis på nettet"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Vis afventende uploads"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Skjul afventende uploads"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Vis detaljer"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Skjul detaljer"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Indstillinger"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Uploadet %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Konto"</string>
- <string name="upload" msgid="2615541458361216022">"Upload"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Annuller"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Uploader til "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" for "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Upload kunne ikke igangsættes."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Filen er ikke tilgængelig."</string>
- <string name="account_error" msgid="1904775271866104941">"Kunne ikke hente kontooplysninger."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Der opstod et problem med at logge ind på din konto."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Venter på at prøve igen"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Venter på Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"uploader"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Mislykket"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Fuldført"</string>
- <string name="pause_state_running" msgid="711411177620353982">"uploader"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"midlertidigt standset manuelt"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"midlertidigt standset – lavt batteriniveau"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"midlertidigt standset – udsat indtil opladning"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"midlertidigt standset – venter på forbindelse"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"midlertidigt standset - PWA-kvote overskredet"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"midlertidigt standset – venter på Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"midlertidigt standset – roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"venter på at prøve igen"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minut"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minutter"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minutter"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Ingen dataforbindelse"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Kontoen er uden for diskkvote"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Filen blev ikke fundet"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Tjenestefejl"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Netværksfejl"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Godkendelsen mislykkedes"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Afventende uploads [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Gennemførte uploads [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Stands uploads midlertidigt"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Genoptag uploads"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Upload nu"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Upload senere"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Skal ikke uploades"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Vis"</string>
- <string name="manager_retry" msgid="939534318469518843">"Prøv igen"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Upload annulleret"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Upload er allerede færdig"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Synkroniser alle"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Sidste synkronisering:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Listen over afsluttede punkter er tom."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Øjeblikkelig upload"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Uploads er afsluttet"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Uploads er midlertidigt standset"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Øjeblikkelig upload er ikke aktiveret endnu"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Store filer vil kun uploades via en Wi-Fi-forbindelse."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Søger efter filer..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Forbereder <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> billeder og <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> videoer til upload..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Ingen yderligere billeder/videoer skal uploades."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Der opstod et problem med serveren. Prøv igen senere."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Synkroniser alle annullerede"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Synkroniser alle"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Vis gennemførte"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Vis afventende"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Generelt"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Stands alle uploads midlertidigt"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Strøm"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Upload kun, når telefonen er ved at blive opladet."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Upload kun, når Wi-Fi er tilgængelig."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Billeder"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Konto"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Uploadbetingelser"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Billedstørrelse"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videoer"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Konto"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Billedkontoen bruges til videouploads."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Betingelser for upload"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Billedernes forbindelsesindstillinger bruges i øjeblikket."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Kun billeder via mobilnetværk"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotos og videoer via mobilnetværk"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Kun billeder og videoer via Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Om"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Øjebl. upload-v."</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Anbefales: 1600 pixel (til deling, udskrivning og screensavere)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Oprindelig størrelse (langsomste upload)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"midlertidigt standset – SD-kort ikke tilgængeligt"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD-kortet er ikke tilgængeligt"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Indst. for Øjeb. upload"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Øjeblikkelig upload"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Upload automatisk nye billeder og videoer til et privat album på nettet"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Uploadstatus"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Avanceret"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Mobiluploads"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Roaminguploads"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Upload billeder og videoer, når der søges efter datanetværk"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Batteriuploads"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Upload kun billeder og videoer under opladning"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Upload eksisterende billeder"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Upload alle eksisterende billeder og videoer fra din telefon nu"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Deaktiveret"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Uploader (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d af %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Midlertidigt standset: Tryk for at genoptage upload"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Upload eksisterende billeder"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Det kan tage et stykke tid at uploade billeder og videoer, der ikke allerede er blevet uploadet, fra din telefon til et privat album på nettet, men det vil ske i baggrunden. Er du sikker på, at du vil fortsætte?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Ja"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Nej"</string>
-</resources>
diff --git a/email2/res/values-de/strings.xml b/email2/res/values-de/strings.xml
deleted file mode 100644
index bf41f33be..000000000
--- a/email2/res/values-de/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"E-Mail-Anhänge lesen"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Ermöglicht der App, Ihre E-Mail-Anhänge zu lesen"</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Auf Daten des E-Mail-Anbieters zugreifen"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Ermöglicht der App, auf Ihre E-Mail-Datenbank zuzugreifen, einschließlich empfangener und gesendeter Nachrichten, Nutzernamen sowie Passwörtern"</string>
- <string name="app_name" msgid="5815426892327290362">"E-Mail"</string>
- <string name="compose_title" msgid="427986915662706899">"Schreiben"</string>
- <string name="debug_title" msgid="5175710493691536719">"Fehler suchen"</string>
- <string name="next_action" msgid="3931301986364184415">"Weiter"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Abbrechen"</string>
- <string name="previous_action" msgid="5181616311579820981">"Zurück"</string>
- <string name="send_action" msgid="1729766205562446418">"Senden"</string>
- <string name="reply_action" msgid="4262472229221507619">"Antworten"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Allen antworten"</string>
- <string name="delete_action" msgid="8421026208288857155">"Löschen"</string>
- <string name="forward_action" msgid="669174181042344116">"Weiterleiten"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Markieren"</string>
- <string name="done_action" msgid="7497990549515580249">"Fertig"</string>
- <string name="create_action" msgid="3062715563215392251">"Neue erstellen"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Löschen"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Keine Kurzantworten"</string>
- <string name="discard_action" msgid="6532206074859505968">"Verwerfen"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Speichern"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Kurzantwort einfügen"</string>
- <string name="read_action" msgid="4701484794504781686">"Als gelesen markieren"</string>
- <string name="unread_action" msgid="6280399049357552826">"Als ungelesen markieren"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Markierung hinzufügen"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Markierung entfernen"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Aktualisieren"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Konto hinzufügen"</string>
- <string name="compose_action" msgid="4045702519637388045">"Schreiben"</string>
- <string name="search_action" msgid="6325101454876682308">"Suche"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Kontoeinstellungen"</string>
- <string name="settings_action" msgid="6334807007967459412">"Einstellungen"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Synchronisierungsoptionen"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Als ungelesen markieren"</string>
- <string name="move_action" msgid="3059189775933985898">"Verschieben"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Cc/Bcc hinzufügen"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Datei anhängen"</string>
- <string name="close_action" msgid="533058985745238100">"Schließen"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Alle senden"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Anhang auswählen"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Verschieben"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Nachrichten werden geladen..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Verbindungsproblem"</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Der Nachrichtentext kann nicht geladen werden. Die Nachricht ist möglicherweise zu lang, um angezeigt zu werden."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Nachricht verschieben"</item>
- <item quantity="other" msgid="371256717624461324">"Nachrichten verschieben"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Verschieben wird für POP3-Konten nicht unterstützt."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Verschieben nicht möglich, da mehrere Konten ausgewählt wurden."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Nachrichten im Postausgang und den Ordnern \"Entwürfe\" und \"Gesendet\" können nicht verschoben werden."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ungelesen (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ungelesen (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ungelesen (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"in <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> Google-Konten"</item>
- <item quantity="other" msgid="2723797835410343458">"in <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> Google-Konten"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"an <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> neue Nachrichten"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Alle Konten"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> Konto"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> Konten"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Posteingang"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Postausgang"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Entwürfe"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Papierkorb"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Gesendet"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Junk"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Ungelesen"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Posteingang (ungelesen)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Posteingang (alle)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Kombinierte Ansicht (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> Konto"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> Konten"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Version: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Posteingang"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Markiert"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Entwürfe"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Postausgang"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Kombinierte Ansicht"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Alle Ordner anzeigen"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Konten"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Letzte Ordner (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Alle Ordner"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Letzte Ordner"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Betreff"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Kein Betreff"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Weitere Nachrichten laden"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> ausgewählt"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> ausgewählt"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Keine Nachrichten"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"An"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Betreff"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Von:"</string>
- <string name="to" msgid="4392614766835725698">"An"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Bcc"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Betreff"</string>
- <string name="body_hint" msgid="4279864165439577668">"E-Mail schreiben"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Originalnachricht --------"\n"Betreff: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Von: <xliff:g id="SENDER">%2$s</xliff:g>"\n"An: <xliff:g id="TO">%3$s</xliff:g>"\n"Cc: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> schrieb:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Zitierten Text einfügen"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Text einfügen"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Fügen Sie mindestens einen Empfänger hinzu."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Einige E-Mail-Adressen sind ungültig."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Dateianhang zu groß"</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Kurzantwort einfügen"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> und <xliff:g id="NUMBER">%2$d</xliff:g> weitere"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"An:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Datum:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Von:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Betreff:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Anzeigen"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Installieren"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Wiedergabe"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Laden"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Info"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Speichern"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Gespeichert"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stoppen"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Anhang als <xliff:g id="FILENAME">%s</xliff:g> gespeichert."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Speichern nicht möglich"</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Mindestens ein Anhang in Ihrer weitergeleiteten Nachricht wird vor dem Senden heruntergeladen."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Nachricht"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Einladen"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Anhang: <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Anhänge: <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Bilder anzeigen"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Immer anzeigen"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Bilder von diesem Absender immer anzeigen"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Bilder von diesem Absender werden automatisch angezeigt."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Im Kalender anzeigen"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Kalendereinladung"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Teilnehmen?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Ja"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Vielleicht"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Nein"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Sie haben diese Einladung angenommen."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Sie haben auf diese Einladung mit \"Vielleicht\" geantwortet."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Sie haben diese Einladung abgelehnt."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Details anzeigen"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Nachrichtendetails"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Informationen zum Anhang"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"WLAN-Verbindung erforderlich"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"WLAN-Einstellungen"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"App-Einstellungen"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Anhang kann nicht geöffnet werden."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Sie können diese Datei nicht öffnen oder speichern, da diese Art von Anhang möglicherweise schädliche Software enthält."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Dieser Anhang kann aufgrund der Sicherheitsrichtlinien dieses Kontos nicht gespeichert oder geöffnet werden."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Dieser Anhang ist zu groß, um ihn über ein Mobilfunknetz herunterzuladen. Sie können ihn herunterladen, sobald Sie das nächste Mal mit einem WLAN-Netzwerk verbunden sind."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Sie verfügen über keine App, mit der Sie diesen Anhang öffnen können. Laden Sie eine entsprechende App von Android Market herunter."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Dieser Anhang ist eine App. Aktivieren Sie \"Unbekannte Quellen\" unter \"Einstellungen\" &gt; \"Apps\", damit Sie die App installieren können."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Apps können nicht direkt aus E-Mails installiert werden. Speichern Sie diese App zuerst und installieren Sie sie dann mithilfe der App \"Downloads\"."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Anhang kann nicht heruntergeladen werden."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Beim Entschlüsseln der Nachricht ist ein Fehler aufgetreten."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Anzeige von <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Diese Nachricht löschen?"</item>
- <item quantity="other" msgid="4437637377522896262">"Diese Nachrichten löschen?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Nachricht gelöscht"</item>
- <item quantity="other" msgid="6574961322865652255">"Nachrichten gelöscht"</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Nachricht gelöscht"</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Nachricht als Entwurf gespeichert"</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Anhang kann nicht angezeigt werden."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Anhang \"<xliff:g id="FILENAME">%s</xliff:g>\" kann nicht geladen werden."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Nachricht wird geöffnet..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> Nachricht verschoben in: <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> Nachrichten verschoben in: <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Mindestens ein Anhang wurde nicht weitergeleitet."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Anhang nicht weitergeleitet"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Anmeldung in <xliff:g id="ACCOUNT_NAME">%s</xliff:g> erfolglos"</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Anmeldung nicht möglich"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Neuer"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Älter"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" - "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Kontoeinrichtung"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"E-Mail-Konto"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Sie können Ihr Konto in wenigen Schritten einrichten."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-Mail-Adresse"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Passwort"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"E-Mails standardmäßig von diesem Konto senden"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuell einrichten"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Geben Sie eine gültige E-Mail-Adresse und ein gültiges Passwort ein."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dupliziertes Konto"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Sie verwenden diesen Nutzernamen bereits für das Konto \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Dieses Passwort beginnt oder endet mit einem oder mehreren Leerzeichen. Viele Server unterstützen keine Passwörter mit Leerzeichen."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Kontoinformationen werden abgerufen..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Einstellungen des Eingangsservers werden überprüft..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Einstellungen des Ausgangsservers werden überprüft..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Kontoeinrichtung"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Das Konto ist jetzt eingerichtet und die E-Mail ist unterwegs."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Konto benennen (optional)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Ihr Name (wird bei ausgehenden E-Mails angezeigt)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Dieses Feld darf nicht leer sein."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Kontoeinrichtung"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Kontotyp"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Um welchen Kontotyp handelt es sich hierbei?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Kontoeinrichtung"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Einstellungen des Eingangsserver"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nutzername"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Passwort"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Sicherheitstyp"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Keine"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (alle Zertifikate akzeptieren)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (alle Zertifikate akzeptieren)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"E-Mail von Server löschen"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Nie"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Wenn ich sie aus dem Posteingang lösche"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP-Pfadpräfix"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Optional"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Kontoeinrichtung"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Einstellungen des Ausgangsserver"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-Server"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Sicherheitstyp"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Anmeldung erforderlich"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nutzername"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Passwort"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Kontoeinrichtung"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Servereinstellungen"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Server"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domain-/Nutzername"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Sichere Verbindung (SSL) verwenden"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Alle SSL-Zertifikate akzeptieren"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Client-Zertifikat"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Auswählen"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Client-Zertifikat verwenden"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Entfernen"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Keine"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Mobilgerät-ID"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Kontoeinstellungen"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Konto-Optionen"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Häufigkeit des E-Mail-Abrufs"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nie"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automatisch (Push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Alle 5 Minuten"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Alle 10 Minuten"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Alle 15 Minuten"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Alle 30 Minuten"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Stündlich"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"E-Mails standardmäßig von diesem Konto senden"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Bei neuer E-Mail benachrichtigen"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Kontakte dieses Kontos synchronisieren"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Kalender dieses Kontos synchronisieren"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"E-Mails dieses Kontos synchronisieren"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Anhänge bei WLAN-Verbindung automatisch herunterladen"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Fertigstellen nicht möglich"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Zu synchronisierende Tage"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatisch"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Ein Tag"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Drei Tage"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Eine Woche"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Zwei Wochen"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Ein Monat"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Alle"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Kontostandard verwenden"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nutzername oder Passwort ist falsch."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nutzername oder Passwort ist falsch."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Keine sichere Verbindung zum Server möglich"</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Keine sichere Verbindung zum Server möglich."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Ein Client-Zertifikat ist erforderlich. Möchten Sie mit einem Client-Zertifikat eine Verbindung zum Server herstellen?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Das Zertifikat ist ungültig oder nicht aufrufbar."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Der Server hat einen Fehler zurückgegeben. Bitte überprüfen Sie Ihren Nutzernamen und Ihr Passwort und versuchen Sie es erneut."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Derzeit kann keine Verbindung zum Server hergestellt werden."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Keine Verbindung zum Server möglich."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS erforderlich aber nicht von Server unterstützt"</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Authentifizierungsmethoden werden nicht vom Server unterstützt."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Verbindung zu Server kann aufgrund eines Sicherheitsfehlers nicht hergestellt werden."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Verbindung zum Server kann nicht geöffnet werden."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Sie haben eine falsche Serveradresse eingegeben oder der Server erfordert eine Protokollversion, die zurzeit nicht unterstützt wird."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Sie haben keine Berechtigung, eine Synchronisierung mit diesem Server durchzuführen. Wenden Sie sich für weitere Informationen an Ihren Server-Administrator."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Remote-Sicherheitsverwaltung"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Der Server <xliff:g id="SERVER">%s</xliff:g> fordert die Erlaubnis zur Remote-Steuerung einiger Sicherheitsfunktionen auf Ihrem Android-Gerät an. Möchten Sie die Einrichtung dieses Kontos abschließen?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Dieser Server erfordert Sicherheitsfunktionen, die Ihr Android-Gerät nicht unterstützt, darunter: <xliff:g id="ERROR">%s</xliff:g>."</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Sie können Nutzernamen von Konten nicht ändern. Wählen Sie \"Konto hinzufügen\" aus, um ein Konto mit einem anderen Nutzernamen hinzuzufügen."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"Warnung: Wenn Sie die Berechtigung der E-Mail-App zur Verwaltung Ihres Geräts deaktivieren, werden alle E-Mail-Konten, die diese Berechtigung benötigen, mit allen zugehörigen E-Mails, Kontakten, Terminen und anderen Daten gelöscht."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Sicherheitsupdate"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> erfordert, dass Sie Ihre Sicherheitseinstellungen aktualisieren."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Das Konto \"<xliff:g id="ACCOUNT">%s</xliff:g>\" kann aufgrund von Sicherheitsanforderungen nicht synchronisiert werden."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Für das Konto \"<xliff:g id="ACCOUNT">%s</xliff:g>\" müssen die Sicherheitseinstellungen aktualisiert werden."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Die Sicherheitseinstellungen des Kontos \"<xliff:g id="ACCOUNT">%s</xliff:g>\" haben sich geändert. Es sind keine Maßnahmen durch den Nutzer erforderlich."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Sicherheitsupdate erforderlich"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Richtlinien wurden geändert."</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Richtlinien nicht einzuhalten"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Gerätesicherheit"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Der Server <xliff:g id="SERVER">%s</xliff:g> fordert die Erlaubnis zur Remote-Steuerung einiger Sicherheitsfunktionen auf Ihrem Android-Gerät an."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Details bearbeiten"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" erfordert, dass Sie PIN bzw. Passwort für die Display-Sperre ändern."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Sperr-Passwort läuft ab"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Ihre PIN bzw. Ihr Passwort zum Sperren des Bildschirms ist abgelaufen."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Sperr-Passwort abgelaufen"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Passwort für Bildschirmsperre läuft ab"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Sie müssen Ihre PIN für die Display-Sperre bald ändern, da sonst die Daten für <xliff:g id="ACCOUNT">%s</xliff:g> gelöscht werden. Möchten Sie sie jetzt ändern?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Sperr-Passwort abgelaufen"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Die Daten für <xliff:g id="ACCOUNT">%s</xliff:g> werden von Ihrem Gerät gelöscht. Sie können die Daten wiederherstellen, indem Sie Ihre PIN für die Display-Sperre oder Ihr Passwort ändern. Möchten Sie die PIN oder das Passwort jetzt ändern?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Nicht gespeicherte Änderungen verwerfen?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Anmeldung nicht möglich"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Nutzername oder Kennwort für <xliff:g id="ACCOUNT">%s</xliff:g> ist falsch. Möchten Sie die Daten jetzt ändern?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Standardkonto"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"E-Mails standardmäßig von diesem Konto senden"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Anhänge herunterladen"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Anhänge neuer Nachrichten automatisch über WLAN herunterladen"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"E-Mail-Benachrichtigung"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Synchronisierungshäufigkeit, Benachrichtigungen usw."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Bei neuen E-Mails benachrichtigen"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Häufigkeit des E-Mail-Abrufs"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Eingehende Nachrichten"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nutzername, Passwort und andere Einstellungen für Eingangsserver"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Ausgehende Nachrichten"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nutzername, Passwort und andere Einstellungen für Ausgangsserver"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Richtlinien durchgesetzt"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Keine"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nicht unterstützte Richtlinien"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Keine"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Synchronisieren"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Hier berühren, um dieses Konto zu synchronisieren"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Kontoname"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Mein Name"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Signatur"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Kurzantworten"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Häufig in neue E-Mails eingefügten Text bearbeiten"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Text an ausgehende Nachrichten anhängen"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Benachrichtigungseinstellungen"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Datenverbrauch"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Sicherheitsrichtlinien"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Kurzantwort bearbeiten"</string>
- <string name="save_action" msgid="1988862706623227093">"Speichern"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Kontakte synchr."</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Kontakte dieses Kontos synchronisieren"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Kalender synchr"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Termin für dieses Kontos synchronisieren"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"E-Mails synchr."</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"E-Mails dieses Kontos synchronisieren"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibration"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Bei E-Mail-Eingang zusätzlich vibrieren"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Immer"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Nur im Lautlos-Modus"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Nie"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibration"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Klingelton auswählen"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Servereinstellungen"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Konto entfernen"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Das Konto \"<xliff:g id="ACCOUNT">%s</xliff:g>\" wird aus E-Mail entfernt."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Konto entfernen"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Konto entfernen"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Synchronisierungsoptionen"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Synchronisierungsoptionen (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Synchronisierungseinstellungen"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Abrufhäufigkeit"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Zu synchronisierende Tage"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"E-Mail-Konto"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Konto auswählen"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Ordner auswählen"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Konto wurde nicht gefunden. Es wurde möglicherweise entfernt."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Ordner wurde nicht gefunden. Er wurde möglicherweise entfernt."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Nur einige \"Plus\"-Konten haben einen POP-Zugang, der diesem Programm ermöglicht, eine Verbindung aufzubauen. Sollten Sie nicht dazu in der Lage sein, sich mit Ihrer korrekten E-Mail-Adresse und dem richtigen Passwort anzumelden, verfügen Sie möglicherweise nicht über ein kostenpflichtiges \"Plus\"-Konto. Starten Sie Ihren Webbrowser, um auf diese Konten zuzugreifen."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Richten Sie vor der Erstellung des E-Mail-Kontos ein Passwort für den POP3-E-Mail-Zugang auf der T-Online-Website ein."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Microsoft Exchange"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Konto konnte nicht erstellt werden. Bitte versuchen Sie es erneut."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-Mail"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Aktiviert serverspezifische Sicherheitsrichtlinien"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Durchsuche <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> Ergebnis von <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> Ergebnisse von <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Einstellungen"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Allgemeine Einstellungen"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"App"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatisch fortfahren"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Was soll nach dem Löschen einer Nachricht angezeigt werden?"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Kontrollkästchen ausblenden"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"In Nachrichtenlisten zum Auswählen berühren und halten"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Vor dem Löschen bestätigen"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Nachrichten"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Vor dem Senden bestätigen"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Nachrichten"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Weiter zu"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"neuerer Nachricht"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"älterer Nachricht"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Nachrichtenliste"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Nachrichtentextgröße"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Sehr kleiner Text"</item>
- <item msgid="4415205108584620118">"Kleiner Text"</item>
- <item msgid="4550219696381691112">"Normal großer Text"</item>
- <item msgid="6227813549949219991">"Großer Text"</item>
- <item msgid="1197917420815786571">"Sehr großer Text"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Nachrichtentextgröße"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Sehr klein"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Klein"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Groß"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Sehr groß"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Allen antworten"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"\"Allen antworten\" als Standard für die E-Mail-Beantwortung festlegen"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Fragen, bevor Bilder angezeigt werden"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Bilder in E-Mails werden nicht automatisch angezeigt."</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Bilder anzeigen\" gelöscht"</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> von <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Warten auf Synchronisierung"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Ihre E-Mails werden gleich angezeigt."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Symbol zum Wechseln berühren."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Kombinierter Posteingang"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Ungelesen"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Markiert"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Wird geladen…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Zum Einrichten berühren"</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Sie haben noch kein E-Mail-Konto eingerichtet."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"In E-Mails suchen"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"<xliff:g id="ID_1">%1$s</xliff:g> durchsuchen"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Suchergebnisse für \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Warten auf Ergebnisse"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Bei einigen Servern benötigen Sie möglicherweise etwas mehr Geduld."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Ordner"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Verwendung der Kamera nicht zulassen"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Geräte-Passwort erforderlich"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Einsatz der letzten Passw. beschränken"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Ablaufen von Passwörtern erforderlich"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Bildschirmsperre für inaktives Gerät"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Anzahl synchronisierter Kalendereinträge begrenzen"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Anzahl synchronisierter E-Mails begrenzen"</string>
- <string name="quick_1" msgid="3426057697353380951">"Vielen Dank!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Hört sich gut an!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Ich lese die Nachricht später und melde mich dann."</string>
- <string name="quick_4" msgid="3988974084396883051">"Wir können das am besten bei einem Meeting besprechen."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Die Hintergrundsynchronisierung ist für dieses Konto während des Roamings deaktiviert."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Antwort wird gesendet..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Keine Nachrichten"</string>
-</resources>
diff --git a/email2/res/values-de/uploader.xml b/email2/res/values-de/uploader.xml
deleted file mode 100644
index 3bb1deacf..000000000
--- a/email2/res/values-de/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Sofort-Upload"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Sofort-Upload-Album"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Upload wird durchgeführt"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Abgeschlossen"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Angehalten"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d Fotos • %3$d Videos"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d Fotos • %2$d Videos"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"Niedriger Akkustand"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"Fotokontingent überschritten"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"Roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"Warten auf WLAN"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"Zuerst Akku laden"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"Warten auf Verbindung"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"Erneuter Versuch in %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Ausstehende Uploads anzeigen"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Abgeschlossene Uploads anzeigen"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Online anzeigen"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Ausstehende Uploads anzeigen"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Ausstehende Uploads ausblenden"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Details anzeigen"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Details ausblenden"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Einstellungen"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Hochgeladen: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Konto"</string>
- <string name="upload" msgid="2615541458361216022">"Hochladen"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Abbrechen"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Hochladen auf "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" für "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Die Initialisierung des Uploads ist fehlgeschlagen."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Datei nicht verfügbar"</string>
- <string name="account_error" msgid="1904775271866104941">"Abrufen von Kontoinformationen fehlgeschlagen"</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Bei der Anmeldung in Ihrem Konto ist ein Problem aufgetreten."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Warten auf erneuten Versuch"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Warten auf WLAN"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Upload wird durchgeführt"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Fehlgeschlagen"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Abgeschlossen"</string>
- <string name="pause_state_running" msgid="711411177620353982">"Hochladen"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"Manuell ausgesetzt"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"Ausgesetzt - Akku schwach"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"Ausgesetzt - zuerst Akku laden"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"Ausgesetzt - Warten auf Verbindung"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"Ausgesetzt - PWA-Kontingent erschöpft"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"Ausgesetzt - Warten auf WLAN"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"Ausgesetzt - Roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"Warten auf erneuten Versuch"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 Minute"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 Minuten"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 Minuten"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Keine Datenverbindung"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Das Speicherplatzkontingent für das Konto ist überschritten."</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Datei nicht gefunden"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Dienstfehler"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Netzwerkfehler"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Authentifizierung fehlgeschlagen"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Ausstehende Uploads [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Abgeschlossene Uploads [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Uploads anhalten"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Mit Uploads fortfahren"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Jetzt hochladen"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Später hochladen"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Nicht hochladen"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Anzeigen"</string>
- <string name="manager_retry" msgid="939534318469518843">"Erneut versuchen"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Upload abgebrochen"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Upload bereits beendet"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Alle synchronisieren"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Letzte Synchronisierung:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Die Liste der abgeschlossenen Elemente ist leer."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Sofort-Upload"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Uploads beendet"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Uploads angehalten"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Sofort-Upload wurde noch nicht aktiviert."</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Große Dateien werden nur über eine WLAN-Verbindung hochgeladen."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Dateien werden gesucht..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"<xliff:g id="PHOTOCOUNT">%1$d</xliff:g> Fotos und <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> Videos werden für den Upload vorbereitet..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Es müssen keine zusätzlichen Fotos/Videos hochgeladen werden."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Bei der Kommunikation mit dem Server ist ein Problem aufgetreten. Versuchen Sie es später erneut."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Synchronisierung aller Elemente abgebrochen"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Alle synchronisieren"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Abgeschlossene anzeigen"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Ausstehende anzeigen"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Allgemein"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Alle Uploads anhalten"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Akku aufladen"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Nur hochladen, wenn Akku geladen wird"</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"WLAN"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Nur hochladen, wenn WLAN verfügbar ist"</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotos"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Konto"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Upload-Einstellungen"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Fotogröße"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videos"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Konto"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Das Konto für Fotos wird für Video-Uploads verwendet."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Upload-Einstellungen"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Vorerst werden die Verbindungseinstellungen für Fotos verwendet."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Nur Fotos über Mobilfunknetze"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotos und Videos über Mobilfunknetze"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Fotos und Videos nur über WLAN"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Über"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Sofort-Upload-Version"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Empfohlen: 1600 Pixel (für Weitergabe, Druck und Bildschirmschoner)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Originalgröße (langsamster Upload)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"Ausgesetzt - SD-Karte nicht verfügbar"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD-Karte nicht verfügbar"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Einstellungen für Sofort-Upload"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Sofort-Upload"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Neue Fotos und Videos automatisch in ein privates Webalbum hochladen"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Upload-Status"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Erweitert"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Mobile Uploads"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Roaming-Uploads"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Fotos und Videos bei Roaming im Datennetz hochladen"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Akku-Uploads"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Fotos und Videos nur hochladen, wenn der Akku geladen wird"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Vorhandene Fotos hochladen"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Jetzt alle vorhandenen Fotos und Videos von Ihrem Telefon hochladen"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Deaktiviert"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Hochladen (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d von %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Angehalten: zum Fortsetzen des Uploads tippen"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Vorhandene Fotos hochladen"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Das Hochladen von Fotos und Videos, die noch nicht von Ihrem Telefon in ein privates Album im Web hochgeladen wurden, kann einige Zeit dauern. Der Upload wird jedoch im Hintergrund ausgeführt. Möchten Sie wirklich fortfahren?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Ja"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Nein"</string>
-</resources>
diff --git a/email2/res/values-el/strings.xml b/email2/res/values-el/strings.xml
deleted file mode 100644
index ab55054e9..000000000
--- a/email2/res/values-el/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Ανάγνωση επισυνάψεων μηνύματος ηλεκτρονικού ταχυδρομείου"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Επιτρέπει στην εφαρμογή την ανάγνωση των συνημμένων ηλεκτρονικού ταχυδρομείου."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Πρόσβαση στα δεδομένα παρόχου ηλεκτρονικού ταχυδρομείου"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Επιτρέπει στην εφαρμογή την πρόσβαση στη βάση δεδομένων του ηλεκτρονικού ταχυδρομείου σας, συμπεριλαμβανομένων των ληφθέντων μηνυμάτων, των απεσταλμένων, των ονομάτων χρηστών και των κωδικών πρόσβασης."</string>
- <string name="app_name" msgid="5815426892327290362">"Μήνυμα ηλεκτρονικού ταχυδρομείου"</string>
- <string name="compose_title" msgid="427986915662706899">"Σύνταξη"</string>
- <string name="debug_title" msgid="5175710493691536719">"Εντοπισμός σφαλμάτων"</string>
- <string name="next_action" msgid="3931301986364184415">"Επόμενο"</string>
- <string name="okay_action" msgid="8365197396795675617">"ΟΚ"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Ακύρωση"</string>
- <string name="previous_action" msgid="5181616311579820981">"Προηγούμενο"</string>
- <string name="send_action" msgid="1729766205562446418">"Αποστολή"</string>
- <string name="reply_action" msgid="4262472229221507619">"Απάντηση"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Απάντηση σε όλους"</string>
- <string name="delete_action" msgid="8421026208288857155">"Διαγραφή"</string>
- <string name="forward_action" msgid="669174181042344116">"Προώθηση"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Επισήμανση με αστέρι"</string>
- <string name="done_action" msgid="7497990549515580249">"Τέλος"</string>
- <string name="create_action" msgid="3062715563215392251">"Δημιουργία νέου"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Διαγραφή"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Δεν υπάρχουν γρήγορες απαντήσεις."</string>
- <string name="discard_action" msgid="6532206074859505968">"Απόρριψη"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Αποθ. πρόχειρου"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Εισαγωγή γρήγ. απάντησης"</string>
- <string name="read_action" msgid="4701484794504781686">"Επισήμανση ως αναγνωσμένων"</string>
- <string name="unread_action" msgid="6280399049357552826">"Επισήμανση ως μη αναγνωσμένα"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Προσθήκη αστεριού"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Κατάργηση αστεριού"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Ανανέωση"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Προσθήκη λογαριασμού"</string>
- <string name="compose_action" msgid="4045702519637388045">"Σύνταξη"</string>
- <string name="search_action" msgid="6325101454876682308">"Αναζήτηση"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Ρυθμίσεις λογαριασμού"</string>
- <string name="settings_action" msgid="6334807007967459412">"Ρυθμίσεις"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Επιλογές συγχρονισμού"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Επισήμανση ως μη αναγνωσμένα"</string>
- <string name="move_action" msgid="3059189775933985898">"Μετακίνηση"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Κοιν./Κρ.κοιν."</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Προσθ.Κοιν./Κρ.κοιν."</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Επισύναψη αρχείου"</string>
- <string name="close_action" msgid="533058985745238100">"Κλείσιμο"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Αποστολή όλων"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Επιλογή επισύναψης"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Μετακίνηση σε"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Φόρτωση μηνυμάτων…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Πρόβλημα σύνδεσης."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Δεν ήταν δυνατή η φόρτωση του κειμένου μηνύματος. Το μήνυμα ενδέχεται να είναι πάρα πολύ μεγάλο για προβολή."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Μετακίνηση μηνύματος"</item>
- <item quantity="other" msgid="371256717624461324">"Μετακίνηση μηνυμάτων"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Η μετακίνηση δεν υποστηρίζεται σε λογαριασμούς POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Δεν είναι δυνατή η μετακίνηση επειδή η επιλογή περιλαμβάνει πολλούς λογαριασμούς."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Τα μηνύματα στους φακέλους \"Πρόχειρα\", \"Προς αποστολή\" και \"Απεσταλμένα\" δεν είναι δυνατό να μετακινηθούν."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> μη αναγνωσμένα (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> μη αναγνωσμένα (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> μη αναγνωσμένα (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"σε <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> λογαριασμούς"</item>
- <item quantity="other" msgid="2723797835410343458">"σε <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> λογαριασμούς"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"στο λογαριασμό <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> νέα μηνύματα"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Όλοι οι λογαριασμοί"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> λογαριασμός"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> λογαριασμοί"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Εισερχόμενα"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Εξερχόμενα"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Πρόχειρα"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Κάδος απορριμμάτων"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Απεσταλμένα"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Ανεπιθύμητα"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Μη αναγνωσμένα"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Εισερχόμενα (μη αναγνωσμένα)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Εισερχόμενα (όλα)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Συνδυασμένη προβολή (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"Λογαριασμός <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="4145163147488719025">"Λογαριασμοί <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Έκδοση: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Εισερχόμενα"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Με αστέρι"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Πρόχειρα"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Εξερχόμενα"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Συνδυασμένη προβολή"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Εμφάνιση όλων των φακέλων"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Λογαριασμοί"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Πρόσφατοι φάκελοι (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Όλοι οι φάκελοι"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Πρόσφατοι φάκελοι"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Θέμα"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Χωρίς θέμα"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Φόρτωση περισσότερων μηνυμάτων"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"Επιλέχθηκαν <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="7901361399231876038">"Επιλέχθηκαν <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Δεν υπάρχουν μηνύματα"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Προς"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Κοιν."</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Κρυφή κοιν."</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Θέμα"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Από:"</string>
- <string name="to" msgid="4392614766835725698">"Προς"</string>
- <string name="cc" msgid="7017720927911078193">"Κοιν."</string>
- <string name="bcc" msgid="3098643138241111579">"Κρυφ. κοιν."</string>
- <string name="subject_hint" msgid="7253964583324677128">"Θέμα"</string>
- <string name="body_hint" msgid="4279864165439577668">"Σύνταξη μηνύματος ηλεκτρονικού ταχυδρομείου"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Αρχικό μήνυμα --------"\n"Θέμα: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Από: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Προς: <xliff:g id="TO">%3$s</xliff:g>"\n"Κοιν.: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"Ο χρήστης <xliff:g id="SENDER">%s</xliff:g> έγραψε:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Συμπερίληψη του αναφερόμενου κειμένου"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Συμπερίληψη κειμένου"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Προσθέστε τουλάχιστον έναν παραλήπτη."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Ορισμένες διευθύνσεις ηλεκτρονικού ταχυδρομείου δεν είναι έγκυρες."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Πολύ μεγάλο αρχείο για επισύναψη."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Εισαγάγετε γρήγορη απάντηση"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> και <xliff:g id="NUMBER">%2$d</xliff:g> ακόμα"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Προς:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Κοιν.:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Κρυφή κοιν.:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Ημερομηνία:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Από:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Θέμα:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Προβολή"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Εγκατάστ."</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Αναπαραγ."</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Φόρτωση"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Πληροφ."</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Αποθήκευση"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Αποθηκεύτ."</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Διακοπή"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Αποθήκευση επισύναψης ως <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Αδύν. η αποθ. του συνημμένου."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Ένα ή περισσότερα συνημμένα στο προωθημένο μήνυμά σας θα ληφθούν πριν την αποστολή."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Μήνυμα"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Πρόσκληση"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Συνημμένο<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Συνημμένα <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Εμφάνιση εικόνων"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Να εμφανίζονται πάντα"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Να εμφανίζονται πάντα οι εικόνες από αυτόν τον παραλήπτη"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Οι εικόνες από αυτόν τον αποστολέα θα εμφανίζονται αυτόματα."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Προβολή στο Ημερολόγιο"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Πρόσκληση ημερολογίου"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Θα πάτε;"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Ναι"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Ίσως"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Όχι"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Αποδεχτήκατε την πρόσκληση."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Έχετε απαντήσει \"ίσως\" σε αυτή την πρόσκληση."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Απορρίψατε την πρόσκληση."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Εμφάνιση λεπττομερειών"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Λεπτομέρειες μηνύματος"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Πληροφορίες επισύναψης"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Απαιτείται σύνδεση Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Ρυθμίσεις Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Ρυθμίσεις εφαρμογής"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Δεν είναι δυνατό το άνοιγμα της επισύναψης."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Δεν μπορείτε να αποθηκεύσετε ή να ανοίξετε αυτό το αρχείο επειδή αυτός ο τύπος επισύναψης ενδέχεται να περιέχει κακόβουλο λογισμικό."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Δεν είναι δυνατή η αποθήκευση ή το άνοιγμα αυτής της επισύναψης εξαιτίας των πολιτικών ασφάλειας αυτού του λογαριασμού."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Το μέγεθος αυτής της επισύναψης είναι πολύ μεγάλο για τη λήψη μέσω δικτύου κινητής τηλεφωνίας. Μπορείτε να πραγματοποιήσετε λήψη της επισύναψης την επόμενη φορά που θα συνδεθείτε σε δίκτυο Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Δεν υπάρχει καμία εγκατεστημένη εφαρμογή η οποία να μπορεί να ανοίξει αυτήν την επισύναψη. Δοκιμάστε να κάνετε λήψη μιας κατάλληλης εφαρμογής από το Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Αυτή η επισύναψη είναι εφαρμογή. Θα πρέπει να επιλέξετε τις \"Άγνωστες προελεύσεις\" από το μενού Ρυθμίσεις &gt; Εφαρμογές προτού την εγκαταστήσετε."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Δεν είναι δυνατή η αποθήκευση εφαρμογών απευθείας από το ηλεκτρονικό ταχυδρομείο. Αποθηκεύστε πρώτα αυτήν την εφαρμογή και έπειτα εγκαταστήστε την χρησιμοποιώντας την εφαρμογή \"Λήψεις\"."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Δεν ήταν δυνατή η λήψη αυτής της επισύναψης."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Παρουσιάστηκε κάποιο σφάλμα κατά την αποκωδικοποίηση του μηνύματος."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Προβολή <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Να διαγραφεί αυτό το μήνυμα;"</item>
- <item quantity="other" msgid="4437637377522896262">"Να διαγραφούν αυτά τα μηνύματα;"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Το μήνυμα διαγράφηκε."</item>
- <item quantity="other" msgid="6574961322865652255">"Τα μηνύματα διαγράφηκαν."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Το μήνυμα απορρίφθηκε."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Το μήνυμα αποθηκεύτηκε ως πρόχειρο."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Δεν είναι δυνατή η εμφάνιση του συνημμένου."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Δεν ήταν δυνατή η φόρτωση του συνημμένου \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Άνοιγμα μηνύματος…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> μήνυμα μετακινήθηκε σε <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> μηνύματα μετακινήθηκαν σε <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Δεν ήταν δυνατή η προώθηση μίας ή περισσότερων επισυνάψεων."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Η επισύναψη δεν προωθήθηκε"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Η σύνδεση στον λογαριασμό <xliff:g id="ACCOUNT_NAME">%s</xliff:g> δεν ήταν επιτυχής."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Δεν ήταν δυνατή η σύνδεση"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Νεότερα"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Παλαιότερα"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Ρύθμιση λογαριασμού"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Λογαριασμός ηλεκτρονικού ταχυδρομείου"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Μπορείτε να ρυθμίσετε τον λογαριασμό σας σε λίγα μόλις βήματα."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Διεύθυνση ηλεκτρονικού ταχυδρομείου"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Κωδικός πρόσβασης"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου από αυτόν τον λογαριασμό από προεπιλογή"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Μη αυτόματη ρύθμιση"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Πληκτρολογήστε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου και έναν έγκυρο κωδικό πρόσβασης."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Διπλότυπος λογαριασμός"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Χρησιμοποιείτε ήδη αυτό το όνομα χρήστη για τον λογαριασμό \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Αυτός κωδικός πρόσβασης ξεκινά ή καταλήγει σε έναν ή περισσότερους χαρακτήρες κενού διαστήματος. Πολλοί διακομιστές δεν υποστηρίζουν κωδικούς πρόσβασης με κενά διαστήματα."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Ανάκτηση στοιχείων λογαριασμού..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Έλεγχος ρυθμίσεων διακομιστή εισερχομένων..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Έλεγχος ρυθμίσεων διακομιστή εξερχομένων..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Ρύθμιση λογαριασμού"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Ο λογαριασμός σας ρυθμίστηκε και γίνεται λήψη μηνυμάτων ηλεκτρονικού ταχυδρομείου!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Δώστε σε αυτόν τον λογαριασμό ένα όνομα (προαιρετικό)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Το όνομά σας (προβάλλεται στα εξερχόμενα μηνύματα)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Αυτό το πεδίο δεν μπορεί να είναι κενό."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Ρύθμιση λογαριασμού"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Τύπος λογαριασμού"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Τι τύπος λογαριασμού είναι αυτός;"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Ρύθμιση λογαριασμού"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Ρυθμίσεις διακομιστή εισερχομένων"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Όνομα χρήστη"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Κωδικός πρόσβασης"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Διακομιστής"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Θύρα"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Τύπος ασφάλειας"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Καμία"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Αποδοχή όλων των πιστοποιητικών)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (αποδοχή όλων των πιστοποιητικών)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Διαγραφή μηνύματος ηλεκτρονικού ταχυδρομείου από διακομιστή"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Ποτέ"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Όταν διαγράφω από τα Εισερχόμενα"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Πρόθεμα διαδρομής IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Προαιρετικό"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Ρύθμιση λογαριασμού"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Ρυθμίσεις διακομιστή εξερχομένων"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Διακομιστής SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Θύρα"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Τύπος ασφάλειας"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Να απαιτείται σύνδεση"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Όνομα χρήστη"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Κωδικός πρόσβασης"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Ρύθμιση λογαριασμού"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Ρυθμίσεις διακομιστή"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Διακομιστής"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Τομέας διαδικτύου\\Όνομα χρήστη"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Χρήση ασφαλούς σύνδεσης (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Αποδοχή όλων των πιστοποιητικών SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Πιστοποιητικό πελάτη"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Επιλογή"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Χρήση του πιστοποιητικού πελάτη"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Κατάργηση"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Κανένα"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Αναγνωριστικό κινητής συσκευής"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Ρυθμίσεις λογαριασμού"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Επιλογές λογαριασμού"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Συχνότητα ελέγχου εισερχομένων"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Ποτέ"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Αυτόματο (Ώθηση)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Κάθε 5 λεπτά"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Κάθε 10 λεπτά"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Κάθε 15 λεπτά"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Κάθε 30 λεπτά"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Κάθε ώρα"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου από αυτόν τον λογαριασμό από προεπιλογή"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Να ειδοποιούμαι κατά τη λήψη μηνύματος ηλεκτρονικού ταχυδρομείου"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Συγχρονισμός επαφών από αυτόν τον λογαριασμό"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Συγχρονισμός ημερολογίου από αυτόν τον λογαριασμό"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Συγχρονισμός ηλεκτρονικού ταχυδρομείου από αυτόν τον λογαριασμό"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Αυτόματη λήψη συνημμένων κατά τη σύνδεση σε δίκτυο Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Αδυναμία ολοκλήρωσης"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Ημέρες για συγχρονισμό"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Αυτόματη"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Μία ημέρα"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Τρεις ημέρες"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Μία εβδομάδα"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Δύο εβδομάδες"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Ένας μήνας"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Όλες"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Χρήση των προεπιλογών του λογαριασμού"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Λάθος όνομα χρήστη ή κωδικός πρόσβασης."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Το όνομα χρήστη ή ο κωδικός πρόσβασης είναι λάθος."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Δεν είναι δυνατή η ασφαλής σύνδεση με τον διακομιστή."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Δεν είναι δυνατή η ασφαλής σύνδεση με τον διακομιστή."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Απαιτείται πιστοποιητικό προγράμματος-πελάτη. Θέλετε να συνδεθείτε στο διακομιστή με ένα πιστοποιητικό προγράμματος-πελάτη;"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Το πιστοποιητικό δεν είναι έγκυρο ή δεν είναι δυνατή η πρόσβαση σε αυτό."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Ο διακομιστής ανταποκρίθηκε με σφάλμα. Ελέγξτε το όνομα χρήστη και τον κωδικό πρόσβασης και δοκιμάστε ξανά."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Δεν είναι δυνατή η σύνδεση με τον διακομιστή."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Δεν είναι δυνατή η σύνδεση με τον διακομιστή."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"Το TLS απαιτείται αλλά δεν υποστηρίζεται από τον διακομιστή."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Οι μέθοδοι ελέγχου ταυτότητας δεν υποστηρίζονται από τον διακομιστή."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Δεν ήταν δυνατό το άνοιγμα της σύνδεσης στον διακομιστή επειδή προέκυψε σφάλμα ασφάλειας."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Δεν ήταν δυνατό το άνοιγμα της σύνδεσης στον διακομιστή."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Έχετε πληκτρολογήσει λανθασμένη διεύθυνση διακομιστή ή ο διακομιστής απαιτεί μια έκδοση πρωτοκόλλου η οποία δεν υποστηρίζεται από το ηλεκτρονικό ταχυδρομείο."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Δεν έχετε άδεια συγχρονισμού με αυτόν τον διακομιστή. Επικοινωνήστε με τον διαχειριστή του διακομιστή σας για περισσότερες πληροφορίες."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Απομακρυσμένη διαχείριση ασφαλείας"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Ο διακομιστής <xliff:g id="SERVER">%s</xliff:g> χρειάζεται την άδειά σας για να πραγματοποιήσει απομακρυσμένο έλεγχο ορισμένων λειτουργιών ασφαλείας της συσκευής σας Android. Θέλετε να ολοκληρωθεί η ρύθμιση αυτού του λογαριασμού;"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Αυτός ο διακομιστής απαιτεί λειτουργίες ασφαλείας που η συσκευή σας Android δεν υποστηρίζει, όπως: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Δεν είναι δυνατό να αλλάξετε το όνομα χρήστη ενός λογαριασμού. Για να προσθέσετε έναν λογαριασμό με διαφορετικό όνομα χρήστη, αγγίξτε την επιλογή \"Προσθήκη λογαριασμού\"."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η απενεργοποίηση της αρμοδιότητας της εφαρμογής ηλεκτρονικού ταχυδρομείου να διαχειρίζεται τη συσκευή σας, θα διαγράψει όλους τους λογαριασμούς ηλεκτρονικού ταχυδρομείου στους οποίους είναι απαραίτητη, καθώς και τα μηνύματα ηλεκτρονικού ταχυδρομείου, τις επαφές, τα συμβάντα ημερολογίου και άλλα δεδομένα."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Ενημέρωση ασφάλειας"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Ο λογαριασμός <xliff:g id="ACCOUNT">%s</xliff:g> απαιτεί την ενημέρωση των ρυθμίσεων ασφαλείας."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Δεν είναι δυνατός ο συγχρονισμός του Λογαριασμού \"<xliff:g id="ACCOUNT">%s</xliff:g>\" λόγω απαιτήσεων ασφαλείας."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Η ενημέρωση των ρυθμίσεων ασφαλείας είναι απαραίτητη για τον λογαριασμό \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Άλλαξαν οι ρυθμίσεις ασφαλείας για τον Λογαριασμό \"<xliff:g id="ACCOUNT">%s</xliff:g>\". Δεν απαιτείται ενέργεια χρήστη."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Απαιτείται ενημέρωση ασφαλείας"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Οι πολιτικές ασφαλείας άλλαξαν"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Δεν είναι δυνατή η συμμόρφωση με τις πολιτικές ασφαλείας"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Ασφάλεια συσκευής"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Ο διακομιστής <xliff:g id="SERVER">%s</xliff:g> χρειάζεται την άδειά σας για να πραγματοποιήσει απομακρυσμένο έλεγχο ορισμένων λειτουργιών ασφαλείας της συσκευής σας Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Επεξεργασία λεπτομερειών"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"Ο λογαριασμός \"<xliff:g id="ACCOUNT">%s</xliff:g>\" απαιτεί να αλλάξετε το PIN ή τον κωδικό κλειδώματος οθόνης."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Λήγει ο κωδικός κλειδ. οθόνης"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Το PIN ή ο κωδικός πρόσβασης κλειδώματος οθόνης έχουν λήξει."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Ο κωδ. κλειδ. οθόνης έληξε"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Λήγει ο κωδικός κλειδώματος οθόνης"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Θα πρέπει να αλλάξετε σύντομα το PIN ή τον κωδικό πρόσβασης της οθνόνης κλειδώματος, διαφορετικά τα δεδομένα του λογαριασμού <xliff:g id="ACCOUNT">%s</xliff:g> θα διαγραφούν. Θέλετε να το αλλάξετε τώρα;"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Ο κωδικός κλειδώματος οθόνης έληξε"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Γίνεται διαγραφή των δεδομένων του λογαριασμού <xliff:g id="ACCOUNT">%s</xliff:g> από τη συσκευή σας. Μπορείτε να τα επαναφέρετε αλλάζοντας το PIN ή τον κωδικό πρόσβασης της οθόνης κλειδώματος. Θέλετε να το αλλάξετε τώρα;"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Απόρριψη μη αποθηκευμένων αλλαγών;"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Δεν ήταν δυνατή η σύνδεση"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Το όνομα χρήστη ή ο κωδικός πρόσβασης του λογαριασμού <xliff:g id="ACCOUNT">%s</xliff:g> είναι λάθος. Θέλετε να τα ενημερώσετε τώρα;"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Προεπιλεγμένος λογαριασμός"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου από αυτόν τον λογαριασμό από προεπιλογή"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Λήψη συνημμένων"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Αυτόματη λήψη συνημμένων πρόσφατων μηνυμάτων μέσω Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Ειδοποιήσεις μηνυμάτων ηλεκτρονικού ταχυδρομείου"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Συχνότητα συγχρονισμού, ειδοποιήσεις, κτλ."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Αποστολή ειδοποίησης κατά τη λήψη μηνύματος ηλεκτρονικού ταχυδρομείου"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Συχνότητα ελέγχου εισερχομένων"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Ρυθμίσεις εισερχομένων"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Όνομα χρήστη, κωδ. πρόσβ. και άλλες ρυθμίσεις διακομιστή εισερχ."</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Ρυθμίσεις εξερχομένων"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Όνομα χρήστη, κωδ. πρόσβ. και άλλες ρυθμίσεις διακομιστή εξερχ."</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Εφαρμογή πολιτικών"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Κ"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Πολιτικές που δεν υποστηρίζονται"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Κανένα"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Προσπάθεια συγχρονισμού"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Αγγίξτε εδώ για να συγχρονίσετε αυτόν τον λογαριασμό"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Όνομα λογαριασμού"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Το όνομά σας"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Υπογραφή"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Γρήγορες απαντήσεις"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Επεξ. κειμένου που εισάγετε συχνά κατά τη σύνταξη μην. ηλ. ταχ."</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Προσάρτηση κειμένου στα μηνύματα που αποστέλλετε"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Ρυθμίσεις ειδοποιήσεων"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Χρήση δεδομένων"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Πολιτικές ασφαλείας"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Επεξεργασία γρήγορης απάντησης"</string>
- <string name="save_action" msgid="1988862706623227093">"Αποθήκευση"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Συγχρονισμός επαφών"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Συγχρονισμός επαφών για αυτόν τον λογαριασμό"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Συγχρονισμός ημερολογίου"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Συγχρον. συμβ. ημερολ. λογαριασμού"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Συγχρονισμός ηλεκτρονικού ταχυδρομείου"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Συγχρονισμός μηνυμάτων ηλεκτρονικού ταχυδρομείου για αυτόν τον λογαριασμό"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Δόνηση"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Δόνηση και κατά τη λήψη μηνύματος ηλεκτρονικού ταχυδρομείου"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Πάντα"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Μόνο στο αθόρυβο"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Ποτέ"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Δόνηση"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Επιλέξτε ήχο κλήσης"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Ρυθμίσεις διακομιστή"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Κατάργηση λογαριασμού"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Ο λογαριασμός \"<xliff:g id="ACCOUNT">%s</xliff:g>\" θα καταργηθεί από το ηλεκτρονικό ταχυδρομείο."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Κατάργηση λογαριασμού"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Κατάργηση λογαριασμού"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Επιλογές συγχρονισμού"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Επιλογές συγχρονισμού (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Ρυθμίσεις συγχρονισμού"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Ελέγξτε τη συχνότητα"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Ημέρες για συγχρονισμό"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Λογαριασμός ηλεκτρονικού ταχυδρομείου"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Επιλέξτε λογαριασμό"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Επιλέξτε φάκελο"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Ο λογαριασμός δεν βρέθηκε. Ενδέχεται να έχει καταργηθεί."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Ο φάκελος δεν βρέθηκε. Ενδέχεται να έχει καταργηθεί."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Μόνο ορισμένοι λογαριασμοί \"Plus\" περιλαμβάνουν πρόσβαση POP και επιτρέπουν στο πρόγραμμα αυτό να συνδεθεί. Εάν δεν μπορείτε να συνδεθείτε με τη σωστή διεύθυνση ηλεκτρονικού ταχυδρομείου και τον κωδικό πρόσβασης, ενδέχεται να μην έχετε πληρωμένο λογαριασμό \"Plus\". Εκκινήστε το πρόγραμμα περιήγησης ιστού, για να αποκτήσετε πρόσβαση σε αυτούς τους λογαριασμούς ηλεκτρονικού ταχυδρομείου."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Πριν ρυθμίσετε αυτόν τον λογαριασμό ηλεκτρονικού ταχυδρομείου, επισκεφτείτε τον ιστότοπο T-Online και δημιουργήστε έναν κωδικό πρόσβασης για πρόσβαση σε ηλεκτρονικό ταχυδρομείο POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Εταιρικός"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Δεν ήταν δυνατή η δημιουργία του λογαριασμού. Προσπαθήστε ξανά."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Διεύθυνση ηλεκτρονικού ταχυδρομείου"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Ενεργοποιεί πολιτικές ασφαλείας καθορισμένες από διακομιστή"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Αναζήτηση <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> αποτέλεσμα από <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> αποτελέσματα από <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Ρυθμίσεις"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Γενικές ρυθμίσεις"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Εφαρμογή"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Αυτόματη συνέχιση"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Επιλογή οθόνης που εμφανίζεται μετά τη διαγραφή ενός μηνύματος"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Απόκρυψη πλαισίων ελέγχου"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Σε λίστες μηνυμάτων, πατήστε παρατεταμένα για να επιλέξετε"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Επιβεβαίωση πριν από τη διαγραφή"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Μηνύματα"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Επιβεβαίωση πριν την αποστολή"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Μηνύματα"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Συνέχιση σε"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Πιο πρόσφατο μήνυμα"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Παλαιότερο μήνυμα"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Λίστα μηνυμάτων"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Μέγεθος κειμένου μηνύματος"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Μικροσκοπικό κείμενο"</item>
- <item msgid="4415205108584620118">"Μικρό κείμενο"</item>
- <item msgid="4550219696381691112">"Κείμενο κανονικού μεγέθους"</item>
- <item msgid="6227813549949219991">"Μεγάλο κείμενο"</item>
- <item msgid="1197917420815786571">"Τεράστιο κείμενο"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Μέγεθος κειμένου μηνύματος"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Πολύ μικρό"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Μικρό"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Κανονικό"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Μεγάλο"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Πολύ μεγάλο"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Απάντηση σε όλους"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Ορισμός \"Απάντηση σε όλους\" ως προεπιλογή για απαντήσεις σε μηνύματα."</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Ερώτηση για εμφάνιση εικόνων"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Οι εικόνες σε μηνύματα δεν θα εμφανίζονται αυτόματα"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Καταργήθηκε η επιλογή του στοιχείου \"Εμφάνιση εικόνων\"."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Αναμονή για συγχρονισμό"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Η ηλεκτρονική αλληλογραφία σας θα εμφανιστεί σύντομα."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Αγγίξτε το εικονίδιο για αλλαγή."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Συνδ. προβ. εισερχ."</string>
- <string name="widget_unread" msgid="4404711399009077833">"Μη αναγνωσμένα"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Με αστέρι"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Φόρτωση…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Αγγίξτε για ρύθμιση."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Δεν έχετε δημιουργήσει ακόμα κάποιον λογαριασμό ηλεκτρονικού ταχυδρομείου."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Αναζήτηση ηλεκτρονικού ταχυδρομείου"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Αναζήτηση <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Αποτελέσματα αναζήτησης για \" <xliff:g id="ID_1">%1$s</xliff:g> \""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Αναμονή για αποτελέσματα"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Ορισμένοι διακομιστές ενδέχεται να χρειαστούν αρκετό χρόνο."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Φάκελοι"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Να μην επιτρ. η χρήση της κάμ. της συσκ."</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Απαιτείται κρυπτογράφηση συσκευής"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Περιορισμός της χρήσης πρόσφατων κωδικών"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Απαιτείται η λήξη των κωδικών πρόσβασης"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Απαιτείται αδρ. συσκ. για κλείδ. οθόνης."</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Περιορισμός αριθμού συγχρον. συμβάντων ημερολογίου"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Περιορισμός αριθμού συγχρον. μηνυμ. ηλ. ταχυδρομ."</string>
- <string name="quick_1" msgid="3426057697353380951">"Ευχαριστούμε!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Καλή ιδέα!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Θα το διαβάσω αργότερα και θα επικοινωνήσω μαζί σου."</string>
- <string name="quick_4" msgid="3988974084396883051">"Ας κανονίσουμε μία συνάντηση για να συζητήσουμε αυτό το θέμα."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Ο συγχρονισμός στο παρασκήνιο για αυτόν το λογαριασμό είναι απενεργοποιημένος κατά την περιαγωγή."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Αποστολή απάντησης..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Δεν υπάρχουν μηνύματα."</string>
-</resources>
diff --git a/email2/res/values-el/uploader.xml b/email2/res/values-el/uploader.xml
deleted file mode 100644
index 62e6b7ab6..000000000
--- a/email2/res/values-el/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Άμεση μεταφόρτωση"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Άλμπουμ άμεσης μεταφόρτωσης"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Μεταφόρτωση"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Ολοκληρώθηκε"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Σε παύση"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d φωτογραφίες • %3$d βίντεο"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d φωτογραφίες • %2$d βίντεο"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"χαμηλή ισχύς μπαταρίας"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"υπέρβαση ορίου φωτογραφιών"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"περιαγωγή"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"αναμονή για WiFi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"καθυστέρηση μέχρι τη φόρτιση"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"αναμονή για σύνδεση"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"επανάληψη σε %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Εμφάνιση μεταφορτώσεων σε εκκρεμότητα"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Εμφάνιση ολοκληρωμένων μεταφορτώσεων"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Προβολή στο διαδίκτυο"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Εμφάνιση μεταφορτώσεων σε εκκρεμότητα"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Απόκρυψη μεταφορτώσεων σε εκκρεμότητα"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Εμφάνιση λεπτομερειών"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Απόκρυψη λεπτομερειών"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Ρυθμίσεις"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Μεταφορτώθηκαν %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Λογαριασμός"</string>
- <string name="upload" msgid="2615541458361216022">"Μεταφόρτωση"</string>
- <string name="ok" msgid="2516349681897895312">"ΟΚ"</string>
- <string name="cancel" msgid="1207103189404543868">"Ακύρωση"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Μεταφόρτωση σε "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" για "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Η προετοιμασία της μεταφόρτωσης απέτυχε."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Το αρχείο δεν είναι διαθέσιμο."</string>
- <string name="account_error" msgid="1904775271866104941">"Αποτυχία ανάκτησης πληροφοριών λογαριασμού."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Παρουσιάστηκε πρόβλημα κατά τη σύνδεση στον λογαριασμό σας."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Αναμονή για επανάληψη"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Αναμονή για WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Μεταφόρτωση"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Αποτυχία"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Ολοκληρώθηκε"</string>
- <string name="pause_state_running" msgid="711411177620353982">"μεταφόρτωση"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"μη αυτόματη παύση"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"παύση - χαμηλή ισχύς μπαταρίας"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"παύση - καθυστέρηση μέχρι τη φόρτιση"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"παύση - αναμονή για σύνδεση"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"παύση - εκτός ορίου PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"παύση - αναμονή για wifi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"παύση - περιαγωγή"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"αναμονή για επανάληψη"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 λεπτό"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 λεπτά"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 λεπτά"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Δεν υπάρχει σύνδεση δεδομένων"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Εξαντλήθηκε ο ελεύθερος αποθηκευτικός χώρος στον λογαριασμό"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Το αρχείο δεν βρέθηκε"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Σφάλμα υπηρεσίας"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Σφάλμα δικτύου"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Ο έλεγχος ταυτότητας απέτυχε"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Μεταφορτώσεις σε εκκρεμότητα [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Ολοκληρωμένες μεταφορτώσεις [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Παύση μεταφορτώσεων"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Συνέχιση μεταφορτώσεων"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Άμεση μεταφόρτωση"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Μεταφόρτωση αργότερα"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Να μην γίνει μεταφόρτωση"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Προβολή"</string>
- <string name="manager_retry" msgid="939534318469518843">"Επανάληψη"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Η μεταφόρτωση ακυρώθηκε"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Η μεταφόρτωση ήδη ολοκληρώθηκε"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Συγχρονισμός όλων"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Τελευταίος συγχρονισμός:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Η λίστα ολοκληρωμένων αντικειμένων είναι κενή."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Άμεση μεταφόρτωση"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Οι μεταφορτώσεις ολοκληρώθηκαν"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Οι μεταφορτώσεις τέθηκαν σε παύση"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Η λειτουργία \"Άμεση μεταφόρτωση\" δεν έχει ενεργοποιηθεί ακόμα"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Η μεταφόρτωση των μεγάλων αρχείων θα γίνεται μόνο μέσω σύνδεσης WiFi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Σάρωση για αρχεία..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Προετοιμασία <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> φωτογραφιών και <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> βίντεο για μεταφόρτωση..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Δεν είναι απαραίτητη η μεταφόρτωση πρόσθετων φωτογραφιών/βίντεο."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Παρουσιάστηκε πρόβλημα κατά την επικοινωνία με το διακομιστή. Προσπαθήστε ξανά αργότερα."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Ακυρώθηκε ο συγχρονισμός όλων"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Συγχρονισμός όλων"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Προβολή ολοκληρωμένων"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Προβολή μεταφορτώσεων σε εκκρεμότητα"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Γενικά"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Παύση όλων των μεταφορτώσεων"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Ισχύς"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Να πραγματοποιείται μεταφόρτωση μόνο κατά τη φόρτιση του τηλεφώνου."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Μεταφόρτωση μόνο όταν υπάρχει διαθέσιμο Wi-Fi."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Φωτογραφίες"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Λογαριασμός"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Προϋποθέσεις μεταφόρτωσης"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Μέγεθος φωτογραφίας"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Βίντεο"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Λογαριασμός"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Για τις μεταφορτώσεις βίντεο θα χρησιμοποιηθεί ο λογαριασμός φωτογραφιών"</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Προϋποθέσεις μεταφόρτωσης"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Προς το παρόν χρησιμοποιούνται οι ρυθμίσεις συνδεσιμότητας φωτογραφιών."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Μόνο φωτογραφίες μέσω δικτύων κινητής τηλεφωνίας"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Φωτογραφίες και βίντεο μέσω δικτύων κινητής τηλεφωνίας"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Φωτογραφίες και βίντεο μόνο μέσω Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Σχετικά με"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Άμεση μεταφόρτωση"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Συνιστάται: 1600 εικονοστοιχεία (για κοινή χρήση, εκτυπώσεις και προφυλάξεις οθόνης)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Αρχικό μέγεθος (πιο αργή μεταφόρτωση)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"παύση - μη διαθέσιμη κάρτα SD"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Μη διαθέσιμη κάρτα SD"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Ρυθμ. άμεσης μεταφ."</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Άμεση μεταφόρτωση"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Αυτόματη μεταφόρτωση νέων φωτογραφιών και βίντεο σε προσωπικό άλμπουμ ιστού"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Κατάσταση μεταφόρτωσης"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Σύνθετες ρυθμίσεις"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Μεταφορτώσεις για κινητά"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Μεταφορτώσεις περιαγωγής"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Μεταφόρτωση φωτογραφιών και βίντεο κατά την περιαγωγή σε δίκτυο δεδομένων"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Μεταφ. με μπαταρία"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Μεταφόρτωση φωτογραφιών και βίντεο μόνο κατά τη φόρτιση"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Μεταφόρτωση υπαρχουσών φωτογραφιών"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Άμεση μεταφόρτωση όλων των υπαρχουσών φωτογραφιών και βίντεο από το τηλέφωνό σας"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Απενργοποιημένο"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Μεταφόρτωση (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d από %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Παύση: αγγίξτε για να συνεχιστεί η μεταφόρτωση"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Μεταφόρτωση υπαρχουσών φωτογραφιών"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Η μεταφόρτωση φωτογραφιών και βίντεο που δεν έχουν ήδη μεταφορτωθεί από το τηλέφωνό σας σε ιδιωτικό λεύκωμα στον ιστό μπορεί να διαρκέσει ορισμένο χρονικό διάστημα, αλλά θα γίνει στο παρασκήνιο. Είστε βέβαιοι ότι θέλετε να συνεχίσετε;"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Ναι"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Όχι"</string>
-</resources>
diff --git a/email2/res/values-en-rGB/strings.xml b/email2/res/values-en-rGB/strings.xml
deleted file mode 100644
index 0ea8508d4..000000000
--- a/email2/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Read email attachments"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Allows the app to read your email attachments."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Access email provider data"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Allows the app to access your email database, including received messages, sent messages, usernames and passwords."</string>
- <string name="app_name" msgid="5815426892327290362">"Email"</string>
- <string name="compose_title" msgid="427986915662706899">"Compose"</string>
- <string name="debug_title" msgid="5175710493691536719">"Debug"</string>
- <string name="next_action" msgid="3931301986364184415">"Next"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Cancel"</string>
- <string name="previous_action" msgid="5181616311579820981">"Previous"</string>
- <string name="send_action" msgid="1729766205562446418">"Send"</string>
- <string name="reply_action" msgid="4262472229221507619">"Reply"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Reply all"</string>
- <string name="delete_action" msgid="8421026208288857155">"Delete"</string>
- <string name="forward_action" msgid="669174181042344116">"Forward"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Star"</string>
- <string name="done_action" msgid="7497990549515580249">"Done"</string>
- <string name="create_action" msgid="3062715563215392251">"Create new"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Delete"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"No quick responses."</string>
- <string name="discard_action" msgid="6532206074859505968">"Discard"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Save draft"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Insert quick response"</string>
- <string name="read_action" msgid="4701484794504781686">"Mark read"</string>
- <string name="unread_action" msgid="6280399049357552826">"Mark unread"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Add star"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Remove star"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Refresh"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Add account"</string>
- <string name="compose_action" msgid="4045702519637388045">"Compose"</string>
- <string name="search_action" msgid="6325101454876682308">"Search"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Account settings"</string>
- <string name="settings_action" msgid="6334807007967459412">"Settings"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Sync options"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Mark as unread"</string>
- <string name="move_action" msgid="3059189775933985898">"Move"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Add Cc/Bcc"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Attach file"</string>
- <string name="close_action" msgid="533058985745238100">"Close"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Send all messages"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Choose attachment"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Move to"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Loading messages…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Connection problem."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Couldn\'t load the message text. The message may be too large to view."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Move message"</item>
- <item quantity="other" msgid="371256717624461324">"Move messages"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Move isn\'t supported on POP3 accounts."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Can\'t move because selection contains multiple accounts."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Messages in Drafts, Outbox and Sent can\'t be moved."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> unread (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> unread (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> unread (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"in <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> accounts"</item>
- <item quantity="other" msgid="2723797835410343458">"in <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> accounts"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"to <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> new messages"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"All accounts"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> account"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> accounts"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Inbox"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Outbox"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Drafts"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Recycle Bin"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Sent"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Junk"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Unread"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Inbox: (unread)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Inbox (all)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Combined view (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> account"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> accounts"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Version: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Inbox"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Starred"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Drafts"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Outbox"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Combined view"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Show all folders"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Accounts"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Recent folders (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"All folders"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Recent folders"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Subject"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"No subject"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Load more messages"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> selected"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> selected"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"No messages"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"To"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Subject"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"From:"</string>
- <string name="to" msgid="4392614766835725698">"To"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Bcc"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Subject"</string>
- <string name="body_hint" msgid="4279864165439577668">"Compose email"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Original Message --------"\n"Subject: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"From: <xliff:g id="SENDER">%2$s</xliff:g>"\n"To: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> wrote:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Include quoted text"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Include text"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Add at least one recipient."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Some email addresses are invalid."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"File too large to attach."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Insert quick response"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> and <xliff:g id="NUMBER">%2$d</xliff:g> others"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"To:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Date:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"From:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Subject:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"View"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Install"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Play"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Load"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Info"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Save"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Saved"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stop"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Attachment saved as <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Couldn\'t save attachment."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"One or more attachments in your forwarded message will be downloaded prior to sending."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Message"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Invite"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Attachment <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Attachments <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Show pictures"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Always show"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Always show pictures from this sender"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Pictures from this sender will be shown automatically."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"View in Calendar"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Calendar invite"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Going?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Yes"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Maybe"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" No"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"You\'ve accepted this invitation."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"You have replied \"maybe\" to this invitation"</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"You\'ve declined this invitation."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Show details"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Message details"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Attachment info"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Wi-Fi connection required"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Wi-Fi settings"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"App settings"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Can\'t open attachment."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"You can\'t save or open this file because this type of attachment might contain malicious software."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"This attachment can\'t be saved or opened because of this account\'s security policies."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"This attachment is too large to download over a mobile network. You can download it the next time that you connect to a Wi-Fi network."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"There is no installed app that can open this attachment. Try downloading an appropriate app from Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"This attachment is an app. You must tick Unknown Sources in Settings &gt; Apps before you can install it."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Apps can\'t be installed directly from email. Save this app first and then install it using the Downloads app."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Couldn\'t download the attachment."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"There was an error while decoding the message."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Viewing <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Delete this message"</item>
- <item quantity="other" msgid="4437637377522896262">"Delete these messages?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Message deleted."</item>
- <item quantity="other" msgid="6574961322865652255">"Messages deleted."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Message discarded."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Message saved as draft."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Can\'t display attachment."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Couldn\'t load attachment \" <xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Opening message…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> message moved to <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> messages moved to <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Could not forward one or more attachments"</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Attachment not forwarded"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> sign-in unsuccessful."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Couldn\'t sign in"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Newer"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Older"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Account setup"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Email account"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"You can set up your account in just a few steps."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Email address"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Password"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Send emails from this account by default"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manual setup"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Type a valid email address and password."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplicate Account"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"You\'re already using this username for the account \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"This password starts or ends with one or more space characters. Many servers don\'t support passwords with spaces."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Retrieving account information…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Checking incoming server settings…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Checking outgoing server settings…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Account setup"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Your account is set up and emails are on their way!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Give this account a name (optional)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Your name (displayed on outgoing messages)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"This field can\'t be blank."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Account setup"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Account type"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"What type of account is this?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Account setup"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Incoming server settings"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Username"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Password"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Security type"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"None"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Accept all certificates)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (Accept all certificates)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Delete email from server"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Never"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"When I delete from Inbox"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP path prefix"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Optional"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Account setup"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Outgoing server settings"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP server"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Security type"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Require sign-in"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Username"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Password"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Account setup"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Server settings"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Server"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domain\\Username"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Use secure connection (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Accept all SSL certificates"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Client certificate"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Select"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Use client certificate"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Remove"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"None"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Mobile Device ID"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Account settings"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Account options"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Inbox checking frequency"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Never"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automatic (Push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Every 5 minutes"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Every 10 minutes"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Every 15 minutes"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Every 30 minutes"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Every hour"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Send emails from this account by default"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Notify me when emails arrive"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sync contacts from this account"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sync calendar from this account"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sync emails from this account"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Automatically download attachments when connected to Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Couldn\'t finish"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Days to sync"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatic"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"One day"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Three days"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"One week"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Two weeks"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"One month"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"All"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Use account\'s default"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Your username or password is incorrect."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Username or password is incorrect."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Can\'t safely connect to server."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Can\'t safely connect to server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"A client certificate is required. Do you want to connect to the server with a client certificate?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"The certificate is invalid or inaccessible."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"The server responded with an error. Check your username and password, then try again."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Can\'t connect to server."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Can\'t connect to server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS required but not supported by server."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Authentication methods aren\'t supported by server."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Couldn\'t open connection to server due to security error."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Couldn\'t open connection to server."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"You\'ve typed an incorrect server address or the server requires a protocol version that Email doesn\'t support."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"You don\'t have permission to sync with this server. Contact your server\'s administrator for more information."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Remote security administration"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"The server <xliff:g id="SERVER">%s</xliff:g> requires that you allow it to remotely control some security features of your Android device. Do you want to finish setting up this account?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"This server requires security features that your Android device doesn\'t support, including: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"You can\'t change an account\'s username. To add an account with a different username, touch Add account."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"WARNING: Deactivating the Email app\'s authority to administer your device will delete all email accounts that require it, along with their email, contacts, calendar events and other data."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Security update"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> requires you to update your security settings."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Account \"<xliff:g id="ACCOUNT">%s</xliff:g>\" can\'t be synced due to security requirements."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Account \"<xliff:g id="ACCOUNT">%s</xliff:g>\" requires a security-settings update."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Account \"<xliff:g id="ACCOUNT">%s</xliff:g>\" has changed its security settings; no user action is required."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Security update required"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Security policies have changed"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Security policies can\'t be met"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Device Security"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"The server <xliff:g id="SERVER">%s</xliff:g> requires that you allow it to remotely control some security features of your Android device."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Edit details"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" requires you to change your lock-screen PIN or password."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Lock-screen password expiring"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Your lock-screen PIN or password has expired."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Lock-screen password expired"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Lock-screen password expiring"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"You need to change your lock screen PIN or password soon or the data for <xliff:g id="ACCOUNT">%s</xliff:g> will be erased. Do you want to change it now?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Lock-screen password expired"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"The data for <xliff:g id="ACCOUNT">%s</xliff:g> is being erased from your device. You can restore it by changing your lock screen PIN or password. Do you want to change it now?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Discard unsaved changes?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Couldn\'t sign in"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"The username or password for <xliff:g id="ACCOUNT">%s</xliff:g> is incorrect. Do you want to update them now?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Default account"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Send email from this account by default"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Download attachments"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Auto-download attachments to recent messages via Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Email notifications"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Sync frequency, notifications, etc."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Send notification when emails arrive"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Inbox check frequency"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Incoming settings"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Username, password and other incoming server settings"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Outgoing settings"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Username, password and other outgoing server settings"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Policies enforced"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"None"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Unsupported policies"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"None"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Attempt sync"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Touch here to sync this account"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Account name"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Your name"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Signature"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Quick responses"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edit text that you frequently insert when composing emails"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Append text to messages that you send"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Notification settings"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Data usage"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Security policies"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Edit quick response"</string>
- <string name="save_action" msgid="1988862706623227093">"Save"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sync contacts"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sync contacts for this account"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sync calendar"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sync calendar event for this account"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sync Email"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sync email for this account"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrate"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Also vibrate when email arrives"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Always"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Only when silent"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Never"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibrate"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Choose ringtone"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Server settings"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Remove account"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"The account \"<xliff:g id="ACCOUNT">%s</xliff:g>\" will be removed from email."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Remove account"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Remove account"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Sync options"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Sync options (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Sync settings"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Check frequency"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Days to sync"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Email account"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Choose an account"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Select a folder"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Account wasn\'t found. It may have been removed."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Folder wasn\'t found. It may have been removed."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Only some \"Plus\" accounts include POP access allowing this programme to connect. If you\'re not able to sign in with your correct email address and password, you may not have a paid \"Plus\" account. Launch the web browser to gain access to these email accounts."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Before setting up this email account, please visit the T-Online website and create a password for POP3 email access."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Corporate"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Couldn\'t create the account. Try again."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Email"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Enables server-specified security policies"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Searching <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> result from <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> results from <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Settings"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"General settings"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Application"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Auto-advance"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Select which screen to show after you delete a message"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Hide checkboxes"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"In lists of messages, touch and hold to select"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirm before deleting"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Messages"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirm before sending"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Messages"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Advance to"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Newer message"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Older message"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Message list"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Message text size"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Tiny text"</item>
- <item msgid="4415205108584620118">"Small text"</item>
- <item msgid="4550219696381691112">"Normal-sized text"</item>
- <item msgid="6227813549949219991">"Large text"</item>
- <item msgid="1197917420815786571">"Huge text"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Message text size"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Tiny"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Small"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Large"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Huge"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Reply all"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Make \"Reply all\" the default for message replies"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Ask to show pictures"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Pictures in messages won\'t be shown automatically"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Show pictures\" cleared."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Waiting for sync"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Your email will appear soon."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Touch icon to change."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Combined Inbox"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Unread"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Starred"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Loading…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Touch to set up."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"You haven\'t set up an email account yet."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Search emails"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Search <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Search results for \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Waiting for results"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Some servers may take a long time."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Folders"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Disallow use of the device\'s camera"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Require device password"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Restrict the reuse of recent passwords"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Require passwords to expire"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Require an idle device to lock its screen"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Limit the number of calendar events synced"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Limit the number of emails synced"</string>
- <string name="quick_1" msgid="3426057697353380951">"Thanks!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Sounds good to me!"</string>
- <string name="quick_3" msgid="8061819976353395585">"I\'ll read this later and get back to you."</string>
- <string name="quick_4" msgid="3988974084396883051">"Let\'s set up a meeting to discuss this."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Background sync for this account is disabled while roaming."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Sending response..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"No messages."</string>
-</resources>
diff --git a/email2/res/values-en-rGB/uploader.xml b/email2/res/values-en-rGB/uploader.xml
deleted file mode 100644
index 884d92385..000000000
--- a/email2/res/values-en-rGB/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Instant Upload"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Instant Upload Album"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Uploading"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Finished"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Paused"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d photos • %3$d videos"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d photos • %2$d videos"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"low battery"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"exceeded photo quota"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"waiting for Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"delayed until charging"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"waiting for connection"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"retrying in %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Show Pending Uploads"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Show Finished Uploads"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"View Online"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Show Pending Uploads"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Hide Pending Uploads"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Show Details"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Hide Details"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Settings"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Uploaded %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Account"</string>
- <string name="upload" msgid="2615541458361216022">"Upload"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Cancel"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Uploading to "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" for "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Upload initialisation failed."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"File not available."</string>
- <string name="account_error" msgid="1904775271866104941">"Failed to retrieve account information."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"There was a problem while signing in to your account."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Waiting to retry"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Waiting for Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Uploading"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Failed"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Completed"</string>
- <string name="pause_state_running" msgid="711411177620353982">"uploading"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"manually paused"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"paused - low battery"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"paused - delayed until charging"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"paused - waiting for connection"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"paused - out of PWA quota"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"paused - waiting for Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"paused - roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"waiting to retry"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minute"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minutes"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minutes"</string>
- <string name="retry_no_data" msgid="630347885498641534">"No data connection"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Account is out of disk quota"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"File not found"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Service error"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Network error"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Authentication failed"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Pending uploads [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Completed uploads [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Pause uploads"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Resume uploads"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Upload now"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Upload later"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Do not upload"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"View"</string>
- <string name="manager_retry" msgid="939534318469518843">"Retry"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Upload cancelled"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Upload already finished"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sync all"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Last Sync:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Finished items list is empty."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Instant Upload"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Uploads finished"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Uploads paused"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Instant Upload hasn\'t been activated yet"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Large files will be uploaded over a Wi-Fi connection only."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Scanning for files..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Preparing <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> photos and <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> videos for upload..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"No additional photos/videos need to be uploaded."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"There was a problem while communicating with the server. Please try again later."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Sync all cancelled"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sync All"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"View Completed"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"View Pending"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"General"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Pause all uploads"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Power"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Upload only when the phone is being charged."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Upload only when Wi-Fi is available."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Photos"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Account"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Upload conditions"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Photo size"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videos"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Account"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"The photo account will be used for video uploads."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Upload conditions"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Photo connectivity settings are used for now."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Only photos via mobile networks"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Photos &amp; videos via mobile networks"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Photos &amp; videos via Wi-Fi only"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"About"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Instant Upload Version"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Recommended: 1,600 pixels (for sharing, prints and screensavers)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Original size (slowest upload)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"paused - SD card unavailable"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD card unavailable"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Instant Upload settings"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Instant Upload"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Automatically upload new photos &amp; videos to a private web album"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Upload status"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Advanced"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Mobile uploads"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Roaming uploads"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Upload photos &amp; videos when roaming on data network"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Battery uploads"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Upload photos &amp; videos only when charging"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Upload existing photos"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Upload any existing photos &amp; videos from your phone now"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Disabled"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Uploading (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">":%1$d of %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Paused: touch to resume uploading"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Upload existing photos"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Uploading photos and videos that have not already been uploaded from your phone to a private album on the web can take a while, but will be done in the background. Are you sure that you want to continue?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Yes"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"No"</string>
-</resources>
diff --git a/email2/res/values-es-rUS/strings.xml b/email2/res/values-es-rUS/strings.xml
deleted file mode 100644
index 87cf7e199..000000000
--- a/email2/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Leer archivos adjuntos de correo"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permite a la aplicación leer los archivos adjuntos de tu correo."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Acceder a los datos del proveedor de correo"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permite que la aplicación acceda a la base de datos de tu correo, como mensajes recibidos, mensajes enviados, nombres de usuario y contraseñas."</string>
- <string name="app_name" msgid="5815426892327290362">"Correo"</string>
- <string name="compose_title" msgid="427986915662706899">"Redactar"</string>
- <string name="debug_title" msgid="5175710493691536719">"Depurar"</string>
- <string name="next_action" msgid="3931301986364184415">"Siguiente"</string>
- <string name="okay_action" msgid="8365197396795675617">"Aceptar"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Cancelar"</string>
- <string name="previous_action" msgid="5181616311579820981">"Anterior"</string>
- <string name="send_action" msgid="1729766205562446418">"Enviar"</string>
- <string name="reply_action" msgid="4262472229221507619">"Responder"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Responder a todos"</string>
- <string name="delete_action" msgid="8421026208288857155">"Eliminar"</string>
- <string name="forward_action" msgid="669174181042344116">"Reenviar"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Destacar"</string>
- <string name="done_action" msgid="7497990549515580249">"Finalizado"</string>
- <string name="create_action" msgid="3062715563215392251">"Crear una nueva respuesta rápida"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Eliminar"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"No hay respuestas rápidas."</string>
- <string name="discard_action" msgid="6532206074859505968">"Descartar"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Guardar borrador"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Insertar respuesta rápida"</string>
- <string name="read_action" msgid="4701484794504781686">"Marcar leída"</string>
- <string name="unread_action" msgid="6280399049357552826">"Marcar no leída"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Agregar asterisco"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Eliminar asterisco"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Actualizar"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Agregar cuenta"</string>
- <string name="compose_action" msgid="4045702519637388045">"Redactar"</string>
- <string name="search_action" msgid="6325101454876682308">"Buscar"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Configuración de la cuenta"</string>
- <string name="settings_action" msgid="6334807007967459412">"Configuración"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Opciones de sincronización"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Marcar como no leídos"</string>
- <string name="move_action" msgid="3059189775933985898">"Mover"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ CC/CCO"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Agregar CC/CCO"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Adjuntar un archivo"</string>
- <string name="close_action" msgid="533058985745238100">"Cerrar"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Enviar todos los mensajes"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Seleccionar archivo adjunto"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Mover a"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Cargando mensajes..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Problema de conexión"</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"No se pudo cargar el texto del mensaje. Tal vez sea demasiado grande para ver."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Mover el mensaje"</item>
- <item quantity="other" msgid="371256717624461324">"Mover mensajes"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Las cuentas POP3 no permiten mover mensajes."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"No se puede mover porque la selección contiene varias cuentas."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Los mensajes en Borrador, Bandeja de salida y Enviados no se pueden mover."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> no leídos (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> no leídos (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> no leídos (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"en <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> cuentas"</item>
- <item quantity="other" msgid="2723797835410343458">"en <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> cuentas"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"para <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> mensajes nuevos"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Todas las cuentas"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"Cuenta <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> cuentas"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Bandeja de entrada"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Bandeja de salida"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Borradores"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Papelera"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Enviado"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"No solicitado"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"No leídos"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Bandeja de entrada (no leídos)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Bandeja de entrada (todos)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Vista combinada (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> cuenta"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> cuentas"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versión: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Bandeja de entrada"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Marcado con asterisco"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Borradores"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Bandeja de salida"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Vista combinada"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Mostrar todas las carpetas"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Cuentas"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Carpetas recientes (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Todas las carpetas"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Carpeta reciente"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Asunto"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Sin asunto"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Cargar más mensajes"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> seleccionados"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> seleccionados"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"No hay mensajes."</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Para"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"CC"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"CCO"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Asunto"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"De:"</string>
- <string name="to" msgid="4392614766835725698">"Para"</string>
- <string name="cc" msgid="7017720927911078193">"CC"</string>
- <string name="bcc" msgid="3098643138241111579">"CCO"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Asunto"</string>
- <string name="body_hint" msgid="4279864165439577668">"Redactar un correo"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Mensaje original --------"\n"Asunto: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"De: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Para: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> escribió:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Incluir el texto citado"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Incluir texto"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Agrega al menos un destinatario."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Algunas direcciones de correo no son válidas."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"El archivo es demasiado grande para adjuntarlo."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Insertar respuesta rápida"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> y <xliff:g id="NUMBER">%2$d</xliff:g> otros"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Para:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"CC:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"CCO:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Fecha:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"De:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Asunto:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Ver"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Instalar"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Reproducir"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Cargar"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Información"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Guardar"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Guardado"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Detener"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Archivo adj guardado como <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Error al guardar el adjunto"</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Se descargarán uno o más archivos adjuntos de tu mensaje reenviado antes de enviar."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Mensaje"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Invitar"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Archivo adjunto<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Adjuntos <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Mostrar imágenes"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Mostrar siempre"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Mostrar siempre las imágenes de este remitente"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Las imágenes de este remitente se mostrarán automáticamente."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Ver en Calendar"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Invitación de calendario"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"¿Vas?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Sí"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Quizás"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" No"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Has aceptado esta invitación."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Has respondido \"quizás\" a esta invitación."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Has rechazado esta invitación."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Mostrar detalles"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Detalles del mensaje"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Información del archivo adjunto"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Se necesita conexión Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Configuración Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Config. de aplicación"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"No se puede abrir el archivo adjunto"</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"No puedes guardar ni abrir este archivo porque el tipo de adjunto podría incluir software malintencionado."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"No se puede guardar ni abrir este archivo adjunto debido a las políticas de seguridad de la cuenta."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Este archivo adjunto es demasiado grande para descargar en la red para celulares. Puedes descargarlo la próxima vez que te conectes a la red Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Ninguna de las aplicaciones instaladas puede abrir este archivo adjunto. Prueba descargar una aplicación adecuada de Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Este archivo adjunto es una aplicación. Para instalarla, debes activar la opción Orígenes desconocidos en Ajustes &gt; Aplicaciones."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Las aplicaciones no se pueden instalar directamente desde el correo. Primero debes guardar esta aplicación y luego instalarla con la aplicación Descargas."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"No se pudo descargar el archivo adjunto."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Se produjo un error al decodificar el mensaje."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Consultando <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"¿Deseas eliminar este mensaje?"</item>
- <item quantity="other" msgid="4437637377522896262">"¿Deseas eliminar estos mensajes?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Mensaje eliminado"</item>
- <item quantity="other" msgid="6574961322865652255">"Mensaje eliminado"</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Mensaje descartado."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Mensaje guardado como borrador."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"No se puede mostrar el archivo adjunto."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"No se ha podido cargar el archivo adjunto \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Abriendo el mensaje…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> mensaje movido a <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> mensajes trasladados a <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"No se pudieron enviar uno o más adjuntos."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"No se reenvió el archivo adjunto"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Acceso a <xliff:g id="ACCOUNT_NAME">%s</xliff:g> sin éxito"</string>
- <string name="login_failed_title" msgid="7624349996212476176">"No se ha podido acceder."</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Nuevos"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Antiguos"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Configuración de la cuenta"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Cuenta de correo"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Puedes configurar tu cuenta en pocos pasos."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Dirección de correo"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Contraseña"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Enviar correo desde esta cuenta de forma predeterminada"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configuración manual"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Escribe una dirección de correo y contraseña válidas."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Cuenta duplicada"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Ya estás usando este nombre de usuario para la cuenta \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Esta contraseña comienza o finaliza con uno o más caracteres con espacios. Muchos servidores no son compatibles con caracteres con espacios."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Recuperando información de la cuenta..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Comprobando configuración del servidor entrante…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Comprobando configuración del servidor saliente…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Configuración de la cuenta"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Se ha configurado tu cuenta y el correo está en camino."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Asigna un nombre a esta cuenta (opcional)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Tu nombre (mostrado en mensajes salientes)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Este campo no puede estar vacío."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Configuración de la cuenta"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Tipo de cuenta"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"¿Qué tipo de cuenta es?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Configuración de la cuenta"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Configuración del servidor de entrada"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nombre de usuario"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Contraseña"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Servidor"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Puerto"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipo de seguridad"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ninguno"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (aceptar todos los certificados)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (aceptar todos los certificados)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Eliminar correo del servidor"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Nunca"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Al eliminarlo desde la bandeja de entrada"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Prefijo de ruta IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Opcional"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Configuración de la cuenta"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Configuración del servidor de salida"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Servidor SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Puerto"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipo de seguridad"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Requiere acceso"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nombre de usuario"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Contraseña"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Configuración de la cuenta"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Configuración del servidor"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Servidor"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Dominio\\Nombre de usuario"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Utilizar conexión segura (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Aceptar todos los certificados SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certificado de cliente"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Seleccionar"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Usar certificado de cliente"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Eliminar"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Ninguno"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID de dispositivo móvil"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Configuración de la cuenta"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Opciones de cuenta"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Frecuencia de verificación de la bandeja de entrada"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nunca"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Comprobación automática"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Cada 5 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Cada 10 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Cada 15 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Cada 30 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Cada hora"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Enviar correo desde esta cuenta de forma predeterminada"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Avisarme cuando llegue un correo"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sincronizar contactos desde esta cuenta"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sincronizar el calendario desde esta cuenta"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sincronizar el correo desde esta cuenta"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Descargar los archivos adjuntos automáticamente al conectarte a Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"No se pudo terminar"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Período de sincronización"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automático"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Un día"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tres días"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Una semana"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Dos semanas"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Un mes"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Todos"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Utilizar la configuración predeterminada de la cuenta."</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"El nombre de usuario o la contraseña son incorrectos."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nombre de usuario o contraseña incorrectos "\n" (<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"No se puede conectar de forma segura al servidor."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"No se puede conectar de forma segura al servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Se necesita un certificado de cliente. ¿Quieres conectarte al servidor con un certificado de cliente?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"El certificado no es válido o es inaccesible."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"El servidor ha devuelto un error. Verifica tu nombre de usuario y contraseña e inténtalo de nuevo."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"No se puede conectar al servidor."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"No se puede conectar al servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"Se requiere TLS pero el servidor no la admite."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"El servidor no admite los métodos de autenticación."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"No se pudo establecer conexión con el servidor debido a un error de seguridad."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"No se pudo establecer conexión con el servidor."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Ingresaste una dirección de servidor incorrecta o el servidor requiere una versión de protocolo que el correo no admite."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"No tienes permiso para sincronizar con este servidor. Comunícate con el administrador de tu servidor para obtener más información."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Administración de seguridad remota"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"El servidor <xliff:g id="SERVER">%s</xliff:g> debe controlar de forma remota algunas aplicaciones de seguridad del dispositivo. ¿Deseas finalizar la configuración de esta cuenta?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Este servidor requiere funciones de seguridad que tu dispositivo Android no admite, incluidas: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"No puedes cambiar el nombre de usuario de una cuenta. Para agregar una cuenta con un nombre de usuario distinto, toca Agregar cuenta."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"ADVERTENCIA: si desactivas la autoridad de la aplicación de correo para administrar tu dispositivo, se eliminarán todas las cuentas de correo que la requieran, así como sus mensajes, contactos, eventos de calendario y otros datos."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Actualización de seguridad"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> requiere que actualices tu configuración de seguridad."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"No se puede sincronizar la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" debido a diferentes requisitos de seguridad."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Debe actualizarse la configuración de seguridad de la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Se modificó la configuración de seguridad de la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\". El usuario no debe tomar ninguna medida."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Act. de seguridad requerida"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Políts. seguridad modificadas"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Falta en políts. de seguridad"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Seguridad del dispositivo"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"El servidor <xliff:g id="SERVER">%s</xliff:g> requiere tu permiso para controlar de forma remota algunas funciones de seguridad en tu dispositivo Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Editar detalles"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" requiere que cambies tu PIN o contraseña de bloqueo de pantalla."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"La contraseña de bloqueo de pantalla expiró"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Tu PIN o contraseña de bloqueo de pantalla expiró."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"La contraseña de bloqueo de pantalla expiró"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"La contraseña de bloqueo de pantalla expiró"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Debes cambiar el PIN o la contraseña de la pantalla de bloqueo lo antes posible o se eliminarán los datos de <xliff:g id="ACCOUNT">%s</xliff:g>. ¿Quieres cambiarlos ahora?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"La contraseña de bloqueo de pantalla expiró"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Los datos de <xliff:g id="ACCOUNT">%s</xliff:g> se eliminarán de su dispositivo. Puedes restaurarlo al cambiar tu PIN o tu contraseña de bloqueo de pantalla. ¿Deseas cambiarlos ahora?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"¿Descartar cambios sin guardar?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"No se pudo acceder"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"El nombre de usuario o la contraseña de <xliff:g id="ACCOUNT">%s</xliff:g> son incorrectos. ¿Quieres actualizarlos ahora?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Cuenta predeterminada"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Enviar mensaje de correo desde esta cuenta de forma predeterminada"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Descargar archivos adjuntos"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Descarga automática por Wi-Fi de los adjuntos de msjs. recientes"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Notificaciones de correo"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Frecuencia de sincronización, notificaciones, etc."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Enviar una notificación cuando llegue el correo"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frecuencia de verificación de bandeja de entrada"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Configuración del servidor entrante"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nombre de usuario, contraseña y otras configuraciones de servidor de entrada"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Configuración del servidor saliente"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nombre de usuario, contraseña y otras configuraciones de servidor de salida"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Políticas en vigencia"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ninguna"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Políticas incompatibles"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ninguna"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Sincronizar esta cuenta"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Toca para sincronizar esta cuenta."</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Nombre de la cuenta"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Tu nombre"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Firma"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Respuestas rápidas"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edita el texto que sueles usar al redactar correos electrónicos."</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Agrega texto a los mensajes que envíes"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Configuración de notificación"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Uso de datos"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Políticas de seguridad"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Editar respuesta rápida"</string>
- <string name="save_action" msgid="1988862706623227093">"Guardar"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronizar contactos"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincronizar contactos de esta cuenta"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronizar calendario"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sincr. evento calen. de esta cuenta"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincronizar correo"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincronizar el correo de esta cuenta"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrar"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibrar también cuando llegue un correo"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Siempre"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Solo en modo silencioso"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Nunca"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibrar"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Seleccionar tono"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Configuración del servidor"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Eliminar cuenta"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"La cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" se eliminará de correo."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Eliminar cuenta"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Eliminar cuenta"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Opciones de sincronización"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Opciones de sincronización (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Configuración de la sincronización"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Verifica la frecuencia"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Período de sincronización"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Cuenta de correo"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Seleccionar cuenta"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Selecc. una carpeta"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"No se encontró la cuenta. Es posible que se haya eliminado."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"No se encontró la carpeta. Es posible que se haya eliminado."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Solo algunas cuentas \"Plus\" incluyen el acceso POP, que permite que este programa se conecte. Si no puedes acceder con tu dirección de correo y contraseña correctas, tal vez no tengas una cuenta \"Plus\" paga. Inicia el navegador web para acceder a estas cuentas de correo."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Para configurar esta cuenta de correo, accede al sitio web de T-Online y crea una contraseña para acceder al correo POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Corporativo"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"No se pudo crear la cuenta. Inténtalo de nuevo."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Correo"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Habilita las políticas de seguridad específicas según el servidor."</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Buscando <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> resultados de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultados de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Configuración"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Configuración general"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Aplicación"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avance automático"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Selecciona la pantalla que se mostrará al eliminar un mensaje."</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ocultar casillas de verificación"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"En las listas de mensajes, mantén presionado para seleccionar."</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirmar antes de eliminar"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mensajes"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirmar antes de enviar"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mensajes"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Avanzar a"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mensaje más nuevo"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mensaje anterior"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Lista de mensajes"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Tamaño del texto del mensaje"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Texto muy pequeño"</item>
- <item msgid="4415205108584620118">"Texto pequeño"</item>
- <item msgid="4550219696381691112">"Texto de tamaño normal"</item>
- <item msgid="6227813549949219991">"Texto grande"</item>
- <item msgid="1197917420815786571">"Texto enorme"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Tamaño del texto del mensaje"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Diminuto"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Pequeño"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Grande"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Enorme"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Responder a todos"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Predetermina \"Responder a todos\" para las respuestas de mensajes."</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Preguntar antes de mostrar imágenes"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Las imágenes de los mensajes no se mostrarán automáticamente."</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Se eliminó \"Mostrar imágenes\"."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Esperando para sincronizar"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Tu correo aparecerá en breve."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Toca el ícono para cambiar."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Combinación de Recibidos"</string>
- <string name="widget_unread" msgid="4404711399009077833">"No leídos"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Destacados"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Cargando…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Toca para configurar."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Todavía no has configurado una cuenta de correo."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Buscar correo"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Buscar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Resultados de la búsqueda de \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Esperando los resultados..."</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Algunos servidores pueden tardar mucho tiempo."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Carpetas"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"No usar la cámara del dispositivo"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Requerir la contraseña del dispositivo"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Limitar la reutilización de contraseñas"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Forzar la caducidad de las contraseñas"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Bloquear pant. de dispositivo inactivo"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Limitar eventos del calendario que se sincronizan"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Limitar los correos que se sincronizan"</string>
- <string name="quick_1" msgid="3426057697353380951">"¡Gracias!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Me parece bien."</string>
- <string name="quick_3" msgid="8061819976353395585">"Lo leeré más adelante y me pondré en contacto contigo."</string>
- <string name="quick_4" msgid="3988974084396883051">"Vamos a convocar a una reunión para tratar esto."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Se ha inhabilitado la sincronización en segundo plano de esta cuenta en itinerancia."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Enviando respuesta..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"No hay mensajes."</string>
-</resources>
diff --git a/email2/res/values-es-rUS/uploader.xml b/email2/res/values-es-rUS/uploader.xml
deleted file mode 100644
index 5dda4d043..000000000
--- a/email2/res/values-es-rUS/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Instant Upload"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Álbum de Instant Upload"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Cargando"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Completadas"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Pausado"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d fotos • %3$d videos"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d fotos • %2$d videos"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"batería baja"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"se excedió el cupo de fotos"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"Itinerancia"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"esperando Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"retrasado por falta de carga"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"esperando conexión"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"se volverá a intentar en %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Mostrar cargas pendientes"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Mostrar las cargas completadas"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Ver en línea"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Mostrar cargas pendientes"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Ocultar cargas pendientes"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Mostrar detalles"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Ocultar detalles"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Configuración"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"%s cargados"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Cuenta"</string>
- <string name="upload" msgid="2615541458361216022">"Cargar"</string>
- <string name="ok" msgid="2516349681897895312">"Aceptar"</string>
- <string name="cancel" msgid="1207103189404543868">"Cancelar"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Cargando a "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" para "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Error de inicialización de carga"</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Archivo no disponible"</string>
- <string name="account_error" msgid="1904775271866104941">"No se recuperó información de la cuenta."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Hubo un problema al acceder a tu cuenta."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Esperando para volver a intentar"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Esperando Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Cargando"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Error"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Completado"</string>
- <string name="pause_state_running" msgid="711411177620353982">"cargando"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"pausado manualmente"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"en pausa: batería baja"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"en pausa: retrasado hasta que se cargue"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"en pausa: esperando conexión"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"en pausa: se excedió el cupo de PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"en pausa: esperando Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"pausado: itinerancia"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"esperando para volver a intentar"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minuto"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minutos"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minutos"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Sin conexión de datos"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"No hay espacio en disco disponible para la cuenta."</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Archivo no encontrado"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Error del servicio"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Error de red"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Error de autenticación"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Cargas pendientes [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Cargas completadas [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Pausar cargas"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Reanudar cargas"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Cargar ahora"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Cargar más tarde"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"No cargar"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Ver"</string>
- <string name="manager_retry" msgid="939534318469518843">"Intentar nuevamente"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Carga cancelada"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Carga ya finalizada"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sincronizar todo"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Última sincronización:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"La lista de elementos completados está vacía."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Instant Upload"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Cargas finalizadas"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Cargas pausadas"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Aún no se ha activado Instant Upload."</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Los archivos grandes solo se cargarán con una conexión Wi-Fi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Buscando archivos..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Preparando <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> fotos y <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> videos para cargar..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"No es necesario cargar fotos o videos adicionales."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Se ha producido un problema al establecer comunicación con el servidor. Vuelve a intentarlo más tarde."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Se canceló Sincronizar todo."</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sincronizar todo"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Vista completada"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Ver cargas pendientes"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"General"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Pausar todas las cargas"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Energía"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Subir solo cuando se esté cargando el teléfono."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Cargar solo cuando la conexión Wi-Fi esté disponible."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotos"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Cuenta"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Condiciones de carga"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Tamaño de foto"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videos"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Cuenta"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"La cuenta de fotos se utilizará mientras se sube el video."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Condiciones de carga"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Por ahora, se utiliza la configuración de conectividad de fotos."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Solo fotos a través de redes para celulares"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotos y videos a través de redes para celulares"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Fotos y videos solo a través de Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Acerca de"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Vers. Instant Upload"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Recomendado: 1600 píxeles (para uso compartido, impresiones y protectores de pantalla)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Tamaño original (carga más lenta)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"en pausa: tarjeta SD no disponible"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Tarjeta SD no disponible"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Configuración de Instant Upload"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Instant Upload"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Cargar automáticamente fotos y videos nuevos en un álbum web privado"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Estado de la carga"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Avanzado"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Cargas por dispositivos móviles"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Cargas de itinerancia"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Cargar fotos y videos en itinerancia de red de datos"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Cargas de la batería"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Subir fotos y videos solo durante la carga"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Cargar fotos existentes"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Cargar fotos y videos existentes desde el teléfono ahora"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Inhabilitada"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Cargando (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d de %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"En pausa: toca para reanudar la carga."</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Cargar fotos existentes"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Subir fotos y videos que no hayas subido previamente a un álbum privado de la web desde tu teléfono puede demorar unos minutos. Este proceso se realizará en segundo plano. ¿Estás seguro de que deseas continuar?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Sí"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"No"</string>
-</resources>
diff --git a/email2/res/values-es/strings.xml b/email2/res/values-es/strings.xml
deleted file mode 100644
index 82e6b8577..000000000
--- a/email2/res/values-es/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Leer archivos adjuntos de correos electrónicos"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permite que la aplicación consulte los archivos adjuntos de los correos electrónicos."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Acceder a los datos del proveedor de correo electrónico"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permite que la aplicación acceda a la base de datos de tu correo electrónico, incluidos los mensajes recibidos, los mensajes enviados, los nombres de usuario y las contraseñas."</string>
- <string name="app_name" msgid="5815426892327290362">"Correo"</string>
- <string name="compose_title" msgid="427986915662706899">"Redactar"</string>
- <string name="debug_title" msgid="5175710493691536719">"Depurar"</string>
- <string name="next_action" msgid="3931301986364184415">"Siguiente"</string>
- <string name="okay_action" msgid="8365197396795675617">"Aceptar"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Cancelar"</string>
- <string name="previous_action" msgid="5181616311579820981">"Anterior"</string>
- <string name="send_action" msgid="1729766205562446418">"Enviar"</string>
- <string name="reply_action" msgid="4262472229221507619">"Responder"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Responder a todos"</string>
- <string name="delete_action" msgid="8421026208288857155">"Eliminar"</string>
- <string name="forward_action" msgid="669174181042344116">"Reenviar"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Destacar"</string>
- <string name="done_action" msgid="7497990549515580249">"Listo"</string>
- <string name="create_action" msgid="3062715563215392251">"Crear nueva"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Eliminar"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"No hay respuestas rápidas."</string>
- <string name="discard_action" msgid="6532206074859505968">"Descartar"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Guardar borrador"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Usar respuesta rápida"</string>
- <string name="read_action" msgid="4701484794504781686">"Marcar como leído"</string>
- <string name="unread_action" msgid="6280399049357552826">"Marcar como no leído"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Añadir estrella"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Eliminar estrella"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Actualizar"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Añadir cuenta"</string>
- <string name="compose_action" msgid="4045702519637388045">"Redactar"</string>
- <string name="search_action" msgid="6325101454876682308">"Búsqueda"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Ajustes de la cuenta"</string>
- <string name="settings_action" msgid="6334807007967459412">"Ajustes"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Opciones de sincronización"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Marcar como no leído"</string>
- <string name="move_action" msgid="3059189775933985898">"Mover"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ CC/CCO"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Añadir CC/CCO"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Adjuntar archivo"</string>
- <string name="close_action" msgid="533058985745238100">"Cerrar"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Enviar todos"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Elegir archivo adjunto"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Mover a"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Cargando mensajes..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Error de conexión"</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"No se ha podido cargar el mensaje de texto. Es posible que sea demasiado grande para mostrarse."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Mover mensaje"</item>
- <item quantity="other" msgid="371256717624461324">"Mover mensajes"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Las cuentas POP3 no permiten mover mensajes."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"No se puede mover porque la selección contiene varias cuentas."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"No se pueden mover los mensajes de las carpetas Borradores, Bandeja de salida ni Enviados."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> no leídos (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> no leídos (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> no leídos (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"en <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> cuentas"</item>
- <item quantity="other" msgid="2723797835410343458">"en <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> cuentas"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"para <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> mensajes nuevos"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Todas las cuentas"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> cuenta"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> cuentas"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Recibidos"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Enviados"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Borradores"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Papelera"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Enviados"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Correo basura"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"No leído"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Recibidos (no leídos)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Recibidos (todos)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Vista combinada (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> cuenta"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> cuentas"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versión: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Recibidos"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Destacados"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Borradores"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Enviados"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Vista combinada"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Mostrar todas las carpetas"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Cuentas"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Carpetas recientes (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Todas las carpetas"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Carpetas recientes"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Asunto"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Sin asunto"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Cargar más mensajes"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> seleccionados"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> seleccionados"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"No hay ningún mensaje."</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Para"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"CC"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"CCO"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Asunto"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"De:"</string>
- <string name="to" msgid="4392614766835725698">"Para"</string>
- <string name="cc" msgid="7017720927911078193">"CC"</string>
- <string name="bcc" msgid="3098643138241111579">"CCO"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Asunto"</string>
- <string name="body_hint" msgid="4279864165439577668">"Redactar correo"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Original Message --------"\n"Subject: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"From: <xliff:g id="SENDER">%2$s</xliff:g>"\n"To: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> wrote:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Incluir texto citado"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Incluir texto"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Añade al menos un destinatario."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Algunas direcciones de correo electrónico no son válidas."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"El archivo es demasiado grande para adjuntarlo."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Usar respuesta rápida"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> y <xliff:g id="NUMBER">%2$d</xliff:g> más"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Para:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"CC:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"CCO:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Fecha:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"De:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Asunto:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Ver"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Instalar"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Reproducir"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Cargar"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Info"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Guardar"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Guardado"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Detener"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Adjunto guardado como <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Error al guardar el adjunto"</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Uno o varios de los archivos adjuntos del mensaje reenviado se descargarán antes de enviarse."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Mensaje"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Invitación"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> adjunto"</item>
- <item quantity="other" msgid="974463163535515223">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> adjuntos"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Mostrar imágenes"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Mostrar siempre"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Mostrar siempre las imágenes de este remitente"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Las imágenes de este remitente se mostrarán automáticamente."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Ver en calendario"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Invitación de calendario"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"¿Asistirás?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Sí"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Quizás"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" No"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Has aceptado esta invitación."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Has respondido \"quizás\" a esta invitación."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Has rechazado esta invitación."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Mostrar detalles"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Detalles del mensaje"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Información de archivo adjunto"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Se necesita una conexión Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Ajustes de Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Ajustes de aplicación"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"No se puede abrir el archivo adjunto."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"No se puede guardar ni abrir este archivo porque el tipo de archivo adjunto puede incluir software malintencionado."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"No se puede guardar ni abrir este archivo adjunto debido a las políticas de seguridad de la cuenta."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Este archivo adjunto es demasiado grande para descargarlo en una red móvil. Puedes descargarlo la próxima vez que te conectes a una red Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Ninguna de las aplicaciones instaladas puede abrir este archivo adjunto. Prueba a descargar una aplicación adecuada en Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Este archivo adjunto es una aplicación. Para poder instalarla, debes activar la opción Orígenes desconocidos en Ajustes &gt; Aplicaciones."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Las aplicaciones no se pueden instalar directamente desde los mensajes de correo. Primero debes guardar la aplicación y, a continuación, instalarla mediante la aplicación Descargas."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"No se ha podido descargar el archivo adjunto."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Se ha producido un error al decodificar el mensaje."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Viendo <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"¿Eliminar este mensaje?"</item>
- <item quantity="other" msgid="4437637377522896262">"¿Eliminar estos mensajes?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Mensaje eliminado"</item>
- <item quantity="other" msgid="6574961322865652255">"Mensajes eliminados"</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Mensaje descartado"</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Mensaje guardado como borrador"</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"No se puede mostrar el archivo adjunto."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"No se ha podido cargar el archivo adjunto \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Abriendo mensaje…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"Se ha movido <xliff:g id="NUM_MESSAGE">%1$d</xliff:g> mensaje a <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>."</item>
- <item quantity="other" msgid="2286739630865943494">"Se han movido <xliff:g id="NUM_MESSAGE">%1$d</xliff:g> mensajes a <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>."</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Error al enviar uno o varios archivos adjuntos"</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Archivo adjunto no reenviado"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Error al iniciar sesión en <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Error al iniciar sesión"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Más reciente"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Anterior"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" : "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Configuración de cuenta"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Cuenta de correo electrónico"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Puedes configurar tu cuenta en pocos pasos."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Dirección de correo electrónico"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Contraseña"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Enviar correo desde esta cuenta de forma predeterminada"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Config. manual"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Introduce una dirección de correo electrónico y una contraseña válidas."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Cuenta duplicada"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Ya estás usando este nombre de usuario para la cuenta \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Esta contraseña contiene uno o varios espacios al principio o al final. Muchos servidores no admiten contraseñas con espacios."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Recuperando la información de la cuenta..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Comprobando la configuración del servidor de entrada..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Comprobando la configuración del servidor de salida..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Configuración de cuenta"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Tu cuenta ya está configurada y en breve verás tu correo."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Asigna un nombre a esta cuenta (opcional)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Tu nombre (aparece en los mensajes enviados)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Este campo no puede estar vacío."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Configuración de cuenta"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Tipo de cuenta"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"¿Qué tipo de cuenta tienes?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Configuración de cuenta"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Ajustes del servidor de entrada"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nombre de usuario"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Contraseña"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Servidor"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Puerto"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipo de seguridad"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ninguno"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (aceptar todos los certif.)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (aceptar todos los certif.)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Eliminar correo electrónico del servidor"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Nunca"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Al borrar mensajes"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Prefijo de ruta IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Opcional"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Configuración de cuenta"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Ajustes del servidor de salida"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Servidor SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Puerto"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipo de seguridad"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Solicitar inicio de sesión"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nombre de usuario"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Contraseña"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Configuración de cuenta"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Ajustes del servidor"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Servidor"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Dominio\\nombre de usuario"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Utilizar conexión segura (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Aceptar todos los certificados SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certificado de cliente"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Seleccionar"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Utilizar certificado de cliente"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Eliminar"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Ninguno"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID del dispositivo móvil"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Ajustes de la cuenta"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Opciones de cuenta"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Comprobar mensajes nuevos"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nunca"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Comprobación automática"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Cada 5 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Cada 10 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Cada 15 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Cada 30 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Cada hora"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Enviar correo desde esta cuenta de forma predeterminada"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Notificarme cuando llegue un correo"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sincronizar contactos de esta cuenta"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sincronizar calendario de esta cuenta"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sincronizar correo de esta cuenta"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Descargar adjuntos automáticamente al conectar a una red WiFi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Error al completar la configuración"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Días para sincronizar"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automática"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Un día"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tres días"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Una semana"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Dos semanas"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Un mes"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Todo"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Predeterminada de cuenta"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nombre de usuario o contraseña incorrectos"</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nombre de usuario o contraseña incorrectos"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"No se puede establecer conexión de forma segura con el servidor."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"No se puede establecer conexión de forma segura con el servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Se necesita un certificado de cliente. ¿Quieres conectarte al servidor con un certificado de cliente?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"El certificado no es válido o no se puede acceder a él."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"El servidor ha devuelto un error. Comprueba tu nombre de usuario y tu contraseña y vuelve a intentarlo."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"No se puede establecer conexión con el servidor."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"No se puede establecer conexión con el servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"El protocolo TLS es obligatorio, pero el servidor no lo admite."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"El servidor no admite métodos de autenticación."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"No se ha podido establecer conexión con el servidor debido a un error de seguridad."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"No se ha podido establecer conexión con el servidor."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Has introducido una dirección de servidor incorrecta o el servidor requiere una versión de protocolo no compatible con la aplicación Correo."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"No tienes permiso para hacer la sincronización con este servidor. Para obtener más información, ponte en contacto con el administrador del servidor."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Administración de seguridad remota"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Es necesario que permitas que el servidor <xliff:g id="SERVER">%s</xliff:g> controle de forma remota algunas funciones de seguridad de tu dispositivo Android. ¿Quieres terminar de configurar esta cuenta?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Este servidor requiere funciones de seguridad que no son compatibles con tu dispositivo Android (por ejemplo: <xliff:g id="ERROR">%s</xliff:g>)."</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"No puedes modificar el nombre de usuario de una cuenta. Para añadir una cuenta con otro nombre de usuario, toca Añadir cuenta."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"ADVERTENCIA: si desactivas el permiso de la aplicación Correo para administrar tu dispositivo, se eliminarán todas las cuentas de esta aplicación que requieran su uso, así como las direcciones de correo electrónico, los contactos, los eventos de calendario y otro tipo de datos."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Actualización de seguridad"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> requiere que actualices la configuración de seguridad."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Los requisitos de seguridad de la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" no permiten su sincronización."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Es necesario actualizar la configuración de seguridad de la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Se ha modificado la configuración de seguridad de la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" (no es necesaria la intervención del usuario)."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Actualización seguridad necesaria"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Políticas de seguridad modificadas"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Error al cumplir políticas seguridad"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Seguridad del dispositivo"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Es necesario que permitas que el servidor <xliff:g id="SERVER">%s</xliff:g> controle de forma remota algunas funciones de seguridad de tu dispositivo Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Aceptar"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" requiere que modifiques la contraseña o el PIN de la pantalla de bloqueo."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Contraseña bloqueo pantalla va a caducar"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"La contraseña o el PIN de la pantalla de bloqueo ha caducado."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Contraseña bloqueo caducada"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Contraseña bloqueo pantalla va a caducar"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Debes cambiar la contraseña o el PIN de la pantalla de bloqueo lo antes posible para que no se borren los datos de <xliff:g id="ACCOUNT">%s</xliff:g>. ¿Quieres hacerlo ahora?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Contraseña bloqueo caducada"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Los datos de <xliff:g id="ACCOUNT">%s</xliff:g> se están borrando del dispositivo. Para restaurarlos, modifica la contraseña o el PIN de la pantalla de bloqueo. ¿Quieres hacerlo ahora?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"¿Quieres descartar los cambios no guardados?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Error al iniciar sesión"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"El nombre de usuario o la contraseña de <xliff:g id="ACCOUNT">%s</xliff:g> son incorrectos. ¿Quieres actualizarlos ahora?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Cuenta predeterminada"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Enviar correo desde esta cuenta de forma predeterminada"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Descargar adjuntos"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Descargar automáticamente adjuntos de correos recientes por Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Notificaciones de correo"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Frecuencia de sincronización, notificaciones, etc."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Enviar notificación cuando llegue un correo electrónico"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Comprobar mensajes nuevos"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Ajustes de entrada"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nombre de usuario, contraseña y otros ajustes del servidor de entrada"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Ajustes de salida"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nombre de usuario, contraseña y otros ajustes del servidor de salida"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Políticas aplicadas"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ninguno"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Políticas no admitidas"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ninguno"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Intentar sincronización"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Toca para sincronizar esta cuenta."</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Nombre de cuenta"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Tu nombre"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Firma"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Respuestas rápidas"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Texto que sueles usar en tus correos"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Añadir texto al final de los mensajes enviados"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Ajustes de notificaciones"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Uso de datos"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Políticas de seguridad"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Editar respuesta rápida"</string>
- <string name="save_action" msgid="1988862706623227093">"Guardar"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronizar contactos"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincronizar contactos de esta cuenta"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronizar calendario"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sincronizar eventos de calendario para esta cuenta"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincronizar correo"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincronizar correo de esta cuenta"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrar"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibrar también cuando llegue un mensaje"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Siempre"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Solo en modo silencio"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Nunca"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibración"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Seleccionar tono"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Ajustes del servidor"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Eliminar cuenta"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Se va a eliminar la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" de \"Correo\"."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Eliminar cuenta"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Eliminar cuenta"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Opciones de sincronización"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Opciones de sincronización (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Ajustes de sincronización"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Frecuencia de comprobación"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Días para sincronizar"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Correo"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Seleccionar cuenta"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Seleccionar carpeta"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"No se ha encontrado la cuenta. Es posible que se haya eliminado."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"No se ha encontrado la carpeta. Es posible que se haya eliminado."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Solo algunas cuentas \"Plus\" incluyen acceso POP para permitir que este programa se conecte. Si no puedes acceder con tu dirección de correo electrónico y contraseña, es posible que no tengas una cuenta \"Plus\" de pago. Usa el navegador para acceder a estas cuentas de correo."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Para configurar esta cuenta de correo electrónico, accede al sitio web de T-Online y crea una contraseña para acceder al correo electrónico POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Cuenta de trabajo"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"No se ha podido crear la cuenta. Inténtalo de nuevo."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Correo electrónico"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Permite las políticas de seguridad especificadas por el servidor."</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Buscando <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> resultado de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultados de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Ajustes"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Ajustes generales"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Aplicación"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avance automático"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Selecciona la pantalla que se mostrará después de eliminar el mensaje"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ocultar casillas de verificación"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"En las listas de mensajes, mantener pulsado para seleccionar"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirmar para eliminar"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mensajes"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirmar para enviar"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mensajes"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Ir a"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mensaje más reciente"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mensaje anterior"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Lista de mensajes"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Tamaño de texto del mensaje"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Texto muy pequeño"</item>
- <item msgid="4415205108584620118">"Texto pequeño"</item>
- <item msgid="4550219696381691112">"Texto normal"</item>
- <item msgid="6227813549949219991">"Texto grande"</item>
- <item msgid="1197917420815786571">"Texto enorme"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Tamaño de texto del mensaje"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Muy pequeño"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Pequeño"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Grande"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Enorme"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Responder a todos"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Elegir \"Responder a todos\" como opción predeterminada para los mensajes"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Preguntar para ver imágenes"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Las imágenes de los mensajes no se mostrarán automáticamente"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Se ha restaurado la opción Mostrar imágenes."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Esperando para sincronizar"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Tu correo electrónico aparecerá en breve."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Toca para cambiar"</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Combinación de recibidos"</string>
- <string name="widget_unread" msgid="4404711399009077833">"No leídos"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Destacados"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Cargando…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Toca para configurar."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Aún no se ha configurado una cuenta de correo electrónico."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Buscar correo"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Buscar en <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Resultados de búsqueda de \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Esperando resultados"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Algunos servidores pueden tardar mucho tiempo."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Carpetas"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"No permitir usar cámara del dispositivo"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Solicitar contraseña del dispositivo"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Restringir nuevo uso contraseñas recientes"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Forzar vencimiento de contraseñas"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Dispositivo inactivo necesario para bloqueo"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Limitar número de eventos que se sincronizan"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Limitar número de correos que se sincronizan"</string>
- <string name="quick_1" msgid="3426057697353380951">"¡Gracias!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Me parece bien, ¡gracias!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Lo leeré más tarde y te enviaré una respuesta."</string>
- <string name="quick_4" msgid="3988974084396883051">"Vamos a reunirnos para hablar de este tema."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Se ha inhabilitado la sincronización en segundo plano de esta cuenta en itinerancia."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Enviando respuesta..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"No hay ningún mensaje."</string>
-</resources>
diff --git a/email2/res/values-es/uploader.xml b/email2/res/values-es/uploader.xml
deleted file mode 100644
index c706c4aa9..000000000
--- a/email2/res/values-es/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Subida instantánea"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Álbum de Subida instantánea"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Subiendo"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Subidas completadas"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"En pausa"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d fotos • %3$d vídeos"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d fotos, %2$d vídeos"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"batería baja"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"cuota de fotos superada"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"itinerancia"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"esperando red Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"en pausa hasta que se ponga a cargar"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"esperando conexión"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"se volverá a intentar en %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Mostrar subidas pendientes"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Mostrar subidas finalizadas"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Ver online"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Mostrar subidas pendientes"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Ocultar subidas pendientes"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Mostrar detalles"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Ocultar detalles"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Ajustes"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Subido el: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Cuenta"</string>
- <string name="upload" msgid="2615541458361216022">"Subir"</string>
- <string name="ok" msgid="2516349681897895312">"Aceptar"</string>
- <string name="cancel" msgid="1207103189404543868">"Cancelar"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Subiendo a "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" para "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Error al iniciar la subida"</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Archivo no disponible"</string>
- <string name="account_error" msgid="1904775271866104941">"Error al recuperar la información de la cuenta"</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Se ha producido un error al acceder a tu cuenta."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Esperando para intentar de nuevo"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Esperando red Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Subiendo"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Con error"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Completado"</string>
- <string name="pause_state_running" msgid="711411177620353982">"subiendo"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"pausado manualmente"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"en pausa: batería baja"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"en pausa: detenido hasta que se ponga a cargar"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"en pausa: esperando conexión"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"en pausa: no hay espacio en Álbumes web de Picasa"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"en pausa: esperando red Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"en pausa: itinerancia"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"esperando para nuevo intento"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minuto"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minutos"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minutos"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Sin conexión de datos"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"No hay espacio disponible en la cuenta."</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Archivo no encontrado"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Error del servicio"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Error de red"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Error de autenticación"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Subidas pendientes [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Subidas completadas [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Pausar subidas"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Reanudar subidas"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Subir ahora"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Subir más tarde"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"No subir"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Ver"</string>
- <string name="manager_retry" msgid="939534318469518843">"Volver a intentarlo"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Subida cancelada"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"La subida ya ha finalizado."</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sincronizar todo"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Última sincronización:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"La lista de elementos finalizados está vacía."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Subida instantánea"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Fin de la subida"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Subidas en pausa"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Aún no se ha activado la Subida instantánea."</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Los archivos grandes solo se subirán con conexión Wi-Fi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Buscando archivos..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Preparando la subida de <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> fotos y <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> vídeos..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"No hay fotos o vídeos adicionales que subir."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Se ha producido un error al establecer comunicación con el servidor. Inténtalo de nuevo más tarde."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Sincronizar todo cancelado"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sincronizar todo"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Vista de subidas completadas"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Ver subidas pendientes"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"General"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Pausar todas las subidas"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Carga necesaria para subir"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Subir solo cuando el teléfono se esté cargando"</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Subir solo cuando la conexión Wi-Fi esté disponible"</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotos"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Cuenta"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Condiciones de subida"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Tamaño de foto"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Vídeos"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Cuenta"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Se usará la cuenta de fotos mientras se sube el vídeo."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Condiciones de subida"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Por ahora se usan los ajustes de conectividad de fotos."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Solo fotos si se usan datos"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Subir fotos y vídeos a través de redes móviles"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Subir fotos y vídeos solo con Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Acerca de"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Versión de Subida instantánea"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Recomendado: 1600 píxeles (para compartir, imprimir y salvapantallas)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Tamaño original (subida más lenta)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"en pausa: tarjeta SD no disponible"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Tarjeta SD no disponible"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Ajustes de Subida instantánea"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Subida instantánea"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Subir automáticamente nuevas fotos y vídeos a un álbum web privado"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Estado de la subida"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Avanzados"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Subidas móviles"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Subidas en itinerancia"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Subir fotos y vídeos en itinerancia en redes de datos"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Subir en carga"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Subir fotos y vídeos solo cuando el dispositivo se está cargando"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Subir fotos y vídeos disponibles"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Subir fotos y vídeos disponibles en tu teléfono ahora mismo"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Inhabilitada"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Cargando (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d de %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"En pausa: toca para continuar la subida"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Subir fotos disponibles"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Subir fotos y vídeos que no hayas subido previamente desde tu teléfono a un álbum web privado puede llevar tiempo, aunque se hará en segundo plano. ¿Seguro que quieres continuar?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Sí"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"No"</string>
-</resources>
diff --git a/email2/res/values-et/strings.xml b/email2/res/values-et/strings.xml
deleted file mode 100644
index 1e73f8840..000000000
--- a/email2/res/values-et/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Loe meili manuseid"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Võimaldab rakendusel lugeda teie meilisõnumite manuseid."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Juurdepääs e-posti teenusepakkuja andmetele"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Võimaldab rakendusel pääseda teie meiliandmebaasi, sealhulgas vastuvõetud ja saadetud sõnumite, kasutajanimede ning paroolide juurde."</string>
- <string name="app_name" msgid="5815426892327290362">"E-post"</string>
- <string name="compose_title" msgid="427986915662706899">"Koostamine"</string>
- <string name="debug_title" msgid="5175710493691536719">"Silumine"</string>
- <string name="next_action" msgid="3931301986364184415">"Järgmine"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Tühista"</string>
- <string name="previous_action" msgid="5181616311579820981">"Eelmine"</string>
- <string name="send_action" msgid="1729766205562446418">"Saada"</string>
- <string name="reply_action" msgid="4262472229221507619">"Vasta"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Vasta kõigile"</string>
- <string name="delete_action" msgid="8421026208288857155">"Kustuta"</string>
- <string name="forward_action" msgid="669174181042344116">"Edasta"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Tähista tärniga"</string>
- <string name="done_action" msgid="7497990549515580249">"Valmis"</string>
- <string name="create_action" msgid="3062715563215392251">"Loo uus"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Kustuta"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Kiirvastuseid pole."</string>
- <string name="discard_action" msgid="6532206074859505968">"Loobu"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Salvesta mustand"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Sisesta kiirvastus"</string>
- <string name="read_action" msgid="4701484794504781686">"Märgi loetuks"</string>
- <string name="unread_action" msgid="6280399049357552826">"Märgi mitteloetuks"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Lisa tärn"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Eemalda tärn"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Värskenda"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Lisa konto"</string>
- <string name="compose_action" msgid="4045702519637388045">"Koosta"</string>
- <string name="search_action" msgid="6325101454876682308">"Otsing"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Konto seaded"</string>
- <string name="settings_action" msgid="6334807007967459412">"Seaded"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Sünkroonimisvalikud"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Märgi mitteloetuks"</string>
- <string name="move_action" msgid="3059189775933985898">"Teisalda"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ koopia/pimek."</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Lisa koopia/pimekoopia väli"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Manusta fail"</string>
- <string name="close_action" msgid="533058985745238100">"Sule"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Saada kõik sõnumid"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Manuse valimine"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Teisalda:"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Sõnumite laadimine ..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Ühendusprobleem."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Sõnumi teksti laadimine ebaõnnestus. Sõnum võib olla vaatamiseks liiga suur."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Teisaldatud sõnum"</item>
- <item quantity="other" msgid="371256717624461324">"Teisaldatud sõnumid"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"POP3-kontodel teisaldamist ei toetata."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Ei saa teisaldada, kuna valik sisaldab mitut kontot."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Kaustades Mustandid, Väljundkast ja Saadetud olevaid sõnumeid ei saa teisaldada."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> lugemata (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> lugemata (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> lugemata (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> kontol"</item>
- <item quantity="other" msgid="2723797835410343458">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> kontol"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"saaja: <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> uut sõnumit"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Kõik kontod"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"Kontode arv: <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> kontot"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Postkast"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Väljundkast"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Mustandid"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Prügikast"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Saadetud"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Rämpspost"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Lugemata"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Postkast (lugemata)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Postkast (kõik)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Kombineeritud vaated (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> konto"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> kontot"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versioon: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Postkast"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Tärniga"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Mustandid"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Väljundkast"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Kombineeritud kuva"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Kuva kõik kaustad"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Kontod"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Viimased kaustad (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Kõik kaustad"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Hiljutised kaustad"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Teema"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Teema puudub"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Laadi rohkem sõnumeid"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> sõnumit on valitud"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> sõnumit on valitud"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Sõnumeid ei ole"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Saaja:"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Koopia"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Pimekoopia"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Teema"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Saatja:"</string>
- <string name="to" msgid="4392614766835725698">"Saaja"</string>
- <string name="cc" msgid="7017720927911078193">"Koopia"</string>
- <string name="bcc" msgid="3098643138241111579">"Pimekoopia"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Teema"</string>
- <string name="body_hint" msgid="4279864165439577668">"Koostage meil"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Originaalsõnum --------"\n"Teema: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Saatja: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Saaja: <xliff:g id="TO">%3$s</xliff:g>"\n"Koopia: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> kirjutas:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Osundatud teksti lisamine"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Lisa tekst"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Lisage vähemalt üks saaja."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Mõned e-posti aadressid on kehtetud."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Fail on manustamiseks liiga suur."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Kiirvastuse sisestamine"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> ja veel <xliff:g id="NUMBER">%2$d</xliff:g>"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Saaja:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Koopia:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Pimekoopia:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Kuupäev:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Saatja:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Teema:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Vaata"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Installi"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Esita"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Laadi"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Teave"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Salvesta"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Salvestatud"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Peata"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Manus salvestatakse nimega <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Manust ei saanud salvestada."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Vähemalt üks edastatava sõnumi manus laaditakse enne saatmist alla."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Sõnum"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Kutsu"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> manust"</item>
- <item quantity="other" msgid="974463163535515223">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> manust"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Kuva pildid"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Kuva alati"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Näita alati selle saatja pilte"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Selle saatja pilte näidatakse automaatselt."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Vaata kalendris"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Kalendri kutse"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Kas lähete?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Jah"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Võib-olla"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Ei"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Olete kutse vastu võtnud."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Vastasite sellele kutsele „võib-olla”."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Keeldusite sellest kutsest."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Kuva üksikasjad"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Sõnumi üksikasjad"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Manuse teave"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Vajalik WiFi-ühendus"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"WiFi-seaded"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Rakenduse seaded"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Ei saa manust avada"</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Te ei saa seda faili salvestada või avada, kuna seda tüüpi manus võib sisaldada pahavara."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Seda manust ei saa selle konto turvaeeskirjade tõttu salvestada ega avada."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Manus on mobiilivõrgu kaudu allalaadimiseks liiga suur. Saate alla laadida järgmine kord WiFi-võrku ühendamisel."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Selle manuse avamiseks pole sobivat rakendust installitud. Laadige teenusest Android Market alla sobiv rakendus."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"See manus on rakendus. Enne selle installimist peate kontrollima tundmatuid allikaid asukohas Seaded &gt; Rakendused."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Rakendusi ei saa installida otse meilist. Esmalt salvestage rakendus ja seejärel installige see rakenduse Allalaadimised abil."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Manuse allalaadimine ebaõnnestus."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Sõnumi dekodeerimisel ilmnes viga."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Faili <xliff:g id="FILENAME">%s</xliff:g> kuvamine"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Kas kustutada see sõnum?"</item>
- <item quantity="other" msgid="4437637377522896262">"Kas kustutada need sõnumid?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Sõnum kustutatud."</item>
- <item quantity="other" msgid="6574961322865652255">"Sõnumid kustutatud."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Sõnumist on loobutud."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Sõnum salvestati mustandina."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Manust ei saa kuvada."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Manuse „<xliff:g id="FILENAME">%s</xliff:g>” laadimine ebaõnnestus."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Sõnumi avamine ..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> sõnumit on teisaldatud postkasti <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> sõnumit on viidud postkasti <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Ühe või mitme manuse edastamine ebaõnnestus."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Manust ei edastatud"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Kontole <xliff:g id="ACCOUNT_NAME">%s</xliff:g> sisselogimine ebaõnnestus."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Sisselogimine ebaõnnestus"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Uuemad"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Vanemad"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Konto seadistamine"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Meilikonto"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Seadistage oma konto vaid mõne sammuga."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-posti aadress"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Parool"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Saada meilid vaikimisi sellelt kontolt"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Seadista käsitsi"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Sisestage kehtiv e-posti aadress ja parool."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplikaatkonto"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Kasutate juba konto „<xliff:g id="DUPLICATE">%s</xliff:g>” puhul seda kasutajanime."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"See parool algab või lõpeb ühe või mitme tühikuga. Paljud serverid ei toeta tühikutega paroole."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Kontoteabe saamine ..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Sissetuleva serveri seadete kontrollimine ..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Väljuva serveri seadete kontrollimine ..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Konto seadistamine"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Teie konto on seadistatud ja meilid on tulekul."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Anna sellele kontole nimi (valikuline)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Teie nimi (kuvatakse väljuvates sõnumites)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"See väli ei tohi tühi olla."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Konto seadistamine"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Konto tüüp"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Mis tüüpi see konto on?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Konto seadistamine"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Sissetuleva serveri seaded"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Kasutajanimi"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Parool"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Turvalisuse tüüp"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Puudub"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Nõustuge kõigi sertifikaatidega)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (nõustu kõigi sertifikaatidega)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Kustuta meil serverist"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Mitte kunagi"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Kui kustutan postkastist"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP-i tee prefiks"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Valikuline"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Konto seadistamine"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Väljuva serveri seaded"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-server"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Turvalisuse tüüp"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Sisselogimine on nõutav"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Kasutajanimi"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Parool"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Konto seadistamine"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Serveri seaded"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Server"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domeen\\kasutajanimi"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Kasuta turvalist ühendust (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Nõustu kõigi SSL-sertifikaatidega"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Kliendisertifikaat"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Vali"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Kasuta kliendisertifikaati"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Eemalda"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Puudub"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Mobiilseadme ID"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Konto seaded"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Konto valikud"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Postkasti kontrollimise sagedus"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Mitte kunagi"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automaatne (sundvalik)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Iga 5 minuti järel"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Iga 10 minuti järel"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Iga 15 minuti järel"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Iga 30 minuti järel"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Kord tunnis"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Saada meilid vaikimisi sellelt kontolt"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Teavita mind meili saabumisest"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sünkrooni selle konto kontaktid"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sünkrooni selle konto kalender"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sünkrooni selle konto meilid"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Manuste automaatne allalaadimine WiFi-ühenduse olemasolul"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Ei saanud lõpetada"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Päevi sünkroonimiseks"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automaatne"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Üks päev"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Kolm päeva"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Üks nädal"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Kaks nädalat"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Üks kuu"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Kõik"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Konto vaikeseade kasutam."</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Kasutajanimi või parool on vale."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Kasutajanimi või parool on vale."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Serveriga ei saa turvaliselt ühendust."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Serveriga ei saa turvaliselt ühendust."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Kliendi sertifikaat on nõutav. Kas soovite luua ühenduse serveriga kliendi sertifikaadi abil?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sertifikaat on kehtetu või juurdepääsmatu."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Server saatis veateate. Kontrollige kasutajanime ja parooli ning proovige uuesti."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Serveriga ei saa ühendust."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Serveriga ei saa ühendust."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS on vajalik, kuid server ei toeta seda."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Server ei toeta autentimismeetodeid."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Turvavea tõttu ei saanud serveriga ühendust luua."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Serveriga ei saanud luua ühendust."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Sisestasite vale serveri aadressi või nõuab server protokolli versiooni, mida e-post ei toeta."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Teil puudub luba selle serveriga sünkroonimiseks. Lisateabe saamiseks võtke ühendust oma serveri administraatoriga."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Kaugturvalisuse haldamine"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Server <xliff:g id="SERVER">%s</xliff:g> nõuab mõnede teie Android-seadme turvafunktsioonide kaugjuhtimise lubamist. Kas soovite lõpetada konto seadistamise?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"See server nõuab turvafunktsioone, mida teie Android-seade ei toeta, sh: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Te ei saa muuta konto kasutajanime. Mõne muu kasutajanimega konto lisamiseks puudutage valikut Lisa konto."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"HOIATUS: meilirakenduse volituse inaktiveerimine seadme haldamiseks kustutab kõik meilikontod, mis seda nõuavad, sh nende meilid, kontaktid, kalendrisündmused ja muud andmed."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Turvavärskendus"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> nõuab, et värskendaksite oma turvaseadeid."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Kontot „<xliff:g id="ACCOUNT">%s</xliff:g>” ei saa turvanõuete tõttu sünkroonida."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Konto „<xliff:g id="ACCOUNT">%s</xliff:g>” vajab turvaseadete värskendamist."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Konto „<xliff:g id="ACCOUNT">%s</xliff:g>” muutis turvaseadeid. Kasutaja ei pea midagi tegema."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Nõutav turvavärskendus"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Turvaeeskirjad on muutunud"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Turbe-eeskirju ei saa täita"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Seadme turvalisus"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Server <xliff:g id="SERVER">%s</xliff:g> nõuab mõnede teie Android-seadme turvafunktsioonide kaugjuhtimise lubamist."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Muuda üksikasju"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"„<xliff:g id="ACCOUNT">%s</xliff:g>” nõuab ekraaniluku PIN-koodi või parooli muutmist."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Ekraaniluku parool on aegumas"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Teie ekraaniluku PIN-kood või parool on aegunud."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Ekraaniluku parool on aegunud"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Ekraaniluku parool on aegumas"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Teil tuleb varsti lukustuskuva PIN-koodi või parooli muuta, vastasel korral kustutatakse konto <xliff:g id="ACCOUNT">%s</xliff:g> andmed. Kas soovite kohe muuta?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Ekraaniluku parool on aegunud"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Konto <xliff:g id="ACCOUNT">%s</xliff:g> andmed kustutatakse teie seadmest. Taastamiseks muutke oma lukustuskuva PIN-koodi või parooli. Kas soovite kohe muuta?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Kas loobute salvestamata muudatustest?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Sisselogimine ebaõnnestus"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Konto <xliff:g id="ACCOUNT">%s</xliff:g> kasutajanimi või parool on vale. Kas soovite neid kohe värskendada?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Vaikekonto"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Saada meilid vaikimisi sellelt kontolt"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Manuste allalaadimine"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Hiljutiste sõnumite manuste automaatne allalaadimine WiFi kaudu"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Meiliteatised"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Sünkroonimise sagedus, teatised jne."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Saada teatis meili saabumisel"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Postkasti kontrollimise sagedus"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Sissetulevate seaded"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Kasutajanimi, parool ja muud sissetuleva posti serveri seaded"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Väljuvad seaded"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Kasutajanimi, parool ja muud väljamineva posti serveri seaded"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Eeskirjad on jõustatud"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Puudub"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Toeta eeskirjad"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Puudub"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Proovi sünkroonida"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Konto sünkroonimiseks puudutage siin"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Konto nimi"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Teie nimi"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Allkiri"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Kiirvastused"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Muutke teksti, mida meilide koostamisel sageli sisestate"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Lisa saadetavatele sõnumitele tekst"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Teadistusseaded"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Andmete kasutamine"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Turvaeeskirjad"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Kiirvastuse muutmine"</string>
- <string name="save_action" msgid="1988862706623227093">"Salvesta"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sünkrooni kontaktid"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Konto kontaktide sünkroonimine"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sünkrooni kalender"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sünkrooni konto kalendri sündmused"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sünkrooni meil"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Konto meili sünkroonimine"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibreering"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibreeri ka meilisõnumi saabumisel"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Alati"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Ainult hääletus režiimis"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Mitte kunagi"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibreering"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Vali helin"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Serveri seaded"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Konto eemaldamine"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Konto „<xliff:g id="ACCOUNT">%s</xliff:g>” eemaldatakse e-postist."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Konto eemaldamine"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Eemalda konto"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Sünkroonimisvalikud"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Sünkroonimisvalikud (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Sünkroonimisseaded"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Sageduse kontrollimine"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Päevi sünkroonimiseks"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Meilikonto"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Konto valimine"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Kausta valimine"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Kontot ei leitud. See võib olla eemaldatud."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Kausta ei leitud. See võib olla eemaldatud."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Ainult mõnel kontol „Plus” on POP-juurdepääs, mis lubab programmiga ühendust võtta. Kui te ei saa oma õige e-posti aadressi ja parooliga sisse logida, pole teil võib-olla tasulist kontot „Plus”. Neile meilikontodele juurdepääsuks käivitage veebibrauser."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Enne selle meilikonto loomist külastage T-Online\'i veebisaiti ja looge parool POP3-meilile juurdepääsuks."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Korporatiivne"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Konto loomine ebaõnnestus. Proovige uuesti."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-post"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Võimaldab serveripõhiseid turvaeeskirju"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Domeeni <xliff:g id="DOMAIN">%s</xliff:g> otsimine ..."</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> tulemust domeenilt <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> tulemust domeenilt <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Seaded"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Üldseaded"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Rakendus"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automaatne edasiminek"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Valige, millist ekraani pärast sõnumi kustutamist kuvada"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Peida märkeruudud"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Sõnumite loendis peab valimiseks üksust puudutama ja all hoidma"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Kinnitamine enne kustutamist"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Sõnumid"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Kinnitamine enne saatmist"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Sõnumid"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Edasiminek"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Uuem sõnum"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Vanem sõnum"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Sõnumite loend"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Sõnumi teksti suurus"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Väga väike tekst"</item>
- <item msgid="4415205108584620118">"Väike tekst"</item>
- <item msgid="4550219696381691112">"Normaalse suurusega tekst"</item>
- <item msgid="6227813549949219991">"Suur tekst"</item>
- <item msgid="1197917420815786571">"Hiiglaslik tekst"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Sõnumi teksti suurus"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Pisike"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Väike"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Tavaline"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Suur"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Väga suur"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Vasta kõigile"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Muutke sõnumitele vastamise vaikeseadeks „Vasta kõigile”"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Piltide kuvamiseks loa küsimine"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Sõnumites olevaid pilte ei kuvata automaatselt"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Käsk „Kuva pildid” on tühjendatud."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Sünkroonimise ootel"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Teie e-post ilmub peagi."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Muutm. puud. ikooni."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Kombineer. postkast"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Lugemata"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Tärniga tähistatud"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Laadimine ..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Puudutage seadistamiseks."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Te ei ole veel meilikontot seadistanud."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Otsi meili"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Otsi <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Otsingu „<xliff:g id="ID_1">%1$s</xliff:g>” tulemused"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Tulemuste ootamine"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Mõnede serverite vastust tuleb kaua oodata."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Kaustad"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Keela seadme kaamera kasutamine"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Nõua seadme parooli"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Piira hiljutiste paroolide taaskasutamist"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Paroolide aegumise nõue"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Nõua jõudeolekus seadme ekraanilukustust"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Piirab sünkroonitavate kalendrisündmuste arvu"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Piirab sünkroonitavate meilide arvu"</string>
- <string name="quick_1" msgid="3426057697353380951">"Aitäh!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Mulle sobib!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Loen seda hiljem ja võtan siis ühendust."</string>
- <string name="quick_4" msgid="3988974084396883051">"Lepime kokku kohtumise, et seda arutada."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Taustsünkroonimine on sellel kontol rändluse ajal keelatud."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Vastuse saatmine ..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Sõnumeid pole."</string>
-</resources>
diff --git a/email2/res/values-et/uploader.xml b/email2/res/values-et/uploader.xml
deleted file mode 100644
index f42e288a5..000000000
--- a/email2/res/values-et/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Instant Upload"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Instant Uploadi album"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Üleslaadimine"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Lõpetatud"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Peatatud"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d fotot • %3$d videot"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d fotot • %2$d videot"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"aku tühjeneb"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"fotode limiit on ületatud"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"rändlus"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"WiFi-ühenduse ootamine"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"laadimiseni edasi lükatud"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"ühenduse ootamine"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"uuesti proovimine: %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Näita ootel üleslaadimisi"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Näita lõpetatud üleslaadimisi"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Kuva onlainis"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Näita ootel üleslaadimisi"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Peida ootel üleslaadimised"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Kuva üksikasjad"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Peida üksikasjad"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Seaded"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Üles laaditud %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Konto"</string>
- <string name="upload" msgid="2615541458361216022">"Laadi üles"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Tühista"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Üleslaadimine teenusesse "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" – "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s „%2$s”"</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Üleslaadimise lähtestamine ebaõnnestus."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Fail pole saadaval."</string>
- <string name="account_error" msgid="1904775271866104941">"Kontoteabe vastuvõtmine ebaõnnestus."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Kontole sisselogimisel tekkis probleem."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Uuesti proovimise ootel"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"WiFi-ühenduse ootamine"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Üleslaadimine"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Ebaõnnestus"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Lõpetatud"</string>
- <string name="pause_state_running" msgid="711411177620353982">"üleslaadimine"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"käsitsi peatatud"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"peatatud — aku tühi"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"peatatud — laadimiseni edasi lükatud"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"peatatud — ühenduse ootamine"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"peatatud – PWA limiit on täis"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"peatatud — WiFi-ühenduse ootamine"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"peatatud — rändlus"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"uuesti proovimise ootel"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minut"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minutit"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minutit"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Andmesideühendus puudub"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Konto kettaruum on täis"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Faili ei leitud"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Teenuse viga"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Võrgu viga"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Autentimine ebaõnnestus"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Ootel üleslaadimised [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Lõpetatud üleslaadimised [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Peata üleslaadimised"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Jätka üleslaadimist"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Laadi kohe üles"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Laadi hiljem üles"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Ära laadi üles"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Kuva"</string>
- <string name="manager_retry" msgid="939534318469518843">"Proovi uuesti"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Üleslaadimine tühistatud"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Üleslaadimine on juba lõppenud"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sünkrooni kõik"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Viimane sünkroonimine:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Lõpetatud üksuste loend on tühi."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Instant Upload"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Üleslaadimised lõpetatud"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Üleslaadimine peatatud"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Instant Upload pole veel aktiveeritud"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Suuri faile saab üles laadida ainult WiFi kaudu."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Failide otsimine ..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"<xliff:g id="PHOTOCOUNT">%1$d</xliff:g> foto ja <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> video üleslaadimise ettevalmistamine ..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Täiendavaid fotosid/videoid pole vaja üles laadida."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Serveriga ühenduse loomisel ilmnes probleem. Proovige hiljem uuesti."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Käsk Sünkrooni kõik tühistatud"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sünkrooni kõik"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Kuva lõpetatud"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Kuva ootel"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Üldine"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Peata kõik üleslaadimised"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Toide"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Laadi üles ainult telefoni laadimisel."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"WiFi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Laadi üles ainult siis, kui WiFi on saadaval."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotod"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Konto"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Üleslaadimise tingimused"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Foto suurus"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videod"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Konto"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Videote üleslaadimiseks kasutatakse fotode kontot."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Üleslaadimise tingimused"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Nüüd kasutatakse fotode ühenduvusseadeid."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Ainult fotod mobiilsidevõrkude kaudu"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotod ja videod mobiilsidevõrkude kaudu"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Fotod ja videod ainult WiFi kaudu"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Teave"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Instant Uploadi versioon"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Soovitatav: 1600 pikslit (jagamiseks, printimiseks ja ekraanisäästjatele)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Originaalsuurus (aeglaseim üleslaadimine)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"peatatud – SD-kaart pole kättesaadav"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD-kaart pole kättesaadav"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Instant Uploadi seaded"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Instant Upload"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Laadi uued fotod ja videod automaatselt üles privaatsesse veebialbumisse"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Üleslaadimise olek"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Täpsemalt"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Mobiilside üleslaadimised"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Üleslaadimised rändlusel"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Laadi fotod ja videod üles andmesidevõrgus rändluse ajal"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Akuga üleslaadimised"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Laadi fotosid ja videoid üles ainult laadimise ajal"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Laadi olemasolevad fotod üles"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Laadi kõik olemasolevad fotod ja videod telefonist nüüd üles"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Keelatud"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Üleslaadimine (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d/%2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Peatatud: puudutage üleslaadimise jätkamiseks"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Laadi olemasolevad fotod üles"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Nende fotode ja videote üleslaadimine, mis pole veel telefonist privaatsesse veebialbumisse üles laaditud, võtab veidi aega, kuid seda tehakse taustal. Kas soovite kindlasti jätkata?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Jah"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Ei"</string>
-</resources>
diff --git a/email2/res/values-fa/strings.xml b/email2/res/values-fa/strings.xml
deleted file mode 100644
index f291c4b25..000000000
--- a/email2/res/values-fa/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"خواندن پیوستهای ایمیل"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"به برنامه اجازه می‌دهد پیوست‌های ایمیل شما را بخواند."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"دسترسی به داده‌های ارائه‌کننده ایمیل"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"به برنامه کاربردی اجازه می‌دهد به پایگاه داده ایمیل شما، شامل پیام‌های دریافتی، پیام‌های ارسالی، نام‌های کاربری و گذرواژه‌ها دسترسی داشته باشد."</string>
- <string name="app_name" msgid="5815426892327290362">"ایمیل"</string>
- <string name="compose_title" msgid="427986915662706899">"نگاشتن"</string>
- <string name="debug_title" msgid="5175710493691536719">"رفع خطا"</string>
- <string name="next_action" msgid="3931301986364184415">"بعدی"</string>
- <string name="okay_action" msgid="8365197396795675617">"تأیید"</string>
- <string name="cancel_action" msgid="6967435583794021865">"لغو"</string>
- <string name="previous_action" msgid="5181616311579820981">"قبلی"</string>
- <string name="send_action" msgid="1729766205562446418">"ارسال"</string>
- <string name="reply_action" msgid="4262472229221507619">"پاسخ"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"پاسخ به همه"</string>
- <string name="delete_action" msgid="8421026208288857155">"حذف"</string>
- <string name="forward_action" msgid="669174181042344116">"هدایت"</string>
- <string name="favorite_action" msgid="4664259801498253756">"ستاره"</string>
- <string name="done_action" msgid="7497990549515580249">"انجام شد"</string>
- <string name="create_action" msgid="3062715563215392251">"ایجاد مورد جدید"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"حذف"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"پاسخ سریعی وجود ندارد."</string>
- <string name="discard_action" msgid="6532206074859505968">"صرفنظر"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"ذخیره پیش نویس"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"درج پاسخ سریع"</string>
- <string name="read_action" msgid="4701484794504781686">"علامت گذاری بعنوان خوانده شده"</string>
- <string name="unread_action" msgid="6280399049357552826">"علامت گذاری بعنوان خوانده نشده"</string>
- <string name="set_star_action" msgid="4660317166196258160">"افزودن ستاره"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"حذف ستاره"</string>
- <string name="refresh_action" msgid="5951383001436708175">"تازه کردن"</string>
- <string name="add_account_action" msgid="8835736309476033727">"افزودن حساب"</string>
- <string name="compose_action" msgid="4045702519637388045">"نگاشتن"</string>
- <string name="search_action" msgid="6325101454876682308">"جستجو"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"تنظیمات حساب"</string>
- <string name="settings_action" msgid="6334807007967459412">"تنظیمات"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"گزینه‌های همگام‌سازی"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"علامت گذاری بعنوان خوانده نشده"</string>
- <string name="move_action" msgid="3059189775933985898">"انتقال"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ گیرنده کپی/گیرنده مخفی"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"افزودن گیرنده کپی/گیرنده کپی مخفی"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"پیوست کردن فایل"</string>
- <string name="close_action" msgid="533058985745238100">"بستن"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"ارسال تمام پیام ها"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"انتخاب پیوست"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"انتقال به"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"در حال بارگیری پیام ها..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"مشکل اتصال."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"نوشتار پیام بارگیری نشد. ممکن است پیام خیلی بزرگ باشد و نشان داده نشود."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"انتقال پیام"</item>
- <item quantity="other" msgid="371256717624461324">"انتقال پیام ها"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"انتقال در حساب‌های POP3 پشتیبانی نمی‌شود."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"انتقال امکان‌پذیر نیست. مورد انتخابی شامل چندین حساب است."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"پیام‌های موجود در پیش‌نویس‌ها، صندوق خروجی و موارد ارسالی قابل انتقال نمی‌باشند."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> خوانده نشده (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> خوانده نشده <xliff:g id="ACCOUNT">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> خوانده نشده <xliff:g id="ACCOUNT">%2$s</xliff:g>"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"در <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> حساب"</item>
- <item quantity="other" msgid="2723797835410343458">"در <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> حساب"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"به <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> پیام جدید"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"همه حساب‌ها"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> حساب"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> حساب"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"صندوق ورودی"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"صندوق خروجی"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"پیش نویس ها"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"سطل زباله"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"ارسال شد"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"ناخواسته"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"خوانده نشده"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"صندوق ورودی (خوانده نشده)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"صندوق ورودی (همه)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"نمای ترکیبی (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> حساب"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> حساب"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"نسخه: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"صندوق ورودی"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"ستاره دار"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"پیش نویس ها"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"صندوق خروجی"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"نمای مرکب"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"نمایش تمام پوشه ها"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"حساب ها"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"پوشه های جدید (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"همه پوشه ها"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"پوشه های اخیر"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"موضوع"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"بدون موضوع"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"بارگیری پیام های بیشتر"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> انتخاب شد"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> انتخاب شد"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"پیامی موجود نیست"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"گیرنده"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"گیرنده کپی"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"گیرنده کپی مخفی"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"موضوع"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"از:"</string>
- <string name="to" msgid="4392614766835725698">"گیرنده"</string>
- <string name="cc" msgid="7017720927911078193">"گیرنده کپی"</string>
- <string name="bcc" msgid="3098643138241111579">"گیرنده کپی مخفی"</string>
- <string name="subject_hint" msgid="7253964583324677128">"موضوع"</string>
- <string name="body_hint" msgid="4279864165439577668">"نوشتن ایمیل"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- پیام اصلی --------"\n"موضوع: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"فرستنده: <xliff:g id="SENDER">%2$s</xliff:g>"\n"گیرنده: <xliff:g id="TO">%3$s</xliff:g>"\n"گیرنده کپی: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> نوشت:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"شامل نوشتار نقل قول شده"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"شامل متن"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"حداقل یک گیرنده اضافه کنید."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"برخی از آدرس های ایمیل نامعتبر هستند."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"فایل خیلی بزرگ است و پیوست نمی شود"</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"درج پاسخ سریع"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> و <xliff:g id="NUMBER">%2$d</xliff:g> دیگر"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"گیرنده:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"گیرنده کپی:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"گیرنده مخفی:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"تاریخ:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"از:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"موضوع:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"مشاهده"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"نصب"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"پخش"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"بارگیری"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"اطلاعات"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"ذخیره"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"ذخیره شد"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"توقف"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"پیوست به عنوان <xliff:g id="FILENAME">%s</xliff:g> ذخیره شد."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"پیوست ذخیره نشد."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"یک یا چند پیوست در پیام هدایت شده شما قبل از ارسال دانلود خواهد شد."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"پیام"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"دعوت کردن"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"پیوست <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"پیوست ها <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"نمایش تصاویر"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"همیشه نشان داده شود"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"همیشه عکس‌های این فرستنده نمایش داده شود"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"تصاویری از این فرستنده به طور خودکار نشان داده خواهد شد."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"مشاهده در تقویم"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"دعوت تقویم"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"می روید؟"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" بله"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" شاید"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" خیر"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"شما این دعوت را پذیرفته‌اید."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"شما پاسخ \"شاید\" به این دعوتنامه داده‌اید."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"شما این دعوتنامه را رد کردید."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"نمایش جزئیات"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"جزئیات پیام"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"اطلاعات پیوست"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"اتصال Wi-Fi مورد نیاز است"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"تنظیمات Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"تنظیمات برنامه"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"پیوست باز نمی شود."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"شما نمی‌توانید این فایل را ذخیره یا باز کنید زیرا این نوع پیوست ممکن است حاوی نرم‌افزار مخرب باشد."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"به دلیل خط‌مشی‌های امنیتی، این حساب را نمی‌توان ذخیره یا باز کرد."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"این پیوست برای دانلود از طریق شبکه تلفن همراه خیلی بزرگ است. می توانید دفعه دیگر که به یک شبکه Wi-Fi متصل می شوید، آنرا دانلود کنید."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"هیچ برنامه نصب شده‌ای برای باز کردن این پیوست وجود ندارد. یک برنامه مناسب از Android Market نصب کنید."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"این پیوست یک برنامه است. باید قبل از نصب آن، منبع‌های ناشناس را در تنظیمات &gt; برنامه‌ها بررسی کنید."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"نمی‌توان برنامه‎ها را به طور مستقیم از ایمیل نصب کرد. ابتدا این برنامه را ذخیره کنید و سپس آنرا با استفاده از برنامه \"دانلودها\" نصب کنید."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"نمی‌توان پیوست را دانلود کرد."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"هنگام رمزگشایی پیام، خطایی روی داد."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"مشاهده <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"این پیام حذف شود؟"</item>
- <item quantity="other" msgid="4437637377522896262">"این پیام‌ها حذف شوند؟"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"پیام حذف شد."</item>
- <item quantity="other" msgid="6574961322865652255">"پیام ها حذف شدند."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"پیام رد شد."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"پیام به عنوان پیش نویس ذخیره شد."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"نمایش پیوست امکان‌پذیر نیست."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"نمی‌توان پیوست \"<xliff:g id="FILENAME">%s</xliff:g>\" را بارگیری کرد."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"درحال بازکردن پیام..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> پیام به <xliff:g id="MAILBOX_NAME">%2$s</xliff:g> انتقال یافت"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> پیام به <xliff:g id="MAILBOX_NAME">%2$s</xliff:g> انتقال یافت"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"یک یا چند پیوست باز ارسال نشد."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"پیوست هدایت نشد"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"ورود به سیستم <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ناموفق بود."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"ورود به سیستم ممکن نیست"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> بایت"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> بایت"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> کیلوبایت"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> کیلوبایت"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> مگابایت"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> مگابایت"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> گیگابایت"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> گیگابایت"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"جدیدتر"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"قدیمی تر"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" -- "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"تنظیم حساب"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"حساب ایمیل"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"شما می‌توانید حساب خود را فقط در چند مرحله تنظیم کنید."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"آدرس ایمیل"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"رمز ورود"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"ارسال ایمیل از این حساب به صورت پیش‌فرض"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"تنظیم دستی"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"یک آدرس ایمیل و گذرواژه معتبر تایپ کنید."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"حساب تکراری"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"شما در حال حاضر از این نام کاربری برای حساب \"<xliff:g id="DUPLICATE">%s</xliff:g>\" استفاده می‌کنید."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"این رمز ورود دارای یک یا چند نویسه فاصله در ابتدا یا انتهای خود است. بسیاری از سرورها از رمز ورودهای دارای فاصله پشتیبانی نمی کنند."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"در حال بازیابی اطلاعات حساب..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"در حال بررسی تنظیمات سرور ورودی..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"در حال بررسی تنظیمات سرور خروجی..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"تنظیم حساب"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"حساب شما تنظیم شد و ایمیل در راه است!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"نامی به این حساب اختصاص دهید (اختیاری)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"نام شما (در پیام های خروجی نمایش داده می شود)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"این قسمت نمی‌تواند خالی باشد."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"تنظیم حساب"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"نوع حساب"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"این چه نوع حسابی است؟"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"تنظیم حساب"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"تنظیمات سرور ورودی"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"نام کاربری"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"رمز ورود"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"سرور"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"درگاه"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"نوع امنیت"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"هیچکدام"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (پذیرش همه گواهی‌ها)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (پذیرش همه گواهی‌ها)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"حذف ایمیل از سرور"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"هرگز"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"هنگامی که من از صندوق ورودی حذف می کنم"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"پیشوند مسیر IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"اختیاری"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"تنظیم حساب"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"تنظیمات سرور خروجی"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"سرور SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"درگاه"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"نوع امنیت"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"ورود به سیستم لازم است"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"نام کاربری"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"رمز ورود"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"تنظیم حساب"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"تنظیمات سرور"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"سرور"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"دامنه/نام کاربری"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"از اتصال امن (SSL) استفاده شود"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"پذیرش همه گواهی های SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"گواهی سرویس گیرنده"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"انتخاب"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"استفاده از گواهی مشتری"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"حذف"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"هیچکدام"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"شناسه تلفن همراه"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"تنظیمات حساب"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"گزینه های حساب"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"دفعات بررسی صندوق ورودی"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"هرگز"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"خودکار (پیام سرویس)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"هر 5 دقیقه"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"هر 10 دقیقه"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"هر 15 دقیقه"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"هر 30 دقیقه"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"هر ساعت"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"ارسال ایمیل از این حساب به صورت پیش‌فرض"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"ورود ایمیل به من اعلان شود"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"همگام سازی مخاطبین از این حساب"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"همگام‌سازی تقویم از این حساب"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"همگام‌سازی ایمیل از این حساب"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"دانلود خودکار پیوست ها هنگام اتصال به Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"پایان نیافت"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"روزهای همگام‌سازی"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"خودکار"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"یک روز"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"سه روز"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"یک هفته"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"دو هفته"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"یک ماه"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"همه"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"استفاده از پیش فرض حساب"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"نام کاربری یا گذرواژه شما اشتباه است."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"نام کاربری یا گذرواژه نادرست است."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"اتصال امن به سرور امکان‌پذیر نیست."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"اتصال امن به سرور امکان‌پذیر نیست."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"به گواهینامه کلاینت نیاز دارد. آیا می‌خواهید با گواهینامه کلاینت به سرور متصل شوید؟"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"گواهینامه نامعتبر است و یا غیرقابل دسترس است."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"سرور با یک خطا پاسخ داد. نام کاربری و گذرواژه خود را بررسی کرده و دوباره امتحان کنید."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"اتصال به سرور امکان‌پذیر نیست."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"اتصال به سرور امکان‌پذیر نیست."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS لازم است اما توسط سرور پشتیبانی نمی شود."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"روش‌های تأیید اعتبار توسط سرور پشتیبانی نمی‌شوند."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"به دلیل خطای امنیتی، اتصال به سرور باز نمی‌شود."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"اتصال به سرور برقرار نمی‌شود."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"آدرس سرور را اشتباه وارد کرده‌اید یا سرور به نسخه پروتکلی احتیاج دارد که ایمیل پشتیبانی نمی‌کند."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"شما اجازه همگام‌سازی با این سرور را ندارید. برای کسب اطلاعات بیشتر با سرپرست سرور خود تماس بگیرید."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"مدیریت امنیت راه دور"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"سرور <xliff:g id="SERVER">%s</xliff:g> از شما می خواهد که به آن اجازه دهید برخی از ویژگی های امنیتی دستگاه Android شما را از راه دور کنترل کند. آیا می خواهید تنظیم این حساب را به پایان برسانید؟"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"این سرور نیاز به ویژگی‌های امنیتی دارد که دستگاه Android شما پشتیبانی‌ نمی کند، از جمله:<xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"شما نمی‎توانید نام کاربری یک حساب را تغییر دهید. برای افزودن یک حساب با یک نام کاربری دیگر، \"افزودن حساب\" را لمس کنید."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"اخطار: غیرفعال کردن اختیار برنامه ایمیل برای سرپرستی دستگاه شما، همه حساب‌های ایمیلی که به آن احتیاج دارند، به همراه ایمیل، مخاطبین، رویدادهای تقویم و سایر داده‌های آنها را حذف می‌کند."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"به‌روزرسانی امنیتی"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> از شما می‌خواهد تنظیمات امنیتی خود را به‌روزرسانی کنید."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"به دلایل امنیتی، امکان همگام‌سازی حساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" وجود ندارد."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"تنظیمات امنیتی حساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" باید به‌روزرسانی شود."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"حساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" تنظیمات امنیتی خود را تغییر داده است؛ نیازی به انجام هیچ کاری از طرف کاربر نیست."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"به‌روزرسانی امنیتی لازم است"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"خط‌مشی‌های امنیتی تغییر کرده‌اند"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"از خط‌مشی‌های امنیتی تبعیت نمی‌شود"</string>
- <string name="account_security_title" msgid="3511543138560418587">"امنیت دستگاه"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"سرور <xliff:g id="SERVER">%s</xliff:g> از شما می خواهد که به آن اجازه دهید برخی از ویژگی های امنیتی دستگاه Android شما را از راه دور کنترل کند."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"ویرایش جزئیات"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" از شما می‌خواهد کد پین یا گذرواژه قفل صفحه را تغییر دهید."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"رمز ورود قفل صفحه در حال انقضا"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"کد پین یا رمز ورود قفل صفحه منقضی شده است."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"رمز ورود قفل صفحه منقضی شده است"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"رمز ورود قفل صفحه در حال انقضا"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"باید پین قفل صفحه یا گذرواژه خود را سریع تغییر دهید، در غیر اینصورت داده‌های <xliff:g id="ACCOUNT">%s</xliff:g> پاک خواهد شد . آیا می‌خواهید اکنون آن‌ را تغییر دهید؟"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"رمز ورود قفل صفحه منقضی شده است"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"داده‌های <xliff:g id="ACCOUNT">%s</xliff:g> درحال پاک شدن از دستگاه شما است. با تغییر دادن پین صفحه قفل یا گذرواژه خود می‌توانید آنها را بازگردانید. آیا می‌خواهید هم اکنون آن‌ را تغییر دهید؟"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"از تغییرات ذخیره نشده صرفنظر شود؟"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"ورود به سیستم ممکن نیست"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"نام کاربری یا گذرواژه <xliff:g id="ACCOUNT">%s</xliff:g> نادرست است. آیا می‌خواهید هم اکنون آنها را به‌روز کنید؟"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"حساب پیش فرض"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"ارسال ایمیل از این حساب به صورت پیش فرض"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"دانلود پیوست‌ها"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"دانلود خودکار پیوست‌ها به پیامهای اخیر از طریق Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"اعلان های ایمیل"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"تکرار همگام سازی، اعلان ها، موارد دیگر"</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"ارسال اعلان هنگام ورود ایمیل"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"دفعات بررسی صندوق دریافت"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"تنظیمات ورودی"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"نام کاربری، رمز ورود و سایر تنظیمات سرور ورودی"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"تنظیمات خروجی"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"نام کاربری، رمز ورود و سایر تنظیمات سرور خروجی"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"خط‌مشی‌های اعمال شده"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"هیچکدام"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"خط مشی‌های پشتیبانی نشده"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"هیچکدام"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"تلاش برای همگام‌سازی"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"برای همگام‌سازی این حساب اینجا را لمس کنید"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"نام حساب"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"نام شما"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"امضا"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"پاسخ‌های سریع"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"ویرایش متنی که غالباً هنگام نوشتن ایمیل درج می‌کنید"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"افزودن متن به پیام هایی که ارسال می کنید"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"تنظیمات اعلان"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"مصرف داده"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"خط‌مشی‌های امنیتی"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"ویرایش پاسخ سریع"</string>
- <string name="save_action" msgid="1988862706623227093">"ذخیره"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"همگام سازی مخاطبین"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"همگام سازی مخاطبین برای این حساب"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"همگام سازی تقویم"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"همگام‌‌سازی رویداد تقویم برای این حساب"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"همگام‌سازی ایمیل"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"همگام سازی ایمیل برای این حساب"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"لرزش"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"همچنین لرزش هنگام دریافت ایمیل"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"همیشه"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"فقط هنگام ساکت بودن"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"هرگز"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"لرزش"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"انتخاب آهنگ زنگ"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"تنظیمات سرور"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"حذف حساب"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"حساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" از ایمیل حذف می شود."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"حذف حساب"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"حذف حساب"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"گزینه‌های همگام‌سازی"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"گزینه‌های همگام‌سازی (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"تنظیمات همگام سازی"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"بررسی فرکانس"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"تعداد روز برای همگام‌سازی"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"حساب ایمیل"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"انتخاب یک حساب"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"انتخاب یک پوشه"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"حساب یافت نشد. ممکن است حذف شده باشد."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"پوشه یافت نشد. ممکن است حذف شده باشد."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"فقط برخی از حساب‌های \"Plus\" از جمله دسترسی POP به این برنامه اجازه می‌دهند متصل شود. اگر نمی‌توانید با گذرواژه و آدرس ایمیل درست خود به سیستم وارد شوید، ممکن است فاقد یک حساب \"Plus\" غیر رایگان باشید. لطفاً مرورگر وب را برای دسترسی به این حساب‌های ایمیل راه‌اندازی کنید."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"قبل از تنظیم این حساب ایمیل، از وبسایت T-Online بازدید کرده و یک گذرواژه برای دسترسی ایمیل POP3 ایجاد کنید."</string>
- <string name="exchange_name" msgid="1190783774800310346">"شرکت"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"حساب ایجاد نشد. دوباره امتحان کنید."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"ایمیل"</string>
- <string name="device_admin_description" msgid="426727923791430306">"خط مشی های امنیتی تعیین شده توسط سرور را فعال می کند"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"در حال جستجو <xliff:g id="DOMAIN">%s</xliff:g>..."</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> نتیجه از <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> نتیجه از <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"تنظیمات"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"تنظیمات کلی"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"برنامه کاربردی"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"پیشرفته خودکار"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"انتخاب کنید بعد از حذف یک پیام، چه صفحه‌ای نشان داده شود"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"پنهان کردن کادرهای تأیید"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"در لیست پیام‌ها، برای انتخاب کردن، لمس کرده و نگهدارید"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"تأیید قبل از حذف"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"پیام‌ها"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"تأیید قبل از ارسال"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"پیام‌ها"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"پیشروی به"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"پیام جدیدتر"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"پیام قدیمی تر"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"لیست پیام"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"اندازه متن پیام"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"نوشتار بسیار کوچک"</item>
- <item msgid="4415205108584620118">"نوشتار کوچک"</item>
- <item msgid="4550219696381691112">"نوشتار با اندازه معمولی"</item>
- <item msgid="6227813549949219991">"نوشتار بزرگ"</item>
- <item msgid="1197917420815786571">"نوشتار بسیار بزرگ"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"اندازه متن پیام"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"خیلی کوچک"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"کوچک"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"معمولی"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"بزرگ"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"بسیار بزرگ"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"پاسخ به همه"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"\"پاسخ به همه\" را پیش‌فرض پاسخ‌های پیام قرار دهید"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"درخواست نشان دادن تصاویر"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"تصاویر در پیام‌ها به صورت خودکار نشان داده نخواهد شد"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"نمایش تصاویر\" پاک شد."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> از <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"در انتظار همگام سازی"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"ایمیل شما به زودی ظاهر خواهد شد."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"برای تغییر، نماد را لمس کنید."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"صندوق ورودی ترکیبی"</string>
- <string name="widget_unread" msgid="4404711399009077833">"خوانده نشده"</string>
- <string name="widget_starred" msgid="8290352707134011791">"ستاره دار"</string>
- <string name="widget_loading" msgid="2340962056927255554">"در حال بارگیری..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"برای راه‌اندازی لمس کنید."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"شما هنوز حساب ایمیلی راه‌اندازی نکرده‌اید."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"جستجوی ایمیل"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"جستجوی <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"نتایج جستجو برای \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"در انتظار نتایج"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"در بعضی از سرورها ممکن است زمان طولانی شود."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"پوشه ها"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"استفاده از دوربین دستگاه مجاز نیست"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"گذرواژه دستگاه لازم است"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"استفاده مجدد از گذرواژه‌های اخیر محدود است"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"گذرواژه‌ها باید منقضی شوند"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"برای قفل کردن صفحه خود یک دستگاه آماده به کار لازم است"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"محدود کردن تعداد رویدادهای همگام‌سازی شده تقویم"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"محدود کردن تعداد ایمیل‌های همگام‌سازی شده"</string>
- <string name="quick_1" msgid="3426057697353380951">"متشکریم!"</string>
- <string name="quick_2" msgid="4188036352885736617">"به نظرم خوب است!"</string>
- <string name="quick_3" msgid="8061819976353395585">"بعداً این را میخوانم و به شما اطلاع میدهم."</string>
- <string name="quick_4" msgid="3988974084396883051">"بیایید یک جلسه تشکیل بدهیم و درباره آن گفتگو کنیم."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"هنگام رومینگ، همگام‌سازی پس‌زمینه برای این حساب غیرفعال است."</string>
- <string name="confirm_response" msgid="5747902757569543165">"در حال ارسال پاسخ…"</string>
- <string name="no_conversations" msgid="5559527390337162819">"پیامی موجود نیست."</string>
-</resources>
diff --git a/email2/res/values-fa/uploader.xml b/email2/res/values-fa/uploader.xml
deleted file mode 100644
index 2fdb77ec7..000000000
--- a/email2/res/values-fa/uploader.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Instant Upload"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"آلبوم Instant Upload"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"در حال آپلود"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"تمام شد"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"موقتاً متوقف شد"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d عکس • %3$d ویدیو"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d عکس ؟؟؟ %2$d ویدیو"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"باتری ضعیف است"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"از تعداد مجاز عکس‌ها بیشتر شد"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"رومینگ"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"در انتظار WiFi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"تأخیر تا زمان شارژ شدن"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"در انتظار برقراری اتصال"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for summary_subtitle_paused_retry_format (3851931944505090119) -->
- <skip />
- <string name="summary_menu_show_pending" msgid="658361192495996">"نمایش آپلودهای در حال تعلیق"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"نمایش آپلودهای تکمیل شده"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"مشاهده به صورت آنلاین"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"نمایش آپلودهای در حال تعلیق"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"پنهان کردن آپلودهای در حال تعلیق"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"نمایش جزئیات"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"پنهان کردن جزئیات"</string>
- <string name="menu_settings" msgid="5088116127086866634">"تنظیمات"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for format_date_uploaded (803752037646090928) -->
- <skip />
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"حساب"</string>
- <string name="upload" msgid="2615541458361216022">"آپلود"</string>
- <string name="ok" msgid="2516349681897895312">"تأیید"</string>
- <string name="cancel" msgid="1207103189404543868">"لغو"</string>
- <string name="uploading_to" msgid="3986362895940069510">"در حال آپلود در "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" برای "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"آماده‌سازی آپلود انجام نشد"</string>
- <string name="toast_file_error" msgid="1315722681020841350">"فایل موجود نیست."</string>
- <string name="account_error" msgid="1904775271866104941">"اطلاعات حساب بازیابی نشد."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"مشکلی در ورود شما به حساب وجود داشت."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"در انتظار سعی مجدد"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"در انتظار WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"در حال آپلود"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"انجام نشد"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"کامل شد"</string>
- <string name="pause_state_running" msgid="711411177620353982">"در حال آپلود"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"توقف موقت به صورت دستی"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"موقتاً متوقف شد - باتری ضعیف است"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"موقتاً متوقف شد - تأخیر تا زمان شارژ شدن"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"موقتاً متوقف شد - در انتظار برقراری اتصال"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"موقتاً متوقف شد - سهمیه PWA تمام شد"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"موقتاً متوقف شد - در انتظار wifi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"موقتاً متوقف شد - در حال رومینگ"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"در انتظار سعی مجدد"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 دقیقه"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 دقیقه"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 دقیقه"</string>
- <string name="retry_no_data" msgid="630347885498641534">"بدون اتصال داده"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"فضای دیسک حساب پر است"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"فایل یافت نشد"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"خطای سرویس"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"خطای شبکه"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"تأیید اعتبار انجام نشد"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"آپلودهای در حال تعلیق [%d]"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for manager_list_switcher_completed_format (4700366545949687846) -->
- <skip />
- <string name="manager_pause" msgid="7046645023617816964">"توقف موقت آپلودها"</string>
- <string name="manager_resume" msgid="1608630525599824933">"ازسرگیری آپلودها"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"اکنون آپلود شود"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"بعداً آپلود شود"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"آپلود نشود"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"مشاهده"</string>
- <string name="manager_retry" msgid="939534318469518843">"سعی مجدد"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"آپلود لغو شد"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"آپلود قبلاً تمام شده است"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"همگام‌سازی همه"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"آخرین همگام‌سازی:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"لیست موارد تمام شده خالی است."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Instant Upload"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"آپلودها تمام شد"</string>
- <string name="notify_paused" msgid="3999817913227671338">"آپلود موقتاً متوقف شد"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Instant Upload هنوز فعال نشده است"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"فایل‌های بزرگ فقط از طریق اتصال WiFi آپلود می‌شوند."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"درحال اسکن فایل‌ها..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"آماده‌سازی <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> عکس و <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> ویدیو برای آپلود..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"لازم نیست هیچ عکس/ویدیوی دیگری آپلود شود."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"هنگام ارتباط با سرور مشکلی پیش آمد. لطفاً بعداً دوباره امتحان کنید."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"همگام‌سازی همه لغو شد"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"همگام‌سازی همه"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"مشاهده موارد کامل شده"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"مشاهده موارد در حال تعلیق"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"عمومی"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"توقف موقت همه آپلودها"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"برق"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"فقط در هنگام شارژ تلفن آپلود شود."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"فقط هنگام در دسترس بودن Wi-Fi، آپلود انجام شود."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"عکس‌ها"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"حساب"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"شرایط آپلود"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"اندازه عکس"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"ویدیوها"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"حساب"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"از حساب عکس‌ها برای آپلودهای ویدیو استفاده می‌شود."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"شرایط آپلود"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"در حال حاضر از تنظیمات اتصال عکس‌ها استفاده می‌شود."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"فقط عکس‌ها از طریق شبکه‌های تلفن همراه"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"عکس‌ها و ویدیوها از طریق شبکه‌های تلفن همراه"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"آپلود عکس‌ها و ویدیوها فقط از طریق Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"درباره"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"نسخه Instant Upload"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"توصیه می‌شود: 1600 پیکسل (برای اشتراک‌گذاری، موارد چاپی و محافظ‌های صفحه)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"اندازه اولیه (کندترین آپلود)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"موقتاً متوقف شد - کارت SD موجود نیست"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"کارت SD موجود نیست"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"تنظیمات Instant Upload"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Instant Upload"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"آپلود عکس‌ها و ویدیوهای جدید به صورت خودکار در یک آلبوم وب خصوصی"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"وضعیت آپلود"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"پیشرفته"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"آپلودهای تلفن همراه"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"آپلودهای رومینگ"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"آپلود عکس‌ها و ویدیوها در هنگام رومینگ در شبکه داده انجام شود"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"آپلودهای باتری"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"آپلود عکس‌ها و ویدیوها فقط هنگام شارژ کردن"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"آپلود عکس‌های موجود"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"هرگونه عکس و ویدیوی موجود در تلفن خود را هم اکنون آپلود کنید"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"غیرفعال شد"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"درحال آپلود (%1$d%%)"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for preference_summary_uploading_format (6092575579212954671) -->
- <skip />
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"موقتاً متوقف شد: برای از سرگیری آپلود، لمس کنید"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"آپلود عکس‌های موجود"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"آپلود عکس‌ها و ویدیوهایی که هنوز از تلفن شما در یک آلبوم خصوصی روی وب آپلود نشده‌اند ممکن است کمی طول بکشد، اما در پس زمینه انجام خواهد شد. آیا مطمئن هستید که می‌خواهید ادامه دهید؟"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"بله"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"خیر"</string>
-</resources>
diff --git a/email2/res/values-fi/strings.xml b/email2/res/values-fi/strings.xml
deleted file mode 100644
index 9afe48f71..000000000
--- a/email2/res/values-fi/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Lue sähköpostiliitteitä"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Antaa sovelluksen lukea sähköpostiliitteitä."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Käytä sähköpostintarjoajan tietoja"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Antaa sovelluksen käyttää sähköpostitietokantaasi, mukaan lukien vastaanotetut viestit, lähetetyt viestit, käyttäjänimet ja salasanat."</string>
- <string name="app_name" msgid="5815426892327290362">"Sähköposti"</string>
- <string name="compose_title" msgid="427986915662706899">"Viestin kirjoitus"</string>
- <string name="debug_title" msgid="5175710493691536719">"Virheenjäljitys"</string>
- <string name="next_action" msgid="3931301986364184415">"Seuraava"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Peruuta"</string>
- <string name="previous_action" msgid="5181616311579820981">"Edellinen"</string>
- <string name="send_action" msgid="1729766205562446418">"Lähetä"</string>
- <string name="reply_action" msgid="4262472229221507619">"Vastaa"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Vastaa kaikille"</string>
- <string name="delete_action" msgid="8421026208288857155">"Poista"</string>
- <string name="forward_action" msgid="669174181042344116">"Seuraava"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Tähti"</string>
- <string name="done_action" msgid="7497990549515580249">"Valmis"</string>
- <string name="create_action" msgid="3062715563215392251">"Luo uusi"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Poista"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Ei pikavastauksia."</string>
- <string name="discard_action" msgid="6532206074859505968">"Hylkää"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Tallenna luonnos"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Lisää pikavastaus"</string>
- <string name="read_action" msgid="4701484794504781686">"Merkitse luetuksi"</string>
- <string name="unread_action" msgid="6280399049357552826">"Merkitse lukemattomaksi"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Lisää tähti"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Poista tähti"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Päivitä"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Lisää tili"</string>
- <string name="compose_action" msgid="4045702519637388045">"Viestin kirjoitus"</string>
- <string name="search_action" msgid="6325101454876682308">"Haku"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Tilin asetukset"</string>
- <string name="settings_action" msgid="6334807007967459412">"Asetukset"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Synkronointiasetukset"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Merkitse lukemattomaksi"</string>
- <string name="move_action" msgid="3059189775933985898">"Siirrä"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Kopio/piilok."</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Lisää kopio/piilok."</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Liitä tiedosto"</string>
- <string name="close_action" msgid="533058985745238100">"Sulje"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Lähetä kaikki viestit"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Valitse liite"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Siirrä kansioon"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Ladataan viestejä..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Yhteysongelma."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Viestin tekstiä ei voitu ladata. Viesti voi olla liian suuri näytettäväksi."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Siirrä viesti"</item>
- <item quantity="other" msgid="371256717624461324">"Siirrä viestit"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"POP3-tilit eivät tue siirtoa."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Ei voi siirtää. Valinta sisältää useita tilejä."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Luonnokset-, Lähtevät- ja Lähetetyt-kansioissa olevia viestejä ei voi siirtää."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> lukematon (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> lukematonta (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> lukematonta (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> tilissä"</item>
- <item quantity="other" msgid="2723797835410343458">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> tilissä"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"vastaanottaja: <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> uutta viestiä"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Kaikki tilit"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> tili"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> tiliä"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Postilaatikko"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Lähtevät"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Luonnokset"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Roskakori"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Lähetetyt"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Roskaposti"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Lukemattomat"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Saapuneet (lukemattomat)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Saapuneet (kaikki)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Yhdistetty näkymä (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> tili"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> tiliä"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versio: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Postilaatikko"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Tähdelliset"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Luonnokset"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Lähtevät"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Yhdistetty näkymä"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Näytä kaikki kansiot"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Tilit"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Viimeaikaiset kansiot (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Kaikki kansiot"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Viimeaikaiset kansiot"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Aihe"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Ei aihetta"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Lataa lisää viestejä"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> valittu"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> valittu"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Ei viestejä"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Vastaanottaja"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Kopio"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Piilokopio"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Aihe"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Lähettäjä:"</string>
- <string name="to" msgid="4392614766835725698">"Vastaanott."</string>
- <string name="cc" msgid="7017720927911078193">"Kopio"</string>
- <string name="bcc" msgid="3098643138241111579">"Piilokopio"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Aihe"</string>
- <string name="body_hint" msgid="4279864165439577668">"Kirjoita sähköposti"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Alkuperäinen viesti --------"\n"Aihe: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Lähettäjä: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Vastaanottaja: <xliff:g id="TO">%3$s</xliff:g>"\n"Kopio: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> kirjoitti:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Lisää lainattu teksti"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Liitä teksti mukaan"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Lisää vähintään yksi vastaanottaja."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Kaikki sähköpostiosoitteet eivät kelpaa."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Tiedosto on liian suuri liitettäväksi."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Lisää pikavastaus"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> ja <xliff:g id="NUMBER">%2$d</xliff:g> muuta"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Vastaanottaja:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Kopio:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Piilokopio:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Päiväys:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Lähettäjä:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Aihe:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Näytä"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Asenna"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Toista"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Lataa"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Tietoja"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Tallenna"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Tallennettu"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Lopeta"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Liite tallennettu nimellä <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Liitetied. tall. epäonnistui."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Vähintään yksi edelleen lähetettävän viestisi liitteistä ladataan ennen lähettämistä."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Viesti"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Kutsu"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Liite <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Liitteet <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Näytä kuvat"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Näytä aina"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Näytä aina tämän lähettäjän kuvat"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Kuvia tältä lähettäjältä näytetään automaattisesti."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Näytä Kalenterissa"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Kalenterikutsu"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Osallistutko?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Kyllä"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Ehkä"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Ei"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Olet hyväksynyt tämän kutsun."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Olet vastannut tähän kutsuun \"ehkä\"."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Olet hylännyt tämän kutsun."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Näytä tiedot"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Viestin tiedot"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Liitteen tiedot"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Wifi-yhteys vaaditaan"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Wifi-asetukset"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Sovellusasetukset"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Liitteen avaaminen epäonnistui."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Et voi tallentaa tai avata tätä tiedostoa, koska tällainen liitetiedosto voi sisältää haittaohjelmia."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Tätä liitettä ei voi tallentaa tai avata tilin turvallisuuskäytäntöjen vuoksi."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Tämä liite on liian suuri ladattavaksi mobiiliverkon kautta. Voit ladata sen muodostaessasi wifi-yhteyden seuraavan kerran."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Laitteeseen ei ole asennettu tämän liitetiedoston avaamiseen sopivaa sovellusta. Yritä ladata sopiva sovellus Android Marketista."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Tämä liite on sovellus. Valitse Tuntemattomat lähteet kohdassa Asetukset &gt; Sovellukset, ennen kuin voit asentaa sovelluksen."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Sovelluksia ei voi asentaa suoraan sähköpostista. Tallenna sovellus ensin ja asenna se sitten Lataukset-sovelluksen avulla."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Liitettä ei voitu ladata."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Virhe purettaessa viestiä."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Avoinna <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Poistetaanko tämä viesti?"</item>
- <item quantity="other" msgid="4437637377522896262">"Poistetaanko nämä viestit?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Viesti poistettiin."</item>
- <item quantity="other" msgid="6574961322865652255">"Viestit poistettu."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Viesti hylätty."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Viesti tallennettiin luonnokseksi."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Liitetiedostoa ei voi näyttää."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Liitettä <xliff:g id="FILENAME">%s</xliff:g> ei voitu ladata."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Avataan viestiä..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> viesti siirretty kansioon <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> viestiä siirretty kansioon <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Vähintään yhden liitteen edelleenlähettäminen epäonnistui."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Liitettä ei lähetetty edelleen"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Kirjautuminen tiliin <xliff:g id="ACCOUNT_NAME">%s</xliff:g> epäonnistui."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Kirjautuminen ei onnistu"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> t"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> t"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kt"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kt"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> Mt"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> Mt"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> Gt"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> Gt"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Uudemmat"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Vanhemmat"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Tilin asetukset"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Sähköpostitili"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Tilisi asetuksien määrittäminen käy helposti muutaman vaiheen kautta."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Sähköpostiosoite"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Salasana"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Lähetä sähköposti oletuksena tältä tililtä"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuaalinen määritys"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Anna kelvollinen sähköpostiosoite ja salasana."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Päällekkäiset tilit"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Käytät tätä käyttäjänimeä jo tilissä <xliff:g id="DUPLICATE">%s</xliff:g>."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Tämän salasanan alussa tai lopussa on välilyönti. Monet palvelimet eivät tue välilyöntejä sisältäviä salasanoja."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Noudetaan tilin tietoja…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Tarkistetaan saapuvan postin palvelimen asetuksia…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Tarkistetaan lähtevän postin palvelimen asetuksia…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Tilin asetukset"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Tili on määritetty ja sähköposteja noudetaan."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Anna tilille nimi (valinnainen)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Oma nimi (näytetään lähtevissä viesteissä)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Kenttä ei voi olla tyhjä."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Tilin asetukset"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Tilin tyyppi"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Millainen tili tämä on?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Tilin asetukset"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Saapuvan postin palvelimen asetukset"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Käyttäjänimi"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Salasana"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Palvelin"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Portti"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Suojaustyyppi"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ei mitään"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Hyväksy kaikki varmenteet)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (Hyväksy kaikki varmenteet)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Poista viestit palvelimelta"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Ei koskaan"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Kun poistan viestin postilaatikosta"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP-polun etuliite"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Valinnainen"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Tilin asetukset"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Lähtevän postin palvelimen asetukset"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-palvelin"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Portti"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Suojaustyyppi"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Vaadi kirjautuminen"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Käyttäjänimi"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Salasana"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Tilin asetukset"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Palvelinasetukset"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Palvelin"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Toimialue\\käyttäjänimi"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Käytä suojattua yhteyttä (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Hyväksy kaikki SSL-varmenteet"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Asiakassovelluksen varmenne"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Valitse"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Käytä asiakasvarmennetta"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Poista"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Ei mitään"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Mobiililaitteen tunnus"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Tilin asetukset"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Tiliasetukset"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Uusien viestien tarkistustiheys"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Ei koskaan"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automaattinen (Push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"5 minuutin välein"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"10 minuutin välein"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"15 minuutin välein"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"30 minuutin välein"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Tunnin välein"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Lähetä sähköposti oletuksena tältä tililtä"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Ilmoita saapuvasta sähköpostista"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synkronoi tämän tilin yhteystiedot"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synkronoi tämän tilin kalenteri"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synkronoi tämän tilin sähköpostit"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Lataa liitteet automaattisesti wifi-yhteyden ollessa käytössä."</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Ei onnistunut"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Synkronoitavien päivien määrä"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automaattinen"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Yksi päivä"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Kolme päivää"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Yksi viikko"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Kaksi viikkoa"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Yksi kuukausi"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Kaikki"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Käytä tilin oletusta"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Käyttäjänimi tai salasana on virheellinen."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Käyttäjänimi tai salasana on virheellinen."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Palvelimeen ei voi muodostaa suojattua yhteyttä."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Palvelimeen ei voi muodostaa suojattua yhteyttä."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Asiakasvarmenne vaaditaan. Haluatko yhdistää palvelimeen asiakasvarmenteen avulla?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Varmenne ei kelpaa tai ole käytettävissä."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Palvelin lähetti virheilmoituksen. Tarkista käyttäjänimesi ja salasanasi ja yritä uudelleen."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Palvelimeen ei voi muodostaa yhteyttä."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Palvelimeen ei voi muodostaa yhteyttä."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS vaaditaan, mutta palvelin ei tue sitä."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Palvelin ei tue todennustapoja."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Palvelimeen ei voi muodostaa yhteyttä suojausvirheen takia."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Ei voida avata yhteyttä palvelimeen."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Annoit virheellisen palvelimen osoitteen tai palvelin edellyttää protokollaversiota, jota sähköposti ei tue."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Sinulla ei ole lupaa synkronoida tämän palvelimen kanssa. Saat lisätietoja ottamalla yhteyttä palvelimesi järjestelmänvalvojaan."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Suojauksen etähallinta"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Palvelin <xliff:g id="SERVER">%s</xliff:g> vaatii, että sen sallitaan hallita joitakin Android-laitteen suojaustoiminnoista. Haluatko määrittää tämän tilin loppuun?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Tämä palvelin edellyttää turvaominaisuuksia, joita Android-laitteesi ei tue, kuten: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Et voi muuttaa tilin käyttäjänimeä. Voit lisätä tilin eri käyttäjänimellä koskettamalla kohtaa Lisää tili."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"VAROITUS: jos poistat sähköpostisovellukselta oikeuden hallinnoida laitettasi, myös kaikki sovellukseen liittyvät sähköpostitilit sekä niiden sähköpostit, yhteystiedot, kalenteritapahtumat ja muut tiedot poistetaan."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Tietoturvapäivitys"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> pyytää sinua päivittämään suojausasetuksesi."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Tiliä <xliff:g id="ACCOUNT">%s</xliff:g> ei voi synkronoida suojausvaatimusten vuoksi."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Tili \"<xliff:g id="ACCOUNT">%s</xliff:g>\" edellyttää, että suojausasetukset päivitetään."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Tili \"<xliff:g id="ACCOUNT">%s</xliff:g>\" muutti suojausasetuksiaan. Käyttäjältä ei vaadita toimia."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Suojauspäivitys tarvitaan"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Suojauskäytännöt muuttuneet"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Ei vastaa suojauskäytäntöjä"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Laitteen suojaus"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Palvelin <xliff:g id="SERVER">%s</xliff:g> vaatii, että sen sallitaan hallita joitakin Android-laitteen suojaustoiminnoista."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Muokkaa tietoja"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"<xliff:g id="ACCOUNT">%s</xliff:g> pyytää muuttamaan ruudunlukituksen PIN-koodin tai salasanan."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Ruudunlukituksen salasana vanhentuu pian"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Ruudunlukituksen PIN-koodi tai salasana on vanhentunut."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Ruudunlukituksen salasana vanhentunut"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Ruudunlukituksen salasana vanhentuu pian"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Ruudunlukituksen PIN-koodi tai salasana tulee vaihtaa pian, tai tilin <xliff:g id="ACCOUNT">%s</xliff:g> tiedot poistetaan. Haluatko vaihtaa koodin nyt?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Ruudunlukituksen salasana vanhentunut"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Tilin <xliff:g id="ACCOUNT">%s</xliff:g> tietoja poistetaan laitteeltasi. Voit palauttaa tilin vaihtamalla ruudunlukituksen PIN-koodin tai salasanan. Haluatko vaihtaa koodin nyt?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Hylätäänkö tallentamattomat muutokset?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Kirjautuminen ei onnistu."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Tilin <xliff:g id="ACCOUNT">%s</xliff:g> käyttäjänimi tai salasana on virheellinen. Haluatko päivittää ne nyt?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Oletustili"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Lähetä sähköposti oletuksena tältä tililtä"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Lataa liitetiedostoja"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Lataa viimeaikaisten viestien liitteet wifi-yhteyden kautta."</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Sähköposti-ilmoitukset"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Synkronoinnin tiheys, ilmoitukset jne."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Lähetä ilmoitus, kun sähköpostiviesti saapuu"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Uusien viestien tarkistustiheys"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Saapuvan postin asetukset"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Käyttäjänimi, salasana ja muut tulevat palvelimen asetukset"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Lähtevän postin asetukset"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Käyttäjänimi, salasana ja muut lähtevät palvelimen asetukset"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Käytännöt otettu käyttöön"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ei mitään"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Käytäntöjä ei tueta"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ei mitään"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Yritä synkronointia"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Synkronoi tili koskettamalla tätä"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Tilin nimi"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Oma nimi"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Allekirjoitus"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Pikavastaukset"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Muokkaa tekstiä, jota lisäät usein sähköpostiviesteihin"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Liitä lähettämiisi viesteihin teksti"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Ilmoitusasetukset"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Tiedonsiirto"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Suojauskäytännöt"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Muokkaa pikavastausta"</string>
- <string name="save_action" msgid="1988862706623227093">"Tallenna"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synkronoi yhteystiedot"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synkronoi tämän tilin yhteystiedot"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synkronoi kalenteri"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synkronoi tilin kalenteritapahtuma"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synkronoi sähköposti"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synkronoi tämän tilin sähköpostit"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Värinä"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Käytä värinää, kun sähköpostiviesti saapuu"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Aina"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Vain äänettömässä tilassa"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Ei koskaan"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Värinä"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Valitse soittoääni"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Palvelinasetukset"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Poista tili"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Tili \"<xliff:g id="ACCOUNT">%s</xliff:g>\" poistetaan sähköpostista."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Poista tili"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Poista tili"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Synkronointiasetukset"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Synkronointiasetukset (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Synkronointiasetukset"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Tarkista taajuus"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Synkronoitavien päivien määrä"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Sähköpostitili"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Valitse tili"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Valitse kansio"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Tiliä ei löytynyt. Se on ehkä poistettu."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Kansiota ei löytynyt. Se on ehkä poistettu."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Vain joihinkin Plus-tileihin sisältyy POP-käyttö, joka sallii tämän ohjelman muodostaa yhteyden. Jos et pysty kirjautumaan tiliisi sähköpostiosoitteellasi ja salasanallasi, sinulla ei ehkä ole maksullista Plus-tiliä. Pääset käyttämään näitä sähköpostitilejä käynnistämällä verkkoselaimen."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Käy ennen tämän sähköpostitilin luomista T-Onlinen sivustossa ja luo salasana sähköpostin POP3-käyttöä varten."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Yritys"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Tiliä ei voitu luoda. Yritä uudelleen."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Sähköposti"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Ottaa käyttöön palvelinten määrittämät suojauskäytännöt"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Etsitään <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> tulos osoitteella <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> tulosta osoitteella <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Asetukset"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Yleiset asetukset"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Sovellus"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automaattinen siirtyminen"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Valitse, mikä ruutu näytetään viestin poistamisen jälkeen"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Piilota valintaruudut"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Valitse viesti luettelosta koskettamalla pitkään."</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Vahvista ennen poistamista"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Viestit"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Vahvista ennen lähettämistä"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Viestit"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Siirry ruutuun"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Uudempi viesti"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Vanhempi viesti"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Viestiluettelo"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Viestin tekstin koko"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Hyvin pieni teksti"</item>
- <item msgid="4415205108584620118">"Pieni teksti"</item>
- <item msgid="4550219696381691112">"Normaalikokoinen teksti"</item>
- <item msgid="6227813549949219991">"Suuri teksti"</item>
- <item msgid="1197917420815786571">"Valtava teksti"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Viestin tekstin koko"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Hyvin pieni"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Pieni"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normaali"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Suuri"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Hyvin suuri"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Vastaa kaikille"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Aseta viesteihin vastaamisen oletusvalinnaksi Vastaa kaikille."</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Kysy lupa kuvien näyttämiseen"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Kuvien viestit eivät näy automaattisesti."</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Näytä kuvat poistettu."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Odotetaan synkronointia"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Sähköposti tulee näkyviin pian."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Muuta: kosketa kuvak."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Yhd. postilaatikko"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Lukemattomat"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Tähdelliset"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Ladataan…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Määritä tili koskettamalla."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Et ole vielä määrittänyt sähköpostitiliä."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Hae sähköpostista"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Hae kohteesta <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Hakutulokset kyselylle \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Odotetaan tuloksia"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Joidenkin palvelimien vastaus voi kestää kauan."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Kansiot"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Älä salli laitteen kameran käyttöä"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Vaadi laitteen salasana"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Rajoita viim. salasanojen uud.käyttöä"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Vaadi salasanojen vanhenemista"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Käyttämättömän laitteen lukittava ruutu"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Rajoita synkronoitavien kalenteritap. lukumäärää"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Rajoita synkronoitavien sähköpostien lukumäärää"</string>
- <string name="quick_1" msgid="3426057697353380951">"Kiitos!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Kuulostaa hyvältä!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Luen tämän myöhemmin ja palaan asiaan."</string>
- <string name="quick_4" msgid="3988974084396883051">"Järjestetään tapaaminen ja keskustellaan asiasta."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Tämän tilin taustasynkronointi on pois käytöstä roaming-tilassa."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Lähetetään vastaus..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Ei viestejä."</string>
-</resources>
diff --git a/email2/res/values-fi/uploader.xml b/email2/res/values-fi/uploader.xml
deleted file mode 100644
index 170571733..000000000
--- a/email2/res/values-fi/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Pikalataus"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Pikalatausalbumi"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Ladataan"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Valmiit"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Keskeytetty"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d kuvaa • %3$d videota"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d valokuvaa • %2$d videota"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"akku lähes tyhjä"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"kuvakiintiö ylitetty"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"odotetaan wifi-yhteyttä"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"lykätty lataukseen asti"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"odotetaan yhteyttä"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"uuteen yritykseen %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Näytä odottavat lataukset"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Näytä valmiit lataukset"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Näytä verkossa"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Näytä odottavat lataukset"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Piilota odottavat lataukset"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Näytä tiedot"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Piilota tiedot"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Asetukset"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Ladattu %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Tili"</string>
- <string name="upload" msgid="2615541458361216022">"Lataa"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Peruuta"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Ladataan kohteeseen "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" kohteelle "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Latauksen alustus epäonnistui."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Tiedosto ei käytettävissä."</string>
- <string name="account_error" msgid="1904775271866104941">"Tilitietojen hakeminen epäonnistui."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Ongelma tiliin kirjautumisessa."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Odotetaan uutta yritystä"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Odotetaan wifi-yhteyttä"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Ladataan"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Epäonnistui"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Valmis"</string>
- <string name="pause_state_running" msgid="711411177620353982">"ladataan"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"keskeytetty manuaalisesti"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"keskeytetty - akku lähes tyhjä"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"keskeytetty - lykätty lataukseen asti"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"keskeytetty - odotetaan yhteyttä"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"keskeytetty - PWA-kiintiö täynnä"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"keskeytetty - odotetaan wifi-yhteyttä"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"keskeytetty - roaming-tilassa"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"odotetaan uutta yritystä"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minuutti"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minuuttia"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minuuttia"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Ei tiedonsiirtoyhteyttä"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Tilin tilakiintiö on täynnä"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Tiedostoa ei löydy"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Palveluvirhe"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Verkkovirhe"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Todennus epäonnistui"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Odottavat lataukset [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Valmiit lataukset [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Keskeytä lataus"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Jatka latausta"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Lataa nyt"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Lataa myöhemmin"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Älä lataa"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Näytä"</string>
- <string name="manager_retry" msgid="939534318469518843">"Yritä uudelleen"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Lataus peruutettu"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Lataus on jo valmis"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Synkronoi kaikki"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Viimeisin synkronointi:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Valmiiden kohteiden luettelo on tyhjä."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Pikalataus"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Lataukset valmiit"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Lataus keskeytetty"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Pikalatausta ei ole vielä aktivoitu"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Suuret tiedostot ladataan vain wifi-yhteyden kautta."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Etsitään tiedostoja..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Valmistellaan <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> kuvaa ja <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> videota ladattaviksi..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Ei enää ladattavia kuvia tai videoita."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Ongelma palvelinyhteydessä. Yritä myöhemmin uudelleen."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Kaikkien synkronointi peruutettu"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Synkronoi kaikki"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Näytä valmiit"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Näytä odottavat"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Yleiset"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Keskeytä kaikki lataukset"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Virta"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Lataa vain, kun puhelin on kytketty laturiin."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wifi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Lataa vain, kun wifi-yhteys on käytettävissä."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Valokuvat"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Tili"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Latausehdot"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Kuvan koko"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videot"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Tili"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Valokuvatiliä käytetään videolatauksiin."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Latausehdot"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Käytetään valokuvien yhteysasetuksia."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Lataa vain kuvia mobiiliverkon kautta"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Lataa kuvia ja videoita mobiiliverkkojen kautta"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Lataa kuvia ja videoita vain wifi-yhteyden kautta"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Tietoja"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Pikalatausversio"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Suositus: 1 600 pikseliä (jakamiseen, tulostukseen ja näytönsäästäjiin)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Alkuperäinen koko (hitain lataus)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"keskeytetty - SD-kortti ei käytettävissä"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD-kortti ei käytettävissä"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Pikalatauksen asetukset"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Pikalataus"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Lataa uudet kuvat ja videot automaattisesti yksityiseen verkkoalbumiin"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Latauksen tila"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Lisäasetukset"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Lataus mobiiliyhteydellä"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Roaming-lataus"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Lataa kuvia ja videoita roaming-tilassa"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Lataus akkuvirralla"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Lataa kuvia ja videoita vain laturin ollessa kytkettynä"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Lataa nykyiset kuvat"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Lataa puhelimen kaikki nykyiset kuvat ja videot nyt"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Ei käytössä"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Ladataan (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d / %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Keskeytetty, jatka latausta koskettamalla"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Lataa nykyiset kuvat"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Uusien valokuvien ja videoiden lataaminen puhelimesta yksityiseen verkkoalbumiin voi kestää jonkin aikaa, mutta lataus suoritetaan taustalla. Haluatko jatkaa?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Kyllä"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Ei"</string>
-</resources>
diff --git a/email2/res/values-fr/strings.xml b/email2/res/values-fr/strings.xml
deleted file mode 100644
index d5ae8a1fd..000000000
--- a/email2/res/values-fr/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Lire les pièces jointes"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permet à l\'application de lire les pièces jointes aux e-mails."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Accéder aux données du fournisseur de messagerie"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permet à l\'application d\'accéder à la base de données de votre messagerie, y compris aux messages reçus et envoyés, aux noms d\'utilisateur et aux mots de passe."</string>
- <string name="app_name" msgid="5815426892327290362">"E-mail"</string>
- <string name="compose_title" msgid="427986915662706899">"Nouveau message"</string>
- <string name="debug_title" msgid="5175710493691536719">"Débogage"</string>
- <string name="next_action" msgid="3931301986364184415">"Suivant"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Annuler"</string>
- <string name="previous_action" msgid="5181616311579820981">"Précédente"</string>
- <string name="send_action" msgid="1729766205562446418">"Envoyer"</string>
- <string name="reply_action" msgid="4262472229221507619">"Répondre"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Répondre à tous"</string>
- <string name="delete_action" msgid="8421026208288857155">"Supprimer"</string>
- <string name="forward_action" msgid="669174181042344116">"Transférer"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Activer le suivi"</string>
- <string name="done_action" msgid="7497990549515580249">"OK"</string>
- <string name="create_action" msgid="3062715563215392251">"Créer"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Supprimer"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Aucune réponse rapide"</string>
- <string name="discard_action" msgid="6532206074859505968">"Supprimer"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Enregistrer"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Insérer la réponse rapide"</string>
- <string name="read_action" msgid="4701484794504781686">"Marquer comme lu"</string>
- <string name="unread_action" msgid="6280399049357552826">"Marquer comme non lu"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Activer le suivi"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Désactiver le suivi"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Actualiser"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Ajouter un compte"</string>
- <string name="compose_action" msgid="4045702519637388045">"Composer"</string>
- <string name="search_action" msgid="6325101454876682308">"Rechercher"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Paramètres du compte"</string>
- <string name="settings_action" msgid="6334807007967459412">"Paramètres"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Options de synchronisation"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Marquer comme non lu"</string>
- <string name="move_action" msgid="3059189775933985898">"Déplacer"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Cci"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Ajouter Cc/Cci"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Joindre un fichier"</string>
- <string name="close_action" msgid="533058985745238100">"Fermer"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Envoyer tous messages"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Choisir une pièce jointe"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Déplacer vers"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Chargement des messages..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Problème de connexion."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Impossible de charger le texte du message. Il est possible que ce dernier soit trop volumineux."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Déplacer le message"</item>
- <item quantity="other" msgid="371256717624461324">"Déplacer des messages"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Les messages ne peuvent pas être déplacés, car cette action n\'est pas compatible avec les comptes POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Impossible de déplacer le message, car la sélection comprend plusieurs comptes."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Impossible de déplacer les messages se trouvant dans les dossiers \"Brouillons\", \"Boîte d\'envoi\" et \"Messages envoyés\"."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> non lus (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> non lus (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> non lus (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"dans <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> comptes"</item>
- <item quantity="other" msgid="2723797835410343458">"dans <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> comptes"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"à <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> nouveaux messages"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Tous les comptes"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> compte"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> comptes"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Boîte de réception"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Boîte d\'envoi"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Brouillons"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Corbeille"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Éléments envoyés"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Spam"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Non lus"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Boîte de réception (non lus)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Boîte de réception (tous)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Vue combinée (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> compte"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> comptes"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Version : <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Boîte de réception"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Suivis"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Brouillons"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Boîte d\'envoi"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Vue combinée"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Afficher tous les dossiers"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Comptes"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Dossiers récents (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Tous les dossiers"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Dossiers récents"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Objet"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Aucun objet"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Charger plus de messages"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> sélectionné(s)"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> sélectionné(s)"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Aucun message"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"À"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Cci"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Objet"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"De :"</string>
- <string name="to" msgid="4392614766835725698">"À"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Cci"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Objet"</string>
- <string name="body_hint" msgid="4279864165439577668">"Composez un message"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Message original --------"\n"Objet : <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"De : <xliff:g id="SENDER">%2$s</xliff:g>"\n"À : <xliff:g id="TO">%3$s</xliff:g>"\n"Cc : <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> a écrit :"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Inclure le texte des messages précédents"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Inclure le texte"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Ajoutez au moins un destinataire."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Certaines adresses e-mail sont incorrectes."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Impossible de joindre le fichier, car il est trop volumineux."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Insérer une réponse rapide"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> et <xliff:g id="NUMBER">%2$d</xliff:g> autres"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"À :"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc :"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Cci :"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Date :"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"De :"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Objet :"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Afficher"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Installer"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Lecture"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Charger"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Infos"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Enregistrer"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Enregistré"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Arrêter"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"PJ enregistrée sous <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Impossible enreg. pièce jointe."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Une ou plusieurs pièces jointes au message que vous transférez vont être téléchargées avant l\'envoi."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Message"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Inviter"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Pièce jointe <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Pièces jointes <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Afficher les images"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Toujours afficher"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Toujours afficher les images de cet expéditeur"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Les images provenant de cet expéditeur seront automatiquement affichées."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Afficher dans l\'agenda"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Invitation de Google Agenda"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Allez-vous participer ?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Oui"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Peut-être"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Non"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Vous avez accepté cette invitation."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Vous avez répondu \"Peut-être\" à cette invitation."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Vous avez refusé cette invitation."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Afficher détails"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Détails du message"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Informations sur la pièce jointe"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Connexion Wi-Fi requise"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Paramètres Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Paramètres application"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Impossible d\'ouvrir la pièce jointe."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Vous ne pouvez pas enregistrer ni ouvrir ce fichier, car ce type de pièce jointe est susceptible de contenir des logiciels malveillants."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Impossible d\'enregistrer ou d\'ouvrir cette pièce jointe en raison des règles de sécurité de ce compte."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Cette pièce jointe est trop volumineuse pour être téléchargée via un réseau pour mobile. Vous pourrez la télécharger lors de votre prochaine connexion à un réseau Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Aucune application installée n\'est en mesure d\'ouvrir cette pièce jointe. Essayez de télécharger une application appropriée depuis l\'Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Cette pièce jointe est une application. Vous devez sélectionner \"Sources inconnues\" dans Paramètres &gt; Applications avant de pouvoir l\'installer."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Les applications ne peuvent pas être installées directement depuis un e-mail. Enregistrez tout d\'abord cette application, puis installez-la à l\'aide de l\'application Téléchargements."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Impossible de télécharger la pièce jointe."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Une erreur s\'est produite lors du décodage du message."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Affichage de <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Supprimer ce message ?"</item>
- <item quantity="other" msgid="4437637377522896262">"Supprimer ces messages ?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Message supprimé"</item>
- <item quantity="other" msgid="6574961322865652255">"Messages supprimés"</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Message supprimé."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Brouillon enregistré"</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Impossible d\'afficher la pièce jointe."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Impossible de charger la pièce jointe \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Ouverture du message…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> message déplacé vers <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> messages déplacés vers <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Impossible de transférer une ou plusieurs pièces jointes."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Pièce jointe non transférée"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Échec de la connexion au compte <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Impossible de se connecter"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> O"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> O"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> Ko"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> Ko"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> Mo"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> Mo"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> Go"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> Go"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Suivant"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Précédents"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Configurer un compte"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Compte de messagerie"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Vous pouvez configurer votre compte en quelques étapes seulement."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Adresse e-mail"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Mot de passe"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Par défaut, envoyer les e-mails avec ce compte"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configuration manuelle"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Saisissez une adresse e-mail et un mot de passe corrects."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dupliquer le compte"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Vous utilisez déjà ce nom d\'utilisateur pour le compte \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Ce mot de passe débute ou se termine par un ou plusieurs espaces. De nombreux serveurs n\'acceptent pas les mots de passe contenant des espaces."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Récupération des informations sur le compte…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Vérification des paramètres de serveur entrant…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Vérification des paramètres de serveur sortant…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Configuration du compte"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Votre compte est configuré et votre messagerie est activée !"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Nom du compte (facultatif)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Votre nom (affiché sur les messages sortants)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Ce champ est obligatoire."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Configuration du compte"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Type de compte"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"De quel type de compte s\'agit-il ?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Configuration du compte"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Paramètres du serveur entrant"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nom d\'utilisateur"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Mot de passe"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Serveur"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Type de sécurité"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Aucun"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (accepter tous les certificats)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (accepter tous les certificats)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Supprimer les e-mails du serveur"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Jamais"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Si messages suppr. de boîte de récep."</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Préfixe du chemin IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Facultatif"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Configuration du compte"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Paramètres du serveur sortant"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Serveur SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Type de sécurité"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Exiger une connexion"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nom d\'utilisateur"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Mot de passe"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Configuration du compte"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Paramètres du serveur"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Serveur"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domaine\\Nom d\'utilisateur"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Utiliser une connexion sécurisée (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Accepter tous les certificats SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certificat client"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Sélectionner"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Utiliser un certificat client"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Supprimer"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Aucun"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Numéro d\'appareil mobile :"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Paramètres du compte"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Options de compte"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Fréquence de consultation de la boîte de réception"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Jamais"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automatique (Push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Toutes les 5 minutes"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Toutes les 10 minutes"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Toutes les 15 minutes"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Toutes les 30 minutes"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Toutes les heures"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Par défaut, envoyer les e-mails avec ce compte"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"M\'avertir lors de la réception d\'un e-mail"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synchroniser les contacts de ce compte"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synchroniser l\'agenda de ce compte"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synchroniser les e-mails de ce compte"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Télécharger automatiquement les pièces jointes une fois connecté au Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Impossible de terminer"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Jours à synchroniser"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatique"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Un jour"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Trois jours"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Une semaine"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Deux semaines"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Un mois"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Tous"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Utiliser paramètres défaut"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nom d\'utilisateur ou mot de passe incorrect."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Le nom d\'utilisateur ou le mot de passe est incorrect."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Impossible d\'établir une connexion sécurisée avec le serveur."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Impossible d\'établir une connexion sécurisée avec le serveur."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Certificat client requis. Voulez-vous vous connecter au serveur avec un certificat client ?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Le certificat est invalide ou inaccessible."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Erreur du serveur. Veuillez vérifier votre nom d\'utilisateur et votre mot de passe, puis réessayer."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Impossible de se connecter au serveur."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Impossible de se connecter au serveur."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"Protocole TLS requis mais non pris en charge par le serveur."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Les méthodes d\'authentification ne sont pas compatibles avec le serveur."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Impossible d\'établir la connexion avec le serveur en raison d\'une erreur de sécurité."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Impossible d\'établir la connexion avec le serveur."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"L\'adresse de serveur saisie est incorrecte ou le serveur exige une version du protocole non compatible avec E-mail."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Vous n\'êtes pas autorisé à synchroniser votre compte avec ce serveur. Veuillez contacter l\'administrateur du serveur pour en savoir plus."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Administration de la sécurité à distance"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Vous devez autoriser le serveur <xliff:g id="SERVER">%s</xliff:g> à contrôler à distance certaines fonctionnalités de sécurité de votre mobile Android. Voulez-vous terminer la configuration de ce compte ?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Ce serveur nécessite des fonctionnalités de sécurité incompatibles avec votre appareil Android, dont : <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Vous ne pouvez pas modifier le nom d\'utilisateur d\'un compte. Pour ajouter un compte associé à un autre nom d\'utilisateur, appuyez sur \"Ajouter un compte\"."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"AVERTISSEMENT : Si vous désactivez la gestion de votre appareil par l\'application E-mail, tous les comptes de messagerie qui y sont associés seront supprimés, de même que leurs données (e-mails, contacts, événements d\'agenda, etc.)."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Mise à jour de sécurité"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> nécessite la mise à jour de vos paramètres de sécurité."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Impossible de synchroniser le compte <xliff:g id="ACCOUNT">%s</xliff:g> en raison des exigences de sécurité."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Les paramètres de sécurité du compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\" doivent être mis à jour."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Les paramètres de sécurité du compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ont été modifiés. Aucune action de votre part n\'est requise."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Mise à jour de sécurité requise"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Règles de sécurité modifiées"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Imposs. appliquer règles sécu"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Sécurité de l\'appareil"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Vous devez autoriser le serveur <xliff:g id="SERVER">%s</xliff:g> à contrôler à distance certaines fonctionnalités de sécurité de votre mobile Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Modifier les infos"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" exige que le code PIN ou mot de passe d\'écran de verrouillage soit modifié."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Expiration mot de passe de verrouillage"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Le code PIN ou le mot de passe de verrouillage de votre écran a expiré."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Mot de passe verrou. expiré"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Expiration mot de passe de verrouillage"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Vous allez bientôt devoir modifier le code PIN ou le mot de passe de verrouillage de l\'écran, faute de quoi les données de <xliff:g id="ACCOUNT">%s</xliff:g> vont être effacées. Voulez-vous le modifier maintenant ?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Le mot de passe de verrouillage de votre écran a expiré."</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Les données de <xliff:g id="ACCOUNT">%s</xliff:g> sont en cours d\'effacement de votre appareil. Vous pouvez les restaurer en modifiant le code PIN ou le mot de passe de verrouillage de l\'écran. Voulez-vous le modifier maintenant ?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Annuler les modifications non enregistrées ?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Impossible de se connecter."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Le nom d\'utilisateur ou le mot de passe de <xliff:g id="ACCOUNT">%s</xliff:g> est incorrect. Voulez-vous les mettre à jour maintenant ?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Compte par défaut"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Par défaut, envoyer les e-mails avec ce compte"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Télécharger les pièces jointes"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Téléch. auto des pièces jointes aux messages récents via Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Notifications"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Fréquence de synchronisation, notifications, etc."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Envoyer une notification en cas de nouvel e-mail"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Fréquence de consultation de la boîte de réception"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Paramètres de réception"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nom d\'utilisateur, mot de passe et autres param. serveur entrant"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Paramètres d\'envoi"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nom d\'utilisateur, mot de passe et autres param. serveur sortant"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Règles appliquées"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Aucun"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Règles non compatibles"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Aucun"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Synchroniser (tentative)"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Appuyer ici pour synchroniser ce compte"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Nom du compte"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Votre nom"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Signature"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Réponses rapides"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Modifier texte fréquemment inséré lors de la rédaction d\'e-mails"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Ajouter un texte aux messages envoyés"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Paramètres de notification"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Consommation des données"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Règles de sécurité"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Modifier une réponse rapide"</string>
- <string name="save_action" msgid="1988862706623227093">"Enregistrer"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synchroniser les contacts"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synchroniser les contacts pour ce compte"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synchroniser l\'agenda"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synchro événement agenda pour ce compte"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synchr. messagerie"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synchroniser les e-mails pour ce compte"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibreur"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibrer à la réception d\'un e-mail"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Toujours"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"En mode silencieux"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Jamais"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibreur"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Sélectionner une sonnerie"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Paramètres du serveur"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Supprimer le compte"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Le compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\" va être supprimé de votre messagerie."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Supprimer le compte"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Supprimer le compte"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Options de synchronisation"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Options de synchronisation (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Paramètres de synchronisation"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Fréquence de consultation"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Jours à synchroniser"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Compte"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Sélectionner compte"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Sélectionner dossier"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Le compte est introuvable. Il a peut-être été supprimé."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Le dossier est introuvable. Il a peut-être été supprimé."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Seuls certains comptes \"Plus\" disposent d\'un accès POP permettant à ce programme de se connecter. Si vous ne parvenez pas à vous connecter avec l\'adresse e-mail et le mot de passe corrects, vous ne possédez peut-être pas de compte payant \"Plus\". Pour accéder à ces comptes de messagerie, lancez le navigateur Web."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Avant de configurer ce compte de messagerie, consultez le site Web de T-Online et créez un mot de passe d\'accès à la messagerie POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Entreprise"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Impossible de créer le compte. Veuillez réessayer."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-mail"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Active les stratégies de sécurité spécifiées par le serveur."</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Recherche en cours dans <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> résultat de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> résultats de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Paramètres"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Paramètres généraux"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Application"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avancer automatiquement"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Sélectionner écran à afficher après la suppression d\'un message"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Masquer les cases à cocher"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Dans les listes de messages, maintenir enfoncé pour sélectionner"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirmer avant suppression"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Messages"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirmer avant envoi"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Messages"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Afficher"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Message suivant"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Message précédent"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Liste des messages"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Taille du texte des messages"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Très petits caractères"</item>
- <item msgid="4415205108584620118">"Petits caractères"</item>
- <item msgid="4550219696381691112">"Caractères de taille normale"</item>
- <item msgid="6227813549949219991">"Grands caractères"</item>
- <item msgid="1197917420815786571">"Très grands caractères"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Taille du texte des messages"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Très petite"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Petite"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normale"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Grande"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Très grande"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Répondre à tous"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Utiliser \"Répondre à tous\" par défaut pour répondre aux messages"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Demander avant d\'afficher les images"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Les images contenues dans les messages ne s\'afficheront pas automatiquement."</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Option \"Afficher les images\" désactivée."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> sur <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"En attente de synchronisation"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Votre e-mail va bientôt s\'afficher."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Appuyez pour changer."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Boîte réception combinée"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Non lus"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Suivis"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Chargement…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Appuyez pour configurer."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Vous n\'avez pas encore créé de compte de messagerie."</string>
- <string name="more_than_999" msgid="8704425397397918798">"&gt; 999"</string>
- <string name="search_hint" msgid="2200412192574686497">"Rechercher l\'e-mail"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Rechercher dans <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Résultats pour \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"En attente des résultats..."</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Cette opération peut prendre du temps avec certains serveurs."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Dossiers"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Interdire utilisation de l\'appareil photo"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Exiger un mot de passe pour l\'appareil"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Restreindre réutil. mots de passe récents"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Exiger l\'expiration des mots de passe"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Exiger verrouillage appareils inactifs"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Limiter nombre d\'événements d\'agenda synchronisés"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Limiter le nombre d\'e-mails synchronisés"</string>
- <string name="quick_1" msgid="3426057697353380951">"Merci !"</string>
- <string name="quick_2" msgid="4188036352885736617">"Cela me convient."</string>
- <string name="quick_3" msgid="8061819976353395585">"Je lirai cela plus tard, et je vous recontacterai."</string>
- <string name="quick_4" msgid="3988974084396883051">"Organisons une réunion pour en discuter."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"La synchronisation en arrière-plan pour ce compte est désactivée en itinérance."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Envoi de la réponse en cours..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Aucun message"</string>
-</resources>
diff --git a/email2/res/values-fr/uploader.xml b/email2/res/values-fr/uploader.xml
deleted file mode 100644
index f3e16a1fc..000000000
--- a/email2/res/values-fr/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Instant Upload"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Album Instant Upload"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Transfert..."</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Terminé"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Interrompu"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d photos • %3$d vidéos"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d photos et %2$d vidéos"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"batterie faible"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"quota photos dépassé"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"itinérance"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"en attente d\'une connexion Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"reporté jusqu\'à la mise en charge"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"en attente de connexion"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"nouvelle tentative dans %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Afficher les transferts en attente"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Afficher les transferts terminés"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Afficher en ligne"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Afficher les transferts en attente"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Masquer les transferts en attente"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Afficher les détails"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Masquer les détails"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Paramètres"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Transféré le %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Compte"</string>
- <string name="upload" msgid="2615541458361216022">"Transférer"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Annuler"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Transfert vers "<b>"%s"</b>"..."</string>
- <string name="uploading_for" msgid="1735961974624867111">" pour "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Échec de l\'initialisation du transfert."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Fichier non disponible."</string>
- <string name="account_error" msgid="1904775271866104941">"Échec de la récupération des informations du compte."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Un problème est survenu lors de la connexion à votre compte."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"En attente d\'une nouvelle tentative"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"En attente d\'une connexion Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Transfert..."</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Échec."</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Terminé"</string>
- <string name="pause_state_running" msgid="711411177620353982">"transfert..."</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"interrompu manuellement"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"interrompu : batterie faible"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"interrompu : reporté jusqu\'à la mise en charge"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"interrompu : en attente de connexion"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"interrompu : quota PWA dépassé"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"interrompu : en attente de connexion Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"interrompu : itinérance"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"en attente d\'une nouvelle tentative"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"Une minute"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"Deux minutes"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"cinq minutes"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Aucune connexion Internet"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Le compte a dépassé le quota d\'espace libre sur le disque."</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Fichier introuvable."</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Erreur du service."</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Erreur réseau."</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Échec de l\'authentification."</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Transferts en attente [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Transferts terminés [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Interrompre les transferts"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Reprendre les transferts"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Transférer"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Transférer ultérieurement"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Ne pas transférer"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Afficher"</string>
- <string name="manager_retry" msgid="939534318469518843">"Réessayer"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Transfert annulé."</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Transfert déjà terminé."</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Tout synchroniser"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Dernière synchronisation :"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"La liste des éléments terminés est vide"</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Instant Upload"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Transferts terminés"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Transferts interrompus"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Instant Upload n\'a pas encore été activé."</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Les fichiers volumineux ne seront transférés qu\'au moyen d\'une connexion Wi-Fi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Recherche de fichiers..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Préparation du transfert de <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> photos et de <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> vidéos..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Aucune autre photo ou vidéo à transférer."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Un problème est survenu lors de la communication avec le serveur. Veuillez réessayer ultérieurement."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Opération \"Tout synchroniser\" annulée."</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Tout synchroniser"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Afficher les transferts terminés"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Afficher les transferts en attente"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Paramètres généraux"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Interrompre tous les transferts"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"En charge"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Transférer uniquement lorsque le téléphone est en charge"</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Transférer uniquement lorsqu\'une connexion Wi-Fi est disponible"</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Photos"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Compte"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Conditions de transfert"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Taille de la photo"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Vidéos"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Compte"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Le compte de photos sera utilisé pour transférer des vidéos."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Conditions de transfert"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Les paramètres de connectivité des photos sont actuellement utilisés"</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Réseaux mobiles uniquement pour les photos"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Photos et vidéos via les réseaux mobiles"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Photos et vidéos via Wi-Fi uniquement"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"À propos de"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Version Instant Upload"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Recommandé : 1 600 pixels (pour le partage, l\'impression et les fonds d\'écran)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Taille d\'origine (transfert le plus lent)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"interrompu : carte SD non disponible"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Carte SD non disponible"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Param. Instant Upload"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Instant Upload"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Transférer automatiquement les nouvelles photos et vidéos vers un album Web privé"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"État du transfert"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Avancés"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Transferts via connexion mobile"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Transferts en itinérance"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Transférer les photos et les vidéos en itinérance"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Transferts en charge"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Transférer les photos et les vidéos uniquement lors de la mise en charge"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Transférer les photos existantes"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Transférer toutes les photos et les vidéos de votre téléphone"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Désactivé"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s : %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Transfert (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d sur %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Transfert interrompu : appuyez pour reprendre."</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Transférer les photos existantes"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Le transfert de photos et de vidéos n\'ayant pas déjà été transférées à partir de votre téléphone vers un album Web privé peut prendre un certain temps. Toutefois, cette opération se fera en arrière-plan. Voulez-vous vraiment continuer ?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Oui"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Non"</string>
-</resources>
diff --git a/email2/res/values-hi/strings.xml b/email2/res/values-hi/strings.xml
deleted file mode 100644
index 3abaf1ca3..000000000
--- a/email2/res/values-hi/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"ईमेल अनुलग्‍नक पढ़ें"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"एप्लिकेशन को आपके ईमेल अनुलग्नक पढ़ने देता है."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"ईमेल प्रदाता के डेटा तक पहुंचें"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"इस एप्‍लिकेशन को प्राप्‍त संदेशों, भेजे गए संदेशों, उपयोगकर्ता नाम और पासवर्ड सहित आपके ईमेल डेटाबेस में पहुंच देता है."</string>
- <string name="app_name" msgid="5815426892327290362">"ईमेल"</string>
- <string name="compose_title" msgid="427986915662706899">"लिखें"</string>
- <string name="debug_title" msgid="5175710493691536719">"डीबग करें"</string>
- <string name="next_action" msgid="3931301986364184415">"अगला"</string>
- <string name="okay_action" msgid="8365197396795675617">"ठीक"</string>
- <string name="cancel_action" msgid="6967435583794021865">"रद्द करें"</string>
- <string name="previous_action" msgid="5181616311579820981">"पिछला"</string>
- <string name="send_action" msgid="1729766205562446418">"भेजें"</string>
- <string name="reply_action" msgid="4262472229221507619">"जवाब दें"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"सभी को जवाब दें"</string>
- <string name="delete_action" msgid="8421026208288857155">"हटाएं"</string>
- <string name="forward_action" msgid="669174181042344116">"अग्रेषित करें"</string>
- <string name="favorite_action" msgid="4664259801498253756">"तारांकित करें"</string>
- <string name="done_action" msgid="7497990549515580249">"पूर्ण"</string>
- <string name="create_action" msgid="3062715563215392251">"नया बनाएं"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"हटाएं"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"कोई त्वरित प्रतिसाद नहीं."</string>
- <string name="discard_action" msgid="6532206074859505968">"छोड़ें"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"ड्राफ़्ट सहेजें"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"त्वरित प्रतिसाद शामिल करें"</string>
- <string name="read_action" msgid="4701484794504781686">"पढ़ी गई चिह्नित करें"</string>
- <string name="unread_action" msgid="6280399049357552826">"बिना पढ़ी के रूप में चिह्नित करें"</string>
- <string name="set_star_action" msgid="4660317166196258160">"तारा जोड़ें"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"तारा निकालें"</string>
- <string name="refresh_action" msgid="5951383001436708175">"रीफ़्रेश करें"</string>
- <string name="add_account_action" msgid="8835736309476033727">"खाता जोड़ें"</string>
- <string name="compose_action" msgid="4045702519637388045">"लिखें"</string>
- <string name="search_action" msgid="6325101454876682308">"खोज"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"खाता सेटिंग"</string>
- <string name="settings_action" msgid="6334807007967459412">"सेटिंग"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"समन्वयन विकल्‍प"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"बिना पढ़ी के रूप में चिह्नित करें"</string>
- <string name="move_action" msgid="3059189775933985898">"ले जाएं"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"Cc/Bcc जोड़ें"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Cc/Bcc जोड़ें"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"फ़ाइल अनुलग्‍न करें"</string>
- <string name="close_action" msgid="533058985745238100">"बंद करें"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"सभी संदेश भेजें"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"अनुलग्‍नक चुनें"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"ले जाएं"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"संदेश लोड हो रहे हैं..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"कनेक्शन समस्या."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"संदेश पाठ लोड नहीं किया जा सका. हो सकता है संदेश देखने के लिए बहुत बड़ा हो."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"संदेश स्‍थानांतरित करें"</item>
- <item quantity="other" msgid="371256717624461324">"संदेशों को स्‍थानांतरित करें"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"POP3 खातों पर स्थानांतरण समर्थित नहीं है."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"चयन में एकाधिक खाते होने के कारण स्‍थानांतरित नहीं हो सकता."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"ड्राफ़्ट, आउट-बॉक्‍स और भेजे गए के संदेशों को स्‍थानांतरित नहीं किया जा सकता."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> बिना पढ़े (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> बिना पढ़े (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> बिना पढ़े (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> खातों में"</item>
- <item quantity="other" msgid="2723797835410343458">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> खातों में"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"<xliff:g id="RECEIVER_NAME">%1$s</xliff:g> को"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> नए संदेश"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"सभी खाते"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> खाता"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> खाते"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"इनबॉक्स"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"आउट-बॉक्स"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"ड्राफ़्ट"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"ट्रैश"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"भेजा गया"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"जंक"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"अपठित"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"इनबॉक्स (अपठित)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"इनबॉक्स (सभी)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"संयुक्त दृश्‍य (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> खाता"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> खाते"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"संस्करण: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"इनबॉक्स"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"तारांकित"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"ड्राफ़्ट"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"आउट-बॉक्स"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"संयोजित दृश्‍य"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"सभी फ़ोल्‍डर दिखाएं"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"खाते"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"हाल ही के फ़ोल्‍डर (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"सभी फ़ोल्डर"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"हाल ही के फ़ोल्‍डर"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"विषय"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"कोई विषय नहीं"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"अधिक संदेश लोड करें"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> चयनित"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> चयनित"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"कोई संदेश नहीं"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"प्रति"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"विषय"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"प्रेषक:"</string>
- <string name="to" msgid="4392614766835725698">"प्रति"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Bcc"</string>
- <string name="subject_hint" msgid="7253964583324677128">"विषय"</string>
- <string name="body_hint" msgid="4279864165439577668">"ईमेल लिखें"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"--------मूल संदेश --------"\n"विषय: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"प्रेषक: <xliff:g id="SENDER">%2$s</xliff:g>"\n"प्रति: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> ने लिखा:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"उद्धरित पाठ शामिल करें"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"पाठ शामिल करें"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"कम से कम एक प्राप्तकर्ता जोड़ें."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"कुछ ईमेल पते अमान्‍य हैं."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"अनुलग्न करने के लिए फ़ाइल बहु‍त बड़ी है."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"त्वरित प्रतिसाद सम्मिलित करें"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> और <xliff:g id="NUMBER">%2$d</xliff:g> अन्य"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"प्रति:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"दिनांक:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"प्रेषक:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"विषय:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"देखें"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"इंस्टॉल करें"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"चलाएं"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"लोड करें"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"जानकारी"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"सहेजें"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"सहेजा गया"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"रोकें"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"अनुलग्‍नक को <xliff:g id="FILENAME">%s</xliff:g> के रूप में सहेजा गया है."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"अनुलग्‍नक सहेजा नहीं जा सका."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"आपके द्वारा अग्रेषित संदेश को भेजने से पहले उसके एक या अधिक अनुलग्‍नक डाउनलोड किए जाएंगे."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"संदेश"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"आमंत्रित करें"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"अनुलग्नक <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> अनुलग्नक"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"चित्र दिखाएं"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"हमेशा दिखाएं"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"इस प्रेषक के चित्र हमेशा दिखाएं:"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"इस प्रेषक के चित्रों को स्वचालित रूप से दिखाया जाएगा."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"कैलेंडर में देखें"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"कैलेंडर आमंत्रण"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"आप जा रहे हैं?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" हां"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" शायद"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" नहीं"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"आपने यह आमंत्रण स्वीकार कर लिया है."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"आपने इस आमंत्रण के लिए \"संभवतः\" प्रत्युत्तर दिया है."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"आपने यह आमंत्रण अस्वीकार कर दिया है."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"विवरण दिखाएं"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"संदेश विवरण"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"अनुलग्नक जानकारी"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Wi-Fi कनेक्शन आवश्यक है"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Wi-Fi सेटिंग"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"एप्‍लिकेशन सेटिंग"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"अनुलग्नक खोल नहीं सकता."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"इस प्रकार के अनुलग्‍नकों में दुर्भावनापूर्ण सॉफ़्टवेयर हो सकता है, इसलिए आप इस फ़ाइल को खोल या सहेज नहीं सकते."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"इस खाते की सुरक्षा नीतियों के कारण यह अनुलग्‍नक सहेजा या खोला नहीं जा सकता."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"किसी मोबाइल नेटवर्क पर डाउनलोड करने के लिए यह अनुलग्‍नक बहुत बड़ा है. अगली बार किसी Wi-Fi नेटवर्क से कनेक्‍ट होने पर आप इसे डाउनलोड कर सकते हैं."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"इंस्‍टॉल किया गया ऐसा कोई एप्‍लिकेशन नहीं है जो इस अनुलग्‍नक को खोल सके. Android Market से उपयुक्त एप्‍लिकेशन डाउनलोड करके देखें."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"यह अनुलग्‍नक एक एप्‍लिकेशन है. आपको इसे इंस्‍टॉल करने से पहले सेटिंग &gt; एप्‍लिकेशन में अज्ञात स्रोतों की जांच करनी होगी."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"एप्‍लिकेशन सीधे ईमेल से इंस्‍टॉल नहीं किए जा सकते. पहले यह एप्‍लिकेशन सहेजें और फिर डाउनलोड एप्‍लिकेशन का उपयोग करके उसे इंस्‍टॉल करें."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"अनुलग्‍नक डाउनलोड नहीं किया जा सका."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"संदेश डीकोड करते समय कोई त्रुटि आई थी."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"<xliff:g id="FILENAME">%s</xliff:g> देख रहा/रही है"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"इस संदेश को हटाएं?"</item>
- <item quantity="other" msgid="4437637377522896262">"इन संदेशों को हटाएं?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"संदेश हटाया गया."</item>
- <item quantity="other" msgid="6574961322865652255">"संदेश हटाए गए."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"संदेश छोड़ दिया गया."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"संदेश ड्राफ़्ट के रूप में सहेजा गया."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"अनुलग्‍नक प्रदर्शित नहीं हो सकता."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"अनुलग्नक \" <xliff:g id="FILENAME">%s</xliff:g>\" लोड नहीं किया जा सका."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"संदेश खोल रहा है…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> संदेश <xliff:g id="MAILBOX_NAME">%2$s</xliff:g> में ले जाया गया"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> संदेश <xliff:g id="MAILBOX_NAME">%2$s</xliff:g> में ले जाए गए"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"एक या अधिक अनुलग्‍नक अग्रेषित नहीं किए जा सके."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"अनुलग्‍नक अग्रेषित नहीं किया गया"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> में साइन इन करना विफल रहा."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"साइन इन नहीं हो सका"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"इससे नया"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"इससे पुराना"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"खाता सेटअप"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"ईमेल खाता"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"आप बस कुछ ही चरणों में अपना खाता सेट कर सकते हैं."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"ईमेल पता"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"पासवर्ड"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"डिफ़ॉल्‍ट रूप से, इस खाते से ईमेल भेजें"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"मैन्‍युअल सेटअप"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"कोई मान्‍य ईमेल पता और पासवर्ड लिखें."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"डुप्‍लिकेट खाता"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"आप पहले से ही \"<xliff:g id="DUPLICATE">%s</xliff:g>\" खाते के लिए इस उपयोगकर्ता नाम का उपयोग कर रहे हैं."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"यह पासवर्ड एक या अधिक स्पेस वर्णों के साथ प्रारंभ या समाप्त होता है. कई सर्वर स्पेस वाले पासवर्ड का समर्थन नहीं करते हैं."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"खाता जानकारी पुनर्प्राप्त कर रहा है…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"इनकमिंग सर्वर सेटिंग जांच रहा है…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"आउटगोइंग सर्वर सेटिंग जांच रहा है…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"खाता सेटअप"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"आपका खाता सेट हो गया है और शीघ्र ही ईमेल मिलने वाला है!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"इस खाते को कोई नाम दें (वैकल्पिक)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"आपका नाम (आउटगोइंग संदेशों में प्रदर्शित)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"यह फ़ील्ड रिक्त नहीं हो सकती."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"खाता सेटअप"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"खाता प्रकार"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"यह किस प्रकार का खाता है?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"खाता सेटअप"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"इनकमिंग सर्वर सेटिंग"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"उपयोगकर्ता नाम"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"पासवर्ड"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"सर्वर"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"पोर्ट"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"सुरक्षा प्रकार"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"कोई नहीं"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (सभी प्रमाणपत्र स्‍वीकार करें)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (सभी प्रमाणपत्र स्‍वीकार करें)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"ईमेल को सर्वर से हटाएं"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"कभी नहीं"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"जब मैं इनबॉक्‍स से हटाऊं"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP पथ का पहला भाग"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"वैकल्पिक"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"खाता सेटअप"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"आउटगोइंग सर्वर सेटिंग"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP सर्वर"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"पोर्ट"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"सुरक्षा प्रकार"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"साइन इन आवश्यक"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"उपयोगकर्ता नाम"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"पासवर्ड"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"खाता सेटअप"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"सर्वर सेटिंग"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"सर्वर"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"डोमेन\\उपयोगकर्तानाम"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"सुरक्षित कनेक्शन (SSL) का उपयोग करें"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"सभी SSL प्रमाणपत्र स्‍वीकार करें"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"क्लाइंट प्रमाणपत्र"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"चयन करें"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"क्लाइंट प्रमाणपत्र का उपयोग करें"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"निकालें"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"कोई नहीं"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"मोबाइल उपकरण ID"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"खाता सेटिंग"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"खाता विकल्प"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"इनबॉक्‍स देखने की आवृति"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"कभी नहीं"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"स्‍वत: (पुश)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"प्रत्‍येक 5 मिनट"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"प्रत्‍येक 10 मिनट"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"प्रत्‍येक 15 मिनट"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"प्रत्‍येक 30 मिनट"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"प्रत्‍येक घंटा"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"डिफ़ॉल्‍ट रूप से, इस खाते से ईमेल भेजें"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"ईमेल आने पर मुझे सूचित करें"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"संपर्कों को इस खाते से समन्ववित करें"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"इस खाते से कैलेंडर समन्‍वयित करें"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"इस खाते से ईमेल समन्वयित करें"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Wi-Fi से कनेक्‍ट होने पर अनुलग्‍नकों को स्‍वचालित रूप से डाउनलोड करें"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"पूरा नहीं हो सका"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"समन्वयन के लिए दिन:"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"स्वचालित"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"एक दिन"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"तीन दिन"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"एक सप्‍ताह"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"दो सप्‍ताह"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"एक माह"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"सभी"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"खाते के डिफ़ॉल्ट का उपयोग करें"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"उपयोगकर्ता नाम या पासवर्ड गलत है."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"उपयोगकर्ता नाम या पासवर्ड गलत है."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"सर्वर से सुरक्षित रूप से कनेक्‍ट नहीं हो सकता."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"सर्वर से सुरक्षित रूप से कनेक्‍ट नहीं हो सकता."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"एक क्लाइंट प्रमाणपत्र की आवश्यकता है. क्या आप क्लाइंट प्रमाणपत्र के साथ सर्वर से कनेक्ट होना चाहते हैं?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"प्रमाणपत्र अमान्‍य है या उस पर पहुंचा नहीं जा सकता."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"सर्वर ने एक त्रुटि के साथ प्रतिसाद दिया. अपना उपयोगकर्ता नाम और पासवर्ड जांचें फिर पुन: प्रयास करें."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"सर्वर से कनेक्‍ट नहीं हो सकता."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"सर्वर से कनेक्‍ट नहीं कर सकता."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS आवश्‍यक है लेकिन सर्वर द्वारा समर्थित नहीं है."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"प्रमाणीकरण की विधियां सर्वर द्वारा समर्थित नहीं हैं."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"सुरक्षा त्रुटि के कारण सर्वर से कनेक्‍शन नहीं खोल सका."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"सर्वर से कनेक्शन खोला नहीं जा सका."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"आपने गलत सर्वर पता लिखा है या सर्वर को उस प्रोटोकॉल संस्‍करण की आवश्‍यकता है जिसका समर्थन ईमेल नहीं करता."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"आपको इस सर्वर के साथ समन्वयित करने की अनुमति नहीं है. अधिक जानकारी के लिए अपने सर्वर के व्यवस्थापक से संपर्क करें."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"दूरस्‍थ सुरक्षा व्यवस्थापन"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"सर्वर <xliff:g id="SERVER">%s</xliff:g> के लिए आवश्‍यक है कि आप अपने Android उपकरण की कुछ सुरक्षा सुविधाओं को दूरस्थ रूप से नियंत्रित करने दें. क्‍या आप यह खाता सेट करना पूर्ण करना चाहते हैं?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"इस सर्वर को ऐसी सुरक्षा सुविधाओं की आवश्यकता है जिनका समर्थन आपका Android उपकरण नहीं करता, जिनमें शामिल हैं: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"आप किसी खाते का उपयोगकर्ता नाम नहीं बदल सकते. किसी दूसरे उपयोगकर्ता नाम से खाता जोड़ने के लिए, खाता जोड़ें को स्‍पर्श करें."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"चेतावनी: आपके उपकरण को प्रबंधित करने के लिए ईमेल एप्‍लिकेशन का प्राधिकार निष्क्रिय कर देने से उसके लिए आवश्यक सभी ईमेल खाते, उनके ईमेल, संपर्क, कैलेंडर ईवेंट, और अन्‍य डेटा सहित, हटा दिए जाएंगे."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"सुरक्षा अपडेट"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"आपको <xliff:g id="ACCOUNT">%s</xliff:g> के लिए अपनी सुरक्षा सेटिंग अपडेट करने की आवश्यकता है."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"सुरक्षा आवश्‍यकताओं के कारण खाता \"<xliff:g id="ACCOUNT">%s</xliff:g>\" समन्‍वयित नहीं किया जा सकता."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"खाते \"<xliff:g id="ACCOUNT">%s</xliff:g>\" को सुरक्षा सेटिंग अपडेट की आवश्‍यकता है."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" खाते ने अपनी सुरक्षा सेटिंग बदल दी है; किसी उपयोगकर्ता कार्यवाही की आवश्‍यकता नहीं."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"सुरक्षा अपडेट आवश्यक"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"सुरक्षा नीतियां बदल दी गई हैं"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"सुरक्षा नीतियां पूरी नहीं हो सकतीं"</string>
- <string name="account_security_title" msgid="3511543138560418587">"उपकरण सुरक्षा"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"सर्वर <xliff:g id="SERVER">%s</xliff:g> के लिए यह आवश्‍यक है कि आप उसे अपने Android उपकरण की कुछ सुरक्षा सुविधाओं को दूरस्थ रूप से नियंत्रित करने दें."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"विवरण संपादित करें"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"आपको \"<xliff:g id="ACCOUNT">%s</xliff:g>\" के लिए अपना लॉक स्‍क्रीन पिन या पासवर्ड बदलने की आवश्यकता है."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"स्‍क्रीन लॉक करें पासवर्ड समाप्त होने वाला है"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"आपकी स्‍क्रीन लॉक करें पिन या पासवर्ड की समय-सीमा समाप्त हो गई है."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"स्‍क्रीन लॉक करें पासवर्ड की समय-सीमा समाप्त"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"स्‍क्रीन लॉक करें पासवर्ड समाप्त होने वाला है"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"आपको शीघ्र ही अपना लॉक स्क्रीन पिन या पासवर्ड को बदलना होगा, अन्यथा <xliff:g id="ACCOUNT">%s</xliff:g> का डेटा मिट जाएगा. क्या आप इसे अभी बदलना चाहते हैं?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"स्‍क्रीन लॉक करें पासवर्ड की समय-सीमा समाप्त हो गई है"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"<xliff:g id="ACCOUNT">%s</xliff:g> का डेटा आपके उपकरण से मिटाया जा रहा है. आप इसे अपने लॉक स्क्रीन पिन या पासवर्ड बदलकर पुनर्स्थापित कर सकते हैं. क्या आप इसे अभी बदलना चाहते हैं?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"न सहेजे गए परिवर्तनों को छोड़ें?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"साइन इन नहीं हो सका"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"<xliff:g id="ACCOUNT">%s</xliff:g> का उपयोगकर्ता नाम या पासवर्ड गलत है. क्या आप उन्हें अभी अपडेट करना चाहते हैं?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"डिफ़ॉल्‍ट खाता"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"डिफ़ॉल्‍ट रूप से, इस खाते से ईमेल भेजें"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"अनुलग्नकों को डाउनलोड करें"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"WiFi के माध्यम से हाल के संदेशों के अनुलग्नक स्वत: डाउनलोड करें"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"ईमेल सूचनाएं"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"आवृत्ति, सूचनाएं आदि सिंक करें."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"ईमेल आने पर सूचना भेजें"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"इनबॉक्‍स देखने की आवृत्ति"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"इनकमिंग सेटिंग"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"उपयोगकर्ता नाम, पासवर्ड, और अन्‍य इनकमिंग सर्वर सेटिंग"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"आउटगोइंग सेटिंग"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"उपयोगकर्ता नाम, पासवर्ड, और अन्‍य आउटगोइंग सर्वर सेटिंग"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"नीतियां लागू की गईं"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"कोई नहीं"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"असमर्थित नीतियां"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"कोई नहीं"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"समन्‍वयन का प्रयास करें"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"इस खाते को समन्वयित करने के लिए यहां स्पर्श करें"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"खाता नाम"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"आपका नाम"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"हस्ताक्षर"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"त्वरित प्रतिसाद"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"वह पाठ संपादित करें जिसे आप अक्सर ईमेल लिखते समय शामिल करते हैं"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"आपके भेजे जाने वाले संदेशों में पाठ संशोधित करें"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"सूचना सेटिंग"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"डेटा उपयोग"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"सुरक्षा नीतियां"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"त्वरित प्रतिसाद संपादित करें"</string>
- <string name="save_action" msgid="1988862706623227093">"सहेजें"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"संपर्कों को सिंक करें"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"इस खाते के लिए संपर्क सिंक करें"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"कैलेंडर सिंक करें"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"इस खाता हेतु कैलें. इवेंट समन्व. करें"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"ईमेल समन्‍वयित करें"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"इस खाते के लिए ईमेल सिंक करें"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"कंपन"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"जब ईमेल आए, तो कंपन भी करें"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"हमेशा"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"केवल मौन होने पर"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"कभी नहीं"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"कंपन"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"रिंगटोन चुनें"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"सर्वर सेटिंग"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"खाता निकालें"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"खाते \"<xliff:g id="ACCOUNT">%s</xliff:g>\" को ईमेल से निकाल दिया जाएगा."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"खाता निकालें"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"खाता निकालें"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"समन्वयन विकल्‍प"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"समन्वयन विकल्प (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"समन्वयन सेटिंग"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"आवृत्ति जांचें"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"समन्वयन के लिए दिन:"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"ईमेल खाता"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"कोई खाता चुनें"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"फ़ोल्डर का चयन करें"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"खाता नहीं मिला. संभवत: इसे निकाल दिया गया है."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"फ़ोल्डर नहीं मिला. संभवत: इसे निकाल दिया गया है."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"केवल कुछ \"प्लस\" खातों को POP पहुंच प्राप्त होती है जो इस प्रोग्राम को कनेक्‍ट करने देती है. यदि आप अपने सही ईमेल पते और पासवर्ड द्वारा साइन इन नहीं कर पा रहे हैं, तो हो सकता है कि आपके पास सशुल्‍क \"प्लस\" खाता न हो. इन ईमेल खातों में पहुंच प्राप्‍त करने के लिए वेब ब्राउज़र लॉन्च करें."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"यह ईमेल खाता सेट करने से पहले, T-Online वेबसाइट पर जाएं और POP3 ईमेल पहुंच के लिए पासवर्ड बनाएं."</string>
- <string name="exchange_name" msgid="1190783774800310346">"कार्पोरेट"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"खाता नहीं बनाया जा सका. पुन: प्रयास करें."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"ईमेल"</string>
- <string name="device_admin_description" msgid="426727923791430306">"सर्वर-विशिष्ट सुरक्षा नीतियों को सक्षम करता है"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"<xliff:g id="DOMAIN">%s</xliff:g> खोज रहा है..."</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">" <xliff:g id="DOMAIN">%2$s</xliff:g> से <xliff:g id="RESULTS">%1$d</xliff:g> परिणाम"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="DOMAIN">%2$s</xliff:g> से <xliff:g id="RESULTS">%1$d</xliff:g> परिणाम"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"सेटिंग"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"सामान्य सेटिंग"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"एप्लिकेशन"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"स्वत: आगे"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"संदेश हटाने के बाद दिखाई जाने वाली स्‍क्रीन चुनें"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"चेकबॉक्‍स छुपाएं"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"संदेशों की सूचियों में, चयन करने के लिए स्‍पर्श करके रखें"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"हटाने से पहले पुष्‍टि करें"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"संदेश"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"भेजने से पहले पुष्‍टि करें"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"संदेश"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"इससे आगे"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"नया संदेश"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"पुराना संदेश"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"संदेश सूची"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"संदेश पाठ का आकार"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"छोटा पाठ"</item>
- <item msgid="4415205108584620118">"छोटा पाठ"</item>
- <item msgid="4550219696381691112">"सामान्य आकार का पाठ"</item>
- <item msgid="6227813549949219991">"बड़ा पाठ"</item>
- <item msgid="1197917420815786571">"बड़ा पाठ"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"संदेश पाठ का आकार"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"बहुत छोटा"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"छोटा"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"सामान्य"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"बड़ा"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"बहुत बड़ा"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"सभी को प्रत्‍युत्तर दें"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"संदेशों के प्रत्‍युत्तर के लिए \"सभी को जवाब दें\" को डिफ़ॉल्ट बनाएं"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"चित्र दिखाने के लिए पूछें"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"संदेशों के चित्र स्वचालित रूप से नहीं दिखाए जाएंगे"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"चित्र दिखाएं\" साफ़ किया गया."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_2">%2$s</xliff:g> का <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"समन्वयन की प्रतीक्षा कर रहा है"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"आपका ईमेल जल्‍दी ही दिखाई देगा."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"बदलने हेतु आइकन स्‍पर्श करें."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"संयोजित इनबॉक्‍स"</string>
- <string name="widget_unread" msgid="4404711399009077833">"अपठित"</string>
- <string name="widget_starred" msgid="8290352707134011791">"तारांकित"</string>
- <string name="widget_loading" msgid="2340962056927255554">"लोड हो रहा है..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"सेट करने के लिए स्‍पर्श करें."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"आपने अभी तक ईमेल खाता सेट नहीं कि‍या है."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"ईमेल खोजें"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"<xliff:g id="ID_1">%1$s</xliff:g> में खोजें"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"\"<xliff:g id="ID_1">%1$s</xliff:g>\" के लिए खोज परिणाम"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"परिणामों की प्रतीक्षा कर रहा है"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"कुछ सर्वर को अधिक समय लग सकता है."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"फ़ोल्‍डर"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"उपकरण के कैमरे के उपयोग की अनुमति न दें"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"उपकरण पासवर्ड आवश्‍यक"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"हाल के पासवर्ड का पुन: उपयोग प्रतिबं. करें"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"पासवर्ड के लिए समय सीमा समाप्ति आवश्यक"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"स्क्रीन लॉक के लिए निष्क्रिय उपकरण चाहिए"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"समन्‍वयित कैलेंडर ईवेंट की संख्‍या सीमित करें"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"समन्‍वयित ईमेल की संख्‍या सीमित करें"</string>
- <string name="quick_1" msgid="3426057697353380951">"धन्यवाद!"</string>
- <string name="quick_2" msgid="4188036352885736617">"मुझे अच्छा लगता है!"</string>
- <string name="quick_3" msgid="8061819976353395585">"मैं इसे बाद में पढ़ूंगा/पढ़ूगी और आपसे संपर्क करूंगा/करूंगी."</string>
- <string name="quick_4" msgid="3988974084396883051">"आइए इस पर चर्चा करने के लिए कोई मीटिंग सेट करें."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"रोमिंग के दौरान इस खाते के लिए पृष्ठभूमि समन्‍वयन अक्षम है."</string>
- <string name="confirm_response" msgid="5747902757569543165">"प्रत्‍युत्तर भेज रहा है..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"कोई संदेश नहीं."</string>
-</resources>
diff --git a/email2/res/values-hi/uploader.xml b/email2/res/values-hi/uploader.xml
deleted file mode 100644
index ba69c8589..000000000
--- a/email2/res/values-hi/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"झटपट अपलोड"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"झटपट अपलोड एल्‍बम"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"अपलोड हो रहा है"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"पूर्ण"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"रोका गया"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d फ़ोटो • %3$d वीडियो"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d फ़ोटो • %2$d वीडियो"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"कम बैटरी"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"फ़ोटो कोटा पार हुआ"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"रोमिंग"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"WiFi की प्रतीक्षा कर रहा है"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"चार्ज होने तक विलंबित"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"कनेक्‍शन की प्रतीक्षा कर रहा है"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"%s में पुन: प्रयास कर रहा है"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"लंबित अपलोड दिखाएं"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"पूर्ण अपलोड दिखाएं"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"ऑनलाइन देखें"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"लंबित अपलोड दिखाएं"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"लंबित अपलोड छुपाएं"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"विवरण दिखाएं"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"विवरण छुपाएं"</string>
- <string name="menu_settings" msgid="5088116127086866634">"सेटिंग"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"अपलोड किया गया %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"खाता"</string>
- <string name="upload" msgid="2615541458361216022">"अपलोड करें"</string>
- <string name="ok" msgid="2516349681897895312">"ठीक"</string>
- <string name="cancel" msgid="1207103189404543868">"रद्द करें"</string>
- <string name="uploading_to" msgid="3986362895940069510"><b>"%s"</b>" पर अपलोड कर रहा है"</string>
- <string name="uploading_for" msgid="1735961974624867111">" "<b>"%s"</b>" के लिए"</string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"अपलोड प्रारंभ विफल."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"फ़ाइल उपलब्ध नहीं है."</string>
- <string name="account_error" msgid="1904775271866104941">"खाता जानकारी पुनर्प्राप्त करने में विफल."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"आपके खाते में साइन इन करने में समस्या थी."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"पुन: प्रयास की प्रतीक्षा कर रहा है"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"WiFi की प्रतीक्षा कर रहा है"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"अपलोड हो रही है"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"विफल"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"पूर्ण"</string>
- <string name="pause_state_running" msgid="711411177620353982">"अपलोड हो रहा है"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"मैन्युअल रूप से रोका गया"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"रोका गया - कम बैटरी"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"रोका गया - चार्ज होने तक विलंबित"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"रोका गया - कनेक्‍शन की प्रतीक्षा कर रहा है"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"रोका गया - PWA कोटा पार हो गया"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"रोका गया - wifi की प्रतीक्षा कर रहा है"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"रोका गया - रोमिंग"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"पुन: प्रयास की प्रतीक्षा कर रहा है"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 मिनट"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 मिनट"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 मिनट"</string>
- <string name="retry_no_data" msgid="630347885498641534">"कोई डेटा कनेक्शन नहीं"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"खाते में डिस्‍क कोटा नहीं है"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"फ़ाइल नहीं मिली"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"सेवा त्रुटि"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"नेटवर्क त्रुटि"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"प्रमाणीकरण विफल"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"लंबित अपलोड [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"पूर्ण किए गए अपलोड [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"अपलोड रोकें"</string>
- <string name="manager_resume" msgid="1608630525599824933">"अपलोड फिर से शुरू करें"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"अभी अपलोड करें"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"बाद में अपलोड करें"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"अपलोड न करें"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"देखें"</string>
- <string name="manager_retry" msgid="939534318469518843">"पुनः प्रयास करें"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"अपलोड रद्द"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"अपलोड पहले ही पूर्ण हो चुका है"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"सभी को समन्वयित करें"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"पिछला समन्वयन:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"पूर्ण आइटम सूची रिक्त है."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"झटपट अपलोड"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"अपलोड पूर्ण"</string>
- <string name="notify_paused" msgid="3999817913227671338">"अपलोड रोके गए"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"झटपट अपलोड अभी तक सक्रिय नहीं किया गया"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"बड़ी फ़ाइलें केवल WiFi कनेक्शन पर ही अपलोड की जाएंगी."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"फ़ाइलों के लिए स्कैन कर रहा है..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"अपलोड करने के लिए <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> फ़ोटो और <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> वीडियो तैयार किए जा रहे हैं..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"कोई अतिरिक्त फ़ोटो/वीडियो अपलोड करने की आवश्यकता नहीं है."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"सर्वर के साथ संचार करने में समस्या थी. कृपया बाद में पुनः प्रयास करें."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"सभी रद्द किए गए समन्वयित करें"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"सभी को समन्वयित करें"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"पूर्ण देखें"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"लंबित देखें"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"सामान्य"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"सभी अपलोड रोकें"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"पावर"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"केवल तभी अपलोड करें जब फ़ोन चार्ज किया जा रहा हो."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"केवल तभी अपलोड करें जब Wi-Fi उपलब्ध हो."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"फ़ोटो"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"खाता"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"अपलोड परिस्थितियां"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"फ़ोटो आकार"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"वीडियो"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"खाता"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"वीडियो अपलोड करने के लिए फ़ोटो खाता उपयोग किया जाएगा."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"अपलोड परिस्थितियां"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"अभी फ़ोटो कनेक्टिविटी सेटिंग का उपयोग किया जा रहा है."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"मोबाइल नेटवर्क द्वारा केवल फ़ोटो"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"मोबाइल नेटवर्क द्वारा फ़ोटो और वीडियो"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"केवल Wi-Fi द्वारा फ़ोटो और वीडियो"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"के बारे में"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"झटपट अपलोड संस्‍करण"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"अनुशंसित: 1600 पिक्सेल (साझा करने, प्रिंट करने और स्क्रीन सेवर के लिए)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"मूल आकार (सबसे धीमा अपलोड)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"रोका गया - SD कार्ड उपलब्‍ध नहीं है"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD कार्ड अनुपलब्ध"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"झटपट अपलोड सेटिंग"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"झटपट अपलोड"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"किसी निजी वेब एल्‍बम में स्‍वचालित रूप से नए फ़ोटो और वीडियो अपलोड करें"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"अपलोड स्थिति"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"उन्नत"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"मोबाइल अपलोड"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"रोमिंग अपलोड"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"डेटा नेटवर्क पर रोमिंग में होने पर फ़ोटो और वीडि‍यो अपलोड करें"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"बैटरी अपलोड"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"केवल चार्ज होते समय फ़ोटो और वीडियो अपलोड करें"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"मौजूदा फ़ोटो अपलोड करें"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"अब अपने फ़ोन से कोई भी मौजूदा फ़ोटो और वीडियो अपलोड करें"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"अक्षम"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"अपलोड हो रहा है (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %2$d में से %1$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"रोका गया: अपलोड करना फिर से शुरू करने के लिए स्‍पर्श करें"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"मौजूदा फ़ोटो अपलोड करें"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"जो फ़ोटो और वीडियो आपके फ़ोन से वेब पर किसी निजी एल्बम में पहले से ही अपलोड नहीं किए गए हैं उन्हें अपलोड करने में कुछ समय लग सकता है, लेकिन पृष्ठभूमि में काम पूरा हो जाएगा. क्या आप वाकई जारी रखना चाहते हैं?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"हां"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"नहीं"</string>
-</resources>
diff --git a/email2/res/values-hr/strings.xml b/email2/res/values-hr/strings.xml
deleted file mode 100644
index 15230b781..000000000
--- a/email2/res/values-hr/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Čitanje privitaka e-pošte"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Omogućuje aplikaciji da čita vaše privitke e-pošte."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Pristup podacima o davatelju usluge e-pošte"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Aplikaciji omogućuje pristup podatkovnoj bazi vaše e-pošte, uključujući primljene poruke, poslane poruke, korisnička imena i zaporke."</string>
- <string name="app_name" msgid="5815426892327290362">"E-pošta"</string>
- <string name="compose_title" msgid="427986915662706899">"Stvori novu poruku"</string>
- <string name="debug_title" msgid="5175710493691536719">"Otklanjanje pogrešaka"</string>
- <string name="next_action" msgid="3931301986364184415">"Dalje"</string>
- <string name="okay_action" msgid="8365197396795675617">"U redu"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Odustani"</string>
- <string name="previous_action" msgid="5181616311579820981">"Prethodno"</string>
- <string name="send_action" msgid="1729766205562446418">"Pošalji"</string>
- <string name="reply_action" msgid="4262472229221507619">"Odgovor"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Odgovori svima"</string>
- <string name="delete_action" msgid="8421026208288857155">"Izbriši"</string>
- <string name="forward_action" msgid="669174181042344116">"Proslijedi"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Označi zvjezdicom"</string>
- <string name="done_action" msgid="7497990549515580249">"Gotovo"</string>
- <string name="create_action" msgid="3062715563215392251">"Izradi novi"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Izbriši"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nema brzih odgovora."</string>
- <string name="discard_action" msgid="6532206074859505968">"Odbaci"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Spremanje skice"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Umetni brzi odgovor"</string>
- <string name="read_action" msgid="4701484794504781686">"Označi kao pročitano"</string>
- <string name="unread_action" msgid="6280399049357552826">"Označi kao nepročitano"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Dodaj zvjezdicu"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Ukloni zvjezdicu"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Osvježi"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Dodavanje računa"</string>
- <string name="compose_action" msgid="4045702519637388045">"Stvori novu poruku"</string>
- <string name="search_action" msgid="6325101454876682308">"Pretraži"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Postavke računa"</string>
- <string name="settings_action" msgid="6334807007967459412">"Postavke"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Opcije sinkronizacije"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Označi kao nepročitano"</string>
- <string name="move_action" msgid="3059189775933985898">"Premjesti"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Kop/skr.kop."</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Dodaj kopiju/skrivenu kopiju"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Priloži datoteku"</string>
- <string name="close_action" msgid="533058985745238100">"Zatvori"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Pošalji sve poruke"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Odaberite privitak"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Premjesti u/na"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Učitavanje poruka…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Problem s vezom."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Tekst poruke nije se mogao učitati. Poruka je možda prevelika za prikazivanje."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Premjesti poruku"</item>
- <item quantity="other" msgid="371256717624461324">"Premjesti poruke"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Premještanje nije podržano na računima POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Premještanje nije moguće jer odabir sadrži više računa."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Poruke u mapama Nacrti, Izlazni spremnik i Poslano ne mogu se premjestiti."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> nepročitanih (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> nepročitanih (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> nepročitanih (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"u <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> računa"</item>
- <item quantity="other" msgid="2723797835410343458">"u <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> računa"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"za <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"Novih poruka: <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Svi računi"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> račun"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> računa"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Pristigla pošta"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Izlazna pošta"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Skice"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Otpad"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Poslano"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Smeće"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Nepročitano"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Pristigla pošta (nepročitano)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Pristigla pošta (sve)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Kombinirani prikaz (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> račun"</item>
- <item quantity="other" msgid="4145163147488719025">"Broj računa: <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Verzija: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Pristigla pošta"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Sa zvjezdicom"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Skice"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Izlazna pošta"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Kombinirani prikaz"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Prikaži sve mape"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Računi"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Nedavne mape (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Sve mape"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Nedavne mape"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Predmet"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Bez predmeta"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Učitaj više poruka"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"Odabrano: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="7901361399231876038">"Odabrano: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Nema poruka"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Prima:"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Kopija"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Skrivena kopija"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Predmet"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"S jezika:"</string>
- <string name="to" msgid="4392614766835725698">"Prima"</string>
- <string name="cc" msgid="7017720927911078193">"Kopija"</string>
- <string name="bcc" msgid="3098643138241111579">"Skr. kopija"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Predmet"</string>
- <string name="body_hint" msgid="4279864165439577668">"Stvori novu poruku e-pošte"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Izvorna poruka --------"\n"Predmet: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Šalje: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Prima: <xliff:g id="TO">%3$s</xliff:g>"\n"Kopija: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> je napisao:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Obuhvati citirani tekst"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Uključi tekst"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Dodajte barem jednog primatelja."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Neke adrese e-pošte nisu važeće."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Datoteka je prevelika za privitak."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Umetanje brzog odgovora"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> i <xliff:g id="NUMBER">%2$d</xliff:g> ostalih"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Prima:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Kopija:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Skrivena kopija:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Datum:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Šalje:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Predmet:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Prikaži"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Instaliraj"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Reproduciraj"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Učitaj"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Info"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Spremi"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Spremljeno"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Zaustavi"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Privitak spremljen kao <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Privitak nije moguće spremiti."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Jedan ili više privitaka u proslijeđenoj poruci preuzet će se prije slanja."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Poruka"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Pozovi"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Privitak <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Prilozi <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Prikaži slike"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Uvijek prikaži"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Uvijek prikaži slike ovog pošiljatelja"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Slike od ovog pošiljatelja automatski će se prikazati."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Prikaži u Kalendaru"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Kalendarska pozivnica"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Dolazite?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Da"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Možda"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Ne"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Prihvatili ste ovu pozivnicu."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Na ovu ste pozivnicu odgovorili: \"možda\"."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Odbili ste ovu pozivnicu."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Pokaži detalje"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Pojedinosti poruke"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Informacije o privitku"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Potreban je Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Wi-Fi postavke"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Postavke aplikacija"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Nije moguće otvoriti privitak."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Ne možete spremiti niti otvoriti tu datoteku jer ta vrsta privitka može sadržavati zlonamjerni softver."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Ovaj se privitak ne može spremiti niti otvoriti zbog pravila o sigurnosti ovog računa."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Ovaj je privitak prevelik za preuzimanje putem mobilne mreže. Možete ga preuzeti sljedeći put kad se spojite na Wi-Fi mrežu."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Nema instalirane aplikacije koja može otvoriti taj privitak. Pokušajte preuzeti odgovarajuću aplikaciju s Android Marketa."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Ovaj je privitak aplikacija. Morate uključiti potvrdni okvir stavke \"Nepoznati izvori\" na zaslonu Postavke &gt; Aplikacije da biste je mogli instalirati."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Aplikacija se ne može instalirati izravno iz e-pošte. Prvo spremite ovu aplikaciju, a zatim je instalirajte pomoću aplikacije Preuzimanja."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Preuzimanje privitka nije uspjelo."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Došlo je do pogreške prilikom dekodiranja poruke."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Prikaz <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Izbrisati tu poruku?"</item>
- <item quantity="other" msgid="4437637377522896262">"Izbrisati te poruke?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Poruka je izbrisana."</item>
- <item quantity="other" msgid="6574961322865652255">"Poruke su izbrisane."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Poruka je odbačena."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Poruka je spremljena kao skica."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Privitak nije moguće prikazati."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Učitavanje privitka \"<xliff:g id="FILENAME">%s</xliff:g>\" nije uspjelo."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Otvaranje poruke…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> poruka premještena u <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> poruka premješteno u <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Jedan ili više privitaka nije bilo moguće proslijediti."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Privitak nije proslijeđen"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Prijava računa <xliff:g id="ACCOUNT_NAME">%s</xliff:g> neuspješna."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Neuspjela prijava"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Novije"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Starije"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Postavljanje računa"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Račun e-pošte"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Možete postaviti svoj korisnički račun u samo nekoliko koraka."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Adresa e-pošte"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Zaporka"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Šalji e-poštu s ovog računa prema zadanim postavkama"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ručno postavljanje"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Upišite važeću adresu e-pošte i zaporku."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dvostruki račun"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"To korisničko ime već upotrebljavate za račun \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Ova zaporka počinje ili završava jednim ili više znakova razmaka. Mnogi poslužitelji ne podržavaju zaporke s razmacima."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Učitavanje podataka o računu..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Provjeravanje postavki dolaznog poslužitelja..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Provjeravanje postavki izlaznog poslužitelja..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Postavljanje računa"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Vaš je račun postavljen, a e-pošta stiže!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Dodijelite ovom računu naziv (opcionalno)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Vaše ime (prikazano u izlaznim porukama)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Ovo polje ne može biti prazno."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Postavljanje računa"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Vrsta računa"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Koja je ovo vrsta računa?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Postavljanje računa"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Postavke dolaznog poslužitelja"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Korisničko ime"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Zaporka"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Poslužitelj"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Vrsta sigurnosti"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ništa"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (prihvati sve certifikate)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (prihvati sve certifikate)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Izbriši e-poštu s poslužitelja"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Nikad"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Kad izbrišem iz Pristigle pošte"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Prefiks IMAP putanje"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Izborno"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Postavljanje računa"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Postavke odlaznog poslužitelja"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP poslužitelj"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Vrsta sigurnosti"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Potrebna je prijava"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Korisničko ime"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Zaporka"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Postavljanje računa"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Postavke poslužitelja"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"poslužitelj"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domena\\Korisničko ime"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Koristi sigurnu vezu (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Prihvati sve SSL certifikate"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certifikat klijenta"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Odaberi"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Upotrijebi certifikat klijenta"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Ukloni"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Ništa"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID mobilnog uređaja"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Postavke računa"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Mogućnosti računa"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Učestalost provjeravanja e-pošte"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nikad"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automatski (Push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Svakih 5 minuta"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Svakih 10 minuta"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Svakih 15 minuta"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Svakih 30 minuta"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Svaki sati"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Šalji e-poštu s ovog računa prema zadanim postavkama"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Obavijesti me kad stigne e-pošta"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sinkroniziraj kontakte s ovog računa."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sinkroniziraj kalendar s ovog računa"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sinkroniziraj e-poštu s ovog računa"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Automatski preuzmi privitke za vrijeme povezanosti s Wi-Fi mrežom"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Završavanje nije bilo moguće"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dani za sinkronizaciju"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatski"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Jedan dan"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tri dana"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Jedan tjedan"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Dva tjedna"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Jedan mjesec"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Sve"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Upotrijebi zadanu postavku računa"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Korisničko ime ili zaporka nisu ispravni."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Neispravno korisničko ime ili zaporka."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Sigurno povezivanje s poslužiteljem nije moguće."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Sigurno povezivanje s poslužiteljem nije moguće."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Potrebna je klijentska potvrda. Želite li se povezati s poslužiteljem s klijentskom potvrdom?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Potvrda je neispravna ili nedostupna."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Poslužitelj je odgovorio s pogreškom. Provjerite korisničko ime i zaporku i pokušajte ponovo."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Povezivanje s poslužiteljem nije moguće."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Povezivanje s poslužiteljem nije moguće."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS je obavezan, ali ga poslužitelj ne podržava."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Poslužitelj ne podržava načine autentifikacije."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Otvaranje veze s poslužiteljem nije bilo moguće zbog sigurnosne pogreške."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Nije bilo moguće otvoriti vezu s poslužiteljem."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Unijeli ste pogrešnu adresu poslužitelja ili poslužitelj traži verziju protokola koju E-pošta ne podržava."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Nemate dopuštenje za sinkronizaciju s ovim poslužiteljem. Za više informacija kontaktirajte administratora svog poslužitelja."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Sigurnosna administracija na daljinu"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Poslužitelj <xliff:g id="SERVER">%s</xliff:g> zahtijeva da mu omogućite daljinsko upravljanje nekim sigurnosnim značajkama svojeg Android uređaja. Želite li dovršiti postavljanje ovog računa?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Ovaj poslužitelj zahtijeva sigurnosne značajke koje vaš Android uređaj ne podržava, uključujući: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Ne možete promijeniti korisničko ime računa. Da biste dodali račun s nekim drugim korisničkim imenom, dodirnite \"Dodaj račun\"."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"UPOZORENJE: Deaktivacijom ovlasti aplikacije E-pošta za upravljanje uređajem izbrisat će se svi računi e-pošte koji traže tu ovlast, kao i e-pošta, kontakti, događaji kalendara i drugi podaci."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Sigurnosno ažuriranje"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Račun <xliff:g id="ACCOUNT">%s</xliff:g> zahtijeva da ažurirate svoje sigurnosne postavke."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Račun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" nije moguće sinkronizirati zbog sigurnosnih zahtjeva."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Račun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" zahtijeva ažuriranje sigurnosnih postavki."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Račun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" promijenio je sigurnosne postavke, korisnik ne mora poduzimati ništa."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Potrebno sigurnosno ažuriranje"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Promjena sigurnosnih pravila"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Nemoguće ispuniti sig. pravila"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Sigurnost uređaja"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Poslužitelj <xliff:g id="SERVER">%s</xliff:g> zahtijeva da mu omogućite daljinsko upravljanje nekim sigurnosnim značajkama vašeg Android uređaja."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Uredi pojedinosti"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" zahtijeva da promijenite PIN ili zaporku za zaključavanje zaslona."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Istječe zaporka za zaključavanje zaslona"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"PIN ili zaporka za zaključavanje zaslona istekli su."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Istekla zap. za zaklj. zasl."</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Istječe zaporka za zaključavanje zaslona"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Uskoro morate promijeniti svoj ​​PIN ili zaporku za zaključavanje zaslona ili će biti izbrisani podaci za račun <xliff:g id="ACCOUNT">%s</xliff:g>. Želite li to promijeniti sada?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Istekla zap. za zaklj. zasl."</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Podaci za račun <xliff:g id="ACCOUNT">%s</xliff:g> brišu se s vašeg uređaja. Možete ih vratiti promjenom PIN-a ili zaporke za zaključavanje. Želite li to promijeniti sada?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Odbaciti nespremljene promjene?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Neuspjela prijava"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Netočno je korisničko ime ili zaporka za račun <xliff:g id="ACCOUNT">%s</xliff:g>. Želite li to ažurirati sada?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Zadani račun"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Šalji e-poštu s ovog računa prema zadanim postavkama"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Preuzimanje privitaka"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Automatsko preuzimanje privitaka uz nedavne poruke WiFi mrežom"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Obavijesti e-pošte"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Učestalost sinkronizacije, obavijesti itd."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Pošalji obavijest kada stigne e-pošta"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Učestalost provjeravanja e-pošte"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Dolazne postavke"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Korisničko ime, zaporka i ostale postavke dolaznog poslužitelja"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Odlazne postavke"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Korisničko ime, zaporka i ostale postavke odlaznog poslužitelja"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Pravila provedena"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ništa"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nepodržana pravila"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ništa"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Pokušaj sinkronizaciju"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Dodirnite ovdje za sinkronizaciju tog računa"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Naziv računa"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Vaše ime"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Potpis"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Brzi odgovori"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Uredite tekst koji često umećete prilikom pisanja e-pošte"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Dodajte tekst porukama koje šaljete"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Postavke obavijesti"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Potrošnja podataka"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Sigurnosna pravila"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Uredi brzi odgovor"</string>
- <string name="save_action" msgid="1988862706623227093">"Spremi"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sinkroniziraj kontakte"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sink. kontakata za ovaj račun"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sinkroniziraj kalendar"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sink. kal. dog. za ovaj račun"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sink. e-pošte"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sink. e-pošte za ovaj račun"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibracija"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibracija i kad stigne e-pošta"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Uvijek"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Samo ako je bešumno"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Nikad"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibracija"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Odaberite melodiju zvona"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Postavke poslužitelja"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Ukloni račun"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Račun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" bit će uklonjen iz e-pošte."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Brisanje računa"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Brisanje računa"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Opcije sinkronizacije"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Opcije sinkronizacije (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Postavke sinkronizacije"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Provjerite frekvenciju"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Dani za sinkronizaciju"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"R. e-pošte"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Odaberite račun"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Odaberite mapu"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Račun nije pronađen. Možda je uklonjen."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Mapa nije pronađena. Možda je uklonjena."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Samo neki računi usluge \"Plus\" uključuju POP pristup koji ovom programu omogućuje povezivanje. Ako se ne možete prijaviti sa svojom ispravnom adresom e-pošte i zaporkom, možda nemate plaćeni račun usluge \"Plus\". Pokrenite web-preglednik kako biste dobili pristup tim računima e-pošte."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Prije postavljanja ovog računa e-pošte posjetite web-lokaciju T-Online i stvorite zaporku za POP3 pristup e-pošti."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Korporacijski"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Izrada računa nije uspjela. Pokušajte ponovo."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-pošta"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Omogućuje sigurnosna pravila određena poslužiteljem"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Pretraživanje <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> rezultata iz domene <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> rezultata sa <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Postavke"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Opće postavke"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Aplikacija"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatski prijeđi na sljedeće"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Odaberite zaslon za prikazivanje nakon brisanja poruke"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Sakrij potvrdne okvire"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Na popisima poruka dodirnite i držite da biste odabrali"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Potvrdite prije brisanja"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Poruke"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Potvrdite prije slanja"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Poruke"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Prijeđi na"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Novije poruke"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Starije poruke"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Popis poruka"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Veličina teksta poruke"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Sićušan tekst"</item>
- <item msgid="4415205108584620118">"Mali tekst"</item>
- <item msgid="4550219696381691112">"Tekst normalne veličine"</item>
- <item msgid="6227813549949219991">"Veliki tekst"</item>
- <item msgid="1197917420815786571">"Ogroman tekst"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Veličina teksta poruke"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Sitan"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Malen"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normalan"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Velik"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Ogroman"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Odgovori svima"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Neka \"Odgovori svima\" bude zadana postavka za odgovore na poruke"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Pitaj treba li prikazati slike"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Slike u porukama neće se ​​automatski prikazivati"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Prikaži slike\" izbrisano."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Čekanje na sinkronizaciju"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Vaša će se e-pošta uskoro pojaviti."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Dodir. za promjenu."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Komb. prist. pošta"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Nepročitano"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Označeno zvjezdicom"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Učitavanje…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Dodirnite za postavljanje."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Još niste postavili račun e-pošte."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Pretraži e-poštu"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Pretraži <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Rezultati pretraživanja za \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Čekaju se rezultati"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Nekim poslužiteljima može trebati više vremena."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mape"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Onemogući upotrebu fotoaparata uređaja"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Zahtijevaj zaporku uređaja"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Ograniči ponovnu upotrebu novijih zapor."</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Zahtijevaj istek zaporke"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Zahtijevaj zaključ. zaslona u mirovanju"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Ograniči broj sinkroniziranih događaja kalendara"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Ograniči broj sinkroniziranih poruka e-pošte"</string>
- <string name="quick_1" msgid="3426057697353380951">"Hvala!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Izvrsno!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Pročitat ću to kasnije i javiti vam se."</string>
- <string name="quick_4" msgid="3988974084396883051">"Hajdemo dogovoriti sastanak na kojem ćemo raspraviti o tome."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Pozadinska sinkronizacija za ovaj račun onemogućena je u roamingu."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Slanje odgovora..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Nema poruka."</string>
-</resources>
diff --git a/email2/res/values-hr/uploader.xml b/email2/res/values-hr/uploader.xml
deleted file mode 100644
index 124e7f12b..000000000
--- a/email2/res/values-hr/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Automatsko slanje"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Album za automatsko slanje"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Prijenos"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Završeno"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Pauzirano"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • Fotografija: %2$d • Videozapisa: %3$d"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"Fotografija: %1$d • videozapisa: %2$d"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"slaba baterija"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"premašena kvota fotografija"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"čeka se WiFi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"odgođeno do punjenja"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"čekanje na vezu"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"ponovni pokušaj za %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Prikaži prijenose na čekanju"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Prikaži završene prijenose"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Prikaži online"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Prikaži prijenose na čekanju"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Sakrij prijenose na čekanju"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Prikaži pojedinosti"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Sakrij pojedinosti"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Postavke"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Preneseno %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Račun"</string>
- <string name="upload" msgid="2615541458361216022">"Šalji"</string>
- <string name="ok" msgid="2516349681897895312">"U redu"</string>
- <string name="cancel" msgid="1207103189404543868">"Odustani"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Prijenos na "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" za "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Nije uspjelo pokretanje prijenosa."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Datoteka nije dostupna."</string>
- <string name="account_error" msgid="1904775271866104941">"Nije uspio dohvat podataka o računu."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Došlo je do problema s prijavom na vaš račun."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Čekanje na ponovni pokušaj"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Čeka se WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Prijenos"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Neuspješno"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Dovršeno"</string>
- <string name="pause_state_running" msgid="711411177620353982">"prijenos"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"pauzirano ručno"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"pauzirano - slaba baterija"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"pauzirano - odgođeno do punjenja"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"pauzirano - čekanje na vezu"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"pauzirano - premašena kvota PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"pauzirano - čeka se wifi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"pauzirano - roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"čeka se ponovni pokušaj"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minuta"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minute"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minuta"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Nema podatkovne veze"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Račun je ostao bez kvote na disku"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Datoteka nije pronađena"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Pogreška usluge"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Mrežna pogreška"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Provjera autentičnosti nije uspjela"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Slanja na čekanju [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Dovršeni prijenosi [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Pauziraj prijenose"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Nastavi prijenose"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Pošalji sada"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Pošalji kasnije"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Ne šalji"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Prikaži"</string>
- <string name="manager_retry" msgid="939534318469518843">"Pokušaj ponovo"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Prijenos otkazan"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Prijenos je već završen"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sinkroniziraj sve"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Zadnja sinkronizacija:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Popis završenih stavki je prazan."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Automatsko slanje"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Prijenosi su završeni"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Slanja su pauzirani"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Automatsko slanje još nije aktivirano"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Velike datoteke prenosit će se samo putem WiFi veze."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Skeniranje datoteka..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Priprema <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> fotografija i <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> videozapisa za prijenos..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Nema potrebe za prijenos dodatnih fotografija/videozapisa."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Pojavio se problem u komunikaciji s poslužiteljem. Pokušajte ponovo kasnije."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Nalog Sinkroniziraj sve otkazan"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sinkroniziraj sve"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Prikaži preneseno"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Prikaži stavke na čekanju"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Opće"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Pauziraj sva slanja"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Napajanje"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Šalji samo dok se telefon puni."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Šalji samo kada je Wi-Fi dostupan."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotografije"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Račun"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Uvjeti prijenosa"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Veličina fotografije"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videozapisi"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Račun"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Račun fotografija upotrebljavat će se za slanje videozapisa."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Uvjeti slanja"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Zasad se upotrebljavaju postavke povezivosti fotografija."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Samo fotografije putem mobilnih mreža"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotografije i videozapisi putem mobilnih mreža"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Fotog. i videoz. samo putem Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"O"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Verzija Autom. slanja"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Preporučeno: 1600 piksela (za dijeljenje, ispis i čuvare zaslona)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Izvorna veličina (najsporiji prijenos)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"pauzirano - SD kartica nije dostupna"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD kartica nije dostupna"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Postavke Automatskog slanja"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Automatsko slanje"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Automatski prijenos novih fotografija i videozapisa u privatni web-album"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Status prijenosa"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Napredno"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Mobilni prijenosi"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Prijenosi u roamingu"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Pošaljite fotografije i videozapise za vrijeme roaminga na mreži za prijenos podataka"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Slanje tijekom punj."</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Prijenos fotografija i videozapisa samo tijekom punjenja"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Prijenos postojećih fotografija"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Prijenos svih postojećih fotografija i videozapisa s telefona sada"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Onemogućeno"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Prijenos (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d od %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Pauzirano: dodirnite za nastavak slanja"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Prijenos postojećih fotografija"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Prijenos fotografija i videozapisa koji još nisu preneseni s telefona u privatni album na webu može potrajati neko vrijeme, ali to će se odvijati u pozadini. Jeste li sigurni da želite nastaviti?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Da"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Ne"</string>
-</resources>
diff --git a/email2/res/values-hu/strings.xml b/email2/res/values-hu/strings.xml
deleted file mode 100644
index 1eee01171..000000000
--- a/email2/res/values-hu/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"E-mail mellékletek olvasása"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Lehetővé teszi az alkalmazás számára az e-mailek mellékleteinek olvasását."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Hozzáférés az e-mail szolgáltató adataihoz"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Lehetővé teszi az alkalmazás számára az e-mail adatbázisához, így a fogadott és elküldött üzenetekhez, a felhasználónevekhez és jelszavakhoz való hozzáférést."</string>
- <string name="app_name" msgid="5815426892327290362">"E-mail"</string>
- <string name="compose_title" msgid="427986915662706899">"Levélírás"</string>
- <string name="debug_title" msgid="5175710493691536719">"Hibakeresés"</string>
- <string name="next_action" msgid="3931301986364184415">"Tovább"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Mégse"</string>
- <string name="previous_action" msgid="5181616311579820981">"Előző"</string>
- <string name="send_action" msgid="1729766205562446418">"Küldés"</string>
- <string name="reply_action" msgid="4262472229221507619">"Válasz"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Válasz mindenkinek"</string>
- <string name="delete_action" msgid="8421026208288857155">"Törlés"</string>
- <string name="forward_action" msgid="669174181042344116">"Továbbítás"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Csillagozás"</string>
- <string name="done_action" msgid="7497990549515580249">"Kész"</string>
- <string name="create_action" msgid="3062715563215392251">"Új létrehozása"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Törlés"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nincsenek gyors válaszok."</string>
- <string name="discard_action" msgid="6532206074859505968">"Elvetés"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Piszkozatmentés"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Gyors válasz beilleszt."</string>
- <string name="read_action" msgid="4701484794504781686">"Megjelölés olvasottként"</string>
- <string name="unread_action" msgid="6280399049357552826">"Megjelölés olvasatlanként"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Csillagozás"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Csillag eltávolítása"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Frissítés"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Fiók hozzáadása"</string>
- <string name="compose_action" msgid="4045702519637388045">"Levélírás"</string>
- <string name="search_action" msgid="6325101454876682308">"Keresés"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Fiókbeállítások"</string>
- <string name="settings_action" msgid="6334807007967459412">"Beállítások"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Szinkronizálási beállítások"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Megjelölés olvasatlanként"</string>
- <string name="move_action" msgid="3059189775933985898">"Áthelyezés"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Másolatmezők"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Másolatmezők is"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Fájl csatolása"</string>
- <string name="close_action" msgid="533058985745238100">"Bezárás"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Minden üzenet elküldése"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Melléklet kiválasztása"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Áthelyezés"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Üzenetek betöltése..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Csatlakozási probléma"</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Nem sikerült betölteni az üzenet szövegét. Lehet, hogy az üzenet túl nagy a megtekintéshez."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Üzenet áthelyezése"</item>
- <item quantity="other" msgid="371256717624461324">"Üzenetek áthelyezése"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Az áthelyezés nem támogatott POP3-fiókokban."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Nem lehet áthelyezni, mert a kijelölés több fiókot tartalmaz."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"A Piszkozatok, Kimenő levelek és Elküldött mappákban lévő üzeneteket nem lehet áthelyezni."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> olvasatlan (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> olvasatlan (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> olvasatlan (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> fiókban"</item>
- <item quantity="other" msgid="2723797835410343458">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> fiókban"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"címzett: <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> új üzenet"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Minden fiók"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> fiók"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> fiók"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Beérkezett üzenetek"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Kimenő levelek"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Piszkozatok"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Kuka"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Elküldve"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Spam"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Olvasatlan"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Beérkező levelek (olvasatlan)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Beérkező levelek (összes)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Kombinált nézet (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> fiók"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> fiók"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Verzió: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Beérkezett üzenetek"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Csillaggal megjelölt"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Piszkozatok"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Kimenő levelek"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Kombinált nézet"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Összes mappa megjelenítése"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Fiókok"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Legutóbbi mappák (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Összes mappa"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Legutóbbi mappák"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Tárgy"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Nincs tárgy"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"További üzenetek betöltése"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> kiválasztva"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> kiválasztva"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Nincsenek üzenetek"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Címzett"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Másolatot kap"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Titkos másolat"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Tárgy"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Feladó:"</string>
- <string name="to" msgid="4392614766835725698">"Címzett"</string>
- <string name="cc" msgid="7017720927911078193">"Másolatot kap"</string>
- <string name="bcc" msgid="3098643138241111579">"Titkos másolat"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Tárgy"</string>
- <string name="body_hint" msgid="4279864165439577668">"Levélírás"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Eredeti üzenet --------"\n"Tárgy: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Feladó: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Címzett: <xliff:g id="TO">%3$s</xliff:g>"\n"Másolatot kap: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> a következőt írta:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Idézett szöveg beillesztése"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Szöveggel együtt"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Vegyen fel legalább egy címzettet."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Egyes e-mail címek érvénytelenek."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"A csatolni kívánt fájl túl nagy."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Gyors válasz beillesztése"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> és még <xliff:g id="NUMBER">%2$d</xliff:g> címzett..."</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Címzett:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Másolatot kap:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Titkos másolat:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Dátum:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Feladó:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Tárgy:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Megtekint"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Telepítés"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Lejátszás"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Betöltés"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Információ"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Mentés"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Elmentve"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Leállítás"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Melléklet elmentve: <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"A melléklet mentése nem sikerült."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Küldés előtt továbbított üzenete egy vagy több melléklete letöltődik."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Üzenet"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Meghívás"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Melléklet - <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Mellékletek: <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Képek megjelenítése"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Mindig megjelenik"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Mindig jelenjenek meg képek ettől a feladótól"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Az ettől a feladótól származó képek automatikusan megjelennek."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Megtekintés a Naptárban"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Naptár meghívó"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Részt vesz?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Igen"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Lehet"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Nem"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Már elfogadta ezt a meghívást."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"\"Lehetséges\" választ adott erre a meghívásra."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Már elutasította ezt a meghívást."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Részletek megjelenítése"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Üzenet részletei"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Melléklet adatai"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Wi-Fi kapcsolat szükséges"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Wi-Fi beállítások"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Alkalmazásbeállítások"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"A melléklet nem nyitható meg."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Nem lehet menteni vagy megnyitni ezt a fájlt, mert ez a fajta melléklet rosszindulatú szoftvereket is tartalmazhat."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Ezt a mellékletet a fiók biztonsági irányelvei miatt nem lehet menteni vagy megnyitni."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"A melléklet túl nagy mobilhálózatról való letöltéshez. Letöltheti, amikor legközelebb Wi-Fi hálózatra kapcsolódik."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Nincs telepítve a melléklet megnyitására képes alkalmazás. Próbáljon meg megfelelő alkalmazást letölteni az Android Marketről."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Ez a melléklet egy alkalmazás. Be kell jelölnie az Ismeretlen források lehetőséget a Beállítások &gt; Alkalmazások menüpontban, mielőtt telepíthetné azt."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Az alkalmazások nem telepíthetők közvetlenül e-mailből. Először mentenie kell az alkalmazást, majd telepíteni a Letöltések alkalmazás használatával."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Nem sikerült letölteni a mellékletet."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Hiba történt az üzenet dekódolása közben."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"<xliff:g id="FILENAME">%s</xliff:g> megtekintése"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Törli ezt az üzenetet?"</item>
- <item quantity="other" msgid="4437637377522896262">"Törli ezeket az üzeneteket?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Üzenet törölve."</item>
- <item quantity="other" msgid="6574961322865652255">"Az üzenetek törölve."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Üzenet elvetve."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Az üzenet mentve piszkozatként."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Nem lehet megjeleníteni a mellékletet."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Nem sikerült betölteni a következő mellékletet: \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Üzenet megnyitása..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> üzenet áthelyezve ide: <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> üzenet áthelyezve ide: <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Egy vagy több melléklet nem továbbítható."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"A melléklet nincs továbbítva"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"A(z) <xliff:g id="ACCOUNT_NAME">%s</xliff:g> fiókba való bejelentkezés sikertelen."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Sikertelen bejelentkezés"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Újabbak"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Régebbiek"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Fiók beállítása"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"E-mail fiók"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Mindössze néhány lépésben létrehozhatja fiókját."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-mail cím"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Jelszó"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"E-mail küldése ebből a fiókból alapértelmezés szerint"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuális beállítás"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Írjon be egy érvényes e-mail címet és jelszót."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Már létező fiók"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Már használja ezt a felhasználónevet a(z) \"<xliff:g id="DUPLICATE">%s</xliff:g>\" fiókhoz."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Ez a jelszó egy vagy több szóközzel kezdődik, vagy végződik. Sok szerver nem támogatja a szóközöket a jelszavakban."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Fiókadatok beolvasása..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Bejövő üzeneteket kezelő szerver beállításainak ellenőrzése..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Kimenő üzeneteket kezelő szerver beállításainak ellenőrzése..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Fiók beállítása"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"A fiók beállítása befejeződött, az e-mailek úton vannak."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Fiók elnevezése (opcionális)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Az Ön neve (a kimenő üzenetekben való megjelenítéshez)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Ez a mező nem lehet üres."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Fiók beállítása"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Fiók típusa"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Milyen típusú ez a fiók?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Fiók beállítása"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Bejövő üzenetek szerverének beállításai"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Felhasználónév"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Jelszó"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Szerver"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Biztonság típusa"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nincs"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Minden tanúsítvány elfogadása)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (minden tanúsítvány elfogadása)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"E-mail törlése a szerverről"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Soha"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"A Beérkező levelek mappából való törléskor"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP-alapú elérési út előtagja"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Opcionális"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Fiók beállítása"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Kimenő üzenetek szerverének beállításai"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-szerver"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Biztonság típusa"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Bejelentkezés szükséges"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Felhasználónév"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Jelszó"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Fiók beállítása"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Szerverbeállítások"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Szerver"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domain\\felhasználónév"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Biztonságos kapcsolat (SSL) használata"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Minden SSL-tanúsítvány elfogadása"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Ügyféltanúsítvány"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Kiválasztás"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Ügyféltanúsítvány használata"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Eltávolítás"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Egy sem"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"A mobil eszköz azonosítója"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Fiókbeállítások"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Fiókbeállítások"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Beérkező levelek ellenőrzésének gyakorisága"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Soha"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automatikus (push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"5 percenként"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"10 percenként"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"15 percenként"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"30 percenként"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Óránként"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"E-mail küldése ebből a fiókból alapértelmezés szerint"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Értesítés megjelenítése e-mail érkezésekor"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Névjegyek szinkronizálása ebből a fiókból"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Naptár szinkronizálása ebből a fiókból"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Az e-mailek szinkronizálása ebből a fiókból"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Mellékletek automatikus letöltése Wi-Fi-kapcsolatnál"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nem sikerült befejezni"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Szinkronizálási időtartam"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatikus"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Egy nap"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Három nap"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Egy hét"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Két hét"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Egy hónap"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Összes"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Alapbeállítás használata"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Helytelen felhasználónév vagy jelszó."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Helytelen felhasználónév vagy jelszó."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nem lehet biztonságos kapcsolatot létesíteni a szerverrel."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nem lehet biztonságos kapcsolatot létesíteni a szerverrel."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Klienstanúsítvány szükséges. Szeretne klienstanúsítvánnyal rendelkező szerverhez csatlakozni?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"A tanúsítvány érvénytelen vagy elérhetetlen."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"A szerver hibaüzenettel válaszolt. Ellenőrizze felhasználónevét és jelszavát, majd próbálja újra."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nem lehet kapcsolatot létesíteni a szerverrel."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Nem lehet kapcsolódni a szerverhez."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS szükséges, de a szerver nem támogatja."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"A szerver nem támogatja a hitelesítési módokat."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Nem sikerült megnyitni a kapcsolatot a szerverrel egy biztonsági hiba miatt."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Nem sikerült megnyitni a kapcsolatot a szerverrel."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Nem megfelelő szervercímet adott meg, vagy a szerver olyan protokollverziót követel, amelyet az e-mail nem támogat."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Nincs engedélye arra, hogy szinkronizáljon ezzel a szerverrel. Kérjük, forduljon a szerver rendszergazdájához további információért."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Távoli biztonságkezelés"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"A(z) <xliff:g id="SERVER">%s</xliff:g> szerver engedélyt kér arra, hogy távolról vezérelhesse az Android-eszköz egyes biztonsági funkcióit. Befejezi a fiók konfigurálását?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Ez a szerver olyan biztonsági funkciókat követel meg, amelyeket az Ön Android készüléke nem támogat, például: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"A fiók felhasználónevét nem lehet módosítani. Eltérő nevű fiók hozzáadásához érintse meg a Fiók hozzáadása elemet."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"FIGYELMEZTETÉS: ha kikapcsolja az E-mail alkalmazás azon jogosultságát, hogy felügyelje az eszközt, akkor törli az összes olyan e-mail fiókot, amelyhez szükség van az alkalmazásra; a fiókokkal együtt pedig törli az e-maileket, a névjegyeket, a naptári eseményeket és más adatokat is."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Biztonsági frissítés"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> a biztonsági beállítások frissítését igényli."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"A(z) \"<xliff:g id="ACCOUNT">%s</xliff:g>\" fiókot a biztonsági követelmények miatt nem lehet szinkronizálni."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Frissíteni kell a(z) \"<xliff:g id="ACCOUNT">%s</xliff:g>\" fiók biztonsági beállításait."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"A(z) \"<xliff:g id="ACCOUNT">%s</xliff:g>\" nevű fiók módosította a biztonsági beállításokat, nem szükséges felhasználói beavatkozás."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Biztonsági frissítés szükséges"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"A rendszabályok megváltoztak"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"A biztonsági házirend nem tartható be"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Eszközbiztonság"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"A(z) <xliff:g id="SERVER">%s</xliff:g> szerver engedélyt kér arra, hogy távolról vezérelhesse az Android-eszköz egyes biztonsági funkcióit."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Részletek szerkesztése"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" miatt módosítania kell a zárolási képernyő PIN kódját vagy jelszavát."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Képernyőzár jelszava lejár"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"A képernyőzár PIN kódja vagy jelszava lejárt."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Képernyőzár jelszava lejárt"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Képernyőzár jelszava hamarosan lejár"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Hamarosan módosítania kell a képernyőzár PIN-kódját vagy jelszavát, különben a(z) <xliff:g id="ACCOUNT">%s</xliff:g> fiók adatai törlődnek. Módosítja most?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Képernyőzár jelszava lejárt"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"<xliff:g id="ACCOUNT">%s</xliff:g> adatai törlésre kerülnek a készülékről. Visszaállíthatja a képernyőzár PIN-kódjának vagy jelszavának módosításával. Módosítja most?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Elveti a nem mentett módosításokat?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Sikertelen bejelentkezés"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"A(z) <xliff:g id="ACCOUNT">%s</xliff:g> fiókhoz tartozó felhasználónév és jelszó helytelen. Szeretné frissíteni őket most?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Alapértelmezett fiók"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"E-mail küldése ebből a fiókból alapértelmezés szerint"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Mellékletek letöltése"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Mellékletek automatikus letöltése az üzenetekbe Wi-Fin keresztül"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"E-mail értesítések"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Szinkronizálási gyakoriság, értesítések stb."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"E-mail érkezése esetén értesítés küldése"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Beérkező levelek ellenőrzésének gyakorisága"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Bejövő üzenetek beállításai"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Felhasználónév, jelszó és a beérkező szerver egyéb beállításai"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Kimenő üzenetek beállításai"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Felhasználónév, jelszó és a kimenő szerver beállításai"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Kényszerített rendszabályok"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Nincs"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nem támogatott rendszabályok"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Nincs"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Szinkronizálás megkísérlése"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"A fiók szinkronizálásához érintse meg itt"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Fióknév"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Az Ön neve"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Aláírás"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Gyors válaszok"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"E-mail írásakor gyakran beillesztett szöveg szerkesztése"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Szöveg hozzáfűzése az elküldendő üzenetekhez"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Értesítési beállítások"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Adathasználat"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Biztonsági rendszabályok"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Gyors válasz szerkesztése"</string>
- <string name="save_action" msgid="1988862706623227093">"Mentés"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Névjegyek szinkronizálása"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"A fiók névjegyeinek szinkronizálása"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Naptár szinkronizálása"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"A fiók naptárának szinkronizálása"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"E-mail szinkroniz."</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"A fiók e-mailjeinek szinkronizálása"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Rezgés"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Rezgés e-mail érkezésekor is"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Mindig"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Csak néma üzemmódban"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Soha"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Rezgés"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Válasszon csengőhangot"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Szerverbeállítások"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Fiók törlése"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"A(z) \"<xliff:g id="ACCOUNT">%s</xliff:g>\" fiók el lesz távolítva az e-mail szolgáltatásból."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Fiók törlése"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Fiók törlése"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Szinkronizálási beállítások"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Szinkronizálási beállítások (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Szinkronizálási beállítások"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Ellenőrzés gyakorisága"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Szinkronizálási időtartam"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"E-mail fiók"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Válasszon fiókot"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Mappa kiválasztása"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"A fiók nem található. Lehet, hogy eltávolították."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"A mappa nem található. Lehet, hogy eltávolították."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Csak bizonyos \"Plus\" típusú fiókok rendelkeznek olyan POP-hozzáféréssel, amely lehetővé teszi a program számára a kapcsolódást. Ha nem tud bejelentkezni a megfelelő e-mail címmel és jelszóval, valószínűleg nem fizetett elő \"Plus\" típusú fiókra. Az ilyen e-mail fiókok eléréséhez indítsa el a böngészőt."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Kérjük, az e-mail fiók beállítása előtt keresse fel a T-Online webhelyét, és hozzon létre jelszót a POP3-alapú e-mail hozzáféréshez."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Vállalati"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Nem sikerült létrehozni a fiókot. Próbálja újra."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-mail"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Engedélyezi a szerverspecifikus biztonsági irányelveket"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Keresés itt: <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> találat a(z) <xliff:g id="DOMAIN">%2$s</xliff:g> domainből"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> találat a(z) <xliff:g id="DOMAIN">%2$s</xliff:g> domainből"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Beállítások"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Általános beállítások"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Alkalmazás"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatikus lépegetés"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Válassza ki, melyik képernyő jelenjen meg üzenet törlése után"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Jelölőnégyzetek elrejtése"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Kiválasztáshoz érintse meg, és tartsa lenyomva az üzenetlistában"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Megerősítés kérése törlés előtt"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Üzenetek"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Megerősítés kérése küldés előtt"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Üzenetek"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Továbblépés ide:"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Újabb üzenet"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Régebbi üzenet"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Üzenetek listája"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Üzenet szövegének mérete"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Apró méretű szöveg"</item>
- <item msgid="4415205108584620118">"Kisméretű szöveg"</item>
- <item msgid="4550219696381691112">"Normál méretű szöveg"</item>
- <item msgid="6227813549949219991">"Nagyméretű szöveg"</item>
- <item msgid="1197917420815786571">"Óriási méretű szöveg"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Üzenet szövegének mérete"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Apró"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Kicsi"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normál"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Nagy"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Óriási"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Válasz mindenkinek"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"A \"Válasz mindenkinek\" legyen az alapértelmezett válaszolási mód"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Kérdezzen rá a képek megjelenítésére"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Az üzenetekben lévő képek nem jelennek meg automatikusan"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Képek megjelenítése\" törölve."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_2">%2$s</xliff:g>/<xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Várakozás a szinkronizálásra"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"E-mail címe hamarosan megjelenik."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Ikonérintéssel válthat"</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Összes e-mail"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Olvasatlan"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Csillagozott"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Betöltés…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Érintse meg a létrehozáshoz."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Ön még nem állított be e-mail fiókot."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"E-mail keresése"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Keresés itt: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Találatok a(z) \"<xliff:g id="ID_1">%1$s</xliff:g>\" kifejezésre"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Várakozás a találatokra"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Egyes szervereknek több időre van szükségük."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mappák"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"A kamera használatának tiltása"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Eszközjelszó kötelező"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Előző jelszavak kizárása"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"A jelszavak kötelezően lejárnak"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Képernyőzároláshoz szükséges nyugalmi idő"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Szinkronizált naptáresemények számának korlátozása"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Szinkronizált e-mailek számának korlátozása"</string>
- <string name="quick_1" msgid="3426057697353380951">"Köszönjük!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Jól hangzik!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Később elolvasom és visszatérünk rá."</string>
- <string name="quick_4" msgid="3988974084396883051">"Szervezzünk egy találkozót a dolog megvitatására."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"A fiók háttérben zajló szinkronizálása le van tiltva barangolás közben."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Válasz küldése..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Nincsenek üzenetek."</string>
-</resources>
diff --git a/email2/res/values-hu/uploader.xml b/email2/res/values-hu/uploader.xml
deleted file mode 100644
index 480cddbe6..000000000
--- a/email2/res/values-hu/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Azonnali feltöltés"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Azonnali feltöltés albuma"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Feltöltés"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Befejeződött"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Szüneteltetve"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d fotó • %3$d videó"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d fotó • %2$d videó"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"alacsony töltöttség"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"túllépte a fotókra vonatkozó kvótát"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"barangolás"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"várakozás Wi-Fi kapcsolatra"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"töltésig elhalasztva"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"várakozás az összeköttetésre"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"%s múlva újabb próbálkozás"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Függőben lévő feltöltések megjelenítése"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Befejezett feltöltések megjelenítése"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Megtekintés online"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Függőben lévő feltöltések megjelenítése"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Függőben lévő feltöltések elrejtése"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Részletek megjelenítése"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Részletek elrejtése"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Beállítások"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"%s feltöltve"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Fiók"</string>
- <string name="upload" msgid="2615541458361216022">"Feltöltés"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Mégse"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Feltöltés ide: "<b></b></string>
- <string name="uploading_for" msgid="1735961974624867111">" a következőnek: "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Nem sikerült elindítani a feltöltést."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"A fájl nem érhető el."</string>
- <string name="account_error" msgid="1904775271866104941">"Nem sikerült lekérni a fiókadatokat."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Gond volt a fiókjába történő bejelentkezéssel."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Újrapróbálásra vár"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Várakozás Wi-Fi kapcsolatra"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Feltöltés"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Meghiúsult"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Kész"</string>
- <string name="pause_state_running" msgid="711411177620353982">"feltöltés"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"manuálisan szüneteltetve"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"szüneteltetve -- alacsony töltöttség"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"szüneteltetve -- elhalasztva a töltésig"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"szüneteltetve -- várakozás csatlakozásra"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"szüneteltetve -- elfogyott a PWA kvóta"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"szüneteltetve -- várakozás a Wi-Fire"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"szüneteltetve -- barangolás"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"újrapróbálásra vár"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 perc"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 perc"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 perc"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Nincs adatkapcsolat"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"A fiókban nem áll rendelkezésre elegendő lemezkvóta"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"A fájl nem található"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Szolgáltatáshiba"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Hálózati hiba"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Azonosítás sikertelen"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Függőben lévő feltöltések [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Befejezett feltöltések [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Feltöltések szüneteltetése"</string>
- <string name="manager_resume" msgid="1608630525599824933">"A feltöltések folytatása"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Feltöltés most"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Feltöltés később"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Ne legyen feltöltve"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Megtekintés"</string>
- <string name="manager_retry" msgid="939534318469518843">"Újra"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"A feltöltés leállítva"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"A feltöltés már befejeződött"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Az összes szinkronizálása"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Utolsó szinkronizálás:"\n\n</string>
- <string name="finished_empty" msgid="689924777356099393">"A befejezett elemek listája üres."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Azonnali feltöltés"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"A feltöltések befejeződtek"</string>
- <string name="notify_paused" msgid="3999817913227671338">"A feltöltések szüneteltetve"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Az azonnali feltöltés még nincs aktiválva"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Nagy fájlok csak Wi-Fi kapcsolaton keresztül kerülnek feltöltésre."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Fájlok keresése..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"<xliff:g id="PHOTOCOUNT">%1$d</xliff:g> fotó és <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> videó előkészítése feltöltéshez..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Nincs szükség további fotók/videók feltöltésére."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Hiba történt a szerverrel folytatott kommunikáció során. Próbálkozzon újra később."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Összes megszakított szinkronizálása"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Az összes szinkronizálása"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Befejezettek megtekintése"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Függőben lévők megtekintése"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Általános"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Az összes feltöltés szüneteltetése"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Töltés szükséges"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Feltöltés csak akkor, ha a telefon töltőn van."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Feltöltés csak akkor, ha van elérhető Wi-Fi hálózat."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotók"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Fiók"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Feltöltési feltételek"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Fénykép mérete"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videók"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Fiók"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"A Fotók-fiók lesz használatban a videofeltöltések során is."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Feltöltési feltételek"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Most a fényképekkel kapcsolatos kapcsolódási beállításokat használja."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Mobilhálózaton keresztül csak képek"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotók és videók mobilhálózaton keresztül"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Fotók és videók csak Wi-Fin keresztül"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Névjegy"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Verziószám"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Javasolt: 1600 képpont (megosztásra, nyomtatásra és képernyőkímélőnek)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Eredeti méret (leglassabb feltöltés)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"szüneteltetve -- az SD-kártya nem érhető el"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Az SD-kártya nem érhető el"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Feltöltési beállítások"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Azonnali feltöltés"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Új fotók és videók automatikus feltöltése egy személyes albumba az interneten"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Feltöltés állapota"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Haladó"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Mobil feltöltések"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Feltöltés barangoláskor"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Fotók és videók feltöltése adathálózaton történő barangolás során"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Feltöltés akkumulátornál"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Fotók és videók feltöltése csak töltés közben"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Már meglévő fotók feltöltése"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Bármely meglévő fotó és videó azonnali feltöltése telefonjáról"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Kikapcsolva"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Feltöltés (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %2$d/%1$d."</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Felfüggesztve: a feltöltés folytatásához érintse meg"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Már meglévő fotók feltöltése"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Eltarthat egy ideig azoknak a fotóknak és videóknak a feltöltése, amelyek még nem lettek feltöltve telefonjáról egy interneten található személyes albumba, de a művelet a háttérben fog történni. Biztos benne, hogy folytatja?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Igen"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Nem"</string>
-</resources>
diff --git a/email2/res/values-in/strings.xml b/email2/res/values-in/strings.xml
deleted file mode 100644
index d2f7f2995..000000000
--- a/email2/res/values-in/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Baca lampiran email"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Memungkinkan apl membaca lampiran email Anda."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Akses data penyedia email"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Mengizinkan apl mengakses basis data email Anda, termasuk pesan yang diterima, pesan yang dikirim, nama pengguna, dan sandi."</string>
- <string name="app_name" msgid="5815426892327290362">"Email"</string>
- <string name="compose_title" msgid="427986915662706899">"Tulis"</string>
- <string name="debug_title" msgid="5175710493691536719">"Debug"</string>
- <string name="next_action" msgid="3931301986364184415">"Berikutnya"</string>
- <string name="okay_action" msgid="8365197396795675617">"Oke"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Batal"</string>
- <string name="previous_action" msgid="5181616311579820981">"Sebelumnya"</string>
- <string name="send_action" msgid="1729766205562446418">"Kirimkan"</string>
- <string name="reply_action" msgid="4262472229221507619">"Balas"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Balas ke semua"</string>
- <string name="delete_action" msgid="8421026208288857155">"Hapus"</string>
- <string name="forward_action" msgid="669174181042344116">"Teruskan"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Kilaukan Bintang"</string>
- <string name="done_action" msgid="7497990549515580249">"Selesai"</string>
- <string name="create_action" msgid="3062715563215392251">"Buat baru"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Hapus"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Tidak ada tanggapan cepat."</string>
- <string name="discard_action" msgid="6532206074859505968">"Buang"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Simpan draf"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Masukkan tanggapan cepat"</string>
- <string name="read_action" msgid="4701484794504781686">"Tandai sudah dibaca"</string>
- <string name="unread_action" msgid="6280399049357552826">"Tandai belum dibaca"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Kilaukan bintang"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Redupkan bintang"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Segarkan"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Tambahkan akun"</string>
- <string name="compose_action" msgid="4045702519637388045">"Tulis"</string>
- <string name="search_action" msgid="6325101454876682308">"Telusuri"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Setelan akun"</string>
- <string name="settings_action" msgid="6334807007967459412">"Setelan"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Opsi sinkronisasi"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Tandai belum dibaca"</string>
- <string name="move_action" msgid="3059189775933985898">"Pindahkan"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Tambahkan Cc/Bcc"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Lampirkan file"</string>
- <string name="close_action" msgid="533058985745238100">"Tutup"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Kirim semua pesan"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Pilih lampiran"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Pindahkan ke"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Memuat pesan…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Masalah sambungan."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Tidak dapat memuat teks pesan. Pesan mungkin terlalu besar untuk dilihat."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Pindahkan pesan"</item>
- <item quantity="other" msgid="371256717624461324">"Pindahkan pesan"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Pemindahan tidak didukung pada akun POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Tidak dapat memindah karena pilihan berisi beberapa akun."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Pesan dalam Draf, Kotak Keluar, dan Terkirim tidak dapat dipindah."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> yang belum dibaca (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> yang belum dibaca (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> yang belum dibaca (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"dalam <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> akun"</item>
- <item quantity="other" msgid="2723797835410343458">"dalam <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> akun"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"kepada <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> pesan baru"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Semua akun"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> akun"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> akun"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Kotak Masuk"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Kotak Keluar"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Draf"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Sampah"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Terkirim"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Junk"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Belum dibaca"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Kotak masuk (belum dibaca)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Kotak masuk (semua)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Tampilan gabungan (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> akun"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> akun"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versi: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Kotak Masuk"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Yang berkilau bintangnya"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Draf"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Kotak Keluar"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Tampilan kombinasi"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Tampilkan semua folder"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Akun"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Folder terkini (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Semua folder"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Folder terkini"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Subjek"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Tanpa subjek"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Muat pesan lainnya"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> dipilih"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> dipilih"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Tidak ada pesan"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Kepada"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Hal"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Dari:"</string>
- <string name="to" msgid="4392614766835725698">"Kepada"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Bcc"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Subjek"</string>
- <string name="body_hint" msgid="4279864165439577668">"Tulis email"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Pesan Asli --------"\n"Subjek: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Dari: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Kepada: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n" <xliff:g id="SENDER">%s</xliff:g> menulis:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Sertakan kutipan teks"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Sertakan teks"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Tambahkan setidaknya satu penerima."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Beberapa alamat email tidak valid."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"File terlalu besar untuk dilampirkan."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Masukkan tanggapan cepat"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> dan <xliff:g id="NUMBER">%2$d</xliff:g> lainnya"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Kepada:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Tanggal:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Dari:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Subjek:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Lihat"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Pasang"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Putar"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Muat"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Info"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Simpan"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Disimpan"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Hentikan"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Lampiran disimpan sebagai <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Tak dapat menyimpan lampiran."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Satu atau beberapa lampiran dalam pesan yang diteruskan akan diunduh sebelum dikirim."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Pesan"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Undang"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Lampiran <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Lampiran <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Tampilkan gambar"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Selalu tampilkan"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Selalu tampilkan gambar dari pengirim ini"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Gambar dari pengirim ini akan ditampilkan secara otomatis."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Lihat dalam Kalender"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Undangan kalender"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Gabung?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Ya"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Mungkin hadir"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Tidak"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Anda telah menerima undangan ini."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Anda telah menjawab \"mungkin\" pada undangan ini."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Anda telah menolak undangan ini."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Tampilkan detail"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Detail pesan"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Info lampiran"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Diperlukan koneksi Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Setelan Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Setelan apl"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Tidak dapat membuka lampiran."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Anda tidak dapat menyimpan atau membuka file ini karena jenis lampiran mungkin berisi perangkat lunak berbahaya."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Lampiran ini tidak dapat disimpan atau dibuka karena kebijakan keamanan akun ini."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Lampiran ini terlalu besar untuk diunduh melalui jaringan seluler. Anda dapat mengunduhnya saat tersambung lagi ke jaringan Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Tidak ada apl terpasang yang dapat membuka lampiran ini. Coba unduh apl yang tepat dari Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Lampiran ini adalah sebuah apl. Anda harus mencentang Sumber Tidak Dikenal dalam Setelan &gt; Apl sebelum Anda dapat memasangnya."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Apl tidak dapat dipasang langsung dari email. Simpan apl ini terlebih dahulu, lalu pasang menggunakan apl Unduhan."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Tidak dapat mengunduh lampiran."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Terjadi kesalahan saat mengawasandikan pesan."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Melihat <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Hapus pesan ini?"</item>
- <item quantity="other" msgid="4437637377522896262">"Hapus pesan ini?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Pesan yang dihapus."</item>
- <item quantity="other" msgid="6574961322865652255">"Pesan yang dihapus."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Pesan dibuang."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Pesan disimpan sebagai draf."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Tidak dapat menampilkan lampiran."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Tidak dapat memuat lampiran \" <xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Membuka pesan…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> pesan dipindahkan ke <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> pesan dipindahkan ke <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Tidak dapat meneruskan satu lampiran atau lebih."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Lampiran tidak diteruskan"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Gagal masuk <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Tidak dapat masuk"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Anyar"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Lawas"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Penyiapan akun"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Akun email"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Anda dapat menyiapkan akun hanya dalam beberapa langkah."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Alamat email"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Sandi"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Kirim email dari akun ini secara default"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Penyiapan manual"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Ketik alamat email dan sandi yang valid."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Akun rangkap"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Anda telah menggunakan nama pengguna ini untuk akun \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Sandi ini diawali atau diakhiri dengan satu karakter spasi atau lebih. Banyak server tidak mendukung sandi dengan spasi."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Mengambil informasi akun..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Memeriksa setelan server masuk…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Memeriksa setelan server keluar…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Penyiapan akun"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Akun Anda sudah siap dan email akan segera tiba!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Beri nama akun ini (opsional)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Nama (yang ditampilkan pada pesan keluar)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Bidang ini tidak boleh kosong."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Penyiapan akun"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Jenis akun"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Jenis akun apakah ini?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Penyiapan akun"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Setelan server masuk"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nama Pengguna"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Sandi"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Jenis keamanan"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Tak Satu Pun"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Terima semua sertifikat)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (menerima semua sertifikat)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Hapus email dari server"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Tidak pernah"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Jika saya hapus dari Kotak Masuk"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Awalan jalur IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Opsional"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Penyiapan akun"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Setelan server keluar"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Server SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Jenis keamanan"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Harus masuk"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nama Pengguna"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Sandi"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Penyiapan akun"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Setelan server"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Server"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domain\\Nama Pengguna"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Gunakan sambungan aman (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Terima semua sertifikat SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Sertifikat klien"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Pilih"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Gunakan sertifikat klien"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Hapus"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Tidak ada"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID Perangkat Seluler"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Setelan akun"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Opsi akun"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Frekuensi pemeriksaan kotak masuk"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Tidak pernah"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Otomatis (Tekan)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Setiap 5 menit"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Setiap 10 menit"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Setiap 15 menit"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Setiap 30 menit"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Setiap jam"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Kirim email dari akun ini secara default"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Beri tahu saya ketika email tiba"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sinkronkan kontak dari akun ini"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sinkronkan kalender dari akun ini"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sinkronkan email dari akun ini"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Unduh lampiran secara otomatis ketika tersambung dengan Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Tidak dapat menyelesaikan"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Hari yang disinkronkan"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Otomatis"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Satu hari"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tiga hari"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Satu minggu"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Dua minggu"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Satu bulan"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Semua"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Gunakan default akun"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nama pengguna atau sandi salah."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nama pengguna atau sandi salah."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Tidak dapat tersambung ke server dengan aman."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Tidak dapat tersambung ke server dengan aman."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Diperlukan sertifikat klien. Apakah Anda ingin menyambung ke server dengan sertifikat klien?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sertifikat tidak valid atau tidak dapat diakses."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Server menanggapi dengan kesalahan. Periksa nama pengguna dan sandi, lalu coba lagi."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Tidak dapat tersambung ke server."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Tidak dapat menyambung ke server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS diperlukan, tetapi tidak didukung oleh server."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Metode autentikasi tidak didukung oleh server."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Tidak dapat membuka sambungan ke server karena kesalahan keamanan."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Tidak dapat membuka koneksi ke server."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Anda mengetikkan alamat server yang salah atau server memerlukan versi protokol yang tidak didukung Email."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Anda tidak memiliki izin untuk menyinkronkan dengan server ini. Hubungi administrator server untuk informasi lebih lanjut."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Administrasi keamanan jarak jauh"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Server <xliff:g id="SERVER">%s</xliff:g> meminta Anda mengizinkannya mengontrol beberapa fitur keamanan perangkat Android dari jarak jauh. Apakah Anda ingin menyelesaikan penyiapan akun ini?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Server ini memerlukan fitur keamanan yang tidak didukung perangkat Android Anda, termasuk: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Anda tidak dapat mengubah nama pengguna akun. Untuk menambahkan akun dengan nama pengguna lain, sentuh Tambahkan Akun."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"PERINGATAN: Menonaktifkan otoritas apl Email untuk mengatur perangkat Anda akan menghapus semua akun email yang memerlukannya, beserta email, kontak, acara kalender, dan data lainnya."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Pembaruan keamanan"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> mengharuskan Anda memperbarui setelan keamanan."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Akun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" tidak dapat disinkronkan karena persyaratan keamanan."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Akun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" memerlukan pembaruan setelan keamanan."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Akun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" mengubah setelan keamanannya, tidak diperlukan tindakan pengguna."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Diperlukan pembaruan keamanan"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Kebijakan keamanan tlh diubah"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Kbijakan keamanan tak terpnuhi"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Keamanan perangkat"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Server <xliff:g id="SERVER">%s</xliff:g> meminta Anda mengizinkannya mengontrol beberapa fitur keamanan perangkat Android dari jarak jauh."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Edit detail"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" mengharuskan Anda mengubah PIN atau sandi pengunci layar."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Sandi pengunci layar akan kedaluwarsa"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"PIN atau sandi pengunci layar Anda kedaluwarsa."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Sandi pengunci layar kedaluwarsa"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Sandi pengunci layar akan kedaluwarsa"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Anda perlu segera mengganti PIN atau sandi pengunci layar. Bila tidak, data untuk <xliff:g id="ACCOUNT">%s</xliff:g> akan dihapus. Ganti sekarang?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Sandi pengunci layar kedaluwarsa"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Data untuk <xliff:g id="ACCOUNT">%s</xliff:g> sedang dihapus dari perangkat. Anda dapat memulihkannya dengan mengganti PIN atau sandi pengunci layar. Ganti sekarang?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Buang perubahan yang tidak tersimpan?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Tidak dapat masuk"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Nama pengguna atau sandi untuk <xliff:g id="ACCOUNT">%s</xliff:g> salah. Perbarui sekarang?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Akun default"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Kirim email dari akun ini secara default"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Unduh lampiran"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Unduh-otomatis lampiran pada pesan terbaru melalui WiFi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Pemberitahuan email"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Sinkronkan frekuensi, pemberitahuan, dll."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Mengirimkan pemberitahuan bila email tiba"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frekuensi pemeriksaan kotak masuk"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Setelan masuk"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nama pengguna, sandi, dan setelan server masuk lainnya"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Setelan keluar"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nama pengguna, sandi, dan setelan server keluar lainnya"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Kebijakan diberlakukan"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Tidak ada"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Kebijakan tidak didukung"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Tidak ada"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Coba sinkronisasi"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Sentuh di sini untuk menyinkronkan akun ini"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Nama akun"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Nama Anda"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Tanda tangan"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Tanggapan cepat"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edit teks yang sering Anda masukkan ketika menulis email"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Menambahkan teks ke pesan yang Anda kirim"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Setelan pemberitahuan"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Penggunaan data"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Kebijakan keamanan"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Edit tanggapan cepat"</string>
- <string name="save_action" msgid="1988862706623227093">"Simpan"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sinkronkan kontak"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sinkronkan kontak untuk akun ini"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sinkronkan kalender"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Snkronkan acr kalender utk akun ini"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sinkronkan email"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sinkronkan email untuk akun ini"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Getar"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Juga bergetar ketika email tiba"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Selalu"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Hanya saat senyap"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Tidak pernah"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Getar"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Pilih nada dering"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Setelan server"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Hapus akun"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Akun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" akan dihapus dari Email."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Hapus akun"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Hapus akun"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Opsi sinkronisasi"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Opsi sinkronisasi (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Setelan sinkronisasi"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Periksa frekuensi"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Hari yang disinkronkan"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Akun email"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Pilih akun"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Pilih folder"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Akun tidak ditemukan. Akun mungkin telah dihapus."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Folder tidak ditemukan. Folder mungkin telah dihapus."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Hanya beberapa akun \"Plus\" termasuk akses POP yang mengizinkan program ini tersambung. Jika tidak dapat masuk dengan sandi dan alamat email yang benar, Anda mungkin tidak memiliki akun \"Plus\" berbayar. Luncurkan browser web untuk mendapat akses ke akun email ini."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Sebelum menyiapkan akun email ini, kunjungi situs web T-Online dan buat sandi untuk akses email POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Perusahaan"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Tidak dapat membuat akun. Coba lagi."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Email"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Mengaktifkan kebijakan keamanan yang ditentukan server"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Menelusuri <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> hasil dari <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> hasil dari <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Setelan"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Setelan umum"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Aplikasi"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Maju otomatis"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Pilih layar mana yang akan ditampilkan stlh Anda menghapus pesan"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Sembunyikan kotak centang"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Pada daftar pesan, sentuh terus untuk memilih"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Konfirmasi sebelum menghapus"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Pesan"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Konfirmasi sebelum mengirim"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Pesan"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Majukan ke"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Pesan lebih anyar"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Pesan lawas"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Daftar pesan"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Ukuran teks pesan"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Teks sangat kecil"</item>
- <item msgid="4415205108584620118">"Teks kecil"</item>
- <item msgid="4550219696381691112">"Teks berukuran normal"</item>
- <item msgid="6227813549949219991">"Teks besar"</item>
- <item msgid="1197917420815786571">"Teks amat besar"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Ukuran teks pesan"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Mini"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Kecil"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Besar"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Sangat besar"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Balas semua"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Jadikan \"Balas semua\" sebagai default untuk membalas pesan"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Tanyakan untuk menampilkan gambar"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Gambar dalam pesan tidak akan ditampilkan secara otomatis"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Tampilkan gambar\" dihapus."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> dari <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Menunggu sinkronisasi"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Email Anda akan segera muncul."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Snth ikon utk mngubah."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Kotak Masuk Gabungan"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Belum Dibaca"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Yang berkilau bintangnya"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Memuat…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Sentuh untuk menyiapkan."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Anda belum menyiapkan akun email."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Telusuri email"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Telusuri <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Hasil penelusuran untuk \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Menunggu hasil"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Beberapa server mungkin membutuhkan waktu yang lama."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Folder"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Tolak penggunaan kamera perangkat"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Memerlukan sandi perangkat"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Batasi penggunaan ulang sandi terkini"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Mewajibkan sandi dapat kedaluwarsa"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Mnghrskan prgkt nganggur utk mngunci lyr"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Batasi jumlah acara kalender yang disinkronkan"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Batasi jumlah email yang disinkronkan"</string>
- <string name="quick_1" msgid="3426057697353380951">"Terima kasih!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Menurut saya itu bagus!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Saya akan membaca ini nanti dan mengabari Anda."</string>
- <string name="quick_4" msgid="3988974084396883051">"Mari kita adakan pertemuan untuk membahas masalah ini."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Sinkronisasi latar belakang untuk akun ini dinonaktifkan saat roaming."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Mengirim tanggapan..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Tidak ada pesan."</string>
-</resources>
diff --git a/email2/res/values-in/uploader.xml b/email2/res/values-in/uploader.xml
deleted file mode 100644
index 67849039a..000000000
--- a/email2/res/values-in/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Unggah Sekejap"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Album Unggah Sekejap"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Mengunggah"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Selesai"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Dijeda"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d foto • %3$d video"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d foto • %2$d video"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"baterai lemah"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"kuota foto melebihi batas"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"menunggu WiFi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"ditunda hingga pengisian daya"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"menunggu sambungan"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"mencoba ulang dalam %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Tampilkan Unggahan yang Tertunda"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Tampilkan Unggahan yang Sudah Selesai"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Lihat Secara Online"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Tampilkan Unggahan yang Tertunda"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Sembunyikan Unggahan yang Tertunda"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Tampilkan Detail"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Sembunyikan Detail"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Setelan"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Diunggah %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Akun"</string>
- <string name="upload" msgid="2615541458361216022">"Unggah"</string>
- <string name="ok" msgid="2516349681897895312">"Oke"</string>
- <string name="cancel" msgid="1207103189404543868">"Batal"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Mengunggah ke "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" untuk "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Inisiasi unggahan gagal."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"File tidak tersedia."</string>
- <string name="account_error" msgid="1904775271866104941">"Gagal mengambil informasi akun."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Terjadi masalah saat masuk ke akun Anda."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Menunggu untuk mencoba lagi"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Menunggu WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Mengunggah"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Gagal"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Selesai"</string>
- <string name="pause_state_running" msgid="711411177620353982">"mengunggah"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"dijeda secara manual"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"dijeda - baterai lemah"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"dijeda - ditunda hingga pengisian daya"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"dijeda - menunggu sambungan"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"dijeda - melebihi kuota AWP"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"dijeda - menunggu wifi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"dijeda - roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"menunggu untuk mencoba lagi"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 menit"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 menit"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 menit"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Tidak ada sambungan data"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Kuota disk akun habis"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"File tidak ditemukan"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Kesalahan layanan"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Kesalahan jaringan"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Autentikasi gagal"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Unggahan yang tertunda [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Unggahan yang selesai [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Jeda unggahan"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Lanjutkan unggahan"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Unggah sekarang"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Unggah nanti"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Jangan unggah"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Lihat"</string>
- <string name="manager_retry" msgid="939534318469518843">"Coba lagi"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Unggahan dibatalkan"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Pengunggahan telah selesai"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sinkronkan semua"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Sinkronisasi Terakhir:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Daftar item yang selesai kosong."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Unggah Sekejap"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Unggahan selesai"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Unggahan dijeda"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Unggah Sekejap belum diaktifkan"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"File berukuran besar akan diunggah melalui sambungan WiFi saja."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Memindai file..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Menyiapkan <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> foto dan <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> video untuk diunggah..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Tidak ada foto/video tambahan yang perlu diunggah."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Terjadi masalah saat berkomunikasi dengan server. Coba lagi nanti."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Sinkronkan semua yang dibatalkan"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sinkronkan Semua"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Lihat yang Selesai"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Lihat yang Tertunda"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Umum"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Jeda semua unggahan"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Daya"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Unggah ketika ponsel sedang mengisi daya saja."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Unggah hanya ketika Wi-Fi tersedia."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Foto"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Akun"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Kondisi unggahan"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Ukuran foto"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Video"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Akun"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Akun foto akan digunakan untuk unggahan video."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Kondisi pengunggahan"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Setelan konektivitas foto digunakan untuk saat ini."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Foto melalui jaringan seluler saja"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Foto &amp; video melalui jaringan seluler"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Foto &amp; video melalui Wi-Fi saja"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Tentang"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Versi Unggah Sekejap"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Disarankan: 1600 piksel (untuk berbagi, dicetak, dan screensaver)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Ukuran asli (unggahan paling lambat)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"dijeda - kartu SD tidak tersedia"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Kartu SD tidak tersedia"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Setelan Unggah Sekejap"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Unggah Sekejap"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Otomatis mengunggah foto &amp; video baru ke album web pribadi"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Status unggahan"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Lanjutan"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Unggahan seluler"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Unggahan roaming"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Unggah foto &amp; video saat roaming di jaringan data"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Unggahan baterai"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Unggah foto &amp; video saat mengisi daya saja"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Unggah foto yang ada"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Unggah foto &amp; video apa pun yang ada di ponsel Anda sekarang"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Nonaktif"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Mengunggah (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d dari %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Dijeda: sentuh untuk melanjutkan pengunggahan"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Unggah foto yang ada"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Mengunggah foto dan video yang belum diunggah dari ponsel ke album pribadi di web membutuhkan waktu beberapa lama, tetapi akan dilakukan di latar belakang. Yakin ingin melanjutkan?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Ya"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Tidak"</string>
-</resources>
diff --git a/email2/res/values-it/strings.xml b/email2/res/values-it/strings.xml
deleted file mode 100644
index 1a4956a74..000000000
--- a/email2/res/values-it/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Lettura allegati email"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Consente all\'applicazione di leggere gli allegati email."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Accesso ai dati del provider di posta"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Consente all\'applicazione di accedere al database della tua posta, inclusi i messaggi ricevuti e inviati, i nomi utente e le password."</string>
- <string name="app_name" msgid="5815426892327290362">"Email"</string>
- <string name="compose_title" msgid="427986915662706899">"Scrivi"</string>
- <string name="debug_title" msgid="5175710493691536719">"Debug"</string>
- <string name="next_action" msgid="3931301986364184415">"Avanti"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Annulla"</string>
- <string name="previous_action" msgid="5181616311579820981">"Indietro"</string>
- <string name="send_action" msgid="1729766205562446418">"Invia"</string>
- <string name="reply_action" msgid="4262472229221507619">"Rispondi"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Rispondi a tutti"</string>
- <string name="delete_action" msgid="8421026208288857155">"Elimina"</string>
- <string name="forward_action" msgid="669174181042344116">"Inoltra"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Speciale"</string>
- <string name="done_action" msgid="7497990549515580249">"Fine"</string>
- <string name="create_action" msgid="3062715563215392251">"Crea nuova"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Elimina"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nessuna risposta rapida."</string>
- <string name="discard_action" msgid="6532206074859505968">"Elimina"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Salva bozza"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Inserisci risposta rapida"</string>
- <string name="read_action" msgid="4701484794504781686">"Segna come già letto"</string>
- <string name="unread_action" msgid="6280399049357552826">"Segna come da leggere"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Aggiungi a Speciali"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Rimuovi da Speciali"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Aggiorna"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Aggiungi account"</string>
- <string name="compose_action" msgid="4045702519637388045">"Scrivi"</string>
- <string name="search_action" msgid="6325101454876682308">"Ricerca"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Impostazioni account"</string>
- <string name="settings_action" msgid="6334807007967459412">"Impostazioni"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Opzioni di sincronizzazione"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Segna come da leggere"</string>
- <string name="move_action" msgid="3059189775933985898">"Sposta"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Ccn"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Aggiungi Cc/Ccn"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Allega file"</string>
- <string name="close_action" msgid="533058985745238100">"Chiudi"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Invia tutti messaggi"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Scegli allegato"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Sposta in"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Caricamento messaggi..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Problema di connessione."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Impossibile caricare il testo del messaggio. Il messaggio potrebbe essere troppo grande per poter essere visualizzato."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Sposta messaggio"</item>
- <item quantity="other" msgid="371256717624461324">"Sposta messaggi"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Lo spostamento non è supportato negli account POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Impossibile spostare i messaggi perché la selezione contiene più account."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"I messaggi in Bozze, Posta in uscita e Posta inviata non possono essere spostati."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> da leggere (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> da leggere (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> da leggere (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"in <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> account"</item>
- <item quantity="other" msgid="2723797835410343458">"in <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> account"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"a <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> nuovi messaggi"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Tutti gli account"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> account"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> account"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Posta in arrivo"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Posta in uscita"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Bozze"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Cestino"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Inviati"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Posta indesiderata"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Da leggere"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Posta in arrivo (da leggere)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Posta in arrivo (tutti)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Visualizzazione combinata (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> account"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> account"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versione: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Posta in arrivo"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Speciali"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Bozze"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Posta in uscita"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Visualizzazione combinata"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Visualizza tutte le cartelle"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Account"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Cartelle recenti (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Tutte le cartelle"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Cartelle recenti"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Oggetto"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Nessun oggetto"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Carica ulteriori messaggi"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> selezionato"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> selezionato"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Nessun messaggio"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"In"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Ccn"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Oggetto"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Da:"</string>
- <string name="to" msgid="4392614766835725698">"A"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Ccn"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Oggetto"</string>
- <string name="body_hint" msgid="4279864165439577668">"Scrivi email"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Messaggio originale --------"\n"Oggetto: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Da: <xliff:g id="SENDER">%2$s</xliff:g>"\n"A: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> ha scritto:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Includi testo citato"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Includi testo"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Aggiungi almeno un destinatario."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Alcuni indirizzi email non sono validi."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"File troppo grande. Impossibile allegarlo."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Inserisci risposta rapida"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> e <xliff:g id="NUMBER">%2$d</xliff:g> altri"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"In:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Ccn:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Data:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Da:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Oggetto:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Visualizza"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Installa"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Riproduci"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Carica"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Info"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Salva"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Salvato"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Interrompi"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Allegato salvato come <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Impossibile salvare allegato."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Prima dell\'invio verranno scaricati uno o più allegati del messaggio inoltrato."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Messaggio"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Invito"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Allegato <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Allegati <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Mostra immagini"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Mostra sempre"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Mostra sempre le immagini da questo mittente"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Le immagini da questo mittente verranno mostrate automaticamente."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Visualizza in Calendario"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Invito di calendario"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Parteciperai?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Sì"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Forse"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" No"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Hai accettato questo invito."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Hai risposto \"forse\" a questo invito."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Hai rifiutato questo invito."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Mostra dettagli"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Dettagli messaggio"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Informazioni allegato"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Connessione Wi-Fi richiesta"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Impostazioni Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Impostazioni applicazione"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Impossibile aprire l\'allegato."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Impossibile salvare o aprire il file perché questo tipo di allegato potrebbe contenere software dannoso."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Impossibile salvare o aprire questo allegato a causa delle norme di sicurezza dell\'account in uso."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Questo allegato è troppo grande per il download su una rete mobile. Puoi scaricarlo la prossima volta che ti connetti a una rete Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Impossibile aprire questo allegato con le applicazioni installate. Prova a scaricare un\'applicazione adeguata da Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Questo allegato è un\'applicazione. Per poterla installare, devi selezionare l\'opzione \"Origini sconosciute\" in Impostazioni &gt; Applicazioni."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Non è possibile installare applicazioni direttamente dalla posta elettronica. Salva l\'applicazione, quindi installala utilizzando l\'applicazione Download."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Impossibile scaricare l\'allegato."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Si è verificato un errore durante la decodifica del messaggio."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"<xliff:g id="FILENAME">%s</xliff:g> visualizzato"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Eliminare questo messaggio?"</item>
- <item quantity="other" msgid="4437637377522896262">"Eliminare questi messaggi?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Messaggio eliminato."</item>
- <item quantity="other" msgid="6574961322865652255">"Messaggi eliminati."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Messaggio eliminato."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Messaggio salvato come bozza."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Impossibile visualizzare l\'allegato."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Impossibile caricare l\'allegato \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Apertura messaggio..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> messaggio spostato in <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> messaggi spostati in <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Impossibile inoltrare uno o più allegati."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Allegato non inoltrato"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Accesso a <xliff:g id="ACCOUNT_NAME">%s</xliff:g> non riuscito."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Accesso non riuscito"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Più recenti"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Meno recenti"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" - "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Impostazione account"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Account email"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Puoi configurare il tuo account in pochi passaggi."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Indirizzo email"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Password"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Invia email da questo account per impostazione predefinita"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Config. manuale"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Digita un indirizzo email e una password validi."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Account duplicato"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Utilizzi già questo nome utente per l\'account \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Questa password inizia o termina con uno o più spazi. Molti server non supportano le password contenenti spazi."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Recupero informazioni sull\'account…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Verifica impostazioni server della posta in arrivo..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Verifica impostazioni server posta in uscita…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Impostazione account"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Il tuo account è stato impostato e l\'email sarà presto disponibile."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Assegna un nome all\'account (facoltativo)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Il tuo nome (visualizzato nei messaggi in uscita)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Questo campo non può essere vuoto."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Impostazione account"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Tipo di account"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Di quale tipo di account si tratta?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Impostazione account"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Impostazioni server Posta in arrivo"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nome utente"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Password"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Porta"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipo di sicurezza"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nessuna"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Accetta tutti i certificati)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (accetta tutti i certificati)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Elimina email da server"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Mai"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Quando elimino da Posta in arrivo"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Prefisso percorso IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Facoltativo"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Impostazione account"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Impostazioni server Posta in uscita"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Server SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Porta"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipo di sicurezza"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Richiedi accesso"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nome utente"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Password"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Impostazione account"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Impostazioni server"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Server"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Dominio/nome utente"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Utilizza connessione sicura (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Accetta tutti i certificati SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certificato client"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Seleziona"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Usa certificato client"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Rimuovi"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Nessuno"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID dispositivo mobile"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Impostazioni account"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Opzioni account"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Frequenza di controllo Posta in arrivo"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Mai"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automatico (push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Ogni 5 minuti"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Ogni 10 minuti"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Ogni 15 minuti"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Ogni 30 minuti"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Ogni ora"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Invia email da questo account per impostazione predefinita"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Avvisami all\'arrivo di email"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sincronizza contatti di questo account"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sincronizza calendario di questo account"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sincronizza email di questo account"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Scarica allegati automaticamente quando connesso a Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Impossibile completare"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Giorni da sincronizzare"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatico"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Un giorno"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tre giorni"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Una settimana"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Due settimane"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Un mese"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Tutto"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Usa imp. predefinite account"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Password o nome utente errato."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Password o nome utente errato."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Impossibile connettersi in modo sicuro al server."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Impossibile connettersi in modo sicuro al server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"È necessario un certificato client. Vuoi connetterti al server con un certificato client?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certificato non valido o non accessibile."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Il server ha risposto con un errore. Controlla nome utente e password e riprova."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Impossibile connettersi al server."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Impossibile connettersi al server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS richiesto ma non supportato dal server."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"I metodi di autenticazione non sono supportati dal server."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Impossibile stabilire la connessione al server a causa di un errore di sicurezza."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Impossibile stabilire la connessione al server."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Hai digitato l\'indirizzo di un server sbagliato o il server richiede una versione di protocollo non supportata da Email."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Non sei autorizzato a effettuare la sincronizzazione con questo server. Contatta l\'amministratore del server per ulteriori informazioni."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Amministrazione sicurezza da remoto"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Il server <xliff:g id="SERVER">%s</xliff:g> richiede che tu consenta il controllo remoto di alcune funzionalità di sicurezza del tuo dispositivo Android. Completare la configurazione dell\'account?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Il server richiede funzioni di sicurezza non supportate dal tuo dispositivo Android, fra cui: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Non è possibile modificare il nome utente di un account. Per aggiungere un account con un altro nome utente, tocca Aggiungi account."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"AVVISO. La disattivazione dell\'autorità dell\'applicazione Email per l\'amministrazione del dispositivo comporterà l\'eliminazione di tutti gli account email che la richiedono, compresi i relativi messaggi email, contatti, eventi di calendario e altri dati."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Aggiornamento sicurezza"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> richiede l\'aggiornamento delle impostazioni di sicurezza."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"L\'account \"<xliff:g id="ACCOUNT">%s</xliff:g>\" non può essere sincronizzato a causa di requisiti di sicurezza."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"È richiesto l\'aggiornamento delle impostazioni di sicurezza per l\'account \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Impostazioni di sicurezza dell\'account \"<xliff:g id="ACCOUNT">%s</xliff:g>\" modificate; nessun intervento richiesto."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Aggiornamento sicurezza richiesto"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Criteri di sicurezza modificati"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Criteri sicurezza non rispettab."</string>
- <string name="account_security_title" msgid="3511543138560418587">"Sicurezza dispositivo"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Il server <xliff:g id="SERVER">%s</xliff:g> richiede che tu consenta il controllo remoto di alcune funzionalità di sicurezza del tuo dispositivo Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Modifica dettagli"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" richiede la modifica del PIN o della password di blocco dello schermo."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Password blocco schermo in scadenza"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Il PIN o la password di blocco dello schermo sono scaduti."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Password blocco schermo scaduta"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Password blocco schermo in scadenza"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Appena possibile devi cambiare il PIN o la password di blocco dello schermo; in caso contrario i dati di <xliff:g id="ACCOUNT">%s</xliff:g> verranno cancellati. Vuoi apportare la modifica ora?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Password blocco schermo scaduta"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"I dati relativi a <xliff:g id="ACCOUNT">%s</xliff:g> stanno per essere cancellati dal dispositivo. È possibile ripristinarli modificando il PIN o la password di blocco dello schermo. Vuoi apportare la modifica ora?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Ignorare le modifiche non salvate?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Impossibile accedere"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Password o nome utente di <xliff:g id="ACCOUNT">%s</xliff:g> errato. Vuoi aggiornarli ora?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Account predefinito"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Invia email da questo account per impostazione predefinita"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Scarica allegati"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Scarica automaticamente allegati messaggi recenti tramite Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Notifiche email"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Frequenza sincronizzazione, notifiche e altro."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Invia notifica all\'arrivo di email"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frequenza di controllo Posta in arrivo"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Impost. posta in arrivo"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nome utente, password e altre impostazioni server in entrata"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Impost. posta in uscita"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nome utente, password e altre impostazioni server in uscita"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Criteri applicati"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Nessuna"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Criteri non supportati"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Nessuna"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Tentativo di sincronizzazione"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Tocca qui per sincronizzare l\'account"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Nome account"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Nome"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Firma"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Risposte rapide"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Modifica il testo che inserisci spesso quando scrivi email"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Aggiungi testo ai messaggi inviati"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Impostazioni notifiche"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Utilizzo dati"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Criteri di sicurezza"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Modifica risposta rapida"</string>
- <string name="save_action" msgid="1988862706623227093">"Salva"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronizza contatti"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincronizza i contatti per questo account"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronizza calendario"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sincron. evento calendario account"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincronizza email"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincronizza le email per questo account"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrazione"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Attiva anche vibrazione all\'arrivo di email"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Sempre"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Solo in modalità silenziosa"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Mai"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibrazione"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Scegli suoneria"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Impostazioni server"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Rimuovi account"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"L\'account \"<xliff:g id="ACCOUNT">%s</xliff:g>\" verrà rimosso da Email."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Rimuovi account"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Rimuovi account"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Opzioni di sincronizzazione"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Opzioni di sincronizzazione (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Impostazioni di sincronizzazione"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Frequenza di controllo"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Giorni da sincronizzare"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Account email"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Scegli un account"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Seleziona una cartella"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Account non trovato. Potrebbe essere stato rimosso."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Cartella non trovata. Potrebbe essere stata rimossa."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Solo alcuni account \"Plus\" includono l\'accesso POP che consente la connessione del programma. Se non riesci ad accedere con l\'indirizzo email e la password corretti, potresti non disporre di un account \"Plus\" a pagamento. Avvia il browser web per avere accesso a questi account email."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Prima di configurare questo account email, visita il sito web T-Online e crea una password per l\'accesso email POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Aziendale"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Impossibile creare l\'account. Riprova."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Posta"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Abilita norme di sicurezza specificate dal server"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Ricerca in <xliff:g id="DOMAIN">%s</xliff:g>in corso"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> risultato da <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> risultati da <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Impostazioni"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Impostazioni generali"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Applicazione"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avanzamento automatico"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Seleziona schermata da visualizzare dopo eliminazione messaggio"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Nascondi caselle di controllo"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Negli elenchi di messaggi, tocca e tieni premuto per selezionare"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Conferma prima di eliminare"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Messaggi"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Conferma prima di inviare"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Messaggi"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Passa a"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Messaggio successivo"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Messaggio precedente"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Elenco messaggi"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Dimensioni testo messaggio"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Testo molto piccolo"</item>
- <item msgid="4415205108584620118">"Testo piccolo"</item>
- <item msgid="4550219696381691112">"Testo di dimensioni normali"</item>
- <item msgid="6227813549949219991">"Testo grande"</item>
- <item msgid="1197917420815786571">"Testo molto grande"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Dimensioni testo messaggio"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Molto piccole"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Piccole"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normali"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Grandi"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Molto grandi"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Rispondi a tutti"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Imposta \"Rispondi a tutti\" come opzione predefinita per le risposte"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Chiedi di mostrare le immagini"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Le immagini all\'interno dei messaggi non verranno visualizzate automaticamente"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Impostazioni di \"Mostra immagini\" cancellate."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> di <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"In attesa di sincronizzazione"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Le email verranno visualizzate a breve."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Icona per modificare"</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Posta in arr. combinata"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Da leggere"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Speciali"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Caricamento..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Tocca per configurare."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Non hai ancora impostato un account email."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Cerca email"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Cerca in <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Risultati di ricerca per \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"In attesa dei risultati"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Alcuni server possono richiedere molto tempo."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Cartelle"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Non consentire uso fotocamera dispositivo"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Richiedi password dispositivo"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Limita riutilizzo password recenti"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Richiedi scadenza password"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Richiedi dispos. inattivo per blocco schermo"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Limita numero di eventi calendario sincronizzati"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Limita numero di email sincronizzate"</string>
- <string name="quick_1" msgid="3426057697353380951">"Grazie."</string>
- <string name="quick_2" msgid="4188036352885736617">"Per me va bene."</string>
- <string name="quick_3" msgid="8061819976353395585">"Lo leggerò più tardi e ti farò sapere."</string>
- <string name="quick_4" msgid="3988974084396883051">"Organizziamo una riunione per discuterne."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Sincronizzazione dello sfondo per questo account disattivata durante il roaming."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Invio risposta in corso..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Nessun messaggio."</string>
-</resources>
diff --git a/email2/res/values-it/uploader.xml b/email2/res/values-it/uploader.xml
deleted file mode 100644
index 7441ef07c..000000000
--- a/email2/res/values-it/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Caricam. istantaneo"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Album caricamento istantaneo"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Caricamento"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Terminati"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"In pausa"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d foto • %3$d video"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d foto • %2$d video"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"batteria in esaurimento"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"quota foto superata"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"in attesa di Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"ritardata fino a ricarica"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"in attesa di connessione"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"nuovo tentativo tra %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Mostra caricamenti in attesa"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Mostra caricamenti terminati"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Visualizza online"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Mostra caricamenti in attesa"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Nascondi caricamenti in attesa"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Mostra dettagli"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Nascondi dettagli"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Impostazioni"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Data caricamento: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Account"</string>
- <string name="upload" msgid="2615541458361216022">"Carica"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Annulla"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Caricamento su "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" per "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Inizializzazione caricamento non riuscita."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"File non disponibile."</string>
- <string name="account_error" msgid="1904775271866104941">"Impossibile recuperare i dati dell\'account."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Errore durante l\'accesso all\'account."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"In attesa di nuovo tentativo"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"In attesa di Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Caricamento"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Non riuscito"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Completato"</string>
- <string name="pause_state_running" msgid="711411177620353982">"caricamento"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"messo in pausa manualmente"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"in pausa - batteria in esaurimento"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"in pausa - ritardata fino a ricarica"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"in pausa - in attesa di connessione"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"in pausa - quota PWA superata"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"in pausa - in attesa di Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"in pausa - roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"in attesa di nuovo tentativo"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minuto"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minuti"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minuti"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Nessuna connessione dati"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"L\'account ha superato la quota disco"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"File non trovato"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Errore del servizio"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Errore di rete"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Autenticazione non riuscita"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Caricamenti in attesa [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Caricamenti completati [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Sospendi caricamenti"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Riprendi caricamenti"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Carica ora"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Carica più tardi"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Non caricare"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Visualizza"</string>
- <string name="manager_retry" msgid="939534318469518843">"Riprova"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Caricamento annullato"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Caricamento già terminato"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sincronizza tutto"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Ultima sincronizzazione:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"L\'elenco di elementi terminati è vuoto."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Caricam. istantaneo"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Caricamenti terminati"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Caricamenti sospesi"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"La funzione Caricamento istantaneo non è stata ancora attivata"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"I file di grandi dimensioni verranno caricati solo tramite connessioni Wi-Fi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Ricerca file..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Preparazione di <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> foto e <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> video per il caricamento..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Nessun altro video/foto da caricare."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Si è verificato un problema di comunicazione con il server. Riprova più tardi."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Sincronizzazione di tutti gli elementi annullata"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sincronizza tutto"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Visualizza Completati"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Visualizza sospesi"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Generale"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Metti in pausa tutti i caricamenti"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Alimentazione"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Carica soltanto quando il telefono è in carica."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Carica soltanto quando è disponibile la rete Wi-Fi."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Foto"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Account"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Condizioni caricamento"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Dimensioni foto"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Video"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Account"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Per i caricamenti video verrà utilizzato l\'account Foto."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Condizioni caricamento"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Per il momento sono in uso le impostazioni di connettività delle foto."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Solo foto tramite reti mobili"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Foto e video tramite reti mobili"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Foto e video solo tramite Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Informazioni"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Vers. Caric. istant."</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Consigliate: 1600 pixel (per condivisione, stampe e screensaver)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Dimensioni originali (caricamento più lento)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"in pausa - scheda SD non disponibile"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Scheda SD non disponibile"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Impost. Caric. istant."</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Caricam. istantaneo"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Carica automaticamente nuove foto e nuovi video in un album web privato"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Stato del caricamento"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Avanzate"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Caricamenti dal cellulare"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Caricamenti in ​​roaming"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Carica foto e video durante il roaming su rete di dati"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Caricamento batteria"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Carica foto e video solo durante ricarica"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Carica foto esistenti"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Carica foto e video esistenti dal tuo telefono ora"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Disattivata"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Caricamento (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d di %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"In pausa: tocca per riprendere il caricamento"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Carica foto esistenti"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Caricare le foto e i video che non siano già stati caricati dal tuo telefono in un album privato sul Web può richiedere un po\' di tempo, ma sarà fatto in background. Continuare?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Sì"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"No"</string>
-</resources>
diff --git a/email2/res/values-iw/strings.xml b/email2/res/values-iw/strings.xml
deleted file mode 100644
index d2727bfed..000000000
--- a/email2/res/values-iw/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"קרא קבצים מצורפים לדוא\"ל"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"מאפשר ליישום לקרוא את הקבצים המצורפים לדוא\"ל."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"גש לנתוני ספק הדוא\"ל"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"מאפשר ליישום לגשת למסד הנתונים של הדוא\"ל שלך, כולל להודעות שהתקבלו, להודעות שנשלחו, לשמות משתמש ולסיסמאות."</string>
- <string name="app_name" msgid="5815426892327290362">"דוא\"ל"</string>
- <string name="compose_title" msgid="427986915662706899">"חבר הודעה"</string>
- <string name="debug_title" msgid="5175710493691536719">"ניקוי באגים"</string>
- <string name="next_action" msgid="3931301986364184415">"הבא"</string>
- <string name="okay_action" msgid="8365197396795675617">"אישור"</string>
- <string name="cancel_action" msgid="6967435583794021865">"ביטול"</string>
- <string name="previous_action" msgid="5181616311579820981">"הקודם"</string>
- <string name="send_action" msgid="1729766205562446418">"שלח"</string>
- <string name="reply_action" msgid="4262472229221507619">"השב"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"השב לכולם"</string>
- <string name="delete_action" msgid="8421026208288857155">"מחק"</string>
- <string name="forward_action" msgid="669174181042344116">"העבר"</string>
- <string name="favorite_action" msgid="4664259801498253756">"סמן בכוכב"</string>
- <string name="done_action" msgid="7497990549515580249">"סיום"</string>
- <string name="create_action" msgid="3062715563215392251">"צור חדש"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"מחק"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"אין תגובות מהירות."</string>
- <string name="discard_action" msgid="6532206074859505968">"מחק"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"שמור טיוטה"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"הוסף תגובה מהירה"</string>
- <string name="read_action" msgid="4701484794504781686">"סמן כנקרא"</string>
- <string name="unread_action" msgid="6280399049357552826">"סמן כלא נקרא"</string>
- <string name="set_star_action" msgid="4660317166196258160">"הוסף כוכב"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"הסר כוכב"</string>
- <string name="refresh_action" msgid="5951383001436708175">"רענן"</string>
- <string name="add_account_action" msgid="8835736309476033727">"הוסף חשבון"</string>
- <string name="compose_action" msgid="4045702519637388045">"חבר הודעה"</string>
- <string name="search_action" msgid="6325101454876682308">"חפש"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"הגדרות חשבון"</string>
- <string name="settings_action" msgid="6334807007967459412">"הגדרות"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"אפשרויות סנכרון"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"סמן כלא נקרא"</string>
- <string name="move_action" msgid="3059189775933985898">"העבר"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ עותק/עותק מוסתר"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"הוסף עותק/עותק מוסתר"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"צרף קובץ"</string>
- <string name="close_action" msgid="533058985745238100">"סגור"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"שלח את כל ההודעות"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"בחר קובץ מצורף"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"העבר אל"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"טוען הודעות..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"בעיה בחיבור."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"לא ניתן לטעון את טקסט ההודעה. ייתכן שההודעה גדולה מדי להצגה."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"העבר הודעה"</item>
- <item quantity="other" msgid="371256717624461324">"העבר הודעות"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"העברה אינה נתמכת בחשבונות POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"לא ניתן לבצע העברה מכיוון שהבחירה כוללת מספר חשבונות."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"לא ניתן להעביר הודעות שנמצאות בתיקיות \'טיוטות\', \'תיבת דואר יוצא\' ו\'פריטים שנשלחו\'."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> שלא נקראו (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> שלא נקראו (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> שלא נקראו (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"ב-<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> חשבונות"</item>
- <item quantity="other" msgid="2723797835410343458">"ב-<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> חשבונות"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"אל <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> הודעות חדשות"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"כל החשבונות"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"חשבון <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> חשבונות"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"תיבת דואר נכנס"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"תיבת דואר יוצא"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"טיוטות"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"אשפה"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"נשלח"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"ספאם"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"לא נקרא"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"דואר נכנס (לא נקראו)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"דואר נכנס (הכל)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"תצוגה משולבת (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"חשבון <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> חשבונות"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"גרסה: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"תיבת דואר נכנס"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"מסומן בכוכב"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"טיוטות"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"תיבת דואר יוצא"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"תצוגה משולבת"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"הצג את כל התיקיות"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"חשבונות"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"תיקיות אחרונות (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"כל התיקיות"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"תיקיות אחרונות"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"נושא"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"ללא נושא"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"טען הודעות נוספות"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> נבחרו"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> נבחרו"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"אין הודעות"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"אל"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"עותק"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"עותק מוסתר"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"נושא"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"מאת:"</string>
- <string name="to" msgid="4392614766835725698">"אל"</string>
- <string name="cc" msgid="7017720927911078193">"עותק"</string>
- <string name="bcc" msgid="3098643138241111579">"עותק מוסתר"</string>
- <string name="subject_hint" msgid="7253964583324677128">"נושא"</string>
- <string name="body_hint" msgid="4279864165439577668">"כתוב דוא\"ל"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- הודעה מקורית --------"\n"נושא: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"מאת: <xliff:g id="SENDER">%2$s</xliff:g>"\n"אל: <xliff:g id="TO">%3$s</xliff:g>"\n"עותק: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> כתב:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"כלול טקסט מצוטט"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"כלול טקסט"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"הוסף לפחות נמען אחד."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"חלק מכתובות הדוא\"ל אינן חוקיות."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"הקובץ גדול מדי ולא ניתן לצרף אותו."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"הוסף תגובה מהירה"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> ו-‏<xliff:g id="NUMBER">%2$d</xliff:g> אחרים"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"אל:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"עותקים:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"עותק מוסתר:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"תאריך:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"מאת:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"נושא:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"הצג"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"התקן"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"הפעל"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"טען"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"מידע"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"שמור"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"נשמר"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"עצור"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"קובץ מצורף נשמר בשם <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"לא ניתן לשמור את הקובץ המצורף."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"המערכת תוריד קובץ מצורף אחד או יותר בהודעה שהעברת לפני השליחה."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"הודעה"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"הזמן"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"קובץ מצורף <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"קבצים מצורפים <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"הצג תמונות"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"הצג תמיד"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"הצג תמיד תמונות משולח זה"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"תמונות משולח זה יוצגו באופן אוטומטי."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"הצג בלוח השנה"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"הזמנה בלוח השנה"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"האם תבוא\\י?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" כן"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" אולי"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" לא"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"אישרת את ההזמנה."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"השבת \'אולי\' להזמנה זו."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"דחית את ההזמנה."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"הצג פרטים"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"פרטי ההודעה"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"פרטי קובץ מצורף"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"נדרש חיבור Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"הגדרות Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"הגדרות יישום"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"לא ניתן לפתוח את הקובץ המצורף."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"לא ניתן לשמור או לפתוח קובץ זה משום שקבצים מצורפים מסוג זה עלולים להכיל תוכנה זדונית."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"לא ניתן לשמור או לפתוח קובץ מצורף זה בשל מדיניות האבטחה של החשבון."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"קובץ מצורף זה גדול מדי להורדה דרך רשת לנייד. תוכל להוריד אותו בפעם הבאה שתתחבר לרשת Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"לא מותקן יישום שיכול לפתוח קובץ מצורף זה. נסה להוריד יישום מתאים מ\'חנות Android\'."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"קובץ מצורף זה הוא יישום. עליך לסמן את \'מקורות לא ידועים\' ב\'הגדרות\' &gt; \'יישומים\' כדי להתקינו."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"לא ניתן להתקין יישומים ישירות מדוא\"ל. ראשית יש לשמור את היישום ולאחר מכן להתקין אותו באמצעות היישום \'הורדות\'."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"לא ניתן להוריד את הקובץ המצורף."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"אירעה שגיאה בעת פענוח ההודעה."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"צפייה בקובץ <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"למחוק הודעה זו?"</item>
- <item quantity="other" msgid="4437637377522896262">"למחוק את ההודעות?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"ההודעה נמחקה"</item>
- <item quantity="other" msgid="6574961322865652255">"ההודעות נמחקו."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"ההודעה נמחקה"</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"ההודעה נשמרה כטיוטה."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"לא ניתן להציג את הקובץ המצורף."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"לא ניתן היה לטעון את הקובץ המצורף \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"פותח הודעה…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"הודעה <xliff:g id="NUM_MESSAGE">%1$d</xliff:g> הועברה אל <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> הודעות הועברו אל <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"לא ניתן להעביר קובץ מצורף אחד או יותר."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"הקובץ המצורף לא הועבר"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"הכניסה ל-<xliff:g id="ACCOUNT_NAME">%s</xliff:g> נכשלה."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"לא ניתן היה להיכנס"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"‎<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"‎<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"‎<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"‎<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"‎<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"‎<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"‎<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"‎<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"חדש יותר"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"ישן יותר"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"הגדרת חשבון"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"חשבון דוא\"ל"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"ניתן להגדיר את החשבון במספר פעולות פשוטות."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"כתובת דוא\"ל"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"סיסמה"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"שלח דוא\"ל מחשבון זה כברירת מחדל"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"הגדרה ידנית"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"הקלד כתובת דוא\"ל וסיסמה חוקיות."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"חשבון משוכפל"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"אתה כבר משתמש בשם משתמש זה עבור החשבון \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"סיסמה זו מתחילה או מסתיימת בתו רווח אחד או יותר. שרתים רבים אינם תומכים בסיסמאות המכילות רווחים."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"מאחזר פרטי חשבון..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"בודק הגדרות שרת דואר נכנס..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"בודק הגדרות שרת דואר יוצא..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"הגדרת חשבון"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"החשבון שלך הוגדר והדוא\"ל בדרך!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"תן שם לחשבון זה (אופציונלי)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"שמך (מוצג בהודעות יוצאות)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"שדה זה לא יכול להיות ריק."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"הגדרת חשבון"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"סוג חשבון"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"איזה סוג חשבון זה?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"הגדרת חשבון"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"הגדרות שרת דואר נכנס"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"שם משתמש"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"סיסמה"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"שרת"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"יציאה"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"סוג אבטחה"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"ללא"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (קבל את כל האישורים)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (קבל את כל האישורים)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"מחק דוא\"ל מהשרת"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"אף פעם"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"בעת מחיקה מתיבת דואר נכנס"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"קידומת נתיב IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"אופציונלי"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"הגדרת חשבון"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"הגדרות של שרת דואר יוצא"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"שרת SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"יציאה"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"סוג אבטחה"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"דרושה כניסה"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"שם משתמש"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"סיסמה"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"הגדרת חשבון"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"הגדרות שרת"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"שרת"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"דומיין/שם משתמש"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"השתמש בחיבור מאובטח (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"קבל את כל אישורי ה-SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"אישור לקוח"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"בחר"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"השתמש באישור לקוח"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"הסר"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"ללא"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"מזהה מכשיר נייד"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"הגדרות חשבון"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"אפשרויות חשבון"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"תדירות הבדיקה של דואר נכנס"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"אף פעם"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"אוטומטית (Push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"כל 5 דקות"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"כל 10 דקות"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"כל 15 דקות"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"כל 30 דקות"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"כל שעה"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"שלח דוא\"ל מחשבון זה כברירת מחדל"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"הודע לי כשמגיע דוא\"ל"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"סנכרן אנשי קשר מחשבון זה"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"סנכרן את לוח השנה מחשבון זה"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"סנכרן דוא\"ל מחשבון זה"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"הורד קבצים מצורפים באופן אוטומטי כאשר יש חיבור ל-Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"לא ניתן להשלים את הפעולה"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"ימים לסינכרון"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"אוטומטי"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"יום אחד"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"שלושה ימים"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"שבוע אחד"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"שבועיים"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"חודש אחד"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"הכל"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"השתמש בברירת המחדל של החשבון"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"שם המשתמש או הסיסמה שגויים."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"שם המשתמש או הסיסמה שגויים. "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"לא ניתן להתחבר לשרת באופן בטוח."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"לא ניתן להתחבר לשרת באופן בטוח."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"דרוש אישרו לקוח. האם אתה רוצה להתחבר לשרת עם אישור לקוח?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"האישור אינו חוקי או שלא ניתן לגשת אליו."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"השרת הגיב עם שגיאה. בדוק את שם המשתמש והסיסמה ונסה שוב."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"לא ניתן להתחבר לשרת."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"לא ניתן להתחבר לשרת."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS נדרש אך אינו נתמך בשרת."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"השרת אינו תומך בשיטות האימות."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"לא ניתן לפתוח חיבור לשרת בשל שגיאת אבטחה."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"לא ניתן לפתוח חיבור לשרת."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"הקלדת כתובת שרת שגויה, או שהשרת דורש גירסת פרוטוקול שאינה נתמכת על ידי הדוא\"ל."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"אין לך אישור לסנכרן באמצעות שרת זה. צור קשר עם מנהל המערכת של השרת לקבלת מידע נוסף."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"ניהול אבטחה מרחוק"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"השרת <xliff:g id="SERVER">%s</xliff:g> דורש שתאפשר לו שליטה מרחוק על תכונות אבטחה מסוימות במכשיר Android שלך. האם ברצונך לסיים הגדרת חשבון זה?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"שרת זה מחייב תכונות אבטחה שמכשיר ה-Android שלך אינו תומך בהן, כולל: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"לא ניתן לשנות את שם המשתמש של חשבון. כדי להוסיף חשבון עם שם משתמש אחר, גע באפשרות \'הוסף חשבון\'."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"אזהרה: השבתת ההרשאה של יישום הדוא\"ל לטפל במכשיר תגרום למחיקת כל חשבונות הדוא\"ל שמחייבים הרשאה זו, כולל הודעות הדוא\"ל, אנשי הקשר, האירועים בלוח השנה ונתונים אחרים."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"עדכון אבטחה"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> מחייב עדכון של הגדרות האבטחה שלך."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"לא ניתן לסנכרן את החשבון \"<xliff:g id="ACCOUNT">%s</xliff:g>\" עקב דרישות אבטחה."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"החשבון \"<xliff:g id="ACCOUNT">%s</xliff:g>\" דורש עדכון של הגדרות אבטחה."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"חשבון \"<xliff:g id="ACCOUNT">%s</xliff:g>\" שינה את הגדרות האבטחה שלו; לא נדרשת כל פעולה מצד המשתמש."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"נדרש עדכון אבטחה"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"מדיניות האבטחה השתנתה"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"לא ניתן לקיים את הוראות מדיניות האבטחה"</string>
- <string name="account_security_title" msgid="3511543138560418587">"אבטחת המכשיר"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"השרת <xliff:g id="SERVER">%s</xliff:g> דורש שתאפשר לו שליטה מרחוק על תכונות אבטחה מסוימות במכשיר ה-Android שלך."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"ערוך פרטים"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" מחייב שתשנה את קוד ה-PIN או הסיסמה שלך לנעילת המסך."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"תוקף הסיסמה של נעילת המסך עומד לפוג"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"פג תוקף ה-PIN או הסיסמה של נעילת המסך שלך."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"פג תוקף הסיסמה של נעילת המסך"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"תוקף הסיסמה של נעילת המסך עומד לפוג"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"עליך לשנות את ה-PIN או הסיסמה המשמשים לנעילת מסך, אחרת הנתונים של <xliff:g id="ACCOUNT">%s</xliff:g> יימחקו. האם ברצונך להשנות כעת?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"פג תוקף הסיסמה של נעילת המסך"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"הנתונים עבור <xliff:g id="ACCOUNT">%s</xliff:g> נמחקים מהמכשיר שלך. תוכל לשחזר אותם על ידי שינוי ה-PIN או הסיסמה של נעילת המסך. האם ברצונך לשנות כעת?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"למחוק שינויים שלא נשמרו?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"לא ניתן להיכנס"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"שם המשתמש או הסיסמה עבור <xliff:g id="ACCOUNT">%s</xliff:g> שגוי. האם ברצונך לעדכן כעת?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"חשבון ברירת מחדל"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"שלח דוא\"ל מחשבון זה כברירת מחדל"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"הורד קבצים מצורפים"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"הורד באופן אוטומטי קבצים מצורפים להודעות שהתקבלו לאחרונה באמצעות WiFi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"התראות דוא\"ל"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"תדירות סינכרון, התראות וכדומה"</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"שלח הודעה כשמגיע דוא\"ל"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"תדירות בדיקה של דואר נכנס"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"הגדרות דואר נכנס"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"שם משתמש, סיסמה והגדרות אחרות של שרת דואר נכנס"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"הגדרות דואר יוצא"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"שם משתמש, סיסמה והגדרות אחרות של שרת דואר יוצא"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"מדיניות שנאכפה"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"ללא"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"מדיניות לא נתמכת"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"ללא"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"נסה לסנכרן"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"גע כאן כדי לסנכרן חשבון זה"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"שם חשבון"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"השם שלך"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"חתימה"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"תגובות מהירות"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"ערוך טקסט שאתה מוסיף לעתים קרובות בזמן כתיבת דוא\"ל"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"צרף טקסט להודעות שאתה שולח"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"הגדרות התראה"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"שימוש בנתונים"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"מדיניות אבטחה"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"ערוך תגובה מהירה"</string>
- <string name="save_action" msgid="1988862706623227093">"שמור"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"סנכרן אנשי קשר"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"סנכרן אנשי קשר בחשבון זה"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"סנכרן יומן"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"סינכרון אירוע לוח שנה עבור חשבון זה"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"סנכרן דוא\"ל"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"סנכרן דוא\"ל בחשבון זה"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"רטט"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"הוסף גם רטט כשמגיע דוא\"ל"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"תמיד"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"במצב שקט בלבד"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"אף פעם"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"רטט"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"בחר רינגטון"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"הגדרות שרת"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"הסר חשבון"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"החשבון \"<xliff:g id="ACCOUNT">%s</xliff:g>\" יוסר מהדוא\"ל."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"הסר חשבון"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"הסר חשבון"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"אפשרויות סינכרון"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"אפשרויות סנכרון ( <xliff:g id="MAILBOXX_NAME">%s</xliff:g> )"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"הגדרות סינכרון"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"תדירות בדיקות"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"ימים לסינכרון"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"חשבון דוא\"ל"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"בחר חשבון"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"בחר תיקיה"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"החשבון לא נמצא. ייתכן שהוסר."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"התיקיה לא נמצאה. ייתכן שהוסרה."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"רק חשבונות \"Plus\" מסוימים כוללים גישה ל-POP, שמאפשרת לתוכנית זו להתחבר. אם אינך מצליח להיכנס עם כתובת הדוא\"ל והסיסמה הנכונות שלך, ייתכן שאין לך חשבון \"Plus\" בתשלום. הפעל את דפדפן האינטרנט כדי לקבל גישה לחשבונות דוא\"ל אלה."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"לפני הגדרת חשבון דוא\"ל זה, בקר באתר T-Online וצור סיסמה לגישה לדוא\"ל מסוג POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"תאגידי"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"לא ניתן ליצור את החשבון. נסה שוב."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"דוא\"ל"</string>
- <string name="device_admin_description" msgid="426727923791430306">"מאפשר מדיניות אבטחה המצוינת בשרת"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"מחפש את <xliff:g id="DOMAIN">%s</xliff:g>..."</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"תוצאה <xliff:g id="RESULTS">%1$d</xliff:g> מ-<xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> תוצאות מ-<xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"הגדרות"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"הגדרות כלליות"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"יישום"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"התקדמות אוטומטית"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"בחר איזה מסך יוצג לאחר מחיקת הודעה"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"הסתר תיבות סימון"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"ברשימות של הודעות, גע והחזק כדי לבחור"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"אשר לפני מחיקה"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"הודעות"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"אשר לפני שליחה"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"הודעות"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"התקדם אל"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"הודעה חדשה יותר"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"הודעה ישנה יותר"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"רשימת הודעות"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"גודל טקסט בהודעה"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"טקסט קטנטן"</item>
- <item msgid="4415205108584620118">"טקסט קטן"</item>
- <item msgid="4550219696381691112">"טקסט בגודל רגיל"</item>
- <item msgid="6227813549949219991">"טקסט גדול"</item>
- <item msgid="1197917420815786571">"טקסט ענק"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"גודל טקסט בהודעה"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"פיצפון"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"קטן"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"רגיל"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"גדול"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"ענק"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"השב לכולם"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"הפוך את \'השב לכולם\' לברירת המחדל של מענה להודעות"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"בקש להציג תמונות"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"תמונות בהודעות לא יוצגו באופן אוטומטי"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"רשימת \'הצג תמונות\' נוקתה."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> מתוך <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"ממתין לסינכרון"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"הדוא\"ל שלך יופיע בקרוב."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"גע בסמל כדי לשנות."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"דואר נכנס משולב"</string>
- <string name="widget_unread" msgid="4404711399009077833">"לא נקרא"</string>
- <string name="widget_starred" msgid="8290352707134011791">"מסומן בכוכב"</string>
- <string name="widget_loading" msgid="2340962056927255554">"טוען..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"גע כדי להגדיר."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"עוד לא הגדרת חשבון דואר אלקטרוני."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"חפש דוא\"ל"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"חפש ב-<xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"תוצאות חיפוש עבור \'<xliff:g id="ID_1">%1$s</xliff:g>\'"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"ממתין לתוצאות"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"שרתים מסוימים עשויים לדרוש זמן רב."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"תיקיות"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"אל תאפשר שימוש במצלמה של המכשיר"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"נדרשת סיסמת מכשיר"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"הגבל את השימוש החוזר בסיסמאות אחרונות"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"נדרשת תפוגת סיסמאות"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"כפה נעילת מסך של מכשיר לא פעיל"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"הגבל את מספר אירועי לוח השנה המסונכרנים"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"הגבל את מספר פריטי הדוא\"ל המסונכרנים"</string>
- <string name="quick_1" msgid="3426057697353380951">"תודה!"</string>
- <string name="quick_2" msgid="4188036352885736617">"נשמע לי טוב!"</string>
- <string name="quick_3" msgid="8061819976353395585">"אקרא את זה מאוחר יותר ואחזור אליך."</string>
- <string name="quick_4" msgid="3988974084396883051">"בוא נקבע פגישה כדי לדון בנושא זה."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"סינכרון ברקע של חשבון זה מושבת בזמן נדידה."</string>
- <string name="confirm_response" msgid="5747902757569543165">"שולח תגובה..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"אין הודעות."</string>
-</resources>
diff --git a/email2/res/values-iw/uploader.xml b/email2/res/values-iw/uploader.xml
deleted file mode 100644
index 4d34fdf06..000000000
--- a/email2/res/values-iw/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"העלאה מיידית"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"האלבום \'העלאה מיידית\'"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"העלאה"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"העלאות שהסתיימו"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"מושהה"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • ‏%2$d תמונות • %3$d סרטוני וידאו"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d תמונות • %2$d סרטוני וידאו"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"סוללה חלשה"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"חריגה ממכסת התמונות"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"נדידה"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"ממתין ל-WiFi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"מעוכב עד לטעינה"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"ממתין לחיבור"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"מנסה שוב בתוך %S"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"הצג העלאות ממתינות"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"הצג העלאות שהסתיימו"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"הצג באופן מקוון"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"הצג העלאות ממתינות"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"הסתר העלאות ממתינות"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"הצג פרטים"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"הסתר פרטים"</string>
- <string name="menu_settings" msgid="5088116127086866634">"הגדרות"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"הועלה בתאריך %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"חשבון"</string>
- <string name="upload" msgid="2615541458361216022">"העלה"</string>
- <string name="ok" msgid="2516349681897895312">"אישור"</string>
- <string name="cancel" msgid="1207103189404543868">"ביטול"</string>
- <string name="uploading_to" msgid="3986362895940069510">"מעלה אל "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" עבור "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"הפעלת ההעלאה נכשלה."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"הקובץ לא זמין."</string>
- <string name="account_error" msgid="1904775271866104941">"אחזור פרטי החשבון נכשל."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"היתה בעיה בכניסה לחשבונך."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"ממתין לניסיון חוזר"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"ממתין ל-WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"העלאה מתבצעת"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"נכשל"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"הושלם"</string>
- <string name="pause_state_running" msgid="711411177620353982">"מעלה"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"מושהה באופן ידני"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"הושהה - סוללה חלשה"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"מושהה - מעוכב עד לטעינה"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"מושהה - ממתין לחיבור"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"הושהה - חריגה ממיכסת PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"מושהה - ממתין ל-WiFi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"מושהה - בנדידה"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"ממתין לניסיון חוזר"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"דקה אחת"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 דקות"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 דקות"</string>
- <string name="retry_no_data" msgid="630347885498641534">"אין חיבור נתונים"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"אזלה מכסת הדיסק עבור החשבון"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"הקובץ לא נמצא"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"שגיאת שירות"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"שגיאת רשת"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"האימות נכשל"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"העלאות ממתינות [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"העלאות שהושלמו [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"השהה העלאות"</string>
- <string name="manager_resume" msgid="1608630525599824933">"המשך בהעלאות"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"העלה עכשיו"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"העלה מאוחר יותר"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"אל תעלה"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"הצג"</string>
- <string name="manager_retry" msgid="939534318469518843">"נסה שוב"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"ההעלאה בוטלה"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"ההעלאה כבר הסתיימה"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"סנכרן הכל"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"סינכרון אחרון:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"רשימת הפריטים שהסתיימו ריקה."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"העלאה מיידית"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"ההעלאות הסתיימו"</string>
- <string name="notify_paused" msgid="3999817913227671338">"ההעלאות הושהו"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"\'העלאה מיידית\' לא הופעלה עדיין"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"קבצים גדולים יועלו דרך חיבור WiFi בלבד."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"סורק לאיתור קבצים..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"מכין <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> תמונות ו-<xliff:g id="VIDEOCOUNT">%2$d</xliff:g> סרטוני וידאו להעלאה..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"אין צורך להעלות תמונות/סרטוני וידאו נוספים."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"אירעה בעיה בתקשורת עם השרת. נסה שוב מאוחר יותר."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"האפשרות \'סנכרן הכל\' מבוטלת"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"סנכרן הכל"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"הצג העלאות שהושלמו"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"הצג העלאות ממתינות"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"כללי"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"השהה את כל ההעלאות"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"טעינה"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"העלה רק כשהטלפון בטעינה."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"העלה רק כאשר Wi-Fi זמין."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"תמונות"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"חשבון"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"תנאי העלאה"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"גודל תמונה"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"סרטוני וידאו"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"חשבון"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"חשבון התמונות ישמש להעלאות סרטוני וידאו."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"תנאי העלאה"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"נעשה שימוש בינתיים בהגדרות קישוריות של תמונות."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"רק תמונות דרך רשתות לנייד"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"תמונות וסרטוני וידאו דרך רשתות לנייד"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"תמונות וסרטוני וידאו באמצעות Wi-Fi בלבד"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"אודות"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"גרסת \'העלאה מיידית\'"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"מומלץ: 1,600 פיקסלים (לשיתוף, הדפסות ושומרי מסך)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"גודל מקורי (ההעלאה האיטית ביותר)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"מושהה - כרטיס SD לא זמין"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"כרטיס SD לא זמין"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"הגדרות \'העלאה מיידית\'"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"העלאה מיידית"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"העלה באופן אוטומטי תמונות וסרטוני וידאו חדשים לאלבום פרטי באינטרנט"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"סטטוס העלאה"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"מתקדם"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"העלאות לנייד"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"העלאות בזמן נדידה"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"העלה תמונות וסרטוני וידאו בעת נדידה ברשת נתונים"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"העלאות בעת טעינת סוללה"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"העלה תמונות וסרטוני וידאו רק בעת טעינה"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"העלאת תמונות קיימות"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"העלה תמונות וסרטוני וידאו קיימים מהטלפון שלך כעת"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"מושבת"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"מעלה (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d מתוך %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"מושהה: גע כדי לחדש את ההעלאה"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"העלאת תמונות קיימות"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"העלאת תמונות וסרטוני וידאו שעדיין לא הועלו מהטלפון שלך לאלבום פרטי באינטרנט עשויה להימשך זמן מה, אך תתבצע ברקע. האם אתה בטוח שברצונך להמשיך?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"כן"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"לא"</string>
-</resources>
diff --git a/email2/res/values-ja/uploader.xml b/email2/res/values-ja/uploader.xml
deleted file mode 100644
index bcd33ca87..000000000
--- a/email2/res/values-ja/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"インスタントアップロード"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"インスタントアップロードのアルバム"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"アップロード中"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"完了"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"一時停止"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% - 画像%2$d件 - 動画%3$d件"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"画像%1$d件 - 動画%2$d件"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"電池残量低下"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"画像の割り当て容量の上限を超過"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"ローミング中"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"Wi-Fiを待機中"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"充電まで保留"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"接続を待機中"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"%s後に再試行"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"保留中のアップロードを表示"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"完了したアップロードを表示"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"オンラインで表示"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"保留中のアップロードを表示"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"保留中のアップロードを表示しない"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"詳細を表示"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"詳細を表示しない"</string>
- <string name="menu_settings" msgid="5088116127086866634">"設定"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"アップロード済み: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"アカウント"</string>
- <string name="upload" msgid="2615541458361216022">"アップロード"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"キャンセル"</string>
- <string name="uploading_to" msgid="3986362895940069510"><b>"%s"</b>"にアップロードしています"</string>
- <string name="uploading_for" msgid="1735961974624867111">" (ユーザー: "<b>"%s"</b>")"</string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s「%2$s」"</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"アップロードの初期化に失敗しました。"</string>
- <string name="toast_file_error" msgid="1315722681020841350">"ファイルにアクセスできません。"</string>
- <string name="account_error" msgid="1904775271866104941">"アカウント情報を取得できませんでした。"</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"アカウントへのログインで問題が発生しました。"</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"再試行を待機中"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Wi-Fi接続を待機中"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"アップロード中"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"失敗"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"完了"</string>
- <string name="pause_state_running" msgid="711411177620353982">"アップロード中"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"手動により一時停止"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"一時停止 - 電池残量低下"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"一時停止 - 充電まで保留"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"一時停止 - 接続を待機中"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"一時停止 - PWA割り当て容量の不足"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"一時停止 - Wi-Fiを待機中"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"一時停止 - ローミング中"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"再試行を待機中"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1分"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2分"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5分"</string>
- <string name="retry_no_data" msgid="630347885498641534">"データ接続がありません"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"アカウントに割り当てられたディスク容量の上限を超えています"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"ファイルが見つかりません"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"サービスエラー"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"ネットワークエラー"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"認証できませんでした"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"保留中のアップロード(%d)"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"完了したアップロード(%d)"</string>
- <string name="manager_pause" msgid="7046645023617816964">"アップロードを一時停止"</string>
- <string name="manager_resume" msgid="1608630525599824933">"アップロードを再開"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"今すぐアップロード"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"後でアップロード"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"アップロードしない"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"表示"</string>
- <string name="manager_retry" msgid="939534318469518843">"再試行"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"アップロードをキャンセルしました"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"アップロードは既に完了しています"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"すべて同期"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"最終同期: "\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"完了アイテムリストが空です。"</string>
- <string name="notify_uploads" msgid="8593982942665493037">"インスタントアップロード"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"アップロードが完了しました"</string>
- <string name="notify_paused" msgid="3999817913227671338">"アップロードを一時停止しました"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"インスタントアップロードが有効になっていません"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"大きなファイルはWi-Fi接続時のみアップロードされます。"</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"ファイルをスキャンしています..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"画像<xliff:g id="PHOTOCOUNT">%1$d</xliff:g>件、動画<xliff:g id="VIDEOCOUNT">%2$d</xliff:g>件のアップロードを準備しています..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"アップロードの必要な画像/動画は他にありません。"</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"サーバーとの通信で問題が発生しました。しばらくしてからもう一度お試しください。"</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"同期をすべてキャンセルしました"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"すべて同期"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"完了済みを表示"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"保留中を表示"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"全般"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"アップロードをすべて一時停止"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"電源"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"端末充電時のみアップロードする。"</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Wi-Fiが利用できるときのみアップロードする。"</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"画像"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"アカウント"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"アップロード条件"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"画像サイズ"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"動画"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"アカウント"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"画像用のアカウントを動画のアップロードに使用します。"</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"アップロード条件"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"画像の接続設定を使用します。"</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"モバイルネットワークでは画像のみ送信"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"モバイルネットワークで画像と動画を送信"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Wi-Fi接続時にのみ画像と動画を送信"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"概要"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"インスタントアップロードのバージョン"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"推奨: 1600ピクセル(共有、印刷、スクリーンセーバー用)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"元のサイズ(最も遅いアップロード)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"一時停止 - SDカード使用不能"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SDカード使用不能"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"インスタントアップロード設定"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"インスタントアップロード"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"新しい画像と動画を限定公開のウェブアルバムに自動的にアップロード"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"アップロードステータス"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"詳細設定"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"モバイルアップロード"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"ローミング時にアップロード"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"データネットワークでのローミング時に画像と動画をアップロード"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"充電中にアップロード"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"充電時にのみ画像と動画をアップロード"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"既存の画像をアップロード"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"既存の画像と動画を携帯端末から今すぐアップロード"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"無効"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"アップロード中(%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d/%2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"一時停止:タップしてアップロードを再開"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"既存の画像をアップロード"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"アップロードしたことのない画像や動画の場合は、携帯端末からウェブ上の限定公開アルバムへのアップロードに時間がかかることがあります。ただし、処理はバックグラウンドで行われます。続行してもよろしいですか?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"はい"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"いいえ"</string>
-</resources>
diff --git a/email2/res/values-ko/strings.xml b/email2/res/values-ko/strings.xml
deleted file mode 100644
index 8303cfbab..000000000
--- a/email2/res/values-ko/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"이메일 첨부파일 읽기"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"앱이 이메일 첨부파일을 읽도록 허용합니다."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"이메일 제공업체 데이터 액세스"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"앱이 받은 메일, 보낸 메일, 사용자 이름 및 비밀번호를 포함하는 이메일 데이터베이스에 액세스하도록 허용합니다."</string>
- <string name="app_name" msgid="5815426892327290362">"이메일"</string>
- <string name="compose_title" msgid="427986915662706899">"편지쓰기"</string>
- <string name="debug_title" msgid="5175710493691536719">"디버그"</string>
- <string name="next_action" msgid="3931301986364184415">"다음"</string>
- <string name="okay_action" msgid="8365197396795675617">"확인"</string>
- <string name="cancel_action" msgid="6967435583794021865">"취소"</string>
- <string name="previous_action" msgid="5181616311579820981">"이전"</string>
- <string name="send_action" msgid="1729766205562446418">"전송"</string>
- <string name="reply_action" msgid="4262472229221507619">"답장"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"전체답장"</string>
- <string name="delete_action" msgid="8421026208288857155">"삭제"</string>
- <string name="forward_action" msgid="669174181042344116">"전달"</string>
- <string name="favorite_action" msgid="4664259801498253756">"별표"</string>
- <string name="done_action" msgid="7497990549515580249">"완료"</string>
- <string name="create_action" msgid="3062715563215392251">"새로 만들기"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"삭제"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"빠른 응답이 없습니다."</string>
- <string name="discard_action" msgid="6532206074859505968">"삭제"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"임시보관함에 저장"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"빠른 응답 삽입"</string>
- <string name="read_action" msgid="4701484794504781686">"읽음으로 표시"</string>
- <string name="unread_action" msgid="6280399049357552826">"읽지않음으로 표시"</string>
- <string name="set_star_action" msgid="4660317166196258160">"별표 표시"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"별표 삭제"</string>
- <string name="refresh_action" msgid="5951383001436708175">"새로고침"</string>
- <string name="add_account_action" msgid="8835736309476033727">"계정 추가"</string>
- <string name="compose_action" msgid="4045702519637388045">"편지쓰기"</string>
- <string name="search_action" msgid="6325101454876682308">"검색"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"계정 설정"</string>
- <string name="settings_action" msgid="6334807007967459412">"설정"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"동기화 옵션"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"읽지않음으로 표시"</string>
- <string name="move_action" msgid="3059189775933985898">"이동"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"참조/숨은참조 추가"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"참조/숨은참조 추가"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"파일 첨부"</string>
- <string name="close_action" msgid="533058985745238100">"닫기"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"메일 모두 보내기"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"첨부파일 선택"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"이동"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"메일 로드 중..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"연결에 문제가 있습니다."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"메일 텍스트를 로드하지 못했습니다. 메일이 너무 커서 표시할 수 없기 때문일 수 있습니다."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"메일 이동"</item>
- <item quantity="other" msgid="371256717624461324">"메일 이동"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"POP3 계정에서는 메일 이동이 지원되지 않습니다."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"선택하신 메일에 여러 계정이 포함되어 있어 이동할 수 없습니다."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"임시보관함, 보낼편지함, 보낸편지함의 메일은 이동할 수 없습니다."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"읽지 않은 메일 <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g>개(<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"읽지 않은 메일 <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g>개(<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"읽지 않은 메일 <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g>개(<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g>개 계정"</item>
- <item quantity="other" msgid="2723797835410343458">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g>개 계정"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"<xliff:g id="RECEIVER_NAME">%1$s</xliff:g>에게 보냄"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"새 메일 <xliff:g id="ID_1">%1$d</xliff:g>개"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"모든 계정"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"계정 <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>개"</item>
- <item quantity="other" msgid="8548760449976444566">"계정 <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>개"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"받은편지함"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"보낼편지함"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"임시보관함"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"휴지통"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"보낸편지함"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"스팸"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"읽지않음"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"받은편지함(읽지않음)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"받은편지함(모두)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"통합 보기(<xliff:g id="COUNT">%s</xliff:g>개)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g>개 계정"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g>개 계정"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"버전: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"받은편지함"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"별표편지함"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"임시보관함"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"보낼편지함"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"모든 받은편지함 보기"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"모든 폴더 표시"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"계정"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"최근 폴더(<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"모든 폴더"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"최근 폴더"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"제목"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"(제목 없음)"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"더 많은 메일 표시"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g>개 선택됨"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g>개 선택됨"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"메일이 없습니다."</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"받는사람"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"참조"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"숨은 참조"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"제목"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"보낸사람:"</string>
- <string name="to" msgid="4392614766835725698">"받는사람"</string>
- <string name="cc" msgid="7017720927911078193">"참조"</string>
- <string name="bcc" msgid="3098643138241111579">"숨은참조"</string>
- <string name="subject_hint" msgid="7253964583324677128">"제목"</string>
- <string name="body_hint" msgid="4279864165439577668">"이메일 작성"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- 원본 메일 --------"\n"제목: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"보낸사람: <xliff:g id="SENDER">%2$s</xliff:g>"\n"받는사람: <xliff:g id="TO">%3$s</xliff:g>"\n"참조: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>님이 작성:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"받은메일 포함"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"받은메일 포함"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"받는 사람을 한 명 이상 추가하세요."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"일부 이메일 주소가 올바르지 않습니다."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"파일이 너무 커서 첨부할 수 없습니다."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"빠른 응답 삽입"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> 외 <xliff:g id="NUMBER">%2$d</xliff:g>명"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"받는사람:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"참조:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"숨은 참조:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"날짜:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"보낸사람:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"제목:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"보기"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"설치"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"재생"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"로드"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"정보"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"저장"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"저장됨"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"중지"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"첨부파일을 <xliff:g id="FILENAME">%s</xliff:g>(으)로 저장했습니다."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"첨부파일을 저장하지 못했습니다."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"전달된 메일에 하나 이상의 첨부파일을 다운로드한 다음 전송합니다."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"메일"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"초대"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"첨부파일 <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>개"</item>
- <item quantity="other" msgid="974463163535515223">"첨부파일 <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>개"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"이미지 표시"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"항상 표시"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"이 발신자가 보낸 사진을 항상 표시"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"이 발신자가 보낸 이미지가 자동으로 표시됩니다."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"캘린더에서 보기"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"캘린더 초대"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"참석하시겠습니까?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" 수락"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" 미정"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" 거절"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"초대를 수락했습니다."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"이 초대에 \'미정\'으로 응답했습니다."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"초대를 거절했습니다."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"세부정보 표시"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"메일 세부정보"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"첨부파일 정보"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Wi-Fi 연결 필요"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Wi-Fi 설정"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"앱 설정"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"첨부파일을 열 수 없습니다."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"이러한 유형의 첨부파일에는 악성 소프트웨어가 포함되어 있을 수 있으므로 파일을 저장하거나 열 수 없습니다."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"계정의 보안 정책으로 인해 이 첨부파일을 저장하거나 열 수 없습니다."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"이 첨부파일은 너무 커서 모바일 네트워크를 통해 다운로드할 수 없습니다. Wi-Fi 네트워크에 연결되면 다운로드할 수 있습니다."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"이 첨부파일을 열 수 있는 앱이 설치되어 있지 않습니다. Android 마켓에서 적절한 앱을 다운로드하세요."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"이 첨부파일은 앱입니다. 설치하기 전에 설정 &gt; 앱에서 알 수 없는 출처를 확인해야 합니다."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"이메일에서 직접 앱을 설치할 수 없습니다. 먼저 이 앱을 저장한 다음 다운로드 앱을 사용하여 설치하세요."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"첨부파일을 다운로드할 수 없습니다."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"메일을 디코딩하는 동안 오류가 발생했습니다."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"<xliff:g id="FILENAME">%s</xliff:g> 보기"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"이 메일을 삭제하시겠습니까?"</item>
- <item quantity="other" msgid="4437637377522896262">"이 메일을 삭제하시겠습니까?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"메일을 삭제했습니다."</item>
- <item quantity="other" msgid="6574961322865652255">"메일을 삭제했습니다."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"메일을 삭제했습니다."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"메일이 임시보관함에 저장되었습니다."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"첨부파일을 표시할 수 없습니다."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"첨부파일 \'<xliff:g id="FILENAME">%s</xliff:g>\'을(를) 로드하지 못했습니다."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"메일을 여는 중…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"메일 <xliff:g id="NUM_MESSAGE">%1$d</xliff:g>개가 <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>(으)로 이동됨"</item>
- <item quantity="other" msgid="2286739630865943494">"메일 <xliff:g id="NUM_MESSAGE">%1$d</xliff:g>개가 <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>(으)로 이동됨"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"하나 이상의 첨부파일을 전달하지 못했습니다."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"첨부파일을 전달하지 못했습니다."</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g>에 로그인하지 못했습니다."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"로그인하지 못했습니다."</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"다음"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"이전"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"계정 설정"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"이메일 계정"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"간단하게 계정을 설정할 수 있습니다."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"이메일 주소"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"비밀번호"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"이 계정에서 이메일 보냄(기본값)"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"수동 설정"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"올바른 이메일 주소와 비밀번호를 입력하세요."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"중복 계정"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"이미 \'<xliff:g id="DUPLICATE">%s</xliff:g>\' 계정에 이 사용자 이름을 사용하고 있습니다."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"비밀번호의 시작 또는 끝에 하나 이상의 공백 문자가 있습니다. 서버 중에는 공백이 포함된 비밀번호를 지원하지 않는 것이 많습니다."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"계정 정보 검색 중..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"받는 서버 설정 확인 중..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"발신 서버 설정 확인 중..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"계정 설정"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"계정이 설정되었으며 이메일을 사용할 수 있습니다."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"계정 이름 지정(선택사항)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"이름(메일에 표시)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"이 입력란은 비워 둘 수 없습니다."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"계정 설정"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"계정 유형"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"계정 유형이 무엇입니까?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"계정 설정"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"수신 서버 설정"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"사용자 이름"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"비밀번호"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"서버"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"포트"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"보안 유형"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"없음"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS(모든 인증서 수락)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS(모든 인증서 수락)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"서버에서 이메일 삭제"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"안함"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"받은편지함에서 삭제할 때"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP 경로 접두사"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"선택사항"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"계정 설정"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"발신 서버 설정"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP 서버"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"포트"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"보안 유형"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"로그인 필요"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"사용자 이름"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"비밀번호"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"계정 설정"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"서버 설정"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"서버"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"도메인\\사용자 이름"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"보안 연결(SSL) 사용"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"모든 SSL 인증서 수락"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"클라이언트 인증서"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"선택"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"클라이언트 인증서 사용"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"삭제"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"선택 취소"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"휴대기기 ID"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"계정 설정"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"계정 옵션"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"받은편지함 확인 빈도"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"안함"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"자동(푸시)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"5분마다"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"10분마다"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"15분마다"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"30분마다"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"1시간마다"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"이 계정에서 이메일 보냄(기본값)"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"이메일이 오면 알림"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"이 계정에서 연락처 동기화"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"이 계정에서 캘린더 동기화"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"이 계정에서 이메일 동기화"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Wi-Fi에 연결되면 자동으로 첨부파일 다운로드"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"완료할 수 없음"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"동기화할 일 수"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"자동"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"하루"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"3일"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"1주"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"2주"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"1달"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"전체"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"계정 기본값 사용"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"사용자 이름 또는 비밀번호가 잘못되었습니다."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"사용자 이름 또는 비밀번호가 잘못되었습니다."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"서버에 안전하게 연결할 수 없습니다."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"서버에 안전하게 연결할 수 없습니다."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"클라이언트 인증서가 필요합니다. 클라이언트 인증서로 서버에 연결하시겠습니까?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"인증서가 잘못되었거나 액세스할 수 없습니다."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"서버에서 오류를 발견했습니다. 사용자 이름과 비밀번호를 확인한 다음 다시 시도해 주세요."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"서버에 연결할 수 없습니다."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"서버에 연결할 수 없습니다."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS가 필요하지만 서버에서 지원하지 않습니다."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"인증 방법이 서버에서 지원되지 않습니다."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"보안 오류 때문에 서버에 연결하지 못했습니다."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"서버에 연결할 수 없습니다."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"입력한 서버 주소가 잘못되었거나, 서버에 이메일에서 지원하지 않는 프로토콜 버전이 필요합니다."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"서버와 동기화할 권한이 없습니다. 자세한 내용은 서버 관리자에게 문의해 주세요."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"원격 보안 관리"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"<xliff:g id="SERVER">%s</xliff:g> 서버가 Android 기기의 몇 가지 보안 기능을 원격으로 제어할 수 있도록 해야 합니다. 이 계정 설정을 완료하시겠습니까?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"이 서버는 <xliff:g id="ERROR">%s</xliff:g> 등 Android 기기가 지원하지 않는 보안 기능을 필요로 합니다."</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"계정 사용자 이름을 변경할 수 없습니다. 다른 사용자 이름으로 계정을 추가하려면 \'계정 추가\'를 터치하세요."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"경고: 이메일 앱의 기기 관리 권한을 비활성화하면 관련된 모든 이메일 계정 및 이메일, 주소록, 캘린더 일정 및 기타 데이터가 모두 삭제됩니다."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"보안 업데이트"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g>의 보안 설정을 업데이트해야 합니다."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"\'<xliff:g id="ACCOUNT">%s</xliff:g>\' 계정이 보안 요구사항으로 인해 동기화될 수 없습니다."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"\'<xliff:g id="ACCOUNT">%s</xliff:g>\' 계정의 보안 설정을 업데이트해야 합니다."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"\'<xliff:g id="ACCOUNT">%s</xliff:g>\' 계정의 보안 설정이 변경되었습니다. 사용자의 조치는 필요하지 않습니다."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"보안 업데이트 필요"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"보안 정책 변경됨"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"보안 정책을 준수할 수 없음"</string>
- <string name="account_security_title" msgid="3511543138560418587">"기기 보안"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"<xliff:g id="SERVER">%s</xliff:g> 서버가 Android 기기의 몇 가지 보안 기능을 원격으로 제어할 수 있도록 해야 합니다."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"세부정보 수정"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\'<xliff:g id="ACCOUNT">%s</xliff:g>\'의 화면 잠금 PIN 또는 비밀번호를 변경해야 합니다."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"화면 잠금 비밀번호가 곧 만료될 예정입니다."</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"화면 잠금 PIN 또는 비밀번호가 만료되었습니다."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"화면 잠금 비밀번호가 만료되었습니다."</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"화면 잠금 비밀번호가 곧 만료될 예정입니다."</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"곧 화면 잠금 PIN 또는 비밀번호를 변경해야 하며, 변경하지 않으면 <xliff:g id="ACCOUNT">%s</xliff:g>의 데이터가 지워집니다. 지금 변경하시겠습니까?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"화면 잠금 비밀번호가 만료되었습니다."</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"<xliff:g id="ACCOUNT">%s</xliff:g>의 데이터가 기기에서 지워졌습니다. 화면 잠금 PIN 또는 비밀번호를 변경하면 데이터를 복구할 수 있습니다. 지금 변경하시겠습니까?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"저장되지 않은 변경사항을 삭제하시겠습니까?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"로그인하지 못했습니다."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"<xliff:g id="ACCOUNT">%s</xliff:g>의 사용자 이름 또는 비밀번호가 잘못되었습니다. 지금 업데이트하시겠습니까?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"기본 계정"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"기본적으로 이 계정에서 이메일 전송"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"첨부파일 다운로드"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Wi-Fi를 통해 최근 메일의 첨부파일을 자동으로 다운로드합니다."</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"이메일 알림"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"빈도 및 알림 등을 동기화합니다."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"이메일이 오면 알림을 보냄"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"받은편지함 확인 빈도"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"수신 설정"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"사용자 이름, 비밀번호 및 기타 받는 서버 설정"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"발신 설정"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"사용자 이름, 비밀번호 및 기타 보내는 서버 설정"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"적용 정책"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"선택 안함"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"지원되지 않는 정책"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"선택 안함"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"동기화 시도"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"이 계정을 동기화하려면 여기를 터치하세요."</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"계정 이름"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"이름"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"서명"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"빠른 응답"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"이메일을 작성할 때 자주 사용하는 텍스트 수정"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"보내는 메일에 텍스트 첨부"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"알림 설정"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"데이터 사용"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"보안 정책"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"빠른 응답 수정"</string>
- <string name="save_action" msgid="1988862706623227093">"저장"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"연락처 동기화"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"이 계정의 주소록을 동기화합니다."</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"캘린더 동기화"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"이 계정의 캘린더 일정을 동기화합니다."</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"이메일 동기화"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"이 계정의 이메일을 동기화합니다."</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"진동"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"이메일이 오면 진동도 함께 울림"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"항상"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"무음 시에만"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"안함"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"진동"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"벨소리 선택"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"서버 설정"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"계정 삭제"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"<xliff:g id="ACCOUNT">%s</xliff:g> 계정이 이메일에서 삭제됩니다."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"계정 삭제"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"계정 삭제"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"동기화 옵션"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"동기화 옵션(<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"동기화 설정"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"주파수 확인"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"동기화할 일 수"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"이메일 계정"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"계정 선택"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"폴더 선택"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"계정을 찾을 수 없습니다. 삭제되었을 수 있습니다."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"폴더를 찾을 수 없습니다. 삭제되었을 수 있습니다."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"일부 \'Plus\' 계정에만 이 프로그램에 연결할 수 있는 POP 액세스 권한이 있습니다. 올바른 이메일 주소와 비밀번호를 입력해도 로그인이 되지 않으면 유료 \'Plus\' 계정이 없기 때문일 수 있습니다. 이러한 이메일 계정에 액세스하려면 웹브라우저를 실행하세요."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"이메일 계정을 설정하기 전에 T-Online 웹사이트를 방문하고 POP3 이메일 액세스용 비밀번호를 만드세요."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Exchange 계정"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"계정을 만들지 못했습니다. 다시 시도해 주세요."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"이메일"</string>
- <string name="device_admin_description" msgid="426727923791430306">"서버별 보안 정책 사용"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"<xliff:g id="DOMAIN">%s</xliff:g> 검색 중..."</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="DOMAIN">%2$s</xliff:g>의 검색결과 <xliff:g id="RESULTS">%1$d</xliff:g>개"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="DOMAIN">%2$s</xliff:g>의 검색결과 <xliff:g id="RESULTS">%1$d</xliff:g>개"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"설정"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"일반 설정"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"애플리케이션"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"자동 진행"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"메일을 삭제한 다음 표시할 화면 선택"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"확인란 숨기기"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"메일 목록에서 길게 눌러 선택"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"삭제하기 전에 확인"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"메일"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"보내기 전에 확인"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"메일"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"이동"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"다음 메일"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"이전 메일"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"메일 목록"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"글꼴 크기"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"아주 작은 텍스트"</item>
- <item msgid="4415205108584620118">"작은 텍스트"</item>
- <item msgid="4550219696381691112">"보통 크기의 텍스트"</item>
- <item msgid="6227813549949219991">"큰 텍스트"</item>
- <item msgid="1197917420815786571">"아주 큰 텍스트"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"글꼴 크기"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"아주 작게"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"작게"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"보통"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"크게"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"아주 크게"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"전체답장"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"메일 답장 시, \'전체답장\'을 기본값으로 설정"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"사진을 표시하도록 요청"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"메일의 사진이 자동으로 표시되지 않음"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\'이미지 표시\'가 초기화되었습니다."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"동기화 대기 중"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"이메일이 곧 표시됩니다."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"변경하려면 아이콘을 터치합니다."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"모든 받은편지함"</string>
- <string name="widget_unread" msgid="4404711399009077833">"읽지않음"</string>
- <string name="widget_starred" msgid="8290352707134011791">"별표편지함"</string>
- <string name="widget_loading" msgid="2340962056927255554">"로드 중..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"설정하려면 터치하세요."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"아직 이메일 계정을 설정하지 않았습니다."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"이메일 검색"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"<xliff:g id="ID_1">%1$s</xliff:g> 검색"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"\'<xliff:g id="ID_1">%1$s</xliff:g>\'에 대한 검색결과"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"결과를 기다리는 중"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"일부 서버는 시간이 오래 걸릴 수 있습니다."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"폴더"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"기기 카메라 사용 허용 안함"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"기기 비밀번호 필요"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"최근 사용한 비밀번호 재사용 제한"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"비밀번호 만료 필요"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"유휴 상태인 기기 화면 잠금 필요"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"동기화된 캘린더 일정의 개수 제한"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"동기화된 이메일의 개수 제한"</string>
- <string name="quick_1" msgid="3426057697353380951">"감사합니다."</string>
- <string name="quick_2" msgid="4188036352885736617">"좋습니다."</string>
- <string name="quick_3" msgid="8061819976353395585">"나중에 읽어보고 연락 드리겠습니다."</string>
- <string name="quick_4" msgid="3988974084396883051">"회의에서 얘기해 봅시다."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"계정 백그라운드 동기화가 로밍하는 동안 사용 중지됩니다."</string>
- <string name="confirm_response" msgid="5747902757569543165">"응답을 보내는 중..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"메시지가 없습니다."</string>
-</resources>
diff --git a/email2/res/values-ko/uploader.xml b/email2/res/values-ko/uploader.xml
deleted file mode 100644
index 64dec285b..000000000
--- a/email2/res/values-ko/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"자동 업로드"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"자동 업로드 앨범"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"업로드 중"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"완료"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"일시중지됨"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • 사진 %2$d장 • 동영상 %3$d개"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"사진 %1$d장 • 동영상 %2$d개"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"배터리 전원 부족"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"사진 용량을 초과했습니다."</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"로밍 중"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"WiFi 대기 중"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"충전될 때까지 지연됨"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"연결 대기 중"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"%s 후에 다시 시도"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"대기 중인 업로드 표시"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"완료된 업로드 표시"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"온라인으로 보기"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"대기 중인 업로드 표시"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"대기 중인 업로드 숨기기"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"세부정보 표시"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"세부정보 숨기기"</string>
- <string name="menu_settings" msgid="5088116127086866634">"설정"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"업로드 날짜: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"계정"</string>
- <string name="upload" msgid="2615541458361216022">"업로드"</string>
- <string name="ok" msgid="2516349681897895312">"확인"</string>
- <string name="cancel" msgid="1207103189404543868">"취소"</string>
- <string name="uploading_to" msgid="3986362895940069510"><b>"%s"</b>"에 업로드"</string>
- <string name="uploading_for" msgid="1735961974624867111">" "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \'%2$s\'"</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"업로드 초기화에 실패했습니다."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"파일이 없습니다."</string>
- <string name="account_error" msgid="1904775271866104941">"계정 정보를 검색하지 못했습니다."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"계정에 로그인하는 동안 문제가 발생했습니다."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"재시도 대기 중"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"WiFi 대기 중"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"업로드 중"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"실패"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"완료됨"</string>
- <string name="pause_state_running" msgid="711411177620353982">"업로드 중"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"수동으로 일시중지됨"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"일시중지됨 - 배터리 전원 부족"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"일시중지됨 - 충전될 때까지 지연됨"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"일시중지됨 - 연결 대기중"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"일시중지됨 - Picasa 웹앨범 용량 초과"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"일시중지됨 - wifi 대기 중"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"일시중지됨 - 로밍 중"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"재시도 대기 중"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1분"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2분"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5분"</string>
- <string name="retry_no_data" msgid="630347885498641534">"데이터 연결 없음"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"계정의 디스크 용량이 부족합니다."</string>
- <string name="completed_no_file" msgid="6719715000947601844">"파일을 찾을 수 없음"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"서비스 오류"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"네트워크 오류"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"인증 실패"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"대기 중인 업로드 [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"완료된 업로드 [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"업로드 일시중지"</string>
- <string name="manager_resume" msgid="1608630525599824933">"업로드 다시 시작"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"지금 업로드"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"나중에 업로드"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"업로드 안함"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"보기"</string>
- <string name="manager_retry" msgid="939534318469518843">"다시 시도"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"업로드가 취소되었습니다."</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"업로드를 이미 완료했습니다."</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"모두 동기화"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"마지막 동기화 시간:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"완료된 항목 목록이 비어 있습니다."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"자동 업로드"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"업로드 완료됨"</string>
- <string name="notify_paused" msgid="3999817913227671338">"업로드 일시중지됨"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"자동 업로드가 아직 활성화되지 않았습니다."</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"대용량 파일은 WiFi 연결을 통해서만 업로드됩니다."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"파일 검색 중..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"업로드할 사진 <xliff:g id="PHOTOCOUNT">%1$d</xliff:g>장과 동영상 <xliff:g id="VIDEOCOUNT">%2$d</xliff:g>개를 준비하는 중..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"사진/동영상을 추가로 업로드할 필요가 없습니다."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"서버와 통신하는 중에 문제가 발생했습니다. 나중에 다시 시도해 주세요."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"모두 동기화 취소됨"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"모두 동기화"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"완료된 업로드 보기"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"대기 중인 업로드 보기"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"일반"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"모든 업로드 일시중지"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"전원"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"휴대전화가 충전 중일 때만 업로드합니다."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Wi-Fi가 사용 가능한 경우에만 업로드합니다."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"사진"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"계정"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"업로드 조건"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"사진 크기"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"동영상"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"계정"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"동영상 업로드에 사진 계정이 사용됩니다."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"업로드 조건"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"현재 사진 연결 설정이 사용되고 있습니다."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"모바일 네트워크를 통해 사진만 업로드"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"모바일 네트워크를 통해 사진과 동영상 업로드"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Wi-Fi를 통해서만 사진과 동영상 업로드"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"정보"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"자동 업로드 버전"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"권장: 1600픽셀(공유, 인쇄 및 스크린세이버용)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"원본 크기(가장 느린 업로드)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"일시중지됨 - SD 카드를 사용할 수 없음"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD 카드를 사용할 수 없음"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"자동 업로드 설정"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"자동 업로드"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"새 사진과 동영상을 자동으로 비공개 웹앨범에 업로드"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"업로드 상태"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"고급"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"모바일 업로드"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"로밍 중 업로드"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"데이터 네트워크에서 로밍 시 사진 및 동영상을 업로드합니다."</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"배터리 업로드"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"충전할 때만 사진과 동영상 업로드"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"기존 사진 업로드"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"지금 휴대전화에서 기존 사진 및 동영상 업로드"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"사용중지됨"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"업로드 중(%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d/%2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"일시중지됨: 업로드를 다시 시작하려면 터치"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"기존 사진 업로드"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"아직 업로드되지 않은 사진과 동영상을 휴대전화에서 비공개 웹앨범으로 업로드하려면 시간이 걸릴 수 있습니다. 이 작업은 백그라운드에서 진행됩니다. 계속하시겠습니까?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"예"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"아니요"</string>
-</resources>
diff --git a/email2/res/values-land/dimensions.xml b/email2/res/values-land/dimensions.xml
deleted file mode 100644
index 0f423b8a1..000000000
--- a/email2/res/values-land/dimensions.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- non-xlarge, landscape -->
-<resources>
- <dimen name="mailbox_list_width">160dip</dimen>
- <dimen name="message_list_width">160dip</dimen>
- <dimen name="action_bar_account_name_max_width">100dip</dimen>
- <dimen name="action_bar_mailbox_name_max_width">100dip</dimen>
- <dimen name="action_bar_mailbox_name_left_margin">8dip</dimen>
-
- <style name="SearchBar">
- <item name="android:layout_width">360dip</item>
- <item name="android:layout_height">match_parent</item>
- </style>
-
- <dimen name="compose_scrollview_width">800dip</dimen>
-</resources>
diff --git a/email2/res/values-land/styles.xml b/email2/res/values-land/styles.xml
deleted file mode 100644
index deb62c96e..000000000
--- a/email2/res/values-land/styles.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <style name="action_bar_unread_count">
- <item name="android:includeFontPadding">false</item>
- <item name="android:textSize">30sp</item>
- <item name="android:textColor">@color/text_ternary_color</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">end</item>
- </style>
-
- <style name="message_view_action_buttons" parent="android:Widget.Holo.Button.Borderless">
- <item name="android:layout_width">32dip</item>
- <item name="android:layout_height">24dip</item>
- <item name="android:layout_marginLeft">8dip</item>
- <item name="android:layout_marginRight">8dip</item>
- <item name="android:padding">2dip</item>
- </style>
-</resources>
diff --git a/email2/res/values-lt/strings.xml b/email2/res/values-lt/strings.xml
deleted file mode 100644
index cb741bcaa..000000000
--- a/email2/res/values-lt/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Skaityti el. laiškų priedus"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Leidžiama programai skaityti el. laiškų priedus."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Pasiekti el. pašto paslaugų teikėjo duomenis"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Leidžiama šiai programai pasiekti el. pašto duomenis, įskaitant gautus, išsiųstus pranešimus, naudotojų vardus ir slaptažodžius."</string>
- <string name="app_name" msgid="5815426892327290362">"El. paštas"</string>
- <string name="compose_title" msgid="427986915662706899">"Sukurti"</string>
- <string name="debug_title" msgid="5175710493691536719">"Derinti"</string>
- <string name="next_action" msgid="3931301986364184415">"Kitas"</string>
- <string name="okay_action" msgid="8365197396795675617">"Gerai"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Atšaukti"</string>
- <string name="previous_action" msgid="5181616311579820981">"Ankstesnis"</string>
- <string name="send_action" msgid="1729766205562446418">"Siųsti"</string>
- <string name="reply_action" msgid="4262472229221507619">"Atsakyti"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Atsakyti į visus"</string>
- <string name="delete_action" msgid="8421026208288857155">"Ištrinti"</string>
- <string name="forward_action" msgid="669174181042344116">"Persiųsti"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Žvaigždutė"</string>
- <string name="done_action" msgid="7497990549515580249">"Atlikta"</string>
- <string name="create_action" msgid="3062715563215392251">"Sukurti naują"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Ištrinti"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nėra greitų atsakymų."</string>
- <string name="discard_action" msgid="6532206074859505968">"Atmesti"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Išsaug. juodraš."</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Įterpti greitą atsaką"</string>
- <string name="read_action" msgid="4701484794504781686">"Žymėti raudonai"</string>
- <string name="unread_action" msgid="6280399049357552826">"Pažymėti kaip neperskaitytą"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Pridėti žvaigždutę"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Pašalinti žvaigždutę"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Atnaujinti"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Pridėti paskyrą"</string>
- <string name="compose_action" msgid="4045702519637388045">"Sukurti"</string>
- <string name="search_action" msgid="6325101454876682308">"Ieškoti"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Paskyros nustatymai"</string>
- <string name="settings_action" msgid="6334807007967459412">"Nustatymai"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Sinchronizavimo parinktys"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Pažymėti kaip neskaitytą"</string>
- <string name="move_action" msgid="3059189775933985898">"Perkelti"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ kop. / nemat. kop."</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Pridėti Cc / Bcc"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Pridėti failą"</string>
- <string name="close_action" msgid="533058985745238100">"Uždaryti"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Siųsti visus pranešimus"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Pasirinkti priedą"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Perkelti į"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Įkeliami pranešimai…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Ryšio problema."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Nepavyko įkelti pranešimo teksto. Galbūt pranešimas per ilgas, kad galėtumėte jį žiūrėti."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Perkelti pranešimą"</item>
- <item quantity="other" msgid="371256717624461324">"Perkelti pranešimus"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Perkėlimas nepalaikomas POP3 paskyrose."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Negalima perkelti, nes pasirinktos kelios paskyros."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Negalima perkelti pranešimų, esančių aplankuose „Juodraščiai“, „Išsiųstieji“ ir „Siunčiamieji“."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> neperskaityti (-ų) (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> neperskaityti (-ų) (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> neperskaityti (-ų) (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> paskyrose (-ų)"</item>
- <item quantity="other" msgid="2723797835410343458">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> paskyrose (-ų)"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"<xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"Naujų pranešimų: <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Visos paskyros"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"Paskyrų: <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="8548760449976444566">"Paskyrų: <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Gautų laiškų aplankas"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Išsiųstieji"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Juodraščiai"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Šiukšliadėžė"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Išsiųsta"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Šlamštas"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Neperskaityta"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Gautieji (neperskaityti)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Gautieji (visi)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Suj. rodinys (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> pask."</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> pask."</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versija: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Gautieji"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Pažymėta žvaigždute"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Juodraščiai"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Išsiųstieji"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Bendras rodinys"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Rodyti visus aplankus"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Paskyros"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Naujausi aplankai (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Visi aplankai"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Naujausi aplankai"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Tema"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Nėra temos"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Įkelti daugiau pranešimų"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"Pasirinkta: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="7901361399231876038">"Pasirinkta: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Pranešimų nėra"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Kam"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc (kopija)"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc (nematomoji kopija):"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Tema"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Nuo:"</string>
- <string name="to" msgid="4392614766835725698">"Kam:"</string>
- <string name="cc" msgid="7017720927911078193">"Kopija"</string>
- <string name="bcc" msgid="3098643138241111579">"Nemat. kop."</string>
- <string name="subject_hint" msgid="7253964583324677128">"Tema"</string>
- <string name="body_hint" msgid="4279864165439577668">"Kurti el. laišką"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Pirminis pranešimas --------"\n"Tema: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Nuo: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Kam: <xliff:g id="TO">%3$s</xliff:g>"\n"CC (kopija): <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> rašė:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Įtraukti cituojamą tekstą"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Įtraukti tekstą"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Pridėkite bent vieną gavėją."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Kai kurie el. pašto adresai neteisingi."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Failas per didelis, kad būtų pridėtas."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Įterpti greitą atsaką"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> ir <xliff:g id="NUMBER">%2$d</xliff:g> kiti (-ų)"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Kam:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc (kopija):"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc (nematomoji kopija):"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Data:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Nuo:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Tema:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Žiūrėti"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Įdiegti"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Paleisti"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Įkelti"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Inform."</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Išsaugoti"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Išsaugota"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Sustabdyti"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Priedas išsaugotas kaip <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Nepavyko išsaugoti priedo."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Prieš siunčiant persiųstame pranešime bus atsisiųstas mažiausiai vienas priedas."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Pranešimas"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Pakviesti"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> pried."</item>
- <item quantity="other" msgid="974463163535515223">"Priedų: <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Rodyti paveikslėlius"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Visada rodyti"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Visada rodyti iš šio siuntėjo gautus paveikslėlius"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Iš šio siuntėjo gauti paveikslėliai bus rodomi automatiškai."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Žiūrėti Kalendoriuje"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Kalendoriaus pakvietimas"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Dalyvausite?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Taip"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Gal"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Ne"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Priėmėte šį pakvietimą."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Į šį pakvietimą atsakėte „galbūt“."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Atmetėte šį pakvietimą."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Rodyti išsamią informaciją"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Išsami pranešimo informacija"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Priedo informacija"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Reikalingas „Wi-Fi“ ryšys"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"„Wi-Fi“ nustatymai"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Programos nustatymai"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Nepavyksta atidaryti priedo."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Negalima išsaugoti ar atidaryti šio failo, nes šio tipo priede gali būti kenkėjiška programinė įranga."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Šio priedo negalima išsaugoti ar atidaryti dėl šios paskyros saugos politikos."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Šis priedas yra per didelis, todėl jo atsisiųsti mobiliuoju tinklu negalima. Jį atsisiųsti galėsite, kai kitą kartą prisijungsite prie „Wi-Fi“ tinklo."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Nėra įdiegtos programos, kurią naudojant būtų galima atidaryti šį priedą. Pabandykite atsisiųsti tinkamą programą iš „Android“ prekyvietės."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Šis priedas – tai programa. Kad galėtumėte ją įdiegti, pirmiausia turite pažymėti „Nežinomi šaltiniai“ skiltyje „Nustatymai“ &gt; „Programos“."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Programų negalima įdiegti tiesiogiai iš el. pašto. Pirmiausia išsaugokite šią programą, tada įdiekite ją naudodami „Atsisiuntimų“ programą."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Nepavyko atsisiųsti priedo."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Iškoduojant pranešimą įvyko klaida."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Peržiūrimas <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Ištrinti šį pranešimą?"</item>
- <item quantity="other" msgid="4437637377522896262">"Ištrinti šiuos pranešimus?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Pranešimas ištrintas."</item>
- <item quantity="other" msgid="6574961322865652255">"Pranešimai ištrinti."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Pranešimas atmestas."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Pranešimas išsaugotas kaip juodraštis."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Nepavyksta pateikti priedo."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Nepavyko įkelti priedo „<xliff:g id="FILENAME">%s</xliff:g>“."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Atidaromas pranešimas…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"Į <xliff:g id="NUM_MESSAGE">%1$d</xliff:g> perkelti pranešimai: <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"Į <xliff:g id="MAILBOX_NAME">%2$s</xliff:g> perkelti pranešimai: <xliff:g id="NUM_MESSAGE">%1$d</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Nepavyko persiųsti mažiausiai vieno priedo."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Priedas nepersiųstas"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Nepavyko prisijungti prie <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Nepavyko prisijungti"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Naujesnis"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Senesnis"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Paskyros sąranka"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"El. pašto paskyra"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Galite nustatyti paskyrą atlikę vos kelis veiksmus."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"El. pašto adresas"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Slaptažodis"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Pagal numatytuosius nustatymus siųsti el. laišką iš šios paskyros"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Neaut. nustat."</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Įveskite galiojantį el. pašto adresą ir slaptažodį."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Kopijuoti paskyrą"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Jau naudojate šį naudotojo vardą „<xliff:g id="DUPLICATE">%s</xliff:g>“ paskyroje."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Šis slaptažodis prasideda ar baigiasi mažiausiai vienu tarpo simboliu. Dauguma serverių nepalaiko slaptažodžių su tarpais."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Nuskaitoma paskyros informacija..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Tikrinami gaunamų laiškų serverio nustatymai..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Tikrinami siunčiamo serverio nustatymai..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Paskyros sąranka"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Paskyra nustatyta, el. laiškas išsiųstas!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Suteikti šiai paskyrai pavadinimą (pasirenkama)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Jūsų vardas ir pavardė (pateikiami siunčiamuose pranešimuose)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Šis laukas negali būti tuščias."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Paskyros sąranka"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Paskyros tipas"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Kokio tipo tai paskyra?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Paskyros sąranka"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Gaunamų laiškų serverio nustatymai"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Naudotojo vardas"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Slaptažodis"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Serveris"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Prievadas"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Saugos tipas"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nėra"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL / TLS (priimti visus sertifikatus)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL / TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (priimti visus sertifikatus)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Ištrinti el. laišką iš serverio"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Niekada"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Kai ištrinu iš gautų laiškų aplanko"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP prieigos kelio kodas"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Pasirenkama"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Paskyros sąranka"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Siunčiamų laiškų serverio nustatymai"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP serveris"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Prievadas"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Saugos tipas"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Reikalauti prisijungti"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Naudotojo vardas"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Slaptažodis"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Paskyros sąranka"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Serverio nustatymai"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Serveris"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domenas / naudotojo vardas"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Naudoti saugų ryšį (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Priimti visus SSL sertifikatus"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Kliento sertifikatas"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Pasirinkti"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Naudoti kliento sertifikatą"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Pašalinti"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Nėra"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Mobiliojo įrenginio ID"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Paskyros nustatymai"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Paskyros parinktys"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Gautųjų tikrinimo dažnumas"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Niekada"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automatinis (spausti)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Kas 5 min."</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Kas 10 min."</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Kas 15 min."</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Kas 30 min."</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Kas valandą"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Pagal numatytuosius nustatymus siųsti el. laišką iš šios paskyros"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Pranešti, kai gausiu el. laišką"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sinchronizuoti šios paskyros kontaktus"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sinchronizuoti šios paskyros kalendorių"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sinchronizuoti šios paskyros el. paštą"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Automatiškai atsisiųsti priedus, kai prisijungiama prie „Wi-Fi“"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nepavyko užbaigti"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Sinchronizuojamų dienų skaičius"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatinis"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Vieną dieną"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tris dienas"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Viena savaitė"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Dvi savaitės"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Vienas mėnuo"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Visas"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Naudoti num. pask. nust."</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Neteisingas naudotojo vardas ar slaptažodis."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Neteisingas naudotojo vardas ar slaptažodis."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nepavyksta saugiai prisijungti prie serverio."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nepavyksta saugiai prisijungti prie serverio."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Reikalingas kliento sertifikatas. Ar norite prie serverio prisijungti naudodami kliento sertifikatą?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sertifikatas netinkamas ar nepasiekiamas."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Serveris atsakė pateikdamas klaidą. Patikrinkite naudotojo vardą bei slaptažodį ir bandykite dar kartą."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nepavyksta prisijungti prie serverio."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Negalima prisijungti prie serverio."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"Reikalingas TLS, bet jo nepalaiko serveris."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Serveris nepalaiko tapatybės nustatymo metodų."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Nepavyko užmegzti ryšio su serveriu dėl saugos klaidos."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Nepavyko užmegzti ryšio su serveriu."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Įvedėte netinkamą serverio adresą arba serveriui reikalinga el. pašto nepalaikoma protokolo versija."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Neturite leidimo sinchronizuoti su šiuo serveriu. Jei reikia daugiau informacijos, susisiekite su serverio administratoriumi."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Nuotolinis saugos administravimas"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Serveris „<xliff:g id="SERVER">%s</xliff:g>“ reikalauja leisti jam nuotoliniu būdu valdyti kai kurias „Android“ įrenginio saugos funkcijas. Ar norite užbaigti šios paskyros nustatymą?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Šiam serveriui reikalingos saugos funkcijos, kurios nepalaikomos jūsų „Android“ įrenginyje, įskaitant: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Negalima pakeisti paskyros naudotojo vardo. Jei norite pridėti paskyrą su kitu naudotojo vardu, palieskite „Pridėti paskyrą“."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"ĮSPĖJIMAS: išaktyvinus el. pašto programos leidimą administruoti įrenginį, bus ištrintos visos el. pašto paskyros, kurioms jis reikalingas, įskaitant el. laiškus, kontaktus, kalendoriaus įvykius ir kitus duomenis."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Saugos naujinys"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"„<xliff:g id="ACCOUNT">%s</xliff:g>“ reikia atnaujinti saugos nustatymus."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Paskyros „<xliff:g id="ACCOUNT">%s</xliff:g>“ negalima sinchronizuoti dėl saugos reikalavimų."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Reikalingas „<xliff:g id="ACCOUNT">%s</xliff:g>“ paskyros saugos nustatymų atnaujinimas."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Pasikeitė paskyros „<xliff:g id="ACCOUNT">%s</xliff:g>“ saugos nustatymai. Nereikia imtis jokių veiksmų."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Reikalingas saugos atnaujinimas"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Pakeista saugos politika"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Neįman. atitikti saugos polit."</string>
- <string name="account_security_title" msgid="3511543138560418587">"Įrenginio sauga"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Serveris „<xliff:g id="SERVER">%s</xliff:g>“ reikalauja leisti jam nuotoliniu būdu valdyti kai kurias „Android“ įrenginio saugos funkcijas."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Redaguoti išsamią informaciją"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"„<xliff:g id="ACCOUNT">%s</xliff:g>“ reikia pakeisti ekrano užrakto PIN kodą arba slaptažodį."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Baigiasi ekr. užr. slapt. galioj. laikas"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Baigėsi ekrano užrakto PIN kodo ar slaptažodžio galiojimo laikas."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Baig. ekr. užr. slapt. galioj. laikas"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Baigiasi ekr. užr. slapt. galioj. laikas"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Būtinai reikia greitu metu pakeisti ekrano užrakinimo PIN kodą ar slaptažodį, nes bus ištrinti „<xliff:g id="ACCOUNT">%s</xliff:g>“ duomenys. Ar norite jį pakeisti dabar?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Baig. ekr. užr. slapt. galioj. laikas"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Iš įrenginio ištrinami „<xliff:g id="ACCOUNT">%s</xliff:g>“ duomenys. Galite juos atkurti pakeisdami ekrano užrakinimo PIN kodą ar slaptažodį. Ar norite pakeisti jį dabar?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Atmesti neišsaugotus pakeitimus?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Nepavyko prisijungti"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Neteisingas „<xliff:g id="ACCOUNT">%s</xliff:g>“ naudotojo vardas ar slaptažodis. Ar norite atnaujinti juos dabar?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Numatytoji paskyra"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Pagal numatytuosius nustatymus siųsti el. laišką iš šios paskyros"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Atsisiųsti priedus"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Automatiškai atsis. naujausių pranešimų priedai per „Wi-Fi“"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"El. pašto pranešimai"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Sinchronizavimo dažnumas, pranešimai ir kt."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Siųsti pranešimą, kai gaunamas el. laiškas"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Gautųjų tikrinimo dažnumas"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Gaunamų laiškų nustatymai"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Naudotojo vardas, slaptažodis ir kiti gavimo serverio nustatymai"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Siunčiamų laiškų nustatymai"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Naudotojo vardas, slaptažodis ir kiti siuntimo serv. nustatymai"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Vykdoma politika"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Nėra"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nepalaikoma politika"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Nėra"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Bandyti sinchronizuoti"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Jei norite sinchronizuoti šią paskyrą, palieskite čia"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Paskyros pavadinimas"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Jūsų vardas ir pavardė"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Parašas"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Greiti atsakai"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Redaguokite tekstą, kurį dažnai įterpiate kurdami el. laišką"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Priskirti tekstą prie siunčiamų pranešimų"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Įspėjimų nustatymai"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Duomenų naudojimas"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Saugos politika"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Redaguoti greitą atsaką"</string>
- <string name="save_action" msgid="1988862706623227093">"Išsaugoti"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sinchronizuoti adresatus"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sinchron. šios paskyros kontaktus"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sinchronizuoti kalendorių"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sinchron. šios paskyros kalendorių"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sinchron. el. paštą"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sinchron. šios paskyros el. paštą"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibruoti"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Taip pat vibruoti, kai gaunamas el. laiškas"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Visada"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Tik kai veikia tyliai"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Niekada"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibruoti"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Pasirinkti skambėjimo toną"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Serverio nustatymai"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Pašalinti paskyrą"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Paskyra „<xliff:g id="ACCOUNT">%s</xliff:g>“ bus pašalinta iš el. pašto."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Pašalinti paskyrą"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Pašalinti paskyrą"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Sinchronizavimo parinktys"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Sinchronizavimo parinktys (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Sinchronizavimo nustatymai"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Tikrinti dažnumą"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Sinchronizuojamų dienų skaičius"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"El. p. pask."</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Pasirinkti paskyrą"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Pasirinkite aplanką"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Paskyra nerasta. Galbūt ji buvo pašalinta."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Aplankas nerastas. Galbūt jis buvo pašalintas."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Tik kai kuriose „Plus“ paskyrose yra POP prieiga, leidžianti prisijungti šiai programai. Jei negalite prisijungti naudodami tinkamą el. pašto adresą ir slaptažodį, galbūt neapmokėjote „Plus“ paskyros. Paleiskite žiniatinklio naršyklę, kad gautumėte prieigą prie šių el. pašto paskyrų."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Prieš nustatydami šią el. pašto paskyrą apsilankykite „T-Online“ svetainėje ir sukurkite POP3 el. pašto prieigos slaptažodį."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Įmonės"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Nepavyko sukurti paskyros. Bandykite dar kartą."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"El. paštas"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Įgalina serverio apibrėžtą saugos politiką"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Ieškoma <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> rezultatas iš <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> rezultatai (-ų) iš <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Nustatymai"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Bendrieji nustatymai"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Programa"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatinis perėjimas"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Pasirinkite, kurį ekraną rodyti ištrynus pranešimą"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Slėpti žymimuosius laukelius"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Jei norite pasirinkti, pranešimų sąraš. palieskite ir laikykite"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Patvirtinti prieš ištrinant"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Pranešimai"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Patvirtinti prieš siunčiant"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Pranešimai"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Pereiti į"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Naujesnis pranešimas"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Senesnis pranešimas"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Pranešimų sąrašas"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Pranešimo teksto dydis"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Mažytis tekstas"</item>
- <item msgid="4415205108584620118">"Mažas tekstas"</item>
- <item msgid="4550219696381691112">"Įprasto dydžio tekstas"</item>
- <item msgid="6227813549949219991">"Didelis tekstas"</item>
- <item msgid="1197917420815786571">"Didžiulis tekstas"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Pranešimo teksto dydis"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Itin mažas"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Mažas"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Įprastas"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Didelis"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Itin didelis"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Atsakyti visiems"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Kaip numatyt. atsakymų į praneš. nustat. pasirinkti „Atsakyti visiems“"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Paprašyti rodyti paveikslėlius"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Pranešimuose esantys paveikslėliai nebus rodomi automatiškai"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"„Rodyti paveikslėlius“ išvalyta."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> iš <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Laukiama sinchronizavimo"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Jūsų el. paštas netrukus bus parodytas."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Kad pak., pal. pikt."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Sujungt. Gautieji"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Neskaityta"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Pažymėta žvaigždute"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Įkeliama…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Kad nustatytumėte, palieskite."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Dar nenustatėte el. pašto paskyros."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Paieška el. pašte"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Ieškoti <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Paieškos rezultatai pagal „<xliff:g id="ID_1">%1$s</xliff:g>“"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Laukiama rezultatų"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Kai kurie serveriai gali ilgai užtrukti."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Aplankai"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Neleisti naudoti įrenginio fotoaparato"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Reikalauti įrenginio slaptažodžio"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Riboti naujausių slapt. pakart. panaud."</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Reikalauti slaptaž. galiojimo pabaigos"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Užrakinti ekraną nenaudojant įrenginio"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Riboti sinchron. kalendoriaus įvykių skaičių"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Riboti sinchronizuojamų el. laiškų skaičių"</string>
- <string name="quick_1" msgid="3426057697353380951">"Ačiū!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Skamba gerai!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Perskaitysiu vėliau ir jums atsakysiu."</string>
- <string name="quick_4" msgid="3988974084396883051">"Aptarkime tai susitikę."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Foninis šios paskyros sinchronizavimas neleidžiamas perduodant duomenis tarptinkliniu ryšiu."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Siunčiamas atsakymas..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Pranešimų nėra."</string>
-</resources>
diff --git a/email2/res/values-lt/uploader.xml b/email2/res/values-lt/uploader.xml
deleted file mode 100644
index 281fd8cf6..000000000
--- a/email2/res/values-lt/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Momentinis įkėlimas"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Momentinių įkėlimų albumas"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Įkeliama"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Baigta"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Pristabdyta"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d nuotrauk. • %3$d vaizdo įraš."</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d nuotrauk. • %2$d vaizdo įraš."</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"akumuliatorius senka"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"viršyta nuotraukų kvota"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"tarptinklinis ryšys"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"laukiama „Wi-Fi“"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"atidėta iki įkrovimo"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"laukiama ryšio"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"bandoma iš naujo po %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Rodyti laukiamus įkėlimus"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Rodyti baigtus įkėlimus"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Žiūrėti prisijungus"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Rodyti laukiamus įkėlimus"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Slėpti laukiamus įkėlimus"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Rodyti išsamią informaciją"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Slėpti išsamią informaciją"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Nustatymai"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Įkelta %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Paskyra"</string>
- <string name="upload" msgid="2615541458361216022">"Įkelti"</string>
- <string name="ok" msgid="2516349681897895312">"Gerai"</string>
- <string name="cancel" msgid="1207103189404543868">"Atšaukti"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Įkeliama į "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"„%1$s“ „%2$s“"</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Nepavyko inicijuoti įkėlimo."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Failas nepasiekiamas."</string>
- <string name="account_error" msgid="1904775271866104941">"Nepavyko nuskaityti paskyros informacijos."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Prisijungiant prie paskyros kilo problema."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Laukiama, kol bus galima bandyti iš naujo"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Laukiama „Wi-Fi“"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Įkeliama"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Įvyko klaida"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Užbaigta"</string>
- <string name="pause_state_running" msgid="711411177620353982">"įkeliama"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"pristabdyta rankomis"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"pristabdyta – akumuliatorius senka"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"pristabdyta – atidėta iki įkrovimo"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"pristabdyta – laukiama ryšio"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"pristabdyta - nebėra PWA kvotos"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"pristabdyta – laukiama „Wi-Fi“"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"pristabdyta – tarptinklinis ryšys"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"laukiama, kol bus galima bandyti iš naujo"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 min."</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 min."</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 min."</string>
- <string name="retry_no_data" msgid="630347885498641534">"Nėra duomenų ryšio"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Paskyroje nėra disko kvotos"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Failas nerastas"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Paslaugos klaida"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Tinklo klaida"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Nepavyko nustatyti tapatybės"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Laukiami įkėlimai [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Baigti įkėlimai [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Pristabdyti įkėlimus"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Atnaujinti įkėlimus"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Įkelti dabar"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Įkelti vėliau"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Neįkelti"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Žiūrėti"</string>
- <string name="manager_retry" msgid="939534318469518843">"Bandyti dar kartą"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Įkėlimas atšauktas"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Įkėlimas jau baigtas"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sinchronizuoti viską"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Paskutinį kartą sinchronizuota:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Baigtų elementų sąrašas tuščias."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Momentinis įkėlimas"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Įkėlimai baigti"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Įkėlimai pristabdyti"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Momentinis įkėlimas dar nesuaktyvintas"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Dideli failai bus įkelti naudojant tik „Wi-Fi“ ryšį."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Nuskaitomi failai..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Ruošiama įkelti <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> nuotrauk. ir <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> vaizdo įraš..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Nereikia įkelti jokių papildomų nuotraukų / vaizdo įrašų."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Bandant susisiekti su serveriu kilo problema. Bandykite dar kartą vėliau."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Sinchronizuoti visus atšauktus"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sinchronizuoti viską"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Peržiūrėti užbaigtus"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Žiūrėti laukiamus"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Bendroji informacija"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Pristabdyti visus įkėlimus"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Maitinimas"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Įkelti, tik kai telefonas įkraunamas."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Įkelti, tik kai pasiekiamas „Wi-Fi“."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Nuotraukos"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Paskyra"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Įkėlimo sąlygos"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Nuotraukos dydis"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Vaizdo įrašai"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Paskyra"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Nuotraukų paskyra bus naudojama vaizdo įrašams įkelti."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Įkėlimo sąlygos"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Dabar naudojami nuotraukų jungiamumo nustatymai."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Tik per mobiliojo ryšio tinklus gautos nuotraukos"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Įkelti nuotraukas ir vaizdo įrašus per mobiliojo ryšio tinklus"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Įkelti nuotraukas ir vaizdo įrašus tik per „Wi-Fi“"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Apie"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Moment. įkėl. vers."</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Rekomenduojama: 1 600 pikselių (bendrinant, spausdinant ir naudojant ekrano užsklandas)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Pradinis dydis (lėčiausias įkėlimas)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"pristabdyta – SD kortelė nepasiekiama"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD kortelė nepasiekiama"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Moment. įkėl. nust."</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Momentinis įkėlimas"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Automatiškai įkelti naujas nuotraukas ir vaizdo įrašus į privatų žiniatinklio albumą"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Įkėlimo būsena"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Išplėstiniai"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Įkėlimai mobiliuoju ryšiu"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Įkėlimai tarptinkliniu ryšiu"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Įkelti nuotraukas ir vaizdo įrašus, kai duomenų tinkle veikia tarptinklinis ryšys"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Įkėlimai kraunant"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Nuotraukas ir vaizdo įrašus įkelti, tik kai įkraunama"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Įkelti esamas nuotraukas"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Dabar įkelti visas esamas nuotraukas ir vaizdo įrašus iš telefono"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Neleidžiama"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Įkeliama (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d iš %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Pristabdyta: palieskite, kad būtų atnaujintas įkėlimas"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Įkelti esamas nuotraukas"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Nuotraukų ir vaizdo įrašų, kurie dar nebuvo įkelti iš telefono į privatų albumą žiniatinklyje, įkėlimas gali užtrukti, tačiau jis bus atliekamas fone. Ar tikrai norite tęsti?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Taip"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Ne"</string>
-</resources>
diff --git a/email2/res/values-lv/strings.xml b/email2/res/values-lv/strings.xml
deleted file mode 100644
index bc6b9b980..000000000
--- a/email2/res/values-lv/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Lasīt e-pasta ziņojumu pielikumus"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Ļauj lietotnei lasīt e-pasta ziņojumu pielikumus."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Piekļūt e-pasta pakalpojumu sniedzēja datiem"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Ļauj lietotnei piekļūt jūsu e-pasta datu bāzei, tostarp saņemtajiem ziņojumiem, nosūtītajiem ziņojumiem, lietotājvārdiem un parolēm."</string>
- <string name="app_name" msgid="5815426892327290362">"E-pasts"</string>
- <string name="compose_title" msgid="427986915662706899">"E-pasta ziņojuma rakstīšana"</string>
- <string name="debug_title" msgid="5175710493691536719">"Atkļūdot"</string>
- <string name="next_action" msgid="3931301986364184415">"Tālāk"</string>
- <string name="okay_action" msgid="8365197396795675617">"Labi"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Atcelt"</string>
- <string name="previous_action" msgid="5181616311579820981">"Iepriekšējais"</string>
- <string name="send_action" msgid="1729766205562446418">"Sūtīt"</string>
- <string name="reply_action" msgid="4262472229221507619">"Atbildēt"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Atbildēt visiem"</string>
- <string name="delete_action" msgid="8421026208288857155">"Dzēst"</string>
- <string name="forward_action" msgid="669174181042344116">"Pārsūtīt"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Atzīmēt ar zvaigznīti"</string>
- <string name="done_action" msgid="7497990549515580249">"Gatavs"</string>
- <string name="create_action" msgid="3062715563215392251">"Izveidot jaunu"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Dzēst"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nav ātro atbilžu."</string>
- <string name="discard_action" msgid="6532206074859505968">"Atmest"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Saglabāt melnr."</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Ievietot ātro atbildi"</string>
- <string name="read_action" msgid="4701484794504781686">"Atzīmēt kā izlasītu"</string>
- <string name="unread_action" msgid="6280399049357552826">"Atzīmēt kā nelasītu"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Atzīmēt ar zvaigznīti"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Noņemt zvaigznīti"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Atsvaidzināt"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Pievienot kontu"</string>
- <string name="compose_action" msgid="4045702519637388045">"Rakstīt"</string>
- <string name="search_action" msgid="6325101454876682308">"Meklēt"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Konta iestatījumi"</string>
- <string name="settings_action" msgid="6334807007967459412">"Iestatījumi"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Sinhronizācijas opcijas"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Atzīmēt kā nelasītu"</string>
- <string name="move_action" msgid="3059189775933985898">"Pārvietot"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Kopija/d. kop."</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Piev. kop./d. kop."</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Pievienot failu"</string>
- <string name="close_action" msgid="533058985745238100">"Aizvērt"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Sūtīt visus ziņoj."</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Pielikuma izvēle"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Pārvietot uz"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Notiek ziņojumu ielāde…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Savienojuma problēma."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Nevarēja ielādēt ziņojuma tekstu. Iespējams, ziņojums ir pārāk garš, un to nevar parādīt."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Pārvietot ziņojumu"</item>
- <item quantity="other" msgid="371256717624461324">"Pārvietot ziņojumus"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"POP3 kontos netiek atbalstīta pārvietošana."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Nevar pārvietot, jo ir atlasīti ziņojumi no vairākiem kontiem."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Ziņojumus, kas atrodas mapēs Melnraksti, Izsūtne un Nosūtītie, nevar pārvietot."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> nelasīts(-i) (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> nelasīts(-i) (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> nelasīts(-i) (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> kontā(-os)"</item>
- <item quantity="other" msgid="2723797835410343458">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> kontā(-os)"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"kam: <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> jauns(-i) ziņojums(-i)"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Visi konti"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> konts"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> konti"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Iesūtne"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Izsūtne"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Melnraksti"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Miskaste"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Nosūtītie"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Nevēlamie"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Nelasīti"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Iesūtne (nelasīti)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Iesūtne (visi)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Kombinētais skatījums (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> konts"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> konti"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versija: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Iesūtne"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Atzīmēti ar zvaigznīti"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Melnraksti"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Izsūtne"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Kombinētais skatījums"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Rādīt visas mapes"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Konti"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Jaunākās mapes (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Visas mapes"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Jaunākās mapes"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Temats"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Bez temata"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Ielādēt vairāk ziņojumu"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> atlasīts"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> atlasīti"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Nav ziņojumu"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Kam"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Kopija"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Diskrētā kopija"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Temats"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"No:"</string>
- <string name="to" msgid="4392614766835725698">"Kam:"</string>
- <string name="cc" msgid="7017720927911078193">"Kopija"</string>
- <string name="bcc" msgid="3098643138241111579">"D. kopija"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Temats"</string>
- <string name="body_hint" msgid="4279864165439577668">"Rakstiet e-pasta ziņojumu"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Sākotnējais ziņojums --------"\n"Temats: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"No: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Kam: <xliff:g id="TO">%3$s</xliff:g>"\n"Kopija: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> rakstīja:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Citēta teksta iekļaušana"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Iekļaut tekstu"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Pievienojiet vismaz vienu adresātu."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Dažas e-pasta adreses nav derīgas."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Failu nevar pievienot, jo tas ir pārāk liels."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Ātrās atbildes ievietošana"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> un citas personas (<xliff:g id="NUMBER">%2$d</xliff:g>)"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Kam:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Kopija:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Diskrētā kopija:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Datums:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"No:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Temats:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Skatīt"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Instalēt"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Atskaņot"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Ielādēt"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Informāc."</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Saglabāt"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Saglabāts"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Apturēt"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Pielikums saglabāts kā <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Nevarēja saglabāt pielikumu."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Viens vai vairāki pārsūtītā ziņojuma pielikumi pirms sūtīšanas tiks lejupielādēti."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Ziņojums"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Uzaicināt"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> pielikums"</item>
- <item quantity="other" msgid="974463163535515223">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> pielikumi"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Rādīt attēlus"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Rādīt vienmēr"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Vienmēr rādīt attēlus no šī sūtītāja"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Attēli no šī sūtītāja tiks rādīti automātiski."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Skatīt kalendārā"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Kalendāra ielūgums"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Vai apmeklēsiet?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Jā"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Varbūt"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Nē"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Jūs esat pieņēmis šo ielūgumu."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Jūs uz šo ielūgumu esat atbildējis “Varbūt”."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Jūs esat noraidījis šo ielūgumu."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Rādīt informāciju"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Informācija par ziņojumu"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Informācija par pielikumu"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Nepieciešams Wi-Fi savienojums"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Wi-Fi iestatījumi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Lietotnes iestatījumi"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Nevar atvērt pielikumu."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Šo failu nevar saglabāt vai atvērt, jo šī veida pielikumā var būt ietverta ļaunprātīga programmatūra."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Šo pielikumu nevar saglabāt vai atvērt šī konta drošības politiku dēļ."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Šis pielikums ir pārāk liels, lai to lejupielādētu mobilajā tīklā. Varat to lejupielādēt nākamreiz, kad pievienosieties Wi-Fi tīklam."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Nav instalēta neviena lietotne, ar kuru var atvērt šo pielikumu. Mēģiniet lejupielādēt piemērotu lietotni no vietnes Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Šis pielikums ir lietotne. Lai to instalētu, sadaļā Iestatījumi &gt; Lietotnes ir jāatzīmē izvēles rūtiņa Nezināmi avoti."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Lietotnes nevar instalēt tieši no e-pasta ziņojuma. Vispirms saglabājiet šo lietotni un pēc tam instalējiet to, izmantojot lietotni Lejupielādes."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Nevarēja lejupielādēt pielikumu."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Atšifrējot ziņojumu, radās kļūda."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Tiek skat.: <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Vai dzēst šo ziņojumu?"</item>
- <item quantity="other" msgid="4437637377522896262">"Vai dzēst šos ziņojumus?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Ziņojums ir dzēsts."</item>
- <item quantity="other" msgid="6574961322865652255">"Ziņojumi ir dzēsti."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Ziņojums ir atmests."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Ziņojums ir saglabāts kā melnraksts."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Nevarēja parādīt pielikumu."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Nevarēja ielādēt pielikumu <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Notiek ziņojuma atvēršana…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> ziņojums pārvietots uz <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> ziņojumi pārvietoti uz <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Nevarēja pārsūtīt vienu vai vairākus pielikumus."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Pielikums netika nosūtīts."</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Neizdevās pierakstīties kontā <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Nevarēja pierakstīties"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Jaunāks"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Vecāki"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Konta iestatīšana"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"E-pasta konts"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Varat iestatīt savu kontu, veicot tikai dažas darbības."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-pasta adrese"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Parole"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Pēc noklusējuma sūtīt e-pasta ziņojumus no šī konta"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuāla iest."</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Ierakstiet derīgu e-pasta adresi un paroli."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dublikāta konts"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Jūs jau izmantojat šo lietotājvārdu kontam <xliff:g id="DUPLICATE">%s</xliff:g>."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Paroles sākumā vai beigās ir viena vai vairākas atstarpes. Daudzos serveros netiek nodrošināts atbalsts parolēm, kurās iekļautas atstarpes."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Notiek konta informācijas izgūšana..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Notiek servera ienākošo datu iestatījumu pārbaude..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Notiek servera izejošo datu iestatījumu pārbaude…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Konta iestatīšana"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Jūsu konts ir izveidots, un ir nosūtīts e-pasta ziņojums."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Ievadiet konta nosaukumu (neobligāti)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Jūsu vārds (attēlots izejošajos ziņojumos)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Šis lauks nedrīkst būt tukšs."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Konta iestatīšana"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Konta veids"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Kāds ir šī konta veids?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Konta iestatīšana"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Ienākošā servera iestatījumi"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Lietotājvārds"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Parole"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Serveris"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Ports"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Drošības veids"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nav"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (pieņemt visus sertifikātus)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (pieņemt visus sertifikātus)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Dzēst e-pasta ziņojumu no servera"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Nekad"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Kad es dzēšu no iesūtnes"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP ceļa prefikss"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Neobligāti"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Konta iestatīšana"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Izejošā servera iestatījumi"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP serveris"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Ports"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Drošības veids"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Pieprasīt pierakstīšanos"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Lietotājvārds"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Parole"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Konta iestatīšana"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Servera iestatījumi"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Serveris"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domēns\\lietotājvārds"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Lietot drošu savienojumu (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Pieņemt visus SSL sertifikātus"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Klienta sertifikāts"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Atlasīt"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Izmantot klienta sertifikātu"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Noņemt"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Nav"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Mobilās ierīces ID"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Konta iestatījumi"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Konta iespējas"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Iesūtnes pārbaudes biežums"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nekad"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automātiski (piespiediet)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Ik pēc 5 minūtēm"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Ik pēc 10 minūtēm"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Ik pēc 15 minūtēm"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Ik pēc 30 minūtēm"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Ik pēc stundas"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Pēc noklusējuma sūtīt e-pasta ziņojumus no šī konta"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Paziņot man, kad tiek saņemts jauns e-pasta ziņojums"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sinhronizēt šī konta kontaktpersonas"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sinhronizēt šī konta kalendāru"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sinhronizēt šī konta e-pastu"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Automātiski lejupielādēt pielikumus, kad ir izveidots WiFi savienojums"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nevarēja pabeigt"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Sinhronizējamās dienas"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automātiski"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Viena diena"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Trīs dienas"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Viena nedēļa"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Divas nedēļas"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Viens mēnesis"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Visi"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Izmantot konta noklusēj."</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nepareizs lietotājvārds vai parole."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Lietotājvārds vai parole nav pareiza."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nevar izveidot drošu savienojumu ar serveri."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nevar izveidot drošu savienojumu ar serveri."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Ir nepieciešams klienta sertifikāts. Vai vēlaties izveidot savienojumu ar serveri, izmantojot klienta sertifikātu?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sertifikāts nav derīgs vai nav pieejams."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Serveris atgrieza kļūdu. Pārbaudiet lietotājvārdu un paroli un pēc tam mēģiniet vēlreiz."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nevar izveidot savienojumu ar serveri."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Nevar izveidot savienojumu ar serveri."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"Protokols TLS ir obligāts, taču serveris to neatbalsta."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Serverī netiek atbalstītas autentifikācijas metodes."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Nevarēja izveidot savienojumu ar serveri drošības kļūdas dēļ."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Nevarēja izveidot savienojumu ar serveri."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Jūs ierakstījāt nepareizu servera adresi, vai arī serverī tiek pieprasīta tāda protokola versija, kas netiek atbalstīta lietotnē E-pasts."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Jums nav atļaujas veikt sinhronizāciju ar šo serveri. Lai iegūtu plašāku informāciju, sazinieties ar servera administratoru."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Attālināta drošības administrācija"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Serveris <xliff:g id="SERVER">%s</xliff:g> pieprasa, lai jūs tam atļautu attālināti vadīt dažas jūsu Android ierīces drošības funkcijas. Vai vēlaties pabeigt konta iestatīšanu?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Šajā serverī tiek pieprasītas drošības funkcijas, kas netiek atbalstītas jūsu Android ierīcē, tostarp: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Nevar mainīt konta lietotājvārdu. Lai pievienotu kontu ar citu lietotājvārdu, pieskarieties vienumam Pievienot kontu."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"BRĪDINĀJUMS: deaktivizējot lietotnes E-pasts tiesības administrēt jūsu ierīci, tiks dzēsti visi e-pasta konti, kuriem šī funkcionalitāte ir nepieciešama, kā arī šo kontu e-pasta ziņojumi, kontaktpersonas, kalendāra pasākumi un citi dati."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Drošības atjauninājums"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Kontam <xliff:g id="ACCOUNT">%s</xliff:g> ir jāatjaunina drošības iestatījumi."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Kontu <xliff:g id="ACCOUNT">%s</xliff:g> nevar sinhronizēt drošības prasību dēļ."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Kontā <xliff:g id="ACCOUNT">%s</xliff:g> ir jāatjaunina drošības iestatījumi."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Kontā <xliff:g id="ACCOUNT">%s</xliff:g> ir mainīti drošības iestatījumi; lietotājam nav jāveic nekādas darbības."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Nepieciešams drošības atjaun."</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Droš. politikas ir mainītas."</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Netiek ievērota droš. politika"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Ierīces drošība"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Serveris <xliff:g id="SERVER">%s</xliff:g> pieprasa, lai jūs tam atļautu attālināti vadīt dažas jūsu Android ierīces drošības funkcijas."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Rediģēt datus"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"Lai varētu izmantot kontu <xliff:g id="ACCOUNT">%s</xliff:g>, jāmaina ekrāna bloķēšanas PIN kods vai parole."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Ekr. bloķ. par. term. tuv. b."</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Ekrāna bloķēšanas PIN vai paroles derīguma termiņš ir beidzies."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Ekr. bloķ. paroles term. b."</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Ekr. bloķ. paroles term. tuvojas beigām"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Jums drīzumā ir jāmaina ekrāna bloķēšanas PIN vai parole, citādi konta <xliff:g id="ACCOUNT">%s</xliff:g> dati tiks dzēsti. Vai vēlaties to mainīt tūlīt?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Ekrāna bloķēš. paroles termiņa beigas"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Konta <xliff:g id="ACCOUNT">%s</xliff:g> dati tiek dzēsti no šīs ierīces. Tos var atjaunot, nomainot ekrāna bloķēšanas PIN vai paroli. Vai vēlaties to mainīt tūlīt?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Vai atmest nesaglabātās izmaiņas?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Nevarēja pierakstīties"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Konta <xliff:g id="ACCOUNT">%s</xliff:g> lietotājvārds vai parole nav pareiza. Vai vēlaties tos atjaunināt tūlīt?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Noklusējuma konts"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Pēc noklusējuma sūtīt e-pasta ziņojumus no šī konta"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Lejupielādēt pielikumus"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Automātiski lejupielādēt jaunāko ziņojumu pielikumus Wi-Fi tīklā"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"E-pasta paziņojumi"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Sinhronizācijas biežums, paziņojumi u.c."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Nosūtīt paziņojumu, kad tiek saņemts e-pasta ziņojums"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Iesūtnes pārbaudes biežums"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Ienākošo datu iestatījumi"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Lietotājvārds, parole u.c. ienākošā pasta servera iestatījumi"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Izejošo datu iestatījumi"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Lietotājvārds, parole un citi izejošā pasta servera iestatījumi"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Īstenotās politikas"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Nav"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Neatbalstītas politikas"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Nav"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Sinhronizēt"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Pieskarties šeit, lai sinhronizētu šo kontu"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Konta nosaukums"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Jūsu vārds"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Paraksts"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Ātrās atbildes"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Rediģēt tekstu, kuru bieži ievietojat e-pasta ziņojumos"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Pievienot tekstu nosūtītajiem ziņojumiem"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Paziņojumu iestatījumi"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Datu lietojums"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Drošības politikas"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Ātrās atbildes rediģēšana"</string>
- <string name="save_action" msgid="1988862706623227093">"Saglabāt"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sinhronizēt kontaktpersonas"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sinhron. kontaktpersonas šim kontam"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sinhronizēt kalendāru"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sinhr. šī konta kalendāra notikumus"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sinhronizēt e-pastu"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sinhronizēt e-pastu šim kontam"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrozvans"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Izmantot vibrozvanu, kad tiek saņemts e-pasta ziņojums"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Vienmēr"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Tikai klusuma režīmā"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Nekad"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibrozvans"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Izvēlēties zvana signālu"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Servera iestatījumi"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Konta noņemšana"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Konts “<xliff:g id="ACCOUNT">%s</xliff:g>” tiks noņemts no e-pasta."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Noņemt kontu"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Noņemt kontu"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Sinhronizācijas opcijas"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Sinhronizācijas opcijas (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Sinhronizācijas iestatījumi"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Pārbaudes biežums"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Sinhronizējamās dienas"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"E-pasta k."</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Konta izvēle"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Mapes atlase"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Konts netika atrasts. Iespējams, ka tas ir noņemts."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Mape netika atrasta. Iespējams, ka tā ir noņemta."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Tikai dažiem Plus kontiem ir pieejama POP piekļuve, kas nodrošina šīs programmas savienojuma izveidi. Ja nevarat pierakstīties, izmantojot pareizo e-pasta adresi un paroli, iespējams, jums nav apmaksāta Plus konta. Lai piekļūtu šiem e-pasta kontiem, palaidiet tīmekļa pārlūkprogrammu."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Pirms šī e-pasta konta iestatīšanas apmeklējiet T-Online vietni un izveidojiet paroli, lai piekļūtu e-pastam pa protokolu POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Korporatīvs"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Nevarēja izveidot kontu. Mēģiniet vēlreiz."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-pasts"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Iespējo servera noteiktas drošības politikas"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Notiek domēna <xliff:g id="DOMAIN">%s</xliff:g> meklēšana…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> rezultāts no domēna <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> rezultāti no domēna <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Iestatījumi"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Vispārīgi iestatījumi"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Lietojumprogramma"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automātiski pāriet"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Izvēlieties pēc ziņojuma dzēšanas parādāmo ekrānu"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Slēpt izvēles rūtiņas"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Ziņoj. sarakstos pieskarieties un turiet nospiestu, lai atlasītu"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Apstiprināt pirms dzēšanas"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Ziņojumi"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Apstiprināt pirms sūtīšanas"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Ziņojumi"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Pāriet uz"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Jauns ziņojums"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Vecāki ziņojumi"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Ziņojumu saraksts"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Ziņojuma teksta izmērs"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Niecīga izmēra teksts"</item>
- <item msgid="4415205108584620118">"Maza izmēra teksts"</item>
- <item msgid="4550219696381691112">"Parasta izmēra teksts"</item>
- <item msgid="6227813549949219991">"Liela izmēra teksts"</item>
- <item msgid="1197917420815786571">"Milzīga izmēra teksts"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Ziņojuma teksta izmērs"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Niecīgs"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Mazs"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Parasts"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Liels"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Milzīgs"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Atbildēt visiem"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Atbildēšanai uz ziņojumiem kā noklusējumu iestatīt Atbildēt visiem"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Pieprasīt attēlu rādīšanu"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Ziņojumos ietvertie attēli netiks automātiski rādīti."</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Iestatījums Rādīt attēlus ir notīrīts."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> no <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Gaida sinhronizāciju"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Drīz tiks parādīts jūsu e-pasta saturs."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Mainiet pieskaroties"</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Kombinētā iesūtne"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Nelasītie"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Atzīm. ar zvaigznīti"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Notiek ielāde..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Pieskarieties, lai iestatītu."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Pagaidām neesat iestatījis e-pasta kontu."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Meklējiet e-pastu"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Meklējiet <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Meklēšanas rezultāti vaicājumam “<xliff:g id="ID_1">%1$s</xliff:g>”"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Tiek gaidīti rezultāti"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Dažu serveru darbība var aizņemt ilgu laiku."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mapes"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Neatļaut ierīces kameras izmantošanu"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Pieprasīt ierīces paroli"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Ierobežot jaunāko paroļu atkārt. izmant."</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Pieprasīt paroļu derīguma term. beigas"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Bloķēt ierīc. ekr., kad tā ir dīkstāvē"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Ierobežot sinhronizēto kalendāra notikumu skaitu"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Ierobežot sinhronizēto e-pasta ziņojumu skaitu"</string>
- <string name="quick_1" msgid="3426057697353380951">"Paldies!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Esmu ar mieru!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Vēlāk izlasīšu šo ziņojumu un atbildēšu."</string>
- <string name="quick_4" msgid="3988974084396883051">"Norunāsim tikšanos, lai to pārrunātu."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Viesabonēšanas laikā fona sinhronizācija šajā kontā ir atspējota."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Notiek atbildes sūtīšana..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Nav ziņojumu."</string>
-</resources>
diff --git a/email2/res/values-lv/uploader.xml b/email2/res/values-lv/uploader.xml
deleted file mode 100644
index 82b74dfa5..000000000
--- a/email2/res/values-lv/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Tūlītēja augšupiel."</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Tūlītējās augšupielādes albums"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Notiek augšupielāde"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Pabeigtas"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Pārtrauktas"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d fotoattēli • %3$d videoklipi"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d fotoattēli • %2$d videoklipi"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"zems akumulatora uzlādes līmenis"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"pārsniegta fotoattēlu kvota"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"viesabonēšana"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"tiek gaidīta Wi-Fi savienojuma izveide"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"darbība apturēta, kamēr notiek uzlāde"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"tiek gaidīta savienojuma izveide"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"atkārtots mēģinājums pēc: %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Rādīt neapstiprinātās augšupielādes"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Rādīt pabeigtās augšupielādes"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Skatīt tiešsaistē"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Rādīt neapstiprinātās augšupielādes"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Slēpt neapstiprinātās augšupielādes"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Rādīt informāciju"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Slēpt informāciju"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Iestatījumi"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Augšupielādēts: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Konts"</string>
- <string name="upload" msgid="2615541458361216022">"Augšupielādēt"</string>
- <string name="ok" msgid="2516349681897895312">"Labi"</string>
- <string name="cancel" msgid="1207103189404543868">"Atcelt"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Notiek augšupielāde šeit: "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" lietotājam "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s, “%2$s”"</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Neizdevās inicializēt augšupielādi."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Fails nav pieejams."</string>
- <string name="account_error" msgid="1904775271866104941">"Neizdevās izgūt konta informāciju."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Pierakstoties kontā, radās problēma."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Tiek gaidīts, lai mēģinātu vēlreiz"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Tiek gaidīts Wi-Fi savienojums"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Notiek augšupielāde"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Neizdevās"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Pabeigta"</string>
- <string name="pause_state_running" msgid="711411177620353982">"notiek augšupielāde"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"manuāli pārtraukta"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"pārtraukta — zems akumulatora uzlādes līmenis"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"pārtraukta — darbība apturēta, kamēr notiek uzlāde"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"pārtraukta — tiek gaidīta savienojuma izveide"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"pārtraukta — nav PWA kvotas"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"pārtraukta — tiek gaidīta Wi-Fi savienojuma izveide"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"pārtraukta — notiek viesabonēšana"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"tiek gaidīts, lai mēģinātu vēlreiz"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minūte"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minūtes"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minūtes"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Nav datu savienojuma"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Konta diska kvota nav pietiekama."</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Fails nav atrasts"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Pakalpojuma kļūda"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Tīkla kļūda"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Autentifikācija neizdevās"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Neapstiprinātas augšupielādes [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Pabeigtās augšupielādes [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Pārtraukt augšupielādes"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Atsākt augšupielādes"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Augšupielādēt tūlīt"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Augšupielādēt vēlāk"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Neveikt augšupielādi"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Skatīt"</string>
- <string name="manager_retry" msgid="939534318469518843">"Mēģināt vēlreiz"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Augšupielāde ir atcelta."</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Augšupielāde jau ir pabeigta."</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sinhronizēt visus"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Pēdējā sinhronizācija:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Pabeigto vienumu saraksts ir tukšs."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Tūlītēja augšupielāde"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Augšupielādes ir pabeigtas."</string>
- <string name="notify_paused" msgid="3999817913227671338">"Augšupielādes ir pārtrauktas."</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Tūlītējā augšupielāde vēl nav aktivizēta."</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Lieli faili tiks augšupielādēti, izmantojot tikai Wi-Fi savienojumu."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Notiek failu skenēšana..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Notiek <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> fotoattēlu un <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> videoklipu sagatavošana augšupielādei..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Nav nepieciešams augšupielādēt papildu fotoattēlus/videoklipus."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Veidojot savienojumu ar serveri, radās problēma. Lūdzu, vēlāk mēģiniet vēlreiz."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Visu vienumu sinhronizācija ir atcelta."</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sinhronizēt visu"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Skatīšana pabeigta"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Skatīt neapstiprinātās"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Vispārīgi"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Pārtraukt visas augšupielādes"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Jauda"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Augšupielādēt tikai tad, kad ir uzlādēts tālrunis."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Augšupielādēt tikai tad, ja ir pieejams Wi-Fi tīkls"</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotoattēli"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Konts"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Augšupielādēšanas nosacījumi"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Fotoattēla lielums"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videoklipi"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Konts"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Fotoattēlu konts tiks izmantots videoklipu augšupielādēm."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Augšupielādēšanas nosacījumi"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Pašlaik tiek izmantoti fotoattēlu savienojamības iestatījumi."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Tikai fotoattēliem, izmantojot mobilo sakaru tīklus"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotoattēli un videoklipi: izmantojot mobilo sakaru tīklus"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Fotoattēli un videoklipi: tikai izmantojot Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Par"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Tūlīt. augšup. vers."</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Ieteicams: 1600 pikseļi (kopīgošanai, izdrukām un ekrānsaudzētājiem)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Sākotnējais lielums (lēnākā augšupielāde)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"pārtraukta — SD karte nav pieejama"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD karte nav pieejama"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Tūl. augšup. iest."</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Tūlītēja augšupiel."</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Automātiski augšupielādēt jaunus fotoattēlus un videoklipus privātā albumā tīmeklī"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Augšupielādes statuss"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Papildu"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Augšupielādes, izmantojot mobilos sakarus"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Augšupielādes, izmantojot viesabonēšanu"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Augšupielādēt fotoattēlus un videoklipus datu tīklā viesabonēšanas laikā"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Augšupielādes lādējot"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Augšupielādēt fotoattēlus un videoklipus tikai uzlādes laikā"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Augšupielādēt esošos fotoattēlus"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Augšupielādēt visus esošos fotoattēlus un videoklipus no tālruņa tūlīt"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Atspējota"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Notiek augšupielāde (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d no %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Augšupielāde ir pārtraukta; pieskarieties, lai to atsāktu"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Esošo fotoattēlu augšupielāde"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Vēl neaugšupielādēto fotoattēlu un videoklipu augšupielāde no tālruņa privātā albumā tīmeklī var ilgt noteiktu laiku, taču tā tiks veikta fonā. Vai tiešām vēlaties turpināt?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Jā"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Nē"</string>
-</resources>
diff --git a/email2/res/values-ms/strings.xml b/email2/res/values-ms/strings.xml
deleted file mode 100644
index 33ab41a3a..000000000
--- a/email2/res/values-ms/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Baca lampiran e-mel"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Membenarkan apl membaca lampiran e-mel anda."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Akses data pembekal e-mel"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Membenarkan apl ini mengakses pangkalan data e-mel anda, termasuk mesej diterima, mesej dihantar, nama pengguna dan kata laluan."</string>
- <string name="app_name" msgid="5815426892327290362">"E-mel"</string>
- <string name="compose_title" msgid="427986915662706899">"Karang"</string>
- <string name="debug_title" msgid="5175710493691536719">"Nyahpepijat"</string>
- <string name="next_action" msgid="3931301986364184415">"Seterusnya"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Batal"</string>
- <string name="previous_action" msgid="5181616311579820981">"Sebelumnya"</string>
- <string name="send_action" msgid="1729766205562446418">"Hantar"</string>
- <string name="reply_action" msgid="4262472229221507619">"Balas"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Balas kepada semua"</string>
- <string name="delete_action" msgid="8421026208288857155">"Padam"</string>
- <string name="forward_action" msgid="669174181042344116">"Kirim semula"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Bintang"</string>
- <string name="done_action" msgid="7497990549515580249">"Selesai"</string>
- <string name="create_action" msgid="3062715563215392251">"Buat baru"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Padam"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Tiada tindak balas cepat."</string>
- <string name="discard_action" msgid="6532206074859505968">"Buang"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Simpan draf"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Sisipkan respons pantas"</string>
- <string name="read_action" msgid="4701484794504781686">"Tandakan dibaca"</string>
- <string name="unread_action" msgid="6280399049357552826">"Tandakan tidak dibaca"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Tambah bintang"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Alih keluar bintang"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Muat semula"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Tambah akaun"</string>
- <string name="compose_action" msgid="4045702519637388045">"Karang"</string>
- <string name="search_action" msgid="6325101454876682308">"Carian"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Tetapan akaun"</string>
- <string name="settings_action" msgid="6334807007967459412">"Tetapan"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Pilihan segerak"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Tandakan belum dibaca"</string>
- <string name="move_action" msgid="3059189775933985898">"Alih"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Sk/Skt"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Tambah Sk/Skt"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Lampirkan fail"</string>
- <string name="close_action" msgid="533058985745238100">"Tutup"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Hantar semua mesej"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Pilih lampiran"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Alih ke"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Memuatkan mesej..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Masalah sambungan."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Tidak dapat memuatkan teks mesej. Mesej mungkin terlalu besar untuk dipaparkan."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Alihkan mesej"</item>
- <item quantity="other" msgid="371256717624461324">"Alihkan mesej"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Pengalihan tidak disokong pada akaun POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Tidak boleh dialihkan kerana pilihan mengandungi berbilang akaun."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Mesej dalam Draf, Peti Keluar dan Dihantar tidak boleh dialihkan."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> belum dibaca (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> belum dibaca (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> belum dibaca (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"di <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> akaun"</item>
- <item quantity="other" msgid="2723797835410343458">"di <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> akaun"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"kepada <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> mesej baru"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Semua akaun"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> akaun"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> akaun"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Peti masuk"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Peti Keluar"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Draf"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Sampah"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Dihantar"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Sarap"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Belum dibaca"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Peti masuk (belum dibaca)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Peti masuk (semua)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Paparan gabungan (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> akaun"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> akaun"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versi: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Peti masuk"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Berbintang"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Draf"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Peti Keluar"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Gabungan paparan"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Tunjukkan semua folder"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Akaun"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Folder terbaru (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Semua folder"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Folder terbaru"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Subjek"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Tiada subjek"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Muatkan lagi mesej"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> dipilih"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> dipilih"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Tiada mesej"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Kepada"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Sk"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Skt"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Subjek"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Daripada:"</string>
- <string name="to" msgid="4392614766835725698">"Kepada"</string>
- <string name="cc" msgid="7017720927911078193">"Sk"</string>
- <string name="bcc" msgid="3098643138241111579">"Skt"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Subjek"</string>
- <string name="body_hint" msgid="4279864165439577668">"Karang e-mel"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Mesej Asal --------"\n"Subjek: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Daripada: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Kepada: <xliff:g id="TO">%3$s</xliff:g>"\n"SK: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> menulis:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Sertakan teks petikan"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Sertakan teks"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Tambahkan sekurang-kurangnya satu penerima."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Sesetengah alamat e-mel tidak sah."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Fail terlalu besar untuk dilampirkan."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Sisipkan respons pantas"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> dan <xliff:g id="NUMBER">%2$d</xliff:g> yang lain"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Kepada:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Sk:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Skt:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Tarikh:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Daripada:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Subjek:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Lihat"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Pasang"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Main"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Muatkan"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Maklumat"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Simpan"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Disimpan"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Berhenti"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Lampiran disimpan sbg <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Tidak dapat menyimpan lampiran."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Satu atau lebih lampiran dalam mesej anda yang dikirim semula akan dimuat turun sebelum dihantar."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Mesej"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Jemput"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Lampiran <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Lampiran <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Tunjukkan gambar"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Sentiasa tunjukkan"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Sentiasa tunjukkan gambar daripada pengirim ini"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Gambar daripada pengirim ini akan ditunjukkan secara automatik."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Lihat dalam Kalendar"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Jemputan Kalendar"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Akan pergi?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Ya"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Mungkin"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Tidak"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Anda telah menerima jemputan ini."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Anda telah menjawab \"mungkin\" kepada jemputan ini."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Anda telah menolak jemputan ini."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Tunjukkan butiran"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Butiran mesej"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Maklumat lampiran"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Sambungan Wi-Fi diperlukan"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Tetapan Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Tetapan aplikasi"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Tidak boleh membuka lampiran."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Anda tidak boleh menyimpan atau membuka fail ini kerana jenis lampiran ini mungkin mengandungi perisian yang berbahaya."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Lampiran ini tidak boleh disimpan atau dibuka disebabkan oleh dasar keselamatan akaun ini."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Lampiran ini terlalu besar untuk dimuat turun melalui rangkaian mudah alih. Anda boleh memuat turunnya kali yang berikut anda bersambung ke rangkaian Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Tiada aplikasi dipasang yang boleh membuka lampiran ini. Cuba muat turn aplikasi yang sesuai daripada Pasaran Android."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Lampiran ini adalah satu aplikasi. Anda mesti menyemak Sumber Tidak Diketahui dalam Tetapan &gt; Aplikasi sebelum anda boleh memasangnya."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Aplikasi tidak boleh dipasang terus dari e-mel. Mula-mula simpan aplikasi ini dan kemudian pasangkannya menggunakan aplikasi Muat Turun."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Tidak dapat memuat turun lampiran."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Terdapat ralat semasa menyahkodkan mesej."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Melihat <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Padamkan mesej ini?"</item>
- <item quantity="other" msgid="4437637377522896262">"Padamkan mesej ini?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Mesej dipadamkan."</item>
- <item quantity="other" msgid="6574961322865652255">"Mesej dipadamkan."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Mesej dibuang."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Mesej disimpan sebagai draf."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Tidak boleh memaparkan lampiran."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Tidak dapat memuatkan lampiran \" <xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Membuka mesej..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> mesej dialih ke <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> mesej dialih ke <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Tidak boleh mengirim semula satu atau lebih lampiran."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Lampiran tidak dikirim semula"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> log masuk gagal."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Tidak dapat melog masuk"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Lebih baru"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Lebih lama"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Persediaan akaun"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Akaun e-mel"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Anda boleh membuat akaun anda dalam hanya beberapa langkah."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Alamat e-mel"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Kata laluan"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Hantar e-mel daripada akaun ini secara lalai"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Persediaan manual"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Taipkan alamat e-mel dan kata laluan yang sah."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Akaun pendua"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Anda telah menggunakan nama pengguna ini untuk akaun \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Kata laluan ini dimulakan atau berakhir dengan satu atau lebih aksara ruang. Banyak pelayan tidak menyokong kata laluan dengan ruang."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Mendapatkan semula maklumat akaun..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Menyemak tetapan pelayan masuk..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Menyemak tetapan pelayan keluar..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Persediaan akaun"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Akaun anda sudah disediakan dan e-mel akan muncul sebentar lagi!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Namakan akaun ini (pilihan)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Nama anda (dipaparkan pada mesej keluar)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Medan ini tidak boleh kosong."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Persediaan akaun"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Jenis akaun"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Jenis apakah akaun ini?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Persediaan akaun"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Tetapan pelayan masuk"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nama pengguna"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Kata laluan"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Pelayan"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Jenis keselamatan"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Tiada"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Terima semua perakuan)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (terima semua perakuan)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Padamkan e-mel daripada pelayan"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Jangan sekali-kali"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Apabila saya memadamkan dari Peti Masuk"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Awalan laluan IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Pilihan"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Persediaan akaun"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Tetapan pelayan keluar"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Pelayan SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Jenis keselamatan"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Memerlukan log masuk"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nama pengguna"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Kata laluan"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Persediaan akaun"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Tetapan pelayan"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Pelayan"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domain\\Nama Pengguna"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Gunakan sambungan selamat (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Terima semua sijil SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Sijil klien"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Pilih"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Gunakan sijil klien"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Alih keluar"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Tiada"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID Peranti Mudah Alih"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Tetapan akaun"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Pilihan akaun"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Kekerapan menyemak peti masuk"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Jangan sekali-kali"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automatik (Tolak)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Setiap 5 minit"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Setiap 10 minit"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Setiap 15 minit"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Setiap 30 minit"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Setiap jam"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Hantar e-mel daripada akaun ini secara lalai"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Beritahu saya apabila e-mel diterima"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Segerakkan kenalan daripada akaun ini"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Segerakkan kalendar dari akaun ini."</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Segerakkan e-mel dari akaun ini"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Muat turun lampiran secara automatik apabila disambungkan kepada Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Tidak boleh diselesaikan"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Hari untuk disegerakkan"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatik"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Satu hari"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tiga hari"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Satu minggu"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Dua minggu"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Satu bulan"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Semua"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Gunakan lalai akaun"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nama pengguna atau kata laluan salah."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nama pengguna atau kata laluan salah. "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Tidak boleh menyambung ke pelayan dengan selamat."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Tidak dapat menyambung ke pelayan dengan selamat."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Sijil klien diperlukan. Adakah anda mahu menyambung ke pelayan dengan sijil klien?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sijil itu adalah tidak sah atau tidak boleh diakses."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Pelayan memberi maklum balas dengan ralat. Semak nama pengguna dan kata laluan anda, kemudian cuba lagi."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Tidak dapat menyambung ke pelayan."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Tidak dapat menyambung ke pelayan."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS diperlukan tetapi tidak disokong oleh pelayan."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Kaedah pengesahan tidak disokong oleh pelayan."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Tidak dapat membuka sambungan ke pelayan kerana ralat keselamatan."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Tidak dapat membuka sambungan kepada pelayan."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Anda telah menaip alamat pelayan yang salah atau pelayan memerlukan versi protokol yang tidak disokong oleh E-mel."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Anda tidak mempunyai kebenaran untuk menyegerakkan dengan pelayan ini. Hubungi pentadbir pelayan anda untuk mendapatkan maklumat lanjut."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Pentadbiran keselamatan jauh"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Pelayan <xliff:g id="SERVER">%s</xliff:g> menghendaki anda membenarkannya mengawal beberapa ciri keselamatan peranti Android anda secara jauh. Adakah anda mahu menyelesaikan persediaan akaun ini?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Pelayan ini memerlukan ciri-ciri keselamatan yang tidak disokong oleh peranti Android anda, termasuk: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Anda tidak boleh menukar nama pengguna akaun. Untuk menambah sebuah akaun dengan nama pengguna yang berbeza, sentuh Tambah Akaun."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"AMARAN: Menyahaktifkan autoriti aplikasi E-mel untuk mentadbir peranti anda akan memadamkan semua akaun e-mel yang memerlukannya, bersama-sama dengan e-mel, kenalan, acara kalendar dan datanya yang lain."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Kemas kini keselamatan"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> memerlukan anda untuk mengemas kini tetapan keselamatan anda."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Akaun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" tidak dapat disegerakkan kerana keperluan keselamatan."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Akaun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" memerlukan kemas kini tetapan keselamatan."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Akaun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" telah mengubah tetapan keselamatannya, tidak tindakan pengguna diperlukan."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Kemas kini keselamatan diperlukan"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Dasar keselamatan telah berubah"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Dasar keselamatan tidak dapat dipenuhi"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Keselamatan peranti"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Pelayan <xliff:g id="SERVER">%s</xliff:g> menghendaki anda membenarkannya mengawal beberapa ciri keselamatan peranti Android anda secara jauh."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Edit butiran"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" memerlukan anda menukar PIN atau kata laluan kunci skrin anda."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"K/lln kunci skrin akn tmt tmph"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"PIN kunci skrin atau kata laluan anda telah tamat tempoh."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"K/lln knci skrn tlh tmt tmph"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Kata laluan kunci skrin akn tmt tempoh"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Anda perlu menukar PIN atau kata laluan kunci skrin anda, atau data untuk <xliff:g id="ACCOUNT">%s</xliff:g> akan dipadamkan. Adakah anda mahu menukarnya sekarang?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Kata laluan kunci skrin telah tmt tempoh"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Data untuk <xliff:g id="ACCOUNT">%s</xliff:g> sedang dipadamkan dari peranti anda. Anda boleh memulihkannya dengan menukar PIN atau kata laluan kunci skrin anda. Adakah anda ingin menukarnya sekarang?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Buang perubahan yang belum disimpan?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Tidak dapat melog masuk"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Nama pengguna atau kata laluan untuk <xliff:g id="ACCOUNT">%s</xliff:g> adalah tidak betul. Adakah anda mahu mengemaskininya sekarang?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Akaun lalai"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Hantar e-mel daripada akaun ini secara lalainya"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Muat turun lampiran"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Auto muat turun lampiran ke mesej terbaharu melalui Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Pemberitahuan e-mel"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Kekerapan penyegerakan, pemberitahuan, dsb."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Hantar pemberitahuan apabila e-mel tiba"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Kekerapan semak peti masuk"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Tetapan masuk"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nama pengguna, kata laluan dan tetapan pelayan masuk yang lain"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Tetapan keluar"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nama pengguna, kata laluan dan tetapan pelayan keluar yang lain"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Dasar yang dikuatkuasakan"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Tiada"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Dasar tidak disokong"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Tiada"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Cuba segerak"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Sentuh di sini untuk menyegerakkan akaun ini"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Nama akaun"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Nama anda"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Tandatangan"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Respons pantas"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edit teks yang anda kerap sisipkan semasa mengarang e-mel"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Lampirkan teks pada mesej yang anda hantarkan"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Tetapan pemberitahuan"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Penggunaan data"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Dasar keselamatan"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Edit respons pantas"</string>
- <string name="save_action" msgid="1988862706623227093">"Simpan"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Segerakkan kenalan"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Segerakkan kenalan untuk akaun ini"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Segerakkan kalendar"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Segerakkan acara kalendar untuk akaun ini"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Segerakkan e-mel"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Segerakkan e-mel untuk akaun ini"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Getar"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Juga bergetar semasa e-mel diterima"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Sentiasa"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Apabila senyap sahaja"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Jangan sekali-kali"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Getar"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Pilih nada dering"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Tetapan pelayan"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Alih keluar akaun"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Akaun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" akan dialih keluar daripada E-mel."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Alih keluar akaun"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Alih keluar akaun"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Pilihan segerak"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Pilihan segerak (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Tetapan penyegerakan"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Kekerapan menyemak"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Hari untuk disegerakkan"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Akaun e-mel"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Pilih akaun"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Pilih folder"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Akaun tidak ditemui. Ia mungkin telah dialih keluar."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Folder tidak ditemui. Ia mungkin telah dialihkan keluar."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Hanya sesetengah akaun \"Plus\" sahaja yang menyertakan akses POP, membenarkan program ini untuk menyambung. Jika anda tidak boleh melog masuk dengan alamat dan kata laluan e-mel anda yang betul, anda mungkin tidak mempunyai akaun \"Plus\" berbayar. Sila lancarkan penyemak imbas Web untuk mendapatkan akses kepada akaun e-mel ini."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Sebelum menyediakan akaun e-mel ini, sila lawati tapak Web T-Online dan buat kata laluan untuk akses e-mel POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Syarikat"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Tidak dapat membuat akaun. Sila cuba lagi."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-mel"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Mendayakan dasar keselamatan tentuan pelayan"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Mencari <xliff:g id="DOMAIN">%s</xliff:g>..."</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> hasil dari <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> hasil dari <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Tetapan"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Tetapan umum"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Aplikasi"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Auto mara"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Pilih skrin mana mahu ditunjukkan selepas anda memadamkan mesej"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Sembunyikan kotak semak"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Dalam senarai mesej, sentuh dan tahan untuk memilih"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Sahkan sebelum memadam"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mesej"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Sahkan sebelum menghantar"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mesej"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Mara ke"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mesej lebih baru"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mesej lebih lama"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Senarai mesej"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Saiz teks mesej"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Teks amat kecil"</item>
- <item msgid="4415205108584620118">"Teks kecil"</item>
- <item msgid="4550219696381691112">"Teks bersaiz biasa"</item>
- <item msgid="6227813549949219991">"Teks besar"</item>
- <item msgid="1197917420815786571">"Teks amat besar"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Saiz teks mesej"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Sangat kecil"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Kecil"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Biasa"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Besar"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Sangat besar"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Balas kepada semua"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Jadikan \"Balas kepada semua\" sebagai lalai untuk balasan mesej"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Minta untuk menunjukkan gambar"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Gambar dalam mesej tidak akan ditunjukkan secara automatik"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Tunjukkan gambar\" sudah dipadam bersih."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> dari <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Menunggu penyegerakan"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"E-mel anda akan muncul tidak lama lagi."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Sentuh ikon untuk menukar."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Peti Masuk Gabungan"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Belum dibaca"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Berbintang"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Memuatkan..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Sentuh untuk membuat akaun."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Anda belum membuat akaun e-mel lagi."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Cari e-mel"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Carian <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Hasil carian untuk \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Menunggu hasil"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Sesetengah pelayan mungkin mengambil masa yang lama."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Folder"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Jgn benarkan penggunaan kamera peranti"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Perlukan kata laluan peranti"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Hadkan penggunaan semula kata laluan terbaru"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Memerlukan kata laluan untuk tamat"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Perlukan peranti yang melahu mengunci skrinnya"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Hadkan bilangan peristiwa kalendar yang disegerakkan"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Hadkan bilangan e-mel yang disegerakkan"</string>
- <string name="quick_1" msgid="3426057697353380951">"Terima kasih!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Saya setuju saja!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Saya akan baca ini nanti dan hubungi anda semula."</string>
- <string name="quick_4" msgid="3988974084396883051">"Mari adakan mesyuarat untuk membincangkannya."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Segerakkan latar belakang untuk akaun ini dilumpuhkan semasa perayauan."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Menghantar jawapan..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Tiada mesej."</string>
-</resources>
diff --git a/email2/res/values-ms/uploader.xml b/email2/res/values-ms/uploader.xml
deleted file mode 100644
index 3d1ce5ddf..000000000
--- a/email2/res/values-ms/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Muat Naik Srta-merta"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Muat Naik Album Serta-merta"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Memuat naik"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Selesai"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Dijeda"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d foto • %3$d video"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d foto • %2$d video"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"bateri lemah"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"melebihi kuota foto"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"perayauan"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"menunggu WiFi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"ditunda sehingga mengecas"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"menunggu sambungan"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"mencuba semula dalam %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Tunjukkan Muat Naik Yang Belum Selesai"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Tunjukkan Muat Naik Yang Telah Selesai"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Lihat Dalam Talian"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Tunjukkan Muat Naik Yang Belum Selesai"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Sembunyikan Muat Naik Yang Belum Selesai"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Tunjukkan Butiran"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Sembunyikan Butiran"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Tetapan"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Dimuat naik %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Akaun"</string>
- <string name="upload" msgid="2615541458361216022">"Muat naik"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Batal"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Memuat naik ke "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" untuk "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Pemulaan muat naik gagal."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Fail tidak tersedia."</string>
- <string name="account_error" msgid="1904775271866104941">"Gagal mendapatkan semula maklumat akaun."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Terdapat masalah melog masuk ke dalam akaun anda."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Menunggu untuk mencuba semula"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Menunggu WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Memuat naik"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Gagal"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Selesai"</string>
- <string name="pause_state_running" msgid="711411177620353982">"memuat naik"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"dijeda secara manual"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"dijeda - bateri lemah"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"dijeda - ditunda sehingga mengecas"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"dijeda - menunggu sambungan"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"dijeda - kehabisan kuota PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"dijeda - menunggu wifi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"dijeda - merayau"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"menunggu untuk mencuba semula"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minit"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minit"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minit"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Tiada sambungan data"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Akaun kehabisan kuota cakera"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Fail tidak ditemui"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Ralat perkhidmatan"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Ralat rangkaian"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Pengesahan gagal"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Muat naik belum selesai [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Muat naik yang sudah selesai [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Jeda muat naik"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Sambung semula muat naik"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Muat naik sekarang"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Muat naik kemudian"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Jangan muat naik"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Tonton"</string>
- <string name="manager_retry" msgid="939534318469518843">"Cuba semula"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Muat naik dibatalkan"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Muat naik sudah pun selesai"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Segerakkan semua"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Segerak Terakhir:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Senarai item selesai kosong."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Muat Naik Serta-merta"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Muat naik selesai"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Muat naik dijeda"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Muat Naik Serta-merta belum lagi diaktifkan"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Fail besar akan dimuat naik melalui sambungan WiFi sahaja."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Mengimbas untuk mengesan fail..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Menyediakan <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> foto dan <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> video untuk muat naik..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Tiada foto/video tambahan yang perlu dimuat naik."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Terdapat masalah berkomunikasi dengan pelayan. Sila cuba sebentar lagi."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Segerakkan semua dibatalkan"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Segerakkan Semua"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Lihat Yang Telah Selesai"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Lihat Yang Belum Selesai"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Umum"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Jeda semua muat naik"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Kuasa"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Muat naik hanya apabila telefon sedang dicas."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Muat naik hanya apabila Wi-Fi tersedia."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Foto"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Akaun"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Syarat muat naik"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Saiz foto"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Video"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Akaun"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Akaun foto akan digunakan untuk muat naik video."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Syarat muat naik"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Tetapan kesambungan foto digunakan buat masa sekarang."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Foto sahaja melalui rangkaian mudah alih"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Foto &amp; video melalui rangkaian mudah alih"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Foto &amp; video melalui Wi-Fi sahaja"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Perihal"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Ver M/Naik Srta-mrta"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Disyorkan: 1600 piksel (untuk perkongsian, cetakan dan pelindung skrin)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Saiz asal (muat naik paling perlahan)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"dijeda - kad SD tidak tersedia"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Kad SD tidak tersedia"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Tetapan Muat Naik Serta-merta"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"M/Naik Serta-merta"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Muat naik foto &amp; video baru ke album web peribadi secara automatik"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Status muat naik"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Terperinci"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Muat naik mudah alih"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Muat naik perayauan"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Muat naik foto &amp; video apabila merayau pada rangkaian data"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Muat naik bateri"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Muat naik foto &amp; video hanya semasa mengecas"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Muat naik foto sedia ada"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Muat naik sebarang foto &amp; video sedia ada dari telefon anda sekarang"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Dilumpuhkan"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Memuat naik (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d daripada %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Dijeda: sentuh untuk menyambung semula muat naik"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Muat naik foto sedia ada"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Memuat naik foto dan video yang belum lagi dimuat naik dari telefon anda ke album peribadi di web boleh mengambil masa yang agak lama tetapi akan dilakukan dalam latar belakang. Adakah anda pasti mahu meneruskan?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Ya"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Tidak"</string>
-</resources>
diff --git a/email2/res/values-nb/strings.xml b/email2/res/values-nb/strings.xml
deleted file mode 100644
index 8cc57b263..000000000
--- a/email2/res/values-nb/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Les e-postvedlegg"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Lar appen lese e-postvedleggene dine."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Få tilgang til data om e-postleverandør"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Gir appen tilgang til e-postdatabasen, herunder mottatte meldinger, sendte meldinger, brukernavn og passord."</string>
- <string name="app_name" msgid="5815426892327290362">"E-post"</string>
- <string name="compose_title" msgid="427986915662706899">"Skriv e-post"</string>
- <string name="debug_title" msgid="5175710493691536719">"Debug"</string>
- <string name="next_action" msgid="3931301986364184415">"Neste"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Avbryt"</string>
- <string name="previous_action" msgid="5181616311579820981">"Forrige"</string>
- <string name="send_action" msgid="1729766205562446418">"Send"</string>
- <string name="reply_action" msgid="4262472229221507619">"Svar"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Svar alle"</string>
- <string name="delete_action" msgid="8421026208288857155">"Slett"</string>
- <string name="forward_action" msgid="669174181042344116">"Videresend"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Stjernemerk"</string>
- <string name="done_action" msgid="7497990549515580249">"Ferdig"</string>
- <string name="create_action" msgid="3062715563215392251">"Opprett ny"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Slett"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Ingen hurtigsvar."</string>
- <string name="discard_action" msgid="6532206074859505968">"Forkast"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Lagre utkast"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Sett inn hurtigsvar"</string>
- <string name="read_action" msgid="4701484794504781686">"Merk som lest"</string>
- <string name="unread_action" msgid="6280399049357552826">"Merk som ulest"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Legg til stjerne"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Fjern stjerne"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Oppdater"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Legg til konto"</string>
- <string name="compose_action" msgid="4045702519637388045">"Skriv e-post"</string>
- <string name="search_action" msgid="6325101454876682308">"Søk"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Kontoinnstillinger"</string>
- <string name="settings_action" msgid="6334807007967459412">"Innstillinger"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Synkroniseringsalternativer"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Merk som ulest"</string>
- <string name="move_action" msgid="3059189775933985898">"Flytt"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ kopi/blindkopi"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Legg til Cc/Bcc"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Legg ved fil"</string>
- <string name="close_action" msgid="533058985745238100">"Lukk"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Send alle meldinger"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Velg vedlegg"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Flytt til"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Laster inn meldinger ..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Tilkoblingsproblem."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Kan ikke laste inn meldingsteksten. Meldingen kan være for store til å vise."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Flytt melding"</item>
- <item quantity="other" msgid="371256717624461324">"Flytt meldinger"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Flytting støttes ikke for POP3-kontoer."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Kan ikke flytte fordi valget inneholder flere kontoer."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Meldinger i Utkast, Utboks og Sendte kan ikke flyttes."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ulest (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> uleste (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> uleste (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"i <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> kontoer"</item>
- <item quantity="other" msgid="2723797835410343458">"i <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> kontoer"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"til <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> nye meldinger"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Alle kontoer"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> konto"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> kontoer"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Innboks"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Utboks"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Utkast"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Papirkurv"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Sendt"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Nettsøppel"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Ulest"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Innboks (ulest)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Innboks (alle)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Sammenslått visning (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> konto"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> kontoer"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versjon: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Innboks"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Stjernemerket"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Utkast"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Utboks"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Kombinert visning"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Vis alle mapper"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Kontoer"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Nylige mapper (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Alle mapper"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Nylige mapper"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Emne"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Uten emne"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Hent flere meldinger"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> valgt"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> valgt"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Ingen meldinger"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Til"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Kopi"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Blindkopi"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Emne"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Fra:"</string>
- <string name="to" msgid="4392614766835725698">"Til"</string>
- <string name="cc" msgid="7017720927911078193">"Kopi"</string>
- <string name="bcc" msgid="3098643138241111579">"Blindkopi"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Emne"</string>
- <string name="body_hint" msgid="4279864165439577668">"Skriv e-post"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Original Message --------"\n"Subject: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"From: <xliff:g id="SENDER">%2$s</xliff:g>"\n"To: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Inkluder sitert tekst"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Inkluder tekst"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Legg til minst én mottaker."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Noen e-postadresser er ugyldige."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Filen er for stor til å bli lagt ved."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Sett inn hurtigsvar"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> og <xliff:g id="NUMBER">%2$d</xliff:g> andre"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Til:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Kopi:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Blindkopi:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Dato:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Fra:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Emne:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Vis"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Installer"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Spill av"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Laste inn"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Info"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Lagre"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Lagret"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stopp"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Vedlegget lagret som <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Vedlegget kunne ikke lagres."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Ett eller flere vedlegg i den videresendte e-posten blir lastet ned før du sender."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Melding"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Inviter"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Vedlegg<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Vedlegg <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Vis bilder"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Vis alltid"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Vis alltid bilder fra denne avsenderen"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Bilder fra denne avsenderen vil bli vist automatisk."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Vis i kalender"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Kalenderinvitasjon"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Skal du delta?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Ja"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Kanskje"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Nei"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Du har godtatt denne invitasjonen."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Du har svart «kanskje» på denne invitasjonen."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Du har avslått denne invitasjonen."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Vis detaljer"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Meldingsinformasjon"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Vedleggsinformasjon"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Wi-Fi-tilkobling kreves"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Wi-Fi-innstillinger"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Innstillinger for app"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Kan ikke åpne vedlegget."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Du kan ikke lagre eller åpne denne filen fordi denne typen vedlegg kan inneholde skadelig programvare."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Dette vedlegget kan ikke lagres eller åpnes på grunn av kontoens retningslinjer for sikkerhet."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Vedlegget er for stort for nedlasting over mobilnettverk. Du kan laste det ned neste gang du er koblet til et Wi-Fi-nettverk."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Det er ikke installert en app som kan åpne dette vedlegget. Prøv å laste ned en passende app fra Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Dette vedlegget er en app. Du må kontrollere Ukjente kilder i Apper under Innstillinger før du kan installere det."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Apper kan ikke installeres direkte fra e-post. Du må først lagre denne appen og deretter installere den ved hjelp av appen Nedlastinger."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Kunne ikke laste ned vedlegget."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Det oppstod en feil under dekoding av meldingen."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Viser <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Vil du slette denne meldingen?"</item>
- <item quantity="other" msgid="4437637377522896262">"Vil du slette disse meldingene?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Meldingen er slettet."</item>
- <item quantity="other" msgid="6574961322865652255">"Meldingene er slettet."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Meldingen ble forkastet."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Meldingen ble lagret som utkast."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Kan ikke vise vedlegg."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Kunne ikke laste inn vedlegget «<xliff:g id="FILENAME">%s</xliff:g>»."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Åpner melding …"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> melding flyttet til <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> meldinger flyttet til <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Kunne ikke videresende ett eller flere vedlegg."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Vedlegget ble ikke videresendt"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Pålogging til <xliff:g id="ACCOUNT_NAME">%s</xliff:g> mislyktes."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Kunne ikke logge på"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Nyere"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Eldre"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Konfigurering av konto"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"E-postkonto"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Du kan konfigurere kontoen din i noen få trinn."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-postadresse"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Passord"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Send e-post fra denne kontoen som standard"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuelt oppsett"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Angi gyldig e-postadresse og passord."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplisert konto"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Du bruker allerede dette brukernavnet for kontoen <xliff:g id="DUPLICATE">%s</xliff:g>."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Dette passordet begynner eller slutter med en eller flere mellomromstegn. Mange tjenere støtter ikke passord med mellomrom."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Henter kontoinformasjon…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Sjekker tjenerinnstillinger for inngående e-post…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Sjekker tjenerinnstillinger for utgående e-post…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Konfigurering av konto"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Kontoen din er konfigurert, og e-post er på vei."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Gi denne kontoen et navn (valgfritt)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Navnet ditt (vises i utgående meldinger)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Dette feltet må fylles ut."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Konfigurering av konto"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Kontotype"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Hva slags konto er dette?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Konfigurering av konto"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Tjenerinnstillinger for innkommende e-postmelding"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Brukernavn"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Passord"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Tjener"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Sikkerhetstype"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ingen"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Godta alle sertifikater)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (Godta alle sertifikater)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Slett e-post fra tjener"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Aldri"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Når jeg sletter den fra innboksen"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP-stiprefiks"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Valgfritt"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Konfigurering av konto"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Tjenerinnstillinger for utgående e-postmelding"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-tjener"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Sikkerhetstype"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Krev pålogging"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Brukernavn"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Passord"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Konfigurering av konto"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Innstillinger for tjener"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Tjener"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domene\\brukernavn"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Bruk sikker tilkobling (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Godkjenn alle SSL-sertifikater"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Klientsertifikat"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Velg"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Bruk klientsertifikat"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Fjern"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Ingen"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Mobilenhets-ID"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Kontoinnstillinger"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Alternativer for konto"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Frekvens for kontroll av innboks"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Aldri"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automatisk (push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Hvert 5. minutt"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Hvert 10. minutt"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Hvert 15. minutt"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Hvert 30. minutt"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Hver time"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Send e-post fra denne kontoen som standard"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Gi meg beskjed når jeg mottar e-postmeldinger"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synkroniser kontakter fra denne kontoen"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synkroniser kalender fra denne kontoen"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synkroniser e-postmeldinger fra denne kontoen"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Last ned vedlegg automatisk når tilkoblet til trådløst nettverk"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Kunne ikke fullføre"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Antall dager å synkronisere"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatisk"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Én dag"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tre dager"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Én uke"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"To uker"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Én måned"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Alle"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Bruk kontostandard"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Brukernavnet eller passordet er feil."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Brukernavnet eller passordet er feil."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Kan ikke koble til tjeneren på en sikker måte."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Kan ikke koble til tjeneren på en sikker måte."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Et klientsertifikat er påkrevd. Vil du koble til tjeneren med et klientsertifikat?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sertifikatet er ugyldig eller utilgjengelig."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Tjeneren svarte med en feil. Kontroller brukernavn og passord, og prøv på nytt."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Kan ikke koble til tjeneren."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Kan ikke koble til tjeneren."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS påkrevd, men tjeneren støtter det ikke."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Autentiseringsmetoder støttes ikke av tjeneren."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Kunne ikke åpne tilkobling til tjener på grunn av sikkerhetsfeil."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Kan ikke åpne tilkobling til tjener."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Du har angitt feil tjeneradresse, eller tjeneren krever en protokollversjon som ikke håndteres av e-post-appen."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Du har ikke tillatelse til å synkronisere med denne tjeneren. Ta kontakt med tjenerens administrator for mer informasjon."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Fjernadministrasjon av sikkerhet"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Tjeneren <xliff:g id="SERVER">%s</xliff:g> krever at den kan kontrollere noen av sikkerhetsfunksjonene på Android-enheten utenfra. Ønsker du å fullføre oppsettet av kontoen?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Denne tjeneren krever sikkerhetsfunksjoner som Android-enheten din ikke støtter, for eksempel: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Du kan ikke endre brukernavnet for en konto. Hvis du ønsker å legge til en konto med et annet brukernavn, trykker du på Legg til konto."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"ADVARSEL: Hvis du deaktiverer e-postappens rett til å administrere enheten, slettes alle e-postkontoene som krever appen sammen med e-poster, kontakter, kalenderaktiviteter og andre data."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Sikkerhetsoppdatering"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> krever at du oppdaterer sikkerhetsinnstillingene."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Kontoen <xliff:g id="ACCOUNT">%s</xliff:g> kan ikke synkroniseres på grunn av sikkerhetskrav."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Kontoen «<xliff:g id="ACCOUNT">%s</xliff:g>» krever oppdatering av sikkerhetsinnstillingene."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Kontoen «<xliff:g id="ACCOUNT">%s</xliff:g>» har endret sikkerhetsinnstillinger. Du trenger ikke å foreta deg noe."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Sikkerhetsoppdatering påkrevd"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Sikkerh.retn.linjer er endret"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Sikkerhetsretningslinjene kan ikke følges"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Enhetssikkerhet"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Tjeneren <xliff:g id="SERVER">%s</xliff:g> krever at den kan kontrollere noen av sikkerhetsfunksjonene på Android-enheten utenfra."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Rediger detaljer"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"<xliff:g id="ACCOUNT">%s</xliff:g> krever at du endrer den personlige koden eller passordet for låseskjermen."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Passord for skjermlås utløper"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Personlig kode eller passord for skjermlås er utløpt."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Passord for skjermlås utløpt"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Passord for skjermlås utløper"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Du må endre PIN-koden eller passordet for skjermlåsen snart, hvis ikke blir dataene for <xliff:g id="ACCOUNT">%s</xliff:g> slettet. Vil du endre dette nå?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Passord for skjermlås utløpt"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Dataene for <xliff:g id="ACCOUNT">%s</xliff:g> slettes fra enheten. Du kan gjenopprette dem ved å endre PIN-kode eller passord til skjermlåsen. Vil du endre det nå?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Vil du forkaste endringer som ikke er lagret?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Kunne ikke logge på"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Brukernavnet eller passordet til <xliff:g id="ACCOUNT">%s</xliff:g> er feil. Vil du oppdatere dette nå?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Standardkonto"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Bruk denne kontoen som standard for utgående e-post."</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Nedlasting av vedlegg"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Last ned vedlegg fra nye e-poster automatisk via Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Varsling om e-post"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Synkroniseringsfrekvens, varslinger m.m."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Gi meg beskjed når jeg mottar e-post"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frekvens for kontroll av innboks"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Inngående innstillinger"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Brukernavn, passord og andre innstillinger for innkommende tjener"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Utgående innstillinger"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Brukernavn, passord og andre innstillinger for utgående tjener"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Retningslinjer som håndheves"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ingen"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Retningslinjer som ikke støttes"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ingen"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Forsøk synkronisering"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Trykk her for å synkronisere denne kontoen"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Kontonavn"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Ditt navn"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Underskrift"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Hurtigsvar"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Rediger tekst som du ofte skriver inn når du skriver e-post"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Legg til tekst i e-postmeldinger"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Innstillinger for varsling"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Databruk"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Sikkerhetsretningslinjer"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Rediger hurtigsvar"</string>
- <string name="save_action" msgid="1988862706623227093">"Lagre"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synkroniser kontakter"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synkroniser kontakter fra denne kontoen"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synkroniser kalender"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synkroniser kalenderarrangement for denne kontoen"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synkroniser e-post"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synkroniser e-postmeldinger fra denne kontoen"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrering"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibrer også når nye e-postmeldinger mottas"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Alltid"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Kun i stillemodus"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Aldri"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibrering"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Velg ringetone"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Innstillinger for tjener"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Fjern"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Kontoen «<xliff:g id="ACCOUNT">%s</xliff:g>» vil bli fjernet fra e-postapplikasjonen."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Fjern konto"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Fjern konto"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Synkroniseringsalternativer"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Synkroniseringsalternativer ( <xliff:g id="MAILBOXX_NAME">%s</xliff:g> )"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Synkroniseringsinnstillinger"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Hvor ofte innboksen skal kontrolleres"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Antall dager å synkronisere"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"E-postkonto"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Velg en konto"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Velg en mappe"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Finner ikke kontoen. Den kan ha blitt fjernet."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Finner ikke mappen. Den kan ha blitt fjernet."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Bare noen «Pluss»-kontoer tilbyr POP-tilgangen denne appen trenger for å koble til. Hvis du ikke klarer å logge på med riktig e-postadresse og passord, kan det være du ikke har en betalt «Pluss»-konto. Start nettleseren for å få tilgang til slike e-postkontoer."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Før du konfigurerer denne e-postkontoen, må du gå til nettstedet for T-Online og opprette et passord for e-posttilgang via POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Exchange"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Kan ikke opprette kontoen. Prøv på nytt."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-post"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Aktiverer tjenerspesifikke sikkerhetsinnstillinger"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Søker <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> resultater fra <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultater fra <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Innstillinger"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Generelle innstillinger"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"App"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Autoflytting"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Velg hvilken skjerm som skal vises når du sletter en melding"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Skjul avmerkingsruter"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Trykk og hold nede for å merke i e-postlister"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Bekreft før sletting"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"E-poster"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Bekreft før sending"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"E-poster"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Gå til"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Nyere melding"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Eldre melding"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Meldingsliste"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Skriftstørrelse på meldingstekst"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Bitteliten tekst"</item>
- <item msgid="4415205108584620118">"Liten tekst"</item>
- <item msgid="4550219696381691112">"Tekst med normal størrelse"</item>
- <item msgid="6227813549949219991">"Stor tekst"</item>
- <item msgid="1197917420815786571">"Kjempestor tekst"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Skriftstørrelse på meldingstekst"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Bitteliten"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Liten"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Stor"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Kjempestor"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Svar alle"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Bruk «Svar alle» som standard for svar på e-poster"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Be om å vise bilder"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Bilder vises ikke automatisk i e-poster"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"«Vis bilder» er tømt."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Venter på synkronisering"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"E-posten din vil dukke opp snart."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Endre: Trykk ikon."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Kombinert innboks"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Ulest"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Stjernemerket"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Laster inn …"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Berør for å konfigurere."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Du har ikke konfigurert noen e-postkonto ennå."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Søk i e-post"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Søk i <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Søkeresultater for «<xliff:g id="ID_1">%1$s</xliff:g>»"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Venter på resultater"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Noen tjenere kan ta lang tid."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mapper"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Ikke tillat bruk av enhetens kamera"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Krev enhetspassord"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Begrens gjenbruk av nylige passord"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Krev at passord utløper"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Krev at skjerm låses på inaktive enheter"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Begrens antallet synkroniserte kalenderhendelser"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Begrens antallet synkroniserte e-poster"</string>
- <string name="quick_1" msgid="3426057697353380951">"Takk!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Det høres bra ut!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Jeg skal lese dette senere og ta kontakt."</string>
- <string name="quick_4" msgid="3988974084396883051">"Jeg foreslår at vi avtaler et møte for å diskutere dette."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Bakgrunnssynkronisering for denne kontoen er deaktivert under streifing."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Sender svar ..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Ingen e-poster."</string>
-</resources>
diff --git a/email2/res/values-nb/uploader.xml b/email2/res/values-nb/uploader.xml
deleted file mode 100644
index 0f154f6b9..000000000
--- a/email2/res/values-nb/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Direkteopplasting"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Album for direkteopplasting"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Laster opp"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Fullført"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Satt på pause"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d bilder • %3$d videoer"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d bilder • %2$d videoer"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"lavt batteri"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"bildekvote er overskredet"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"venter på Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"forsinket inntil enheten lades"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"venter på tilkobling"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"prøver på nytt om %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Vis ventende opplastinger"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Vis fullførte opplastinger"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Se på nettet"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Vis ventende opplastinger"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Skjul ventende opplastinger"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Vis detaljer"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Skjul detaljer"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Innstillinger"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Lastet opp %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Konto"</string>
- <string name="upload" msgid="2615541458361216022">"Last opp"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Avbryt"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Laster opp til "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" for "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Opplastingsinitialiserign mislyktes."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Filen er ikke tilgjengelig."</string>
- <string name="account_error" msgid="1904775271866104941">"Kan ikke hente kontoinformasjon."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Det oppsto et problem under pålogging til kontoen din."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Venter på å prøve på nytt"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Venter på Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Laster opp"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Mislyktes"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Fullført"</string>
- <string name="pause_state_running" msgid="711411177620353982">"laster opp"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"manuelt satt på pause"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"satt på pause – lavt batteri"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"satt på pause – utsatt inntil enheten lades"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"satt på pause – venter på tilkobling"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"satt på pause – PWA-kvote brukt opp"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"satt på pause – venter på Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"satt på pause – roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"venter på å prøve på nytt"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"Ett minutt"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"To minutter"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"Fem minutter"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Ingen datatilkobling"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Kontoen har ingen tilgjengelig diskkvote"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Finner ikke filen"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Tjenestefeil"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Nettverksfeil"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Autentisering mislyktes"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Ventende opplastinger [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Fullførte opplastinger [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Stans opplastinger midlertidig"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Gjenoppta opplastinger"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Last opp nå"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Last opp senere"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Ikke last opp"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Se"</string>
- <string name="manager_retry" msgid="939534318469518843">"Prøv på nytt"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Opplasting avbrutt"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Opplastingen er ferdig"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Synkroniser alle"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Siste synkronisering:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Listen over fullførte elementer er tom."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Direkteopplasting"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Opplastinger er fullført"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Opplastinger satt på pause"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Direkteopplasting er ikke aktivert ennå"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Store filer kan lastes opp bare via Wi-Fi-tilkobling."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Skanner etter filer …"</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Forbereder <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> bilder og <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> videoer for opplasting …"</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Ingen flere bilder eller videoer trenger å lastes opp."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Det oppsto et problem under kommunikasjon med tjeneren. Prøv på nytt senere."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Synkronisering av alle er avbrutt"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Synkroniser alle"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Se fullførte"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Se ventende"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Generelt"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Stans alle opplastinger midlertidig"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Strøm"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Last opp bare når telefonen lades opp."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Last opp bare når trådløst nettverk er tilgjengelig."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Bilder"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Konto"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Opplastingsforhold"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Bildestørrelse"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videoer"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Konto"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Bildekontoen blir brukt til videoopplastinger."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Opplastingsforhold"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Tilkoblingsinnstillinger for bilder brukes inntil videre."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Bare bilder via mobile nettverk"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Bilder og videoer via mobilnettverk"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Bilder og videoer bare via Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Info"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Direktopplast.-ver."</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Anbefalt: 1600 piksler (for deling, utskrift og skjermbeskyttere)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Originalstørrelse (tregeste opplasting)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"midlertidig stoppet – SD-kort er ikke tilgjengelig"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD-kortet er ikke tilgjengelig"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Innst. for dir.oppl."</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Direkteopplasting"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Automatisk opplasting av nye bilder og videoer til privat nettalbum"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Opplastingsstatus"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Avansert"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Opplastinger fra mobil"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Opplastinger ved roaming"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Last opp bilder og videoer ved roaming på datanettverk"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Batteriopplastinger"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Last opp bilder og videoer bare under lading"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Last opp eksisterende bilder"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Last opp alle eksisterende bilder og videoer fra telefonen din nå"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Deaktivert"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Laster opp (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d av %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Midlertidig stoppet: Trykk for å gjenoppta opplasting"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Last opp eksisterende bilder"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Det kan ta litt tid å laste opp bilder og videoer som ikke allerede har blitt lastet opp fra telefonen din, til et privat album på nettet. Handlingen utføres imidlertid i bakgrunnen. Er du sikker på at du vil fortsette?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Ja"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Nei"</string>
-</resources>
diff --git a/email2/res/values-nl/strings.xml b/email2/res/values-nl/strings.xml
deleted file mode 100644
index 8f25497fc..000000000
--- a/email2/res/values-nl/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"E-mailbijlagen lezen"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Hiermee kan de app uw e-mailbijlagen lezen."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Gegevens e-mailprovider openen"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Hiermee geeft u deze app toegang tot uw e-maildatabase, inclusief ontvangen berichten, verzonden berichten, gebruikersnamen en wachtwoorden."</string>
- <string name="app_name" msgid="5815426892327290362">"E-mail"</string>
- <string name="compose_title" msgid="427986915662706899">"Opstellen"</string>
- <string name="debug_title" msgid="5175710493691536719">"Foutopsporing"</string>
- <string name="next_action" msgid="3931301986364184415">"Volgende"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Annuleren"</string>
- <string name="previous_action" msgid="5181616311579820981">"Vorige"</string>
- <string name="send_action" msgid="1729766205562446418">"Verzenden"</string>
- <string name="reply_action" msgid="4262472229221507619">"Reageren"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Allen antwoord"</string>
- <string name="delete_action" msgid="8421026208288857155">"Verwijderen"</string>
- <string name="forward_action" msgid="669174181042344116">"Doorsturen"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Ster toevoegen"</string>
- <string name="done_action" msgid="7497990549515580249">"Gereed"</string>
- <string name="create_action" msgid="3062715563215392251">"Nieuwe maken"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Verwijderen"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Geen snelle reacties."</string>
- <string name="discard_action" msgid="6532206074859505968">"Weggooien"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Concept opslaan"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Snelle reactie invoegen"</string>
- <string name="read_action" msgid="4701484794504781686">"Markeren als gelezen"</string>
- <string name="unread_action" msgid="6280399049357552826">"Markeren als ongelezen"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Ster toevoegen"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Ster verwijderen"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Vernieuwen"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Account toevoegen"</string>
- <string name="compose_action" msgid="4045702519637388045">"Opstellen"</string>
- <string name="search_action" msgid="6325101454876682308">"Zoeken"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Accountinstellingen"</string>
- <string name="settings_action" msgid="6334807007967459412">"Instellingen"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Synchronisatieopties"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Markeren als ongelezen"</string>
- <string name="move_action" msgid="3059189775933985898">"Verpl."</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Cc/Bcc toevoegen"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Bestand bijvoegen"</string>
- <string name="close_action" msgid="533058985745238100">"Sluiten"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Alle berichten verzenden"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Bijlage kiezen"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Verplaatsen naar"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Berichten laden..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Verbindingsprobleem."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Kan de berichttekst niet laden. Het bericht is mogelijk te groot om weer te geven."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Bericht verplaatsen"</item>
- <item quantity="other" msgid="371256717624461324">"Berichten verplaatsen"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Verplaatsen wordt niet ondersteund in POP3-accounts."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Verplaatsen is niet mogelijk. Selectie bevat meerdere accounts."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Berichten in de mappen \'Concepten\', \'Postvak UIT\' en \'Verzonden berichten\' kunnen niet worden verplaatst."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ongelezen (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ongelezen (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ongelezen (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"in <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> accounts"</item>
- <item quantity="other" msgid="2723797835410343458">"in <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> accounts"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"naar <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> nieuwe berichten"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Alle accounts"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> account"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> accounts"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Postvak IN"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Postvak UIT"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Concepten"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Prullenbak"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Verzonden"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Ongewenst"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Ongelezen"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Inbox (ongelezen)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Inbox (alle)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Gecombineerde weergave (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> account"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> accounts"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versie: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Postvak IN"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Met ster"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Concepten"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Postvak UIT"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Gecombineerde weergave"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Alle mappen weergeven"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Accounts"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Recente mappen (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Alle mappen"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Recente mappen"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Onderwerp"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Geen onderwerp"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Meer berichten laden"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> geselecteerd"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> geselecteerd"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Geen berichten"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Naar"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Onderwerp"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Van:"</string>
- <string name="to" msgid="4392614766835725698">"Aan"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Bcc"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Onderwerp"</string>
- <string name="body_hint" msgid="4279864165439577668">"E-mail opstellen"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Oorspronkelijk bericht --------"\n"Onderwerp: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Van: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Aan: <xliff:g id="TO">%3$s</xliff:g>"\n"Cc: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>schreef:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Tekst uit oorspronkelijk bericht weergeven"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Tekst opnemen"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Voeg ten minste één ontvanger toe."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Sommige e-mailadressen zijn ongeldig."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Bestand is te groot om bij te voegen."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Snelle reactie invoegen"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> en <xliff:g id="NUMBER">%2$d</xliff:g> anderen"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Aan:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Datum:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Van:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Onderwerp:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Weergeven"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Installeren"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Afspelen"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Laden"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Informatie"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Opslaan"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Opgeslagen"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stoppen"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Bijlage opgeslagen als <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Kan bijlage niet opslaan."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Een of meer bijlagen in uw doorgestuurde bericht worden gedownload voordat het bericht wordt verzonden."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Bericht"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Uitnodigen"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Bijlage <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Bijlagen <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Afbeeldingen weergeven"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Altijd weergeven"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Foto\'s van deze afzender altijd weergeven"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Foto\'s van deze afzender worden automatisch weergegeven."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Weergeven in Agenda"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Agenda-uitnodiging"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Komt u ook?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Ja"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Misschien"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Nee"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"U heeft deze uitnodiging geaccepteerd."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"U heeft \'misschien\' geantwoord op deze uitnodiging"</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"U heeft deze uitnodiging afgewezen."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Details weergeven"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Berichtdetails"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Bijlage-informatie"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Wi-Fi-verbinding vereist"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Wi-Fi-instellingen"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"App-instellingen"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Kan bijlage niet openen."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"U kunt dit bericht niet opslaan of openen omdat dit type bijlage schadelijke software kan bevatten."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Deze bijlage kan niet worden opgeslagen of geopend als gevolg van het beveiligingsbeleid van dit account."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Deze bijlage is te groot om te downloaden via een mobiel netwerk. U kunt de bijlage downloaden wanneer u weer verbinding maakt met een Wi-Fi-netwerk."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Er is geen app geïnstalleerd die de bijlage kan openen. Download een geschikte app van Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Deze bijlage is een app. U moet \'Onbekende bronnen\' aanvinken in \'Instellingen\' &gt; \'Apps\' voordat u de app kunt installeren."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Apps kunnen niet rechtstreeks via e-mail worden geïnstalleerd. Sla de app eerst op en installeer deze via de app Downloads."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Kan de bijlage niet downloaden."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Er is een fout opgetreden tijdens het decoderen van het bericht."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"<xliff:g id="FILENAME">%s</xliff:g> is geopend"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Dit bericht verwijderen?"</item>
- <item quantity="other" msgid="4437637377522896262">"Deze berichten verwijderen?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Bericht verwijderd."</item>
- <item quantity="other" msgid="6574961322865652255">"Berichten verwijderd."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Bericht wordt verwijderd"</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Bericht opgeslagen als concept."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Kan bijlage niet weergegeven."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Kan de bijlage \'<xliff:g id="FILENAME">%s</xliff:g>\' niet laden."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Bericht openen..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> bericht verplaatst naar <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> berichten verplaatst naar <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Kan een of meer bijlagen niet doorsturen."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Bijlage niet doorgestuurd"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g>: aanmelden mislukt."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Kan niet aanmelden"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Nieuwer"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Ouder"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Accountinstellingen"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"E-mailaccount"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"U kunt uw account in slechts enkele stappen instellen."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-mailadres"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Wachtwoord"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"E-mail standaard vanaf dit account verzenden"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Handmatig instellen"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Typ een geldig e-mailadres en wachtwoord."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dubbel account"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"U gebruikt deze gebruikersnaam al voor het account \'<xliff:g id="DUPLICATE">%s</xliff:g>\'."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Dit wachtwoord begint of eindigt met een of meer spaties. Veel servers bieden geen ondersteuning voor wachtwoorden met spaties."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Accountinformatie ophalen..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Serverinstellingen inkomende e-mail controleren..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Serverinstellingen uitgaande e-mail controleren..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Accountinstellingen"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Uw account is ingesteld en er is e-mail onderweg."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Geef dit account een naam (optioneel)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Uw naam (wordt weergegeven in uitgaande berichten)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Dit veld mag niet leeg zijn."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Accountinstellingen"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Accounttype"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Welk type account is dit?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Accountinstellingen"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Instellingen voor de inkomende server"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Gebruikersnaam"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Wachtwoord"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Poort"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Beveiligingstype"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Geen"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Alle certificaten accepteren)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (Alle certificaten accepteren)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"E-mail verwijderen van server"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Nooit"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Als ik verwijder uit mijn Postvak IN"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Voorvoegsel IMAP-pad"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Optioneel"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Accountinstellingen"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Instellingen voor de uitgaande server"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-server"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Poort"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Beveiligingstype"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Aanmelding vereisen"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Gebruikersnaam"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Wachtwoord"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Accountinstellingen"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Serverinstellingen"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Server"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domein/gebruikersnaam"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Beveiligde verbinding (SSL) gebruiken"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Alle SSL-certificaten accepteren"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Clientcertificaat"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Selecteren"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Klantcertificaat gebruiken"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Verwijderen"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Geen"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Mobiele apparaat-id"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Accountinstellingen"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Accountopties"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Controlefrequentie inbox"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nooit"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automatisch (push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Elke 5 minuten"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Elke 10 minuten"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Elke 15 minuten"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Elke 30 minuten"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Elk uur"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"E-mail standaard vanaf dit account verzenden"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Stuur me een melding wanneer er e-mail binnenkomt"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Contacten van dit account synchroniseren"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Agenda van dit account synchroniseren"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"E-mail van dit account synchroniseren"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Bijlagen automatisch downloaden indien verbonden met Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Is niet voltooid"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dagen om te synchroniseren"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatisch"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Eén dag"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Drie dagen"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Eén week"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Twee weken"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Eén maand"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Alles"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Accountstandaard gebruiken"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Gebruikersnaam of wachtwoord is onjuist."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Gebruikersnaam of wachtwoord is onjuist. "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Kan geen veilige verbinding met de server tot stand brengen."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Kan geen veilige verbinding met de server tot stand brengen."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Er is een client-certificaat vereist. Wilt u verbinding maken met de server met een client-certificaat?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Het certificaat is ongeldig of niet toegankelijk."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"De server heeft een fout geretourneerd. Controleer uw gebruikersnaam en wachtwoord en probeer het opnieuw."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Kan geen verbinding maken met de server."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Kan geen verbinding maken met de server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS is vereist maar wordt niet ondersteund door de server."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Verificatiemethoden worden niet ondersteund door de server."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Kan geen verbinding maken met de server wegens een beveiligingsfout."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Kan geen verbinding met de server maken."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"U heeft een onjuist serveradres getypt of de server vereist een protocolversie die niet door E-mail wordt ondersteund."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"U heeft geen toestemming met deze server te synchroniseren. Neem voor meer informatie contact op met de beheerder van uw server."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Extern beveiligingsbeheer"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"De server <xliff:g id="SERVER">%s</xliff:g> vereist dat u de server toestemming geeft bepaalde beveiligingsfuncties van uw Android-apparaat extern te bedienen. Wilt u het instellen van dit account voltooien?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Voor deze server zijn beveiligingsfuncties nodig die uw Android-apparaat niet ondersteunt, waaronder: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"U kunt de gebruikersnaam van een account niet wijzigen. Als u een account met een andere gebruikersnaam wilt toevoegen, raakt u \'Account toevoegen\' aan."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"WAARSCHUWING: als u de rechten van de app E-mail voor het beheren van uw apparaat uitschakelt, worden alle e-mailaccounts verwijderd waarvoor deze rechten vereist zijn, samen met de bijbehorende e-mails, contacten, agenda-afspraken en andere gegevens."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Beveiligingsupdate"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Voor <xliff:g id="ACCOUNT">%s</xliff:g> moet u uw beveiligingsinstellingen bijwerken."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Account \'<xliff:g id="ACCOUNT">%s</xliff:g>\' kan niet worden gesynchroniseerd wegens beveiligingsvereisten."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Account \'<xliff:g id="ACCOUNT">%s</xliff:g>\' vereist een update van de beveiligingsinstellingen."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"De beveiligingsinstellingen van het account \'<xliff:g id="ACCOUNT">%s</xliff:g>\' zijn gewijzigd, er is geen gebruikersactie vereist."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Beveiligingsupdate vereist"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Beveiligingsbeleid gewijzigd"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Beveil.-beleid niet voldaan"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Apparaatbeveiliging"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"De server <xliff:g id="SERVER">%s</xliff:g> vereist dat u de server toestemming geeft bepaalde beveiligingsfuncties van uw Android-apparaat extern te bedienen."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Details bewerken"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"Voor \'<xliff:g id="ACCOUNT">%s</xliff:g>\' moet u uw pincode of wachtwoord voor schermvergrendeling wijzigen."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Ww. schermvergr. bijna verlopen"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Uw PIN-code of wachtwoord voor schermvergrendeling is verlopen."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Wachtw. schermvergr. verlopen"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Wachtw. schermvergr. bijna verlopen"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"U moet uw pincode of wachtwoord voor schermvergrendeling snel wijzigen, of de gegevens voor <xliff:g id="ACCOUNT">%s</xliff:g> worden gewist. Wilt u dit nu wijzigen?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Wachtwoord schermvergrendeling verlopen"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"De gegevens voor <xliff:g id="ACCOUNT">%s</xliff:g> worden gewist op uw apparaat. U kunt het account herstellen door uw pincode of wachtwoord voor schermvergrendeling te wijzigen. Nu wijzigen?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Niet-opgeslagen wijzigingen annuleren?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Kan niet aanmelden"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"De gebruikersnaam of het wachtwoord voor <xliff:g id="ACCOUNT">%s</xliff:g> is onjuist. Wilt u deze nu bijwerken?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Standaardaccount"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"E-mail standaard vanaf dit account verzenden"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Bijlagen downloaden"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Bijlagen van recente berichten automatisch downloaden via wifi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Meldingen via e-mail"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Synchronisatiefrequentie, meldingen, enzovoort"</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Melding sturen wanneer e-mail binnenkomt"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Controlefrequentie inbox"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Instellingen inkomende e-mail"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Gebruikersnaam, wachtwoord en andere inst. voor inkomende server"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Instellingen uitgaande e-mail"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Gebruikersnaam, wachtwoord en andere inst. voor uitgaande server"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Afgedwongen beleid"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Geen"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Niet-ondersteund beleid"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Geen"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Poging tot synchroniseren"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Raak dit aan om dit account te synchroniseren"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Accountnaam"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Uw naam"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Handtekening"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Snelle reacties"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Tekst bewerken die u vaak invoegt wanneer u e-mails opstelt"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Tekst toevoegen aan berichten die u verzendt"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Instellingen voor meldingen"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Gegevensgebruik"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Beveiligingsbeleid"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Snelle reactie bewerken"</string>
- <string name="save_action" msgid="1988862706623227093">"Opslaan"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Contacten synchroniseren"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Contacten voor dit account synchroniseren"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Agenda synchroniseren"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Agenda-afspraak voor dit account synchroniseren"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"E-mail synch."</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"E-mail voor dit account synchroniseren"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Trillen"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Ook trillen wanneer er e-mail binnenkomt"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Altijd"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Alleen indien stil"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Nooit"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Trillen"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Beltoon kiezen"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Serverinstellingen"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Account verwijderen"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"De account <xliff:g id="ACCOUNT">%s</xliff:g> wordt verwijderd van E-mail"</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Account verwijderen"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Account verwijderen"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Synchronisatieopties"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Synchronisatieopties (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Synchronisatie-instellingen"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Frequentie controleren"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Dagen om te synchroniseren"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"E-mailaccount"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Een account selecteren"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Een map selecteren"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Account niet gevonden. Misschien is dit account verwijderd."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Map niet gevonden. Misschien is deze map verwijderd."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Alleen sommige Plus-accounts hebben POP-toegang waarmee dit programma verbinding kan maken. Als u zich niet kunt aanmelden met het juiste e-mailadres en wachtwoord, heeft u mogelijk niet betaald voor uw Plus-account. Start de webbrowser voor toegang tot deze e-mailaccounts."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Voordat u dit e-mailaccount instelt, gaat u naar de website van T-Online en maakt u een wachtwoord voor toegang tot e-mail via POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Zakelijk"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Kan het account niet maken. Probeer het opnieuw."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-mail"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Door de server aangegeven beveiligingsbeleid inschakelen"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"<xliff:g id="DOMAIN">%s</xliff:g> zoeken…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> resultaat van <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultaten van <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Instellingen"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Algemene instellingen"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"App"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatisch doorgaan"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Het scherm selecteren dat wordt getoond na het verw. van bericht"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Selectievakjes verbergen"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Blijven aanraken in lijsten met berichten om te selecteren"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Bevestigen vóór verwijderen"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Berichten"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Bevestigen vóór verzenden"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Berichten"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Doorgaan naar"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Nieuwer bericht"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Ouder bericht"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Berichtenlijst"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Tekstgrootte bericht"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Heel kleine tekst"</item>
- <item msgid="4415205108584620118">"Kleine tekst"</item>
- <item msgid="4550219696381691112">"Normale tekst"</item>
- <item msgid="6227813549949219991">"Grote tekst"</item>
- <item msgid="1197917420815786571">"Heel grote tekst"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Tekstgrootte bericht"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Minuscuul"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Klein"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normaal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Groot"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Enorm"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Allen beantwoorden"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"\'Allen beantwoorden\' instellen als standaardoptie voor berichtreacties"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Vragen om afbeeldingen weer te geven"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Afbeeldingen in berichten worden niet automatisch weergegeven"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\'Afbeeldingen weergeven\' gewist."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> van <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Wachten op synchronisatie"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Uw e-mail wordt over enkele ogenblikken weergegeven."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Raak pictogram aan voor wijzigen."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Gecombineerde Inbox"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Ongelezen"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Met ster"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Laden..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Aanraken voor instellen."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"U heeft nog geen e-mailaccount ingesteld."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Zoeken in e-mail"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Zoek naar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Zoekresultaten voor \'<xliff:g id="ID_1">%1$s</xliff:g>\'"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Wachten op resultaten"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Het duurt soms langer voordat servers reageren."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mappen"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Gebruik van apparaatcamera niet toestaan"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Apparaatwachtwoord vereisen"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Hergebruik recente wachtwoorden beperken"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Vereisen dat wachtwoord verloopt"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Inactief apparaat vergrendelt scherm"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Aantal gesynchroniseerde agenda-afspraken beperken"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Aantal gesynchroniseerde e-mails beperken"</string>
- <string name="quick_1" msgid="3426057697353380951">"Hartelijk dank!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Dat lijkt me prima."</string>
- <string name="quick_3" msgid="8061819976353395585">"Ik zal dit later lezen en kom er dan op terug."</string>
- <string name="quick_4" msgid="3988974084396883051">"Laten we een afspraak maken om dit te bespreken."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Achtergrondsynchronisatie voor dit account is uitgeschakeld tijdens roaming."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Reactie verzenden..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Geen berichten."</string>
-</resources>
diff --git a/email2/res/values-nl/uploader.xml b/email2/res/values-nl/uploader.xml
deleted file mode 100644
index 451f05e96..000000000
--- a/email2/res/values-nl/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Automatisch uploaden"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Auto-uploadalbum"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Uploaden"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Voltooid"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Onderbroken"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d foto\'s • %3$d video\'s"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d foto\'s • %2$d video\'s"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"de accu is bijna leeg"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"fotoquotum overschreden"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"wachten op Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"uitgesteld tot opladen"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"wachten op verbinding"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"opnieuw proberen over %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Uploads in behandeling weergeven"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Voltooide uploads weergeven"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Online bekijken"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Uploads in behandeling weergeven"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Uploads in behandeling verbergen"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Details weergeven"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Details verbergen"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Instellingen"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Geüpload op %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Account"</string>
- <string name="upload" msgid="2615541458361216022">"Uploaden"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Annuleren"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Uploaden naar "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" voor "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \'%2$s\'"</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Het starten van de upload is mislukt."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Het bestand is niet beschikbaar."</string>
- <string name="account_error" msgid="1904775271866104941">"Ophalen van accountgegevens mislukt."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Er is een probleem opgetreden bij het aanmelden bij uw account."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Wachten op nieuwe poging"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Wachten op Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Uploaden"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Mislukt"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Voltooid"</string>
- <string name="pause_state_running" msgid="711411177620353982">"uploaden"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"handmatig gepauzeerd"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"onderbroken - de accu is bijna leeg"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"onderbroken - uitgesteld tot opladen"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"onderbroken - wachten op verbinding"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"onderbroken - PWA-quotum overschreden"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"onderbroken - wachten op Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"onderbroken - roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"wachten op nieuwe poging"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minuut"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minuten"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minuten"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Geen gegevensverbinding"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Schijfquota voor account is bereikt"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Bestand niet gevonden"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Servicefout"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Netwerkfout"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Verificatie mislukt"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Uploads in behandeling [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Voltooide uploads [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Uploads onderbreken"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Uploads hervatten"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Nu uploaden"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Later uploaden"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Niet uploaden"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Weergeven"</string>
- <string name="manager_retry" msgid="939534318469518843">"Opnieuw proberen"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Upload geannuleerd"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Upload al voltooid"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Alles synchroniseren"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Laatste synchronisatie:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Lijst met voltooide items is leeg."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Automatisch uploaden"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Uploads voltooid"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Uploads onderbroken"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Automatisch uploaden is nog niet geactiveerd"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Grote bestanden worden alleen geüpload via een Wi-Fi-verbinding."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Scannen naar bestanden..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"<xliff:g id="PHOTOCOUNT">%1$d</xliff:g> foto\'s en <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> video\'s voorbereiden op uploaden..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"U hoeft geen aanvullende foto\'s/video\'s te uploaden."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Er is een fout opgetreden tijdens de communicatie met de server. Probeer het later opnieuw."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Alles synchroniseren is geannuleerd"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Alles synchroniseren"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Voltooide uploads bekijken"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Items in behandeling weergeven"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Algemeen"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Alle uploads onderbreken"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Opladen vereist"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Alleen uploaden wanneer de telefoon wordt opgeladen."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Alleen uploaden wanneer Wi-Fi beschikbaar is."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Foto\'s"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Account"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Uploadvoorwaarden"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Formaat van foto"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Video\'s"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Account"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Het account voor foto\'s wordt gebruikt voor video-uploads."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Uploadvoorwaarden"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"De verbindingsinstellingen van foto\'s worden momenteel gebruikt."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Alleen foto\'s uploaden via mobiele netwerken"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Foto\'s en video\'s via mobiele netwerken"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Foto\'s en video\'s alleen via Wi-Fi uploaden"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Over"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Auto-uploadversie"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Aanbevolen: 1600 pixels (voor delen, afdrukken en screensavers)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Oorspronkelijk formaat (traagste upload)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"onderbroken - SD-kaart niet beschikbaar"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD-kaart niet beschikbaar"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Inst. Auto-uploaden"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Automatisch uploaden"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Nieuwe foto\'s en video\'s automatisch uploaden naar een persoonlijk webalbum"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Uploadstatus"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Geavanceerd"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Mobiele uploads"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Roaming uploads"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Foto\'s en video\'s uploaden bij roaming op gegevensnetwerk"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Accu-uploads"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Foto\'s en video\'s alleen uploaden tijdens het opladen"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Bestaande foto\'s uploaden"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Bestaande foto\'s en video\'s op uw telefoon nu uploaden"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Uitgeschakeld"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Uploaden (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d van %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Onderbroken: raak deze melding aan om het uploaden te hervatten"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Bestaande foto\'s uploaden"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Het kan even duren voordat foto\'s en video\'s zijn geüpload die nog niet van uw telefoon naar een privéalbum op internet zijn geüpload, maar dit vindt plaats op de achtergrond. Weet u zeker dat u wilt doorgaan?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Ja"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Nee"</string>
-</resources>
diff --git a/email2/res/values-pl/strings.xml b/email2/res/values-pl/strings.xml
deleted file mode 100644
index 443ebcf71..000000000
--- a/email2/res/values-pl/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Odczyt załączników do e-maili"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Pozwala aplikacji na odczyt załączników do e-maili."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Dostęp do danych dostawcy poczty e-mail"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Zezwala aplikacji na dostęp do bazy danych e-maili, w tym odebranych i wysłanych wiadomości, nazw użytkowników oraz haseł."</string>
- <string name="app_name" msgid="5815426892327290362">"Poczta"</string>
- <string name="compose_title" msgid="427986915662706899">"Utwórz"</string>
- <string name="debug_title" msgid="5175710493691536719">"Debuguj"</string>
- <string name="next_action" msgid="3931301986364184415">"Dalej"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Anuluj"</string>
- <string name="previous_action" msgid="5181616311579820981">"Wstecz"</string>
- <string name="send_action" msgid="1729766205562446418">"Wyślij"</string>
- <string name="reply_action" msgid="4262472229221507619">"Odpowiedz"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Odpowiedz wszystkim"</string>
- <string name="delete_action" msgid="8421026208288857155">"Usuń"</string>
- <string name="forward_action" msgid="669174181042344116">"Przekaż dalej"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Oznacz gwiazdką"</string>
- <string name="done_action" msgid="7497990549515580249">"Gotowe"</string>
- <string name="create_action" msgid="3062715563215392251">"Utwórz nową"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Usuń"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Brak szybkich odpowiedzi"</string>
- <string name="discard_action" msgid="6532206074859505968">"Odrzuć"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Zapisz wersję roboczą"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Wstaw szybką odpowiedź"</string>
- <string name="read_action" msgid="4701484794504781686">"Zaznacz jako przeczytane"</string>
- <string name="unread_action" msgid="6280399049357552826">"Zaznacz jako nieprzeczytane"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Dodaj gwiazdkę"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Usuń oznaczenie gwiazdką"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Odśwież"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Dodaj konto"</string>
- <string name="compose_action" msgid="4045702519637388045">"Utwórz"</string>
- <string name="search_action" msgid="6325101454876682308">"Szukaj"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Ustawienia konta"</string>
- <string name="settings_action" msgid="6334807007967459412">"Ustawienia"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Opcje synchronizacji"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Oznacz jako nieprzeczytane"</string>
- <string name="move_action" msgid="3059189775933985898">"Przenieś"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ DW/UDW"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Dodaj DW/UDW"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Załącz plik"</string>
- <string name="close_action" msgid="533058985745238100">"Zamknij"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Wyślij wszystkie wiadomości"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Wybierz załącznik"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Przenieś do"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Wczytywanie wiadomości…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Problem z połączeniem"</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Nie można wczytać tekstu wiadomości. Może ona być za duża do wyświetlenia."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Przenieś wiadomość"</item>
- <item quantity="other" msgid="371256717624461324">"Przenieś wiadomości"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Przenoszenie nie jest obsługiwane na kontach POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Nie można przenieść, ponieważ wybrane elementy pochodzą z wielu kont."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Nie można przenosić wiadomości w Kopiach roboczych, Do wysłania ani Wysłanych."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"Nieprzeczytane: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"Nieprzeczytane: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"Nieprzeczytane: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"na <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> kontach"</item>
- <item quantity="other" msgid="2723797835410343458">"na <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> kontach"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"na konto <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"Nowe wiadomości: <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Wszystkie konta"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> konto"</item>
- <item quantity="other" msgid="8548760449976444566">"Konta: <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Odebrane"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Do wysłania"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Kopie robocze"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Kosz"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Wysłane"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Wiadomości-śmieci"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Nieprzeczytane"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Skrz. odbiorcza (nieprzecz.)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Skrzynka odbiorcza (wszystkie)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Widok połączony (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> konto"</item>
- <item quantity="other" msgid="4145163147488719025">"Konta: <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Wersja: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Odebrane"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Oznaczone gwiazdką"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Kopie robocze"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Do wysłania"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Widok łączony"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Pokaż wszystkie foldery"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Konta"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Ostatnie foldery (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Wszystkie foldery"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Ostatnie foldery"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Temat"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Brak tematu"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Załaduj więcej wiadomości"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"Wybrano: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="7901361399231876038">"Wybrano: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Brak wiadomości"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Do"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"DW"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"UDW"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Temat"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Od:"</string>
- <string name="to" msgid="4392614766835725698">"Do"</string>
- <string name="cc" msgid="7017720927911078193">"DW"</string>
- <string name="bcc" msgid="3098643138241111579">"UDW"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Temat"</string>
- <string name="body_hint" msgid="4279864165439577668">"Napisz e-maila."</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Wiadomość oryginalna --------"\n"Temat: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Od: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Do: <xliff:g id="TO">%3$s</xliff:g>"\n"DW: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> napisał(a):"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Dołącz cytowany tekst"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Dołącz tekst"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Dodaj co najmniej jednego adresata."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Niektóre adresy e-mail są nieprawidłowe."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Plik jest zbyt duży do załączenia."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Wstaw szybką odpowiedź"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> i inni (<xliff:g id="NUMBER">%2$d</xliff:g>)"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Do:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"DW:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"UDW:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Data:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Od:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Temat:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Wyświetl"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Zainstaluj"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Odtwórz"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Wczytaj"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Informacje"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Zapisz"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Zapisany"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Zatrzymaj"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Załącznik zapisany jako <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Nie można zapisać załącznika."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Co najmniej jeden załącznik w przekazywanej wiadomości zostanie pobrany przed wysłaniem."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Wiadomość"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Zaproś"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Załącznik (<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>)"</item>
- <item quantity="other" msgid="974463163535515223">"Załączniki (<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>)"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Pokaż obrazy"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Zawsze pokazuj"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Zawsze pokazuj obrazy od tego nadawcy"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Obrazy od tego nadawcy będą pokazywane automatycznie."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Wyświetl w kalendarzu"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Zaproszenie z kalendarza"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Zamierzasz uczestniczyć?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Tak"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Może"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Nie"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Zaakceptowałeś(aś) to zaproszenie."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Nie udzieliłeś(aś) konkretnej odpowiedzi na to zaproszenie."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Odrzuciłeś(aś) to zaproszenie."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Pokaż szczegóły"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Szczegóły wiadomości"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Informacje o załączniku"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Wymagane połączenie Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Ustawienia Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Ustawienia aplikacji"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Nie można otworzyć załącznika."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Pliku nie można zapisać ani otworzyć, ponieważ ten typ załącznika może zawierać złośliwe oprogramowanie."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Załącznika nie można zapisać ani otworzyć ze względu na zasady bezpieczeństwa na koncie."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Ten załącznik jest za duży, aby go pobrać przez sieć komórkową. Możesz go pobrać po następnym połączeniu z siecią Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Brak zainstalowanej aplikacji umożliwiającej otwarcie załącznika. Pobierz odpowiednią aplikację z Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Załącznik to aplikacja. Aby ją zainstalować, musisz zaznaczyć Nieznane źródła w sekcji Ustawienia &gt; Aplikacje."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Aplikacji nie można zainstalować bezpośrednio z e-maila. Najpierw ją zapisz, a następnie zainstaluj za pomocą aplikacji Pobrane pliki."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Nie można pobrać załącznika."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Podczas dekodowania wiadomości wystąpił błąd."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Wyświetlanie pliku <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Usunąć tę wiadomość?"</item>
- <item quantity="other" msgid="4437637377522896262">"Usunąć te wiadomości?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Usunięto wiadomość."</item>
- <item quantity="other" msgid="6574961322865652255">"Usunięto wiadomości."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Wiadomość została odrzucona."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Wiadomość została zapisana jako wersja robocza."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Nie można wyświetlić załącznika."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Nie można wczytać załącznika „<xliff:g id="FILENAME">%s</xliff:g>”."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Otwieranie wiadomości…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"Przeniesiono <xliff:g id="NUM_MESSAGE">%1$d</xliff:g> wiadomość do <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"Przeniesiono <xliff:g id="NUM_MESSAGE">%1$d</xliff:g> wiadomości do <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Co najmniej jednego załącznika nie można przekazać dalej."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Nie przekazano załącznika"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Nie udało się zalogować na konto <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Nie można się zalogować"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Nowsze"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Starsze"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Konfiguracja konta"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Konto e-mail"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Swoje konto możesz skonfigurować w zaledwie kilku krokach."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Adres e-mail"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Hasło"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Domyślnie wysyłaj e-maile z tego konta."</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Konfig. ręczna"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Wpisz prawidłowy adres e-mail i hasło."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Zduplikowane konto"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Używasz już tej nazwy użytkownika na koncie „<xliff:g id="DUPLICATE">%s</xliff:g>”."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Hasło zaczyna się lub kończy co najmniej jedną spacją. Wiele serwerów nie obsługuje haseł ze spacjami."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Pobieranie informacji o koncie…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Sprawdzanie ustawień serwera poczty przychodzącej…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Sprawdzanie ustawień serwera poczty wychodzącej…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Konfiguracja konta"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Konto zostało skonfigurowane, a e-maile są w drodze."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Nazwa konta (opcjonalnie)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Twoja nazwa (wyświetlana w wiadomościach wychodzących)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"To pole nie może być puste."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Konfiguracja konta"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Typ konta"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Jakiego typu jest to konto?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Konfiguracja konta"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Ustawienia serwera poczty przychodzącej"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nazwa użytkownika"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Hasło"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Serwer"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Typ zabezpieczeń"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Brak"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (akceptuj wszystkie certyfikaty)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (akceptuj wszystkie certyfikaty)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Usuwaj wiadomości e-mail z serwera"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Nigdy"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Po usunięciu z folderu Odebrane"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Prefiks ścieżki IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Opcjonalnie"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Konfiguracja konta"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Ustawienia serwera poczty wychodzącej"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Serwer SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Typ zabezpieczeń"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Wymagaj logowania."</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nazwa użytkownika"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Hasło"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Konfiguracja konta"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Ustawienia serwera"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Serwer"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domena\\nazwa użytkownika"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Użyj bezpiecznego połączenia (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Akceptuj wszystkie certyfikaty SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certyfikat klienta"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Wybierz"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Użyj certyfikatu klienta"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Usuń"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Brak"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Identyfikator telefonu komórkowego"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Ustawienia konta"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Opcje konta"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Sprawdzaj pocztę"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nigdy"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automatycznie (tryb Push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Co 5 minut"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Co 10 minut"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Co 15 minut"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Co 30 minut"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Co godzinę"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Domyślnie wysyłaj wiadomości e-mail z tego konta."</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Powiadom mnie o odebranych e-mailach."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synchronizuj kontakty na tym koncie."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synchronizuj kalendarz na tym koncie."</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synchronizuj e-maile z tego konta."</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Automatycznie pobieraj załączniki, gdy połączono z siecią Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nie można zakończyć"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dni do synchronizacji"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatycznie"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Jeden dzień"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Trzy dni"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Jeden tydzień"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Dwa tygodnie"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Jeden miesiąc"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Wszystkie"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Użyj wartości domyślnej konta"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nieprawidłowa nazwa użytkownika lub hasło"</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nieprawidłowa nazwa użytkownika lub hasło"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nie można bezpiecznie połączyć się z serwerem."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nie można bezpiecznie połączyć się z serwerem."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Certyfikat klienta jest wymagany. Czy chcesz się połączyć z serwerem za pomocą certyfikatu klienta?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certyfikat jest nieważny lub niedostępny."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Serwer zgłosił błąd. Sprawdź nazwę użytkownika i hasło, a następnie spróbuj ponownie."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nie można połączyć się z serwerem."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Nie można połączyć się z serwerem."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"Wymagane połączenie TLS nie jest obsługiwane przez serwer."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Serwer nie obsługuje metod uwierzytelniania."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Nie można nawiązać połączenia z serwerem z powodu błędu zabezpieczeń."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Nie można nawiązać połączenia z serwerem."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Wpisany adres serwera jest nieprawidłowy lub Poczta nie obsługuje wersji protokołu wymaganej przez serwer."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Nie masz uprawnień do synchronizacji z tym serwerem. Skontaktuj się z administratorem serwera, aby uzyskać więcej informacji."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Zdalne administrowanie zabezpieczeniami"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Serwer <xliff:g id="SERVER">%s</xliff:g> wymaga udzielenia zezwolenia na zdalną kontrolę niektórych funkcji zabezpieczeń tego urządzenia z systemem Android. Czy chcesz zakończyć konfigurowanie tego konta?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Serwer wymaga funkcji zabezpieczeń, których to urządzenie z Androidem nie obsługuje, w tym: <xliff:g id="ERROR">%s</xliff:g>."</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Nie można zmienić nazwy użytkownika konta. Aby dodać konto z inną nazwą użytkownika, dotknij Dodaj konto."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"OSTRZEŻENIE: cofnięcie Poczcie uprawnień do administrowania urządzeniem spowoduje usunięcie wszystkich kont e-mail, które ich wymagają, wraz z wiadomościami, kontaktami, wydarzeniami w kalendarzu i innymi danymi."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Aktualizacja zabezpieczeń"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Konto <xliff:g id="ACCOUNT">%s</xliff:g> wymaga aktualizacji ustawień zabezpieczeń."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Nie można zsynchronizować konta „<xliff:g id="ACCOUNT">%s</xliff:g>” ze względu na wymogi bezpieczeństwa."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Konto „<xliff:g id="ACCOUNT">%s</xliff:g>” wymaga aktualizacji ustawień zabezpieczeń."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Ustawienia zabezpieczeń konta „<xliff:g id="ACCOUNT">%s</xliff:g>” uległy zmianie. Nie jest wymagane podejmowanie działań przez użytkownika."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Wymagana aktualizacja zabezp."</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Zasady bezpieczeństwa uległy zmianie"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Nie można spełnić zasad bezp."</string>
- <string name="account_security_title" msgid="3511543138560418587">"Zabezpieczenia urządzenia"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Serwer <xliff:g id="SERVER">%s</xliff:g> wymaga udzielenia zezwolenia na zdalną kontrolę niektórych funkcji zabezpieczeń tego urządzenia z systemem Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Edytuj szczegóły"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"Konto „<xliff:g id="ACCOUNT">%s</xliff:g>” wymaga zmiany kodu PIN lub hasła blokady ekranu."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Hasło ekranu blokady wkrótce wygaśnie"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Kod PIN lub hasło ekranu blokady wygasły."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Hasło ekranu blokady wygasło"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Hasło ekranu blokady wkrótce wygaśnie"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Musisz wkrótce zmienić PIN lub hasło ekranu blokady. W przeciwnym razie dane konta <xliff:g id="ACCOUNT">%s</xliff:g> zostaną usunięte. Zmienić je teraz?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Hasło ekranu blokady wygasło"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Trwa wymazywanie z urządzenia danych konta <xliff:g id="ACCOUNT">%s</xliff:g>. Można je przywrócić, zmieniając PIN lub hasło ekranu blokady. Zmienić je teraz?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Odrzucić niezapisane zmiany?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Nie można się zalogować"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Nazwa użytkownika lub hasło dla konta <xliff:g id="ACCOUNT">%s</xliff:g> są nieprawidłowe. Chcesz je poprawić?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Domyślne konto"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Domyślnie wysyłaj wiadomości e-mail z tego konta"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Pobieraj załączniki"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Automatycznie pobieraj załączniki najnowszych wiadomości przez Wi-Fi."</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Powiadomienia e-mail"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Częstotliwość synchronizacji, powiadomienia itd."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Wyślij powiadomienie, gdy przychodzi e-mail."</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Sprawdzaj pocztę"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Poczta przychodząca"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Użytkownik, hasło i inne ustawienia serwera poczty przychodzącej"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Poczta wychodząca"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Użytkownik, hasło i inne ustawienia serwera poczty wychodzącej"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Egzekwowane zasady"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Brak"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nieobsługiwane zasady"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Brak"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Próba synchronizacji"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Dotknij tutaj, aby zsynchronizować to konto."</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Nazwa konta"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Imię i nazwisko"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Podpis"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Szybkie odpowiedzi"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edytuj tekst, który często wstawiasz do e-maili."</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Dołącz tekst do wysyłanych wiadomości"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Ustawienia powiadomień"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Wykorzystanie transmisji danych"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Zasady bezpieczeństwa"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Edytuj szybką odpowiedź"</string>
- <string name="save_action" msgid="1988862706623227093">"Zapisz"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synchronizuj kontakty"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synchronizuj kontakty dla tego konta"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synchronizuj kalendarz"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synch. kalendarz dla tego konta."</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synchronizuj e-maile"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synchronizuj wiadomości e-mail dla tego konta"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Wibracje"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Wibracje także po otrzymaniu e-maila"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Zawsze"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Tylko po wyciszeniu"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Nigdy"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Wibracje"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Wybierz dzwonek"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Ustawienia serwera"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Usuń konto"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Konto <xliff:g id="ACCOUNT">%s</xliff:g> zostanie usunięte z usługi poczty e-mail."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Usuń konto"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Usuń konto"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Opcje synchronizacji"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Opcje synchronizacji (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Ustawienia synchronizacji"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Częstotliwość sprawdzania"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Dni do synchronizacji"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Konto e-mail"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Wybierz konto"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Wybierz folder"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Nie znaleziono konta. Być może zostało usunięte."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Nie znaleziono folderu. Być może został usunięty."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Tylko niektóre konta typu „Plus” zawierają funkcję dostępu POP umożliwiającą łączenie się za pomocą tego programu. Jeśli nie możesz zalogować się przy użyciu poprawnego adresu e-mail i hasła, być może nie masz płatnego konta typu „Plus”. Uruchom przeglądarkę, aby uzyskać dostęp do tych kont e-mail."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Przed skonfigurowaniem tego konta e-mail odwiedź witrynę T-Online i utwórz hasło dostępu do poczty POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Firma"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Nie można utworzyć konta. Spróbuj ponownie."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-mail"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Włącza zasady zabezpieczeń określone na serwerze"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Trwa przeszukiwanie <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> wynik z <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"Liczba wyników: <xliff:g id="RESULTS">%1$d</xliff:g> z <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Ustawienia"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Ustawienia ogólne"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Aplikacja"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatyczne przechodzenie"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Wybierz ekran, który ma być pokazywany po usunięciu wiadomości."</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ukryj pola wyboru"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Dotknij i przytrzymaj, by wybrać pozycję na liście wiadomości"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Potwierdź usuwanie"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Wiadomości"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Potwierdź wysyłanie"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Wiadomości"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Przejdź do"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Nowsza wiadomość"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Starsza wiadomość"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Lista wiadomości"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Rozmiar tekstu wiadomości"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Bardzo mały tekst"</item>
- <item msgid="4415205108584620118">"Mały tekst"</item>
- <item msgid="4550219696381691112">"Tekst normalnej wielkości"</item>
- <item msgid="6227813549949219991">"Duży tekst"</item>
- <item msgid="1197917420815786571">"Wielki tekst"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Rozmiar tekstu wiadomości"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Bardzo mały"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Mały"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normalny"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Duży"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Wielki"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Odpowiedz wszystkim"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Ustaw opcję „Odpowiedz wszystkim” jako domyślną."</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Pytaj, czy pokazać obrazy"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Obrazy w wiadomościach nie będą pokazywane automatycznie."</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Opcja „Pokaż obrazy” została wyczyszczona."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Oczekiwanie na synchronizację"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Twoja poczta e-mail pojawi się za chwilę."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Dotknij, aby zmienić."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Wszystkie skrzynki odbiorcze"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Nieprzeczytane"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Oznaczone gwiazdką"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Trwa wczytywanie…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Dotknij, aby skonfigurować."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Nie masz jeszcze skonfigurowanego konta e-mail."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Wyszukaj w wiadomościach e-mail"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Szukaj: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Wyniki wyszukiwania „<xliff:g id="ID_1">%1$s</xliff:g>”"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Oczekiwanie na wyniki"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Niektóre serwery mogą zwracać wyniki po dłuższym czasie."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Foldery"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Nie zezwalaj na używanie aparatu"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Wymagaj hasła do urządzenia"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Nie zezwalaj na używanie poprzednich haseł"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Wymagaj, by hasła miały datę ważności"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Wymagaj blokowania ekranu nieużywanych urz."</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Ogranicz liczbę synchronizowanych wydarzeń z kalendarza"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Ogranicz liczbę synchronizowanych e-maili"</string>
- <string name="quick_1" msgid="3426057697353380951">"Dziękuję."</string>
- <string name="quick_2" msgid="4188036352885736617">"Brzmi dobrze."</string>
- <string name="quick_3" msgid="8061819976353395585">"Przeczytam to później i skontaktuję się."</string>
- <string name="quick_4" msgid="3988974084396883051">"Spotkajmy się, aby to omówić."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Synchronizacja w tle z tym kontem jest podczas roamingu wyłączona."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Wysyłanie odpowiedzi..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Brak wiadomości."</string>
-</resources>
diff --git a/email2/res/values-pl/uploader.xml b/email2/res/values-pl/uploader.xml
deleted file mode 100644
index 5c7a8ee58..000000000
--- a/email2/res/values-pl/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Autoprzesyłanie"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Album autoprzesyłania"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Przesyłanie"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Zakończone"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Wstrzymane"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • Zdjęcia: %2$d • Filmy: %3$d"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"Zdjęcia: %1$d • Filmy: %2$d"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"słaba bateria"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"przekroczono limit miejsca na zdjęcia"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"oczekiwanie na sieć Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"opóźniono do czasu ładowania"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"oczekiwanie na połączenie"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"ponowienie za %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Pokaż oczekujące na przesłanie"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Pokaż przesłane"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Wyświetl online"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Pokaż oczekujące na przesłanie"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Ukryj oczekujące na przesłanie"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Pokaż szczegóły"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Ukryj szczegóły"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Ustawienia"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Przesłano: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Konto"</string>
- <string name="upload" msgid="2615541458361216022">"Prześlij"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Anuluj"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Przesyłanie do: "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" dla: "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s „%2$s”"</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Zainicjowanie przesyłania nie powiodło się."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Plik jest niedostępny."</string>
- <string name="account_error" msgid="1904775271866104941">"Nie można pobrać informacji o koncie."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Podczas logowania na konto wystąpił problem."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Oczekiwanie na ponowienie"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Oczekiwanie na sieć Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Przesyłanie"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Niepowodzenie"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Ukończono"</string>
- <string name="pause_state_running" msgid="711411177620353982">"przesyłanie"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"wstrzymano ręcznie"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"wstrzymano – słaba bateria"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"wstrzymano – opóźniono do czasu ładowania"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"wstrzymano – oczekiwanie na połączenie"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"wstrzymano – brak miejsca w PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"wstrzymano – oczekiwanie na sieć Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"wstrzymano – roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"oczekiwanie na ponowienie"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 min"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 min"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 min"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Brak połączenia transmisji danych"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Wyczerpano całe miejsce na koncie."</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Nie znaleziono pliku"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Błąd usługi"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Błąd sieci"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Uwierzytelnienie nie powiodło się"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Oczekujące na przesłanie [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Przesłane [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Wstrzymaj przesyłanie"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Wznów przesyłanie"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Prześlij teraz"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Prześlij później"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Nie przesyłaj"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Wyświetl"</string>
- <string name="manager_retry" msgid="939534318469518843">"Ponów próbę"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Anulowano przesyłanie"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Przesyłanie zostało już zakończone"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Synchronizuj wszystkie"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Ostatnia synchronizacja:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Lista zakończonych elementów jest pusta."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Autoprzesyłanie"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Zakończono przesyłanie"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Wstrzymano przesyłanie"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Nie włączano jeszcze autoprzesyłania."</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Duże pliki będą przesyłane wyłącznie przez sieć Wi-Fi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Skanowanie w poszukiwaniu plików..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Przygotowywanie zdjęć (<xliff:g id="PHOTOCOUNT">%1$d</xliff:g>) i filmów (<xliff:g id="VIDEOCOUNT">%2$d</xliff:g>) do przesłania..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Brak dodatkowych zdjęć i filmów do przesłania."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Podczas komunikacji z serwerem wystąpił problem. Spróbuj ponownie później."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Anulowano synchronizację wszystkich"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Synchronizuj wszystkie"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Wyświetl ukończone"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Wyświetl oczekujące"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Ogólne"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Wstrzymaj każde przesyłanie"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Zasilanie"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Przesyłaj tylko podczas ładowania telefonu"</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Przesyłaj tylko wówczas, gdy dostępna jest sieć Wi-Fi."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Zdjęcia"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Konto"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Warunki przesyłania"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Rozmiar zdjęcia"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Filmy"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Konto"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Do przesyłania filmów zostanie użyte konto zdjęć"</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Warunki przesyłania"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Obecnie używane są ustawienia łączności dotyczące zdjęć"</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Tylko zdjęcia przez sieci komórkowe"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Zdjęcia i filmy przez sieci komórkowe"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Zdjęcia i filmy tylko przez sieć Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Informacje"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Wersja autoprzesyłania"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Zalecane: 1600 pikseli (na potrzeby udostępniania, wydruków i wygaszaczy ekranu)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Rozmiar oryginalny (najwolniejsze przesyłanie)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"wstrzymano – karta SD jest niedostępna"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Karta SD jest niedostępna"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Ustawienia autoprze."</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Autoprzesyłanie"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Automatycznie przesyłaj nowe zdjęcia i filmy do prywatnego albumu w internecie"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Stan przesyłania"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Zaawansowane"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Przesyłanie z komórki"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Przesyłanie w roamingu"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"W roamingu przesyłaj zdjęcia i filmy przez sieć transmisji danych"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Do naładowania baterii"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Przesyłaj zdjęcia i filmy tylko podczas ładowania"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Prześlij istniejące zdjęcia"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Prześlij teraz wszystkie zdjęcia i filmy z telefonu"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Wyłączone"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Przesyłanie (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d z %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Wstrzymano: dotknij, aby wznowić przesyłanie"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Prześlij istniejące zdjęcia"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Przesyłanie zdjęć i filmów, które nie zostały jeszcze przesłane z telefonu do prywatnego albumu w internecie, może trochę potrwać, ale będzie wykonywane w tle. Czy na pewno chcesz kontynuować?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Tak"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Nie"</string>
-</resources>
diff --git a/email2/res/values-port/dimensions.xml b/email2/res/values-port/dimensions.xml
deleted file mode 100644
index 279fbd790..000000000
--- a/email2/res/values-port/dimensions.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- non-xlarge, portrait -->
-<resources>
- <dimen name="mailbox_list_width">100dip</dimen>
- <dimen name="message_list_width">100dip</dimen>
- <dimen name="action_bar_account_name_max_width">100dip</dimen>
- <dimen name="action_bar_mailbox_name_max_width">100dip</dimen>
- <dimen name="action_bar_mailbox_name_left_margin">8dip</dimen>
-</resources>
diff --git a/email2/res/values-pt-rPT/strings.xml b/email2/res/values-pt-rPT/strings.xml
deleted file mode 100644
index fc14a01d1..000000000
--- a/email2/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Ler anexos de e-mail"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permite à aplicação ler os anexos de e-mail."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Aceder a dados do fornecedor de e-mail"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permite que a aplicação aceda à base de dados do e-mail, incluindo às mensagens recebidas, mensagens enviadas, nomes de utilizadores e palavras-passe."</string>
- <string name="app_name" msgid="5815426892327290362">"E-mail"</string>
- <string name="compose_title" msgid="427986915662706899">"Redigir"</string>
- <string name="debug_title" msgid="5175710493691536719">"Depuração"</string>
- <string name="next_action" msgid="3931301986364184415">"Seguinte"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Cancelar"</string>
- <string name="previous_action" msgid="5181616311579820981">"Anterior"</string>
- <string name="send_action" msgid="1729766205562446418">"Enviar"</string>
- <string name="reply_action" msgid="4262472229221507619">"Responder"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Responder a todas"</string>
- <string name="delete_action" msgid="8421026208288857155">"Eliminar"</string>
- <string name="forward_action" msgid="669174181042344116">"Encaminhar"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Marcar com estrela"</string>
- <string name="done_action" msgid="7497990549515580249">"Concluído"</string>
- <string name="create_action" msgid="3062715563215392251">"Criar nova"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Eliminar"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Sem respostas rápidas."</string>
- <string name="discard_action" msgid="6532206074859505968">"Rejeitar"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Guardar rascunho"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Inserir resposta rápida"</string>
- <string name="read_action" msgid="4701484794504781686">"Marcar como lida"</string>
- <string name="unread_action" msgid="6280399049357552826">"Marcar como não lida"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Adicionar estrela"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Remover estrela"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Actualizar"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Adicionar conta"</string>
- <string name="compose_action" msgid="4045702519637388045">"Redigir"</string>
- <string name="search_action" msgid="6325101454876682308">"Pesquisar"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Definições da conta"</string>
- <string name="settings_action" msgid="6334807007967459412">"Configurações"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Opções de sincronização"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Marcar como não lida"</string>
- <string name="move_action" msgid="3059189775933985898">"Mover"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Adicionar Cc/Bcc"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Anexar ficheiro"</string>
- <string name="close_action" msgid="533058985745238100">"Fechar"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Enviar todas as msg"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Seleccionar anexo"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Mover para"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"A carregar mensagens..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Problema de ligação."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Não foi possível carregar o texto da mensagem. É possível que a mensagem seja demasiado extensa para visualização."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Mover mensagem"</item>
- <item quantity="other" msgid="371256717624461324">"Mover mensagens"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Não é possível mover em contas POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Não é possível mover porque a seleção contém várias contas."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Não é possível mover as mensagens em Rascunhos, Caixa de Saída e Enviadas."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> não lidas (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> não lidas (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> não lidas (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"em <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> contas"</item>
- <item quantity="other" msgid="2723797835410343458">"em <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> contas"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"para <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> novas mensagens"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Todas as contas"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> conta"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> contas"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Caixa de Entrada"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Caixa de saída"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Rascunhos"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Lixo"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Enviada"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Correio electrónico não solicitado"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Não lidas"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Caixa de Entrada (não lida(s))"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Caixa de Entrada (todas)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Vista combinada (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> conta"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> contas"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versão: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Caixa de Entrada"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Marcado com estrela"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Rascunhos"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Caixa de saída"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Vista combinada"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Mostrar todas as pastas"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Contas"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Pastas recentes (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Todas as pastas"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Pastas recentes"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Assunto"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Sem assunto"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Carregar mais mensagens"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> selecionada(s)"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> selecionada(s)"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Não tem mensagens"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Para"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Assunto"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"De:"</string>
- <string name="to" msgid="4392614766835725698">"Para"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Bcc"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Assunto"</string>
- <string name="body_hint" msgid="4279864165439577668">"Escrever e-mail"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Mensagem original --------"\n"Assunto: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"De: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Para: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> escreveu:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Incluir texto citado"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Incluir texto"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Adicione, pelo menos, um destinatário."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Alguns endereços de e-mail são inválidos."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Ficheiro demasiado grande para anexar."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Inserir resposta rápida"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> e outros <xliff:g id="NUMBER">%2$d</xliff:g>"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Para:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Data:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"De:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Assunto:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Ver"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Instalar"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Reproduzir"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Carregar"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Informação"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Guardar"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Guardado"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Parar"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Anexo guardado como <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Não foi possível guardar o anexo."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Um ou mais anexos da mensagem que encaminhou serão transferidos antes do envio."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Mensagem"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Convidar"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Anexo<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Anexos <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Mostrar imagens"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Mostrar sempre"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Mostrar sempre imagens deste remetente"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"As imagens deste remetente serão mostradas automaticamente."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Ver na Agenda"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Convite da agenda"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Vai?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Sim"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Talvez"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Não"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Aceitou este convite."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Respondeu “talvez” a este convite."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Recusou este convite."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Mostrar detalhes"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Detalhes da mensagem"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Informações sobre o anexo"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Ligação Wi-Fi necessária"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Definições de Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Definições da aplicação"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Não é possível abrir o anexo."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Não é possível guardar ou abrir este ficheiro porque este tipo de anexo pode conter software malicioso."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Não é possível guardar ou abrir este anexo devido às políticas de segurança desta conta."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Este anexo é demasiado grande para ser transferido através de uma rede de telemóvel. Pode transferi-lo da próxima vez que se ligar a uma rede Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Não existe nenhuma aplicação instalada capaz de abrir este anexo. Tente transferir uma aplicação apropriada do Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Este anexo é uma aplicação. Tem de marcar Fontes Desconhecidas em Definições &gt; Aplicações, antes da instalação."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Não é possível instalar aplicações diretamente a partir do e-mail. Deverá primeiro guardar esta aplicação e, em seguida, instalá-la utilizando a aplicação Transferências."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Não foi possível transferir o anexo."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Ocorreu um erro durante a descodificação da mensagem."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"A visualizar <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Eliminar esta mensagem?"</item>
- <item quantity="other" msgid="4437637377522896262">"Eliminar estas mensagens?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Mensagem eliminada."</item>
- <item quantity="other" msgid="6574961322865652255">"Mensagens eliminadas."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Mensagem rejeitada."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Mensagem guardada como rascunho."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Não é possível visualizar o anexo."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Não foi possível carregar o anexo “<xliff:g id="FILENAME">%s</xliff:g>”."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"A abrir a mensagem…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> mensagem movida para <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> mensagens movidas para <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Não foi possível encaminhar um ou mais anexos."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"O anexo não foi encaminhado"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Início de sessão de <xliff:g id="ACCOUNT_NAME">%s</xliff:g> sem êxito."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Impossível iniciar sessão"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Mais recente"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Mais antigas"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Configuração da conta"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Conta de e-mail"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"É possível configurar a sua conta em apenas alguns passos."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Endereço de e-mail"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Palavra-passe"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Enviar e-mail a partir desta conta por predefinição"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configuração manual"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Introduza um endereço de e-mail e palavra-passe válidos."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Conta duplicada"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Este nome de utilizador já está a ser utilizado para a conta “<xliff:g id="DUPLICATE">%s</xliff:g>”."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Esta palavra-passe começa ou termina com um ou mais caracteres de espaço. Muitos servidores não suportam palavras-passe com espaços."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"A obter informações da conta..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"A verificar definições do servidor de recepção..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"A verificar definições do servidor de envio..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Configuração da conta"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"A sua conta está configurada e o e-mail vai a caminho!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Dar um nome a esta conta (opcional)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"O seu nome (apresentado nas mensagens enviadas)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Este campo não pode estar em branco."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Configuração da conta"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Tipo de conta"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Que tipo de conta é este?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Configuração da conta"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Definições do servidor de recepção"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nome de utilizador"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Palavra-passe"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Servidor"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Porta"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipo de segurança"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nenhuma"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Aceitar todos os certificados)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (aceitar todos os certificados)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Eliminar e-mail do servidor"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Nunca"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Quando elimino da pasta A Receber"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Prefixo de caminho IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Opcional"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Configuração da conta"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Definições de servidor de envio"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Servidor SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Porta"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipo de segurança"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Requerer início de sessão"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nome de utilizador"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Palavra-passe"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Configuração da conta"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Definições do servidor"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Servidor"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domínio/Nome de utilizador"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Utilizar ligação segura (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Aceitar todos os certificados SLL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certificado do cliente"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Selecionar"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Utilizar certificado de cliente"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Remover"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Nenhum"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID do dispositivo móvel"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Definições da conta"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Opções da conta"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Frequência de verificação de caixa de entrada"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nunca"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automático (Envio)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"De 5 em 5 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"De 10 em 10 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"De 15 em 15 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"De 30 em 30 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"De hora em hora"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Enviar e-mail a partir desta conta por predefinição"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Receber notificação de e-mails novos"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sincronizar contactos a partir desta conta."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sincronizar o calendário a partir desta conta."</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sincronizar e-mail a partir desta conta."</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Transferir automaticamente anexos quando ligado a uma rede Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Não foi possível concluir"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dias para sincronização"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automático"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Um dia"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Três dias"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Uma semana"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Duas semanas"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Um mês"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Todas"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Utilizar predef. da conta"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"O nome de utilizador ou a palavra-passe estão incorretos."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"O nome de utilizador ou a palavra-passe estão incorretos."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Não é possível ligar ao servidor em segurança."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Não é possível ligar ao servidor em segurança."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"É necessário um certificado de cliente. Pretende ligar ao servidor com um certificado de cliente?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"O certificado é inválido ou inacessível."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"O servidor respondeu com um erro. Verifique o nome de utilizador e a palavra-passe e tente novamente."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Não é possível ligar ao servidor."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Não é possível ligar ao servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS necessário mas não suportado pelo servidor."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Os métodos de autenticação não são suportados pelo servidor."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Não foi possível abrir ligação ao servidor devido a um erro de segurança."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Não foi possível abrir ligação ao servidor."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Introduziu um endereço de servidor incorreto ou o servidor requer uma versão de protocolo que o E-mail não suporta."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Não tem autorização para sincronizar com este servidor. Contacte o administrador do servidor para obter mais informações."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Administração de segurança remota"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"O servidor <xliff:g id="SERVER">%s</xliff:g> requer permissão para controlar remotamente algumas das funcionalidades de segurança do dispositivo Android. Pretende concluir a configuração desta conta?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Este servidor requer funcionalidades de segurança que o seu aparelho Android não suporta, incluindo: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Não é possível alterar o nome de utilizador de uma conta. Para adicionar uma conta com outro nome de utilizador, toque em Adicionar Conta."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"AVISO: a desativação da autorização da aplicação E-mail para administrar o aparelho eliminará todas as contas de e-mail que necessitam desta, juntamente com o respetivo e-mail, contactos, eventos de agenda e outros dados."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Atualização de segurança"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> requer a atualização das definições de segurança."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Não é possível sincronizar a conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" devido a requisitos de segurança."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"A conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" requer a atualização das definições de segurança."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"A conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" alterou as definições de segurança; não é necessária qualquer ação do utilizador."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Necessária atualiz. segurança"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Políticas segurança alteradas"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Impossível cumprir polít. seg."</string>
- <string name="account_security_title" msgid="3511543138560418587">"Segurança do dispositivo"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"O servidor <xliff:g id="SERVER">%s</xliff:g> requer permissão para controlar remotamente algumas das funcionalidades de segurança do aparelho Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Editar detalhes"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"“<xliff:g id="ACCOUNT">%s</xliff:g>” solicita que altere o PIN ou palavra-passe do ecrã de bloqueio."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Palavra-passe de bloq. do ecrã a expirar"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"O seu PIN ou palavra-passe de bloqueio do ecrã expirou."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"A palavra-passe de bloq. do ecrã expirou"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Palavra-passe de bloq. do ecrã a expirar"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Tem de alterar o PIN ou a palavra-passe de bloqueio do ecrã ou os dados de <xliff:g id="ACCOUNT">%s</xliff:g> serão apagados. Pretende alterar agora?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"A palavra-passe de bloq. do ecrã expirou"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Os dados de <xliff:g id="ACCOUNT">%s</xliff:g> estão a ser apagados do aparelho. Pode restaurá-los alterando o PIN ou a palavra-passe de bloqueio do ecrã. Pretende alterar agora?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Rejeitar alterações não guardadas?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Não foi possível iniciar sessão."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"O nome de utilizador ou a palavra-passe para <xliff:g id="ACCOUNT">%s</xliff:g> estão incorretos. Pretende atualizá-los agora?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Conta predefinida"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Enviar e-mail a partir desta conta por predefinição"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Transferir anexos"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Transferir automaticamente anexos de mensagens recentes p/ Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Notificações de e-mail"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Frequência da sincronização, notificações, etc."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Enviar notificação quando chegar um e-mail"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frequência de verificação de caixa de entrada"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Definições de recepção"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nome de utiliz., palavra-passe e outras def. do serv. de receção"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Definições de envio"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nome de utiliz., palavra-passe e outras def. do serv. de envio"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Políticas aplicadas"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Nenhum"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Políticas não suportadas"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Nenhum"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Tentar sincronizar"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Toque aqui para sincronizar esta conta"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Nome da conta"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"O seu nome"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Assinatura"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Respostas rápidas"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Editar o texto que insere frequentemente ao compor e-mails"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Acrescente texto às mensagens que enviar"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Definições de notificação"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Utilização de dados"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Políticas de segurança"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Editar resposta rápida"</string>
- <string name="save_action" msgid="1988862706623227093">"Guardar"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronizar contactos"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincronizar contactos para esta conta"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronizar calendário"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sinc. evento do cal. p. esta conta"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincronizar e-mail"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincronizar e-mail para esta conta"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrar"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibrar também quando chega e-mail"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Sempre"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Apenas quando está em silêncio"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Nunca"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibrar"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Escolher toque"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Definições do servidor"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Remover conta"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"A conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" será removida do E-mail."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Remover conta"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Remover conta"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Opções de sincronização"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Opções de sincronização (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Definições de sincronização"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Verificar frequência"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Dias para sincronização"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Conta de e-mail"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Selecionar uma conta"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Selecione uma pasta"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Não foi possível localizar a conta. Pode ter sido removida."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Não foi possível localizar a pasta. Pode ter sido removida."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Apenas algumas contas “Plus” incluem acesso POP, permitindo a ligação deste programa. Se não conseguir iniciar sessão com o endereço de e-mail e palavra-passe corretos, é possível que não tenha uma conta “Plus” paga. Inicie o navegador de internet para obter acesso a essas contas de e-mail."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Antes de configurar esta conta de e-mail, visite o Web site T-Online e crie uma palavra-passe de acesso a e-mail POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Empresa"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Não foi possível criar a conta. Tente novamente."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-mail"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Activa as políticas de segurança especificadas pelo servidor"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"A pesquisar <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> resultado de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultados de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Configurações"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Definições gerais"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Aplicação"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avanço automático"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Selecionar o ecrã a apresentar após eliminar uma mensagem"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ocultar caixas de verificação"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Em listas de mensagens, toque sem largar para selecionar"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirmar antes de eliminar"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mensagens"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirmar antes de enviar"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mensagens"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Avançar para"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mensagem mais recente"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mensagem mais antiga"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Lista de mensagens"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Tamanho do texto da mensagem"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Texto muito pequeno"</item>
- <item msgid="4415205108584620118">"Texto pequeno"</item>
- <item msgid="4550219696381691112">"Texto de tamanho normal"</item>
- <item msgid="6227813549949219991">"Texto grande"</item>
- <item msgid="1197917420815786571">"Texto muito grande"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Tamanho do texto da mensagem"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Muito pequeno"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Pequeno"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Grande"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Muito grande"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Responder a todos"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Predefinir \"Responder a todos\" para mensagens de resposta"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Perguntar para mostrar fotografias"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"As fotografias em mensagens não serão apresentadas automaticamente"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Mostrar imagens\" desmarcada."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"A aguardar sincronização"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"O e-mail aparecerá em breve."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Toque ícone p/ mudar."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Cx entrada combinada"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Não lida"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Com estrela"</string>
- <string name="widget_loading" msgid="2340962056927255554">"A carregar…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Toque para configurar."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Ainda não configurou uma conta de e-mail."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Pesquisar e-mail"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Pesquisar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Resultados da pesquisa para \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"A aguardar resultados"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Alguns servidores podem demorar algum tempo."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Pastas"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Não perm. utilização câmara do aparelho"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Solicitar palavra-passe do aparelho"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Limitar reutilização pal.-passe recentes"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Solicitar validade das palavras-passe"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Necessário apar. inat. para bloq. ecrã"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Limitar n.º de eventos de calendário sincronizados"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Limitar n.º de e-mails sincronizados"</string>
- <string name="quick_1" msgid="3426057697353380951">"Obrigado!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Parece-me bem!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Vou ler isto mais tarde e voltarei a contactá-lo."</string>
- <string name="quick_4" msgid="3988974084396883051">"Vamos marcar uma reunião para discutir isso."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"A sincronização em segundo plano desta conta está desativada quando está em roaming."</string>
- <string name="confirm_response" msgid="5747902757569543165">"A enviar a resposta..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Não tem mensagens."</string>
-</resources>
diff --git a/email2/res/values-pt-rPT/uploader.xml b/email2/res/values-pt-rPT/uploader.xml
deleted file mode 100644
index 84218149c..000000000
--- a/email2/res/values-pt-rPT/uploader.xml
+++ /dev/null
@@ -1,141 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Carreg. Instantâneo"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Álbum de Carregamento Instantâneo"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"A carregar"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Concluídos"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Pausado"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d fotografias • %3$d vídeos"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d fotografias • %2$d vídeos"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"bateria fraca"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"quota de fotografias excedida"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"a aguardar Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"atrasada até carregar"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"a aguardar ligação"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"a tentar novamente em %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Mostrar Carregamentos Pendentes"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Mostrar Carregamentos Concluídos"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Ver On-line"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Mostrar Carregamentos Pendentes"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Ocultar Carregamentos Pendentes"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Mostrar Detalhes"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Ocultar Detalhes"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Configurações"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Carregados: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Conta"</string>
- <string name="upload" msgid="2615541458361216022">"fazer upload"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Cancelar"</string>
- <string name="uploading_to" msgid="3986362895940069510">"A carregar para "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" para "<b>"%s"</b></string>
- <!-- String.format failed for translation -->
- <!-- no translation found for destination_format (7472552212462849956) -->
- <skip />
- <string name="toast_intent_error" msgid="6164928822619692280">"A inicialização do carregamento falhou."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Ficheiro não disponível."</string>
- <string name="account_error" msgid="1904775271866104941">"Falha na recuperação de informações da conta."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Ocorreu um problema ao iniciar sessão na conta."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"A aguardar nova tentativa"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"A aguardar Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"A carregar"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Falhou"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Concluído"</string>
- <string name="pause_state_running" msgid="711411177620353982">"a carregar"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"colocada em pausa manualmente"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"em pausa – bateria fraca"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"em pausa – atrasada até carregar"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"em pausa – a aguardar ligação"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"em pausa - fora da quota PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"em pausa – a aguardar Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"em pausa – roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"a aguardar nova tentativa"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minuto"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minutos"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minutos"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Sem ligação de dados"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"A conta está fora da quota de disco"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Ficheiro não encontrado"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Erro no serviço"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Erro de rede"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Falha na autenticação"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Carregamentos pendentes [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Carregamentos concluídos [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Interromper carregamentos"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Retomar carregamentos"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Carregar agora"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Carregar mais tarde"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Não carregue"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Vista"</string>
- <string name="manager_retry" msgid="939534318469518843">"Tentar novamente"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Carregamento cancelado"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"O carregamento já terminou"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sincronizar tudo"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Última Sincronização: "\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"A lista de itens concluídos está vazia."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Carreg. Instantâneo"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Carregamentos terminados"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Carregamentos em pausa"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"O Carregamento Instantâneo ainda não foi ativado"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Os ficheiros de grandes dimensões apenas serão carregados através de uma ligação Wi-Fi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"A procurar ficheiros..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"A preparar <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> fotografias e <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> vídeos para carregamento..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Não é necessário carregar fotografias/vídeos adicionais."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Erro de comunicação com o servidor. Tente novamente mais tarde."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Sincronizar todos os cancelados"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sincronizar Tudo"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Ver Concluídos"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Ver Pendentes"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Geral"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Colocar todos os carregamentos em pausa"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Alimentação"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Carregue apenas quando o telemóvel estiver a ser carregado."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Carregar apenas quando a rede Wi-Fi estiver disponível."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotografias"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Conta"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Condições de carregamento"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Tamanho da fotografia"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"# vídeos"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Conta"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"A conta de fotografias será utilizada para carregamentos de vídeos."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Condições de carregamento"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"As definições de conetividade de fotografias estão a ser utilizadas agora."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Apenas fotografias através de redes de telemóvel"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotografias e vídeos através de redes de telemóvel"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Fotografias e vídeos apenas através de Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Sobre"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Versão Carr. Inst."</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Recomendado: 1600 pixels (para partilha, impressões e proteções de ecrã)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Tamanho original (carregamento mais lento)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"em pausa – cartão SD indisponível"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Cartão SD indisponível"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Def. do Carreg. Inst."</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Carreg. Instantâneo"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Carregar automaticamente fotografias e vídeos novos para um álbum Web privado"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Estado do carregamento"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Avançado"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Carregamentos móveis"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Carregamentos em roaming"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Carregar fotografias e vídeos em roaming na rede de dados"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Uploads de bateria"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Carregar fotografias e vídeos apenas quando está a carregar"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Carregar fotos existentes"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Carregar todas as fotografias e vídeos existentes no seu telemóvel agora"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Desativada"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for preference_summary_header_format (8850267704647137239) -->
- <skip />
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"A carregar (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d de %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Em pausa: toque para retomar o carregamento"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Carregar fotografias existentes"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"O carregamento de fotografias e vídeos que ainda não foram carregados do seu telemóvel para um álbum privado na Web pode demorar um bocado, mas será efetuado em segundo plano. Tem a certeza de que pretende continuar?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Sim"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Não"</string>
-</resources>
diff --git a/email2/res/values-pt/strings.xml b/email2/res/values-pt/strings.xml
deleted file mode 100644
index e53c76a1a..000000000
--- a/email2/res/values-pt/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Ler os anexos do e-mail"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permite que o aplicativo leia seus anexos de e-mail."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Acessar dados do provedor de e-mail"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permite que o aplicativo acesse o banco de dados de seu e-mail, incluindo mensagens recebidas e enviadas, nomes de usuário e senhas."</string>
- <string name="app_name" msgid="5815426892327290362">"E-mail"</string>
- <string name="compose_title" msgid="427986915662706899">"Escrever"</string>
- <string name="debug_title" msgid="5175710493691536719">"Depurar"</string>
- <string name="next_action" msgid="3931301986364184415">"Próxima"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Cancelar"</string>
- <string name="previous_action" msgid="5181616311579820981">"Anterior"</string>
- <string name="send_action" msgid="1729766205562446418">"Enviar"</string>
- <string name="reply_action" msgid="4262472229221507619">"Responder"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Resp p/ todos"</string>
- <string name="delete_action" msgid="8421026208288857155">"Excluir"</string>
- <string name="forward_action" msgid="669174181042344116">"Encaminhar"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Marcar com uma estrela"</string>
- <string name="done_action" msgid="7497990549515580249">"Concluído"</string>
- <string name="create_action" msgid="3062715563215392251">"Criar nova"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Excluir"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nenhuma resposta rápida."</string>
- <string name="discard_action" msgid="6532206074859505968">"Descartar"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Salvar rascunho"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Inserir resposta rápida"</string>
- <string name="read_action" msgid="4701484794504781686">"Marcar como lida"</string>
- <string name="unread_action" msgid="6280399049357552826">"Marcar como não lida"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Adicionar estrela"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Remover estrela"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Atualizar"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Adicionar conta"</string>
- <string name="compose_action" msgid="4045702519637388045">"Escrever"</string>
- <string name="search_action" msgid="6325101454876682308">"Pesquisa"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Configurações da conta"</string>
- <string name="settings_action" msgid="6334807007967459412">"Configurações"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Opções de sincronização"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Marcar como não lida"</string>
- <string name="move_action" msgid="3059189775933985898">"Mover"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Cco"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Adicionar Cc/Cco"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Anexar arquivo"</string>
- <string name="close_action" msgid="533058985745238100">"Fechar"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Enviar todas as mensagens"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Escolher anexo"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Mover para"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Carregando mensagens..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Problema na conexão."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Não foi possível carregar o texto da mensagem. A mensagem pode ser muito grande para visualização."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Mover mensagem"</item>
- <item quantity="other" msgid="371256717624461324">"Mover mensagens"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"A ação Mover não é suportada em contas POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Não é possível mover porque a seleção contém várias contas."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"As mensagens em Rascunhos, na Caixa de saída e em Enviados não podem ser movidas."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> não lidas (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> não lidas (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> não lidas (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"em <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> contas"</item>
- <item quantity="other" msgid="2723797835410343458">"em <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> contas"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"para <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> novas mensagens"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Todas as contas"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> conta"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> contas"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Caixa de entrada"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Caixa de saída"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Rascunhos"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Lixeira"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"E-mails enviados"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Lixo"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Não lido"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Caixa de entrada (não lidas)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Caixa de entrada (todas)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Visualização combinada (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> conta"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> contas"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versão: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Caixa de entrada"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Com estrela"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Rascunhos"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Caixa de saída"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Visualização combinada"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Mostrar todas as pastas"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Contas"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Pastas recentes (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Todas as pastas"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Pastas recentes"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Assunto"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Sem assunto"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Carregar mais mensagens"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> selecionada(s)"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> selecionada(s)"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Nenhuma mensagem"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Para"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Cco"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Assunto"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"De:"</string>
- <string name="to" msgid="4392614766835725698">"Para"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Cco"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Assunto"</string>
- <string name="body_hint" msgid="4279864165439577668">"Escrever e-mail"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Mensagem Original --------"\n"Assunto: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"De: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Para: <xliff:g id="TO">%3$s</xliff:g>"\n"Cc: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> escreveu:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Incluir texto das mensagens anteriores"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Incluir texto"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Adicione pelo menos um destinatário."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Alguns endereços de e-mail são inválidos."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Arquivo muito grande para ser anexado."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Inserir resposta rápida"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> e outras <xliff:g id="NUMBER">%2$d</xliff:g> pessoas"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Para:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Cco:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Data:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"De:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Assunto:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Visualizar"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Instalar"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Reproduzir"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Carregar"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Informações"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Salvar"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Salvo"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Parar"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Anexo salvo como <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Não foi possível salvar anexo."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Um ou mais anexos de sua mensagem encaminhada serão transferidos antes do envio."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Mensagem"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Convidar"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Anexo <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> anexos"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Mostrar imagens"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Mostrar sempre"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Sempre mostrar fotos desse remetente"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"As imagens desse remetente serão mostradas automaticamente."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Ver na Agenda"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Convite do Google Agenda"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Vai?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Sim"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Talvez"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Não"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Você aceitou este convite."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Você respondeu \"talvez\" para este convite."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Você recusou este convite."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Mostrar detalhes"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Detalhes da mensagem"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Informações do anexo"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Conexão Wi-Fi necessária"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Configurações de Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Config. do aplicativo"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Não foi possível abrir o anexo."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Não é possível salvar ou abrir este arquivo porque este tipo de anexo pode conter software malicioso."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Não é possível salvar ou abrir este anexo por causa das políticas de segurança desta conta."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Este anexo é muito grande para o download através de uma rede móvel. O download pode ser feito da próxima vez que você se conectar a uma rede Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Não há nenhum aplicativo instalado que possa abrir este anexo. Tente fazer download de um aplicativo adequado no Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Este anexo é um aplicativo. Você deve marcar Fontes desconhecidas em Configurações &gt; Aplicativos antes de instalá-lo."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Não é possível instalar os aplicativos diretamente do e-mail. Primeiro salve este aplicativo e instale-o usando o aplicativo Downloads."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Não foi possível fazer download do anexo."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Ocorreu um erro ao decodificar a mensagem."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Visualizando <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Excluir esta mensagem?"</item>
- <item quantity="other" msgid="4437637377522896262">"Excluir estas mensagens?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Mensagem excluída."</item>
- <item quantity="other" msgid="6574961322865652255">"Mensagens excluídas."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Mensagem descartada."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Mensagem salva como rascunho."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Não é possível exibir o anexo."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Não foi possível carregar o anexo \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Abrindo a mensagem…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> mensagens movidas para <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> mensagens movidas para <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Não foi possível encaminhar todos os anexos."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Anexo não encaminhado"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Falha no login de <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Não foi possível fazer login"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> b"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> b"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> Kb"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> Kb"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Mais recentes"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Mais antigos"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Configuração da conta"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Conta de e-mail"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"É possível configurar uma conta em apenas algumas etapas."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Endereço de e-mail"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Senha"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Enviar e-mail desta conta por padrão"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configuração manual"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Digite um endereço de e-mail e senha válidos."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Conta duplicada"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Você já está usando este nome de usuário para a conta \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Essa senha inicia ou termina com um ou mais caracteres de espaço. Muitos servidores não suportam senhas com espaços."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Recuperando informações sobre a conta"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Verificando as configurações de entrada do servidor..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Verificando as configurações de saída do servidor..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Configuração da conta"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Sua conta está configurada e o e-mail está a caminho!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Dar nome a esta conta (opcional)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Seu nome (exibido nas mensagens enviadas)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Este campo não pode ficar em branco."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Configuração da conta"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Tipo de conta"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Que tipo de conta é esta?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Configuração da conta"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Configurações de entrada do servidor"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nome de usuário"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Senha"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Servidor"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Porta"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipo de segurança"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nenhum"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Aceitar todos os certificados)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (aceitar todos os certificados)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Excluir e-mail do servidor"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Nunca"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Quando eu excluir da Caixa de entrada"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Prefixo do caminho IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Opcional"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Configuração da conta"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Configurações de saída do servidor"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Servidor SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Porta"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipo de segurança"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Exigir login"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nome de usuário"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Senha"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Configuração da conta"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Configurações do servidor"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Servidor"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domínio\\Nome de usuário"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Usar conexão segura (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Aceitar todos os certificados SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certificado do cliente"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Selecionar"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Usar certificado de cliente"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Remover"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Nenhum"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID do aparelho celular"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Configurações da conta"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Opções da conta"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Frequência de verificação da caixa de entrada"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nunca"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automático (envio)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"A cada 5 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"A cada 10 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"A cada 15 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"A cada 30 minutos"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"De hora em hora"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Enviar e-mail desta conta por padrão"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Receber notificação quando um e-mail chegar"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sincronizar contatos desta conta"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sincronizar agenda desta conta"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sincronizar e-mail desta conta."</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Fazer o download de anexos automaticamente ao conectar ao Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Não foi possível concluir"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dias para sincronizar"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automático"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Um dia"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Três dias"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Uma semana"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Duas semanas"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Um mês"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Todos"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Usar padrão da conta"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nome de usuário ou senha incorretos."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nome de usuário ou senha estão incorretos."\n" (<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Não é possível se conectar ao servidor com segurança."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Não é possível se conectar ao servidor com segurança."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"É necessário um certificado de cliente. Deseja se conectar ao servidor com um certificado de cliente?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"O certificado é inválido ou inacessível."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"O servidor respondeu com um erro. Verifique seu nome de usuário e senha e tente novamente."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Não é possível se conectar ao servidor."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Não é possível se conectar ao servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS solicitado, mas não suportado pelo servidor."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Os métodos de autenticação não são suportados pelo servidor."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Não foi possível abrir a conexão com o servidor devido a um erro de segurança."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Não foi possível abrir a conexão com o servidor."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Você digitou um endereço de servidor incorreto ou o servidor exige uma versão de protocolo que o e-mail não suporta."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Você não tem permissão para sincronizar com este servidor. Entre em contato com o administrador do servidor para obter mais informações."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Administração de segurança remota"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"O servidor <xliff:g id="SERVER">%s</xliff:g> requer a permissão de controle remoto de alguns recursos de segurança do seu dispositivo Android. Deseja concluir a configuração desta conta?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Este servidor exige recursos de segurança não suportados por seu dispositivo Android, incluindo: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Não é possível alterar o nome de usuário de uma conta. Para adicionar uma conta com um nome de usuário diferente, toque em Adicionar conta."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"AVISO: ao desativar a autoridade do aplicativo de e-mail para administrar seu dispositivo, todas as contas de e-mail vinculadas serão excluídas, assim como e-mails, contatos, eventos da agenda e outros dados."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Atualização de segurança"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> solicita que você atualize suas configurações de segurança."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"A conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" não pode ser sincronizada devido a solicitações de segurança."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"A conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" exige a atualização das configurações de segurança."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"As configurações de segurança da conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" foram alteradas. Nenhuma ação do usuário é necessária."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Necessária atualiz. segurança"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Polít. segurança alteradas"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Polít. de seg. não podem ser cumpridas"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Segurança do dispositivo"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"O servidor <xliff:g id="SERVER">%s</xliff:g> requer a permissão de controle remoto de alguns recursos de segurança do seu dispositivo Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Editar detalhes"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" solicita que você altere sua senha ou PIN da tela de bloqueio."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Senha da tela de bloqueio expirando"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Sua senha ou PIN da tela de bloqueio expirou."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Senha da tela de bloqueio expirada"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Senha da tela de bloqueio expirando"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"É necessário alterar o PIN ou a senha de sua tela de bloqueio logo, ou os dados da <xliff:g id="ACCOUNT">%s</xliff:g> serão apagados. Deseja mudar isso agora?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Senha da tela de bloqueio expirada"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Os dados da <xliff:g id="ACCOUNT">%s</xliff:g> estão sendo apagados de seu dispositivo. Você pode restaurá-los alterando o PIN ou a senha de sua tela de bloqueio. Deseja mudar isso agora?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Descartar as alterações não salvas?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Não foi possível fazer login"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"O nome de usuário ou senha da <xliff:g id="ACCOUNT">%s</xliff:g> está incorreto. Deseja atualizar agora?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Conta padrão"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Enviar e-mail desta conta por padrão"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Fazer download dos anexos"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Fazer download automát. dos anexos de mens. recentes via Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Notificações de e-mail"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Frequência de sincronização, notificações etc."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Enviar notificação quando chegarem e-mails"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frequência de verificação da caixa de entrada"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Configurações recebidas"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nome de usuário, senha e outras configurações do servidor de entrada"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Configurações enviadas"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nome de usuário, senha e outras configurações do servidor de saída"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Políticas aplicadas"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Nenhuma"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Políticas não suportadas"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Nenhuma"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Tentativa de sincronização"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Toque aqui para sincronizar esta conta"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Nome da conta"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Seu nome"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Assinatura"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Respostas rápidas"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edite o texto que você costuma inserir ao compor e-mails"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Acrescentar texto às mensagens que você envia"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Configurações de notificação"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Uso de dados"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Políticas de segurança"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Editar resposta rápida"</string>
- <string name="save_action" msgid="1988862706623227093">"Salvar"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronizar contatos"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincronizar contatos para esta conta"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronizar agenda"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sinc. evento agenda p/ esta conta"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincronizar e-mail"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincronizar e-mail para esta conta"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrar"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibrar também quando chegar e-mails"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Sempre"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Apenas quando estiver no silencioso"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Nunca"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibrar"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Selecionar toque"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Configurações do servidor"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Remover conta"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"A conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" será removida deste e-mail."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Remover conta"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Remover conta"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Opções de sincronização"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Opções de sincronização (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Configurações de sincronização"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Verificar frequência"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Dias para sincronizar"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Con e-mail"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Escolha uma conta"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Selecionar uma pasta"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"A conta não foi encontrada. Ela pode ter sido removida."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"A pasta não foi encontrada. Ela pode ter sido removida."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Somente algumas contas \"Plus\" incluem o acesso POP permitindo que este programa seja conectado. Se não for possível fazer login com seu endereço de e-mail e senha corretos, você talvez não tenha uma conta \"Plus\" paga. Inicie o navegador da web para acessar essas contas de e-mail."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Antes de configurar essa conta de e-mail, acesse o site T-Online e crie uma senha para acessar e-mail POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Corporativa"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Não foi possível criar a conta. Tente novamente."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-mail"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Ativa as políticas de segurança especificadas pelo servidor"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Pesquisando <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> resultado de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultados de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Configurações"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Configurações gerais"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Aplicativo"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avanço automático"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Selecione qual tela mostrar após a exclusão de uma mensagem"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ocultar caixas de seleção"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Nas listas de mensagens, a mantenha pressionada para selecionar"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirmar antes de excluir"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mensagens"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirmar antes de enviar"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mensagens"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Avançar até"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mensagem mais recente"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mensagem antiga"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Lista de mensagens"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Tamanho do texto da mensagem"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Texto minúsculo"</item>
- <item msgid="4415205108584620118">"Texto pequeno"</item>
- <item msgid="4550219696381691112">"Texto normal"</item>
- <item msgid="6227813549949219991">"Texto grande"</item>
- <item msgid="1197917420815786571">"Texto enorme"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Tamanho do texto da mensagem"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Muito pequeno"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Pequeno"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Grande"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Enorme"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Responder a todos"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Tornar a opção \"Responder a todos\" padrão p/ respostas das mensagens"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Pedir para exibir imagens"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"As imagens das mensagens não serão exibidas automaticamente"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Opção \"Mostrar fotos\" desmarcada."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Aguardando sincronização"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Seu e-mail aparecerá em breve."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Toque para mudar."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Caixa de entrada mesclada"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Não lidas"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Com estrela"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Carregando…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Toque para configurar."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Você ainda não configurou uma conta de e-mail."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Pesquisar e-mail"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Pesquisar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Resultados da pesquisa para \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Aguardando resultados"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Alguns servidores podem levar um longo tempo."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Pastas"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Desativar o uso da câmera do dispositivo"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Exigir senha para o dispositivo"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Restringir reutiliz. de senhas recentes"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Exigir que as senhas expirem"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Exigir dispositivo inativo p/ bloq. tela"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Limitar número de eventos de agenda sincronizados"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Limitar número de e-mails sincronizados"</string>
- <string name="quick_1" msgid="3426057697353380951">"Obrigado!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Parece uma boa ideia!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Lerei isso mais tarde e darei uma resposta a você."</string>
- <string name="quick_4" msgid="3988974084396883051">"Podemos marcar uma reunião para discutir isso."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"A sincronização em segundo plano para essa conta é desativada durante o roaming."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Enviando resposta..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Nenhuma mensagem."</string>
-</resources>
diff --git a/email2/res/values-pt/uploader.xml b/email2/res/values-pt/uploader.xml
deleted file mode 100644
index f23616485..000000000
--- a/email2/res/values-pt/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Instant Upload"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Álbum do Instant Upload"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Fazendo upload"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Concluído"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Pausado"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d fotos • %3$d vídeos"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d fotos e %2$d vídeos"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"pouca bateria"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"cota de fotos excedida"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"em roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"aguardando Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"adiado até o carregamento"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"aguardando conexão"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"tentando novamente em %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Mostrar envios pendentes"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Mostrar envios concluídos"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Visualizar on-line"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Mostrar envios pendentes"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Ocultar envios pendentes"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Mostrar detalhes"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Ocultar detalhes"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Configurações"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Enviado %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Conta"</string>
- <string name="upload" msgid="2615541458361216022">"Enviar"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Cancelar"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Enviando para "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" para "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Falha na inicialização do envio."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Arquivo não disponível."</string>
- <string name="account_error" msgid="1904775271866104941">"Falha ao recuperar as informações da conta."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Ocorreu um problema ao fazer login em sua conta."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Aguardando para tentar novamente"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Aguardando Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Fazendo upload"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Falhou"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Concluído"</string>
- <string name="pause_state_running" msgid="711411177620353982">"fazendo upload"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"pausado manualmente"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"pausado - pouca bateria"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"pausado - adiado até o carregamento"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"pausado - aguardando conexão"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"pausado - fora da cota PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"pausado - aguardando Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"pausado - roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"aguardando para tentar novamente"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"Um minuto"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"Dois minutos"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"Cinco minutos"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Nenhuma conexão de dados"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"A conta está sem cota de disco"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Arquivo não encontrado"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Erro de serviço"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Erro na rede"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"A autenticação falhou"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Envios pendentes [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Envios concluídos [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Pausar envios"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Retomar envios"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Enviar agora"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Enviar mais tarde"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Não enviar"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Visualizar"</string>
- <string name="manager_retry" msgid="939534318469518843">"Tentar novamente"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Envio cancelado"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Envio já concluído"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sincronizar tudo"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Última sincronização:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"A lista de itens concluídos está vazia."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Instant Upload"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Envios concluídos"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Envios pausados"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"O Instant Upload ainda não foi ativado"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Arquivos grandes serão enviados apenas por uma conexão Wi-Fi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Verificando arquivos..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Preparando <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> fotos e <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> vídeos para enviar..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Não é necessário enviar fotos ou vídeos adicionais."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Ocorreu um problema ao se conectar ao servidor. Tente novamente mais tarde."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Sincronizações canceladas"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sincronizar tudo"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Visualizar itens concluídos"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Visualizar pendentes"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Geral"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Pausar todos os envios"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Energia"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Enviar somente quando o telefone estiver carregando."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Enviar somente quando houver Wi-Fi disponível."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotos"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Conta"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Condições de envio"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Tamanho da foto"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Vídeos"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Conta"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"A conta de fotos será usada para envio de vídeos."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Condições de envio"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"As configurações de conectividade de fotos estão sendo utilizadas."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Somente fotos através de redes móveis"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotos e vídeos por redes móveis"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Fotos e vídeos somente por Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Sobre"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Vers. Instant Upload"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Recomendado: 1.600 pixels (para compartilhamento, impressões e protetores de tela)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Tamanho original (envio mais lento)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"pausado - cartão SD indisponível"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Cartão SD indisponível"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Conf. Instant Upload"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Instant Upload"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Enviar novas fotos e vídeos automaticamente para um álbum privado na web"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Status de upload"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Avançado"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Envios do celular"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Envios de roaming"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Enviar fotos e vídeos quando estiver em roaming na rede de dados"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Uploads de bateria"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Enviar fotos e vídeos apenas quando estiver carregando"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Enviar fotos existentes"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Enviar agora todas as fotos e vídeos existentes em seu telefone"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Desativado"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Enviando (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d de %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Pausado: toque para retomar o envio"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Enviar fotos existentes"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"O envio de fotos e vídeos que ainda não tenham sido enviados de seu telefone para um álbum privado na web pode demorar um pouco, mas será feito em segundo plano. Tem certeza de que deseja continuar?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Sim"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Não"</string>
-</resources>
diff --git a/email2/res/values-rm/strings.xml b/email2/res/values-rm/strings.xml
deleted file mode 100644
index ce5496385..000000000
--- a/email2/res/values-rm/strings.xml
+++ /dev/null
@@ -1,756 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for permission_read_attachment_label (9208086010625033590) -->
- <skip />
- <!-- no translation found for permission_read_attachment_desc (3394721085306308972) -->
- <skip />
- <!-- no translation found for permission_access_provider_label (378256653525377586) -->
- <skip />
- <!-- no translation found for permission_access_provider_desc (6296566558584670348) -->
- <skip />
- <string name="app_name" msgid="5815426892327290362">"E-mail"</string>
- <string name="compose_title" msgid="427986915662706899">"Nov messadi"</string>
- <string name="debug_title" msgid="5175710493691536719">"Debug"</string>
- <string name="next_action" msgid="3931301986364184415">"Vinavant"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Interrumper"</string>
- <!-- no translation found for previous_action (5181616311579820981) -->
- <skip />
- <string name="send_action" msgid="1729766205562446418">"Trametter"</string>
- <string name="reply_action" msgid="4262472229221507619">"Respunder"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Respunder a tuts"</string>
- <string name="delete_action" msgid="8421026208288857155">"Stizzar"</string>
- <string name="forward_action" msgid="669174181042344116">"Transferir"</string>
- <!-- no translation found for favorite_action (4664259801498253756) -->
- <skip />
- <string name="done_action" msgid="7497990549515580249">"Terminà"</string>
- <!-- no translation found for create_action (3062715563215392251) -->
- <skip />
- <!-- no translation found for delete_quick_response_action (3076922270182841978) -->
- <skip />
- <!-- no translation found for quick_responses_empty_view (3960050972306132367) -->
- <skip />
- <string name="discard_action" msgid="6532206074859505968">"Sbittar"</string>
- <!-- no translation found for save_draft_action (6413714270991417223) -->
- <skip />
- <!-- no translation found for show_quick_text_list_dialog_action (4136018559611145202) -->
- <skip />
- <string name="read_action" msgid="4701484794504781686">"Marcar sco legì"</string>
- <string name="unread_action" msgid="6280399049357552826">"Marcà sco nunlegì"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Agiuntar ina staila"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Allontanar la staila"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Actualisar"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Agiuntar in conto"</string>
- <string name="compose_action" msgid="4045702519637388045">"Nov messadi"</string>
- <string name="search_action" msgid="6325101454876682308">"Tschertgar"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Parameters dal conto"</string>
- <!-- no translation found for settings_action (6334807007967459412) -->
- <skip />
- <!-- no translation found for menu_folder_options (2871906096248843471) -->
- <skip />
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Marcar sco nunlegì"</string>
- <!-- no translation found for move_action (3059189775933985898) -->
- <skip />
- <!-- no translation found for plus_cc_label (3365150001259912183) -->
- <skip />
- <!-- no translation found for add_cc_bcc_menu (4757145078498200242) -->
- <skip />
- <!-- no translation found for add_file_attachment (2203398371671979481) -->
- <skip />
- <!-- no translation found for close_action (533058985745238100) -->
- <skip />
- <!-- no translation found for message_list_send_pending_messages_action (8502942186631824114) -->
- <skip />
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Tscherner ina agiunta"</string>
- <!-- no translation found for move_to_folder_dialog_title (2614318192482193898) -->
- <skip />
- <string name="status_loading_messages" msgid="6552307237621292344">"Ils messadis vegnan chargiads…"</string>
- <!-- no translation found for status_network_error (2611654064403817391) -->
- <skip />
- <!-- no translation found for error_loading_message_body (6775234299515596760) -->
- <skip />
- <!-- no translation found for move_messages:one (320885379869442589) -->
- <!-- no translation found for move_messages:other (371256717624461324) -->
- <!-- no translation found for cannot_move_protocol_not_supported_toast (6558083148128616292) -->
- <skip />
- <!-- no translation found for cannot_move_multiple_accounts_toast (7922594026384944163) -->
- <skip />
- <!-- no translation found for cannot_move_special_mailboxes_toast (7093107954841896970) -->
- <skip />
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> nunlegì (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> nunlegids (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> nunlegids (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"en <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> contos"</item>
- <item quantity="other" msgid="2723797835410343458">"en <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> contos"</item>
- </plurals>
- <!-- no translation found for notification_to_account (2078557719010667913) -->
- <skip />
- <!-- no translation found for notification_multiple_new_messages_fmt (2606649762841566104) -->
- <skip />
- <!-- no translation found for account_name_display_all (837218861494831989) -->
- <skip />
- <!-- no translation found for number_of_accounts:one (6343953132237244947) -->
- <!-- no translation found for number_of_accounts:other (8548760449976444566) -->
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Posta entrada"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Posta sortida"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Sbozs"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Chanaster da palpiri"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Tramess"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Nungiavischà"</string>
- <!-- no translation found for mailbox_name_display_unread (1015674989793998695) -->
- <skip />
- <!-- no translation found for picker_mailbox_name_all_unread (6392491216581687644) -->
- <skip />
- <!-- no translation found for picker_mailbox_name_all_inbox (2277030979530376085) -->
- <skip />
- <!-- no translation found for picker_combined_view_fmt (6276294768978512737) -->
- <skip />
- <!-- no translation found for picker_combined_view_account_count:one (380235084337895804) -->
- <!-- no translation found for picker_combined_view_account_count:other (4145163147488719025) -->
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versiun: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <!-- no translation found for account_folder_list_summary_inbox (7518263761297423255) -->
- <skip />
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Cun staila"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Sbozs"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Posta sortida"</string>
- <!-- no translation found for mailbox_list_account_selector_combined_view (1556327299894225044) -->
- <skip />
- <!-- no translation found for mailbox_list_account_selector_show_all_folders (4185052839366909439) -->
- <skip />
- <!-- no translation found for mailbox_list_account_selector_account_header (4261295503836387876) -->
- <skip />
- <!-- no translation found for mailbox_list_account_selector_mailbox_header_fmt (3320144348694625092) -->
- <skip />
- <!-- no translation found for mailbox_list_user_mailboxes (484260487104726379) -->
- <skip />
- <!-- no translation found for mailbox_list_recent_mailboxes (8922653040520361032) -->
- <skip />
- <!-- no translation found for message_subject_description (3597047441062021199) -->
- <skip />
- <!-- no translation found for message_is_empty_description (4004644319382041459) -->
- <skip />
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Chargiar ulteriurs messadis"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> selected"</item>
- <item quantity="other" msgid="7901361399231876038">"Tschernì <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- </plurals>
- <!-- no translation found for message_list_no_messages (7846910091922523867) -->
- <skip />
- <string name="message_compose_to_hint" msgid="2891895306418177013">"A"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Object"</string>
- <!-- no translation found for message_compose_from_label (4084843296548498041) -->
- <skip />
- <!-- no translation found for to (4392614766835725698) -->
- <skip />
- <!-- no translation found for cc (7017720927911078193) -->
- <skip />
- <!-- no translation found for bcc (3098643138241111579) -->
- <skip />
- <!-- no translation found for subject_hint (7253964583324677128) -->
- <skip />
- <!-- no translation found for body_hint (4279864165439577668) -->
- <skip />
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Messadi original --------"\n"Object: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Da: <xliff:g id="SENDER">%2$s</xliff:g>"\n"A: <xliff:g id="TO">%3$s</xliff:g>"\n"Cc: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> ha scrit:"\n\n</string>
- <!-- no translation found for message_compose_quoted_text_label (6950097435198536165) -->
- <skip />
- <!-- no translation found for message_compose_include_quoted_text_checkbox_label (8165567368956050390) -->
- <skip />
- <!-- no translation found for message_compose_error_no_recipients (140299472517968199) -->
- <skip />
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Tschertas adressas dad e-mail èn nuncorrectas."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"L\'agiunta è memia gronda."</string>
- <!-- no translation found for message_compose_insert_quick_response_list_title (5314107302508728189) -->
- <skip />
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> e <xliff:g id="NUMBER">%2$d</xliff:g> auters"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"A:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <!-- no translation found for message_view_date_label (7033814961837313339) -->
- <skip />
- <!-- no translation found for message_view_from_label (6055076379282772675) -->
- <skip />
- <!-- no translation found for message_view_subject_label (3731022187530000852) -->
- <skip />
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Far ir"</string>
- <!-- no translation found for message_view_attachment_install_action (381211378884166381) -->
- <skip />
- <!-- no translation found for message_view_attachment_play_action (5214215414665114061) -->
- <skip />
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Chargiar"</string>
- <!-- no translation found for message_view_attachment_info_action (3908148393469626740) -->
- <skip />
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Memorisar"</string>
- <!-- no translation found for message_view_attachment_saved (3432810414785232025) -->
- <skip />
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Fermar"</string>
- <!-- no translation found for message_view_status_attachment_saved (8878790392556284868) -->
- <skip />
- <!-- no translation found for message_view_status_attachment_not_saved (4013475734255421939) -->
- <skip />
- <!-- no translation found for message_view_attachment_background_load (7906875687519445185) -->
- <skip />
- <!-- no translation found for message_view_show_message_action (5134222901019191436) -->
- <skip />
- <!-- no translation found for message_view_show_invite_action (8862797393776226777) -->
- <skip />
- <!-- no translation found for message_view_show_attachments_action:one (7594476368958824007) -->
- <!-- no translation found for message_view_show_attachments_action:other (974463163535515223) -->
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Mussar ils maletgs"</string>
- <!-- no translation found for message_view_always_show_pictures_button (6523810929103546865) -->
- <skip />
- <!-- no translation found for message_view_always_show_pictures_prompt (7685500276479967959) -->
- <skip />
- <!-- no translation found for message_view_always_show_pictures_confirmation (6838463134312859448) -->
- <skip />
- <string name="message_view_invite_view" msgid="5521032519960111675">"Mussar en il chalender"</string>
- <!-- no translation found for message_view_invite_title (3418949733434713805) -->
- <skip />
- <string name="message_view_invite_text" msgid="1212799906603873708">"Participar?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Gea"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Forsa"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Na"</string>
- <!-- no translation found for message_view_invite_toast_yes (6802274503171644414) -->
- <skip />
- <!-- no translation found for message_view_invite_toast_maybe (8547454326090527202) -->
- <skip />
- <!-- no translation found for message_view_invite_toast_no (1842341256942784143) -->
- <skip />
- <!-- no translation found for message_view_show_details (6287415596441037095) -->
- <skip />
- <!-- no translation found for message_view_message_details_dialog_title (9042008615386883449) -->
- <skip />
- <!-- no translation found for attachment_info_dialog_default_title (4995755709689009622) -->
- <skip />
- <!-- no translation found for attachment_info_dialog_wifi_title (3174350153882915382) -->
- <skip />
- <!-- no translation found for attachment_info_wifi_settings (96432970927503597) -->
- <skip />
- <!-- no translation found for attachment_info_application_settings (4124655487276125596) -->
- <skip />
- <!-- no translation found for attachment_info_unknown (8342655396805943320) -->
- <skip />
- <!-- no translation found for attachment_info_malware (6576029010855055528) -->
- <skip />
- <!-- no translation found for attachment_info_policy (3560422300127587508) -->
- <skip />
- <!-- no translation found for attachment_info_wifi_only (1481120960014563617) -->
- <skip />
- <!-- no translation found for attachment_info_no_intent (8139209405745777924) -->
- <skip />
- <!-- no translation found for attachment_info_sideload_disabled (3270731101769840006) -->
- <skip />
- <!-- no translation found for attachment_info_apk_install_disabled (2817790592227462682) -->
- <skip />
- <!-- no translation found for attachment_not_found (7155322700141145123) -->
- <skip />
- <!-- no translation found for message_decode_error (5016042255170947834) -->
- <skip />
- <!-- no translation found for eml_view_title (8827210108543430336) -->
- <skip />
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <!-- no translation found for message_delete_confirm:one (3799616435056423256) -->
- <!-- no translation found for message_delete_confirm:other (4437637377522896262) -->
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Messadi stizzà"</item>
- <item quantity="other" msgid="6574961322865652255">"Stizzà ils messadis"</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Stizzà il messadi"</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Memorisà il messadi sco sboz."</string>
- <!-- no translation found for message_view_display_attachment_toast (7714482237896346836) -->
- <skip />
- <!-- no translation found for message_view_load_attachment_failed_toast (8605967295095023587) -->
- <skip />
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Avrir il messadi..."</string>
- <!-- no translation found for message_moved_toast:one (3098493230185412871) -->
- <!-- no translation found for message_moved_toast:other (2286739630865943494) -->
- <!-- no translation found for forward_download_failed_ticker (6176608320359303255) -->
- <skip />
- <!-- no translation found for forward_download_failed_title (6139701848515572511) -->
- <skip />
- <!-- no translation found for login_failed_ticker (2169365211566829350) -->
- <skip />
- <!-- no translation found for login_failed_title (7624349996212476176) -->
- <skip />
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <!-- no translation found for message_view_move_to_newer (2190862552581773765) -->
- <skip />
- <!-- no translation found for message_view_move_to_older (4993043091356700890) -->
- <skip />
- <!-- no translation found for message_list_subject_snippet_divider (1783589062530679520) -->
- <skip />
- <!-- no translation found for account_setup_basics_title (3578333196594678422) -->
- <skip />
- <!-- no translation found for account_setup_basics_headline (6726590205905464015) -->
- <skip />
- <!-- no translation found for accounts_welcome (8337750045270269649) -->
- <skip />
- <!-- no translation found for account_setup_basics_email_label (3454164053624112047) -->
- <skip />
- <!-- no translation found for account_setup_basics_password_label (9133549799291519298) -->
- <skip />
- <!-- no translation found for account_setup_basics_default_label (8896222991837026736) -->
- <skip />
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configuraziun manuala"</string>
- <!-- no translation found for account_setup_username_password_toast (3968270274727947460) -->
- <skip />
- <!-- no translation found for account_duplicate_dlg_title (8089732986912704425) -->
- <skip />
- <!-- no translation found for account_duplicate_dlg_message_fmt (6447629283679935840) -->
- <skip />
- <!-- no translation found for account_password_spaces_error (8928309156658903257) -->
- <skip />
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Recuperar las infurmaziuns davart il conto…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Verificaziun dals parameters dal server d\'entrada…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Ils parameters dil server da sortida vegnan controllads…"</string>
- <!-- no translation found for account_setup_names_title (8483517350241119291) -->
- <skip />
- <!-- no translation found for account_setup_names_headline (914858472109729140) -->
- <skip />
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Dar in num al conto (facultativ)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Voss num (vegn mussà en messadis che sortan)"</string>
- <!-- no translation found for account_setup_names_user_name_empty_error (6791427018325367364) -->
- <skip />
- <!-- no translation found for account_setup_account_type_title (7156551693961182124) -->
- <skip />
- <!-- no translation found for account_setup_account_type_headline (3574102329184831086) -->
- <skip />
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Da tge tip da conto sa tracti?"</string>
- <!-- no translation found for account_setup_incoming_title (6796626791039136005) -->
- <skip />
- <!-- no translation found for account_setup_incoming_headline (6183711037633407184) -->
- <skip />
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Num d\'utilisader"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Pled-clav"</string>
- <!-- no translation found for account_setup_incoming_server_label (1480342966630002638) -->
- <skip />
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tip da segirezza"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nagin"</string>
- <!-- no translation found for account_setup_incoming_security_ssl_trust_certificates_label (6151855090123117538) -->
- <skip />
- <!-- no translation found for account_setup_incoming_security_ssl_label (2798501138420163861) -->
- <skip />
- <!-- no translation found for account_setup_incoming_security_tls_trust_certificates_label (6149084428423662620) -->
- <skip />
- <!-- no translation found for account_setup_incoming_security_tls_label (6573498431821879660) -->
- <skip />
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Stizzar ils e-mails dal server"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Mai"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Sche jau stiz els da la posta entrada"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Prefix da la via d\'access IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Facultativ"</string>
- <!-- no translation found for account_setup_outgoing_title (7208495965665711539) -->
- <skip />
- <!-- no translation found for account_setup_outgoing_headline (2025001060935366394) -->
- <skip />
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Server SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tip da segirezza"</string>
- <!-- no translation found for account_setup_outgoing_require_login_label (7779484127897397562) -->
- <skip />
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Num d\'utilisader"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Pled-clav"</string>
- <!-- no translation found for account_setup_exchange_title (396004732514751781) -->
- <skip />
- <!-- no translation found for account_setup_exchange_headline (6099049671599242131) -->
- <skip />
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Server"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domena/num d\'utilisader"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Utilisar ina connexiun segira (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Acceptar tut ils certificats SSL"</string>
- <!-- no translation found for account_setup_exchange_certificate_title (8473793588405277962) -->
- <skip />
- <!-- no translation found for account_setup_exchange_select_certificate (1536103662037268683) -->
- <skip />
- <!-- no translation found for account_setup_exchange_use_certificate (8690682770083161349) -->
- <skip />
- <!-- no translation found for account_setup_exchange_remove_certificate (5633249155510301766) -->
- <skip />
- <!-- no translation found for account_setup_exchange_no_certificate (1119542961954780872) -->
- <skip />
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID dad apparats mobils"</string>
- <!-- no translation found for account_setup_options_title (9016600767888846051) -->
- <skip />
- <!-- no translation found for account_setup_options_headline (4181274232835368085) -->
- <skip />
- <!-- no translation found for account_setup_options_mail_check_frequency_label (4824859792882810053) -->
- <skip />
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Mai"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automaticamain (push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Mintga 5 minutas"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Mintga 10 minutas"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Mintga 15 minutas"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Mintga 30 minutas"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Mintga ura"</string>
- <!-- no translation found for account_setup_options_default_label (2617227194283720914) -->
- <skip />
- <!-- no translation found for account_setup_options_notify_label (7046146571560728829) -->
- <skip />
- <!-- no translation found for account_setup_options_sync_contacts_label (276492345599531778) -->
- <skip />
- <!-- no translation found for account_setup_options_sync_calendar_label (3222151135467189411) -->
- <skip />
- <!-- no translation found for account_setup_options_sync_email_label (8585177128405004068) -->
- <skip />
- <!-- no translation found for account_setup_options_background_attachments_label (5247749298276451846) -->
- <skip />
- <!-- no translation found for account_setup_failed_dlg_title (9083263347962940552) -->
- <skip />
- <!-- no translation found for account_setup_options_mail_window_label (7582247646138987328) -->
- <skip />
- <!-- no translation found for account_setup_options_mail_window_auto (4188895354366183790) -->
- <skip />
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"In di"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Trais dis"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Ina emna"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Duas emnas"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"In mais"</string>
- <!-- no translation found for account_setup_options_mail_window_all (5372861827683632364) -->
- <skip />
- <!-- no translation found for account_setup_options_mail_window_default (8321351926520165832) -->
- <skip />
- <!-- no translation found for account_setup_failed_dlg_auth_message (426627755590431364) -->
- <skip />
- <!-- no translation found for account_setup_failed_dlg_auth_message_fmt (737111956772240007) -->
- <skip />
- <!-- no translation found for account_setup_failed_dlg_certificate_message (3836152264696108805) -->
- <skip />
- <!-- no translation found for account_setup_failed_dlg_certificate_message_fmt (2121921642915593041) -->
- <skip />
- <!-- no translation found for account_setup_failed_certificate_required (2689944595775206006) -->
- <skip />
- <!-- no translation found for account_setup_failed_certificate_inaccessible (3563840279690749547) -->
- <skip />
- <!-- no translation found for account_setup_failed_check_credentials_message (6531658092540248067) -->
- <skip />
- <!-- no translation found for account_setup_failed_dlg_server_message (4942810054116129684) -->
- <skip />
- <!-- no translation found for account_setup_failed_dlg_server_message_fmt (2525425638303883232) -->
- <skip />
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS è obligatoric ma na vegn betg sustegnì dal server."</string>
- <!-- no translation found for account_setup_failed_auth_required (6799839150250217566) -->
- <skip />
- <!-- no translation found for account_setup_failed_security (925820957665764964) -->
- <skip />
- <!-- no translation found for account_setup_failed_ioerror (7802604687451830378) -->
- <skip />
- <!-- no translation found for account_setup_failed_protocol_unsupported (4607759927226943569) -->
- <skip />
- <!-- no translation found for account_setup_failed_access_denied (6835358740050287051) -->
- <skip />
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Administraziun da la segirezza a distanza"</string>
- <!-- no translation found for account_setup_security_policies_required_fmt (5410714107656671761) -->
- <skip />
- <!-- no translation found for account_setup_failed_security_policies_unsupported (3210264746877120355) -->
- <skip />
- <!-- no translation found for account_setup_username_uneditable_error (1618869759801584109) -->
- <skip />
- <!-- no translation found for disable_admin_warning (6196985268695592382) -->
- <skip />
- <!-- no translation found for account_security_dialog_title (430041952584831904) -->
- <skip />
- <!-- no translation found for account_security_dialog_content_fmt (8843806143923278214) -->
- <skip />
- <!-- no translation found for security_unsupported_ticker_fmt (5166579214529283975) -->
- <skip />
- <!-- no translation found for security_needed_ticker_fmt (2120499087897133665) -->
- <skip />
- <!-- no translation found for security_changed_ticker_fmt (2609435447352755285) -->
- <skip />
- <!-- no translation found for security_notification_content_update_title (2429762903228690154) -->
- <skip />
- <!-- no translation found for security_notification_content_change_title (443490921895642130) -->
- <skip />
- <!-- no translation found for security_notification_content_unsupported_title (7315219208043169233) -->
- <skip />
- <!-- no translation found for account_security_title (3511543138560418587) -->
- <skip />
- <!-- no translation found for account_security_policy_explanation_fmt (6932627044314460766) -->
- <skip />
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Modifitgar ils detagls"</string>
- <!-- no translation found for password_expire_warning_ticker_fmt (2459977229180023773) -->
- <skip />
- <!-- no translation found for password_expire_warning_content_title (7174669014074849304) -->
- <skip />
- <!-- no translation found for password_expired_ticker (4230570412974108968) -->
- <skip />
- <!-- no translation found for password_expired_content_title (4349518706602252979) -->
- <skip />
- <!-- no translation found for password_expire_warning_dialog_title (1687074175399798189) -->
- <skip />
- <!-- no translation found for password_expire_warning_dialog_content_fmt (4293446611405084436) -->
- <skip />
- <!-- no translation found for password_expired_dialog_title (2186547998125938084) -->
- <skip />
- <!-- no translation found for password_expired_dialog_content_fmt (6538210092073931079) -->
- <skip />
- <!-- no translation found for account_settings_exit_server_settings (8006323251094711431) -->
- <skip />
- <!-- no translation found for account_settings_login_dialog_title (4024422579146302775) -->
- <skip />
- <!-- no translation found for account_settings_login_dialog_content_fmt (8849649646111167377) -->
- <skip />
- <string name="account_settings_default_label" msgid="3575963379680943640">"Conto predefinì"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Trametter ils e-mails tenor standard cun quest conto"</string>
- <!-- no translation found for account_settings_background_attachments_label (2980317599840958688) -->
- <skip />
- <!-- no translation found for account_settings_background_attachments_summary (5954218549226189376) -->
- <skip />
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Avis ad e-mails"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"\"Frequenza da sincronisaziun, avis, etc.\""</string>
- <!-- no translation found for account_settings_notify_summary (8134339460923068254) -->
- <skip />
- <!-- no translation found for account_settings_mail_check_frequency_label (8271462919214560616) -->
- <skip />
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Messadis che entran"</string>
- <!-- no translation found for account_settings_incoming_summary (2923044634831881068) -->
- <skip />
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Parameters da sortida"</string>
- <!-- no translation found for account_settings_outgoing_summary (3572093624332724311) -->
- <skip />
- <!-- no translation found for account_settings_enforced_label (7429582254433588882) -->
- <skip />
- <!-- no translation found for account_settings_enforced_summary (8140860420440447771) -->
- <skip />
- <!-- no translation found for account_settings_unsupported_label (1954091071454235577) -->
- <skip />
- <!-- no translation found for account_settings_unsupported_summary (2107633813351863608) -->
- <skip />
- <!-- no translation found for account_settings_retry_label (1104680719299842829) -->
- <skip />
- <!-- no translation found for account_settings_retry_summary (2703599639846201913) -->
- <skip />
- <string name="account_settings_description_label" msgid="8894815221204511715">"Num dal conto"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Voss num"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Signatura"</string>
- <!-- no translation found for account_settings_edit_quick_responses_label (3106019627675996480) -->
- <skip />
- <!-- no translation found for account_settings_edit_quick_responses_summary (8056686122888722591) -->
- <skip />
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Agiuntar in text als messadis che sortan"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Parameters dad avis"</string>
- <!-- no translation found for account_settings_data_usage (6669107430575866736) -->
- <skip />
- <!-- no translation found for account_settings_policies (6292833636418641840) -->
- <skip />
- <!-- no translation found for edit_quick_response_dialog (4322494050816995390) -->
- <skip />
- <!-- no translation found for save_action (1988862706623227093) -->
- <skip />
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronisar ils contacts"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincronisar ils contacts per quest conto"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronisar il chalender"</string>
- <!-- no translation found for account_settings_sync_calendar_summary (7606340353079301703) -->
- <skip />
- <!-- no translation found for account_settings_sync_email_enable (3754115565685222477) -->
- <skip />
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincronisar ils e-mails per quest conto"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrar"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Era vibrar sch\'in e-mail arriva"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Adina"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Mo sche silenzius"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Mai"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibrar"</string>
- <!-- no translation found for account_settings_ringtone (8229878374785575207) -->
- <skip />
- <string name="account_settings_servers" msgid="4925493817981624242">"Parameters dal server"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Stizzar il conto"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Il conto «<xliff:g id="ACCOUNT">%s</xliff:g>» vegn stizzà da Voss e-mail."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Stizzar il conto"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Stizzar il conto"</string>
- <!-- no translation found for mailbox_settings_activity_title (4705845931573373274) -->
- <skip />
- <!-- no translation found for mailbox_settings_activity_title_with_mailbox (6485481250424219240) -->
- <skip />
- <!-- no translation found for mailbox_preferences_header (9077316556563252246) -->
- <skip />
- <!-- no translation found for mailbox_settings_mailbox_check_frequency_label (1246075442689328906) -->
- <skip />
- <!-- no translation found for mailbox_settings_mailbox_sync_window_label (2957945231022052672) -->
- <skip />
- <!-- no translation found for account_shortcut_picker_name (1994861845225243190) -->
- <skip />
- <!-- no translation found for account_shortcut_picker_title (1039929224016048015) -->
- <skip />
- <!-- no translation found for mailbox_shortcut_picker_title (4152973927804882131) -->
- <skip />
- <!-- no translation found for toast_account_not_found (8144242451730692816) -->
- <skip />
- <!-- no translation found for toast_mailbox_not_found (4960014581292378895) -->
- <skip />
- <!-- no translation found for provider_note_live (2995297671709325333) -->
- <skip />
- <!-- no translation found for provider_note_t_online (1630642061431427894) -->
- <skip />
- <string name="exchange_name" msgid="1190783774800310346">"Da fatschenta"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <!-- no translation found for system_account_create_failed (3673792980526246177) -->
- <skip />
- <string name="device_admin_label" msgid="8680224994637869414">"E-mail"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Activescha las directivas da segirezza specificas per il server"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Tschertgar <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> resultat da <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultats da <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <!-- no translation found for settings_activity_title (5185915603716333904) -->
- <skip />
- <!-- no translation found for header_label_general_preferences (8243724566056800991) -->
- <skip />
- <!-- no translation found for category_general_preferences (2742423840964045801) -->
- <skip />
- <!-- no translation found for general_preference_auto_advance_label (213945004511666631) -->
- <skip />
- <!-- no translation found for general_preference_auto_advance_summary (6483439980032715119) -->
- <skip />
- <!-- no translation found for general_preference_hide_checkboxes_label (2054599123778503930) -->
- <skip />
- <!-- no translation found for general_preference_hide_checkboxes_summary (141341137898712712) -->
- <skip />
- <!-- no translation found for general_preference_confirm_delete_label (1863245465244241907) -->
- <skip />
- <!-- no translation found for general_preference_confirm_delete_summary (6710240861010766643) -->
- <skip />
- <!-- no translation found for general_preference_confirm_send_label (4548277349553989930) -->
- <skip />
- <!-- no translation found for general_preference_confirm_send_summary (2695471027185506093) -->
- <skip />
- <!-- no translation found for general_preference_auto_advance_dialog_title (5405052109452503909) -->
- <skip />
- <!-- no translation found for general_preference_auto_advance_newer (1336720027570509885) -->
- <skip />
- <!-- no translation found for general_preference_auto_advance_older (8273143493185128646) -->
- <skip />
- <!-- no translation found for general_preference_auto_advance_message_list (7834069275897767359) -->
- <skip />
- <!-- no translation found for general_preference_text_zoom_label (4021955890499565713) -->
- <skip />
- <!-- no translation found for general_preference_text_zoom_summary_array:0 (4693576184223089069) -->
- <!-- no translation found for general_preference_text_zoom_summary_array:1 (4415205108584620118) -->
- <!-- no translation found for general_preference_text_zoom_summary_array:2 (4550219696381691112) -->
- <!-- no translation found for general_preference_text_zoom_summary_array:3 (6227813549949219991) -->
- <!-- no translation found for general_preference_text_zoom_summary_array:4 (1197917420815786571) -->
- <!-- no translation found for general_preference_text_zoom_dialog_title (7446841758331151643) -->
- <skip />
- <!-- no translation found for general_preference_text_zoom_tiny (2948174583663330937) -->
- <skip />
- <!-- no translation found for general_preference_text_zoom_small (6618520238223144876) -->
- <skip />
- <!-- no translation found for general_preference_text_zoom_normal (1765540147950855479) -->
- <skip />
- <!-- no translation found for general_preference_text_zoom_large (6874323663381586918) -->
- <skip />
- <!-- no translation found for general_preference_text_zoom_huge (4270503132355963031) -->
- <skip />
- <!-- no translation found for general_preference_reply_all_label (7806833609810003510) -->
- <!-- no translation found for general_preference_reply_all_label (6469564953937885304) -->
- <skip />
- <!-- no translation found for general_preference_reply_all_summary (9191932552604733245) -->
- <!-- no translation found for general_preference_reply_all_summary (3356918650886350497) -->
- <skip />
- <!-- no translation found for general_preferences_clear_trusted_senders_title (507988226277210305) -->
- <skip />
- <!-- no translation found for general_preferences_clear_trusted_senders_summary (2648501128162793879) -->
- <skip />
- <!-- no translation found for trusted_senders_cleared (4762002183756251723) -->
- <skip />
- <!-- no translation found for position_of_count (7989353140376877792) -->
- <skip />
- <!-- no translation found for waitinf_for_sync_message_1 (1393719303955128036) -->
- <skip />
- <!-- no translation found for waitinf_for_sync_message_2 (5656175205790694016) -->
- <skip />
- <!-- no translation found for widget_other_views (4988574907386539499) -->
- <skip />
- <!-- no translation found for widget_all_mail (4352573990283094963) -->
- <skip />
- <!-- no translation found for widget_unread (4404711399009077833) -->
- <skip />
- <!-- no translation found for widget_starred (8290352707134011791) -->
- <skip />
- <!-- no translation found for widget_loading (2340962056927255554) -->
- <skip />
- <!-- no translation found for widget_touch_to_configure (7062039013915225323) -->
- <skip />
- <!-- no translation found for widget_no_accounts (2412482205591224408) -->
- <skip />
- <!-- no translation found for more_than_999 (8704425397397918798) -->
- <skip />
- <!-- no translation found for search_hint (2200412192574686497) -->
- <skip />
- <!-- no translation found for search_mailbox_hint (7854987729678942790) -->
- <skip />
- <!-- no translation found for search_header_text_fmt (3857004638127418247) -->
- <skip />
- <!-- no translation found for search_slow_warning_title (2826118321880530239) -->
- <skip />
- <!-- no translation found for search_slow_warning_message (8494483410797387903) -->
- <skip />
- <!-- no translation found for action_bar_mailbox_list_title (7484457755531286333) -->
- <skip />
- <!-- no translation found for policy_dont_allow_camera (5744573062306937302) -->
- <skip />
- <!-- no translation found for policy_require_password (7177274900480984702) -->
- <skip />
- <!-- no translation found for policy_password_history (5743544498302303181) -->
- <skip />
- <!-- no translation found for policy_password_expiration (1248123255253649199) -->
- <skip />
- <!-- no translation found for policy_screen_timeout (414869965358468080) -->
- <skip />
- <!-- no translation found for policy_calendar_age (627405158087482302) -->
- <skip />
- <!-- no translation found for policy_email_age (7144148367145424963) -->
- <skip />
- <!-- no translation found for quick_1 (3426057697353380951) -->
- <skip />
- <!-- no translation found for quick_2 (4188036352885736617) -->
- <skip />
- <!-- no translation found for quick_3 (8061819976353395585) -->
- <skip />
- <!-- no translation found for quick_4 (3988974084396883051) -->
- <skip />
- <!-- no translation found for require_manual_sync_message (7777357288642785955) -->
- <skip />
- <!-- no translation found for confirm_response (5747902757569543165) -->
- <skip />
- <!-- no translation found for no_conversations (5559527390337162819) -->
- <skip />
-</resources>
diff --git a/email2/res/values-rm/uploader.xml b/email2/res/values-rm/uploader.xml
deleted file mode 100644
index 1f6568e08..000000000
--- a/email2/res/values-rm/uploader.xml
+++ /dev/null
@@ -1,267 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for application_name (7812006268714926951) -->
- <skip />
- <!-- no translation found for picasa_default_destination (2052406684123992574) -->
- <skip />
- <!-- no translation found for summary_title_uploading (3357617474017589370) -->
- <skip />
- <!-- no translation found for summary_title_finished (7775292294989807025) -->
- <skip />
- <!-- no translation found for summary_title_paused (8936561302881926595) -->
- <skip />
- <!-- no translation found for summary_subtitle_uploading_format (8787409179557302869) -->
- <skip />
- <!-- no translation found for summary_subtitle_counts_format (7867903205999702138) -->
- <skip />
- <!-- no translation found for summary_subtitle_paused_low_battery (7030423720574078362) -->
- <skip />
- <!-- no translation found for summary_subtitle_paused_photos_quota (3057279018089658614) -->
- <skip />
- <!-- no translation found for summary_subtitle_paused_roaming (974863046888934062) -->
- <skip />
- <!-- no translation found for summary_subtitle_paused_need_wifi (2264018871872109546) -->
- <skip />
- <!-- no translation found for summary_subtitle_paused_need_charger (3256171133661659691) -->
- <skip />
- <!-- no translation found for summary_subtitle_paused_need_network (1922651711990030201) -->
- <skip />
- <!-- no translation found for summary_subtitle_paused_retry_format (3851931944505090119) -->
- <skip />
- <!-- no translation found for summary_menu_show_pending (658361192495996) -->
- <skip />
- <!-- no translation found for summary_menu_show_finished (8544099132633066086) -->
- <skip />
- <!-- no translation found for menu_view_online (6546633605818509942) -->
- <skip />
- <!-- no translation found for menu_show_pending_items (8798191388238604213) -->
- <skip />
- <!-- no translation found for menu_hide_pending_items (9216079748638469160) -->
- <skip />
- <!-- no translation found for menu_show_completed_items (4380487776635859783) -->
- <skip />
- <!-- no translation found for menu_hide_completed_items (6126007571523662799) -->
- <skip />
- <!-- no translation found for menu_settings (5088116127086866634) -->
- <skip />
- <!-- no translation found for format_date_uploaded (803752037646090928) -->
- <skip />
- <!-- no translation found for format_progress_percent (4347398038122210157) -->
- <skip />
- <!-- no translation found for account (5199161365824352613) -->
- <skip />
- <!-- no translation found for upload (2615541458361216022) -->
- <skip />
- <!-- no translation found for ok (2516349681897895312) -->
- <skip />
- <!-- no translation found for cancel (1207103189404543868) -->
- <skip />
- <!-- no translation found for uploading_to (3986362895940069510) -->
- <skip />
- <!-- no translation found for uploading_for (1735961974624867111) -->
- <skip />
- <!-- no translation found for destination_format (7472552212462849956) -->
- <skip />
- <!-- no translation found for toast_intent_error (6164928822619692280) -->
- <skip />
- <!-- no translation found for toast_file_error (1315722681020841350) -->
- <skip />
- <!-- no translation found for account_error (1904775271866104941) -->
- <skip />
- <!-- no translation found for toast_failed_auth (2196450105656960566) -->
- <skip />
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <!-- no translation found for upload_state_waiting_retry (471790705731784779) -->
- <skip />
- <!-- no translation found for upload_state_waiting_wifi (234662717256366625) -->
- <skip />
- <!-- no translation found for upload_state_uploading (82854465974176047) -->
- <skip />
- <!-- no translation found for upload_state_failed (3799932718800848294) -->
- <skip />
- <!-- no translation found for upload_state_completed (5638163990418071018) -->
- <skip />
- <!-- no translation found for pause_state_running (711411177620353982) -->
- <skip />
- <!-- no translation found for pause_state_manually_paused (4837627990158796573) -->
- <skip />
- <!-- no translation found for pause_state_low_battery (3154677586511229063) -->
- <skip />
- <!-- no translation found for pause_state_need_charger (5014741655713255815) -->
- <skip />
- <!-- no translation found for pause_state_need_connectivity (338696137467815955) -->
- <skip />
- <!-- no translation found for pause_state_need_photos_quota (4026149712680343993) -->
- <skip />
- <!-- no translation found for pause_state_need_wifi (231858819136516913) -->
- <skip />
- <!-- no translation found for pause_state_roaming (1811348200068311099) -->
- <skip />
- <!-- no translation found for pause_state_retrying (3734440128828177639) -->
- <skip />
- <!-- no translation found for retry_in_1min (2242454935194420914) -->
- <skip />
- <!-- no translation found for retry_in_2min (5845688527405283031) -->
- <skip />
- <!-- no translation found for retry_in_5min (3153220715959570358) -->
- <skip />
- <!-- no translation found for retry_no_data (630347885498641534) -->
- <skip />
- <!-- no translation found for account_out_of_quota (1849612079678906607) -->
- <skip />
- <!-- no translation found for completed_no_file (6719715000947601844) -->
- <skip />
- <!-- no translation found for failed_bad_response (8357723053952213242) -->
- <skip />
- <!-- no translation found for failed_network_error (2531660472217573602) -->
- <skip />
- <!-- no translation found for failed_server_auth (2428208784689362254) -->
- <skip />
- <!-- no translation found for manager_list_switcher_pending_format (3517166351274747172) -->
- <skip />
- <!-- no translation found for manager_list_switcher_completed_format (4700366545949687846) -->
- <skip />
- <!-- no translation found for manager_pause (7046645023617816964) -->
- <skip />
- <!-- no translation found for manager_resume (1608630525599824933) -->
- <skip />
- <!-- no translation found for manager_upload_now (2284408578936376342) -->
- <skip />
- <!-- no translation found for manager_upload_later (5453932124711705632) -->
- <skip />
- <!-- no translation found for manager_do_not_upload (1934417351195364210) -->
- <skip />
- <!-- no translation found for manager_view_media (3714544539986850549) -->
- <skip />
- <!-- no translation found for manager_retry (939534318469518843) -->
- <skip />
- <!-- no translation found for manager_toast_canceled (2331820022556147571) -->
- <skip />
- <!-- no translation found for manager_toast_not_canceled (4274246237708259185) -->
- <skip />
- <!-- no translation found for manager_sync_all (5207146576940014345) -->
- <skip />
- <!-- no translation found for manager_activity_last_sync_format (3521722786363963155) -->
- <skip />
- <!-- no translation found for finished_empty (689924777356099393) -->
- <skip />
- <!-- no translation found for notify_uploads (8593982942665493037) -->
- <skip />
- <!-- no translation found for notify_resolved (8111194870485485674) -->
- <skip />
- <!-- no translation found for notify_paused (3999817913227671338) -->
- <skip />
- <!-- no translation found for notify_activation_reminder (1639234651193843030) -->
- <skip />
- <!-- no translation found for dialog_first_wifi (4318047428346248089) -->
- <skip />
- <!-- no translation found for dialog_sync_all_scanning (3175935645776839524) -->
- <skip />
- <!-- no translation found for dialog_sync_all_preparing (1666557491871126684) -->
- <skip />
- <!-- no translation found for dialog_sync_all_found_none (4066988191364416995) -->
- <skip />
- <!-- no translation found for dialog_sync_all_server_error (2177063494820815086) -->
- <skip />
- <!-- no translation found for dialog_sync_all_canceled (2595386304244274687) -->
- <skip />
- <!-- no translation found for dialog_sync_all_error_title (6227689508729774372) -->
- <skip />
- <!-- no translation found for manager_view_completed (5119780300858727185) -->
- <skip />
- <!-- no translation found for manager_view_pending (4403346072556950609) -->
- <skip />
- <!-- no translation found for preference_category_title_general (330919434495694575) -->
- <skip />
- <!-- no translation found for preference_title_pause_all_uploads (4188909974244266321) -->
- <skip />
- <!-- no translation found for preference_title_need_power (9165152026296632685) -->
- <skip />
- <!-- no translation found for preference_summary_need_power (1829578224249216151) -->
- <skip />
- <!-- no translation found for preference_title_need_wifi (2398468701949227352) -->
- <skip />
- <!-- no translation found for preference_summary_need_wifi (4627730244549568487) -->
- <skip />
- <!-- no translation found for preference_category_title_photos (8558221017057440259) -->
- <skip />
- <!-- no translation found for preference_title_photos_account (1235191190019405102) -->
- <skip />
- <!-- no translation found for preference_title_photos_upload_connectivity (8026800699913042033) -->
- <skip />
- <!-- no translation found for preference_title_photo_size (2291608017215972660) -->
- <skip />
- <!-- no translation found for preference_category_title_videos (8962400910793075570) -->
- <skip />
- <!-- no translation found for preference_title_videos_account (6675545508568161301) -->
- <skip />
- <!-- no translation found for preference_title_videos_account_summary (2925385281151195648) -->
- <skip />
- <!-- no translation found for preference_title_videos_upload_connectivity (4029897303763182477) -->
- <skip />
- <!-- no translation found for preference_title_videos_upload_connectivity_summary (2228943790654186152) -->
- <skip />
- <!-- no translation found for preference_mobile_data_usage_for_photos_only (8047534381344601018) -->
- <skip />
- <!-- no translation found for preference_mobile_data_usage_for_all_media (4228623171763750182) -->
- <skip />
- <!-- no translation found for preference_mobile_data_usage_never (4887062654163669480) -->
- <skip />
- <!-- no translation found for preference_category_title_about (3001183168471659844) -->
- <skip />
- <!-- no translation found for preference_title_camera_sync_version (1590760570503808392) -->
- <skip />
- <!-- no translation found for photos_upload_dimension_1600 (2261848079760937674) -->
- <skip />
- <!-- no translation found for photos_upload_dimension_original (6807552546029109517) -->
- <skip />
- <!-- no translation found for pause_state_need_media (3849758767808306320) -->
- <skip />
- <!-- no translation found for summary_subtitle_paused_need_media (8674787576306211689) -->
- <skip />
- <!-- no translation found for preference_plus_title (8505499389432915393) -->
- <skip />
- <!-- no translation found for preference_plus_enable_cs (8946492352805623630) -->
- <skip />
- <!-- no translation found for preference_plus_enable_cs_summary (8412139973136041010) -->
- <skip />
- <!-- no translation found for preference_plus_upload_status (7925576302519589779) -->
- <skip />
- <!-- no translation found for preference_plus_category_advanced (1159923217131890712) -->
- <skip />
- <!-- no translation found for preference_plus_mobile_data_connection (5368391437581896915) -->
- <skip />
- <!-- no translation found for preference_plus_sync_while_roaming (137428136220746649) -->
- <skip />
- <!-- no translation found for preference_plus_sync_while_roaming_summary (358436280727344717) -->
- <skip />
- <!-- no translation found for preference_plus_delay_sync_until_charging (2327042451671101467) -->
- <skip />
- <!-- no translation found for preference_plus_delay_sync_until_charging_summary (8613924819421248445) -->
- <skip />
- <!-- no translation found for preference_plus_sync_all (2563137874388611459) -->
- <skip />
- <!-- no translation found for preference_plus_sync_all_description (2789041515679642463) -->
- <skip />
- <!-- no translation found for summary_subtitle_disabled (8964378166312900703) -->
- <skip />
- <!-- no translation found for preference_summary_header_format (8850267704647137239) -->
- <skip />
- <!-- no translation found for preference_summary_uploading_percent (3266958005329832043) -->
- <skip />
- <!-- no translation found for preference_summary_uploading_format (6092575579212954671) -->
- <skip />
- <!-- no translation found for preference_summary_uploading_paused (2413016492323452882) -->
- <skip />
- <!-- no translation found for preference_plus_sync_all_prompt_title (7677605572146032195) -->
- <skip />
- <!-- no translation found for preference_plus_sync_all_prompt_text (2215794846784161524) -->
- <skip />
- <!-- no translation found for preference_plus_sync_all_prompt_yes (4844977073896196919) -->
- <skip />
- <!-- no translation found for preference_plus_sync_all_prompt_no (4216190537695947368) -->
- <skip />
-</resources>
diff --git a/email2/res/values-ro/strings.xml b/email2/res/values-ro/strings.xml
deleted file mode 100644
index 1184495f4..000000000
--- a/email2/res/values-ro/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Citiţi ataşamentele e-mailurilor"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permite aplicaţiei citirea ataşamentelor de e-mail."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Accesaţi datele furnizorului de e-mail"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permite aplicaţiei să acceseze baza de date a adresei de e-mail, incluzând mesajele primite, mesajele trimise, numele de utilizator şi parolele."</string>
- <string name="app_name" msgid="5815426892327290362">"E-mail"</string>
- <string name="compose_title" msgid="427986915662706899">"Scrieţi"</string>
- <string name="debug_title" msgid="5175710493691536719">"Remediaţi erorile"</string>
- <string name="next_action" msgid="3931301986364184415">"Înainte"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Anulaţi"</string>
- <string name="previous_action" msgid="5181616311579820981">"Înapoi"</string>
- <string name="send_action" msgid="1729766205562446418">"Trimiteţi"</string>
- <string name="reply_action" msgid="4262472229221507619">"Răspundeţi"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Răspundeţi tuturor"</string>
- <string name="delete_action" msgid="8421026208288857155">"Ştergeţi"</string>
- <string name="forward_action" msgid="669174181042344116">"Redirecţionaţi"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Marcaţi cu stea"</string>
- <string name="done_action" msgid="7497990549515580249">"Terminat"</string>
- <string name="create_action" msgid="3062715563215392251">"Creaţi unul nou"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Ştergeţi"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nu există răspunsuri rapide."</string>
- <string name="discard_action" msgid="6532206074859505968">"Renunţaţi"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Salvaţi m. nef."</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Introd. un răspuns rapid"</string>
- <string name="read_action" msgid="4701484794504781686">"Marcaţi ca citit"</string>
- <string name="unread_action" msgid="6280399049357552826">"Marcaţi drept necitit"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Marcaţi cu stea"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Eliminaţi steaua"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Actualizaţi"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Adăugaţi un cont"</string>
- <string name="compose_action" msgid="4045702519637388045">"Scrieţi"</string>
- <string name="search_action" msgid="6325101454876682308">"Căutaţi"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Setările contului"</string>
- <string name="settings_action" msgid="6334807007967459412">"Setări"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Opţiuni de sincronizare"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Marcaţi drept necitit"</string>
- <string name="move_action" msgid="3059189775933985898">"Mutaţi"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Adăugaţi Cc/Bcc"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Ataşaţi un fişier"</string>
- <string name="close_action" msgid="533058985745238100">"Închideţi"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Trimiteţi toate mesajele"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Alegeţi fişierul de ataşat"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Mutaţi în"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Se încarcă mesajele..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Problemă de conexiune."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Textul mesajului nu s-a putut încărca. Probabil mesajul este prea mare pentru a fi afişat."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Mutaţi mesajul"</item>
- <item quantity="other" msgid="371256717624461324">"Mutaţi mesajele"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Mutarea nu este acceptată pentru conturile de tip POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Nu se poate muta, deoarece selecţia conţine mai multe conturi."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Mesajele din Mesaje nefinalizate, Mesaje de trimis şi Mesaje trimise nu pot fi mutate."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> necitit(e) (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> necitit(e) (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> necitit(e) (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"în <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> (de) conturi"</item>
- <item quantity="other" msgid="2723797835410343458">"în <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> (de) conturi"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"către <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> (de) mesaje noi"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Toate conturile"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> cont"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> conturi"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Mesaje primite"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Mesaje de trimis"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Mesaje nefinalizate"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Coş de gunoi"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Trimis"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Mesaje nedorite"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Necitite"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Mesaje primite (necitite)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Mesaje primite (toate)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Afişare combinată (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> cont"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> (de) conturi"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Versiunea: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Mesaje primite"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Cu stea"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Mesaje nefinalizate"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Mesaje de trimis"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Afişare combinată"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Afişaţi toate dosarele"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Conturi"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Dosare recente (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Toate dosarele"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Dosare recente"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Subiect"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Fără subiect"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Încărcaţi mai multe mesaje"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> selectate"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> selectate"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Niciun mesaj"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Pentru"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Subiect"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"De la:"</string>
- <string name="to" msgid="4392614766835725698">"Către"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Bcc"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Subiect"</string>
- <string name="body_hint" msgid="4279864165439577668">"Scrieţi un e-mail"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Mesajul original --------"\n"Subiect: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"De la: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Către: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> a scris:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Includeţi textul citat"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Includeţi textul"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Adăugaţi cel puţin un destinatar."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Unele adrese de e-mail sunt nevalide."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Fişierul este prea mare pentru a fi ataşat."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Introduceţi un răspuns rapid"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> şi încă <xliff:g id="NUMBER">%2$d</xliff:g>"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Către:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Data:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"De la:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Subiect:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Afişaţi"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Instalaţi"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Redaţi"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Încărcaţi"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Informaţii"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Salvaţi"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Salvat"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Opriţi"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Ataşament salvat ca <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Ataşamentul nu s-a salvat."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Unul sau mai multe ataşamente din mesajul dvs. redirecţionat vor fi descărcate înainte de a fi trimise."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Mesaj"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Invitaţi"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Ataşament <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> ataşamente"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Afişaţi fotografiile"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Afişaţi întotdeauna"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Afişaţi întotdeauna imagini de la acest expeditor"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Imaginile de la acest expeditor vor fi afişate în mod automat."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Afişaţi în Calendar"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Invitaţie la Calendar"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Participaţi?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Da"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Poate"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Nu"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Aţi acceptat această invitaţie."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Aţi răspuns cu „poate” acestei invitaţii"</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Aţi refuzat această invitaţie."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Afişaţi detalii"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Detalii mesaj"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Informaţii ataşament"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Este necesară o conexiune Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Setări Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Setări aplicaţii"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Nu se poate deschide ataşamentul."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Nu puteţi salva sau deschide acest fişier, deoarece acest tip de ataşament ar putea conţine programe rău intenţionate."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Acest ataşament nu poate fi salvat sau deschis din cauza politicilor de securitate ale acestui cont."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Acest ataşament este prea mare pentru a fi descărcat prin reţeaua mobilă. Îl puteţi descărca cu proxima ocazie când vă conectaţi la o reţea Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Nu există nicio aplicaţie instalată care să poată deschide acest ataşament. Încercaţi să descărcaţi o aplicaţie corespunzătoare din Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Acest ataşament este o aplicaţie. Înainte de a o putea instala, trebuie să bifaţi Surse necunoscute din Setări &gt; Aplicaţii."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Aplicaţiile nu pot fi instalate direct din e-mail. Salvaţi mai întâi această aplicaţie şi instalaţi-o folosind aplicaţia Descărcări."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Ataşamentul nu s-a putut descărca."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"A apărut o eroare la decodificarea mesajului."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Vizualizaţi <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Ştergeţi acest mesaj?"</item>
- <item quantity="other" msgid="4437637377522896262">"Ştergeţi aceste mesaje?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Mesaj şters."</item>
- <item quantity="other" msgid="6574961322865652255">"Mesaje şterse."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Mesaj refuzat."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Mesaj salvat ca mesaj nefinalizat."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Ataşamentul nu se poate afişa."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Ataşamentul „<xliff:g id="FILENAME">%s</xliff:g>” nu a putut fi încărcat."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Se deschide mesajul..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> mesaj mutat în <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> (de) mesaje mutate în <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Nu se pot redirecţiona unul sau mai multe ataşamente."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Ataşamentul nu a fost trimis"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Conectare eşuată pentru <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Nu s-a putut conecta"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> O"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> O"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KO"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KO"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MO"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MO"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GO"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GO"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Mai noi"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Mai vechi"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Configurare cont"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Cont de e-mail"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Puteţi configura contul dvs. în doar câţiva paşi."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Adresă de e-mail"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Parolă"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Trimiteţi e-mailuri de pe acest cont în mod prestabilit"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configurare manuală"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Introduceţi o adresă de e-mail şi o parolă valide."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Cont duplicat"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Utilizaţi deja acest nume de utilizator pentru contul „<xliff:g id="DUPLICATE">%s</xliff:g>”."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Această parolă începe sau se termină cu unul sau mai multe spaţii. Numeroase servere nu acceptă parole cu spaţii."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Se preiau informaţiile despre cont..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Se verifică setările pentru serverul mesajelor de intrare..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Se verifică setările serverului de mesaje de ieşire..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Configurare cont"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Contul este configurat, iar e-mailul funcţionează corect!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Daţi un nume acestui cont (opţional)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Numele dvs. (afişat în mesajele de trimitere)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Acest câmp nu poate rămâne necompletat."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Configurare cont"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Tipul contului"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Ce tip de cont este acesta?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Configurare cont"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Setări pentru serverul de mesaje de intrare"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nume de utilizator"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Parolă"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipul de securitate"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Niciunul"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Acceptaţi toate certificatele)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (acceptaţi toate certificatele)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Ştergeţi mesajul de e-mail de pe server"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Niciodată"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Când şterg un mesaj din Mesaje primite"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Prefixul de cale pentru accesul IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Opţional"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Configurare cont"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Setări pentru serverul de mesaje de ieşire"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Server SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipul de securitate"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Necesită conectare"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nume de utilizator"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Parolă"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Configurare cont"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Setări server"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Server"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domeniu\\Nume de utilizator"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Utilizaţi o conexiune securizată (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Acceptaţi toate certificatele SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certificat client"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Selectaţi"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Utilizaţi certificatul de client"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Eliminaţi"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Niciunul"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID dispozitiv mobil"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Setări cont"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Opţiunile contului"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Frecvenţa verificării mesajelor primite"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Niciodată"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automat (Push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"La fiecare 5 minute"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"La fiecare 10 minute"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"La fiecare 15 minute"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"La fiecare 30 de minute"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"La fiecare oră"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Trimiteţi e-mailuri de pe acest cont în mod prestabilit"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Doresc să fiu notificat(ă) la primirea de e-mailuri"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Doresc sincronizarea agendei acestui cont"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Doresc sincronizarea calendarului acestui cont"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Doresc sincronizarea mesajelor de e-mail din acest cont"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Doresc să se descarce automat ataşamentele când sunt conectat(ă) la Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nu s-a putut finaliza"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Zile pentru sincronizare"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automat"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"O zi"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Trei zile"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"O săptămână"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Două săptămâni"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"O lună"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Toate"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Setări prestabilite cont"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Numele de utilizator sau parola sunt incorecte."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Numele de utilizator sau parola sunt incorecte."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nu se poate conecta în siguranţă la server."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nu se poate conecta în siguranţă la server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Este necesar un certificat de client. Doriţi să vă conectaţi la server cu un certificat de client?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certificat nevalid sau inaccesibil."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Serverul a răspuns cu o eroare. Verificaţi numele de utilizator şi parola şi încercaţi din nou."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nu se poate conecta la server."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Nu se poate conecta la server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS solicitat, dar neacceptat de către server."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Metodele de autentificare nu sunt acceptate de server."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Nu s-a putut deschide conexiunea la server din cauza unei erori de securitate."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Nu s-a putut deschide conexiunea la server."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Aţi introdus o adresă de server incorectă sau serverul necesită o versiune de protocol pe care aplicaţia E-mail nu o acceptă."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Nu aveţi permisiunea să efectuaţi sincronizarea cu acest server. Pentru mai multe informaţii, contactaţi administratorul serverului."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Administrarea securităţii de la distanţă"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Serverul <xliff:g id="SERVER">%s</xliff:g> vă solicită permisiunea de a controla de la distanţă unele funcţii de securitate ale dispozitivului Android. Doriţi să finalizaţi configurarea acestui cont?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Pentru acest server sunt necesare funcţii de securitate pe care dispozitivul dvs. Android nu le acceptă, inclusiv: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Nu puteţi schimba numele de utilizator al unui cont. Pentru a adăuga un cont cu alt nume de utilizator, atingeţi Adăugaţi un cont."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"AVERTISMENT: dacă dezactivaţi autoritatea aplicaţiei E-mail de administrare a dispozitivului dvs. se şterg toate conturile de e-mail care au nevoie de aceasta, împreună cu e-mailurile, agenda, evenimentele din calendar şi alte date pe care aceste conturi le conţin."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Actualizare de securitate"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> vă solicită actualizarea setărilor dvs. de securitate."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Contul „<xliff:g id="ACCOUNT">%s</xliff:g>” nu poate fi sincronizat din cauza cerinţelor de securitate."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Contul „<xliff:g id="ACCOUNT">%s</xliff:g>” necesită actualizarea setărilor de securitate."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Contul „<xliff:g id="ACCOUNT">%s</xliff:g>” şi-a schimbat setările de securitate. Nu este necesară nicio acţiune din partea utilizatorului."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Actualizare de securitate obligatorie"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Pol. securitate s-au schimbat"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Politici securitate nerespect."</string>
- <string name="account_security_title" msgid="3511543138560418587">"Securitatea dispozitivului"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Serverul <xliff:g id="SERVER">%s</xliff:g> vă solicită permisiunea de a controla de la distanţă unele caracteristici de securitate ale dispozitivului dvs. Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Modificaţi detaliile"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"„<xliff:g id="ACCOUNT">%s</xliff:g>” vă solicită să modificaţi codul PIN sau parola de blocare a ecranului."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Parola blocare ecran expiră"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Codul PIN sau parola de blocare a ecranului a expirat."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Parolă bloc. ecran. expirată"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Parola de blocare ecran expiră în curând"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Este necesar să modificaţi curând codul PIN sau parola ecranului de blocare; în caz contrar datele pentru <xliff:g id="ACCOUNT">%s</xliff:g> vor fi şterse. Modificaţi acum?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Parola de blocare ecran expirată"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Datele pentru <xliff:g id="ACCOUNT">%s</xliff:g> sunt şterse de pe dispozitiv, dar le puteţi restabili modificând codul PIN sau parola de blocare a ecranului. Modificaţi acum?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Renunţaţi la modificările nesalvate?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Nu s-a putut conecta"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Numele de utilizator sau parola pentru <xliff:g id="ACCOUNT">%s</xliff:g> sunt incorecte. Doriţi să le actualizaţi acum?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Cont prestabilit"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Trimiteţi e-mailuri de pe acest cont în mod prestabilit"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Descărcaţi ataşamentele"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Descărcaţi în mod automat prin Wi-Fi ataşam. mesaj. recente"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Notificările de e-mail"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Frecvenţa sincronizării, notificări etc."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Trimiteţi notificare la primire e-mail"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frecvenţa verificării mesajelor primite"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Setări pentru mesajele primite"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nume utilizator, parolă şi alte setări pt. serverul de primire"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Setări pentru mesajele de trimitere"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nume utilizator, parolă şi alte setări pt. server de trimitere"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Politicile puse în aplicare"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Niciunul"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Politici neacceptate"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Niciunul"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Încercaţi sincronizarea"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Atingeţi aici pentru a sincroniza acest cont"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Numele contului"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Numele dvs."</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Semnătura"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Răspunsuri rapide"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Editaţi textul introdus frecvent când scrieţi e-mailuri"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Adăugaţi text la mesajele trimise"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Setări pentru notificări"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Utilizarea datelor"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Politici de securitate"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Editaţi răspunsul rapid"</string>
- <string name="save_action" msgid="1988862706623227093">"Salvaţi"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronizaţi persoanele din agendă"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincron. agenda pt. acest cont"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronizaţi calendarul"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sincron. evenim. calendar pt. cont"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincroniz. e-mailul"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincron. e-mail pt. acest cont"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrare"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibrare şi la sosirea mesajelor de e-mail"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Întotdeauna"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Numai când profilul este Silenţios"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Niciodată"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibrare"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Alegeţi un ton de sonerie"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Setări server"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Eliminaţi contul"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Contul „<xliff:g id="ACCOUNT">%s</xliff:g>” va fi eliminat din e-mail."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Eliminaţi contul"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Eliminaţi contul"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Opţiuni de sincronizare"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Opţiuni de sincronizare (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Setări de sincronizare"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Verificaţi frecvenţa"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Zile pentru sincronizare"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"E-mail"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Alegeţi un cont"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Selectaţi un dosar"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Contul nu a fost găsit şi este posibil să fi fost eliminat."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Dosarul nu a fost găsit şi este posibil să fi fost eliminat."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Numai unele conturi de tip „Plus” includ accesul de tip POP, permiţând conectarea acestui program. Dacă nu reuşiţi să vă conectaţi cu adresa de e-mail şi parola corecte, este posibil să nu aveţi un cont de tip „Plus” plătit. Lansaţi browserul web pentru a obţine accesul la aceste conturi de e-mail."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Înainte de configurarea acestui cont de e-mail, accesaţi site-ul web T-Online şi creaţi o parolă pentru accesul la serviciile de e-mail POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Corporaţie"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Contul nu a putut fi creat. Încercaţi din nou."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-mail"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Activează politicile de securitate specificate pentru server"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Se caută <xliff:g id="DOMAIN">%s</xliff:g>..."</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> rezultat de la <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> (de) rezultate din <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Setări"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Setări generale"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Aplicaţie"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Înaintare automată"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Alegeţi ce ecran se afişează după ştergerea unui mesaj"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ascundeţi casetele de validare"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"În listele de mesaje, atingeţi şi ţineţi apăsat pentru a selecta"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirmaţi înainte de a şterge"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mesaje"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirmaţi înainte de a trimite"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mesaje"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Înaintaţi la"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mesaje mai noi"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mesaj mai vechi"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Lista de mesaje"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Dimensiune text mesaj"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Text foarte mic"</item>
- <item msgid="4415205108584620118">"Text mic"</item>
- <item msgid="4550219696381691112">"Text cu dimensiuni normale"</item>
- <item msgid="6227813549949219991">"Text mare"</item>
- <item msgid="1197917420815786571">"Text foarte mare"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Dimensiune text mesaj"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Minusculă"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Mică"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normală"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Mare"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Foarte mare"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Răspundeţi tuturor"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Setaţi „Răspundeţi tuturor” ca opţ. prestabilită de răspuns la mesaje"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Solicitaţi permisiunea de a afişa imagini"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Imaginile din mesaje nu vor fi afişate în mod automat"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Opţiunea „Afişaţi fotografiile” este debifată."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> din <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Se aşteaptă sincronizarea"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"E-mailul dvs. va apărea în curând."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"At. pict. pt. modif."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Toate e-mailurile"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Necitite"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Cu stea"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Se încarcă..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Atingeţi pentru a configura."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Nu aţi configurat niciun cont de e-mail."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Căutaţi în e-mail"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Căutaţi în <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Rezultatele căutării pentru „<xliff:g id="ID_1">%1$s</xliff:g>”"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Se aşteaptă rezultatele"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Pentru unele servere poate fi necesar un interval mare de timp."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Dosare"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Nu permiteţi utilizarea camerei foto"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Solicitaţi parola dispozitivului"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Limitaţi reutilizarea parolelor recente"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Solicitaţi expirarea parolelor"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Disp. inactiv necesar pt. blocare ecran"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Limitare număr evenimente de calendar sincronizate"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Limitare număr de e-mailuri sincronizate"</string>
- <string name="quick_1" msgid="3426057697353380951">"Vă mulţumim!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Sună bine!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Voi citi mai târziu acest mesaj şi vă voi contacta."</string>
- <string name="quick_4" msgid="3988974084396883051">"Să stabilim o întâlnire pentru a discuta această acţiune."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Sincronizarea în fundal pentru acest cont este dezactivată în roaming."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Se trimite răspunsul..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Niciun mesaj."</string>
-</resources>
diff --git a/email2/res/values-ro/uploader.xml b/email2/res/values-ro/uploader.xml
deleted file mode 100644
index a3af219b1..000000000
--- a/email2/res/values-ro/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Încărcare instant"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Albumul de încărcare instant"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Se încarcă"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Finalizate"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Întreruptă"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d (de) fotografii • %3$d (de) videoclipuri"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d (de) fotografii • %2$d (de) videoclipuri"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"baterie descărcată"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"s-a depăşit cota de fotografii"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"se aşteaptă reţeaua Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"amânată până la încărcare"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"se aşteaptă realizarea conexiunii"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"se încearcă din nou în %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Afişaţi încărcările în aşteptare"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Afişaţi încărcările finalizate"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Afişaţi online"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Afişaţi încărcările în aşteptare"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Ascundeţi încărcările în aşteptare"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Afişaţi detaliile"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Ascundeţi detaliile"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Setări"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Încărcat pe %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Cont"</string>
- <string name="upload" msgid="2615541458361216022">"Încărcaţi"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Anulaţi"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Se încarcă la "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" pentru "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s „%2$s”"</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Iniţializarea încărcării nu a reuşit."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Fişierul nu este disponibil."</string>
- <string name="account_error" msgid="1904775271866104941">"Nu s-au putut prelua informaţiile despre cont."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"A apărut o problemă la conectarea la cont."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Se aşteaptă reîncercarea"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Se aşteaptă reţeaua Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Se încarcă"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Eşuat"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Terminat"</string>
- <string name="pause_state_running" msgid="711411177620353982">"se încarcă"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"întreruptă manual"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"întreruptă – baterie descărcată"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"întreruptă – amânată până la încărcare"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"întreruptă – se aşteaptă realizarea conexiunii"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"întreruptă - s-a depăşit cota pentru PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"întreruptă – se aşteaptă conectarea Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"întreruptă – roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"se aşteaptă reîncercarea"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minut"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minute"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minute"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Nu există o conexiune de date"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Contul dvs. a depăşit spaţiul de stocare pe disc"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Fişierul nu a fost găsit"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Eroare de serviciu"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Eroare de reţea"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Autentificarea nu a reuşit"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Încărcări în aşteptare [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Încărcări finalizate [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Întrerupeţi încărcările"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Reluaţi încărcările"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Încărcaţi acum"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Încărcaţi mai târziu"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Nu încărcaţi"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Afişaţi"</string>
- <string name="manager_retry" msgid="939534318469518843">"Reîncercaţi"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Încărcarea a fost anulată"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Încărcarea s-a finalizat deja"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sincronizaţi-le pe toate"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Ultima sincronizare:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Lista cu elemente finalizate este goală."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Încărcare instant"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Încărcări finalizate"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Încărcări întrerupte"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Încărcarea instant nu a fost activată încă"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Fişierele mari vor fi încărcate numai printr-o conexiune Wi-Fi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Se scanează pentru fişiere..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Se pregătesc de încărcare <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> (de) fotografii şi <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> (de) videoclipuri..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Nu este necesară încărcarea unor fotografii/videoclipuri suplimentare."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"A apărut o problemă la comunicarea cu serverul. Încercaţi din nou mai târziu."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Sincronizarea pentru toate este anulată"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sincronizaţi-le pe toate"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Afişaţi încărcările finalizate"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Afişaţi încărcările în aşteptare"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Generalităţi"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Întrerupeţi toate încărcările"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Reîncărcaţi bateria"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Încărcaţi numai când se încarcă bateria telefonului."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Încărcaţi numai când este disponibilă conexiunea Wi-Fi."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotografii"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Cont"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Condiţii de încărcare"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Dimensiunea fotografiei"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videoclipuri"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Cont"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Contul pentru fotografii va fi utilizat pentru încărcările video."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Condiţii de încărcare"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Acum sunt utilizate setările de conectivitate pentru fotografii."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Încărcaţi numai fotografii prin intermediul reţelelor mobile"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotografii şi videoclipuri prin intermediul reţelelor mobile"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Fotografii şi video numai prin Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Despre"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Vers. încăr. instant"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Recomandat: 1600 pixeli (pentru distribuire, printări şi screensavere)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Dimensiune iniţială (viteză de încărcare minimă)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"întreruptă – card SD indisponibil"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Card SD indisponibil"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Setări încăr. inst."</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Încărcare instant"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Încărcaţi în mod automat fotografiile şi videoclipurile noi într-un album web privat"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Starea încărcării"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Avansate"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Încărcări mobile"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Încărcări în roaming"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Încărcaţi fotografii şi videoclipuri la utilizarea în roaming în reţeaua de date"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Încărcări pe baterie"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Încărcaţi fotografii şi videoclipuri numai în timpul încărcării bateriei"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Încărcaţi fotografiile existente"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Încărcaţi acum de pe telefon toate fotografiile şi videoclipurile existente"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Dezactivată"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Se încarcă (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d din %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Întreruptă: atingeţi pentru a relua încărcarea"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Încărcaţi fotografiile existente"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Încărcarea fotografiilor şi a videoclipurilor care nu au fost deja încărcate de pe telefon într-un album web privat poate dura un timp, dar se efectuează în fundal. Sigur doriţi să continuaţi?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Da"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Nu"</string>
-</resources>
diff --git a/email2/res/values-ru/strings.xml b/email2/res/values-ru/strings.xml
deleted file mode 100644
index 8de2baee4..000000000
--- a/email2/res/values-ru/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Просмотр пересылаемых файлов"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Приложение получит доступ к прикрепленным файлам в сообщениях электронной почты."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Доступ к данным сервиса эл. почты"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Приложение получит доступ к базе данных электронной почты, которая содержит полученные и отправленные сообщения, имена пользователей и пароли."</string>
- <string name="app_name" msgid="5815426892327290362">"Email"</string>
- <string name="compose_title" msgid="427986915662706899">"Новое сообщение"</string>
- <string name="debug_title" msgid="5175710493691536719">"Выполнить отладку"</string>
- <string name="next_action" msgid="3931301986364184415">"Далее"</string>
- <string name="okay_action" msgid="8365197396795675617">"ОК"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Отмена"</string>
- <string name="previous_action" msgid="5181616311579820981">"Назад"</string>
- <string name="send_action" msgid="1729766205562446418">"Отправить"</string>
- <string name="reply_action" msgid="4262472229221507619">"Ответить"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Ответить всем"</string>
- <string name="delete_action" msgid="8421026208288857155">"Удалить"</string>
- <string name="forward_action" msgid="669174181042344116">"Переслать"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Пометить"</string>
- <string name="done_action" msgid="7497990549515580249">"Готово"</string>
- <string name="create_action" msgid="3062715563215392251">"Создать"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Удалить"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Нет шаблонов"</string>
- <string name="discard_action" msgid="6532206074859505968">"Отменить"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Сохранить черновик"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Вставить быстрый ответ"</string>
- <string name="read_action" msgid="4701484794504781686">"Отметить как прочитанное"</string>
- <string name="unread_action" msgid="6280399049357552826">"Отметить как непрочитанное"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Добавить пометку"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Снять пометку"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Обновление"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Добавить аккаунт"</string>
- <string name="compose_action" msgid="4045702519637388045">"Новое сообщение"</string>
- <string name="search_action" msgid="6325101454876682308">"Поиск"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Настройки аккаунта"</string>
- <string name="settings_action" msgid="6334807007967459412">"Настройки"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Параметры синхронизации"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Отметить как непрочитанное"</string>
- <string name="move_action" msgid="3059189775933985898">"Переместить"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"Добавить копию"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Копия/скрытая копия"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Прикрепить файл"</string>
- <string name="close_action" msgid="533058985745238100">"Закрыть"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Отправить все сообщ."</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Выбрать приложение"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Переместить в папку"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Загрузка сообщений..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Ошибка подключения."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Не удалось загрузить сообщение. Возможно, оно слишком большое."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Переместить сообщение"</item>
- <item quantity="other" msgid="371256717624461324">"Переместить сообщения"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Перемещение не поддерживается в аккаунтах POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Не удалось переместить сообщения, так как они находятся в разных аккаунтах."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Нельзя перемещать сообщения из папок \"Черновики\", \"Исходящие\" и \"Отправленные\"."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"Непрочитанных: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"Непрочитанных: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"Непрочитанных: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"в <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> аккаунтах"</item>
- <item quantity="other" msgid="2723797835410343458">"в <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> аккаунтах"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"Кому: <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"Новых сообщений: <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Все аккаунты"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"Число аккаунтов: <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="8548760449976444566">"Число аккаунтов: <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Входящие"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Исходящие"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Черновики"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Корзина"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Отправленные"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Спам"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Непрочитанные"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Входящие (непрочитанные)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Входящие (все)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Комбинированный вид (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"Аккаунтов: <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="4145163147488719025">"Аккаунтов: <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Версия: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Входящие"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Помеченные"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Черновики"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Исходящие"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Комбинированный режим просмотра"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Показать все почтовые ящики"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Аккаунты"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Последние папки (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Все папки"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Недавние папки"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Тема"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Без темы"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Загрузить еще сообщения"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"Выбрано: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="7901361399231876038">"Выбрано: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Нет сообщений"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Получатели"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Копия"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Скрытая копия"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Тема"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"От:"</string>
- <string name="to" msgid="4392614766835725698">"Кому"</string>
- <string name="cc" msgid="7017720927911078193">"Копия"</string>
- <string name="bcc" msgid="3098643138241111579">"Скр. копия"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Тема"</string>
- <string name="body_hint" msgid="4279864165439577668">"Текст сообщения"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Исходное сообщение --------"\n"Тема: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"От: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Кому: <xliff:g id="TO">%3$s</xliff:g>"\n"Копия: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"Пользователь <xliff:g id="SENDER">%s</xliff:g> писал:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Включить цитируемый текст"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Включить исходный текст в ответ"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Укажите получателя."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Некоторые адреса электронной почты являются недопустимыми."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Файл имеет слишком большой размер и не может быть приложен."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Вставка быстрого ответа"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> и ещё <xliff:g id="NUMBER">%2$d</xliff:g>"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"На:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Копия:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Скрытая копия:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Дата:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"От:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Тема:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Просмотр"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Установить"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Воспроизв."</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Загрузить"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Информация"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Сохранить"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Сохранено"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Стоп"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Вложение сохранено как <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Файл не сохранен."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Один или несколько прикрепленных файлов в пересылаемом сообщении будут загружены перед отправкой."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Сообщение"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Пригласить"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Прикреп. файлов: <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Прикреп. файлов: <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Показать картинки"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Всегда показывать"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Всегда показывать картинки с этого адреса"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Картинки, отправленные с этого адреса, будут всегда показываться."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Посмотреть в Календаре"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Календарь: приглашение"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Примете участие?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Да"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Может быть"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Нет"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Приглашение принято."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Вы ответили \"может быть\" на это приглашение."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Приглашение отклонено."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Показать сведения"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Детали"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"О прикрепленном файле"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Необходимо подключение Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Настройки Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Настройки приложения"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Не удается открыть прикрепленный файл."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Через файлы такого типа часто распространяют вредоносное ПО, поэтому мы не даем открывать и сохранять их."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Политика безопасности аккаунта не позволяет сохранять подобные файлы."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Слишком большой прикрепленный файл для загрузки через мобильную сеть. Вы можете загрузить его при следующем подключении к сети Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Неподдерживаемый формат. Чтобы открыть файл, установите подходящее приложение из Android Маркета."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Прикрепленный файл является приложением. Чтобы его можно было установить, в разделе \"Настройки &gt; Приложения\" выберите \"Неизвестные источники\"."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Приложения нельзя устанавливать непосредственно из электронной почты. Сохраните файл, перейдите в \"Загрузки\" и выполните установку."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Не удалось загрузить файл."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"При расшифровке сообщения произошла ошибка."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Просмотр файла <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Удалить сообщение?"</item>
- <item quantity="other" msgid="4437637377522896262">"Удалить сообщения?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Сообщение удалено."</item>
- <item quantity="other" msgid="6574961322865652255">"Сообщения удалены."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Черновик удален."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Черновик сообщения сохранен."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Невозможно отобразить прикрепленный файл."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Не удалось загрузить файл \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Сообщение открывается…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"Сообщение (<xliff:g id="NUM_MESSAGE">%1$d</xliff:g>) перемещено в папку <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"Сообщения (<xliff:g id="NUM_MESSAGE">%1$d</xliff:g>) перемещены в папку <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Сбой при пересылке прикрепленных файлов."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Не удалось переслать вложение"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Ошибка при входе в аккаунт <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Вход не выполнен"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> Б"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> Б"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> КБ"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> КБ"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> МБ"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> МБ"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> ГБ"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> ГБ"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"След."</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"След."</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Настройка аккаунта"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Ярлык Email"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Настроить свой аккаунт очень просто."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Адрес электронной почты"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Пароль"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"По умолчанию отправлять письма с этого адреса"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Вручную"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Введите действительный адрес электронной почты и пароль."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Копировать аккаунт"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Это имя уже используется в аккаунте \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Пароль начинается или заканчивается пробелом. Некоторые серверы не поддерживают пароли с пробелами."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Получение информации аккаунта..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Проверка настроек сервера входящих сообщений..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Проверка настроек сервера исходящих сообщений..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Настройка аккаунта"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Аккаунт добавлен!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Присвойте этому аккаунту название (по желанию)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Ваше имя (показывается в исходящих сообщениях)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Это поле должно быть заполнено."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Настройка аккаунта"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Тип аккаунта"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Выберите тип аккаунта"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Настройка аккаунта"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Настройки сервера входящих сообщений"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Имя пользователя"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Пароль"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Сервер"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Порт"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Тип безопасности"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Нет"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (принимать все сертификаты)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (принимать все сертификаты)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Удалять сообщения с сервера"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Никогда"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"При удалении из входящих"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Префикс пути IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"По желанию"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Настройка аккаунта"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Настройки сервера исходящих сообщений"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Сервер SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Порт"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Тип безопасности"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Выполнять вход в систему"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Имя пользователя"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Пароль"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Настройка аккаунта"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Настройки сервера"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Сервер"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Домен\\Имя пользователя"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Использовать защищенное соединение (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Принимать все сертификаты SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Сертификат клиента"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Выбрать"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Использовать сертификат клиента"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Удалить"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Не используется"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Идентификатор мобильного устройства"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Настройки аккаунта"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Параметры аккаунта"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Частота проверки папки \"Входящие\""</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Никогда"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Автоматически (принудительно)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Каждые 5 минут"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Каждые 10 минут"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Каждые 15 минут"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Каждые 30 минут"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Каждый час"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"По умолчанию отправлять письма с этого адреса"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Показывать уведомление при получении новых писем"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Синхронизировать контакты из этого аккаунта"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Синхронизировать календарь из этого аккаунта"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Синхронизировать электронную почту из этого аккаунта"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Автоматически загружать прикрепленные файлы при подключении к Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Настройка не закончена"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Период синхронизации"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Автоматически"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Один день"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Три дня"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Одна неделя"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Две недели"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Один месяц"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Все"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Параметры по умолчанию"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Неверное имя пользователя или пароль."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Неверное имя пользователя или пароль."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Не удалось установить защищенное подключение к серверу."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Не удалось установить защищенное подключение к серверу."\n"<xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Требуется сертификат клиента. Подключиться к серверу с таким сертификатом?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Сертификат недействителен или недоступен."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Ошибка сервера. Проверьте имя пользователя и пароль и повторите попытку."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Не удалось подключиться к серверу."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Не удалось подключиться к серверу."\n"<xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS не поддерживается сервером."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Методы аутентификации не поддерживаются сервером."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Не удалось установить подключение к серверу из-за ошибки безопасности."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Не удалось подключиться к серверу."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Введен неправильный адрес сервера или сервер запрашивает версию протокола, которая не поддерживается в Email."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"У вас нет разрешений на синхронизацию с этим сервером. За дополнительной информацией обратитесь к администратору сервера."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Удаленное управление безопасностью"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Серверу <xliff:g id="SERVER">%s</xliff:g> требуется разрешение на удаленное управление некоторыми функциями безопасности устройства Android. Завершить настройку этого аккаунта?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Ваше Android-устройство не поддерживает обязательные для сервера функции защиты: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Невозможно изменить имя пользователя. Если хотите использовать другое имя, нажмите \"Добавить аккаунт\" и создайте новый аккаунт."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"ВНИМАНИЕ! Отключение прав на администрирование вашего устройства для приложения Email приведет к удалению всех аккаунтов электронной почты, которые используют эти права. Кроме того, будут удалены все письма, контакты, календари и другие данные, связанные с этими аккаунтами."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Обновления безопасности"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Для аккаунта <xliff:g id="ACCOUNT">%s</xliff:g> требуется обновить настройки безопасности."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Настройки безопасности не позволяют синхронизировать аккаунт <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"В аккаунте <xliff:g id="ACCOUNT">%s</xliff:g> требуется обновить настройки безопасности."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"В аккаунте <xliff:g id="ACCOUNT">%s</xliff:g> обновлены настройки безопасности. Ничего делать не нужно."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Обновите систему безопасности"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Политики безопасности изменены"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Политики не выполнены"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Безопасность устройства"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Серверу <xliff:g id="SERVER">%s</xliff:g> требуется разрешение на удаленное управление некоторыми функциями безопасности устройства Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Изменить сведения"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"Для аккаунта \"<xliff:g id="ACCOUNT">%s</xliff:g>\" требуется изменить PIN-код или пароль блокировки экрана."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Истекает срок действия пароля"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Срок действия вашего PIN-кода или пароля блокировки экрана истек."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Пароль блок. экрана устарел"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Истекает срок действия пароля"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Скоро вам потребуется изменить PIN-код или пароль для блокировки экрана, иначе данные аккаунта <xliff:g id="ACCOUNT">%s</xliff:g> будут удалены. Изменить PIN-код или пароль сейчас?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Пароль блокировки экрана устарел"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Данные аккаунта <xliff:g id="ACCOUNT">%s</xliff:g> удаляются с устройства. Вы можете восстановить их, изменив свой PIN-код или пароль блокировки экрана. Сделать это сейчас?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Отменить несохраненные изменения?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Не удалось войти в аккаунт."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Неверное имя пользователя или пароль для доступа в аккаунт <xliff:g id="ACCOUNT">%s</xliff:g>. Изменить их?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Аккаунт по умолчанию"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Сделать аккаунтом электронной почты по умолчанию для отправки сообщений"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Загружать прикрепленные файлы"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Автоматически загружать файлы из новых сообщений через Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Уведомления электронной почты"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Частота синхронизации, уведомления и другие настройки"</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Показывать уведомление при получении новых писем"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Частота проверки папки \"Входящие\""</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Настройки входящих сообщений"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Имя пользователя, пароль и др. настройки сервера входящей почты"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Настройки исходящих сообщений"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Имя пользователя, пароль и др. настройки сервера исходящей почты"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Политики применены"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Нет"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Неподдерживаемые политики"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Нет"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Синхронизировать"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Нажмите, чтобы синхронизировать данные"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Название аккаунта"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Ваше имя"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Подпись"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Быстрые ответы"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Использовать шаблоны для стандартных ответов"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Добавлять текст к отправляемым сообщениям"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Настройки уведомлений"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Использование данных"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Политики безопасности"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Изменить быстрый ответ"</string>
- <string name="save_action" msgid="1988862706623227093">"Сохранить"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Синхронизировать контакты"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Синхронизировать контакты этого аккаунта"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Синхронизировать календарь"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Синхронизация мероприятий"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Синхр. почту"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Синхронизировать почту этого аккаунта"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Вибросигнал"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Вибросигнал при получении сообщения"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Всегда"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Только в режиме без звука"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Никогда"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Вибросигнал"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Выбрать рингтон"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Настройки сервера"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Удалить аккаунт"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Аккаунт \"<xliff:g id="ACCOUNT">%s</xliff:g>\" будет удален из Email."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Удалить аккаунт"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Удалить аккаунт"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Параметры синхронизации"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Параметры синхронизации (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Настройки синхронизации"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Частота проверки"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Период синхронизации"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Ярлык Email"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Выберите аккаунт"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Выберите папку"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Аккаунт не найден. Возможно, он удален."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Папка не найдена. Возможно, она удалена."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Доступ по протоколу POP, позволяющий этой программе подключаться, разрешен только в некоторых аккаунтах Plus. Если вам не удается войти с помощью своего адреса электронной почты и пароля, скорее всего, у вас бесплатный аккаунт (не Plus). Чтобы войти в такой аккаунт, используйте браузер."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Прежде чем настраивать аккаунт, перейдите на веб-сайт оператора связи и установите пароль для доступа к электронной почте по протоколу POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Корпоративный"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Не удалось создать аккаунт. Повторите попытку."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Электронная почта"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Включение серверных политик безопасности"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Поиск <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"Результаты с <xliff:g id="DOMAIN">%2$s</xliff:g> (<xliff:g id="RESULTS">%1$d</xliff:g>)"</item>
- <item quantity="other" msgid="7816121892960632123">"Кол-во результатов: <xliff:g id="RESULTS">%1$d</xliff:g> с <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Настройки"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Общие настройки"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Приложение"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Автопереход"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Выберите экран для отображения после удаления цепочки писем"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Скрыть флажки"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Чтобы выбрать сообщение в списке, нажмите и удерживайте его."</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Подтверждать удаление"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Сообщения"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Подтверждать отправку"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Сообщения"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Переходить к"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Предыдущему сообщению"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Следующему сообщению"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Списку сообщений"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Размер шрифта"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Мелкий"</item>
- <item msgid="4415205108584620118">"Небольшой"</item>
- <item msgid="4550219696381691112">"Обычный"</item>
- <item msgid="6227813549949219991">"Большой"</item>
- <item msgid="1197917420815786571">"Огромный"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Размер шрифта"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Мелкий"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Небольшой"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Обычный"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Крупный"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Огромный"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Ответить всем"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Всегда отвечать всем участникам переписки"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Запрашивать разрешение на показ изображений"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Автоматический показ изображений в сообщениях будет отключен"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Показ изображений отключен."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> из <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Ожидание синхронизации"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Ваши письма скоро загрузятся."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Нажмите, чтобы изменить."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Все входящие"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Непрочитанные"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Помеченные"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Загрузка..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Нажмите для настройки."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Вы еще не добавили аккаунт электронной почты."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Искать в электронной почте"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Искать в папке \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Результаты поиска для \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Ожидание результатов"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Ожидание ответа от сервера может занять много времени."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Папки"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Запрещать использовать камеру"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Запрашивать пароль для разблокировки"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Запрещать использовать прежние пароли"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Ограничивать время действия паролей"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Блокировать экран при простое"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Ограничить число синхр. событий календаря"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Ограничить число синхр. сообщений эл. почты"</string>
- <string name="quick_1" msgid="3426057697353380951">"Спасибо!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Отличная идея!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Я отвечу позже."</string>
- <string name="quick_4" msgid="3988974084396883051">"Это нужно обсудить при встрече."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Для этого аккаунта отключена фоновая синхронизация в роуминге."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Отправка ответа…"</string>
- <string name="no_conversations" msgid="5559527390337162819">"Писем нет."</string>
-</resources>
diff --git a/email2/res/values-ru/uploader.xml b/email2/res/values-ru/uploader.xml
deleted file mode 100644
index 247ac0180..000000000
--- a/email2/res/values-ru/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Загрузка с телефона"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Альбом для загрузки с телефона"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Загрузка"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Завершенные"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Приостановлено"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d фото • %3$d видео"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d фото • %2$d видео"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"низкий уровень заряда батареи"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"превышена квота на фотографии"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"роуминг"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"ожидание подключения Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"приостановлено до зарядки"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"ожидание подключения"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"повторная попытка через %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Показать незавершенные загрузки"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Показать завершенные загрузки"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Просмотреть в Интернете"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Показать незавершенные загрузки"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Скрыть незавершенные загрузки"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Показать подробности"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Скрыть подробности"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Настройки"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Загружено %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Аккаунт"</string>
- <string name="upload" msgid="2615541458361216022">"Загрузить"</string>
- <string name="ok" msgid="2516349681897895312">"ОК"</string>
- <string name="cancel" msgid="1207103189404543868">"Отмена"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Загрузка в "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" для пользователя "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Не удалось начать загрузку."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Файл недоступен."</string>
- <string name="account_error" msgid="1904775271866104941">"Не удалось получить данные аккаунта."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Не удалось войти в аккаунт."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Ожидание повторной попытки"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Ожидание подключения Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Загрузка"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Сбой"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Завершено"</string>
- <string name="pause_state_running" msgid="711411177620353982">"загрузка"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"приостановлено вручную"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"приостановлено – низкий уровень заряда батареи"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"приостановлено – до окончания зарядки"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"приостановлено – ожидание подключения"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"приостановлено – превышена квота для Веб-альбомов Picasa"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"приостановлено – ожидание подключения Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"приостановлено – роуминг"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"ожидание повторной попытки"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 минута"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 минуты"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 минут"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Подключение для передачи данных отсутствует"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Превышена дисковая квота для аккаунта"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Файл не найден"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Ошибка службы"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Ошибка сети"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Не удалось выполнить аутентификацию"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Незавершенные загрузки [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Завершенные загрузки (%d)"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Приостановить загрузки"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Продолжить загрузку"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Загрузить"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Загрузить позже"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Не загружать"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Просмотр"</string>
- <string name="manager_retry" msgid="939534318469518843">"Повторить попытку"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Загрузка отменена"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Загрузка уже завершена"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Синхронизировать все"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Последняя синхронизация: "\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Список завершенных загрузок пуст."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Загрузка с телефона"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Загрузки завершены"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Загрузки приостановлены"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Функция загрузки с телефона еще не активирована"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Большие файлы будут загружаться только через соединение Wi-Fi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Поиск файлов..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Подготовка <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> фото и <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> видео к загрузке..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Дополнительных фотографий или видеороликов не найдено."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Не удалось связаться с сервером. Повторите попытку позже."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Команда \"Синхронизировать все\" отменена"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Синхронизировать все"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Просмотреть завершенные"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Просмотреть незавершенные"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Общие"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Приостановить все загрузки"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Зарядка"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Загружать только во время зарядки телефона."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Загружать только при наличии соединения Wi-Fi."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Фото"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Аккаунт"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Условия загрузки"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Размер фото"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Видео"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Аккаунт"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Аккаунт для фотографий будет использоваться для загрузки видео."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Условия загрузки"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Настройки соединения для фотографий в данный момент заняты."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Только фото по мобильной сети"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Фото и видео по мобильной сети"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Фото и видео только по Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Сведения"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Загрузка с телефона"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Рекомендуется: 1600 пикселей (для публикации, распечатки и заставок)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Исходный размер файла (минимальная скорость загрузки)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"приостановлено – отсутствует SD-карта"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD-карта недоступна"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Настройки загрузки"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Загрузка с телефона"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Автоматически загружать фотографии и видео в личный веб-альбом"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Статус загрузки"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Дополнительно"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Загрузка с мобильного устройства"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Загрузки в роуминге"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Загружать фото и видео в роуминге по каналу передачи данных"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Загрузка при зарядке"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Загружать фотографии и видео только во время зарядки"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Загрузить имеющиеся фото"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Загрузить все имеющиеся на телефоне фотографии и видеоролики"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Отключено"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Загрузка (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d из %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Приостановлено: нажмите, чтобы продолжить загрузку"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Загрузить существующие фотографии"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Добавление фотографий и видеороликов, не загруженных из телефона в личный веб-альбом, может занять некоторое время. Этот процесс будет выполняться в фоновом режиме. Продолжить?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Да"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Нет"</string>
-</resources>
diff --git a/email2/res/values-sk/strings.xml b/email2/res/values-sk/strings.xml
deleted file mode 100644
index 5f1815066..000000000
--- a/email2/res/values-sk/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Čítať e-mailové prílohy"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Povoľuje aplikácii čítať prílohy vašich e-mailov."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Prístup k údajom poskytovateľa e-mailu"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Povoľuje aplikácii prístup do databázy e-mailu vrátane prijatých a odoslaných správ, používateľských mien a hesiel."</string>
- <string name="app_name" msgid="5815426892327290362">"Email"</string>
- <string name="compose_title" msgid="427986915662706899">"Napísať správu"</string>
- <string name="debug_title" msgid="5175710493691536719">"Ladiť"</string>
- <string name="next_action" msgid="3931301986364184415">"Ďalej"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Zrušiť"</string>
- <string name="previous_action" msgid="5181616311579820981">"Predchádzajúce"</string>
- <string name="send_action" msgid="1729766205562446418">"Odoslať"</string>
- <string name="reply_action" msgid="4262472229221507619">"Odpovedať"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Odpovedať všetkým"</string>
- <string name="delete_action" msgid="8421026208288857155">"Odstrániť"</string>
- <string name="forward_action" msgid="669174181042344116">"Poslať ďalej"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Označiť hviezdičkou"</string>
- <string name="done_action" msgid="7497990549515580249">"Hotovo"</string>
- <string name="create_action" msgid="3062715563215392251">"Vytvoriť novú"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Odstrániť"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Žiadne rýchle odpovede."</string>
- <string name="discard_action" msgid="6532206074859505968">"Zahodiť"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Uložiť koncept"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Vložiť rýchlu odpoveď"</string>
- <string name="read_action" msgid="4701484794504781686">"Označiť ako prečítané"</string>
- <string name="unread_action" msgid="6280399049357552826">"Označiť ako neprečítané"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Pridať hviezdičku"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Odstrániť hviezdičku"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Obnoviť"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Pridať účet"</string>
- <string name="compose_action" msgid="4045702519637388045">"Napísať správu"</string>
- <string name="search_action" msgid="6325101454876682308">"Hľadať"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Nastavenia účtu"</string>
- <string name="settings_action" msgid="6334807007967459412">"Nastavenia"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Možnosti synchronizácie"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Označiť ako neprečítané"</string>
- <string name="move_action" msgid="3059189775933985898">"Presunúť"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+Kópia/skr.kópia"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Pridať kópiu/skr.k."</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Pripojiť súbor"</string>
- <string name="close_action" msgid="533058985745238100">"Zavrieť"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Poslať všetky správy"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Vyberte prílohu"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Presunúť do"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Prebieha načítavanie správ…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Problém s pripojením."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Text správy sa nepodarilo načítať. Správa je možno príliš veľká, a preto ju nie je možné zobraziť."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Presunúť správu"</item>
- <item quantity="other" msgid="371256717624461324">"Presunúť správy"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Účty s protokolom POP3 nepodporujú presun."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Správu nie je možné presunúť, pretože výber obsahuje viacero účtov."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Správy v priečinkoch Koncepty, Pošta na odoslanie a Odoslané nie je možné presunúť."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"Neprečítané správy: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g>(<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"Neprečítané správy: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g>(<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"Neprečítané správy: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g>(<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"v <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> účtoch"</item>
- <item quantity="other" msgid="2723797835410343458">"v <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> účtoch"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"adresát: <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"Nové správy: <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Všetky účty"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"Počet účtov: <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="8548760449976444566">"Počet účtov: <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Doručená pošta"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Pošta na odoslanie"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Koncepty"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Kôš"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Odoslané"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Nevyžiadaná pošta"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Neprečítané"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Doručená pošta (neprečítané)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Doručená pošta (všetky)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Kombinované zobrazenie (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"Počet účtov: <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="4145163147488719025">"Počet účtov: <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Verzia: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Doručená pošta"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Označené hviezdičkou"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Koncepty"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Pošta na odoslanie"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Kombinované zobrazenie"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Zobraziť všetky priečinky"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Účty"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Nedávne priečinky (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Všetky priečinky"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Nedávne priečinky"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Predmet"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Bez predmetu"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Načítať ďalšie správy"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"Počet vybratých správ: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="7901361399231876038">"Počet vybratých správ: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Žiadne správy"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Komu"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Kópia"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Skrytá kópia"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Predmet"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Od:"</string>
- <string name="to" msgid="4392614766835725698">"Komu"</string>
- <string name="cc" msgid="7017720927911078193">"Kópia"</string>
- <string name="bcc" msgid="3098643138241111579">"Skrytá kópia"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Predmet"</string>
- <string name="body_hint" msgid="4279864165439577668">"Napísať e-mail"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Pôvodná správa --------"\n"Predmet: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Odosielateľ: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Komu: <xliff:g id="TO">%3$s</xliff:g>"\n"Kópia: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>napísal/a:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Zahrnúť citovaný text"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Zahrnúť text"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Pridajte aspoň jedného príjemcu."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Niektoré e-mailové adresy sú neplatné."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Súbor nie je možné priložiť, pretože je príliš veľký."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Vložiť rýchlu odpoveď"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> a ešte <xliff:g id="NUMBER">%2$d</xliff:g> ďalších"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Komu:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Kópia:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Skrytá kópia:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Dátum:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Od:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Predmet:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Zobraziť"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Inštalovať"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Prehrať"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Načítať"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Informácie"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Uložiť"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Uložené"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Zastaviť"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Príloha uložená ako <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Prílohu sa nepodarilo uložiť."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Pred odoslaním sa prevezme jedna alebo viacero príloh zo správy posielanej ďalej."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Správa"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Pozvať"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Príloha <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Prílohy <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Zobraziť obrázky"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Vždy zobraziť"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Vždy zobrazovať obrázky od tohto odosielateľa"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Obrázky od tohto odosielateľa sa budú zobrazovať automaticky."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Zobraziť v Kalendári"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Pozvánka kalendára"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Zúčastníte sa?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Áno"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Možno"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Nie"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Prijali ste túto pozvánku."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Na túto pozvánku ste odpovedali „možno“."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Odmietli ste túto pozvánku."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Zobraziť podrobnosti"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Podrobnosti správy"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Informácie o prílohe"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Vyžaduje sa pripojenie Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Nastavenia Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Nastavenia aplikácie"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Nepodarilo sa otvoriť prílohu."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Tento súbor nie je možné uložiť ani otvoriť, pretože tento typ prílohy môže obsahovať škodlivý softvér."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Kvôli pravidlám zabezpečenia tohto účtu nie je možné túto prílohu uložiť ani otvoriť."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Táto príloha je príliš veľká na to, aby sa dala prevziať prostredníctvom mobilnej siete. Môžete ju prevziať pri ďalšom pripojení k sieti Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Nemáte nainštalovanú žiadnu aplikáciu, ktorá môže otvoriť túto prílohu. Skúste prevziať príslušnú aplikáciu zo služby Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Táto príloha je aplikáciou. Pred nainštalovaním musíte v Nastaveniach &gt; Aplikácie začiarknuť položku Neznáme zdroje."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Aplikácie nie je možné inštalovať priamo z e-mailu. Najprv túto aplikáciu uložte a potom ju nainštalujte pomocou aplikácie Prevzaté súbory."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Prílohu sa nepodarilo prevziať."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Pri dekódovaní správy sa vyskytla chyba."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Zobraz. súbor: <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Odstrániť túto správu?"</item>
- <item quantity="other" msgid="4437637377522896262">"Odstrániť tieto správy?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Správa bola odstránená."</item>
- <item quantity="other" msgid="6574961322865652255">"Správy boli odstránené."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Správa bola zahodená."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Správa bola uložená ako koncept."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Príloha sa nedá zobraziť."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Prílohu „<xliff:g id="FILENAME">%s</xliff:g>“ sa nepodarilo načítať."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Prebieha otváranie správy..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> správa bola presunutá do schránky <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"Správy (<xliff:g id="NUM_MESSAGE">%1$d</xliff:g>) boli presunuté do schránky <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Nepodarilo sa poslať ďalej jednu alebo viac príloh."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Príloha nebola poslaná ďalej"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Prihlásenie do účtu <xliff:g id="ACCOUNT_NAME">%s</xliff:g> zlyhalo."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Prihlásenie sa nepodarilo"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Novšie"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Staršie"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Nastavenie účtu"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"E-mailový účet"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Účet si môžete nastaviť pomocou niekoľkých krokov."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-mailová adresa"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Heslo"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"V predvolenom nastavení odosielať e-maily z tohto účtu"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ručné nastavenie"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Zadajte platnú e-mailovú adresu a heslo."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplikovať účet"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Toto používateľské meno už používate pre účet „<xliff:g id="DUPLICATE">%s</xliff:g>“."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Toto heslo začína alebo končí aspoň jednou medzerou. Mnoho serverov nepodporuje heslá s medzerami."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Načítavajú sa informácie o účte…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Kontrola nastavení servera prichádzajúcej pošty…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Kontrola nastavení servera odchádzajúcej pošty…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Nastavenie účtu"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Váš účet je nastavený a e-mail je na ceste!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Pomenovať tento účet (nepovinné)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Vaše meno (zobrazované na odchádzajúcich správach)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Toto pole nesmie byť prázdne."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Nastavenie účtu"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Typ účtu"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"O aký typ účtu ide?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Nastavenie účtu"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Nastavenia servera prichádzajúcej pošty"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Používateľské meno"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Heslo"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Typ zabezpečenia"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Žiadne"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Akceptovať všetky certifikáty)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (akceptovať všetky certifikáty)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Odstraňovať e-maily zo servera"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Nikdy"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Pri odstránení z Doručenej pošty"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Predpona cesty IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Voliteľné"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Nastavenie účtu"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Nastavenia servera odchádzajúcej pošty"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Server SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Typ zabezpečenia"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Vyžadovať prihlásenie"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Používateľské meno"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Heslo"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Nastavenie účtu"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Nastavenia servera"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Server"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Doména\\Používateľské meno"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Použiť zabezpečené pripojenie (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Prijímať všetky certifikáty protokolu SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certifikát klienta"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Vybrať"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Použite certifikát klienta"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Odstrániť"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Žiadny"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID mobilného zariadenia"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Nastavenia účtu"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Možnosti účtu"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Frekvencia kontroly doručenej pošty"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nikdy"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automaticky (v prípade potreby)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Každých 5 minút"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Každých 10 minút"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Každých 15 minút"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Každých 30 minút"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Každú hodinu"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"V predvolenom nastavení odosielať e-maily z tohto účtu"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Upozorniť ma na príchod e-mailu"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synchronizovať kontakty z tohto účtu"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synchronizovať kalendár z tohto účtu"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synchronizovať e-mail z tohto účtu"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Automaticky preberať prílohy počas pripojenia k sieti Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nepodarilo sa dokončiť"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Počet dní na synchronizáciu"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automaticky"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Jeden deň"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tri dni"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Týždeň"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Dva týdny"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Jeden mesiac"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Všetky"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Použiť predv. nast. účtu"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Používateľské meno alebo heslo je nesprávne."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Používateľské meno alebo heslo je nesprávne."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nepodarilo sa bezpečne pripojiť k serveru."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nepodarilo sa bezpečne pripojiť k serveru."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Vyžaduje sa certifikát klienta. Chcete sa pripojiť k serveru pomocou certifikátu klienta?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certifikát je neplatný alebo neprístupný."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Server odpovedal s chybou. Skontrolujte používateľské meno a heslo a skúste to znova."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nepodarilo sa pripojiť k serveru."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Nepodarilo sa pripojiť k serveru."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"Vyžaduje sa služba TLS, ale server ju nepodporuje."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Metódy overovania totožnosti nie sú na tomto serveri podporované."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Pripojenie k serveru sa nepodarilo otvoriť kvôli chybe zabezpečenia."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Pripojenie k serveru sa nepodarilo otvoriť."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Zadali ste nesprávnu adresu servera alebo server vyžaduje verziu protokolu, ktorú aplikácia E-mail nepodporuje."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Nemáte povolenie na synchronizáciu s týmto serverom. Kontaktujte správcu servera a požiadajte ho o viac informácií."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Vzdialená správa zabezpečenia"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Server <xliff:g id="SERVER">%s</xliff:g> vyžaduje povolenie, aby mohol vzdialene ovládať niektoré funkcie zabezpečenia vášho zariadenia so systémom Android. Chcete dokončiť nastavenie tohto účtu?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Tento server vyžaduje bezpečnostné funkcie, ktoré vaše zariadenie so systémom Android nepodporuje (vrátane: <xliff:g id="ERROR">%s</xliff:g>)."</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Používateľské meno účtu nemôžete zmeniť. Ak chcete pridať účet s iným používateľským menom, dotknite sa možnosti Pridať účet."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"UPOZORNENIE: Ak deaktivujete oprávnenie aplikácie E-mail spravovať toto zariadenie, budú odstránené všetky účty aplikácie E-mail, ktoré toto oprávnenie vyžadujú. Spoločne s týmito účtami budú odstránené aj všetky ich e-maily, kontakty, udalosti kalendára a ďalšie údaje."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Bezpečnostná aktualizácia"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Účet <xliff:g id="ACCOUNT">%s</xliff:g> vyžaduje, aby ste zmenili nastavenia zabezpečenia."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Účet „<xliff:g id="ACCOUNT">%s</xliff:g>“ sa nedá synchronizovať z dôvodu požiadaviek zabezpečenia."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Účet „<xliff:g id="ACCOUNT">%s</xliff:g>“ vyžaduje aktualizáciu nastavení zabezpečenia."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Účet „<xliff:g id="ACCOUNT">%s</xliff:g>“ zmenil svoje nastavenia zabezpečenia. Od používateľa sa nevyžaduje žiadna akcia."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Vyžaduje sa bezp. aktualizácia"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Pravidlá zabezp. sa zmenili"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Prav. zabezp. sa nedajú splniť"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Zabezpečenie zariadenia"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Server <xliff:g id="SERVER">%s</xliff:g> vyžaduje povolenie, aby mohol vzdialene ovládať niektoré funkcie zabezpečenia vášho zariadenia so systémom Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Upraviť podrobnosti"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"Účet „<xliff:g id="ACCOUNT">%s</xliff:g>“ požaduje, aby ste zmenili kód PIN alebo heslo uzamknutia obrazovky."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Uzamykacie heslo čoskoro vyprší"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Platnosť kódu PIN alebo hesla na uzamknutie obrazovky vypršala."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Heslo na uzamknutie vypršalo"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Heslo na uzamknutie obr. čoskoro vyprší"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Váš kód PIN alebo heslo na uzamknutie obrazovky musíte čoskoro zmeniť, ináč budú údaje účtu <xliff:g id="ACCOUNT">%s</xliff:g> vymazané. Chcete ho zmeniť teraz?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Heslo na uzamknutie obrazovky vypršalo"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"V zariadení prebieha vymazanie údajov účtu <xliff:g id="ACCOUNT">%s</xliff:g>. Môžete ich obnoviť zmenou kódu PIN alebo hesla na uzamknutie obrazovky. Chcete to zmeniť teraz?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Zahodiť neuložené zmeny?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Prihlásenie sa nepodarilo"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Používateľské meno alebo heslo pre účet <xliff:g id="ACCOUNT">%s</xliff:g> je nesprávne. Chcete ich aktualizovať?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Predvolený účet"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"V predvolenom nastavení odosielať e-maily z tohto účtu"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Preberať všetky prílohy"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Automaticky preberať prílohy najnovších správ prostredníctvom siete Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"E-mailové upozornenia"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Frekvencia synchronizácie, oznámení atď."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Poslať upozornenie na príchod e-mailu"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frekvencia kontroly doručenej pošty"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Nastavenia prichádzajúcej pošty"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Používateľské meno, heslo a ďalšie nastavenia servera (prich.)"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Nastavenia odchádzajúcej pošty"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Používateľské meno, heslo a ďalšie nastavenia servera (odchádz.)"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Vynútené pravidlá"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Žiadne"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nepodporované pravidlá"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Žiadne"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Synchronizovať"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Ak chcete tento účet synchronizovať, dotknite sa tu"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Názov účtu"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Vaše meno"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Podpis"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Rýchle odpovede"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Upraviť text, ktorý často vkladáte pri písaní e-mailu"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Text pripojiť k odosielaným správam"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Nastavenia upozornení"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Spotreba dát"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Pravidlá zabezpečenia"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Upraviť rýchlu odpoveď"</string>
- <string name="save_action" msgid="1988862706623227093">"Uložiť"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synchronizovať kontakty"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synchr. kontakty pre tento účet."</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synchronizovať kalendár"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synchr. udalosť kalendára pre účet"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synchroniz. e-mail"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synchr. e-mail pre tento účet"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrovať"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibrovať aj pri príchode e-mailu"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Vždy"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Iba v tichom režime"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Nikdy"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibrovať"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Zvoliť vyzváňací tón"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Nastavenia servera"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Odstrániť účet"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Účet <xliff:g id="ACCOUNT">%s</xliff:g> bude odstránený z aplikácie E-mail."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Odstrániť účet"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Odstrániť účet"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Možnosti synchronizácie"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Možnosti synchronizácie (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Nastavenia synchronizácie"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Frekvencia kontrol"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Počet dní, ktoré sa majú synchronizovať"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"E-mail. účet"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Zvoliť účet"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Výber priečinka"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Účet sa nenašiel. Je možné, že bol odstránený."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Priečinok sa nenašiel. Možno bol odstránený."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Len niektoré účty Plus majú prístup prostredníctvom protokolu POP, ktorý umožňuje pripojenie tohto programu. Ak sa nemôžete prihlásiť so správnou e-mailovou adresou a heslom, pravdepodobne nemáte platený účet „Plus“. Ak chcete pristupovať k týmto e-mailovým účtom, urobte tak prostredníctvom webového prehliadača."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Pred nastavením tohto e-mailového účtu navštívte webové stránky T-Online a vytvorte heslo pre e-mailový prístup POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Firemný"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Účet sa nepodarilo vytvoriť. Skúste to znova."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Poslať e-mail"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Povoľuje pravidlá zabezpečenia určené serverom"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Prebieha vyhľadávanie <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"Počet výsledkov z webu <xliff:g id="DOMAIN">%2$s</xliff:g>: <xliff:g id="RESULTS">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"Počet výsledkov z webu <xliff:g id="DOMAIN">%2$s</xliff:g>: <xliff:g id="RESULTS">%1$d</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Nastavenia"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Všeobecné nastavenia"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Aplikácia"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatický prechod"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Zvoľte obrazovku, ktorá sa zobrazí po odstránení správy"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Skryť začiarkavacie políčka"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"V zozname správ urobte výber dotknutím sa a podržaním"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Pred odstránením potvrdiť"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Správy"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Pred odoslaním potvrdiť"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Správy"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Pokračovať do"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Novšia správa"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Staršia správa"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Zoznam správ"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Veľkosť písma správy"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Veľmi malé písmo"</item>
- <item msgid="4415205108584620118">"Malé písmo"</item>
- <item msgid="4550219696381691112">"Normálna veľkosť písma"</item>
- <item msgid="6227813549949219991">"Veľké písmo"</item>
- <item msgid="1197917420815786571">"Veľmi veľké písmo"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Veľkosť písma správy"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Veľmi malé"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Malé"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normálne"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Veľké"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Veľmi veľké"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Odpovedať všetkým"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Nastaviť voľbu „Odpovedať všetkým“ ako predvol. voľbu odpov. na správy"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Opýtať sa, či zobraziť obrázky"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Obrázky sa v správach nebudú zobrazovať automaticky"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Nastavenie „Zobraziť obrázky“ bolo vymazané."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Prebieha synchronizácia"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Váš e-mail sa čoskoro zobrazí."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Zmeňte klep. na ikonu"</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Doručená pošta (všetky)"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Neprečítané"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Označené hviezdičkou"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Prebieha načítav."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Dotykom nastavte."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Zatiaľ ste nevytvorili e-mailový účet."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Hľadať e-mail"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Hľadať v priečinku <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Výsledky vyhľadávania pre „<xliff:g id="ID_1">%1$s</xliff:g>“"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Čakanie na výsledky"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Niektorým serverom môže tento proces trvať dlho."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Priečinky"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Zakázať použitie fotoaparátu zariadenia"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Vyžadovať heslo zariadenia"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Obmedziť opak. použitie nedávnych hesiel"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Vyžadovať časovo obmedz. platnosť hesiel"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Uzamk. obrazovky nečinného zariadenia"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Obmedziť počet synchroniz. udalostí kalendára"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Obmedziť počet synchronizovaných e-mailov"</string>
- <string name="quick_1" msgid="3426057697353380951">"Ďakujeme!"</string>
- <string name="quick_2" msgid="4188036352885736617">"To znie dobre!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Prečítam si to neskôr a dám vám vedieť."</string>
- <string name="quick_4" msgid="3988974084396883051">"Dohodnime si schôdzku a prediskutujme to."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Synchronizácia na pozadí je pre tento účet v roamingu zakázaná."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Prebieha odosielanie odpovede..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Žiadne správy."</string>
-</resources>
diff --git a/email2/res/values-sk/uploader.xml b/email2/res/values-sk/uploader.xml
deleted file mode 100644
index a12915af4..000000000
--- a/email2/res/values-sk/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Okamžité odovzdanie"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Album Okamžitého odovzdania"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Odovzdáva sa"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Dokončené"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Pozastavené"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"Počet fotografií: %1$d%% • %2$d • Počet videí: %3$d"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"Počet fotografií: %1$d • Počet videí: %2$d"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"slabá batéria"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"kvóta pre fotografie bola prekročená"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"čakanie na sieť Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"odložené až do nabitia"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"čaká sa na pripojenie"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"opakovanie o %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Zobraziť čakajúce odovzdania"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Zobraziť dokončené odovzdania"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Zobraziť v režime online"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Zobraziť čakajúce odovzdania"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Skryť čakajúce odovzdania"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Zobraziť podrobnosti"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Skryť podrobnosti"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Nastavenia"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Odovzdané: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Účet"</string>
- <string name="upload" msgid="2615541458361216022">"Odovzdať"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Zrušiť"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Odovzdávanie do "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" pre používateľa "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Inicializácia odovzdávania zlyhala."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Súbor nie je k dispozícii."</string>
- <string name="account_error" msgid="1904775271866104941">"Nepodarilo sa načítať informácie o účte."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Pri prihlasovaní do vášho účtu sa vyskytla chyba."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Čakanie na opakovanie"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Čakanie na sieť Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Prebieha odovzdávanie"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Zlyhanie"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Dokončené"</string>
- <string name="pause_state_running" msgid="711411177620353982">"odovzdáva sa"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"ručne pozastavené"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"pozastavené – slabá batéria"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"pozastavené – odložené až do nabitia"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"pozastavené – čakanie na pripojenie"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"pozastavené - kvóta Webových albumov programu Picasa bola prekročená"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"pozastavené – čakanie na sieť Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"pozastavené – roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"čaká sa na opakovanie pokusu"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 min."</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 min."</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 min."</string>
- <string name="retry_no_data" msgid="630347885498641534">"Žiadne dátové pripojenie"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Účet prekročil kvótu priestoru na disku"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Súbor sa nenašiel"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Chyba služby"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Chyba siete"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Overenie zlyhalo"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Čakajúce odovzdávania [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Dokončené odovzdávania [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Pozastaviť odovzdávania"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Obnoviť odovzdávania"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Odovzdať"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Odovzdať neskôr"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Neodovzdať"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Zobraziť"</string>
- <string name="manager_retry" msgid="939534318469518843">"Znova"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Odovzdávanie bolo zrušené"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Odovzdávanie už bolo dokončené"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Synchronizovať všetky"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Posledná synchronizácia:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Zoznam dokončených položiek je prázdny."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Okamžité odovzdanie"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Odovzdávania boli dokončené"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Odovzdávania boli pozastavené"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Okamžité odovzdanie ešte nebolo aktivované"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Veľké súbory budú odovzdané iba prostredníctvom pripojenia Wi-Fi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Prebieha vyhľadávanie súborov..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Prebieha príprava fotografií (počet: <xliff:g id="PHOTOCOUNT">%1$d</xliff:g>) a videí (počet: <xliff:g id="VIDEOCOUNT">%2$d</xliff:g>) na odovzdanie..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Nie je potrebné odovzdať žiadne ďalšie fotografie ani videá."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Pri komunikácii so serverom sa vyskytol problém. Skúste to znova neskôr."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Synchronizácia bola zrušená"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Synchronizovať všetky"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Zobraziť dokončené"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Zobraziť čakajúce"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Všeobecné"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Pozastaviť všetky odovzdávania"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Napájanie"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Odovzdávať len počas nabíjania telefónu."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Odovzdať, len ak je k dispozícii sieť Wi-Fi."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotografie"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Účet"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Podmienky odovzdávania"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Veľkosť fotografie"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videá"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Účet"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Na odovzdanie videí sa použije účet pre fotografie."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Podmienky odovzdávania"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Momentálne sa používajú nastavenia pripojenia pre fotografie."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Pomocou mobilných sietí odovzdávať len fotografie"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotografie a videá cez mobilné siete"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Fotografie a videá len cez sieť Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"O aplikácii"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Ver. Okamž. odovzd."</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Odporúčaná veľkosť: 1 600 pixlov (na zdieľanie, tlač a šetriče obrazovky)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Pôvodná veľkosť (najpomalšie odovzdávanie)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"pozastavené – karta SD nie je k dispozícii"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Karta SD nie je k dispozícii"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Nastavenia funkcie Okamžité odovzdanie"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Okamžité odovzdanie"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Automaticky odovzdávať nové fotografie a videá do súkromného webového albumu"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Stav odovzdania"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Rozšírené"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Odovzdávanie pomocou mobilného dátového pripojenia"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Odovzdávanie pri roamingu"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Odovzdávať fotografie a videá v roamingu v dátovej sieti"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Odovzd. podľa batérie"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Odovzdávať fotografie a videá len počas nabíjania"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Odovzdať fotografie"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Odovzdanie všetkých fotografií a videí z telefónu"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Zakázané"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Prebieha odovzdávanie (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d z %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Pozastavené: odovzdávanie obnovíte dotykom"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Odovzdať fotografie"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Odovzdanie neodovzdaných fotografií a videí z telefónu do súkromného albumu na webe môže chvíľu trvať, ale akcia prebehne na pozadí. Chcete pokračovať?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Áno"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Nie"</string>
-</resources>
diff --git a/email2/res/values-sl/strings.xml b/email2/res/values-sl/strings.xml
deleted file mode 100644
index a093a0001..000000000
--- a/email2/res/values-sl/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Branje e-poštnih prilog"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Dovoli temu programu branje e-poštnih prilog."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Dostop do podatkov e-poštnega ponudnika"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Programu omogoča dostop do vaše e-poštne zbirke podatkov, vključno s prejetimi in poslanimi sporočili, uporabniškimi imeni in gesli."</string>
- <string name="app_name" msgid="5815426892327290362">"E-pošta"</string>
- <string name="compose_title" msgid="427986915662706899">"Novo"</string>
- <string name="debug_title" msgid="5175710493691536719">"Odpravljanje napak"</string>
- <string name="next_action" msgid="3931301986364184415">"Naprej"</string>
- <string name="okay_action" msgid="8365197396795675617">"V redu"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Prekliči"</string>
- <string name="previous_action" msgid="5181616311579820981">"Nazaj"</string>
- <string name="send_action" msgid="1729766205562446418">"Pošlji"</string>
- <string name="reply_action" msgid="4262472229221507619">"Odgovori"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Odgovori vsem"</string>
- <string name="delete_action" msgid="8421026208288857155">"Izbriši"</string>
- <string name="forward_action" msgid="669174181042344116">"Posreduj"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Označi z zvezdico"</string>
- <string name="done_action" msgid="7497990549515580249">"Dokončano"</string>
- <string name="create_action" msgid="3062715563215392251">"Ustvari nov"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Izbriši"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Ni hitrih odzivov."</string>
- <string name="discard_action" msgid="6532206074859505968">"Zavrzi"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Shrani osnutek"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Vstavi hiter odgovor"</string>
- <string name="read_action" msgid="4701484794504781686">"Označi kot prebrano"</string>
- <string name="unread_action" msgid="6280399049357552826">"Označi kot neprebrano"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Dodaj zvezdico"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Odstrani zvezdico"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Osveži"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Dodaj račun"</string>
- <string name="compose_action" msgid="4045702519637388045">"Novo sporočilo"</string>
- <string name="search_action" msgid="6325101454876682308">"Iskanje"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Nastavitve računa"</string>
- <string name="settings_action" msgid="6334807007967459412">"Nastavitve"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Možnosti sinhronizacije"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Označi kot neprebrano"</string>
- <string name="move_action" msgid="3059189775933985898">"Premakni"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Kp/Skp"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Dodaj Kp/Skp"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Priloži datoteko"</string>
- <string name="close_action" msgid="533058985745238100">"Zapri"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Pošlji vsa sporočila"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Izberite prilogo"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Premakni v"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Nalaganje sporočil ..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Težava s povezavo."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Besedila sporočila ni bilo mogoče naložiti. Sporočilo je morda predolgo za prikaz."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Premikanje sporočil"</item>
- <item quantity="other" msgid="371256717624461324">"Premikanje sporočil"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Računi POP3 ne podpirajo premikanja sporočil."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Sporočil ni mogoče premakniti, ker izbor vsebuje več računov."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Sporočila v mapah »Osnutki«, »Odpošlji« in »Poslano« ni mogoče premakniti."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> neprebranih (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> neprebranih (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> neprebranih (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"v <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> računih"</item>
- <item quantity="other" msgid="2723797835410343458">"v <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> računih"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"za <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"Št. novih sporočil: <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Vsi računi"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> račun"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> računov"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Prejeto"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Odpošlji"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Osnutki"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Smetnjak"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Poslano"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Vsiljena pošta"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Neprebrano"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Prejeto (neprebrano)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Prejeto (vse)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Kombiniran pogled (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> račun"</item>
- <item quantity="other" msgid="4145163147488719025">"Št. računov: <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Različica: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Prejeto"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Z zvezdico"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Osnutki"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Odpošlji"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Kombiniran pogled"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Pokaži vse mape"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Računi"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Nedavne mape (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Vse mape"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Nedavne mape"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Zadeva"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Ni zadeve"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Naloži več sporočil"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> izbranih"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> izbranih"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Ni sporočil"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Za"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Kp"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Skp"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Zadeva"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Od:"</string>
- <string name="to" msgid="4392614766835725698">"Za"</string>
- <string name="cc" msgid="7017720927911078193">"Kp"</string>
- <string name="bcc" msgid="3098643138241111579">"Skp"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Zadeva"</string>
- <string name="body_hint" msgid="4279864165439577668">"Novo e-poštno sporočilo"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Izvirno sporočilo --------"\n"Zadeva: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Od: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Za: <xliff:g id="TO">%3$s</xliff:g>"\n"Kp: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> je napisal:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Vključite citirano besedilo"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Vključi besedilo"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Dodajte vsaj enega prejemnika."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Nekateri e-poštni naslovi niso veljavni."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Datoteke ni mogoče pripeti, ker je prevelika."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Vstavi hiter odgovor"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> in <xliff:g id="NUMBER">%2$d</xliff:g> drugih"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Za:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Kp:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Skp:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Datum:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Od:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Zadeva:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Prikaži"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Namesti"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Predvajaj"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Naloži"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Informacije"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Shrani"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Shranjeno"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Ustavi"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Priloga je shranjena kot <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Priloge ni mogoče shraniti."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Ena ali več prilog v posredovanem sporočilu bo pred pošiljanjem prenesena iz strežnika."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Sporočilo"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Povabi"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Priloga <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Priloge <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Pokaži slike"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Vedno pokaži"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Vedno pokaži slike tega pošiljatelja"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Slike tega pošiljatelja bodo samodejno prikazane."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Prikaži v koledarju"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Koledarsko povabilo"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Ali se boste udeležili?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Da"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Morda"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Ne"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Sprejeli ste povabilo."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Na to povabilo ste odgovorili z »morda«."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Zavrnili ste povabilo."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Pokaži podrobnosti"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Podrobnosti sporočila"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Informacije o prilogi"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Potrebna je povezava Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Nastavitve za Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Nastavitve programa"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Priloge ni mogoče odpreti."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Te datoteke ni mogole shraniti ali odpreti, ker lahko ta vrsta priloge vsebuje zlonamerno programsko opremo."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Priloge ni mogoče shraniti ali odpreti zaradi varnostnih pravilnikov računa."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Ta priloga je prevelika, da bi jo bilo mogoče prenesti prek mobilnega omrežja. Lahko jo prenesete naslednjič, ko se povežete v omrežje Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Ni nameščenega programa, s katerim bi lahko odprli to prilogo. Poskusite prenesti ustrezen program iz Android Marketa."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Priloga je program. Pred namestitvijo morate potrditi možnost »Neznani viri« v razdelku Nastavitve &gt; Programi."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Programov ni mogoče namestiti neposredno iz e-pošte. Program najprej shranite in ga namestite s programom za prenose."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Priloge ni bilo mogoče prenesti."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Napaka pri dekodiranju sporočila."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Ogledovanje <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Želite izbrisati sporočilo?"</item>
- <item quantity="other" msgid="4437637377522896262">"Želite izbrisati ta sporočila?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Sporočilo izbrisano."</item>
- <item quantity="other" msgid="6574961322865652255">"Sporočila izbrisana."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Sporočilo zavrženo."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Sporočilo shranjeno kot osnutek."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Priloge ni mogoče prikazati."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Priloge »<xliff:g id="FILENAME">%s</xliff:g>« ni bilo mogoče naložiti."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Odpiranje sporočila ..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> sporočil premaknjenih v <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> sporočil premaknjenih v <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Ene ali več prilog ni bilo mogoče posredovati."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Priloga ni bila posredovana"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Prijava v <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ni uspela."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Prijava ni uspela"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Novejše"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Starejše"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Nastavitev računa"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"E-poštni račun"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Račun lahko ustvarite v nekaj korakih."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-poštni naslov"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Geslo"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Privzeto pošiljaj e-pošto iz tega računa"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ročna nastavitev"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Vnesite veljaven e-poštni naslov in geslo."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Podvojeni račun"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"To uporabniško ime že uporabljate za račun »<xliff:g id="DUPLICATE">%s</xliff:g>«."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Geslo se začne ali konča z vsaj enim presledkom. Številni strežniki ne podpirajo gesel s presledki."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Pridobivanje podatkov o računu..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Preverjanje nastavitev strežnika za dohodno pošto..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Preverjanje nastavitev strežnika za odhodno pošto..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Nastavitev računa"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Vaš račun je pripravljen in e-pošta je poslana."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Poimenujte račun (neobvezno)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Vaše ime (prikazano v odhodnih sporočilih)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"To polje ne sme biti prazno."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Nastavitev računa"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Vrsta računa"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Katera vrsta računa je to?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Nastavitev računa"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Nastavitve strežnika za dohodno pošto"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Uporabniško ime"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Geslo"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Strežnik"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Vrata"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Vrsta varnosti"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Brez"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Sprejmi vsa potrdila)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (sprejmi vsa potrdila)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Izbriši e-pošto iz strežnika"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Nikoli"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Ko sporočilo izbrišem iz nabiralnika"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Predpona poti IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Neobvezno"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Nastavitev računa"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Nastavitve strežnika za odhodno pošto"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Strežnik SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Vrata"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Vrsta varnosti"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Zahtevaj prijavo"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Uporabniško ime"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Geslo"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Nastavitev računa"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Nastavitve strežnika"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Strežnik"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domena/uporabniško ime"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Uporabi varno povezavo (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Sprejmi vsa potrdila SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Potrdilo odjemalca"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Izberi"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Uporaba potrdila odjemalca"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Odstrani"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Brez"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID mobilne naprave"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Nastavitve računa"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Možnosti računa"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Pogostost preverjanja mape »Prejeto«"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nikoli"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Samodejno (potisno)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Vsakih 5 minut"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Vsakih 10 minut"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Vsakih 15 minut"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Vsakih 30 minut"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Vsako uro"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Privzeto pošiljaj e-pošto iz tega računa"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Obvesti me o novi e-pošti"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sinhroniziraj stike iz tega računa"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sinhroniziraj koledar iz tega računa"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sinhroniziraj e-pošto iz tega računa"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Samodejni prenos prilog, ko je na voljo povezava Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Ni mogoče končati"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dnevi za sinhronizacijo"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Samodejno"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"En dan"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tri dni"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"En teden"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Dva tedna"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"En mesec"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Vse"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Uporabi privzeto v računu"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Uporabniško ime ali geslo ni pravilno."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Uporabniško ime ali geslo ni pravilno."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"S strežnikom se ni mogoče varno povezati."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"S strežnikom se ni bilo mogoče varno povezati."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Potrebno je potrdilo odjemalca. Ali se želite povezati s strežnikom s potrdilom odjemalca?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Potrdilo ni veljavno ali na voljo."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Strežnik je odgovoril z napako. Preverite uporabniško ime in geslo in poskusite znova."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Ni se mogoče povezati s strežnikom."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"S strežnikom se ni mogoče povezati."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"Zahtevan je bil TLS, vendar ga strežnik ne podpira."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Strežnik ne podpira načinov preverjanja pristnosti."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Zaradi varnostne napake ni bilo mogoče vzpostaviti povezave s strežnikom."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Povezave s strežnikom ni bilo mogoče vzpostaviti."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Vnesli ste napačen naslov strežnika ali pa je za strežnik zahtevana različica protokola, ki je program za e-pošto ne podpira."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Nimate dovoljenja za sinhronizacijo s tem strežnikom. Za več informacij se obrnite na skrbnika strežnika."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Varnostno skrbništvo na daljavo"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Strežniku <xliff:g id="SERVER">%s</xliff:g> morate dovoliti, da na daljavo nadzira nekatere varnostne funkcije vaše naprave Android. Ali želite dokončati nastavitev tega računa?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Za ta strežnik so potrebne varnostne funkcije, ki jih vaša naprava Android ne podpira: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Uporabniškega imena za račun ni mogoče spreminjati. Če želite dodati račun z drugim uporabniškim imenom, se dotaknite možnosti »Dodaj račun«."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"Opozorilo: Če onemogočite pravico e-poštnega programa za upravljanja naprave, boste izbrisali vse e-poštne račune, ki jo potrebujejo, skupaj z e-pošto, stiki, dogodki koledarja in drugimi podatki."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Varnostna posodobitev"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Za račun <xliff:g id="ACCOUNT">%s</xliff:g> morate posodobiti varnostne nastavitve."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Računa »<xliff:g id="ACCOUNT">%s</xliff:g>« zaradi varnostnih zahtev ni mogoče sinhronizirati."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Varnostne nastavitve za račun »<xliff:g id="ACCOUNT">%s</xliff:g>« je potrebno posodobiti."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Varnostne nastavitve za račun »<xliff:g id="ACCOUNT">%s</xliff:g>« so bile spremenjene. Uporabniku ni treba storiti nič."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Potrebna je varn. posodobitev"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Varn. pravilnik je spremenjen"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Ne ustreza varn. pravilnikom"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Varnost naprave"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Strežniku <xliff:g id="SERVER">%s</xliff:g> morate dovoliti, da na daljavo nadzira nekatere varnostne funkcije vaše naprave Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Urejanje podrobnosti"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"Za »<xliff:g id="ACCOUNT">%s</xliff:g>« morate spremeniti PIN ali geslo za zaklepanje zaslona."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Geslo za zaklepanje zaslona bo poteklo"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"PIN ali geslo za zaklepanje zaslona sta potekla."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Geslo za zaklepanje zaslona je poteklo"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Geslo za zaklepanje zaslona bo poteklo"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Čim prej spremenite PIN ali geslo za zaklepanje zaslona, sicer bodo podatki za <xliff:g id="ACCOUNT">%s</xliff:g> izbrisani. Ali ga želite spremeniti zdaj?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Geslo za zaklepanje zaslona je poteklo"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Podatki za <xliff:g id="ACCOUNT">%s</xliff:g> bodo izbrisani iz naprave. Če jih želite obnoviti, spremenite PIN ali geslo za zaklepanje zaslona. Ali ga želite spremeniti zdaj?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Želite zavreči neshranjene spremembe?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Prijava ni uspela"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Ime ali geslo za <xliff:g id="ACCOUNT">%s</xliff:g> ni pravilno. Ali ga želite posodobiti zdaj?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Privzeti račun"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Privzeto pošiljaj e-pošto iz tega računa"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Prenesi priloge"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Samodejni prenos prilog k nedavnim sporočilom s povezavo Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"E-poštna obvestila"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Pogostost sinhronizacije, obvestila itd."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Pošlji obvestilo o novi e-pošti"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Pogostost preverjanja mape »Prejeto«"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Nastavitve dohodne pošte"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Uporabniško ime, geslo in druge nastavitve dohodnega strežnika"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Nastavitve odhodne pošte"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Uporabniško ime, geslo in druge nastavitve odhodnega strežnika"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Pravilniki so uveljavljeni"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Brez"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nepodprti pravilniki"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Brez"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Poskusi sinhronizacijo"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Za sinhronizacijo računa se dotaknite tukaj"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Ime računa"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Vaše ime"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Podpis"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Hitri odgovori"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Uredite besedilo, ki ga pogosto vstavite v e-pošto"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Pripni besedilo k poslanim sporočilom"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Nastavitve obvestil"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Uporaba podatkov"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Varnostni pravilniki"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Uredi hiter odgovor"</string>
- <string name="save_action" msgid="1988862706623227093">"Shrani"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sinhroniziranje stikov"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sinhroniziraj stike za ta račun"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sinhroniziraj koledar"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sinhr. dogodek iz kol. za ta račun"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sinhroniz. e-pošte"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sinhroniziraj e-pošto za ta račun"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibriranje"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibriraj tudi, ko prejmem e-pošto"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Vedno"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Samo v tihem načinu"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Nikoli"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibriranje"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Izberite melodijo zvonjenja"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Nastavitve strežnika"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Odstrani račun"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Račun »<xliff:g id="ACCOUNT">%s</xliff:g>« bo odstranjen iz e-pošte."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Odstrani račun"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Odstrani račun"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Možnosti sinhronizacije"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Možnosti sinhronizacije (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Nastavitve sinhronizacije"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Preverite frekvenco"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Št. dnevov za sinhronizacijo"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"E-pošti račun"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Izberite račun"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Izberite mapo"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Računa ni mogoče najti. Morda je odstranjen."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Mape ni bilo mogoče najti. Morda je odstranjena."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Samo nekateri računi »Plus« ponujajo tudi dostop do strežnika POP, da se lahko ta program poveže. Če ste pravilno vnesli svoj e-poštni naslov in geslo, a se ne morete prijaviti, morda nimate plačljivega računa »Plus«. Zaženite brskalnik, če želite dostopati do teh e-poštnih računov."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Preden nastavite ta e-poštni račun, pojdite na spletno mesto T-Online in ustvarite geslo za e-poštni dostop POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Podjetje"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Računa ni bilo mogoče ustvariti. Poskusite znova."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-pošta"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Omogoči varnostne pravilnike, ki jih določi strežnik"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Iskanje <xliff:g id="DOMAIN">%s</xliff:g>..."</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> rezultat z <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> rezultatov iz <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Nastavitve"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Splošne nastavitve"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Program"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Samodejno napredovanje"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Izberite, kateri zaslon naj se prikaže po brisanju sporočila"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Skrij potrditvena polja"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Na seznamu sporočil se dotaknite želenega in ga pridržite, da ga izberete"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Potrditev pred brisanjem"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Sporočila"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Potrditev pred pošiljanjem"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Sporočila"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Naprej do"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Novejša sporočila"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Starejše sporočilo"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Seznam sporočil"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Velikost besedila sporočila"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Drobno besedilo"</item>
- <item msgid="4415205108584620118">"Majhno besedilo"</item>
- <item msgid="4550219696381691112">"Normalno besedilo"</item>
- <item msgid="6227813549949219991">"Veliko besedilo"</item>
- <item msgid="1197917420815786571">"Ogromno besedilo"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Velikost besedila sporočila"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Drobna"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Majhna"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Običajna"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Velika"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Velikanska"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Odgovori vsem"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"»Odgovori vsem« naj bo privzeta izbira za odgovore na sporočila"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Vprašaj, ali naj bodo slike prikazane"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Slike v sporočilih ne bodo prikazane samodejno"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Možnost »Pokaži slike« je počiščena."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Čakanje na sinhronizacijo"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Vaša e-pošta se bo pojavila kmalu."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Tapnite ikono, da spremenite."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Kombiniran nabiralnik"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Neprebrano"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Z zvezdico"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Nalaganje ..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Dotaknite se, da nastavite."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"E-poštnega računa še niste nastavili."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Iskanje po e-pošti"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Iskanje po mapi <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Rezultati iskanja za »<xliff:g id="ID_1">%1$s</xliff:g>«."</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Čakanje na rezultate"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Odziv nekaterih strežnikov je lahko počasen."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mape"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Ne dovoli uporabe kamere naprave"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Zahtevaj geslo naprave"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Omeji vnovično uporabo nedavnih gesel"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Zahtevaj, da gesla potečejo"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Zahtevaj, da nedej. napr. zaklene zaslon"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Omejitev števila sinhroniziranih koledarskih dogodkov"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Omejitev števila sinhroniziranih e-poštnih sporočil"</string>
- <string name="quick_1" msgid="3426057697353380951">"Hvala!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Velja!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Trenutno nimam časa. Odgovorim pozneje."</string>
- <string name="quick_4" msgid="3988974084396883051">"Skličimo sestanek in se pogovorimo."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Sinhronizacija v ozadju je za ta račun med gostovanjem onemogočena."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Pošiljanje odgovora ..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Ni sporočil."</string>
-</resources>
diff --git a/email2/res/values-sl/uploader.xml b/email2/res/values-sl/uploader.xml
deleted file mode 100644
index 0e6e81344..000000000
--- a/email2/res/values-sl/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Takojšnji prenos"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Album za takojšnji prenos"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Prenos"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Končano"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Začasno ustavljeno"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • št. fotografij: %2$d • št. videoposnetkov: %3$d"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"št. fotografij: %1$d • št. videoposnetkov: %2$d"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"baterija je skoraj prazna"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"presežena količinska omejitev fotografij"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"gostovanje"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"čakanje na Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"odloženo do polnjenja"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"čakanje na povezavo"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"vnovični poskus čez %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Pokaži čakajoče prenose"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Pokaži končane prenose"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Prikaži v spletu"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Pokaži čakajoče prenose"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Skrij čakajoče prenose"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Pokaži podrobnosti"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Skrij podrobnosti"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Nastavitve"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Preneseno: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Račun"</string>
- <string name="upload" msgid="2615541458361216022">"Prenesi"</string>
- <string name="ok" msgid="2516349681897895312">"V redu"</string>
- <string name="cancel" msgid="1207103189404543868">"Prekliči"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Prenos v "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" za "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Inicializacija prenosa ni uspela."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Datoteka ni na voljo."</string>
- <string name="account_error" msgid="1904775271866104941">"Podatkov računa ni bilo mogoče prenesti."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Težava pri prijavi v račun."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Čakanje na vnovičen prenos"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Čakanje na povezavo Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Prenos"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Ni uspelo"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Končano"</string>
- <string name="pause_state_running" msgid="711411177620353982">"prenos"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"ročno ustavljeno"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"začasno ustavljeno – baterija je skoraj prazna"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"začasno ustavljeno – odloženo do polnjenja"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"začasno ustavljeno – čakanje na povezavo"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"začasno ustavljeno - presežena količinska omejitev PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"začasno ustavljeno – čakanje na Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"začasno ustavljeno – gostovanje"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"čakanje na vnovični poskus"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minuta"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minuti"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minut"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Ni podatkovne povezave"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Račun presega količinsko omejitev diska"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Datoteke ni mogoče najti"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Napaka storitve"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Napaka v omrežju"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Preverjanje pristnosti ni uspelo"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Čakajoči prenosi [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Končani prenosi [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Začasno ustavi prenos"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Nadaljuj prenose"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Prenesi zdaj"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Prenesi pozneje"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Ne prenesi"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Prikaži"</string>
- <string name="manager_retry" msgid="939534318469518843">"Poskusi znova"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Prenos je bil preklican"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Prenos se je že končal"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sinhroniziraj vse"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Zadnja sinhronizacija:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Seznam končanih elementov je prazen."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Takojšnji prenos"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Prenosi končani"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Prenosi začasno ustavljeni"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Takojšnji prenos še ni aktiviran"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Večje datoteke bodo prenesene le prek povezave Wi-Fi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Iskanje datotek ..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Priprava fotografij (<xliff:g id="PHOTOCOUNT">%1$d</xliff:g>) in videoposnetkov (<xliff:g id="VIDEOCOUNT">%2$d</xliff:g>) za prenos ..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Ni treba prenesti dodatnih fotografij ali videoposnetkov."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Težava pri komunikaciji s strežnikom. Poskusite znova pozneje."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Preklicana sinhroniziracija vsega"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sinhroniziraj vse"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Ogled dokončanih"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Ogled čakajočih"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Splošno"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Začasno ustavi vse prenose"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Polnjenje"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Prenesi samo, ko se baterija telefona polni."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Prenesi samo, ko je na voljo Wi-Fi"</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotografije"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Račun"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Pogoji prenosa"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Velikost fotografije"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videoposnetki"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Račun"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Račun za fotografije se bo uporabljal za prenose videoposnetkov."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Pogoji prenosa"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Zdaj se uporabljajo nastavitve povezljivosti fotografij."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Samo fotografije prek mobilnih omrežij"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Prenos fotografij in videoposnetkov po mobilnih omrežjih"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Prenos slik in videov samo prek Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Vizitka"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Razl. takoj. prenosa"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Priporočeno: 1600 slikovnih pik (za deljenje z drugimi, tiskanje in ohranjevalnike zaslona)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Izvirna velikost (najpočasnejši prenos)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"začasno ustavljeno – kartica SD ni na voljo"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Kartica SD ni na voljo"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Nast. takoj. prenosa"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Takojšnji prenos"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Samodejni prenos novih fotografij in videoposnetkov v zasebni spletni album"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Stanje prenosa"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Dodatno"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Prenosi iz mobilne naprave"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Prenosi med gostovanjem"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Prenos fotografij in videoposnetkov med gostovanjem v podatkovnem omrežju"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Prenosi med polnjenjem baterije"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Prenos fotografij in videoposnetkov samo med polnjenjem"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Prenos obstoječih fotografij"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Prenos vseh obstoječih fotografij in videoposnetkov iz telefona"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Onemogočeno"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Prenos (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d od %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Začasno ustavljeno: dotaknite se, da nadaljujete"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Prenos obstoječih fotografij"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Prenos fotografij in videoposnetkov, ki še niso preneseni iz telefona v zasebni spletni album, lahko traja nekaj časa, vendar bo potekal v ozadju. Ali ste prepričani, da želite nadaljevati?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Da"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Ne"</string>
-</resources>
diff --git a/email2/res/values-sr/strings.xml b/email2/res/values-sr/strings.xml
deleted file mode 100644
index 5c102b53d..000000000
--- a/email2/res/values-sr/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Читање прилога из порука е-поште"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Омогућава апликацији да чита прилоге у порукама е-поште."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Приступ подацима о добављачу е-поште"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Омогућава да ова апликација приступа бази података е-поште, укључујући примљене поруке, послате поруке, корисничка имена и лозинке."</string>
- <string name="app_name" msgid="5815426892327290362">"Пошаљи е-поштом"</string>
- <string name="compose_title" msgid="427986915662706899">"Нова порука"</string>
- <string name="debug_title" msgid="5175710493691536719">"Отклањање грешака"</string>
- <string name="next_action" msgid="3931301986364184415">"Следеће"</string>
- <string name="okay_action" msgid="8365197396795675617">"Потврди"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Откажи"</string>
- <string name="previous_action" msgid="5181616311579820981">"Претходно"</string>
- <string name="send_action" msgid="1729766205562446418">"Пошаљи"</string>
- <string name="reply_action" msgid="4262472229221507619">"Одговори"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Одговори свима"</string>
- <string name="delete_action" msgid="8421026208288857155">"Избриши"</string>
- <string name="forward_action" msgid="669174181042344116">"Проследи"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Додај звездицу"</string>
- <string name="done_action" msgid="7497990549515580249">"Готово"</string>
- <string name="create_action" msgid="3062715563215392251">"Направи нови"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Избриши"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Нема брзих одговора."</string>
- <string name="discard_action" msgid="6532206074859505968">"Одбаци"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Сачувај недов. пор."</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Уметни брзи одговор"</string>
- <string name="read_action" msgid="4701484794504781686">"Означи као прочитано"</string>
- <string name="unread_action" msgid="6280399049357552826">"Означи као непрочитано"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Додај звездицу"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Уклони звездицу"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Освежи"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Додај налог"</string>
- <string name="compose_action" msgid="4045702519637388045">"Нова порука"</string>
- <string name="search_action" msgid="6325101454876682308">"Претрага"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Подешавања налога"</string>
- <string name="settings_action" msgid="6334807007967459412">"Подешавања"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Опције синхронизације"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Означи као непрочитано"</string>
- <string name="move_action" msgid="3059189775933985898">"Премести"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Додај Cc/Bcc"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Приложи датотеку"</string>
- <string name="close_action" msgid="533058985745238100">"Затвори"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Пошаљи све поруке"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Одаберите прилог"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Премести у"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Учитавање порука…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Проблем са везом."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Није могуће учитати текст поруке. Порука је можда превелика за приказ."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Премештање поруке"</item>
- <item quantity="other" msgid="371256717624461324">"Премештање порука"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Премештање није подржано на POP3 налозима."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Премештање није могуће зато што избор обухвата више налога."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Поруке у директоријумима Недовршене, За слање и Послате није могуће премештати."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"Непрочитане поруке: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"Непрочитане поруке: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"Непрочитане поруке: <xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"на <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> налога"</item>
- <item quantity="other" msgid="2723797835410343458">"на <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> налога"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"коме: <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"Нових порука: <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Сви налози"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> налог"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> налога"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Примљене"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"За слање"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Недовршене"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Отпад"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Послате"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Безвредне"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Непрочитано"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Пријемно сандуче (непрочитане)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Пријемно сандуче (све)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Комбиновани приказ (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> налог"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> налога"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Верзија: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Пријемно сандуче"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Са звездицом"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Недовршене"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"За слање"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Комбиновани приказ"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Прикажи све директоријуме"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Налози"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Недавни директоријуми (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Сви директоријуми"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Недавни директоријуми"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Наслов"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Без наслова"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Учитај још порука"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"Изабраних: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="7901361399231876038">"Изабраних: <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Нема порука"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Коме"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Копија"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Скривена копија"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Наслов"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Од:"</string>
- <string name="to" msgid="4392614766835725698">"Коме"</string>
- <string name="cc" msgid="7017720927911078193">"Копија"</string>
- <string name="bcc" msgid="3098643138241111579">"Скривена копија"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Наслов"</string>
- <string name="body_hint" msgid="4279864165439577668">"Напишите поруку е-поште"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Изворна порука --------"\n"Наслов: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Од: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Коме: <xliff:g id="TO">%3$s</xliff:g>"\n"Копија: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> је написао/ла:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Уврсти наведени текст"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Укључи текст"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Додајте најмање једног примаоца."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Поједине адресе е-поште су неважеће."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Датотека је превелика за прилог."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Уметање брзих одговора"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> и још <xliff:g id="NUMBER">%2$d</xliff:g> других"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Коме:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Копија:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Скривена копија:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Датум:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Од:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Наслов:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Прикажи"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Инсталирај"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Пусти"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Учитај"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Инфо."</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Сачувај"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Сачувано"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Заустави"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Прилог је сачуван као <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Није могуће сачувати прилог."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Неки од прилога у прослеђеној поруци ће бити преузети пре слања."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Порука"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Позови"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Прилог <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Прилози <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Прикажи слике"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Увек приказуј"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Увек приказуј слике овог пошиљаоца"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Слике овог пошиљаоца ће аутоматски бити приказане."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Прикажи у календару"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Позивница за Календар"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Идете ли?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Да"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Можда"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Не"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Прихватили сте ову позивницу."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"На ову позивницу сте одговорили са „можда“."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Одбили сте ову позивницу."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Приказ детаља"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Детаљи поруке"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Информације о прилогу"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Потребна је Wi-Fi веза"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Wi-Fi подешавања"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Подешавања апликације"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Није могуће отворити прилог."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Не можете да сачувате или отворите ову датотеку јер овај тип прилога можда садржи злонамерни софтвер."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Овај прилог није могуће сачувати или отворити због смерница за безбедност овог налога."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Овај прилог је превелик да бисте га преузели преко мобилне мреже. Можете да га преузмете када се следећи пут повежете са Wi-Fi мрежом."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Нема инсталиране апликације која може да отвори овај прилог. Покушајте да преузмете одговарајућу апликацију са Android Market-а."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Овај прилог је апликација. Морате да проверите Непознате изворе у менију Подешавања &gt; Апликације да бисте могли да га инсталирате."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Није могуће инсталирати апликације директно из порука е-поште. Најпре сачувајте ову апликацију, а затим је инсталирајте помоћу апликације Преузимања."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Није могуће преузети прилог."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Дошло је до грешке при декодирању поруке."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Преглед датотеке <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Желите да избришете ову поруку?"</item>
- <item quantity="other" msgid="4437637377522896262">"Желите да избришете ове поруке?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Порука је избрисана."</item>
- <item quantity="other" msgid="6574961322865652255">"Поруке су избрисане."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Порука је одбачена."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Порука је сачувана као недовршена."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Није могуће приказати прилог."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Није могуће учитати прилог „<xliff:g id="FILENAME">%s</xliff:g>“."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Отварање поруке…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> порука је премештено у <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> порука је премештено у <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Није могуће проследити један или више прилога."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Прилог није прослеђен"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Пријављивање на налог <xliff:g id="ACCOUNT_NAME">%s</xliff:g> није успело."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Пријављивање није могуће"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> kB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Новије"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Старије"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Подешавање налога"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Налог е-поште"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Можете да подесите налог у свега неколико корака."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Адреса е-поште"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Лозинка"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Подразумевано шаљи е-пошту са овог налога"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ручно подешавање"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Унесите важећу адресу е-поште и лозинку."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Дуплирани налог"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Већ користите ово корисничко име за налог „<xliff:g id="DUPLICATE">%s</xliff:g>“."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Ова лозинка почиње или се завршава једним размаком или више њих. Многи сервери не подржавају лозинке са размацима."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Преузимање информација о налогу је у току…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"У току је провера подешавања сервера за долазну пошту…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"У току је провера подешавања одлазног сервера…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Подешавање налога"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Налог је подешен и е-пошта стиже!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Именујте овај налог (опционално)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Ваше име (приказано у одлазним порукама)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Ово поље не сме да буде празно."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Подешавање налога"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Тип налога"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Који је ово тип налога?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Подешавање налога"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Подешавања сервера за долазну пошту"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Корисничко име"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Лозинка"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Сервер"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Порт"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Тип безбедности"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ништа"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Прихвати све сертификате)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (прихвати све сертификате)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Бриши поруке е-поште са сервера"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Никад"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Када избришем из пријемног сандучета"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"префикс IMAP путање"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Опционално"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Подешавање налога"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Подешавања сервера за одлазну пошту"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP сервер"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Порт"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Тип безбедности"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Захтевај пријављивање"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Корисничко име"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Лозинка"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Подешавање налога"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Подешавања сервера"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Сервер"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Домен/корисничко име"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Користите безбедну везу (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Прихвати све SSL сертификате"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Сертификат клијента"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Изабери"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Користи сертификат клијента"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Уклони"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Ниједан"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ИД мобилног уређаја"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Подешавања налога"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Опције налога"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Учесталост провере пријемног сандучета"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Никад"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Аутоматски (Push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Сваких 5 минута"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Сваких 10 минута"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Сваких 15 минута"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Сваких 30 минута"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"На сваких сат времена"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Подразумевано шаљи е-пошту са овог налога"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Обавести ме о пријему е-поште"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Синхронизуј контакте са овог налога"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Синхронизуј календар са овог налога"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Синхронизуј е-пошту са овог налога"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Аутоматски преузми прилоге када је успостављена веза са Wi-Fi мрежом"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Није могуће довршити"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Дани за синхронизацију"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Аутоматски"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Један дан"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Три дана"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Недељу дана"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Две недеље"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Месец дана"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Све"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Користи подр. под. налога"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Корисничко име или лозинка су нетачни."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Корисничко име или лозинка нису тачни."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Безбедно повезивање са сервером није могуће."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Безбедно повезивање са сервером није могуће."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Сертификат клијента је обавезан. Да ли желите да се повежете са сервером са сертификатом клијента?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Сертификат је неважећи или недоступан."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Сервер је одговорио грешком. Проверите корисничко име и лозинку, а затим покушајте поново."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Повезивање са сервером није могуће."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Повезивање са сервером није могуће."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS је захтеван, али га сервер не подржава."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Сервер не подржава методе потврде аутентичности."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Није могуће отворити везу са сервером због безбедносне грешке."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Није могуће отворити везу са сервером."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Унели сте нетачну адресу сервера или сервер захтева верзију протокола коју Е-пошта не подржава."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Немате дозволу за синхронизацију са овим сервером. Контактирајте администратора сервера за више информација."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Удаљено безбедносно администрирање"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Сервер <xliff:g id="SERVER">%s</xliff:g> захтева да му омогућите удаљену контролу појединих безбедносних функција Android уређаја. Желите ли да завршите подешавање овог налога?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Овај сервер захтева безбедносне функције које Android уређај не подржава, укључујући: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Не можете да промените корисничко име налога. Да бисте додали налог са другим корисничким именом, додирните Додај налог."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"УПОЗОРЕЊЕ: Деактивирањем овлашћења апликације Е-пошта за управљање уређајем избрисаћете све налоге е-поште који то·захтевају, заједно са адресом е-поште, контактима, догађајима календара и другим подацима."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Безбедносно ажурирање"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> захтева да ажурирате безбедносна подешавања."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Налог „<xliff:g id="ACCOUNT">%s</xliff:g>“ не може да се синхронизује због безбедносних захтева."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Потребно је ажурирати безбедносна подешавања за налог „<xliff:g id="ACCOUNT">%s</xliff:g>“."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Промењена су безбедносна подешавања налога „<xliff:g id="ACCOUNT">%s</xliff:g>“; није потребна ниједна радња корисника."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Потребно је безбедн. ажурирање"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Безбедн. смернице су промењене"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Безбед. смернице нису испуњене"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Безбедност уређаја"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Сервер <xliff:g id="SERVER">%s</xliff:g> захтева да му омогућите удаљену контролу појединих безбедносних функција Android уређаја."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Измени детаље"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"„<xliff:g id="ACCOUNT">%s</xliff:g>“ захтева да промените PIN или лозинку за закључавање екрана."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">" Лозинка за екран истиче"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"PIN или лозинка за закључавање екрана су истекли."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Лозинка за екран је истекла"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Лозинка за закључавање екрана истиче"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Потребно је да ускоро промените PIN или лозинку за закључавање екрана или ће подаци за налог <xliff:g id="ACCOUNT">%s</xliff:g> бити избрисани. Да ли желите да их сада промените?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Лозинка за закључавање екрана је истекла"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Подаци за налог <xliff:g id="ACCOUNT">%s</xliff:g> се бришу са уређаја. Можете да их вратите ако промените PIN или лозинку за закључавање екрана. Желите ли да их промените сада?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Желите ли да одбаците несачуване промене?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Пријављивање није могуће"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Корисничко име или лозинка за налог <xliff:g id="ACCOUNT">%s</xliff:g> нису тачни. Да ли желите да их ажурирате сада?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Подразумевани налог"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Подразумевано шаљи поруке е-поште са овог налога"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Преузми прилоге"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Аутоматско преузимање прилога за недавне поруке преко Wi-Fi-ја"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Обавештења е-поштом"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Синхронизација учесталости, обавештења итд."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Пошаљи обавештење када стигне е-пошта"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Учесталост провере пријемног сандучета"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Подешавања долазећих"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Корисничко име, лозинка и друга подешавања серв. долазне поште"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Подешавања одлазних"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Корисничко име, лозинка и друга подешавања серв. одлазне поште"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Примењене смернице"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ниједно"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Неподржане смернице"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ниједно"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Покушај да синхронизујеш"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Додирните овде да бисте синхронизовали налог"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Име налога"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Ваше име"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Потпис"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Брзи одговори"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Измените текст који често умећете при писању е-поште"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Додајте текст порукама које шаљете"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Подешавања обавештења"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Коришћење података"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Безбедносне смернице"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Измена брзог одговора"</string>
- <string name="save_action" msgid="1988862706623227093">"Сачувај"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Синхронизација контаката"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Синхронизуј контакте за овај налог"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Синхронизација календара"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Синхр. дог. календара за овај налог"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Синхронизуј е-пошту"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Синхронизуј е-пошту за овај налог"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Вибрација"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Вибрирај и када стигне порука е-поште"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Увек"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Само у нечујном режиму"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Никад"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Вибрација"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Изабери мелодију звона"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Подешавања сервера"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Уклони налог"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Налог „<xliff:g id="ACCOUNT">%s</xliff:g>“ биће уклоњен из е-поште."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Уклони налог"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Уклони налог"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Опције синхронизације"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Опције синхронизације (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Подешавања сихронизације"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Провери фреквенцију"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Дани за синхронизацију"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Е-пошта"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Бирање налога"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Избор директоријума"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Налог није пронађен. Можда је уклоњен."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Директоријум није пронађен. Можда је уклоњен."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Само неки „Плус“ налози подржавају приступ преко POP протокола, што омогућава повезивање овог програма. Ако не можете да се пријавите користећи тачну адресу е-поште и лозинку, можда немате плаћени „Плус“ налог. Покрените веб прегледач да бисте приступили овим налозима е-поште."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Пре него што подесите овај налог е-поште, посетите T-Online веб сајт и направите лозинку за приступ е-пошти преко POP3 протокола."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Corporate"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Није могуће отворити налог. Покушајте поново."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Пошаљи е-поштом"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Омогућава безбедносне смернице за одређене сервере"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Претражује се <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> резултата од <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> резултата са домена <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Подешавања"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Општа подешавања"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Апликација"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Аутоматски пређи"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Избор екрана који желите да прикажете након брисања поруке"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Сакриј поља за потврду"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"На листама порука додирните и задржите да бисте изабрали"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Потврди пре брисања"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Поруке"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Потврди пре слања"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Поруке"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Пређи на"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Новија порука"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Старија порука"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Листа порука"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Величина текста поруке"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Сићушан текст"</item>
- <item msgid="4415205108584620118">"Мали текст"</item>
- <item msgid="4550219696381691112">"Текст нормалне величине"</item>
- <item msgid="6227813549949219991">"Велики текст"</item>
- <item msgid="1197917420815786571">"Огроман текст"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Величина текста поруке"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Мајушно"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Мало"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Нормалан"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Велика"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Огромно"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Одговори свима"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Постављање опције „Одговори свима“ као подразумеване за одговоре"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Захтев за приказивање слика"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Слике из порука се неће аутоматски приказивати"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Избор опције „Прикажи слике“ је опозван."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> од <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Чека се синхронизација"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Адреса е-поште ће се ускоро приказати."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Додирните икону за промену."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Комбиноване Примљене"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Непрочитане"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Са звездицом"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Учитавање…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Додирните да бисте подесили."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Још увек нисте подесили налог е-поште."</string>
- <string name="more_than_999" msgid="8704425397397918798">"&gt;999"</string>
- <string name="search_hint" msgid="2200412192574686497">"Search email"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Претражите <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Резултати претраге за „<xliff:g id="ID_1">%1$s</xliff:g>“"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Чека се на резултате"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Неким серверима је потребно доста времена."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Директоријуми"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Онемогући коришћење камере уређаја"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Захтевај лозинку за уређај"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Ограничи пон. коришћење недавних лозинки"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Захтевај да лозинке истекну"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Захтевај неакт. уређај за закљ. екрана"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Ограничи број синхронизованих догађаја календара"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Ограничи број синхронизованих порука е-поште"</string>
- <string name="quick_1" msgid="3426057697353380951">"Хвала!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Добра идеја!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Прочитаћу ово касније и јавити вам."</string>
- <string name="quick_4" msgid="3988974084396883051">"Хајде да организујемо састанак како бисмо о овоме разговарали."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Синхронизација у позадини за овај налог је онемогућена у ромингу."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Слање одговора..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Нема порука."</string>
-</resources>
diff --git a/email2/res/values-sr/uploader.xml b/email2/res/values-sr/uploader.xml
deleted file mode 100644
index 752d7d033..000000000
--- a/email2/res/values-sr/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Инстант отпремање"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Албум за Инстант отпремање"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Отпремање"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Завршено"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Паузирано"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d фотографије(а) • %3$d видео сним(а)ка"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d фотографије(а) • %2$d видео сним(а)ка"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"слаба батерија"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"премашена је квота за фотографије"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"роминг"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"чека се WiFi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"одложено до пуњења"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"чека се веза"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"поновни покушај за %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Прикажи отпремања на чекању"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Прикажи довршена отпремања"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Прикажи на мрежи"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Прикажи отпремања на чекању"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Сакриј отпремања на чекању"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Прикажи детаље"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Сакриј детаље"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Подешавања"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Отпремљено %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Налог"</string>
- <string name="upload" msgid="2615541458361216022">"Отпреми"</string>
- <string name="ok" msgid="2516349681897895312">"Потврди"</string>
- <string name="cancel" msgid="1207103189404543868">"Откажи"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Отпремање на "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" за корисника "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s „%2$s“"</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Покретање отпремања није успело."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Датотека није доступна."</string>
- <string name="account_error" msgid="1904775271866104941">"Преузимање информација о налогу није успело."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Дошло је до проблема приликом пријављивања на налог."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Чека се поновни покушај"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Чека се WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Отпремање"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Није успело"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Завршено"</string>
- <string name="pause_state_running" msgid="711411177620353982">"отпремање"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"ручно паузирано"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"паузирано – слаба батерија"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"паузирано – одложено до пуњења"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"паузирано – чека се веза"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"паузирано – премашена је квота Picasa веб албума"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"паузирано – чека се wifi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"паузирано – роминг"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"чека се поновни покушај"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 минут"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 минута"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 минута"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Није успостављена веза за пренос података"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Налог је премашио квоту за диск"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Датотека није пронађена"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Грешка у услузи"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Грешка на мрежи"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Потврда аутентичности није успела"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Отпремања на чекању [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Довршена отпремања [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Паузирај отпремања"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Настави отпремања"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Отпреми одмах"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Отпреми касније"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Не отпремај"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Прикажи"</string>
- <string name="manager_retry" msgid="939534318469518843">"Покушај поново"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Отпремање је отказано"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Отпремање је већ завршено"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Синхронизуј све"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Последња синхронизација:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Листа довршених ставки је празна."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Инстант отпремање"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Отпремања су завршена"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Отпремања су паузирана"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Инстант отпремањe још увек није активирано"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Велике датотеке ће се отпремати само преко WiFi везе."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Скенирање у потрази за датотекама..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Припрема <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> фотографије(а) и <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> видео сним(а)ка за отпремање..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Није потребно отпремање додатних фотографија/видео снимака."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Дошло је до проблема у комуникацији са сервером. Покушајте поново касније."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Синхронизуј све отказано"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Синхронизација свих ставки"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Приказ је довршен"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Приказ на чекању"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Опште информације"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Паузирање свих отпремања"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Напајање"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Отпремај само када се телефон пуни."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Отпреми само када је Wi-Fi мрежа доступна."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Фотографије"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Налог"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Услови отпремања"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Величина фотографије"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Видео снимци"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Налог"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Налог за фотографије ће користити видео отпремања."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Услови отпремања"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"За сада се користе подешавања веза са фотографијама."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Само фотографије преко мобилних мрежа"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Фотографије и видео снимци преко мобилних мрежа"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Слике и видео само преко Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Основни подаци"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Са Инстант отпремањем"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Препоручено: 1600 пиксела (за дељење, штампање и позадине)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Оригинална величина (најспорије отпремање)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"паузирано – SD картица је недоступна"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD картица је недоступна"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Подешавања Инстант отпремања"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Инстант отпремање"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Аутоматско отпремање нових фотографија и видео снимака у приватни веб албум"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Статус отпремања"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Напредна подешавања"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Отпремања са мобилног уређаја"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Отпремања у ромингу"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Отпремање фотографија и видео снимака када сте у ромингу преко мреже за пренос података"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Отпремања током пуњења батерије"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Отпремање фотографија и видео снимака само током пуњења"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Отпремање постојећих фотографија"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Отпремање свих постојећих фотографија и видео снимака са телефона"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Онемогућено"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Отпремање (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d од %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Паузирано: додирните да бисте наставили отпремање"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Отпремање постојећих фотографија"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Отпремање фотографија и видео снимака који нису до сада отпремљени са телефона у приватни албум на Вебу може мало да потраје, али ће се обавити у позадини. Да ли заиста желите да наставите?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Да"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Не"</string>
-</resources>
diff --git a/email2/res/values-sv/strings.xml b/email2/res/values-sv/strings.xml
deleted file mode 100644
index ad491cae1..000000000
--- a/email2/res/values-sv/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Läs bilagor i e-postmeddelanden"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Tillåter att appen läser bilagor i e-postmeddelanden."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Använd data från e-postleverantören"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Tillåter att appen kommer åt e-postdatabasen med bland annat mottagna meddelanden, skickade meddelanden, användarnamn och lösenord."</string>
- <string name="app_name" msgid="5815426892327290362">"E-post"</string>
- <string name="compose_title" msgid="427986915662706899">"Skriv"</string>
- <string name="debug_title" msgid="5175710493691536719">"Felsökning"</string>
- <string name="next_action" msgid="3931301986364184415">"Nästa"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Avbryt"</string>
- <string name="previous_action" msgid="5181616311579820981">"Föregående"</string>
- <string name="send_action" msgid="1729766205562446418">"Skicka"</string>
- <string name="reply_action" msgid="4262472229221507619">"Svara"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Svara alla"</string>
- <string name="delete_action" msgid="8421026208288857155">"Ta bort"</string>
- <string name="forward_action" msgid="669174181042344116">"Framåt"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Stjärnmärk"</string>
- <string name="done_action" msgid="7497990549515580249">"Klar"</string>
- <string name="create_action" msgid="3062715563215392251">"Skapa nytt"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Ta bort"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Inga snabba svar."</string>
- <string name="discard_action" msgid="6532206074859505968">"Släng"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Spara utkast"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Infoga snabbsvar"</string>
- <string name="read_action" msgid="4701484794504781686">"Markera som läst"</string>
- <string name="unread_action" msgid="6280399049357552826">"Markera som oläst"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Lägg till stjärna"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Ta bort stjärna"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Uppdatera"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Lägg till konto"</string>
- <string name="compose_action" msgid="4045702519637388045">"Skriv"</string>
- <string name="search_action" msgid="6325101454876682308">"Sök"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Kontoinställningar"</string>
- <string name="settings_action" msgid="6334807007967459412">"Inställningar"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Synkroniseringsalternativ"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Markera som oläst"</string>
- <string name="move_action" msgid="3059189775933985898">"Flytta"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+kopia/heml kop"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Lägg till kopia/hemlig kopia"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Bifoga fil"</string>
- <string name="close_action" msgid="533058985745238100">"Stäng"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Skicka meddelanden"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Välj bilaga"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Flytta till"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Läser in meddelanden…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Anslutningsproblem."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Det gick inte att läsa in meddelandetexten. Meddelandet kan vara för stort för att visas."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Flytta meddelandet"</item>
- <item quantity="other" msgid="371256717624461324">"Flytta meddelanden"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"POP3-konton har inte stöd för att flytta meddelanden."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Det går inte att flytta meddelandena. De markerade objekten kommer från flera olika konton."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Det går inte att flytta meddelanden i Utkast, Utkorgen och Skickade."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> oläst (<xliff:g id="ACCOUNT">%2$s</xliff:g>"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> oläst (<xliff:g id="ACCOUNT">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> oläst (<xliff:g id="ACCOUNT">%2$s</xliff:g>"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"i <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> konton"</item>
- <item quantity="other" msgid="2723797835410343458">"i <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> konton"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"till <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> nya meddelanden"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Alla konton"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> konto"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> konton"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Inkorgen"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Utkorgen"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Utkast"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Papperskorgen"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Skickat"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Skräp"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Olästa"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Inkorg (olästa)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Inkorg (alla)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Kombinerad vy (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> konto"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> konton"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Version: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Inkorgen"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Stjärnmärkta"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Utkast"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Utkorgen"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Kombinerad vy"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Visa alla mappar"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Konton"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Senaste mappar (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Alla mappar"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Senaste mapparna"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Ämne"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Inget ämne"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Hämta fler meddelanden"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> markerad"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> markerade"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Inga meddelanden"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Till"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Kopia"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Hemlig kopia"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Ämne"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Från:"</string>
- <string name="to" msgid="4392614766835725698">"Till"</string>
- <string name="cc" msgid="7017720927911078193">"Kopia"</string>
- <string name="bcc" msgid="3098643138241111579">"Hemlig kopia"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Ämne"</string>
- <string name="body_hint" msgid="4279864165439577668">"Skriv ett e-postmeddelande"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Ursprungligt meddelande --------"\n"Ämne: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Från: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Till: <xliff:g id="TO">%3$s</xliff:g>"\n"Kopia: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> skrev:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Inkludera citerad text"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Inkludera text"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Lägg till minst en mottagare."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Några av e-postadresserna är ogiltiga."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Filen är för stor för att bifogas."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Infoga snabbsvar"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> och <xliff:g id="NUMBER">%2$d</xliff:g> andra"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Till:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Kopia:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Hemlig kopia:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Datum:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Från:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Ämne:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Visa"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Installera"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Spela upp"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Läs in"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Info"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Spara"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Sparad"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stoppa"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Bilagan har sparats som <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Kunde inte spara bilagan."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"En eller flera bilagor i det vidarebefordrade meddelandet hämtas innan de skickas."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Meddelande"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Bjud in"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Bilaga <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Bilagor <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Visa bilder"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Visa alltid"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Visa alltid bilder från den här avsändaren"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Bilder från den här avsändaren visas automatiskt."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Visa i Kalender"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Kalenderinbjudan"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Delta?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Ja"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Kanske"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Nej"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Du har accepterat inbjudan."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Du har svarat Kanske på den här inbjudan."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Du har tackat nej till inbjudan."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Visa information"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Meddelandeinfo"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Information om bifogad fil"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Wi-Fi-anslutning krävs"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Wi-Fi-inställningar"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Appinställningar"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Det går inte att öppna den bifogade filen."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Du kan inte spara eller öppna filen eftersom denna typ av bilaga kan innehålla skadlig programvara."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Det går inte att spara eller öppna bilagan på grund av kontots säkerhetsprinciper."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Den bifogade filen är så stor att du inte kan hämta den via det mobila nätverket. Du kan hämta den nästa gång som enheten ansluts till ett Wi-Fi-nätverk."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Det finns ingen installerad app som kan öppna den här bilagan. Prova att hämta en lämplig app från Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Den här bilagan är en app. Du måste markera Okända källor i Inställningar &gt; Appar innan du kan installera den."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Appar kan inte installeras direkt från e-post. Spara först appen och installera den sedan med appen Hämtningar."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Det gick inte att hämta bilagan."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Ett fel inträffade när meddelandet avkodades."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Visar <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Vill du ta bort meddelandet?"</item>
- <item quantity="other" msgid="4437637377522896262">"Vill du ta bort meddelandena?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Meddelandet tas bort."</item>
- <item quantity="other" msgid="6574961322865652255">"Meddelandena har tagits bort."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Meddelandet slängs."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Meddelande sparat som utkast."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Det går inte att visa bilagan."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Det gick inte att läsa in bilagan <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Meddelandet öppnas..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> meddelandet har flyttats till <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> meddelanden har flyttats till <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Det gick inte att vidarebefordra en eller flera bilagor."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Bilagan vidarebefordrades inte"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Det gick inte att logga in <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Det gick inte att logga in."</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Nyare"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Äldre"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Kontoinställningar"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"E-postkonto"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Du kan konfigurera ditt konto med några få steg."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-postadress"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Lösenord"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Skicka e-post från det här kontot som standard"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuell inställning"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Ange en giltig e-postadress och lösenord."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dubblettkonto"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Du använder redan det här användarnamnet för kontot <xliff:g id="DUPLICATE">%s</xliff:g>."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Det här lösenordet inleds eller avslutas med ett eller flera mellanslag. Många servrar saknar stöd för lösenord med mellanslag."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Hämtar kontoinformation…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Kontrollerar inkommande serverinställningar…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Kontrollerar utgående serverinställningar…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Kontoinställningar"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Ditt konto är färdigt och snart kan du skicka och ta emot e-postmeddelanden."</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Ge kontot ett namn (valfritt)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Ditt namn (visas för utgående meddelanden)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Fältet får inte vara tomt."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Kontoinställningar"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Kontotyp"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Vilken typ av konto är det här?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Kontoinställningar"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Inkommande serverinställningar"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Användarnamn"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Lösenord"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Säkerhetstyp"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ingen"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (acceptera alla certifikat)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (acceptera alla certifikat)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Ta bort e-post från servern"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Aldrig"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"När jag tar bort något från min Inkorg"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP-sökvägsprefix"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Valfritt"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Kontoinställningar"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Utgående serverinställningar"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-server"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Säkerhetstyp"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Kräv inloggning"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Användarnamn"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Lösenord"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Kontoinställningar"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Serverinställningar"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Server"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domän\\Användarnamn"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Använd säker anslutning (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Acceptera alla SSL-certifikat"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Klientcertifikat"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Välj"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Använd klientcertifikat"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Ta bort"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Inga"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Den mobila enhetens ID"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Kontoinställningar"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Kontoalternativ"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Intervall för e-postkontroll"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Aldrig"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Automatiskt (push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Var 5:e minut"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Var 10:e minut"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Var 15:e minut"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Var 30:e minut"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Varje timme"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Skicka e-post från det här kontot som standard"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Meddela mig när jag får e-post"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synkronisera kontakter från det här kontot"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synkronisera kalendern från det här kontot"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synkronisera e-post från det här kontot"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Hämta bilagor automatiskt när enheten är ansluten till Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Det gick inte att avsluta"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dagar för synkronisering"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatisk"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"En dag"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tre dagar"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"En vecka"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Två veckor"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"En månad"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Alla"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Använd standardinställning"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Användarnamnet eller lösenordet är felaktigt."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Felaktigt användarnamn eller lösenord."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Det går inte att upprätta en säker anslutning till servern."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Det går inte att upprätta en säker anslutning till servern."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Ett klientcertifikat måste anges. Vill du ansluta till servern med ett klientcertifikat?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certifikatet är ogiltigt eller otillgängligt."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Servern svarade med ett fel. Kontrollera ditt användarnamn och lösenord och försök igen."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Det går inte att ansluta till servern."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Det går inte att ansluta till servern."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS krävs men stöds inte av servern."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Servern stöder inte autentiseringsmetoderna."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Det gick inte att ansluta till servern på grund av ett säkerhetsfel."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Det gick inte att ansluta till servern."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Du angav en felaktig serveradress eller så kräver servern en protokollversion som inte stöds av e-postklienten."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Du är inte behörig att synkronisera med servern. Kontakta serverns administratör om du vill ha mer information."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Fjärradministrera säkerhet"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Servern <xliff:g id="SERVER">%s</xliff:g> måste kunna fjärrkontrollera vissa säkerhetsfunktioner i din Android-enhet. Vill du slutföra konfigurationen av kontot?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Den här servern kräver säkerhetsfunktioner som din Android-enhet inte stöder, inklusive: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Det går inte att ändra användarnamnet för ett konto. Om du vill lägga till ett konto med ett annat användarnamn trycker du på Lägg till konto."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"VARNING! Om du inaktiverar e-postappens behörighet att administrera enheten raderas alla e-postkonton som behöver behörigheten. Även e-post, kontakter, kalenderhändelser och andra data raderas."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Säkerhetsuppdatering"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Enligt <xliff:g id="ACCOUNT">%s</xliff:g> måste du uppdatera säkerhetsinställningarna."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Det går inte att synkronisera kontot <xliff:g id="ACCOUNT">%s</xliff:g> på grund av säkerhetskrav."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Säkerhetsinställningarna måste uppdateras för kontot <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Säkerhetsinställningarna ändrades för kontot <xliff:g id="ACCOUNT">%s</xliff:g>. Inga åtgärder krävs från användaren."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Säkerhetsuppdatering krävs"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Säkerhetspolicyer har ändrats"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Säkerhetspolicy kan ej följas"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Säkerhet för enhet"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Servern <xliff:g id="SERVER">%s</xliff:g> måste kunna fjärrkontrollera vissa säkerhetsfunktioner i din Android-enhet."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Redigera information"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"Enligt <xliff:g id="ACCOUNT">%s</xliff:g> måste du ändra PIN-kod eller lösenord till skärmlåset."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Skärmlösenordet går snart ut"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"PIN-koden eller lösenordet till skärmlåset har gått ut."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Skärmlösenordet har gått ut"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Skärmlåslösenordet går ut inom kort"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Du måste ändra PIN-kod eller lösenord för skärmlåset snart, annars raderas data för kontot <xliff:g id="ACCOUNT">%s</xliff:g>. Vill du ändra nu?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Skärmlåslösenordet har gått ut"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Alla data för <xliff:g id="ACCOUNT">%s</xliff:g> tas bort från enheten. Du kan återställa dem genom att ändra PIN-koden eller lösenordet för skärmlåset. Vill du göra det nu?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Vill du ignorera ändringar som inte har sparats?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Det gick inte att logga in."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Användarnamnet eller lösenordet för <xliff:g id="ACCOUNT">%s</xliff:g> är felaktigt. Vill du uppdatera dem nu?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Standardkonto"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Skicka e-post från det här kontot som standard"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Hämta bilagor"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Hämta automatiskt bilagor för de senaste meddelandena via Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"E-postaviseringar"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Synkroniseringsfrekvens, aviseringar osv."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Skicka meddelande när du får e-post"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Intervall för e-postkontroll"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Inkommande inställningar"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Användarnamn, lösenord och andra inkommande serverinställningar"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Utgående inställningar"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Användarnamn, lösenord och andra utgående serverinställningar"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Verkställda policyer"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Inga"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Policyer som inte stöds"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Inga"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Synkroniseringsförsök"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Tryck här för att synkronisera kontot"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Kontonamn"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Ditt namn"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Signatur"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Snabbsvar"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Redigera text som du ofta infogar när du skriver e-post"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Lägg till text i meddelanden som du skickar"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Meddelandeinställningar"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Dataanvändning"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Säkerhetspolicyer"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Redigera snabbsvar"</string>
- <string name="save_action" msgid="1988862706623227093">"Spara"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synkronisera kontakter"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synkronisera kontakter för det här kontot"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synkronisera kalender"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synka kalenderhändelse för kontot"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synkronisera e-post"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synkronisera e-post för det här kontot"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrera"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibrerar även vid inkommande e-post"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Alltid"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Bara vid tyst"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Aldrig"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Vibrera"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Välj ringsignal"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Serverinställningar"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Ta bort konto"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Kontot <xliff:g id="ACCOUNT">%s</xliff:g> tas bort från E-post."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Ta bort konto"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Ta bort konto"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Synkroniseringsalternativ"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Synkroniseringsalternativ ( <xliff:g id="MAILBOXX_NAME">%s</xliff:g> )"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Synkroniseringsinställningar"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Intervall för kontroll"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Dagar för synkronisering"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Epostkonto"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Välj ett konto"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Välj en mapp"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Kontot hittades inte. Det kan ha tagits bort."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Mappen hittades inte. Den kan ha tagits bort."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"POP-åtkomst, som gör att denna app kan ansluta, ingår bara i vissa pluskonton. Om det inte går att logga in med rätt e-postadress och lösenord kanske du inte har betalat för ett pluskonto. Öppna webbläsaren igen om du vill få åtkomst till dessa e-postkonton."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Innan du skapar e-postkontot besöker du T-Onlines webbplats och skapar ett lösenord för POP3-åtkomst till e-post."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Företag"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Det gick inte att skapa kontot. Försök igen."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-post"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Aktiverar serverangivna säkerhetsprinciper"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Söker <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> resultat från <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultat från <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Inställningar"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Allmänna inställningar"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"App"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Flytta automatiskt"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Välj vilken skärm som ska visas när du tar bort ett meddelande"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Dölj kryssrutor"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"I samtalslistan trycker du länge om du vill markera"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Bekräfta innan du tar bort"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Meddelanden"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Bekräfta innan du skickar"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Meddelanden"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Flytta till"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Nyare meddelande"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Äldre meddelande"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Meddelandelista"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Storlek på text i meddelande"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Pytteliten text"</item>
- <item msgid="4415205108584620118">"Liten text"</item>
- <item msgid="4550219696381691112">"Normalstor text"</item>
- <item msgid="6227813549949219991">"Stor text"</item>
- <item msgid="1197917420815786571">"Jättestor text"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Storlek på text i meddelande"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Pytteliten"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Liten"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Stor"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Jättestor"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Svara alla"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Använd Svara alla som standard vid svar på meddelanden"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Fråga om bilder ska visas"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Bilder i meddelanden kommer inte att visas automatiskt"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Visa bilder\" rensas."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Väntar på synk"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Din e-post visas snart."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Tryck för att ändra."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Kombinerad inkorg"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Olästa"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Stjärnmärkt"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Läser in..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Tryck här för att konfigurera."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Du har ännu inte skapat ett e-postkonto."</string>
- <string name="more_than_999" msgid="8704425397397918798">"&gt;999"</string>
- <string name="search_hint" msgid="2200412192574686497">"Sök efter e-post"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Sök i <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Sökresultat för <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Väntar på resultat"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Vissa servrar kan ta lång tid."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mappar"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Tillåt inte användning av kameran"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Kräv lösenord för enheten"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Begränsa återanvändning av lösenord"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Kräv att lösenord upphör att gälla"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Kräv låst skärm på inaktiva enheter"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Begränsa antalet kalenderhändelser som synkas"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Begränsa antalet e-postmeddelanden som synkas"</string>
- <string name="quick_1" msgid="3426057697353380951">"Tack!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Låter bra!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Jag läser detta senare och återkommer till dig."</string>
- <string name="quick_4" msgid="3988974084396883051">"Vi kan diskutera detta på ett möte."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Bakgrundssynkronisering för det här kontot har inaktiverats vid roaming."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Svaret skickas ..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Inga meddelanden."</string>
-</resources>
diff --git a/email2/res/values-sv/uploader.xml b/email2/res/values-sv/uploader.xml
deleted file mode 100644
index f3b3b1ee7..000000000
--- a/email2/res/values-sv/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Direktöverföring"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Album för direktöverföring"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Överför"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Slutförda"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Pausad"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d foton • %3$d videor"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d foton • %2$d videor"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"svagt batteri"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"bildkvoten har överskridits"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"väntar på Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"fördröjs tills laddaren ansluts"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"väntar på anslutning"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"försöker igen om %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Visa väntande överföringar"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Visa slutförda överföringar"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Visa online"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Visa väntande överföringar"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Dölj väntande överföringar"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Visa detaljer"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Dölj detaljer"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Inställningar"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Överförde %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Konto"</string>
- <string name="upload" msgid="2615541458361216022">"Överför"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Avbryt"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Överför till "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" för "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Det gick inte att initiera överföringen."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Filen är inte tillgänglig."</string>
- <string name="account_error" msgid="1904775271866104941">"Det gick inte att ta emot kontoinformation."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Ett problem uppstod när du skulle logga in på ditt konto."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Väntar på nytt försök"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Väntar på Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Överförs"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Misslyckades"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Slutförd"</string>
- <string name="pause_state_running" msgid="711411177620353982">"överför"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"manuellt pausad"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"pausad – svagt batteri"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"pausad – fördröjs tills laddaren ansluts"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"pausad – väntar på anslutning"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"pausad - utanför PWA-kvot"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"pausad – väntar på Wi-Fi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"pausad – roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"väntar på nytt försök"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minut"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minuter"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minuter"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Ingen dataanslutning"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Kontots diskkvot är slut"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Filen hittades inte"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Fel på tjänsten"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Nätverksfel"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Autentiseringen misslyckades"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Väntande överföringar [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Slutförda överföringar [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Pausa överföringar"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Återuppta överföring"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Överför nu"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Överför senare"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Överför inte"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Visa"</string>
- <string name="manager_retry" msgid="939534318469518843">"Försök igen"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Överföringen har avbrutits"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Överföringen är redan slutförd"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Synka alla"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Senaste synkroniseringen:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Listan över slutförda objekt är tom."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Direktöverföring"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Överföring slutförd"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Paus i överföringen"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Direktöverföring har inte aktiverats än"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Stora videoklipp överförs bara via en Wi-Fi-anslutning."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Söker efter filer ..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"<xliff:g id="PHOTOCOUNT">%1$d</xliff:g> foton och <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> videor förbereds för överföring ..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Inga fler foton/videoklipp behöver överföras."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Det gick inte att kontakta servern. Försök igen senare."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Synka alla avbröts"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Synka alla"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Visa slutförda"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Visa väntande"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Allmänt"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Pausa alla överföringar"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Ladda"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Överför endast när telefonen laddas."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Överför endast när Wi-Fi är tillgängligt."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Foton"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Konto"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Villkor för överföring"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Fotostorlek"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videor"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Konto"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Kontot för foton används vid överföring av videoklipp."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Villkor för överföring"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Anslutningsinställningarna för foton används för närvarande."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Foton endast via mobila nätverk"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Överför bilder och videor via mobila nätverk"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Bilder och videor endast via Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Om"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Direktöverföring, v."</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Rekommenderas: 1600 pixlar (för delning, utskrifter och skärmsläckare)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Ursprunglig storlek (långsam överföring)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"pausad – SD-kortet är inte tillgängligt"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD-kortet är inte tillgängligt"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Direktöverf.inst."</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Direktöverföring"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Överför nya bilder och videor till ett privat webbalbum automatiskt"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Överföringsstatus"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Avancerat"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Mobilöverföringar"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Överföring vid roaming"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Överför bilder och videor under roaming"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Batteriladdning"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Överför bilder och videor endast när batteriet laddas"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Överför befintliga foton"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Överför alla befintliga bilder och videor från telefonen nu"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Inaktiverad"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Överför (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d av %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Pausad: Tryck om du vill återuppta överföringen."</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Överför befintliga foton"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Det kan ta en stund att överföra foton och videor som inte redan har överförts från mobilen till ett privat album på webben, men det sker i bakgrunden. Vill du fortsätta?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Ja"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Nej"</string>
-</resources>
diff --git a/email2/res/values-sw/strings.xml b/email2/res/values-sw/strings.xml
deleted file mode 100644
index 76008819b..000000000
--- a/email2/res/values-sw/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Soma viambatisho vya barua pepe"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Inaruhusu programu kusoma viambatisho vya barua pepe yako."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Fikia data ya mtoa huduma wa barua pepe"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Inaruhusu programu hii kufikia hifadhidata yako ya barua pepe, ikiwa ni pamoja na jumbe zilizopokewa, jumbe zilizotumwa, majina ya mtumiaji na manenosiri."</string>
- <string name="app_name" msgid="5815426892327290362">"Barua pepe"</string>
- <string name="compose_title" msgid="427986915662706899">"Tunga"</string>
- <string name="debug_title" msgid="5175710493691536719">"Tatua"</string>
- <string name="next_action" msgid="3931301986364184415">"Ifuatayo"</string>
- <string name="okay_action" msgid="8365197396795675617">"Sawa"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Ghairi"</string>
- <string name="previous_action" msgid="5181616311579820981">"Iliyotangulia"</string>
- <string name="send_action" msgid="1729766205562446418">"Tuma"</string>
- <string name="reply_action" msgid="4262472229221507619">"Jibu"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Jibu wote"</string>
- <string name="delete_action" msgid="8421026208288857155">"Futa"</string>
- <string name="forward_action" msgid="669174181042344116">"Sambaza"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Nyota"</string>
- <string name="done_action" msgid="7497990549515580249">"Kwisha"</string>
- <string name="create_action" msgid="3062715563215392251">"Unda mpya"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Futa"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Hakuna majibu ya haraka."</string>
- <string name="discard_action" msgid="6532206074859505968">"Tupa"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Hifadhi rasimu"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Ingiza jibu la haraka"</string>
- <string name="read_action" msgid="4701484794504781686">"Tia alama kuwa imesomwa"</string>
- <string name="unread_action" msgid="6280399049357552826">"Tia alama kuwa haijasomwa"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Ongeza nyota"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Ondoa nyota"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Onyesha upya"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Ongeza akaunti"</string>
- <string name="compose_action" msgid="4045702519637388045">"Tunga"</string>
- <string name="search_action" msgid="6325101454876682308">"Tafuta"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Mipangilio ya akaunti"</string>
- <string name="settings_action" msgid="6334807007967459412">"Mipangilio"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Chaguo za ulandanishi"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Tia alama kuwa haijasomwa"</string>
- <string name="move_action" msgid="3059189775933985898">"Hamisha"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Nakala kwa/Nakala fiche kwa"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Ongeza Nakala kwa/Nakala fiche kwa"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Ambatisha faili"</string>
- <string name="close_action" msgid="533058985745238100">"Funga"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Tuma barua zote"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Chagua kiambatisho"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Sogeza hadi"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Inapakia ujumbe..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Tatizo la kuunganisha."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Haikuweza kupakia ujumbe wa maandishi. Ujumbe unaweza kuwa kubwa mno kwa mtazamo."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Hamisha ujumbe"</item>
- <item quantity="other" msgid="371256717624461324">"Hamisha ujumbe"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Uhamishaji hauauniwi kwenye akaunti za POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Haiwezi kuhamisha. Uteuzi una akaunti mbalimbali."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Ujumbe katika Rasimu, Kikasha toezi na Zilizotumwa haziwezi kuhamishwa."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> haijasomwa (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> hazijasomwa (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> hazijasomwa (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"katika akaunti <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g>"</item>
- <item quantity="other" msgid="2723797835410343458">"katika akaunti <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g>"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"kwa <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"Barua <xliff:g id="ID_1">%1$d</xliff:g> mpya"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Akaunti zote"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">" Akaunti ya <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="8548760449976444566">"Akaunti <xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g>"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Kikasha"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Kikasha toezi"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Rasimu"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Tupio"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Zilizotumwa"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Taka"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Ambazo Hazijasomwa"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Kikasha (zisizosomwa)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"kikasha (zote)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Mwonekano wa pamoja (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"Akaunti <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="4145163147488719025">"Akaunti <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Toleo: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Kikasha"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Zenye nyota"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Rasimu"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Kikasha toezi"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Mwonekano wa mchanganyiko"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Onyesha folda zote"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Akaunti"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Folda <xliff:g id="EMAIL_ADDRESS">%s</xliff:g> za hivi karibuni"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Folda zote"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Folda za hivi karibuni"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Kichwa"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Hakuna kichwa"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Pakia barua zaidi"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">" <xliff:g id="MESSAGE_COUNT">%d</xliff:g> zimechaguliwa"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> zimechaguliwa"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Hakuna ujumbe"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Kwa"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Nakala kwa"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Nakala fiche kwa"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Kichwa"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Kutoka:"</string>
- <string name="to" msgid="4392614766835725698">"Kwa"</string>
- <string name="cc" msgid="7017720927911078193">"Nakala kwa"</string>
- <string name="bcc" msgid="3098643138241111579">"Nakala fiche kwa"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Kichwa"</string>
- <string name="body_hint" msgid="4279864165439577668">"Tunga barua pepe"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Ujumbe Asili --------"\n"Kichwa: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Kutoka: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Kwa: <xliff:g id="TO">%3$s</xliff:g>"\n"Nakala kwa: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> aliandika:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Jumuisha maandishi yaliyonukuliwa"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Jumuisha maandishi"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Ongeza angalau mpokeaji mmoja."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Anwani zingine za barua pepe ni batili."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Faili ni kubwa sana kuambatishwa."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Ingiza majibu ya haraka"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> na wengine <xliff:g id="NUMBER">%2$d</xliff:g>"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Kwa:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Nakala kwa:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Nakala fiche:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Tarehe:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Kutoka:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Kichwa:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Tazama"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Sakinisha"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Cheza"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Pakia"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Maelezo"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Hifadhi"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Imehifadhiwa"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Simamisha"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Kiambatisho kimehifadhiwa kama <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Haikuweza kuhifadhi kiambatisho."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Kiambatisho kimoja au zaidi katika ujumbe wako uliosambazwa kitapakuliwa kabla ya kutumwa."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Ujumbe"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Alika"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Kiambatisho <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Viambatisho <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Onyesha picha"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Onyesha kila wakati"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Daima onyesha picha kutoka kwa mtumaji huyu"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Picha kutoka kwa mtumaji huyu zitaonyeshwa moja kwa moja."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Tazama katika Kalenda"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Mwaliko wa kalenda"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Utaenda?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Ndiyo"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Labda"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" La"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Umekubali mwaliko huu."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Umejibu \"labda\" kwa mwaliko huu."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Umekataa mwaliko huo."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">" Onyesha maelezo"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Maelezo ya ujumbe"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Maelezo ya kiambatisho"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Inahitaji muunganisho wa Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Mipangilio ya mtandao-hewa"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Mipangilio ya prog"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Haiwezi kufungua kiambatisho."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Hauwezi kuhifadhi au kufungua faili hii kwa sababu ya aina hii ya kiambatisho kinaweza kuwa na programu hasidi."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"KIambatisho hiki hakiwezi kuhifadhiwa au kufunguliwa kwa sababu ya sera za usalama za akaunti hii."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Kiambataisho hiki ni kirefu mno kuweza kupakua kupitia kwa mtandao wa simu. Unaweza kuipakua wakati mwingine ukiunganisha kwa mtandao-hewa."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Hakuna prog zilizosakinishwa ambazo zinaweza kufungua kiambatisho hiki. Jaribu kupakua programu ifaayo kutoka kwa Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Kiambatisho hiki ni prog. Unapaswa kuangalia Vyanzo Visivyojulikana katika Mipangilio &amp;gt, Prog kabla uweze kuisanidi."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Prog haziwezi kusakinishwa moja kwa moja kutoka kwa barua pepe. Kwanza hifadhi programu hii na kisha isakinishe kwa kutumia programu za Upakuzi."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Haikuweza kupakia kiambatisho hiki."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Kulikuwa na hitilafu wakati wa usimbuaji wa ujumbe."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Kutazama <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Futa ujumbe huu?"</item>
- <item quantity="other" msgid="4437637377522896262">"Futa ujumbe huu?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Ujumbe umefutwa."</item>
- <item quantity="other" msgid="6574961322865652255">"Ujumbe umefutwa."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Ujumbe umetupwa."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Ujumbe umehifadhiwa kama rasimu."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Haiwezi kuonyesha kiambatisho."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Haikuweza kupakia kiambatisho hiki \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Inafungua ujumbe..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"Barua <xliff:g id="NUM_MESSAGE">%1$d</xliff:g>zimehamishwa hadi <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"Barua <xliff:g id="NUM_MESSAGE">%1$d</xliff:g> zimehamishwa hadi <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Haikuweza kusambaza kiambatisho kimoja au zaidi."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Kiambatishho hakijasambazwa"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Kuingia <xliff:g id="ACCOUNT_NAME">%s</xliff:g> hakujafaulu."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Haingeweza kuingia"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"B <xliff:g id="SIZE_IN_BYTES">%d</xliff:g>"</item>
- <item quantity="other" msgid="4613385949384337840">"B <xliff:g id="SIZE_IN_BYTES">%d</xliff:g>"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"KB <xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>"</item>
- <item quantity="other" msgid="8869993299924901593">"KB <xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"MB <xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>"</item>
- <item quantity="other" msgid="4365876866570165282">"MB <xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"GB <xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>"</item>
- <item quantity="other" msgid="1041353825053598633">"GB <xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Mpya zaidi"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Nzee zaidi"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Usanidi wa akaunti"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Akaunti ya barua pepe"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Unaweza kusanidi akaunti yako katika hatua chache tu."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Anwani ya barua pepe"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Nenosiri"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Tuma barua pepe kutoka kwa akaunti hii kama chaguo-msingi"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Usanidi wa mkono"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Tafadhali andika anwani na nenosiri halali ya barua pepe."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Akaunti Rudufu"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Tayari unatumia jina hili la mtumiaji kwa akaunti \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Nenosiri hili linaanza au kumalizika na herufi moja ya nafasi. Seva nyingi hazikubali manenosiri yenye nafasi."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Inarudisha maelezo ya akaunti"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Inakagua mipangilio ya seva inayoingia..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Inakagua mipangilio ya seva inayotoka nje..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Usanidi wa akaunti"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Akaunti yako imesanidiwa, na barua pepe iko njiani!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Ipe akaunti hii jina (ya hiari)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Jina lako (linaloonyeshwa kwenye ujumbe unaotoka)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Uga hii haiwezi kuwa tupu."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Usanidi wa akaunti"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Aina ya akaunti"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Hii ni akaunti ya aina gani ?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Usanidi wa akaunti"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Mipangilio ya seva ya kuingia"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Jina la mtumiaji"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Nenosiri"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Seva"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Mlango"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Aina ya usalama"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Hamna"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Kubali vyeti vyote)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (Kubali vyeti vyote)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Futa barua pepe kutoka kwa seva"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Katu"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Nikifuta kutoka kwa kikasha"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Kiambishi cha njia ya IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Hiari"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Usanidi wa akaunti"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Mipangilio ya seva ya kutoka"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Seva ya SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Mlango"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Aina ya usalama"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Inahitaji kuingia"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Jina la mtumiaji"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Nenosiri"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Usanidi wa akaunti"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Mipangilio ya seva"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Seva"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Kikoa\\Jina la mtumiaji"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Tumia muunganisho salama (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Kubali vyeti vyote vya SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Cheti cha mtteja"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Chagua"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Tumia cheti cha mteja"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Ondoa"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Hakuna"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Kitambulisho cha Kifaa cha Mkononi"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Mipangilio ya akaunti"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Chaguo za akaunti"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Mazoea ya kukagua kikasha"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Katu"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Kiotomatiki (Msukumo)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Kila dakika 5"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Kila dakika10"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Kila dakika 15"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Kila dakika 30"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Kila saa"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Tuma barua pepe kutoka kwa akaunti hii kama chaguo-msingi"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Niarifu wakati barua pepe inapowasili"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Landanisha anwani kutoka kwa akaunti hii"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Landanisha kalenda kutoka kwa akaunti hii"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Landanisha barua pepe kutoka kwa akaunti hii"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Pakua viambatisho kiotomatiki wakati umeunganishwa kwenye mtandao-hewa"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Imeshindwa kumaliza"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Siku hadi Usawazishaji"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Kiotomatiki"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Siku moja"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Siku tatu"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Wiki moja"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Wiki mbili"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Mwezi mmoja"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Zote"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Tumia akaunti chaguo-msingi"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Jina la mtumiaji au nenosiri sio sahihi."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Jina la mtumiaji au nenosiri si sahihi."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Haiwezi kuunganisha kwa seva kwa usalama."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Haiwezi kuunganisha kwa seva kwa usalama."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Cheti cha mteja kinahitajika. Je, unataka kuunganisha kwenye seva na cheti cha mteja?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Cheti ni batili au hakiwezi kufikiwa."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Seva ilijibu na hitilafu. Kagua jina lako la mtumiaji na nenosiri, kisha ujaribu tena."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Haiwezi kuunganisha kwa seva."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Haiwezi kuunganisha kwa seva."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS inahitajika lakini haihimiliwi na seva."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Mbinu za uthibitishaji haziauniwi na seva."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Haiwezi kufungua muunganisho kwa seva kwa sababu ya hitilafu ya kiusalama."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Haiwezi kufungua muunganisho kwa seva."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Uliingiza anwani ya seva isiyo sahihi au seva inahitaji toleo la itifaki ambalo haiauniwi na Barua pepe."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Hauna idhini ya kulandanisha kwa seva hii. Tafadhali wasiliana na msimamizi wako wa seva kwa maelezo zaidi."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Udhibiti wa usalama kutoka mbali"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Seva <xliff:g id="SERVER">%s</xliff:g> inahitaji uiruhusu kudhibiti kwa umbali baadhi ya vipengele vya usalama vya simu yako. Ungependa kumaliza kuweka mipangilio ya akaunti hii?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Seva hii inahitaji vipengele vya usalama ambavyo kifaa chako cha Android haiauni, ikijumlisha: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Hauwezi kubadilisha jina la mtumiaji la akaunti. Ili kuongeza akaunti na jina tofauti la mtumiaji, gusa Ongeza Akaunti."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"ILANI: Kuamilishua kibali cha programu ya Barua pepe ili kudhibiti kifaa chako itafuta akaunti zote za Barua pepe ambazo zinakihitaji, pamoja na barua pepe zake, anwani, matukio ya kalenda, na data nyingine."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Usasisho wa usalama"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> inahitaji usasihe mipangilio yako ya usallama."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Akaunti \"<xliff:g id="ACCOUNT">%s</xliff:g>\" haiwezi kulandanishwa kwa sababu ya mahitaji ya usalama."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Akaunti \"<xliff:g id="ACCOUNT">%s</xliff:g>\" inahitaji kusasisha mipangilio ya usalama."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Akaunti \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ilibadilisha mipangilio yakeya usalama; hakunahatuaya usalama inayohitajika."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Uboreshaji wa usalama unahitajika"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Sera za kiusalama zimebadilishwa"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Sera za kiusalama haziwezi kufikiwa"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Usalama wa kifaa"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Seva <xliff:g id="SERVER">%s</xliff:g>inahitaji uiruhusu kudhibiti kwa umbali baadhi ya vipengele vya usalama vya simu yako."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Hariri maelezo"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" inahitaji ubadilishe kifungio chako cha skrini au nenosiri."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Nenosiri la kufunga skrini linaisha muda"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"PIN au nenosiri lako la kufunga skrini yako limekwisha muda."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Nenosiri la kufunga skrini limekwisha muda"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Nenosiri la kufunga skrini linaisha muda"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Unahitaji kubadilisha PIN au nenosiri la kifungio skrini chako hivi karibuni, au data ya <xliff:g id="ACCOUNT">%s</xliff:g> itafutwa. Je, unataka kuibadilisha sasa?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Nenosiri la kufunga skrini limekwisha muda"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Data ya <xliff:g id="ACCOUNT">%s</xliff:g> inafutwa kutoka kwenye kifaa chako. Unaweza kuirejesha kwa kubadilisha PIN au nenosiri lako la kifungio skrini. Unataka kuibadilisha sasa?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Tupa mabadiliko yasiyohifadhiwa?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Haingeweza kuinga ndani"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Jina la mtumiaji au nenosiri la <xliff:g id="ACCOUNT">%s</xliff:g> sio sahihi. Je, unataka kusasisha sasa hivi?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Akaunti chaguo-msingi"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Tuma barua pepe kutoka kwa akaunti hii kwa chaguo-msingi"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Pakua viambatisho"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Pakua-otomatiki viambatisho kwa ujumbe wa hivi karibuni kupitia Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Arifa za barua pepe"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Mara za kusawazisha, kutuma arifa, n.k."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Tuma arifa wakati barua pepe inafika"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Mazoea ya kukagua kikasha"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Mipangilio inayoingia"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Jina la mtumiaji, nenosiri, na mipangilio mingine ya seva inayoingia"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Mipangilio ya kutoka"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Jina la mmtumiaji, neneosiri na mipangilio mingine ya seva ya kutoka."</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Sera zimetekelezwa"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Hamna"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Sera zisizokubaliwa"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Hamna"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Jaribu usawazishi"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Gusa hapa ili kulandanisha akaunti hii"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Jina la akaunti"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Jina lako"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Sahihi"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Majibu ya haraka"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Hariri maandishi unayoyaingiza mara kwa mara unapoandika barua pepe"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Ambatisha maandishi kwa ujumbe unaotuma"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Mipangilio ya Arifa"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Matumizi ya data"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Sera za kiusalama"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Hariri majibu ya haraka"</string>
- <string name="save_action" msgid="1988862706623227093">"Hifadhi"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sawazisha anwani"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sawazisha anwani za akaunti hii"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sawazisha kalenda"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Landanisha tukio la kalenda la akaunti hii"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Landanisha barua pepe"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sawazisha barua pepe za akaunti hii"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Tetema"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Pia tetema baruapepe inapofika"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Kila wakati"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Kukiwa kimya tu"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Katu"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Tetema"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Chagua toni ya mlio"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Mipangilio ya seva"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Ondoa akaunti"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Akaunti \"<xliff:g id="ACCOUNT">%s</xliff:g>\" itaondolewa kutoka kwa Barua pepe."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Ondoa akaunti"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Ondoa akaunti"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Chaguo za kusawazisha"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Sawazisha chaguo ( <xliff:g id="MAILBOXX_NAME">%s</xliff:g> )"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Mipangilio ya usawazishaji"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Mara za kuchunguza"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Siku hadi Usawazishaji"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Akaunti ya barua pepe"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Chagua akaunti"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Chagua folda"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Akaunti haikupatikana. Huenda ikawa imeondolewa."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Folda haikupatikana. Huenda imeondolewa."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Akaunti zingine za \"Plus\" tu ndizo zinazojumuisha ufikivu wa POP na kwa hivyo kuruhusu programu hii kuunganisha. Kama hauwezi kuingia kwa kutumia anwani yako ya barua pepe na nenosiri lako sahihi, huenda usiwe na akaunti iliyolipiwa ya \"Plus\". Tafadhali zindua Kivinjari cha Wavuti ili uweze kufikia akaunti hizi za barua pepe."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Kabla ya kusanidi akaunti ya barua pepe hii, tembelea wavuti ya T-Online na unda nenosiri ya ufikivu wa barua pepe ya POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Shirika"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Haikuweza kuunda akaunti. Jaribu tena."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Barua pepe"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Huwezesha sera za usalama zinazobainishwa na seva"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Inatafuta <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">" matokeo <xliff:g id="RESULTS">%1$d</xliff:g> kutoka <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> matokeo <xliff:g id="DOMAIN">%2$s</xliff:g> kutoka"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Mipangilio"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Mipangilio ya kawaida"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Programu"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Kioto mahiri"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Chagua skrini gani ya kuonyesha baada ya kufuta ujumbe"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ficha visanduku tiki"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Katika orodha ya jumbe, gusa na ushikilie ili uchague"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Thibitisha kabla ya kufuta"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Jumbe"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Thibitisha kabla ya kutuma"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Jumbe"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Mahiri katika"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Ujumbe mpya zaidi"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Ujumbe mzee zaidi"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Orodha ya ujumbe"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Ukubwa wa maandishi ya ujumbe"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Maandishi madogo sana"</item>
- <item msgid="4415205108584620118">"Maandishi madogo"</item>
- <item msgid="4550219696381691112">"Maandishi-ukubwa wa kawaida"</item>
- <item msgid="6227813549949219991">"Maandishi makubwa"</item>
- <item msgid="1197917420815786571">"Maandishi kubwa"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Ukubwa wa maandishi ya ujumbe"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Dogo sana"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Ndogo"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Kawaida"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Kubwa"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Kubwa mno"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Jibu wote"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Fanya \"Jibu wote\" iwe chaguo-msingi kwa majibu ya ujumbe"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Uliza kuonyesha picha"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Picha kwenye ujumbe hazitaonyeshwa kiotomatiki"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Onyesha picha zilizoondolewa."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> ya <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Inasubiri kusawazisha"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Barua pepe yako itaonekana hivi karibuni."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Gusa aikoni ili kubadilisha"</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Kikasha Kilichochanganywa"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Haijasomwa"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Zenye Nyota"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Inapakia…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Gusa ili kusanidi."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Bado hujasanidi akaunti ya barua pepe."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Tafuta katika barua pepe"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Tafuta katika <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Tafuta \"<xliff:g id="ID_1">%1$s</xliff:g>\" katika matokeo"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Inasubiri matokeo"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Seva zingine zinaweza kuchukua muda mrefu."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Folda"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Usiruhusu matumizi ya kamera ya kifaa"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Zinahitaji nenosiri la kifaa"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Zuia matumizi mapya ya nywila ya hivi karibuni"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Inahitaji nywila kumalizika"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Inahitaji kifaa bwete ili kufunga skrini yake"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Wekea kikomo idadi ya matukio ya kalenda yanayolandanishwa"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Wekea kikomo idadi ya barua pepe zinazolandanishwa"</string>
- <string name="quick_1" msgid="3426057697353380951">"Asante!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Iko sawa kwangu!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Nitasoma hii baadaye na nitawasiliana na wewe."</string>
- <string name="quick_4" msgid="3988974084396883051">"Tupange mkutano wa kujadili hii."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Ulandanishi wa mandharinyuma ya akaunti hii imelemazwa wakati wa kuzurura."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Inatuma majibu..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Hakuna ujumbe."</string>
-</resources>
diff --git a/email2/res/values-sw/uploader.xml b/email2/res/values-sw/uploader.xml
deleted file mode 100644
index 42789ca3e..000000000
--- a/email2/res/values-sw/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Upakiaji wa Papo Hapo"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Albamu ya Kupakia Papo Hapo"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Inapakia"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Imemaliza"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Imepumzishwa"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • picha %2$d • video %3$d"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"Picha %1$d • video %2$d"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"betri iko chini"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"inazidi nafasi ya picha"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"urandaji"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"inasubiri mtandao-hewa"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"imecheleweshwa hadi itakapochaji"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"inasubiri muunganisho"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"inajaribu upya katika %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Onyesha Vipakizi Vinavyosubiri"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Onyesha Vipakuzi Vilivyokamilishwa"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Tazama kwenye wavuti"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Onyesha Vipakuzi Vinavyosubiri"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Ficha Vipakiaji Vinavyosubiri"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Onyesha Maelezo"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Ficha Maelezo"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Mipangilio"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Imepakia %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Akaunti"</string>
- <string name="upload" msgid="2615541458361216022">"Pakia"</string>
- <string name="ok" msgid="2516349681897895312">"Sawa"</string>
- <string name="cancel" msgid="1207103189404543868">"Ghairi"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Inapakia kwa "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" kwa "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Imeshindwa kuanzisha upakiaji."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Faili haipatikani."</string>
- <string name="account_error" msgid="1904775271866104941">"Imeshindwa kuepua maelezo ya akaunti"</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Kulikuwa na tatizo la kuingia kwenye akaunti yako."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Inasubiri kujaribu tena"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Inasubiri Mtandao-hewa"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Inapakia"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Imeshindwa"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Imekamilika"</string>
- <string name="pause_state_running" msgid="711411177620353982">"inapakia"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"imepumzishwa kwa mikono"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"imepumzishwa - betri iko chini"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"imepumzishwa - imecheleweshwa hadi itakapochaji"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"imepumzishwa - inasubiri muunganisho"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"imepumzishwa - nafasi ya PWA imekwisha"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"iimepumzishwa - inasubiri mtandao-hewa"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"imepumzishwa - urandaji"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"inasubiri kujaribu upya"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"Dakika 1"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"Dakika 2"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"Dakika 5"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Hakuna muunganisho wa data"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Nafasi ya diski ya akaunti imeisha"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Faili haikupatikana"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Hitilafu ya huduma"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Hitilafu ya mtandao"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Imeshindwa kuhalalisha"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Imeshikilia vipakia [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Imemaliza kupakia [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Sitisha upakiaji"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Endelea kupakia"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Pakiza sasa"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Pakia baadaye"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Usipakie"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Tazama"</string>
- <string name="manager_retry" msgid="939534318469518843">"Jaribu tena"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Upakiaji umeghairiwa"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Upakiaji umekamilika tayari"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Sawazisha zote"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Usawazishaji wa Mwisho:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Orodha ya vipengee vilivyokamilika iko tupu."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Upakiaji wa Papo hapo"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Upakiaji umekamilika"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Upakiaji umepumzishwa"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Upakiaji wa papo hapo bado haujawashwa"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Faili kubwa zitapakia kupitia kwa muunganisho wa Wi-Fi pekee."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Inatafuta faili..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Inaandaa kupakia picha<xliff:g id="PHOTOCOUNT">%1$d</xliff:g> na video za kupakiwa <xliff:g id="VIDEOCOUNT">%2$d</xliff:g>..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Hakuna picha/video za ziada zinazphitaji kupakiwa."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Kulikuwa na tatizo la kuwasiliana na seva. Tafadhali jaribu tena baadaye."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Sawazisha zote zilizoghairiwa"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Sawazisha Zote"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Mwonekano umekamilika"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Tazama zinazosubiri"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Kawaida"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Sitisha vipakizi vyote"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Nishati"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Pakia wakati simu yako inapochajiwa tu."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Mtandao-hewa"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Pakia tu wakati Mtandao-hewa unapatikana."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Picha"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Akaunti"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Masharti ya kupakia"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Ukubwa wa picha"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Video"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Akaunti"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Akaunti ya picha itatumiwa kwa upakiaji wa video."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Masharti ya kupakia"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Mipangilio ya uunganishaji wa picha inatumiwa kwa sasa."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Picha kupitia mitandao ya simu pekee"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Picha na video &amp; kupitia mitandao ya simu ya mkononi"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Picha na video &amp; kupitia Mtandao hewa pekee"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Kuhusu"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Toleo la Kupakia Papo Hapo"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Inapendekezwa: Pikseli 1600 (ya kushiriki, kuchapisha na taswira za skrini)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Ukubwa asilia (upakizi wa pole)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"imepumzishwa - Kadi ya SD haipatikani"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Kadi ya SD haipatikani"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Mipangilio ya Kupakiza moja kwa moja"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Kupakia Moja kwa moja"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Pakiza otomatiki picha mpya na video &amp; kwa albamu faragha ya wavuti"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Hali ya kupakia"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Mahiri"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Vipakizi vya simu ya mkononi"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Vipakizi vya urandaji"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Pakia picha na video za na; wakati wa urandaji katika mtandao wa data"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Vipakizi vya betri"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Pakia picha na video na; viedo pekee unapochaji"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Pakia picha zilizopo"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Pakia picha zozote zilizopo na video kutoka kwenye simu yako sasa"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Imelemazwa"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Inapakia (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d kati ya %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Pumzishwa: gusa ili kuendelea na upakiaji"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Pakia picha zilizopo"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Kupakia picha na video ambazo tayari hazijapakiwa kutoka kwenye simu yako kwa albamu faragha ya wavuti kunaweza kuchukua muda, lakini kutafanyika katika usuli. Una hakika unataka kuendelea?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Ndiyo"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"La"</string>
-</resources>
diff --git a/email2/res/values-sw600dp-port/dimensions.xml b/email2/res/values-sw600dp-port/dimensions.xml
deleted file mode 100644
index c7a8c6a65..000000000
--- a/email2/res/values-sw600dp-port/dimensions.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
-
- <!-- Account Setup Activities -->
- <dimen name="setup_padding_top">32dip</dimen>
- <dimen name="setup_padding_left">32dip</dimen>
- <dimen name="setup_padding_right">32dip</dimen>
-
-</resources>
diff --git a/email2/res/values-sw600dp/dimensions.xml b/email2/res/values-sw600dp/dimensions.xml
deleted file mode 100644
index 1ba14b685..000000000
--- a/email2/res/values-sw600dp/dimensions.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- tablet -->
-<resources>
- <!-- Account Setup Activities -->
- <!-- inset distance for setup/settings buttons -->
- <dimen name="setup_buttons_padding_left">16dip</dimen>
- <dimen name="setup_buttons_padding_right">16dip</dimen>
- <!-- distance of any button below the upper hairline -->
- <dimen name="setup_buttons_padding_top">64dip</dimen>
- <!-- distance of any button below the previous button (vertical stack) -->
- <dimen name="setup_buttons_vertical_spacing">48dip</dimen>
- <!-- distance of any button above the bottom of the screen -->
- <dimen name="setup_buttons_padding_bottom">48dip</dimen>
-
- <!-- Account settings fragments -->
- <dimen name="settings_fragment_padding_top">32dip</dimen>
- <dimen name="settings_fragment_padding_left">32dip</dimen>
- <dimen name="settings_fragment_padding_right">32dip</dimen>
-
- <!-- On tablets, we don't need additional padding in setup mode since the
- base settings fragments that are reused already have padding. -->
- <dimen name="setup_fragment_padding_top">0dip</dimen>
- <dimen name="setup_fragment_padding_left">0dip</dimen>
- <dimen name="setup_fragment_padding_right">0dip</dimen>
-
- <!-- In setup screens, the inset for all items below the headline+hairline -->
- <dimen name="setup_item_inset_left">16dip</dimen>
- <dimen name="setup_item_inset_right">64dip</dimen>
-
- <!-- Account Setup Activities -->
- <dimen name="setup_padding_top">16dip</dimen>
- <dimen name="setup_padding_left">64dip</dimen>
- <dimen name="setup_padding_right">64dip</dimen>
-
- <!-- Message list items -->
- <dimen name="replystate_margin_top">3sp</dimen>
- <dimen name="replystate_margin_right">16dip</dimen>
-</resources>
diff --git a/email2/res/values-sw600dp/styles.xml b/email2/res/values-sw600dp/styles.xml
deleted file mode 100644
index 08c573fff..000000000
--- a/email2/res/values-sw600dp/styles.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Specializations for tablet screens - most colors are in values/colors.xml -->
-<resources>
- <!-- The headline at the top of every account settings fragments (in preferences) -->
- <style name="accountSettingsHeadline">
- <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
- </style>
-
- <!-- The large headline at the top of every account setup screen -->
- <style name="accountSetupHeadline">
- <item name="android:textSize">30sp</item>
- <item name="android:textColor">@color/account_setup_headline_color</item>
- </style>
-
- <!-- Info text in any account setup screen -->
- <style name="accountSetupInfoText">
- <item name="android:textSize">18sp</item>
- <item name="android:textColor">@color/account_setup_info_text_color</item>
- </style>
-
- <!-- Item labels in any account setup screen -->
- <style name="accountSetupLabelText">
- <item name="android:textSize">14sp</item>
- <item name="android:textColor">@color/account_setup_label_text_color</item>
- </style>
-
- <!-- Wizard buttons on the account setup screens -->
- <style name="accountSetupButton">
- <item name="android:layout_width">208sp</item>
- <item name="android:layout_height">48sp</item>
- <item name="android:textSize">18sp</item>
- </style>
-
- <!-- Cancel/Done buttons on the account settings (server settings) fragments -->
- <style name="accountSettingsButton">
- <item name="android:layout_width">208sp</item>
- <item name="android:layout_height">48sp</item>
- <item name="android:textSize">18sp</item>
- </style>
-
- <style name="accountSetupTypePrevious" parent="@style/accountSetupButton">
- <item name="android:layout_toRightOf">@+id/main_content"</item>
- <item name="android:layout_alignParentRight">true</item>
- </style>
-</resources>
diff --git a/email2/res/values-sw720dp-land/dimensions.xml b/email2/res/values-sw720dp-land/dimensions.xml
deleted file mode 100644
index 1b775848d..000000000
--- a/email2/res/values-sw720dp-land/dimensions.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- tablet, landscape -->
-<resources>
- <!-- Account Setup Activities -->
- <dimen name="setup_padding_top">16dip</dimen>
- <dimen name="setup_padding_left">128dip</dimen>
- <dimen name="setup_padding_right">128dip</dimen>
-</resources>
-
diff --git a/email2/res/values-th/strings.xml b/email2/res/values-th/strings.xml
deleted file mode 100644
index 90044e0da..000000000
--- a/email2/res/values-th/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"อ่านไฟล์แนบของอีเมล"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"อนุญาตให้แอปพลิเคชันนี้อ่านไฟล์แนบในอีเมลของคุณ"</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"เข้าถึงข้อมูลผู้ให้บริการอีเมล"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"อนุญาตให้แอปพลิเคชันนี้เข้าถึงฐานข้อมูลอีเมลของคุณ ซึ่งรวมถึงข้อความที่ได้รับ ข้อความที่ส่ง ชื่อผู้ใช้ และรหัสผ่าน"</string>
- <string name="app_name" msgid="5815426892327290362">"อีเมล"</string>
- <string name="compose_title" msgid="427986915662706899">"เขียน"</string>
- <string name="debug_title" msgid="5175710493691536719">"ดีบัก"</string>
- <string name="next_action" msgid="3931301986364184415">"ถัดไป"</string>
- <string name="okay_action" msgid="8365197396795675617">"ตกลง"</string>
- <string name="cancel_action" msgid="6967435583794021865">"ยกเลิก"</string>
- <string name="previous_action" msgid="5181616311579820981">"ก่อนหน้า"</string>
- <string name="send_action" msgid="1729766205562446418">"ส่ง"</string>
- <string name="reply_action" msgid="4262472229221507619">"ตอบกลับ"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"ตอบกลับทั้งหมด"</string>
- <string name="delete_action" msgid="8421026208288857155">"ลบ"</string>
- <string name="forward_action" msgid="669174181042344116">"ส่งต่อ"</string>
- <string name="favorite_action" msgid="4664259801498253756">"ติดดาว"</string>
- <string name="done_action" msgid="7497990549515580249">"เสร็จสิ้น"</string>
- <string name="create_action" msgid="3062715563215392251">"สร้างใหม่"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"ลบ"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"ไม่มีคำตอบด่วน"</string>
- <string name="discard_action" msgid="6532206074859505968">"ยกเลิก"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"บันทึกร่างจดหมาย"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"ใส่คำตอบด่วน"</string>
- <string name="read_action" msgid="4701484794504781686">"ทำเครื่องหมายว่าอ่านแล้ว"</string>
- <string name="unread_action" msgid="6280399049357552826">"ทำเครื่องหมายว่ายังไม่ได้อ่าน"</string>
- <string name="set_star_action" msgid="4660317166196258160">"เพิ่มดาว"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"ลบดาว"</string>
- <string name="refresh_action" msgid="5951383001436708175">"รีเฟรช"</string>
- <string name="add_account_action" msgid="8835736309476033727">"เพิ่มบัญชี"</string>
- <string name="compose_action" msgid="4045702519637388045">"เขียน"</string>
- <string name="search_action" msgid="6325101454876682308">"ค้นหา"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"การตั้งค่าบัญชี"</string>
- <string name="settings_action" msgid="6334807007967459412">"การตั้งค่า"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"ตัวเลือกการซิงค์"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"ทำเครื่องหมายว่ายังไม่ได้อ่าน"</string>
- <string name="move_action" msgid="3059189775933985898">"ย้าย"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ สำเนา/สำเนาลับ"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"เพิ่มสำเนา/สำเนาลับ"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"แนบไฟล์"</string>
- <string name="close_action" msgid="533058985745238100">"ปิด"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"ส่งข้อความทั้งหมด"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"เลือกไฟล์แนบ"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"ย้ายไปที่"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"กำลังโหลดข้อความ..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"ปัญหาการเชื่อมต่อ"</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"ไม่สามารถโหลดข้อความตัวอักษร ข้อความอาจมีขนาดใหญ่เกินกว่าที่จะดูได้"</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"ย้ายข้อความ"</item>
- <item quantity="other" msgid="371256717624461324">"ย้ายข้อความ"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"การย้ายไม่สามารถทำได้บนบัญชีแบบ POP3"</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"ย้ายไม่ได้เนื่องจากข้อความที่เลือกมาจากหลายบัญชี"</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"ไม่สามารถย้ายข้อความในข้อความร่าง กล่องจดหมายออก และข้อความที่ส่งแล้วได้"</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ฉบับที่ยังไม่ได้อ่าน (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ยังไม่ได้อ่าน (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> ยังไม่ได้อ่าน (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"ในบัญชี <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> บัญชี"</item>
- <item quantity="other" msgid="2723797835410343458">"ในบัญชี <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> บัญชี"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"ถึง <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> ข้อความใหม่"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"บัญชีทั้งหมด"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> บัญชี"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> บัญชี"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"กล่องจดหมาย"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"กล่องจดหมายออก"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"ร่างจดหมาย"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"ถังขยะ"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"ส่งแล้ว"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"ขยะ"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"ยังไม่อ่าน"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"กล่องจดหมาย (ยังไม่อ่าน)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"กล่องจดหมาย (ทั้งหมด)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"มุมมองรวม (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> บัญชี"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> บัญชี"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"รุ่น: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"กล่องจดหมาย"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"ที่ติดดาว"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"ร่างจดหมาย"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"กล่องจดหมายออก"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"มุมมองแบบรวม"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"แสดงโฟลเดอร์ทั้งหมด"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"บัญชี"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"โฟลเดอร์ล่าสุด (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"โฟลเดอร์ทั้งหมด"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"โฟลเดอร์ล่าสุด"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"หัวเรื่อง"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"ไม่มีหัวเรื่อง"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"โหลดข้อความเพิ่มเติม"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> รายการที่เลือกไว้"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> รายการที่เลือกไว้"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"ไม่มีข้อความ"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"ถึง"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"สำเนา"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"สำเนาลับ"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"เรื่อง"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"จาก:"</string>
- <string name="to" msgid="4392614766835725698">"ถึง"</string>
- <string name="cc" msgid="7017720927911078193">"สำเนา"</string>
- <string name="bcc" msgid="3098643138241111579">"สำเนาลับ"</string>
- <string name="subject_hint" msgid="7253964583324677128">"หัวเรื่อง"</string>
- <string name="body_hint" msgid="4279864165439577668">"เขียนอีเมล"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- ข้อความต้นฉบับ --------"\n"เรื่อง: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"จาก: <xliff:g id="SENDER">%2$s</xliff:g>"\n"ถึง: <xliff:g id="TO">%3$s</xliff:g>"\n"สำเนา: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> เขียนว่า:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"รวมข้อความที่ยกมา"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"รวมข้อความ"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"เพิ่มผู้รับอย่างน้อยหนึ่งราย"</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"ที่อยู่อีเมลบางที่อยู่ไม่ถูกต้อง"</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"ไฟล์ใหญ่เกินไปที่จะแนบ"</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"ใส่คำตอบด่วน"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> และอื่นๆ อีก <xliff:g id="NUMBER">%2$d</xliff:g> ราย"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"ถึง:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"สำเนา:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"สำเนาลับถึง:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"วันที่:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"จาก:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"เรื่อง:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"ดู"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"ติดตั้ง"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"เล่น"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"โหลด"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"ข้อมูล"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"บันทึก"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"บันทึกแล้ว"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"หยุด"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"เอกสารแนบถูกบันทึกเป็น <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"ไม่สามารถบันทึกไฟล์แนบ"</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"หมายเหตุ: ไฟล์แนบอย่างน้อยหนึ่งรายการในข้อความที่ส่งต่อของคุณจะมีการดาวน์โหลดก่อนส่ง"</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"ข้อความ"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"เชิญ"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"เอกสารแนบ <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"เอกสารแนบ <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"แสดงรูปภาพ"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"แสดงเสมอ"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"แสดงรูปภาพจากผู้ส่งรายนี้เสมอ"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"แสดงรูปภาพจากผู้ส่งนี้โดยอัตโนมัติ"</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"ดูในปฏิทิน"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"คำเชิญในปฏิทิน"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"เข้าร่วมหรือไม่"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" ใช่"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" อาจจะ"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" ไม่"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"คุณได้ตอบรับข้อความเชิญนี้"</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"คุณได้ตอบข้อความเชิญนี้ไปว่า \"อาจจะ\""</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"คุณได้ปฏิเสธข้อความเชิญนี้"</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"แสดงรายละเอียด"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"รายละเอียดข้อความ"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"ข้อมูลเอกสารแนบ"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"ต้องเชื่อมต่อ Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"การตั้งค่า Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"การตั้งค่าแอปพลิเคชัน"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"ไม่สามารถเปิดเอกสารแนบ"</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"คุณไม่สามารถบันทึกหรือเปิดไฟล์นี้ได้เนื่องจากไฟล์แนบชนิดนี้อาจมีซอฟต์แวร์ที่เป็นอันตราย"</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"ไม่สามารถบันทึกหรือเปิดไฟล์แนบนี้ได้ เนื่องจากนโยบายด้านความปลอดภัยของบัญชี"</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"เอกสารแนบนี้มีขนาดใหญ่เกินกว่าจะดาวน์โหลดผ่านเครือข่ายมือถือ คุณสามารถดาวน์โหลดเอกสารแนบในครั้งถัดไปที่คุณเชื่อมต่อเครือข่าย Wi-Fi"</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"แอปพลิเคชันที่ติดตั้งอยู่ทั้งหมดไม่สามารถเปิดไฟล์แนบนี้ได้ ลองดาวโหลดแอปพลิเคชันที่เหมาะสมจาก Android Market"</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"ไฟล์แนบนี้เป็นแอปพลิเคชัน คุณต้องทำเครื่องหมายที่ \"แหล่งที่มาที่ไม่รู้จัก\" ใน \"การตั้งค่า &gt; แอปพลิเคชัน\" ก่อน จึงจะสามารถติดตั้งได้"</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"ไม่สามารถติดตั้งแอปพลิเคชันได้โดยตรงจากอีเมล ก่อนอื่น ให้บันทึกแอปพลิเคชันนี้ แล้วติดตั้งโดยใช้แอปพลิเคชันดาวน์โหลด"</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"ไม่สามารถดาวน์โหลดไฟล์แนบ"</string>
- <string name="message_decode_error" msgid="5016042255170947834">"เกิดข้อผิดพลาดขณะถอดรหัสข้อความ"</string>
- <string name="eml_view_title" msgid="8827210108543430336">"กำลังดู <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"ลบข้อความนี้หรือไม่"</item>
- <item quantity="other" msgid="4437637377522896262">"ลบข้อความเหล่านี้หรือไม่"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"ลบข้อความแล้ว"</item>
- <item quantity="other" msgid="6574961322865652255">"ข้อความถูกลบแล้ว"</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"ยกเลิกข้อความแล้ว"</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"บันทึกข้อความเป็นร่างจดหมาย"</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"ไม่สามารถแสดงไฟล์แนบ"</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"ไม่สามารถโหลดไฟล์แนบ \"<xliff:g id="FILENAME">%s</xliff:g>\""</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"กำลังเปิดข้อความ..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> ข้อความถูกย้ายไปที่ <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> ข้อความถูกย้ายไปที่ <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"ไม่สามารถส่งต่อไฟล์แนบอย่างน้อยหนึ่งรายการ"</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"ไม่ได้ส่งต่อเอกสารแนบ"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"ลงชื่อเข้าใช้ <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ไม่สำเร็จ"</string>
- <string name="login_failed_title" msgid="7624349996212476176">"ไม่สามารถลงชื่อเข้าใช้"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>ไบต์"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>ไบต์"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"ใหม่กว่า"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"เก่ากว่า"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" - "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"การตั้งค่าบัญชี"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"บัญชีอีเมล"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"คุณสามารถตั้งค่าบัญชีได้ในไม่กี่ขั้นตอน"</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"ที่อยู่อีเมล"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"รหัสผ่าน"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"ส่งอีเมลจากบัญชีนี้เป็นค่าเริ่มต้น"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"ตั้งค่าด้วยตนเอง"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"พิมพ์ที่อยู่อีเมลและรหัสผ่านที่ถูกต้อง"</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"บัญชีซ้ำ"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"คุณใช้ชื่อผู้ใช้นี้สำหรับบัญชี \"<xliff:g id="DUPLICATE">%s</xliff:g>\" ไปแล้ว"</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"รหัสผ่านนี้เริ่มต้นหรือสิ้นสุดด้วยการเว้นวรรคอย่างน้อยหนึ่งตำแหน่ง เซิร์ฟเวอร์จำนวนมากไม่รองรับรหัสผ่านที่มีการเว้นวรรค"</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"กำลังเรียกข้อมูลบัญชี..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"กำลังตรวจสอบการตั้งค่าเซิร์ฟเวอร์ขาเข้า..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"กำลังตรวจสอบการตั้งค่าเซิร์ฟเวอร์ขาออก..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"การตั้งค่าบัญชี"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"ตั้งค่าบัญชีของคุณแล้ว และอีเมลกำลังมาถึง!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"ตั้งชื่อให้กับบัญชีนี้ (เป็นตัวเลือก)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"ชื่อของคุณ (แสดงในข้อความขาออก)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"ต้องกรอกข้อมูลในฟิลด์นี้"</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"การตั้งค่าบัญชี"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"ประเภทบัญชี"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"บัญชีนี้เป็นบัญชีประเภทใด"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"การตั้งค่าบัญชี"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"การตั้งค่าเซิร์ฟเวอร์ขาเข้า"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"ชื่อผู้ใช้"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"รหัสผ่าน"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"เซิร์ฟเวอร์"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"พอร์ต"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"ประเภทการรักษาความปลอดภัย"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"ไม่มี"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (ยอมรับใบรับรองทั้งหมด)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (ยอมรับใบรับรองทั้งหมด)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"ลบอีเมลจากเซิร์ฟเวอร์"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"ไม่ต้องเลย"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"เมื่อฉันลบจากกล่องจดหมาย"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"ส่วนนำของพาธ IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"เป็นตัวเลือก"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"การตั้งค่าบัญชี"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"การตั้งค่าเซิร์ฟเวอร์ขาออก"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"เซิร์ฟเวอร์ SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"พอร์ต"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"ประเภทการรักษาความปลอดภัย"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"จำเป็นต้องลงชื่อเข้าใช้"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"ชื่อผู้ใช้"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"รหัสผ่าน"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"การตั้งค่าบัญชี"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"การตั้งค่าเซิร์ฟเวอร์"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"เซิร์ฟเวอร์"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"โดเมน\\ชื่อผู้ใช้"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"ใช้การเชื่อมต่อที่ปลอดภัย (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"ยอมรับใบรับรอง SSL ทั้งหมด"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"ใบรับรองไคลเอ็นต์"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"เลือก"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"ใช้ใบรับรองไคลเอ็นต์"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"นำออก"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"ไม่มี"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID โทรศัพท์มือถือ"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"การตั้งค่าบัญชี"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"ตัวเลือกของบัญชี"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"ความถี่ในการตรวจสอบกล่องจดหมาย"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"ไม่ต้องเลย"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"อัตโนมัติ (Push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"ทุก 5 นาที"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"ทุก 10 นาที"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"ทุก 15 นาที"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"ทุก 30 นาที"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"ทุกชั่วโมง"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"ส่งอีเมลจากบัญชีนี้เป็นค่าเริ่มต้น"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"แจ้งให้ฉันทราบเมื่อมีอีเมลเข้า"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"ซิงค์รายชื่อจากบัญชีนี้"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"ซิงค์ปฏิทินจากบัญชีนี้"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"ซิงค์อีเมลจากบัญชีนี้"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"ดาวน์โหลดไฟล์แนบโดยอัตโนมัติเมื่อเชื่อมต่อ Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"ไม่สามารถดำเนินการให้เสร็จสิ้น"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"วันที่จะซิงค์"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"อัตโนมัติ"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"หนึ่งวัน"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"3 วัน"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"1 สัปดาห์"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"สองสัปดาห์"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"1 เดือน"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"ทั้งหมด"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"ใช้ค่าเริ่มต้นของบัญชี"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง"</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้อย่างปลอดภัย"</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้อย่างปลอดภัย"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"ต้องมีใบรับรองไคลเอ็นต์ คุณต้องการเชื่อมต่อกับเซิร์ฟเวอร์ด้วยใบรับรองไคลเอ็นต์หรือไม่"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"ใบรับรองไม่ถูกต้องหรือไม่สามารถเข้าถึงได้"</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"เซิร์ฟเวอร์ตอบสนองโดยมีข้อผิดพลาด โปรดตรวจสอบชื่อผู้ใช้และรหัสผ่านของคุณ แล้วลองอีกครั้ง"</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์"</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"ต้องใช้ TLS แต่เซิร์ฟเวอร์ไม่สนับสนุน"</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"เซิร์ฟเวอร์ไม่สนับสนุนวิธีการตรวจสอบสิทธิ์"</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"ไม่สามารถเปิดการเชื่อมต่อกับเซิร์ฟเวอร์ได้เนื่องจากข้อผิดพลาดด้านความปลอดภัย"</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"ไม่สามารถเปิดการเชื่อมต่อกับเซิร์ฟเวอร์"</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"คุณพิมพ์ที่อยู่เซิร์ฟเวอร์ไม่ถูกต้อง หรือเซิร์ฟเวอร์ต้องใช้โปรโตคอลในรุ่นที่อีเมลไม่สนับสนุน"</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"คุณไม่ได้รับอนุญาตให้ซิงค์กับเซิร์ฟเวอร์นี้ โปรดติดต่อผู้ดูแลระบบเซิร์ฟเวอร์ของคุณเพื่อขอข้อมูลเพิ่มเติม"</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"การจัดการด้านความปลอดภัยจากระยะไกล"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"เซิร์ฟเวอร์ <xliff:g id="SERVER">%s</xliff:g> ต้องการให้คุณอนุญาตให้ควบคุมคุณลักษณะความปลอดภัยบางอย่างของอุปกรณ์ Android ของคุณได้จากระยะไกล คุณต้องการตั้งค่าบัญชีนี้ให้เสร็จหรือไม่"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"เซิร์ฟเวอร์นี้ต้องการคุณลักษณะความปลอดภัยที่อุปกรณ์ Android ของคุณไม่สนับสนุน ซึ่งรวมถึง: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"คุณไม่สามารถเปลี่ยนชื่อผู้ใช้ของบัญชีได้ หากต้องการเพิ่มบัญชีด้วยชื่อผู้ใช้อื่น ให้แตะ \"เพิ่มบัญชี\""</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"คำเตือน: การปิดใช้งานสิทธิ์ของแอปพลิเคชันอีเมลในการดูแลอุปกรณ์ของคุณจะเป็นการลบบัญชีอีเมลทั้งหมดที่จำเป็นต้องใช้สิทธิ์นั้น พร้อมทั้งอีเมล สมุดโทรศัพท์ กิจกรรมในปฏิทิน และข้อมูลอื่นๆ"</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"การอัปเดตความปลอดภัย"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> กำหนดให้คุณต้องอัปเดตการตั้งค่าความปลอดภัย"</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"ไม่สามารถซิงค์บัญชี \"<xliff:g id="ACCOUNT">%s</xliff:g>\" เนื่องจากข้อกำหนดด้านความปลอดภัย"</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"บัญชี \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ต้องมีการอัปเดตการตั้งค่าความปลอดภัย"</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"เปลี่ยนการตั้งค่าความปลอดภัยของบัญชี \"<xliff:g id="ACCOUNT">%s</xliff:g>\" แล้ว ผู้ใช้ไม่จำเป็นต้องดำเนินการใดๆ"</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"ต้องอัปเดตการรักษาความปลอดภัย"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"เปลี่ยนนโยบายความปลอดภัยแล้ว"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"ไม่ตรงกับนโยบายความปลอดภัย"</string>
- <string name="account_security_title" msgid="3511543138560418587">"ความปลอดภัยของอุปกรณ์"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"เซิร์ฟเวอร์ <xliff:g id="SERVER">%s</xliff:g> ต้องการให้คุณอนุญาตให้ควบคุมคุณลักษณะความปลอดภัยบางอย่างของอุปกรณ์ Android ของคุณได้จากระยะไกล"</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"แก้ไขรายละเอียด"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" ระบุให้คุณเปลี่ยน PIN หรือรหัสผ่านล็อกหน้าจอของคุณ"</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"รหัสผ่านล็อกหน้าจอใกล้หมดอายุ"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"PIN หรือรหัสผ่านล็อกหน้าจอของคุณหมดอายุแล้ว"</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"รหัสผ่านล็อกหน้าจอหมดอายุแล้ว"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"รหัสผ่านล็อกหน้าจอใกล้หมดอายุ"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"คุณต้องเปลี่ยน PIN หรือรหัสผ่านสำหรับการล็อกหน้าจอโดยเร็ว ไม่เช่นนั้นข้อมูลของ <xliff:g id="ACCOUNT">%s</xliff:g> จะถูกลบ คุณต้องการเปลี่ยนตอนนี้หรือไม่"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"รหัสผ่านล็อกหน้าจอหมดอายุแล้ว"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"ข้อมูลสำหรับ <xliff:g id="ACCOUNT">%s</xliff:g> กำลังถูกลบออกจากอุปกรณ์ของคุณ คุณสามารถคืนค่าข้อมูลได้โดยเปลี่ยน PIN หรือรหัสผ่านล็อกหน้าจอของคุณ เปลี่ยนรหัสตอนนี้หรือไม่"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"ยกเลิกการเปลี่ยนแปลงที่ยังไม่ได้บันทึกหรือไม่"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"ลงชื่อเข้าใช้ไม่ได้"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"ชื่อผู้ใช้หรือรหัสผ่านสำหรับ <xliff:g id="ACCOUNT">%s</xliff:g> ไม่ถูกต้อง คุณต้องการอัปเดตตอนนี้หรือไม่"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"บัญชีเริ่มต้น"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"ส่งอีเมลจากบัญชีนี้เป็นค่าเริ่มต้น"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"ดาวน์โหลดไฟล์แนบ"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"ดาวน์โหลดไฟล์แนบของข้อความล่าสุดผ่าน WiFi โดยอัตโนมัติ"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"การแจ้งเตือนทางอีเมล"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"ความถี่ในการซิงค์ การแจ้งเตือน ฯลฯ"</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"ส่งการแจ้งเตือนเมื่อมีอีเมลเข้า"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"ความถี่ในการตรวจสอบกล่องจดหมาย"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"การตั้งค่าข้อความขาเข้า"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"ชื่อผู้ใช้ รหัสผ่าน และการตั้งค่าเซิร์ฟเวอร์ขาเข้าอื่นๆ"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"การตั้งค่าข้อความขาออก"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"ชื่อผู้ใช้ รหัสผ่าน และการตั้งค่าเซิร์ฟเวอร์ขาออกอื่นๆ"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"บังคับใช้นโยบายแล้ว"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"ไม่มี"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"นโยบายที่ไม่สนับสนุน"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"ไม่มี"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"พยายามซิงค์"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"แตะที่นี่เพื่อซิงค์บัญชีนี้"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"ชื่อบัญชี"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"ชื่อของคุณ"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"ลายเซ็น"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"คำตอบด่วน"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"แก้ไขข้อความที่คุณใช้เป็นประจำเมื่อเขียนอีเมล"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"เพิ่มข้อความต่อท้ายจดหมายที่คุณส่ง"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"การตั้งค่าการแจ้งเตือน"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"การใช้ข้อมูล"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"นโยบายความปลอดภัย"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"แก้ไขคำตอบด่วน"</string>
- <string name="save_action" msgid="1988862706623227093">"บันทึก"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"ซิงค์รายชื่อในสมุดโทรศัพท์"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"ซิงค์สมุดโทรศัพท์สำหรับบัญชีนี้"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"ซิงค์ปฏิทิน"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"ซิงค์กิจกรรมในปฏิทินสำหรับบัญชีนี้"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"ซิงค์อีเมล"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"ซิงค์อีเมลสำหรับบัญชีนี้"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"สั่น"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"สั่นเมื่อมีอีเมลเข้า"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"ทุกครั้ง"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"เฉพาะเมื่อปิดเสียง"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"ไม่ต้องเลย"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"สั่น"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"เลือกเสียงเรียกเข้า"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"การตั้งค่าเซิร์ฟเวอร์"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"ลบบัญชี"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"บัญชี \"<xliff:g id="ACCOUNT">%s</xliff:g>\" จะถูกลบจากอีเมล"</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"นำบัญชีออก"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"นำบัญชีออก"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"ตัวเลือกการซิงค์"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"ตัวเลือกการซิงค์ (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"การตั้งค่าการซิงค์"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"ตรวจสอบความถี่"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"วันที่จะซิงค์"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"บัญชีอีเมล"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"เลือกบัญชี"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"เลือกโฟลเดอร์"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"ไม่พบบัญชี อาจถูกลบไปแล้ว"</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"ไม่พบโฟลเดอร์ อาจถูกลบไปแล้ว"</string>
- <string name="provider_note_live" msgid="2995297671709325333">"มีเพียงบัญชีแบบ \"Plus\" บางประเภทเท่านั้นที่มีการเข้าถึงแบบ POP ที่โปรแกรมสามารถเชื่อมต่อได้ หากคุณไม่สามารถลงชื่อเข้าใช้ด้วยที่อยู่อีเมลและรหัสผ่านที่ถูกต้องได้ อาจเป็นเพราะคุณไม่มีบัญชี \"Plus\" แบบเสียค่าใช้จ่าย โปรดเปิดเว็บเบราว์เซอร์เพื่อเข้าถึงบัญชีอีเมลเหล่านี้"</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"ก่อนที่จะตั้งค่าบัญชีอีเมลนี้ ให้ไปที่เว็บไซต์ T-Online และสร้างรหัสผ่านสำหรับการเข้าถึงอีเมลแบบ POP3"</string>
- <string name="exchange_name" msgid="1190783774800310346">"องค์กร"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"ไม่สามารถสร้างบัญชี ลองอีกครั้ง"</string>
- <string name="device_admin_label" msgid="8680224994637869414">"อีเมล"</string>
- <string name="device_admin_description" msgid="426727923791430306">"เปิดการใช้งานนโยบายความปลอดภัยที่ระบุโดยเซิร์ฟเวอร์"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"กำลังค้นหา <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"ผลลัพธ์ <xliff:g id="RESULTS">%1$d</xliff:g> รายการจาก <xliff:g id="DOMAIN">%2$s</xliff:g> รายการ"</item>
- <item quantity="other" msgid="7816121892960632123">"ผลลัพธ์ <xliff:g id="RESULTS">%1$d</xliff:g> รายการจาก <xliff:g id="DOMAIN">%2$s</xliff:g> รายการ"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"การตั้งค่า"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"การตั้งค่าทั่วไป"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"แอปพลิเคชัน"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"เลื่อนไปข้างหน้าโดยอัตโนมัติ"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"เลือกหน้าจอที่จะแสดงขึ้นหลังจากที่คุณลบข้อความ"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"ซ่อนช่องทำเครื่องหมาย"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"แตะข้อความในรายการค้างไว้เพื่อเลือก"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"ยืนยันก่อนลบ"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"ข้อความ"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"ยืนยันก่อนส่ง"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"ข้อความ"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"เลื่อนไปที่"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"ข้อความที่ใหม่กว่า"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"ข้อความที่เก่ากว่า"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"รายการข้อความ"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"ขนาดตัวอักษรข้อความ"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"ข้อความขนาดเล็กมาก"</item>
- <item msgid="4415205108584620118">"ข้อความขนาดเล็ก"</item>
- <item msgid="4550219696381691112">"ข้อความขนาดปกติ"</item>
- <item msgid="6227813549949219991">"ข้อความขนาดใหญ่"</item>
- <item msgid="1197917420815786571">"ข้อความขนาดใหญ่"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"ขนาดตัวอักษรข้อความ"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"เล็กมาก"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"เล็ก"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"ปกติ"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"ใหญ่"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"ใหญ่มาก"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"ตอบกลับทั้งหมด"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"กำหนดให้ \"ตอบทั้งหมด\" เป็นค่าเริ่มต้นสำหรับการตอบกลับข้อความ"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"ถามเพื่อจะแสดงรูปภาพ"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"รูปภาพในข้อความจะไม่แสดงโดยอัตโนมัติ"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"แสดงรูปภาพ\" ถูกยกเลิกการเลือก"</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> จาก <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"กำลังรอการซิงค์"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"อีเมลของคุณจะปรากฏขึ้นในไม่ช้า"</string>
- <string name="widget_other_views" msgid="4988574907386539499">"แตะไอคอนเพื่อเปลี่ยน"</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"กล่องจดหมายรวม"</string>
- <string name="widget_unread" msgid="4404711399009077833">"ยังไม่ได้อ่าน"</string>
- <string name="widget_starred" msgid="8290352707134011791">"ที่ติดดาว"</string>
- <string name="widget_loading" msgid="2340962056927255554">"กำลังโหลด…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"แตะเพื่อตั้งค่า"</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"คุณยังไม่ได้ตั้งค่าบัญชีอีเมล"</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"ค้นหาอีเมล"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"ค้นหา <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"ผลการค้นหาสำหรับ \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"กำลังรอผลลัพธ์"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"เซิร์ฟเวอร์บางอย่างอาจใช้เวลานาน"</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"โฟลเดอร์"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"ไม่อนุญาตให้ใช้กล้องถ่ายรูปของอุปกรณ์"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"ต้องมีรหัสผ่านของอุปกรณ์"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"จำกัดการนำรหัสผ่านล่าสุดมาใช้ใหม่"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"รหัสผ่านต้องมีวันหมดอายุ"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"อุปกรณ์ต้องไม่มีการทำงานเพื่อล็อกหน้าจอ"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"จำกัดจำนวนกิจกรรมในปฏิทินที่ซิงค์"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"จำกัดจำนวนอีเมลที่ซิงค์"</string>
- <string name="quick_1" msgid="3426057697353380951">"ขอบคุณ!"</string>
- <string name="quick_2" msgid="4188036352885736617">"น่าสนใจนะ!"</string>
- <string name="quick_3" msgid="8061819976353395585">"ฉันจะอ่านและตอบกลับทีหลัง"</string>
- <string name="quick_4" msgid="3988974084396883051">"จัดการประชุมเพื่อคุยเรื่องนี้กัน"</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"การซิงค์พื้นหลังสำหรับบัญชีนี้ถูกปิดใช้งานขณะโรมมิ่ง"</string>
- <string name="confirm_response" msgid="5747902757569543165">"กำลังส่งการตอบกลับ..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"ไม่มีข้อความ"</string>
-</resources>
diff --git a/email2/res/values-th/uploader.xml b/email2/res/values-th/uploader.xml
deleted file mode 100644
index 9849adfe8..000000000
--- a/email2/res/values-th/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"อัปโหลดทันใจ"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"อัลบั้มอัปโหลดทันใจ"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"กำลังอัปโหลด"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"เสร็จสิ้น"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"หยุดชั่วคราว"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d ภาพ • %3$d วิดีโอ"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d ภาพ • %2$d วิดีโอ"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"แบตเตอรี่อ่อน"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"รูปภาพเกินโควต้าแล้ว"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"โรมมิ่ง"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"กำลังรอ WiFi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"ล่าช้าจนกว่าจะมีการชาร์จ"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"กำลังรอการเชื่อมต่อ"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"กำลังลองใหม่ใน %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"แสดงการอัปโหลดที่ค้างอยู่"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"แสดงการอัปโหลดที่เสร็จสิ้น"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"ดูออนไลน์"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"แสดงการอัปโหลดที่ค้างอยู่"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"ซ่อนการอัปโหลดที่ค้างอยู่"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"แสดงรายละเอียด"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"ซ่อนรายละเอียด"</string>
- <string name="menu_settings" msgid="5088116127086866634">"การตั้งค่า"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"อัปโหลดแล้ว %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"บัญชี"</string>
- <string name="upload" msgid="2615541458361216022">"อัปโหลด"</string>
- <string name="ok" msgid="2516349681897895312">"ตกลง"</string>
- <string name="cancel" msgid="1207103189404543868">"ยกเลิก"</string>
- <string name="uploading_to" msgid="3986362895940069510">"กำลังอัปโหลดไปยัง "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" สำหรับ "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"การเริ่มต้นอัปโหลดล้มเหลว"</string>
- <string name="toast_file_error" msgid="1315722681020841350">"ไฟล์ใช้งานไม่ได้"</string>
- <string name="account_error" msgid="1904775271866104941">"เรียกดูข้อมูลบัญชีไม่สำเร็จ"</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"พบปัญหาในการลงชื่อเข้าใช้บัญชีของคุณ"</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"กำลังรอที่จะลองอีกครั้ง"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"กำลังรอ WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"กำลังอัปโหลด"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"ล้มเหลว"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"เสร็จสิ้น"</string>
- <string name="pause_state_running" msgid="711411177620353982">"กำลังอัปโหลด"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"หยุดชั่วคราวด้วยตนเอง"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"หยุดชั่วคราว - แบตเตอรี่อ่อน"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"หยุดชั่วคราว - ล่าช้าจนกว่าจะมีการชาร์จ"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"หยุดชั่วคราว - กำลังรอการเชื่อมต่อ"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"หยุดชั่วคราว - หมดโควต้า PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"หยุดชั่วคราว - กำลังรอ WiFi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"หยุดชั่วคราว - โรมมิ่ง"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"กำลังรอที่จะลองอีกครั้ง"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 นาที"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 นาที"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 นาที"</string>
- <string name="retry_no_data" msgid="630347885498641534">"ไม่มีการเชื่อมต่อข้อมูล"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"ไม่มีโควต้าดิสก์สำหรับบัญชีแล้ว"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"ไม่พบไฟล์"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"ข้อผิดพลาดของบริการ"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"ข้อผิดพลาดของเครือข่าย"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"การตรวจสอบสิทธิ์ล้มเหลว"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"อัปโหลดที่ค้างอยู่ [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"อัปโหลดเสร็จสมบูรณ์ [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"หยุดการอัปโหลดชั่วคราว"</string>
- <string name="manager_resume" msgid="1608630525599824933">"อัปโหลดต่อ"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"อัปโหลดเดี๋ยวนี้"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"อัปโหลดภายหลัง"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"ไม่อัปโหลด"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"ดู"</string>
- <string name="manager_retry" msgid="939534318469518843">"ลองอีกครั้ง"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"ยกเลิกการอัปโหลดแล้ว"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"การอัปโหลดเสร็จแล้ว"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"ซิงค์ทั้งหมด"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"ซิงค์ครั้งล่าสุด:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"ไม่มีรายการใดที่เสร็จสิ้น"</string>
- <string name="notify_uploads" msgid="8593982942665493037">"อัปโหลดทันใจ"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"การอัปโหลดเสร็จแล้ว"</string>
- <string name="notify_paused" msgid="3999817913227671338">"หยุดการอัปโหลดไว้ชั่วคราว"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"ยังไม่ได้เปิดใช้งานการอัปโหลดทันใจ"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"ไฟล์ขนาดใหญ่จะได้รับการอัปโหลดผ่านการเชื่อมต่อ WiFi เท่านั้น"</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"กำลังสแกนหาไฟล์..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"กำลังเตรียมภาพ <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> ภาพและวิดีโอ <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> รายการสำหรับอัปโหลด..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"ไม่มีรูปภาพ/วิดีโอใดที่จำเป็นต้องอัปโหลดเพิ่มเติม"</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"เกิดปัญหาในการสื่อสารกับเซิร์ฟเวอร์ โปรดลองอีกครั้งในภายหลัง"</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"ยกเลิกการซิงค์ทั้งหมดแล้ว"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"ซิงค์ทั้งหมด"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"ดูรายการที่เสร็จสมบูรณ์"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"ดูรายการที่ค้างอยู่"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"ทั่วไป"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"หยุดการอัปโหลดทั้งหมดชั่วคราว"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"พลังงาน"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"อัปโหลดเฉพาะเมื่อชาร์จโทรศัพท์อยู่"</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"อัปโหลดเฉพาะเมื่อ Wi-Fi ใช้งานได้"</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"รูปภาพ"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"บัญชี"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"เงื่อนไขการอัปโหลด"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"ขนาดภาพ"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"วิดีโอ"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"บัญชี"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"บัญชี Photos จะถูกใช้ในการอัปโหลดวิดีโอ"</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"เงื่อนไขการอัปโหลด"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"ใช้การตั้งค่าการเชื่อมต่อภาพอยู่ในปัจจุบัน"</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"เฉพาะภาพผ่านทางเครือข่ายมือถือเท่านั้น"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"รูปภาพและวิดีโอผ่านทางเครือข่ายมือถือ"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"รูปภาพและวิดีโอผ่าน Wi-Fi เท่านั้น"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"เกี่ยวกับ"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"รุ่นอัปโหลดทันใจ"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"ขอแนะนำ: 1600 พิกเซล (สำหรับการแบ่งปัน การพิมพ์ และโปรแกรมรักษาหน้าจอ)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"ขนาดดั้งเดิม (อัปโหลดช้าที่สุด)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"หยุดชั่วคราว - ไม่มีการ์ด SD"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"ไม่มีการ์ด SD"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"ตั้งค่าอัปโหลดทันใจ"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"อัปโหลดทันใจ"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"อัปโหลดรูปภาพและวิดีโอใหม่ไปยังอัลบั้มส่วนตัวบนเว็บโดยอัตโนมัติ"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"สถานะการอัปโหลด"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"ขั้นสูง"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"การอัปโหลดทางมือถือ"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"การอัปโหลดขณะโรมมิ่ง"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"อัปโหลดรูปภาพและวิดีโอเมื่อโรมมิ่งบนเครือข่ายข้อมูล"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"อัปโหลดขณะชาร์จแบต"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"อัปโหลดรูปภาพและวิดีโอเมื่อชาร์จเท่านั้น"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"อัปโหลดรูปภาพที่มีอยู่"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"อัปโหลดรูปภาพและวิดีโอที่มีอยู่จากโทรศัพท์ของคุณเดี๋ยวนี้"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"ปิดใช้งานแล้ว"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"กำลังอัปโหลด (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d จาก %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"หยุดชั่วคราว: แตะเพื่ออัปโหลดต่อ"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"อัปโหลดรูปภาพที่มีอยู่"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"การอัปโหลดรูปภาพและวิดีโอซึ่งยังไม่ได้รับการอัปโหลดจากโทรศัพท์ของคุณไปยังอัลบั้มส่วนตัวบนเว็บอาจใช้เวลานาน แต่จะดำเนินการในเบื้องหลัง คุณต้องการดำเนินการต่อหรือไม่"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"ใช่"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"ไม่"</string>
-</resources>
diff --git a/email2/res/values-tl/strings.xml b/email2/res/values-tl/strings.xml
deleted file mode 100644
index 014522cff..000000000
--- a/email2/res/values-tl/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Basahin ang mga attachment sa email"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Binibigyang-daan ang app na basahin ang iyong mga attachment sa email."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"I-access ang data ng provider ng email"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Binibigyang-daan ang application na i-access ang database ng iyong email, kabilang ang mga natanggap na mensahe, naipadalang mensahe, username, at password."</string>
- <string name="app_name" msgid="5815426892327290362">"Email"</string>
- <string name="compose_title" msgid="427986915662706899">"Bumuo"</string>
- <string name="debug_title" msgid="5175710493691536719">"Debug"</string>
- <string name="next_action" msgid="3931301986364184415">"Susunod"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Kanselahin"</string>
- <string name="previous_action" msgid="5181616311579820981">"Nakaraan"</string>
- <string name="send_action" msgid="1729766205562446418">"Ipadala"</string>
- <string name="reply_action" msgid="4262472229221507619">"Tumugon"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Tumugon sa lahat"</string>
- <string name="delete_action" msgid="8421026208288857155">"Tanggalin"</string>
- <string name="forward_action" msgid="669174181042344116">"Ipasa"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Star"</string>
- <string name="done_action" msgid="7497990549515580249">"Tapos na"</string>
- <string name="create_action" msgid="3062715563215392251">"Lumikha ng bago"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Tanggalin"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Walang mga mabilisang pagtugon."</string>
- <string name="discard_action" msgid="6532206074859505968">"Itapon"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"I-save ang draft"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Ipasok mabilisang tugon"</string>
- <string name="read_action" msgid="4701484794504781686">"Markahan ng nabasa na"</string>
- <string name="unread_action" msgid="6280399049357552826">"Markahan bilang hindi pa nabasa"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Magdagdag ng star"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Alisin ang bituin"</string>
- <string name="refresh_action" msgid="5951383001436708175">"I-refresh"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Magdagdag ng account"</string>
- <string name="compose_action" msgid="4045702519637388045">"Bumuo"</string>
- <string name="search_action" msgid="6325101454876682308">"Paghahanap"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Mga setting ng account"</string>
- <string name="settings_action" msgid="6334807007967459412">"Mga Setting"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Mga pagpipilian sa pag-sync"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Markahan bilang hindi pa nababasa"</string>
- <string name="move_action" msgid="3059189775933985898">"Ilipat"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Magdagdag ng Cc/Bcc"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Mag-attach ng file"</string>
- <string name="close_action" msgid="533058985745238100">"Isara"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Ipadala lahat msg."</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Pumili ng attachment"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Ilipat sa"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Naglo-load ng mga mensahe…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Problema sa koneksyon."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Hindi mai-load ang teksto ng mensahe. Maaaring masyadong malaki ang mensahe upang tingnan."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Ilipat ang mensahe"</item>
- <item quantity="other" msgid="371256717624461324">"Ilipat ang mga mensahe"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Hindi sinusuportahan ang paglipat sa mga POP3 na account."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Hindi mailipat dahil naglalaman ng maramihang account ang pinili."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Hindi mailipat ang mga mensahe sa Mga Draft, Outbox, at Naipadala."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (na) hindi pa nababasa (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (na) hindi pa nababasa (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> (na) hindi pa nababasa (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"sa <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> (na) account"</item>
- <item quantity="other" msgid="2723797835410343458">"sa <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> (na) account"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"sa <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> (na) bagong mensahe"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Lahat ng account"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> account"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> account"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Inbox"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Outbox"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Mga Draft"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Basurahan"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Ipinadala"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Basura"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Hindi pa nabasa"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Inbox (hindi pa nababasa)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Inbox (lahat)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Pinagsamang view (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> (na) account"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> (na) account"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Bersyon: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Inbox"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Naka-star"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Mga Draft"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Outbox"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Pinagsamang pagtingin"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Ipakita ang lahat ng folder"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Mga Account"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Mga kamakailang folder (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Lahat ng folder"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Mga kamakailang folder"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Paksa"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Walang paksa"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Mag-load nang marami pang mensahe"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> ang napili"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> ang napili"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Walang mga mensahe"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Para kay"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Paksa"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Mula:"</string>
- <string name="to" msgid="4392614766835725698">"Para kay"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Bcc"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Paksa"</string>
- <string name="body_hint" msgid="4279864165439577668">"Bumuo ng email"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Orihinal na Mensahe --------"\n"Paksa: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Mula kay: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Para kay: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">"Si "\n\n"<xliff:g id="SENDER">%s</xliff:g> ay sumulat:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Isama ang naka-quote na teksto"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Isama ang teksto"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Magdagdag ng hindi bababa sa isang recipient."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Di-wasto ang ilang email address."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Masyadong malaki ang file upang i-attach."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Ipasok ang mabilisang tugon"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> at <xliff:g id="NUMBER">%2$d</xliff:g> iba pa"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Para kay:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Petsa:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Mula kay:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Paksa:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Tingnan"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"I-install"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"I-play"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"I-load"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Info"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"I-save"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Na-save"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Huminto"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Na-save attachment na <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Hindi ma-save ang attachment."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Ida-download ang isa o higit pang mga attachment sa iyong ipinasang mensahe bago ang pagpapadala."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Mensahe"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Imbitahan"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Attachment <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Attachment <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Ipakita ang mga larawan"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Palaging ipakita"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Palaging ipakita ang mga larawan mula sa nagpadalang ito"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Awtomatikong ipapakita ang mga larawan mula sa nagpadalang ito."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Tingnan sa Kalendaryo"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Imbitasyon sa kalendaryo"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Pupunta?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Oo"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Maaari"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Hindi"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Tinanggap mo ang imbitasyong ito."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Tumugon ka ng \"maaari\" sa imbitasyong ito."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Tinanggihan mo ang imbitasyong ito."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Ipakita ang mga detalye"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Mga detalye ng mensahe"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Impormasyon ng attachment"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Kailangan ng koneksyon sa Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Mga setting ng Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Mga setting ng app"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Hindi mabuksan ang attachment."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Hindi mo maise-save o mabubuksan ang file na ito dahil maaaring naglalaman ng nakakahamak na software ang ganitong uri ng attachment."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Hindi mai-save o mabuksan ang attachment na ito dahil sa mga patakaran sa seguridad ng account na ito."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Masyadong malaki ang attachment na ito upang i-download sa isang mobile network. Maaari mo itong i-download sa susunod na oras na kumonekta ka sa isang Wi-Fi network."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Walang naka-install na app na makakabukas sa attachment na ito. Subukang mag-download ng isang naaangkop na app mula sa Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Isang app ang attachment na ito. Dapat mong lagyan ng check ang Hindi Alam na Mga Pinagmulan sa Mga Setting &gt; Apps bago mo ito ma-install."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Hindi maaaring i-install nang direkta ang apps mula sa email. I-save muna ang app na ito at pagkatapos ay i-install ito gamit ang app ng Mga Download."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Hindi ma-download ang attachment."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Nagkaroon ng isang error habang dine-decode ang mensahe."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Tinitingnan <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Tanggalin ang mensaheng ito?"</item>
- <item quantity="other" msgid="4437637377522896262">"Tanggalin ang mga mensaheng ito?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Tinanggal ang mensahe."</item>
- <item quantity="other" msgid="6574961322865652255">"Tinanggal ang mga mensahe."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Itinapon ang mensahe."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Na-save ang mensahe bilang draft."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Hindi maipakita ang attachment."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Hindi ma-load ang attachment na \" <xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Binubuksan ang mensahe…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> (na) mensahe ang nailipat sa <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> (na) mensahe ang nailipat sa <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Hindi makapagpasa ng isa o higit pang mga attachment."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Hindi napasa ang attachment"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Hindi matagumpay ang pag-signin ng <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Hindi makapag-sign in"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Mas bago"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Mas luma"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Setup ng account"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Email account"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Mase-set up mo ang iyong account sa ilang hakbang lang."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Email address"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Password"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Magpadala ng email mula sa account na ito bilang default"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manu-manong pag-setup"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Mag-type ng wastong email address at password."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplicate na account"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Ginagamit mo na ang username na ito para sa account na \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Nagsisimula o nagtatapos ang password na ito na may isa o higit pang character na puwang. Hindi sinusuportahan ng maraming server ang mga password na may mga puwang."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Binabawi ang impormasyon ng account…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Sinusuri ang mga setting ng papasok na server…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Sinusuri ang mga setting ng papalabas na server…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Setup ng account"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Naka-set up na ang iyong account at paparating na ang email!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Bigyan ng pangalan ang account na ito (opsyonal)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Iyong pangalan (na ipinapakita sa mga papalabas na mensahe)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Hindi maaaring blangko ang field na ito."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Setup ng account"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Uri ng account"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Anong uri ng account ito?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Setup ng account"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Mga setting ng papasok na server"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Username"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Password"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Uri ng seguridad"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Wala"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Tanggapin ang lahat ng certificate)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (tanggapin ang lahat ng certificate)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Tanggalin ang email mula sa server"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Hindi kailanman"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Kapag nagtanggal ako mula sa Inbox"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Prefix ng path ng IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Opsyonal"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Setup ng account"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Mga setting ng papalabas na server"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP server"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Uri ng seguridad"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Hingin ang pag-signin"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Username"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Password"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Setup ng account"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Mga setting ng server"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Server"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Domain\\Username"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Gumamit ng secure na koneksyon (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Tanggapin ang lahat ng mga SSL certificate"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certificate ng client"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Piliin"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Gamitin ang certificate ng client"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Alisin"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Wala"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Mobile Device ID"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Mga setting ng account"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Mga pagpipilian sa account"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Dalas ng pagtingin sa inbox"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Hindi kailanman"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Awtomatiko (Itulak)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Tuwing 5 minuto"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Tuwing 10 minuto"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Tuwing 15 minuto"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Tuwing 30 minuto"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Oras-oras"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Magpadala ng email mula sa account na ito bilang default"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"I-notify ako kapag may dumating na email"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"I-sync ang mga contact mula sa account na ito"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"I-sync ang kalendaryo mula sa account na ito"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"I-sync ang email mula sa account na ito"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Awtomatikong i-download ang mga attachment kapag nakakonekta sa Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Hindi matapos"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Mga araw upang i-sync"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Awtomatiko"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Isang araw"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Tatlong araw"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Isang linggo"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Dalawang linggo"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Isang buwan"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Lahat"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Gamitin ang default ng account"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Hindi tama ang username o password."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Hindi tama ang username o password."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Hindi makakonekta nang ligtas sa server."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Hindi makakonekta nang ligtas sa server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Kinakailangan ng certificate ng client. Nais mo bang kumonekta sa server gamit ang isang certificate ng client?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Di-wasto o hindi naa-access ang certificate."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Tumugon ang server nang may error. Suriin ang iyong username at password, pagkatapos ay subukang muli."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Hindi makakonekta sa server."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Hindi makakonekta sa server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"Kinakailangan ang TLS ngunit hindi suportado ng server."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Hindi sinusuportahan ng server ang mga pamamaraan sa pagpapatotoo."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Hindi makapagbukas ng koneksyon sa server dahil sa error sa seguridad."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Hindi makapagbukas ng koneksyon sa server."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Nag-type ka ng maling address ng server o nangangailangan ang server ng bersyon ng protocol na hindi sinusuportahan ng Email."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Wala kang pahintulot na mag-sync sa server na ito. Makipag-ugnay sa administrator ng iyong server para sa higit pang impormasyon."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Pangangasiwa ng remote na seguridad"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Kinakailangan ng server na <xliff:g id="SERVER">%s</xliff:g> na payagan mo itong malayuang kontrolin ang ilang tampok sa seguridad ng iyong Android device. Gusto mo bang tapusing i-set up ang account na ito?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Nangangailangan ang server na ito ng mga tampok sa seguridad na hindi sinusuportahan ng iyong Android device, kabilang ang: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Hindi mo maaaring baguhin ang username ng isang account. Upang magdagdag ng isang account na may ibang username, pindutin ang Magdagdag ng Account."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"BABALA: Ang pag-deactivate sa awtoridad ng Email app na pangasiwaan ang iyong device ay magtatanggal sa lahat ng email account na nangangailangan nito, kasama ang email, mga contact, mga kaganapan sa kalendaryo, at iba pang data ng mga ito."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Update sa seguridad"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Kinakailangan ng <xliff:g id="ACCOUNT">%s</xliff:g> na i-update mo ang iyong mga setting ng seguridad."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Hindi ma-sync ang account na \"<xliff:g id="ACCOUNT">%s</xliff:g>\" dahil sa mga kinakailangan sa seguridad."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Kinakailangan ng account na \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ng update sa mga setting ng seguridad."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Binago ng account na \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ang mga setting ng seguridad nito; walang kinakailangang pagkilos ng user."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Kailangan update sa seguridad"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Nabago patakaran sa seguridad"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Di masunod patakaran seguridad"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Seguridad ng device"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Kinakailangan ng server na <xliff:g id="SERVER">%s</xliff:g> na payagan mo itong malayuang kontrolin ang ilang tampok sa seguridad ng iyong Android device."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"I-edit ang mga detalye"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"Kinakailangan ng \"<xliff:g id="ACCOUNT">%s</xliff:g>\" na palitan mo ang PIN o password ng iyong lock screen."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Expire passw. pag-lock screen"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Nag-expire na ang iyong PIN o password sa pag-lock ng screen."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Expire na passw. pg-lock scr"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Nag-e-expire password pag-lock ng screen"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Kailangan mong baguhin ang iyong PIN o password para sa screen ng lock sa lalong madaling panahon, o mabubura ang data para sa <xliff:g id="ACCOUNT">%s</xliff:g>. Nais mo ba itong baguhin ngayon?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Nag-expire na password pag-lock screen"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Binubura ang data para sa <xliff:g id="ACCOUNT">%s</xliff:g> mula sa iyong device. Maipapanumbalik mo ito sa pamamagitan ng pagbabago sa iyong PIN o password para sa screen ng lock. Nais mo ba itong baguhin ngayon?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Itapon ang hindi naka-save na mga pagbabago?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Hindi makapag-sign in"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Hindi tama ang username o password para sa <xliff:g id="ACCOUNT">%s</xliff:g>. Nais mo bang i-update ang mga ito ngayon?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Default na account"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Magpadala ng email mula sa account na ito bilang default"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Mag-download ng mga attachment"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Awto i-download mga attachment sa mga bagong mensahe sa Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Mga notification sa email"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Dalas ng pag-sync, mga notification, atbp."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Magpadala ng notification kapag may dumating na email"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Dalas ng pagtingin sa inbox"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Mga setting ng papasok"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Mga setting ng username, password, at ibang papasok na server"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Mga setting ng papalabas"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Mga setting ng username, password, at ibang papalabas na server"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Ipinapatupad na mga patakaran"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Wala"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Mga hindi sinusuportahang patakaran"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Wala"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Magtangkang i-sync"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Pumindot dito upang i-sync ang account na ito"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Pangalan ng account"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Iyong pangalan"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Lagda"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Mga mabilisang tugon"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"I-edit tekstong madalas mong pinapasok kapag nagsusulat ng email"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Magsama ng teksto sa mga mensaheng iyong ipinapadala"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Mga setting ng notification"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Paggamit ng data"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Mga patakaran sa seguridad"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"I-edit ang mabilisang tugon"</string>
- <string name="save_action" msgid="1988862706623227093">"I-save"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"I-sync ang mga contact"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sync ang contact sa account na ito"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"I-sync ang kalendaryo"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sync ganap kalendaryo para ito acct"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"I-sync ang email"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"I-sync ang email sa account na ito"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"I-vibrate"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"I-vibrate rin kapag dumating ang email"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Palagi"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Kapag tahimik lang"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Hindi kailanman"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"I-vibrate"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Pumili ng ringtone"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Mga setting ng server"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Alisin ang account"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Aalisin ang account na \"<xliff:g id="ACCOUNT">%s</xliff:g>\" mula sa Email."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Alisin ang account"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Alisin ang account"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Mga pagpipilian sa pag-sync"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Mga pagpipilian sa pag-sync (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Mga setting ng pag-sync"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Suriin ang dalas"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Mga araw upang i-sync"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Email account"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Pumili ng account"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Pumili ng folder"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Hindi natagpuan ang account. Maaaring naalis ito."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Hindi natagpuan ang folder. Maaaring naalis ito."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Ilang mga \"Plus\" account lamang ang kinabibilangan ng access sa POP nag nagbibigay-daan sa program na ito na makakonekta. Kung hindi mo magawang mag-sign in gamit ang iyong tamang email address at password, maaaring wala kang may bayad na \"Plus\" account. Ilunsad ang web browser upang makakuha ng access sa mga email account na ito."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Bago i-set up ng email account na ito, bisitahin ang T-Online website at lumikha ng password para sa access sa POP3 email."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Corporate"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Hindi malikha ang account. Subukang muli."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Email"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Pinapagana ang mga patakaran sa seguridad na partikular sa server"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Naghahanap <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> resulta mula sa <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> (na) resulta mula sa <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Mga Setting"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Mga pangkalahatang setting"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Application"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Auto-advance"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Piliin kung aling screen ang ipapakita pagkatapos mong magtanggal ng mensahe"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Itago ang mga checkbox"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Sa mga listahan ng mensahe, pindutin nang matagal upang piliin"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Kumpirmahin bago tanggalin"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mga Mensahe"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Kumpirmahin bago ipadala"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mga Mensahe"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Mag-advance sa"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mas bagong mga mensahe"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mas lumang mensahe"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Listahan ng mensahe"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Laki ng teksto ng mensahe"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Napakaliit na teksto"</item>
- <item msgid="4415205108584620118">"Maliit na teksto"</item>
- <item msgid="4550219696381691112">"Tesktong may karaniwang laki"</item>
- <item msgid="6227813549949219991">"Malaking teksto"</item>
- <item msgid="1197917420815786571">"Napakalaking teksto"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Laki ng teksto ng mensahe"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Napakaliit"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Maliit"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Malaki"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Malaki"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Tumugon sa lahat"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Gawing default ang \"Tumugon sa lahat\" para sa mga pagtugon sa mensahe"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Hilinging ipakita ang mga larawan"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Hindi awtomatikong ipapakita ang mga larawan sa mga mensahe"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Na-clear ang \"Ipakita ang mga larawan\"."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> ng <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Naghihintay ng pag-sync"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Lilitaw ang iyong email sa lalong madaling panahon."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Pndot icon pra bago."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Pinagsamang Inbox"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Hindi pa nabasa"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Naka-star"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Naglo-load..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Pindutin upang i-set up."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Hindi ka pa nakakapag-set up ng email account."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Maghanap sa email"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Hanapin ang <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Mga resulta ng paghahanap para sa \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Naghihintay ng mga resulta"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Maaaring magtagal ang ilang server."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mga Folder"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Wag payag paggamit ng camera ng device"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Hilingin ang password ng device"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Paghigpitan gamit muli dating password"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Hinging mag-expire ang mga password"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Hilingin idle device i-lock screen nito"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Limitahan ang bilang ng mga kaganapan sa kalendaryo na sini-sync"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Limitahan ang bilang ng mga email na sini-sync"</string>
- <string name="quick_1" msgid="3426057697353380951">"Salamat!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Magaling sa akin!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Babasahin ko ito sa ibang pagkakataon at babalik sa iyo."</string>
- <string name="quick_4" msgid="3988974084396883051">"Magtakda tayo ng pulong upang talakayin ito."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Hindi pinapagana ang background na pag-sync para sa account na ito habang nagro-roam."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Ipinapadala ang tugon..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Walang mga mensahe."</string>
-</resources>
diff --git a/email2/res/values-tl/uploader.xml b/email2/res/values-tl/uploader.xml
deleted file mode 100644
index b21305c42..000000000
--- a/email2/res/values-tl/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Instant na Upload"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Album sa Instant na Upload"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Ina-upload"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Tapos na"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Naka-pause"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d (na) larawan • %3$d (na) video"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d (na) larawan • %2$d (na) video"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"mahinang baterya"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"lumampas sa quota ng mga larawan"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"roaming"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"naghihintay ng WiFi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"nakaantala hanggang sa pag-charge"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"naghihintay ng koneksyon"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"muling sinusubukan sa %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Ipakita ang Mga Nakabinbing Pag-upload"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Ipakita ang Mga Tapos nang Pag-upload"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Tingnan Online"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Ipakita ang Mga Nakabinbing Pag-upload"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Itago ang Mga Nakabinbing Pag-upload"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Ipakita ang Mga Detalye"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Itago ang Mga Detalye"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Mga Setting"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Na-upload %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Account"</string>
- <string name="upload" msgid="2615541458361216022">"I-upload"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Kanselahin"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Ina-upload sa "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" para sa "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Nabigo ang pagsisimula ng pag-upload."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Hindi available ang file."</string>
- <string name="account_error" msgid="1904775271866104941">"Nabigong bawiin ang impormasyon ng account."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Nagkaroon ng problema sa pag-sign in sa iyong account."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Naghihintay na muling subukan"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Naghihintay ng WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Nag-a-upload"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Nabigo"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Nakumpleto"</string>
- <string name="pause_state_running" msgid="711411177620353982">"ina-upload"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"manu-manong na-pause"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"naka-pause - mahinang baterya"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"naka-pause - nakaantala hanggang sa pag-charge"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"naka-pause - naghihintay ng koneksyon"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"naka-pause - wala na sa quota ng PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"naka-pause - naghihintay ng wifi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"naka-pause - roaming"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"naghihintay na muling subukan"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 minuto"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 minuto"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 minuto"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Walang koneksyon sa data"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Ang account ay wala na sa quota ng disk"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Hindi nakita ang file"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Error sa serbisyo"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Error sa network"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Nabigo ang pagpapatotoo"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Mga nakabinbing pag-upload [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Mga nakumpletong pag-upload [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"I-pause ang mga pag-upload"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Ipagpatuloy ang mga pag-upload"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"I-upload ngayon"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"I-upload sa ibang pagkakataon"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Huwag i-upload"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Tingnan"</string>
- <string name="manager_retry" msgid="939534318469518843">"Subukang Muli"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Kinansela ang pag-upload"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Tapos na ang pag-upload"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"I-sync ang lahat"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Huling Pa-sync:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Walang laman ang listahan ng mga tapos nang item."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Instant na Upload"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Tapos na ang mga pag-upload"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Naka-pause ang mga pag-upload"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Hindi pa naa-activate ang Instant na Upload"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Maa-upload ang mga malalaking file sa koneksyon ng Wi-Fi lamang."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Nag-i-i-scan ng mga file..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Ihinahanda ang <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> (na) larawan at <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> (na) video para sa pag-upload..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Walang mga karagdagang larawan/video ang kailangang i-upload."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Nagkaroon ng problema sa pakikipag-ugnayan sa server. Pakisubukang muli sa ibang pagkakataon."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Kinansela ang pag-sync sa lahat"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"I-sync ang Lahat"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Nakumpleto ang Pagtingin"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Tingnan ang Nakabinbin"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Pangkalahatan"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"I-pause ang lahat ng pag-upload"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Power"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Mag-upload lamang kapag naka-charge ang telepono."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Mag-upload lamang kapag available ang Wi-Fi."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Mga Larawan"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Account"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Mga kondisyon sa pag-upload"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Laki ng larawan"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Mga Video"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Account"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Ang account ng mga larawan ay magiging mga gamit nang pag-upload ng video."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Mga kondisyon sa pag-upload"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Ginagamit sa ngayon ang mga setting ng pagkakakonekta ng mga larawan."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Mga larawan lamang sa pamamagitan ng mga mobile network"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Mga larawan &amp; video sa pamamagitan ng mga mobile network"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Mga larawan &amp; video sa pamamagitan lamang ng Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Tungkol sa"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Bersyon ng Instant na Upload"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Inirerekomenda: 1600 pixel (para sa pagbabahagi, pag-print at mga screensaver)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Orihinal na laki (pinakamabagal na pag-upload)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"naka-pause - hindi available ang SD card"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Hindi available ang SD card"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Mga setting ng Instant na Upload"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Instant na Upload"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Awtomatikong mag-upload ng mga bagong larawan &amp; video sa isang pribadong album sa web"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Katayuan ng pag-upload"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Advanced"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Mga upload sa mobile"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Mga upload sa roaming"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Mag-upload ng mga larawan &amp; video kapag nagro-roam sa network ng data"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Mga upload sa baterya"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Mag-upload ng mga larawan &amp; video kapag naka-charge lamang"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"I-upload ang mga umiiral nang larawan"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Mag-upload ngayon ng anumang mga umiiral nang larawan &amp; video mula sa iyong telepono"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Hindi Pinapagana"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Ina-upload (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">"%1$d ng %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Naka-pause: pindutin upang ipagpatuloy ang pag-upload"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"I-upload ang mga umiiral nang larawan"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Ang pag-upload ng mga larawan at video na hindi pa naa-upload mula sa iyong telepono sa isang pribadong album sa web ay maaaring tumagal nang ilang sandali, ngunit gagawin sa background. Sigurado ka bang nais mong magpatuloy?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Oo"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Hindi"</string>
-</resources>
diff --git a/email2/res/values-tr/strings.xml b/email2/res/values-tr/strings.xml
deleted file mode 100644
index f0649ae2e..000000000
--- a/email2/res/values-tr/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"E-posta eklerini oku"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Uygulamaya e-posta eklerinizi okuma izni verir."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"E-posta sağlayıcı verilerine eriş"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Uygulamaya, alınan iletiler, gönderilen iletiler, kullanıcı adları ve şifreler de dahil olmak üzere e-posta veritabanınıza erişme izni verir."</string>
- <string name="app_name" msgid="5815426892327290362">"E-posta"</string>
- <string name="compose_title" msgid="427986915662706899">"E-Posta Yaz"</string>
- <string name="debug_title" msgid="5175710493691536719">"Hata Ayıklama"</string>
- <string name="next_action" msgid="3931301986364184415">"İleri"</string>
- <string name="okay_action" msgid="8365197396795675617">"Tamam"</string>
- <string name="cancel_action" msgid="6967435583794021865">"İptal"</string>
- <string name="previous_action" msgid="5181616311579820981">"Önceki"</string>
- <string name="send_action" msgid="1729766205562446418">"Gönder"</string>
- <string name="reply_action" msgid="4262472229221507619">"Yanıtla"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Yanıtı tüm alıcılara gönder"</string>
- <string name="delete_action" msgid="8421026208288857155">"Sil"</string>
- <string name="forward_action" msgid="669174181042344116">"İleri"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Yıldız ekle"</string>
- <string name="done_action" msgid="7497990549515580249">"Bitti"</string>
- <string name="create_action" msgid="3062715563215392251">"Yeni oluştur"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Sil"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Hızlı yanıt yok."</string>
- <string name="discard_action" msgid="6532206074859505968">"Sil"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Taslak kaydet"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Hızlı yanıt ekle"</string>
- <string name="read_action" msgid="4701484794504781686">"Okunanalar olarak işaretle"</string>
- <string name="unread_action" msgid="6280399049357552826">"Okunmamış olarak işaretle"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Yıldız ekle"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Yıldızı kaldır"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Yenile"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Hesap ekle"</string>
- <string name="compose_action" msgid="4045702519637388045">"E-Posta Yaz"</string>
- <string name="search_action" msgid="6325101454876682308">"Ara"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Hesap ayarları"</string>
- <string name="settings_action" msgid="6334807007967459412">"Ayarlar"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Senkronizasyon seçenekleri"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Okunmadı olarak işaretle"</string>
- <string name="move_action" msgid="3059189775933985898">"Taşı"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Cc/Bcc Ekle"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Dosya ekleyin"</string>
- <string name="close_action" msgid="533058985745238100">"Kapat"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Tüm iletileri gönder"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Eki seç"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Şuraya taşı:"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"İletiler yükleniyor..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Bağlantı sorunu."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"İleti metni yüklenemedi. İleti görüntülenemeyecek kadar büyük olabilir."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"İletiyi taşı"</item>
- <item quantity="other" msgid="371256717624461324">"İletileri taşı"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Taşıma işlemi POP3 hesaplarında desteklenmiyor."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Seçim birden fazla hesap içerdiğinden taşınamıyor."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Taslaklar, Giden Kutusu ve Gönderilenler\'deki iletiler taşınamaz."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> okunmamış (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> okunmamış (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> okunmamış (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> hesapta"</item>
- <item quantity="other" msgid="2723797835410343458">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> hesapta"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"kime: <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> yeni ileti"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Tüm hesaplar"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> hesap"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> hesap"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Gelen Kutusu"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Giden Kutusu"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Taslaklar"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Çöp Kutusu"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Gönderildi"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Önemsiz"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Okunmamış"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Gelen Kutusu (okunmamış)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Gelen Kutusu (tümü)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Birleşik görünüm (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> hesap"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> hesap"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Sürüm: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Gelen Kutusu"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Yıldızlı"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Taslaklar"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Giden Kutusu"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Birleşik görünüm"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Tüm klasörleri göster"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Hesaplar"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Son klasörler (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Tüm klasörler"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Son klasörler"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Konu"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Konu yok"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Daha fazla ileti yükle"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> seçildi"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> seçildi"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"İleti yok"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Şu dile:"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Konu"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Gönderen:"</string>
- <string name="to" msgid="4392614766835725698">"Alıcı:"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Bcc"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Konu"</string>
- <string name="body_hint" msgid="4279864165439577668">"E-posta yazın"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Orijinal İleti --------"\n"Konu: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Gönderen: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Alıcı:<xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> şunu yazdı:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Alıntılanan metni dahil et"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Metni ekle"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"En az bir alıcı ekleyin."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Bazı e-posta adresleri geçersiz."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Dosya eklenemeyecek kadar büyük."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Hızlı yanıt ekle"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> ve <xliff:g id="NUMBER">%2$d</xliff:g> kişi daha"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Alıcı:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Tarih:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Gönderen:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Konu:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Görüntüle"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Yükle"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Oynat"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Yükle"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Bilgi"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Kaydet"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Kaydedildi"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Durdur"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Ek <xliff:g id="FILENAME">%s</xliff:g> olarak kaydedildi."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Ek kaydedilemedi."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Yönlendirilen iletinizdeki bir veya daha fazla ek, gönderme işleminden önce indirilecek."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"İleti"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Davet Et"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> ek"</item>
- <item quantity="other" msgid="974463163535515223">"<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g> ek"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Resimleri göster"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Her zaman göster"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Bu gönderenden gelen resimleri her zaman göster"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Bu gönderenden gelen resimler otomatik olarak gösterilecek."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Takvim\'de Görüntüle"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Takvim daveti"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Katılıyor musunuz?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Evet"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Belki"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Hayır"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Bu daveti kabul ettiniz."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Bu davete \"belki\" yanıtı verdiniz."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Bu daveti reddettiniz"</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Ayrıntıları göster"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"İleti ayrıntıları"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Ek bilgileri"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Kablosuz bağlantı gerekli"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Kablosuz ayarları"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Uygulama ayarları"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Ek açılamıyor."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Bu türden bir ek kötü amaçlı yazılım içerebileceğinden bu dosyayı kaydedemez veya açamazsınız."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Bu ek, hesabın güvenlik politikaları nedeniyle kaydedilemez veya açılamaz."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Bu ek, mobil ağ üzerinden indirilemeyecek kadar büyük. Bu eki kablosuz ağa tekrar bağlandığınızda indirebilirsiniz."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Bu eki açabilecek yüklenmiş uygulama yok. Android Market\'ten uygun bir uygulama indirmeyi deneyin."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Bu ek, bir uygulamadır. Bu eki yükleyebilmek için önce Ayarlar &gt; Uygulamalar içindeki Bilinmeyen Kaynaklar\'ı işaretlemeniz gerekir."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Uygulamalar doğrudan e-posta üzerinden yüklenemez. Önce bu uygulamayı kaydedin, ardından İndirilenler uygulamasını kullanarak yükleyin."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Ek indirilemedi."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"İletinin kodu çözülürken bir hata oluştu."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"<xliff:g id="FILENAME">%s</xliff:g> görüntüleniyor"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Bu ileti silinsin mi?"</item>
- <item quantity="other" msgid="4437637377522896262">"Bu iletiler silinsin mi?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"İleti silindi."</item>
- <item quantity="other" msgid="6574961322865652255">"İletiler silindi."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"İleti silindi."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"İleti taslak olarak kaydedildi."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Ek görüntülenemiyor."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Ek yüklenemedi: \" <xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"İleti açılıyor..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> ileti <xliff:g id="MAILBOX_NAME">%2$s</xliff:g> posta kutusuna taşındı"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> ileti <xliff:g id="MAILBOX_NAME">%2$s</xliff:g> posta kutusuna taşındı"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Bir veya birden fazla ek yönlendirilemedi."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Ek yönlendirilmedi"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> oturumu açılamadı."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Oturum açılamadı"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Daha yeni"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Daha eski"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Hesap kurulumu"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"E-posta hesabı"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Hesabınızı birkaç adımda oluşturabilirsiniz."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-posta adresi"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Şifre"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"E-postaları varsayılan olarak bu hesaptan gönder"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuel kurulum"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Geçerli bir e-posta adresi ve şifre yazın."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Yinelenen hesap"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Bu kullanıcı adını \"<xliff:g id="DUPLICATE">%s</xliff:g>\" hesabı için zaten kullanıyorsunuz."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Şifre bir veya daha fazla boşluk karakteriyle başlıyor ya da bitiyor. Birçok sunucu boşluk içeren şifreleri desteklemez."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Hesap bilgileri alınıyor..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Gelen sunucu ayarları denetleniyor..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Giden sunucu ayarları denetleniyor..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Hesap kurulumu"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Hesabınız ayarlandı ve e-posta gönderildi!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Bu hesaba bir ad ver (isteğe bağlı)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Adınız (giden iletilerde görüntülenir)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Bu alan boş olamaz."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Hesap kurulumu"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Hesap türü"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Bu hesabın türü nedir?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Hesap kurulumu"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Gelen sunucu ayarları"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Kullanıcı adı"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Şifre"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Sunucu"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Bağlantı Noktası"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Güvenlik türü"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Yok"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Tüm sertifikaları kabul et)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (Tüm sertifikaları kabul et)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"E-postayı sunucudan sil"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Hiçbir zaman"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Gelen Kutusundan sildiğimde"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP yolu öneki"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"İsteğe bağlı"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Hesap kurulumu"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Giden sunucu ayarları"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP sunucusu"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Bağlantı Noktası"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Güvenlik türü"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Oturum açmayı gerektir"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Kullanıcı adı"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Şifre"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Hesap kurulumu"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Sunucu ayarları"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Sunucu"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Alan adı/Kullanıcı adı"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Güvenli bağlantıyı kullan (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Tüm SSL sertifikalarını kabul et"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"İstemci sertifikası"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Seç"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"İstemci sertifikası kullan"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Kaldır"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Yok"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Mobil Cihaz Kimliği"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Hesap ayarları"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Hesap seçenekleri"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Gelen kutusunu denetleme sıklığı"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Hiçbir zaman"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Otomatik (Push)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Her 5 dakikada bir"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Her 10 dakikada bir"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Her 15 dakikada bir"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Her 30 dakikada bir"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Saatte bir"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"E-postaları varsayılan olarak bu hesaptan gönder"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"E-posta geldiğinde bana bildir"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Bu hesaptaki kişileri senkronize et"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Bu hesaptaki takvimi senkronize et"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"E-postayı bu hesaptan senkronize et"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Kablosuz\'a bağlandığında ekleri otomatik olarak indir"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Tamamlanamadı"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Senkronize edilecek gün sayısı"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Otomatik"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Bir gün"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Üç gün"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Bir hafta"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"İki hafta"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Bir ay"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Tümü"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Varsayılanı kullan"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Kullanıcı adı veya şifre hatalı."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Kullanıcı adı veya şifre yanlış."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Sunucuya güvenli biçimde bağlanılamıyor."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Sunucuya güvenli biçimde bağlanılamıyor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"İstemci sertifikası gerekli. Sunucuya bir istemci sertifikası ile bağlanmak ister misiniz?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sertifika geçersiz veya erişilemez."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Sunucu hata gönderdi. Kullanıcı adınızı ve şifrenizi kontrol ettikten sonra tekrar deneyin."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Sunucuya bağlanılamıyor."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Sunucuya bağlanılamıyor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS gerekli ancak sunucu tarafından desteklenmiyor."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Kimlik doğrulama yöntemleri sunucu tarafından desteklenmiyor."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Güvenlik hatası nedeniyle sunucu bağlantısı açılamadı."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Sunucu bağlantısı açılamadı."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Yanlış bir sunucu adresi yazdınız veya sunucu, E-postanın desteklemediği bir protokol sürümü gerektiriyor."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Bu sunucuyla senkronizasyon için izniniz yok. Daha fazla bilgi edinmek için sunucunuzun yöneticisine başvurun."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Uzaktan güvenlik yönetimi"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"<xliff:g id="SERVER">%s</xliff:g> sunucusu, Android cihazınızın bazı güvenlik özelliklerini uzaktan kontrol etmesine izin vermenizi gerektiriyor. Bu hesabı ayarlamayı tamamlamak istiyor musunuz?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Bu sunucu, Android cihazınız tarafından desteklenmeyen güvenlik özellikleri gerektiriyor, örneğin: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Bir hesabın kullanıcı adını değiştiremezsiniz. Farklı kullanıcı adıyla hesap eklemek için Hesap ekle\'ye dokunun."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"UYARI: E-posta uygulamasının cihazınızı yönetme yetkisinin devre dışı bırakılması, bunu gerektiren tüm e-posta hesaplarının yanı sıra bu hesaplar ait e-postaları, kişileri, takvim olaylarını ve diğer verileri siler."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Güvenlik güncellemesi"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> için güvenlik ayarlarınızı güncellemeniz gerekiyor."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" hesabı güvenlik gereksinimleri nedeniyle senkronize edilemez."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" hesabı, güvenlik ayarları güncellemesi gerektiriyor."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" hesabının güvenlik ayarları değiştirildi; kullanıcının işlem yapmasına gerek yok."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Güvenlik güncellemesi gerekli"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Güvenlik politikaları değişti"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Güvenlik politikaları karşılanamıyor"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Cihaz güvenliği"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"<xliff:g id="SERVER">%s</xliff:g> sunucusu, Android telefonunuzdaki bazı güvenlik özelliklerini uzaktan kontrol etmesine izin vermenizi gerektiriyor."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Ayrıntıları düzenle"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" için ekran kilidi PIN\'inizi veya şifrenizi değiştirmeniz gerekiyor."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Ekr kilidi şifr süresi doluyor"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Ekran kilidinizin PIN veya şifresinin süresi doldu."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Ekr kilidi şifr süresi doldu"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Ekran kilidi şifresinin süresi doluyor"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Ekran kilidi PIN\'inizi veya şifrenizi kısa süre içinde değiştirmeniz gerekiyor, aksi takdirde <xliff:g id="ACCOUNT">%s</xliff:g> hesabına ait veriler silinecek. Bunu şimdi değiştirmek ister misiniz?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Ekran kilidi şifresinin süresi doldu"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"<xliff:g id="ACCOUNT">%s</xliff:g> hesabına ait veriler cihazınızdan siliniyor. Ekran kilidi PIN\'inizi veya şifrenizi değiştirerek bu verileri geri yükleyebilirsiniz. Bunu şimdi değiştirmek ister misiniz?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Kaydedilmeyen değişiklikler silinsin mi?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Oturum açılamadı."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"<xliff:g id="ACCOUNT">%s</xliff:g> için kullanıcı adı veya şifre yanlış. Bunları şimdi güncellemek ister misiniz?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Varsayılan hesap"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"E-postaları varsayılan olarak bu hesaptan gönder"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Ekleri indir"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Son iletilerin eklerini Kablosuz üzerinden otomatik indir"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"E-posta bildirimleri"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Sıklığı, bildirimleri vs. senkronize et"</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"E-posta geldiğinde bildirim gönder"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Gelen kutusunu denetleme sıklığı"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Gelen ayarlar"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Kullanıcı adı, şifre ve diğer gelen sunucu ayarları"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Giden ayarlar"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Kullanıcı adı, şifre ve diğer giden sunucu ayarları"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Politikalar uygulandı"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Hiçbiri"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Desteklenmeyen politikalar"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Hiçbiri"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Senkronize etmeyi dene"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Bu hesabı senkronize etmek için buraya dokunun"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Hesap adı"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Adınız"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"İmza"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Hızlı yanıtlar"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"E-posta oluştururken sık girdiğiniz metinleri düzenleyin"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Gönderdiğiniz iletilere metin ekleyin"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Bildirim ayarları"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Veri kullanımı"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Güvenlik politikaları"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Hızlı yanıtı düzenle"</string>
- <string name="save_action" msgid="1988862706623227093">"Kaydet"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Kişileri senkronize et"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Bu hesaba ilişkin kişileri senkronize et"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Takvimi senkronize et"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Bu hesabın takvim etkinliğini senkronize et"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"E-postayı senk. et"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Bu hesaba ilişkin e-postaları senkronize et"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Titreşim"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"E-posta geldiğinde aynı zamanda titret"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Her zaman"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Yalnızca sessizken"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Hiçbir zaman"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Titreşim"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Zil sesi seçin"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Sunucu ayarları"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Hesabı kaldır"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" hesabı E-postadan kaldırılacak."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Hesabı kaldır"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Hesabı kaldır"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Senkronizasyon seçenekleri"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Senkronizasyon seçenekleri (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Senkronizasyon ayarları"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Kontrol sıklığı"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Senkronize edilecek gün sayısı"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Eposta hes"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Hesap seçin"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Klasör seçin"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Hesap bulunamadı. Kaldırılmış olabilir."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Klasör bulunamadı. Kaldırılmış olabilir."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Yalnızca bazı \"Plus\" hesapları bu programın bağlanmasına izin veren POP erişimi içerir. Doğru e-posta adresinizle ve şifrenizle oturum açamıyorsanız, ödemeli bir \"Plus\" hesabına sahip olmayabilirsiniz. Bu e-posta hesaplarına erişmek için web tarayıcıyı başlatın."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Bu e-posta hesabını ayarlamadan önce T-Online web sitesini ziyaret edin ve POP3 e-posta erişimi için bir şifre oluşturun."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Kurumsal"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Hesap oluşturulamadı. Tekrar deneyin."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"E-posta"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Sunucu tarafından belirlenen güvenlik politikalarını etkinleştirir"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"<xliff:g id="DOMAIN">%s</xliff:g> aranıyor…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="DOMAIN">%2$s</xliff:g> alanından <xliff:g id="RESULTS">%1$d</xliff:g> sonuç"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="DOMAIN">%2$s</xliff:g> alanından <xliff:g id="RESULTS">%1$d</xliff:g> sonuç"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Ayarlar"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Genel ayarlar"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Uygulama"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Otomatik ilerle"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Bir iletiyi sildikten sonra gösterilecek ekranı seçin"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Onay kutularını gizle"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"İleti listelerinde seçmek için dokunun ve basılı tutun"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Silmeden önce onayla"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"İletiler"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Göndermeden önce onayla"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"İletiler"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Şu iletiye ilerle:"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Daha yeni ileti"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Eski ileti"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"İleti listesi"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"İleti metni boyutu"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Çok küçük metin"</item>
- <item msgid="4415205108584620118">"Küçük metin"</item>
- <item msgid="4550219696381691112">"Normal boyutlu metin"</item>
- <item msgid="6227813549949219991">"Büyük metin"</item>
- <item msgid="1197917420815786571">"Çok büyük metin"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"İleti metni boyutu"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Çok Küçük"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Küçük"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Normal"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Büyük"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Çok büyük"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Yanıtı tüm alıcılara gönder"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"İleti yanıtlarında \"Yanıtı tüm alıcılara gönder\"i varsayılan yap"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Resimleri göstermek için sor"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"İletilerdeki resimler otomatik olarak gösterilmeyecek"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Resimleri göster\" temizlendi."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Senkronize etmek için bekleniyor"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"E-postanız yakında görüntülenecek."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Değiştirmek için simgeye dokunun."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Birleştirlmş Gln Kts"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Okunmayan"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Yıldızlı"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Yükleniyor…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Kurulum için dokunun."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Henüz bir e-posta hesabı oluşturmadınız."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"E-postada ara"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Ara: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"\"<xliff:g id="ID_1">%1$s</xliff:g>\" sorgusu için arama sonuçları"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Sonuçlar bekleniyor"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Bazı sunucularda uzun sürebilir."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Klasörler"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Cihaz kamerasının kullanımına izin verme"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Cihaz şifresi gerektir"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Son şifrelerin tekrar kullanılmasını kısıtla"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Şifrelerde son kullanım tarihi gerektir"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Boştaki cihazın ekranını kilitlemesini gerektir"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Senk. edilen takvim etkinliği sayısını sınırlandır"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Senkronize edilen e-posta sayısını sınırlandır"</string>
- <string name="quick_1" msgid="3426057697353380951">"Teşekkür ederiz!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Benim için uygun görünüyor!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Bunu daha sonra okuyup size geri döneceğim."</string>
- <string name="quick_4" msgid="3988974084396883051">"Bu konuyu tartışmak üzere bir toplantı ayarlayalım."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Dolaşımdayken bu hesabın arka plan senkronizasyonu devre dışı bırakılır."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Yanıt gönderiliyor..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"İleti yok."</string>
-</resources>
diff --git a/email2/res/values-tr/uploader.xml b/email2/res/values-tr/uploader.xml
deleted file mode 100644
index a7a307625..000000000
--- a/email2/res/values-tr/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Hızlı Yükleme"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Hızlı Yükleme Albümü"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Yükleniyor"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Tamamlandı"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Duraklatıldı"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d fotoğraf %3$d video"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d fotoğraf • %2$d video"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"düşük pil"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"fotoğraf kotası aşıldı"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"dolaşımda"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"Kablosuz bekleniyor"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"şarj edilene kadar ertelendi"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"bağlantı bekleniyor"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"%s içinde yeniden deneniyor"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Bekleyen Yüklemeleri göster"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Tamamlanan Yüklemeleri göster"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Çevrimiçi Görüntüle"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Bekleyen Yüklemeleri göster"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Bekleyen Yüklemeleri gizle"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Ayrıntıları Göster"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Ayrıntıları Gizle"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Ayarlar"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Yükleme tarihi: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="PERCENTSIGN">%%</xliff:g><xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Hesap"</string>
- <string name="upload" msgid="2615541458361216022">"Yükle"</string>
- <string name="ok" msgid="2516349681897895312">"TAMAM"</string>
- <string name="cancel" msgid="1207103189404543868">"İptal"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Şuraya yükleniyor: "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" "<b>"%s"</b>" için"</string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Yükleme başlatılamadı."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Dosya kullanılamıyor."</string>
- <string name="account_error" msgid="1904775271866104941">"Hesap bilgileri alınamadı."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Hesabınızda oturum açılırken bir sorun oluştu."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Tekrar denemek için bekliyor"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Kablosuz bekleniyor"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Yükleniyor"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Başarısız"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Tamamlandı"</string>
- <string name="pause_state_running" msgid="711411177620353982">"yükleniyor"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"el ile durduruldu"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"duraklatıldı - düşük pil"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"duraklatıldı - şarj edilene kadar ertelendi"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"duraklatıldı - bağlantı bekleniyor"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"duraklatıldı - PWA kotası doldu"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"duraklatıldı - kablosuz bekleniyor"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"duraklatıldı - dolaşımda"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"tekrar denemek için bekleniyor"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 dakika"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 dakika"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 dakika"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Veri bağlantısı yok"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Hesabın disk kotası doldu"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Dosya bulunamadı"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Hizmet hatası"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Ağ hatası"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Kimlik doğrulaması başarısız oldu"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Bekleyen yüklemeler [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Tamamlanan yüklemeler [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Yüklemeleri duraklat"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Yüklemeleri devam ettir"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Şimdi yükle"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Daha sonra yükle"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Yükleme"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Görüntüle"</string>
- <string name="manager_retry" msgid="939534318469518843">"Tekrar dene"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Yükleme iptal edildi"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Yükleme zaten tamamlandı"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Tümünü senkronize et"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Son Senkronizasyon:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Tamamlanmış öğeler listesi boş."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Hızlı Yükleme"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Yüklemeler tamamlandı"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Yüklemeler duraklatıldı"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Hızlı Yükleme henüz etkinleştirilmedi"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Büyük boyutlu dosyalar yalnızca Kablosuz bağlantı kullanılarak yüklenecektir."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Dosyalar taranıyor..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"<xliff:g id="PHOTOCOUNT">%1$d</xliff:g> fotoğraf ve <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> video yüklenmek üzere hazırlanıyor..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Yüklenmesi gereken başka fotoğraf/video yok."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Sunucuyla iletişimde bir sorun oluştu. Lütfen daha sonra tekrar deneyin."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Tümünü senkronize etme işlemi iptal edildi"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Tümünü Senkronize Et"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Tamamlananları Görüntüle"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Bekleyenleri Göster"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Genel"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Tüm yüklemeleri duraklat"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Güç"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Yalnızca telefon şarj olurken yükle."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Kablosuz"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Yalnızca Kablosuz müsait olduğunda yükle."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Fotoğraflar"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Hesap"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Yükleme koşulları"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Fotoğraf boyutu"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Videolar"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Hesap"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Video yüklemelerinde Google Foto hesabı kullanılacak."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Yükleme koşulları"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Şu an Google Foto bağlantı ayarları kullanılıyor."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Yalnızca mobil ağlar üzerinden fotoğraflar"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotoğraflar ve videolar mobil ağlar üzerinden"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Fotoğraflar ve videolar yalnızca Kablosuz üzerinden"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Hakkında"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Hızlı Yükleme Sürümü"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Önerilen: 1600 piksel (paylaşım, yazdırma ve ekran koruyucular için)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Orijinal boyut (en yavaş yükleme)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"duraklatıldı - SD kart kullanılamıyor"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"SD kart kullanılamıyor"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Hızlı Yükleme ayrlrı"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Hızlı Yükleme"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Yeni fotoğrafları ve videoları kişisel web albümüne otomatik olarak yükle"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Yükleme durumu"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"İleri Düzey"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Mobil yüklemeler"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Dolaşımda yüklemeler"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Fotoğrafları ve videoları veri ağında dolaşımdayken yükle"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Pildeyken yüklemeler"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Fotoğrafları ve videoları yalnızca şarj olurken yükle"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Mevcut fotoğrafları yükle"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Telefonunuzdaki tüm mevcut fotoğrafları ve videoları şimdi yükleyin"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Devre dışı"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Yükleniyor (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">":%1$d / %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Duraklatıldı: yüklemeyi devam ettirmek için dokunun"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Mevcut fotoğrafları yükle"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Telefonunuzdaki daha önce yüklenmemiş fotoğrafların ve videoların web üzerindeki kişisel albüme yüklenmesi zaman alabilir, ancak bu işlem arka planda yapılacaktır. Devam etmek istediğinizden emin misiniz?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Evet"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Hayır"</string>
-</resources>
diff --git a/email2/res/values-uk/strings.xml b/email2/res/values-uk/strings.xml
deleted file mode 100644
index 2782d1e1c..000000000
--- a/email2/res/values-uk/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Читати вкладені файли пошти"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Дозволяє програмі читати вкладені файли вашої пошти."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Доступ до даних постачальника послуг електронної пошти"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Дозволяє програмі отримувати доступ до бази даних вашої пошти, зокрема отриманих і надісланих повідомлень, імен користувачів та паролів."</string>
- <string name="app_name" msgid="5815426892327290362">"Ел.пошта"</string>
- <string name="compose_title" msgid="427986915662706899">"Написати"</string>
- <string name="debug_title" msgid="5175710493691536719">"Налагодж."</string>
- <string name="next_action" msgid="3931301986364184415">"Далі"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Скасувати"</string>
- <string name="previous_action" msgid="5181616311579820981">"Назад"</string>
- <string name="send_action" msgid="1729766205562446418">"Надісл."</string>
- <string name="reply_action" msgid="4262472229221507619">"Відпов."</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Відпов. всім"</string>
- <string name="delete_action" msgid="8421026208288857155">"Видалити"</string>
- <string name="forward_action" msgid="669174181042344116">"Переслати"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Позначити зірочкою"</string>
- <string name="done_action" msgid="7497990549515580249">"Готово"</string>
- <string name="create_action" msgid="3062715563215392251">"Створити"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Видалити"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Швидких відповідей немає."</string>
- <string name="discard_action" msgid="6532206074859505968">"Відхилити"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Зберег. чернетку"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Вставити швидк.відповідь"</string>
- <string name="read_action" msgid="4701484794504781686">"Позн. як проч."</string>
- <string name="unread_action" msgid="6280399049357552826">"Позн. як непроч."</string>
- <string name="set_star_action" msgid="4660317166196258160">"Додати зір."</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Видал. зірочку"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Оновити"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Дод. обл.запис"</string>
- <string name="compose_action" msgid="4045702519637388045">"Написати"</string>
- <string name="search_action" msgid="6325101454876682308">"Пошук"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Налашт-ня обл. зап."</string>
- <string name="settings_action" msgid="6334807007967459412">"Налаштування"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Параметри синхронізації"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Позн. як непрочит."</string>
- <string name="move_action" msgid="3059189775933985898">"Переміст."</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+Копія/прихована"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Копія/прихов. копія"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Вкласти файл"</string>
- <string name="close_action" msgid="533058985745238100">"Закрити"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Надісл. всі повідом."</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Виберіть вклад. файл"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Перемістити до"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Завантаження повідомлень…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Проблема зі з’єднанням."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Не вдалося завантажити текст повідомлення. Воно може бути завелике для перегляду."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Переміщення повідомлення"</item>
- <item quantity="other" msgid="371256717624461324">"Переміщення повідомлень"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Переміщення не підтримується в облікових записах POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Неможливо перемістити, оскільки вибрано декілька облікових записів."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Повідомлення в папках \"Чернетки\", \"Вихідні\" та \"Надіслані\" перемістити неможливо."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> непрочит. (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> непрочит. (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> непрочит. (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"у <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> обл. записах"</item>
- <item quantity="other" msgid="2723797835410343458">"у <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> обл. записах"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"кому: <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"Нових повідомлень: <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Усі облікові записи"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> обл. запис"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> обл. зап."</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Вхідні"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Вихідні"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Чернетки"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Кошик"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Надісл."</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Спам"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Непрочитані"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Вхідні (непрочитані)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Вхідні (усі)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Об’єднаний перегляд (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"Облікових записів: <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="4145163147488719025">"Облікових записів: <xliff:g id="ACCOUNT_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Версія: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Вхідні"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Із зіроч."</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Чернетки"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Вихідні"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Об\'єднаний перегляд"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Показати всі папки"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Облікові записи"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Останні папки (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Усі папки"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Останні папки"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Тема"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Без теми"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Завант. інші повід."</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"Вибрано <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- <item quantity="other" msgid="7901361399231876038">"Вибрано <xliff:g id="MESSAGE_COUNT">%d</xliff:g>"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Немає повідомлень"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Кому"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Копія"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Прих. копія"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Тема"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Від:"</string>
- <string name="to" msgid="4392614766835725698">"Кому"</string>
- <string name="cc" msgid="7017720927911078193">"Копія"</string>
- <string name="bcc" msgid="3098643138241111579">"Прих. копія"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Тема"</string>
- <string name="body_hint" msgid="4279864165439577668">"Напишіть електронний лист"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Оригінал. повід. --------"\n"Тема: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Від: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Кому: <xliff:g id="TO">%3$s</xliff:g>"\n"Копія: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> напис.:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Додати цитований текст"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Включити текст"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Додайте принаймні одного отримувача."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Деякі електронні адреси недійсні."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Файл завеликий для вклад."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Вставити швидку відповідь"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> і ще <xliff:g id="NUMBER">%2$d</xliff:g>"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Кому:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Копія:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Прихована копія:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Дата:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Від:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Тема:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Переглян."</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Установити"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Відтворити"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Завантаж."</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Інформація"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Зберегти"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Збережено"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Зупинити"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Вклад. файл збереж. як <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Вкладений файл не збережено."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Перед надсиланням буде завантажено один або кілька вкладених файлів із повідомлення, яке ви пересилаєте."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Повідомлення"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Запрошення"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Вклад.файл <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Вкладення: <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Показати зображ."</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Завжди показувати"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Завжди показувати зображення від цього відправника"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Зображення від цього відправника відображатимуться автоматично."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Переглянути в Календарі"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Запрошення календаря"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Підете?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Так"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Можливо"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Ні"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Ви прийняли це запрошення."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Ви відповіли \"Можливо\" на це запрошення."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Ви відхилили це запрошення."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Показати деталі"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Деталі повідомлення"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Інформація про вкладений файл"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Потрібне з’єднання Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Налаштування Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Налаштування програми"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Не вдалося відкрити вкладений файл."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Цей файл неможливо зберегти чи відкрити, оскільки вкладений файл такого типу може містити шкідливі програми."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Цей вкладений файл неможливо зберегти або відкрити через правила безпеки цього облікового запису."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Цей вкладений файл завеликий для завантаження через мобільну мережу. Його можна завантажити під час наступного з’єднання з мережею Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Немає встановленої програми, яка може відкрити цей вкладений файл. Спробуйте завантажити відповідну програму з Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Цей вкладений файл є програмою. Перед її встановленням потрібно поставити прапорець поруч із пунктом \"Невідомі джерела\" в меню Налаштування &gt; Програми."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Програми не можна встановлювати безпосередньо з електронної пошти. Спочатку збережіть цю програму, а потім установіть її, використовуючи програму \"Завантаження\"."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Не вдалося завантажити вкладений файл."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Під час розшифрування повідомлення сталася помилка."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Перегляд <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Видалити це повідомлення?"</item>
- <item quantity="other" msgid="4437637377522896262">"Видалити ці повідомлення?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Повідом. видалено."</item>
- <item quantity="other" msgid="6574961322865652255">"Повідомл. видалено."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Повідомл. відхилено."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Лист збереж. як чернетку."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Неможливо показати вкладений файл."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Не вдалося завантажити вкладений файл \"<xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Відкривання повідомлення…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"До <xliff:g id="MAILBOX_NAME">%2$s</xliff:g> переміщено <xliff:g id="NUM_MESSAGE">%1$d</xliff:g> повідомлення"</item>
- <item quantity="other" msgid="2286739630865943494">"До <xliff:g id="MAILBOX_NAME">%2$s</xliff:g> переміщено <xliff:g id="NUM_MESSAGE">%1$d</xliff:g> повідомл."</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Не вдалося переслати один або кілька вкладених файлів."</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Вкладений файл не переслано"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Помилка входу в обліковий запис <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Не вдалося ввійти"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> Б"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> Б"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> Кб"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g> Кб"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> Мб"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g> Мб"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> Гб"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g> Гб"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Новіші"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Старіші"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Налаштування облікового запису"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Обліковий запис електронної пошти"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Обліковий запис можна налаштувати за допомогою лише кількох дій."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Електронна адреса"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Пароль"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Надсилати електронні листи з цього облікового запису за умовчанням"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Налашт-ня вручну"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Введіть дійсну електронну адресу та пароль."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Копія облікового запису"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Ви вже використовуєте це ім’я користувача для облікового запису \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Цей пароль починається чи закінчується одним або кількома символами пробілів. Багато серверів не підтримують паролі з пробілами."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Отримання інфо про облік. запис…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Перевірка налашт-нь вихід. сервера…"</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Перевірка налашт-нь вихід. сервера…"</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Налаштування облікового запису"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Ваш обліковий запис налаштовано. Скоро надійдуть листи!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Назвіть цей обл. запис. (додатково)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Ваше ім\'я (відображено у вихідних повідомл.)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Це поле не може бути порожнім."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Налаштування облікового запису"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Тип облікового запису"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Тип облікового запису?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Налаштування облікового запису"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Параметри сервера вхідних повідомлень"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Ім\'я корист."</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Пароль"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Сервер"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Порт"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Тип безпеки"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Немає"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Прийняти всі сертифікати)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (Прийняти всі сертифікати)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Видалити ел.лист із сервера"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Ніколи"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Коли видалено з вхідних"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Префікс шляху IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Додатково"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Налаштування облікового запису"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Параметри сервера вихідних повідомлень"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Сервер SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Порт"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Тип безпеки"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Потрібно ввійти"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Ім\'я корист."</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Пароль"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Налаштування облікового запису"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Параметри сервера"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Сервер"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Домен\\ім\'я корист."</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Викор. безпеч. з\'єднання (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Прийняти всі сертифікати SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Сертифікат клієнта"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Вибрати"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Використати сертифікат клієнта"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Видалити"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Немає"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"Ідентифікатор мобіл. пристрою"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Параметри облікового запису"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Параметри облікового запису"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Частота перевірки вхідних"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Ніколи"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Автомат. (опер-р)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Кожні 5 хвилин"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Кожні 10 хвилин"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Кожні 15 хвилин"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Кожні 30 хвилин"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Щогодини"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Надсилати електронні листи з цього облікового запису за умовчанням"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Сповіщати мене, коли надходить лист"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Синхронізувати контакти з цього облікового запису"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Синхронізувати календар із цього облікового запису"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Синхронізувати електронну пошту з цього облікового запису"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Автоматично завантажувати вкладення, коли є з\'єднання з Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Не вдалося закінчити"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Синхронізувати за стільки днів:"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Автоматично"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Один день"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Три дні"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"1 тиждень"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"2 тижні"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Один місяць"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Усі"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Парам. обл.зап. за умовч."</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Ім’я користувача чи пароль неправильні."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Ім’я користувача або пароль неправильні."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Неможливо безпечно з’єднатись із сервером."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Неможливо безпечно з’єднатися із сервером."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Потрібен сертифікат клієнта. Під’єднатися до сервера із сертифікатом клієнта?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Сертифікат недійсний або недоступний."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Сервер повідомив про помилку. Перевірте своє ім’я користувача та пароль і повторіть спробу."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Неможливо з’єднатись із сервером."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Неможливо з’єднатись із сервером."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS обов\'язк., але не підтрм. цим сервером."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Методи автентифікації не підтримуються сервером."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Не вдалося відкрити з’єднання із сервером через помилку безпеки."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Не вдалося відкрити з’єднання із сервером."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Ви ввели неправильну адресу сервера чи для сервера потрібна версія протоколу, яка не підтримується електронною поштою."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"У вас немає дозволу на синхронізацію з цим сервером. Зв’яжіться з адміністратором сервера, щоб дізнатися більше."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Віддалене керування безпекою"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Сервер <xliff:g id="SERVER">%s</xliff:g> потребує вашого дозволу віддалено контролювати деякі функції безпеки вашого пристрою Android. Завершити налаштування цього облікового запису?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Для цього сервера потрібні функції безпеки, які не підтримуються вашим пристроєм Android, зокрема: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Ви не можете змінювати ім’я користувача облікового запису. Щоб додати обліковий запис з іншим іменем користувача, торкніться опції \"Додати обліковий запис\"."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"ЗАСТЕРЕЖЕННЯ. Дезактивація повноважень програми електронної пошти на адміністрування вашого пристрою призведе до видалення всіх облікових записів електронної пошти, що потребують адміністрування, разом з їхніми електронними листами, контактами, подіями календаря й іншими даними."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Оновлення системи безпеки"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Потрібно оновити налаштування безпеки для облікового запису <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Обліковий запис \"<xliff:g id="ACCOUNT">%s</xliff:g>\" неможливо синхронізувати через вимоги безпеки."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Для облікового запису \"<xliff:g id="ACCOUNT">%s</xliff:g>\" потрібно оновити налаштування безпеки."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Налаштування безпеки облікового запису \"<xliff:g id="ACCOUNT">%s</xliff:g>\" змінено. Користувачу не потрібно нічого робити."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Потрібно оновити прав. безпеки"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Правила безпеки змінено"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Неможл. дотрим. правил безпеки"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Безпека пристрою"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Сервер <xliff:g id="SERVER">%s</xliff:g> потребує вашого дозволу віддалено контролювати деякі функції безпеки вашого пристрою Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Редаг. деталі"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"Потрібно змінити PIN-код або пароль блокування екрана для \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Терм.дії пар.блок.екр.закінч."</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Термін дії PIN-коду чи пароля блокування екрана закінчився."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Пароль блок. екр. вже не діє"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Терм. дії пароля блок. екр. закінчується"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Незабаром потрібно буде змінити PIN-код або пароль блокування екрана, інакше дані для облікового запису <xliff:g id="ACCOUNT">%s</xliff:g> буде стерто. Змінити зараз?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Терм. дії пароля блок. екрана закінчився"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Дані для облікового запису <xliff:g id="ACCOUNT">%s</xliff:g> стираються з вашого пристрою. Їх можна відновити, змінивши PIN-код або пароль блокування екрана. Змінити зараз?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Відхилити незбережені зміни?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Не вдалося ввійти"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Ім’я користувача чи пароль для облікового запису <xliff:g id="ACCOUNT">%s</xliff:g> неправильні. Оновити зараз?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Обл. зап. за умовч."</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Надіс. ел.листи з цього обл. зап. за умовч."</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Завантажити вкладені файли"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Автом. завантажувати вклад. файли з останніх повідом. через WiFi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Сповіщення ел. пошти"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Синхронізуйте частоту, сповіщення тощо"</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Надсилати сповіщення, коли надходить лист"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Частота перевірки вхідн."</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Налашт. вхід. повід."</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Ім’я корист., пароль й інші налашт-ня сервера вхідних повідомл."</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Налашт-ня вихідних"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Ім’я корист., пароль й інші налашт-ня сервера вихідних повідомл."</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Правила, які застосовуються"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Немає"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Правила, які не підтримуються"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Немає"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Спробувати синхронізувати"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Торкніться тут, щоб синхронізувати цей обліковий запис"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Назва обл. зап."</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Ваше ім\'я"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Підпис"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Швидкі відповіді"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Редагувати текст, що часто вставляється під час створення листів"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Додав. текст у надісл. повідомл."</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Налаштування сповіщень"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Використання даних"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Правила безпеки"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Редагувати швидку відповідь"</string>
- <string name="save_action" msgid="1988862706623227093">"Зберегти"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Синхрон. контакти"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Синхрон. контакти для облік. запису"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Синхрон. календ."</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Синхроніз. календар із цим обл.зап."</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Синхроніз. ел.пошту"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Синхрон. ел. пошту для обл. запису"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Вібросигнал"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Також вібрув., коли надійде лист"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Завжди"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Лише в беззвуч. реж."</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Ніколи"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Вібросигнал"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Вибрати сигнал дзвінка"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Налашт-ня сервера"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Видал. обл. зап."</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Обліковий запис \"<xliff:g id="ACCOUNT">%s</xliff:g>\" буде видалено з Пошти."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Видалити обліковий запис"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Видалити обліковий запис"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Параметри синхронізації"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Параметри синхронізації (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Налаштування синхронізації"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Частота перевірки"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Синхронізувати за стільки днів:"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Обл.зап.пошти"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Вибрати облік. запис"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Вибір папки"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Обліковий запис не знайдено. Можливо, його видалено."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Папку не знайдено. Можливо, її було видалено."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Лише деякі облікові записи класу \"Plus\" надаються з доступом до сервера POP, що дозволяє цій програмі підключатися. Якщо ви не можете ввійти, використовуючи правильну електронну адресу та пароль, можливо, у вас немає платного облікового запису \"Plus\". Запустіть веб-переглядач, щоб мати доступ до цих облікових записів електронної пошти."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Перед налаштуванням цього облікового запису пошти відвідайте веб-сайт T-Online і створіть пароль для доступу до поштового сервера POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Корпоратив"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Не вдалося створити обліковий запис. Повторіть спробу."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Ел.пошта"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Активує правила безпеки, указані сервером"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Пошук на <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"Результатів з <xliff:g id="DOMAIN">%2$s</xliff:g>: <xliff:g id="RESULTS">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"Результатів з <xliff:g id="DOMAIN">%2$s</xliff:g>: <xliff:g id="RESULTS">%1$d</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Налаштування"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Загальні налаштування"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Програма"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Автоматичний перехід"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Виберіть, що відображати після видалення повідомлення"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Cховати прапорці"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"У списках повідомлень торкніться й утримуйте, щоб вибрати"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Підтвердити перед видаленням"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Повідомлення"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Підтвердити перед надсиланням"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Повідомлення"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Перейти до"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Новішого повідомлення"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Старішого повідомлення"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Списку повідомлень"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Розмір тексту повідомлення"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Дуже малий текст"</item>
- <item msgid="4415205108584620118">"Малий текст"</item>
- <item msgid="4550219696381691112">"Звичайний розмір тексту"</item>
- <item msgid="6227813549949219991">"Великий текст"</item>
- <item msgid="1197917420815786571">"Дуже великий текст"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Розмір тексту повідомлення"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Дуже малий"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Малий"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Звичайний"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Великий"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Дуже великий"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Відповісти всім"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Зробити \"Відповісти всім\" відповіддю на повідомлення за умовчанням"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Запитувати, чи показувати зображення"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Зображення в повідомленнях не відображатимуться автоматично"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Налаштування \"Показати зображення\" очищено."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> з <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Очікування на синхронізацію"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Ваша електронна пошта з’явиться незабаром."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Торк.знач.для зміни."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Об\'єднані Вхідні"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Непрочитані"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Із зірочкою"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Завантаження…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Торкніться, щоб налаштувати."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Ви ще не налаштували обліковий запис електронної пошти."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Пошук в електронній пошті"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Пошук у <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Результати пошуку для запиту \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Очікування результатів"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Деяким серверам потрібно багато часу."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Папки"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Забороняти використання камери пристрою"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Вимагати пароль пристрою"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Обмежувати повторне викор. остан.паролів"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Вимагати закінчення терміну дії пароля"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Вимаг. блок-ня екрана неактивн. пристрою"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Обмежувати к-сть синхронізованих подій календаря"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Обмежувати к-сть синхронізованих електрон. листів"</string>
- <string name="quick_1" msgid="3426057697353380951">"Дякую!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Мені підходить!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Я прочитаю це пізніше, а потім дам знати."</string>
- <string name="quick_4" msgid="3988974084396883051">"Потрібно зустрітися, щоб це обговорити."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"У роумінгу фонову синхронізацію для цього облікового запису вимкнено."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Надсилання відповіді..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Немає повідомлень."</string>
-</resources>
diff --git a/email2/res/values-uk/uploader.xml b/email2/res/values-uk/uploader.xml
deleted file mode 100644
index 6f6af5bb9..000000000
--- a/email2/res/values-uk/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Мобільне завантаження"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Альбом мобільного завантаження"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Завантаження"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Завершено"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Призупинено"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d фото • %3$d відео"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d фото • %2$d відео"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"розряджена батарея"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"перевищено квоту на фотографії"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"роумінг"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"очікування на WiFi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"відкладено до зарядження"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"очікування з’єднання"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"повтор через %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Показати завантаження, які очікують"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Показати завершені завантаження"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Переглянути в режимі онлайн"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Показати завантаження, які очікують"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Сховати завантаження, які очікують"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Показати деталі"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Сховати деталі"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Налаштування"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Завантажено: %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Обліковий запис"</string>
- <string name="upload" msgid="2615541458361216022">"Завантажити"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Скасувати"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Завантаження на "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" для "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Помилка ініціалізації завантаження."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Файл недоступний."</string>
- <string name="account_error" msgid="1904775271866104941">"Помилка отримання інформації облікового запису."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Виникла проблема з входом у ваш обліковий запис."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Очікування на повтор"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Очікування на WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Завантаження"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Помилка"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Завершено"</string>
- <string name="pause_state_running" msgid="711411177620353982">"завантаження"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"призупинено вручну"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"призупинено – розряджена батарея"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"призупинено – відкладено до зарядження"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"призупинено – очікування з’єднання"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"призупинено – вичерпано квоту на PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"призупинено – очікування на WiFi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"призупинено – роумінг"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"очікування на повтор"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 хвилина"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 хвилини"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 хвилин"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Немає передавання даних"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Розмір облікового запису перевищує квоту на диску"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Файл не знайдено"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Помилка служби"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Помилка мережі"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Помилка автентифікації"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Завантаження, які очікують [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Завершені завантаження [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Призупинити завантаження"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Відновити завантаження"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Завантажити зараз"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Завантажити пізніше"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Не завантажувати"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Переглянути"</string>
- <string name="manager_retry" msgid="939534318469518843">"Повторити"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Завантаження скасовано"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Завантаження вже завершено"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Синхронізувати все"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Востаннє синхронізовано:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Список завершених елементів порожній."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Мобільне завантаження"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Завантаження завершено"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Завантаження призупинено"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Миттєве завантаження ще не активовано"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Великі файли буде завантажено лише через з’єднання WiFi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Сканування на наявність файлів..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Підготовка <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> фото та <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> відео для завантаження..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Не потрібно завантажувати додаткові фото чи відео."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Під час обміну даними із сервером виникла проблема. Повторіть спробу пізніше."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Синхронізувати все – скасовано"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Синхронізувати все"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Переглянути завершені"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Переглянути завантаження, які очікують"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Загальне"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Призупинити всі завантаження"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Живлення"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Завантажувати лише коли телефон заряджається."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Завантажувати, лише коли є доступ до Wi-Fi."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Фото"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Обліковий запис"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Умови завантаження"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Розмір фото"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Відео"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Обліковий запис"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Обліковий запис фото буде використано для завантаження відео."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Умови завантаження"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Наразі використовуються налаштування з’єднання для фото."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Лише фото через мобільні мережі"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Фото та відео через мобільні мережі"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Фото та відео лише через Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Відомості"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Версія Моб. завантаження"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Рекомендовано: 1600 пікселів (для надсилання, друку та заставок)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Оригінальний розмір (найповільніше завантаження)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"призупинено – карта SD недоступна"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Карта SD недоступна"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Налашт. моб. завантаж."</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Мобільне завантаж."</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Автоматично завантажувати нові фото та відео в приватний веб-альбом"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Статус завантаження"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Розширені"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Завантаження в мобільних мережах"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Завантаження в роумінгу"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Завантажувати фото та відео в роумінгу в мережі передавання даних"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Завантаж. при зарядж."</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Завантажувати фото та відео лише під час заряджання"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Завантажити існуючі фото"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Завантажити будь-які існуючі фото та відео з телефону зараз"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Вимкнено"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Завантаження (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d з %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Призупинено: торкніться, щоб відновити завантаження"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Завантажити існуючі фото"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Завантаження фото та відео, ще не завантажених із вашого телефону в приватний альбом в Інтернеті, може тривати якийсь час, однак це відбуватиметься у фоновому режимі. Дійсно продовжити?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Так"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Ні"</string>
-</resources>
diff --git a/email2/res/values-vi/strings.xml b/email2/res/values-vi/strings.xml
deleted file mode 100644
index 94731a2d4..000000000
--- a/email2/res/values-vi/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Đọc tệp đính kèm trong email"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Cho phép ứng dụng đọc tệp đính kèm trong email của bạn."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Truy cập dữ liệu của nhà cung cấp email"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Cho phép ứng dụng truy cập cơ sở dữ liệu email của bạn, bao gồm thư đã nhận, thư đã gửi, tên người dùng và mật khẩu."</string>
- <string name="app_name" msgid="5815426892327290362">"Email"</string>
- <string name="compose_title" msgid="427986915662706899">"Soạn"</string>
- <string name="debug_title" msgid="5175710493691536719">"Gỡ lỗi"</string>
- <string name="next_action" msgid="3931301986364184415">"Tiếp theo"</string>
- <string name="okay_action" msgid="8365197396795675617">"OK"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Hủy"</string>
- <string name="previous_action" msgid="5181616311579820981">"Trước"</string>
- <string name="send_action" msgid="1729766205562446418">"Gửi"</string>
- <string name="reply_action" msgid="4262472229221507619">"Trả lời"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Trả lời tất cả"</string>
- <string name="delete_action" msgid="8421026208288857155">"Xóa"</string>
- <string name="forward_action" msgid="669174181042344116">"Chuyển tiếp"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Gắn dấu sao"</string>
- <string name="done_action" msgid="7497990549515580249">"Xong"</string>
- <string name="create_action" msgid="3062715563215392251">"Tạo mới"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Xóa"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Không có câu trả lời nhanh nào."</string>
- <string name="discard_action" msgid="6532206074859505968">"Hủy"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Lưu thư nháp"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Chèn trả lời nhanh"</string>
- <string name="read_action" msgid="4701484794504781686">"Đánh dấu là đã đọc"</string>
- <string name="unread_action" msgid="6280399049357552826">"Đánh dấu là chưa đọc"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Thêm dấu sao"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Xóa dấu sao"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Làm mới"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Thêm tài khoản"</string>
- <string name="compose_action" msgid="4045702519637388045">"Soạn"</string>
- <string name="search_action" msgid="6325101454876682308">"Tìm kiếm"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Cài đặt tài khoản"</string>
- <string name="settings_action" msgid="6334807007967459412">"Cài đặt"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Tùy chọn đồng bộ hóa"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Đánh dấu là chưa đọc"</string>
- <string name="move_action" msgid="3059189775933985898">"Di chuyển"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Thêm Cc/Bcc"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Đính kèm tệp"</string>
- <string name="close_action" msgid="533058985745238100">"Đóng"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Gửi tất cả thư"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Chọn tệp đính kèm"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Di chuyển tới"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Đang tải thư…"</string>
- <string name="status_network_error" msgid="2611654064403817391">"Sự cố kết nối."</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Không thể tải nội dung thư. Có thể thư quá lớn để có thể xem."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Di chuyển thư"</item>
- <item quantity="other" msgid="371256717624461324">"Di chuyển thư"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Di chuyển không được hỗ trợ trên các tài khoản POP3."</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Không thể di chuyển vì lựa chọn chứa nhiều tài khoản."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Không thể di chuyển thư trong Thư nháp, Hộp thư đi và Thư đã gửi."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> chưa đọc (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> chưa đọc (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> chưa đọc (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"trong <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> tài khoản"</item>
- <item quantity="other" msgid="2723797835410343458">"trong <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> tài khoản"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"tới <xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> tin nhắn mới"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Tất cả các tài khoản"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> tài khoản"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> tài khoản"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Hộp thư đến"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Hộp thư đi"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Tin nháp"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Thùng rác"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Đã gửi"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Thư rác"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Chưa đọc"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Hộp thư đến (chưa đọc)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Hộp thư đến (tất cả)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Chế độ xem tổng hợp (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> tài khoản"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> tài khoản"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Phiên bản: <xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Hộp thư đến"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Được gắn dấu sao"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Tin nháp"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Hộp thư đi"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Chế độ xem tổng hợp"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Hiển thị tất cả thư mục"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Tài khoản"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Thư mục gần đây (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Tất cả thư mục"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Thư mục gần đây"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Chủ đề"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Không có chủ đề"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Tải tin nhắn khác"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> được chọn"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> được chọn"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Không có thư"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Tới"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Chủ đề"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Từ:"</string>
- <string name="to" msgid="4392614766835725698">"Tới"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Bcc"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Chủ đề"</string>
- <string name="body_hint" msgid="4279864165439577668">"Soạn email"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Tin nhắn gốc --------"\n"Chủ đề: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Từ: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Tới: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> đã viết:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Bao gồm nội dung được trích dẫn"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Bao gồm văn bản"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Thêm ít nhất một người nhận."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Một số địa chỉ email không hợp lệ."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Tệp quá lớn để có thể đính kèm."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Chèn trả lời nhanh"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> và <xliff:g id="NUMBER">%2$d</xliff:g> người khác"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Tới:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Ngày:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Từ:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Chủ đề:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Xem"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Cài đặt"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Phát"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Tải"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Thông tin"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Lưu"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Đã lưu"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Dừng"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Đã lưu tệp đính kèm với tên <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Không thể lưu tệp đính kèm."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Một hoặc nhiều tệp đính kèm trong thư chuyển tiếp của bạn sẽ được tải xuống trước khi gửi."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Thư"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Mời"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Tệp đính kèm <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Phần đính kèm:<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Hiển thị ảnh"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Luôn hiển thị"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Luôn hiển thị ảnh từ người gửi này"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Hình ảnh từ người gửi này sẽ được hiển thị tự động."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Xem trong Lịch"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Thư mời lịch"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Bạn có tham gia không?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Có"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Có thể"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Không"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Bạn đã chấp nhận lời mời này."</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Bạn đã trả lời thư mời này là \"có thể\"."</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Bạn đã từ chối lời mời này."</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Hiển thị chi tiết"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Chi tiết thư"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Thông tin tệp đính kèm"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Yêu cầu kết nối Wi-Fi"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Cài đặt Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Cài đặt ứng dụng"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Không thể mở tệp đính kèm."</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Bạn không thể lưu hoặc mở tệp này do loại tệp đính kèm này có thể chứa phần mềm độc hại."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Không thể lưu hoặc mở tệp đính kèm này do chính sách bảo mật của tài khoản này."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Tệp đính kèm này quá lớn để tải xuống qua mạng di động. Bạn có thể tải tệp xuống vào lần sau khi bạn kết nối với mạng Wi-Fi."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Không có ứng dụng đã cài đặt nào có thể mở tệp đính kèm này. Hãy thử tải xuống ứng dụng phù hợp từ Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Tệp đính kèm này là một ứng dụng. Bạn phải đánh dấu chọn Nguồn không xác định trong Cài đặt &gt; Ứng dụng trước khi bạn có thể cài đặt ứng dụng này."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Không thể cài đặt trực tiếp ứng dụng từ email. Trước tiên, hãy lưu ứng dụng này rồi cài đặt ứng dụng bằng cách sử dụng ứng dụng Tải xuống."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Không thể tải xuống tệp đính kèm."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Đã xảy ra lỗi khi giải mã thư."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Đang xem <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Xóa thư này?"</item>
- <item quantity="other" msgid="4437637377522896262">"Xóa các thư này?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Tin nhắn đã bị xóa."</item>
- <item quantity="other" msgid="6574961322865652255">"Tin nhắn đã bị xóa."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Tin nhắn đã bị hủy."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Tin nhắn đã được lưu dưới dạng tin nháp."</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Không thể hiển thị tệp đính kèm."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Không thể tải tệp đính kèm \" <xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Đang mở thư…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"Đã di chuyển <xliff:g id="NUM_MESSAGE">%1$d</xliff:g> thư tới <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"Đã di chuyển <xliff:g id="NUM_MESSAGE">%1$d</xliff:g> thư tới <xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Không thể chuyển tiếp một hoặc nhiều tệp đính kèm"</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Tệp đính kèm không được chuyển tiếp"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"Đăng nhập vào <xliff:g id="ACCOUNT_NAME">%s</xliff:g> không thành công."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Không thể đăng nhập"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Mới hơn"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Cũ hơn"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Thiết lập tài khoản"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"Tài khoản email"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Bạn có thể thiết lập tài khoản của mình chỉ bằng vài bước."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Địa chỉ email"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Mật khẩu"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Gửi email từ tài khoản này theo mặc định"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Thiết lập thủ công"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Hãy nhập địa chỉ email và mật khẩu hợp lệ."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Tài khoản trùng lặp"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Bạn đã và đang sử dụng tên người dùng này cho tài khoản \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Mật khẩu này bắt đầu hoặc kết thúc bằng một hoặc nhiều ký tự dấu cách. Nhiều máy chủ không hỗ trợ mật khẩu chứa dấu cách."</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Đang truy xuất thông tin tài khoản…"</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Đang kiểm tra cài đặt máy chủ thư đến..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Đang kiểm tra cài đặt máy chủ thư đi..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Thiết lập tài khoản"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"Tài khoản của bạn đã được thiết lập và email đang được gửi!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Đặt tên cho tài khoản này (tùy chọn)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Tên bạn (được hiển thị trong tin nhắn đi)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Không được để trống trường này."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Thiết lập tài khoản"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Loại tài khoản"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Đây loại tài khoản gì?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Thiết lập tài khoản"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Cài đặt máy chủ thư đến"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Tên người dùng"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Mật khẩu"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Máy chủ"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Cổng"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Loại bảo mật"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Không"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Chấp nhận tất cả chứng chỉ)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (chấp nhận tất cả chứng chỉ)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Xóa email khỏi máy chủ"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Chưa bao giờ"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Khi tôi xóa khỏi Hộp thư đến"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Tiền tố đường dẫn IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Tùy chọn"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Thiết lập tài khoản"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Cài đặt máy chủ thư đi"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Máy chủ SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Cổng"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Loại bảo mật"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Yêu cầu đăng nhập"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Tên người dùng"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Mật khẩu"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Thiết lập tài khoản"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Cài đặt máy chủ"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Máy chủ"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Tên miền\\Tên người dùng"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Sử dụng kết nối bảo mật (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Chấp nhận tất cả chứng chỉ SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Chứng chỉ ứng dụng khách"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Chọn"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Sử dụng chứng chỉ ứng dụng khách"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Xóa"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Không"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID Thiết bị di động"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Cài đặt tài khoản"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Tùy chọn tài khoản"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Tần suất kiểm tra hộp thư đến"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Chưa bao giờ"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Tự động (Đẩy)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"5 phút một lần"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"10 phút một lần"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"15 phút một lần"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"30 phút một lần"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Hàng giờ"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Gửi email từ tài khoản này theo mặc định"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Thông báo cho tôi khi email đến"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Đồng bộ hóa danh bạ từ tài khoản này"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Đồng bộ hóa lịch từ tài khoản này"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Đồng bộ hóa email từ tài khoản này"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Tự động tải xuống tệp đính kèm khi được kết nối Wi-Fi"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Không thể kết thúc"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Số ngày đồng bộ hóa"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Tự động"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Một ngày"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Ba ngày"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Một tuần"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Hai tuần"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Một tháng"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Tất cả"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Sử dụng mặc định của tài khoản"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Tên người dùng hoặc mật khẩu không chính xác."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Tên người dùng hoặc mật khẩu không chính xác."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Không thể kết nối an toàn với máy chủ."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Không thể kết nối an toàn với máy chủ."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Cần chứng chỉ ứng dụng khách. Bạn có muốn kết nối với máy chủ bằng chứng chỉ ứng dụng khách không?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Chứng chỉ không hợp lệ hoặc không thể truy cập được."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Máy chủ trả về lỗi. Hãy kiểm tra tên người dùng và mật khẩu rồi thử lại."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Không thể kết nối với máy chủ."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Không thể kết nối với máy chủ."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS được yêu cầu nhưng không được máy chủ hỗ trợ."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Phương thức xác thực không được máy chủ hỗ trợ."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Không thể mở kết nối với máy chủ do lỗi bảo mật."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Không thể mở kết nối tới máy chủ."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Bạn đã nhập địa chỉ máy chủ không chính xác hoặc máy chủ yêu cầu phiên bản giao thức mà Email không hỗ trợ."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Bạn không được phép đồng bộ hóa với máy chủ này. Hãy liên hệ với quản trị viên máy chủ của bạn để biết thêm thông tin."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Quản lý bảo mật từ xa"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Máy chủ <xliff:g id="SERVER">%s</xliff:g> yêu cầu bạn cho phép kiểm soát từ xa một số tính năng bảo mật của thiết bị Android của bạn. Bạn có muốn hoàn tất việc thiết lập tài khoản này không?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Máy chủ này yêu cầu các tính năng bảo mật mà thiết bị Android của bạn không hỗ trợ, bao gồm: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Bạn không thể thay đổi tên người dùng của tài khoản. Để thêm tài khoản có tên người dùng khác, hãy chạm vào Thêm tài khoản."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"CẢNH BÁO: Việc vô hiệu hóa quyền quản lý điện thoại của bạn của ứng dụng Email sẽ xóa tất cả tài khoản email yêu cầu quyền đó, cùng với email, địa chỉ liên hệ, sự kiện lịch và các dữ liệu khác."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Cập nhật bảo mật"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> yêu cầu bạn cập nhật cài đặt bảo mật của mình."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Không thể đồng bộ hóa tài khoản \"<xliff:g id="ACCOUNT">%s</xliff:g>\" do các yêu cầu về bảo mật."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Tài khoản \"<xliff:g id="ACCOUNT">%s</xliff:g>\" yêu cầu cập nhật cài đặt bảo mật."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Tài khoản \"<xliff:g id="ACCOUNT">%s</xliff:g>\" đã thay đổi cài đặt bảo mật; không yêu cầu bất kỳ tác vụ người dùng nào."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Yêu cầu cập nhật bảo mật"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Chính sách bảo mật đã thay đổi"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Ko thể đáp ứng c.sách bảo mật"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Bảo mật thiết bị"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Máy chủ <xliff:g id="SERVER">%s</xliff:g> yêu cầu bạn cho phép kiểm soát từ xa một số tính năng bảo mật của thiết bị Android của bạn."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Chỉnh sửa chi tiết"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" yêu cầu bạn thay đổi mật khẩu hoặc mã PIN khóa màn hình của bạn."</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Mật khẩu khóa màn hình sắp hết hạn"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Mật khẩu hoặc mã PIN khóa màn hình của bạn đã hết hạn."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Mật khẩu khóa màn hình đã hết hạn"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Mật khẩu khóa màn hình sắp hết hạn"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Bạn cần phải sớm thay đổi PIN khóa màn hình hoặc mật khẩu, nếu không dữ liệu của <xliff:g id="ACCOUNT">%s</xliff:g> sẽ bị xóa. Bạn có muốn thay đổi ngay bây giờ không?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Mật khẩu khóa màn hình đã hết hạn"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Dữ liệu của <xliff:g id="ACCOUNT">%s</xliff:g> đang bị xóa khỏi thiết bị của bạn. Bạn có thể khôi phục dữ liệu bằng cách thay đổi PIN khóa màn hình hoặc mật khẩu của mình. Bạn có muốn thay đổi ngay bây giờ không?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Hủy những thay đổi chưa lưu?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Không thể đăng nhập"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Tên người dùng hoặc mật khẩu của <xliff:g id="ACCOUNT">%s</xliff:g> không chính xác. Bạn có muốn cập nhật các thông tin này ngay bây giờ không?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"Tài khoản mặc định"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Gửi email từ tài khoản này theo mặc định"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Tải xuống tệp đính kèm"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Tự động tải xuống tệp đính kèm tin nhắn gần đây qua Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Thông báo qua email"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Đồng bộ hóa tần suất, thông báo, v.v."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Gửi thông báo khi email đến"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Tần suất kiểm tra hộp thư đến"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Cài đặt thư đến"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Tên người dùng, mật khẩu và các cài đặt máy chủ thư đến khác"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Cài đặt thư đi"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Tên người dùng, mật khẩu và cài đặt máy chủ thư đi khác"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Chính sách bắt buộc"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Bỏ chọn tất cả"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Chính sách không được hỗ trợ"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Bỏ chọn tất cả"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Thử đồng bộ hóa"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Chạm vào đây để đồng bộ hóa tài khoản này"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Tên tài khoản"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Tên bạn"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Chữ ký"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Trả lời nhanh"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Chỉnh sửa văn bản mà bạn thường xuyên chèn khi soạn email"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Thêm văn bản vào tin nhắn bạn gửi"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Cài đặt thông báo"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Sử dụng dữ liệu"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Chính sách bảo mật"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Chỉnh sửa trả lời nhanh"</string>
- <string name="save_action" msgid="1988862706623227093">"Lưu"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Đồng bộ hóa danh bạ"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Đồng bộ hóa danh bạ cho tài khoản này"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Đồng bộ hóa lịch"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Đ.bộ hóa sự kiện lịch cho TK này"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Đồng bộ hóa email"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Đồng bộ hóa email cho tài khoản này"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Rung"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Cũng rung khi email đến"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Luôn luôn"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Chỉ khi ở chế độ im lặng"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Chưa bao giờ"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Rung"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Chọn nhạc chuông"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Cài đặt máy chủ"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Xóa tài khoản"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"Tài khoản \"<xliff:g id="ACCOUNT">%s</xliff:g>\" sẽ bị xóa khỏi Email."</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Xóa tài khoản"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Xóa tài khoản"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Tùy chọn đồng bộ hóa"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Tùy chọn đồng bộ hóa (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Cài đặt đồng bộ hóa"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Tần suất kiểm tra"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Số ngày đồng bộ hóa"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"Tài khoản email"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Chọn tài khoản"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Chọn thư mục"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"Không tìm thấy tài khoản. Tài khoản có thể đã bị xóa."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Không tìm thấy thư mục. Thư mục có thể đã bị xóa."</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Chỉ một số tài khoản \"Plus\" mới có quyền truy cập POP cho phép chương trình này kết nối. Nếu bạn không thể đăng nhập bằng địa chỉ email và mật khẩu chính xác của mình, bạn có thể không có tài khoản \"Plus\" tính phí. Hãy khởi chạy trình duyệt web để yêu cầu cấp quyền truy cập vào các tài khoản email này."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Trước khi thiết lập tài khoản email này, hãy truy cập trang web T-Online và tạo mật khẩu để truy cập email POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Doanh nghiệp"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Không thể tạo tài khoản. Hãy thử lại."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"Email"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Cho phép chính sách bảo mật được máy chủ chỉ định"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Đang tìm kiếm <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> kết quả từ <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> kết quả từ <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Cài đặt"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Cài đặt chung"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Ứng dụng"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Tự động tiến"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Chọn màn hình hiển thị sau khi bạn xóa thư"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ẩn hộp kiểm"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Trong danh sách các thư, chạm và giữ để chọn"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Xác nhận trước khi xóa"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Thư"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Xác nhận trước khi gửi"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Thư"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Chuyển sang"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Thư mới hơn"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Thư cũ hơn"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Danh sách thư"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Kích thước nội dung tin nhắn"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Văn bản rất nhỏ"</item>
- <item msgid="4415205108584620118">"Văn bản nhỏ"</item>
- <item msgid="4550219696381691112">"Văn bản cỡ thường"</item>
- <item msgid="6227813549949219991">"Chữ lớn"</item>
- <item msgid="1197917420815786571">"Văn bản rất lớn"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Kích thước nội dung tin nhắn"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Rất nhỏ"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Nhỏ"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Thường"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Lớn"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Rất lớn"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Trả lời tất cả"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Đặt \"Trả lời tất cả\" làm mặc định để trả lời thư"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Yêu cầu hiển thị hình ảnh"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Hình ảnh trong thư sẽ không được tự động hiển thị"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"Đã xóa \"Hiển thị hình ảnh\"."</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> trong tổng số <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Đang đợi đồng bộ hóa"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Email của bạn sẽ xuất hiện sớm."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Chạm b.t để chuyển."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Hộp thư đến kết hợp"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Chưa đọc"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Được gắn dấu sao"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Đang tải…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Chạm để thiết lập."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Bạn chưa thiết lập tài khoản email."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Tìm kiếm email"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Tìm kiếm trong <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Kết quả tìm kiếm cho \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Đang chờ kết quả"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Một số máy chủ có thể xử lý lâu."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Thư mục"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Ko cho phép sử dụng máy ảnh của thiết bị"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Yêu cầu mật khẩu của thiết bị"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Hạn chế sử dụng lại các mật khẩu gần đây"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Buộc mật khẩu hết hạn"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Thiết bị cần ở chế độ rảnh để khóa màn hình"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Giới hạn số lượng sự kiện lịch được đồng bộ hóa"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Giới hạn số lượng email được đồng bộ hóa"</string>
- <string name="quick_1" msgid="3426057697353380951">"Cảm ơn bạn!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Tôi thấy được đấy!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Tôi sẽ đọc thư này sau và sẽ liên hệ lại với bạn."</string>
- <string name="quick_4" msgid="3988974084396883051">"Chúng ta hãy cùng tổ chức một cuộc họp để thảo luận về vấn đề này."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Đồng bộ hóa nền cho tài khoản này bị tắt trong khi chuyển vùng."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Đang gửi trả lời..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Không có thư nào."</string>
-</resources>
diff --git a/email2/res/values-vi/uploader.xml b/email2/res/values-vi/uploader.xml
deleted file mode 100644
index 66c63744e..000000000
--- a/email2/res/values-vi/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Tải lên tức thì"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Album tải lên tức thì"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Đang tải lên"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Đã hoàn tất"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Đã tạm dừng"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d ảnh • %3$d video"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d ảnh • %2$d video"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"pin yếu"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"đã vượt quá dung lượng ảnh quy định"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"Đang chuyển vùng"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"đang đợi WiFi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"hoãn đến khi sạc"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"đang đợi kết nối"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"đang thử lại sau %s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Hiển thị các nội dung tải lên đang chờ xử lý"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Hiển thị các nội dung tải lên đã hoàn tất"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Xem trực tuyến"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Hiển thị các nội dung tải lên đang chờ xử lý"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Ẩn các nội dung tải lên đang chờ xử lý"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Hiển thị chi tiết"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Ẩn chi tiết"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Cài đặt"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Đã tải lên %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"Tài khoản"</string>
- <string name="upload" msgid="2615541458361216022">"Tải lên"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
- <string name="cancel" msgid="1207103189404543868">"Hủy"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Đang tải lên "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" cho "<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Khởi chạy tải lên không thành công."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Tệp không sẵn có."</string>
- <string name="account_error" msgid="1904775271866104941">"Không thể truy xuất thông tin tài khoản."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Đã xảy ra sự cố khi đăng nhập vào tài khoản của bạn."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Đang đợi thử lại"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Đang đợi WiFi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Đang tải lên"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Không thành công"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Ðã hoàn tất"</string>
- <string name="pause_state_running" msgid="711411177620353982">"đang tải lên"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"đã tạm dừng theo cách thủ công"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"đã tạm dừng - pin yếu"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"đã tạm dừng - hoãn đến khi sạc"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"đã tạm dừng - đang đợi kết nối"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"đã tạm dừng - vượt quá dung lượng PWA quy định"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"đã tạm dừng - đang đợi wifi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"đã tạm dừng - đang chuyển vùng"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"đang đợi thử lại"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 phút"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 phút"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 phút"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Không có kết nối dữ liệu"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Tài khoản hết dung lượng đĩa cho phép"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Không tìm thấy tệp"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Lỗi dịch vụ"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Lỗi mạng"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Xác thực không thành công"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Nội dung tải lên đang chờ xử lý [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Các nội dung tải lên đã hoàn tất [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Tạm dừng tải lên"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Tiếp tục tải lên"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Tải lên ngay bây giờ"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Tải lên sau"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Không tải lên"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Xem"</string>
- <string name="manager_retry" msgid="939534318469518843">"Thử lại"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Đã hủy tải lên"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Tải lên đã hoàn tất"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Đồng bộ hóa tất cả"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Đồng bộ hóa lần cuối:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Danh sách các mục đã hoàn tất trống."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Tải lên tức thì"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Tải lên hoàn tất"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Dịch vụ tải lên bị tạm dừng"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Tải lên tức thì chưa được kích hoạt"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Các tệp lớn sẽ chỉ được tải lên qua kết nối WiFi."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Đang quét tìm tệp..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Đang chuẩn bị <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> ảnh và <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> video để tải lên..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Không cần tải thêm ảnh/video nào lên."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Đã xảy ra sự cố khi liên lạc với máy chủ. Vui lòng thử lại sau."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Quá trình đồng bộ hóa tất cả bị hủy"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Đồng bộ hóa tất cả"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Xem nội dung tải lên đã hoàn tất"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Xem nội dung tải lên đang chờ xử lý"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Chung"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Tạm dừng tất cả hoạt động tải lên"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Nguồn điện"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Chỉ tải lên khi điện thoại đang được sạc."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Chỉ tải lên khi có Wi-Fi."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Ảnh"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"Tài khoản"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Điều kiện tải lên"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Kích thước ảnh"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Video"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"Tài khoản"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"Tài khoản ảnh sẽ sử dụng các nội dung tải lên video."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Điều kiện tải lên"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Cài đặt kết nối ảnh hiện được sử dụng."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Chỉ các ảnh qua mạng di động"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Ảnh &amp; video qua mạng di động"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Chỉ ảnh &amp; video qua Wi-Fi"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Giới thiệu"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"P.bản tải lên t.thì"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Được đề xuất: 1600 pixel (dành cho tính năng chia sẻ, in và trình bảo vệ màn hình)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Kích thước gốc (tốc độ tải lên chậm nhất)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"đã tạm dừng - thẻ SD không khả dụng"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Thẻ SD không khả dụng"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"C.đặt Tải lên t.thì"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Tải lên tức thì"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Tự động tải ảnh &amp; video mới lên album web riêng tư"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Trạng thái tải lên"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Nâng cao"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Nội dung tải lên qua di động"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Nội dung tải lên khi chuyển vùng"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Tải lên ảnh &amp; video khi chuyển vùng dữ liệu trên mạng dữ liệu"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Tải lên khi sạc pin"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Chỉ tải ảnh &amp; video lên khi đang sạc"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Tải lên ảnh hiện có"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Tải lên mọi ảnh &amp; video hiện có từ điện thoại của bạn ngay bây giờ"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Bị vô hiệu"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s: %2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Đang tải lên (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">": %1$d trong tổng số %2$d"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Tạm dừng: chạm để tiếp tục tải lên"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Tải lên ảnh hiện có"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Tải lên ảnh và video chưa được tải lên từ điện thoại của bạn lên album riêng tư trên web có thể mất một khoảng thời gian, nhưng sẽ được hoàn thành trong nền. Bạn có chắc chắn muốn tiếp tục không?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Có"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Không"</string>
-</resources>
diff --git a/email2/res/values-zh-rCN/uploader.xml b/email2/res/values-zh-rCN/uploader.xml
deleted file mode 100644
index 3dc5046fe..000000000
--- a/email2/res/values-zh-rCN/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"即时上传"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"“即时上传”相册"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"正在上传"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"已完成"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"已暂停"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d 张照片 • %3$d 段视频"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d 张照片 • %2$d 段视频"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"电量不足"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"超出照片配额"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"正在漫游"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"正在等待建立 WiFi 连接"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"充电时继续"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"正在等待建立连接"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"将于 %s后重新尝试"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"显示待处理的上传内容"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"显示已上传完毕的内容"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"在线查看"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"显示待处理的上传内容"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"隐藏待处理的上传内容"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"显示详情"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"隐藏详情"</string>
- <string name="menu_settings" msgid="5088116127086866634">"设置"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"上传时间:%s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"帐户"</string>
- <string name="upload" msgid="2615541458361216022">"上传"</string>
- <string name="ok" msgid="2516349681897895312">"确定"</string>
- <string name="cancel" msgid="1207103189404543868">"取消"</string>
- <string name="uploading_to" msgid="3986362895940069510">"正在上传到 "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" (用户:"<b>"%s"</b>")"</string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"上传初始化失败。"</string>
- <string name="toast_file_error" msgid="1315722681020841350">"文件不可用。"</string>
- <string name="account_error" msgid="1904775271866104941">"无法检索帐户信息。"</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"登录帐户时出现问题。"</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"正在等待重新尝试"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"正在等待建立 WiFi 连接"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"正在上传"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"失败"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"已完成"</string>
- <string name="pause_state_running" msgid="711411177620353982">"正在上传"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"已手动暂停"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"已暂停 - 电量不足"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"已暂停 - 充电时继续"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"已暂停 - 正在等待建立连接"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"已暂停 - Picasa 网络相册配额不足"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"已暂停 - 正在等待建立 WiFi 连接"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"已暂停 - 正在漫游"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"正在等待重新尝试"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 分钟"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 分钟"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 分钟"</string>
- <string name="retry_no_data" msgid="630347885498641534">"没有数据连接"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"帐户服务器空间不足"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"未找到文件"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"服务错误"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"网络错误"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"身份验证失败"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"待处理的上传内容 [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"已完成的上传内容 [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"暂停上传"</string>
- <string name="manager_resume" msgid="1608630525599824933">"继续上传"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"立即上传"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"稍后上传"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"不上传"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"查看"</string>
- <string name="manager_retry" msgid="939534318469518843">"重新尝试"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"上传已取消"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"已上传完毕"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"全部同步"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"最后同步时间:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"已完成项列表为空。"</string>
- <string name="notify_uploads" msgid="8593982942665493037">"即时上传"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"已上传完毕"</string>
- <string name="notify_paused" msgid="3999817913227671338">"上传已暂停"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"尚未激活“即时上传”"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"大文件只能通过 WiFi 连接上传。"</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"正在扫描文件..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"正在准备上传 <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> 张照片和 <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> 段视频..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"没有需要上传的其他照片/视频。"</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"与服务器通信时出现问题,请稍后重试。"</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"“全部同步”已取消"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"全部同步"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"查看已完成的上传内容"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"查看待处理的上传内容"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"常规"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"暂停所有上传"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"充电"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"仅在手机充电时上传。"</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"仅在建立 Wi-Fi 连接时上传。"</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"照片"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"帐户"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"上传条件"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"照片尺寸"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"视频"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"帐户"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"将用于上传视频的相册帐户。"</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"上传条件"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"目前采用照片的连接设置。"</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"通过移动网络上传的内容仅限照片"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"通过移动网络上传照片和视频"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"仅通过 Wi-Fi 上传照片和视频"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"关于"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"“即时上传”版本"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"推荐:1600 像素(用于分享、打印和屏幕保护程序)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"原始尺寸(上传速度最慢)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"已暂停 - 无法读取 SD 卡"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"无法读取 SD 卡"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"“即时上传”设置"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"即时上传"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"自动将新照片和视频上传到私人网络相册"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"上传状态"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"高级"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"使用移动网络时的上传设置"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"漫游时的上传设置"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"在数据网络中漫游时上传照片和视频"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"充电时上传"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"仅在充电时上传照片和视频"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"上传现有照片"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"立即上传手机中现有的全部照片和视频"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"已停用"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s:%2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"正在上传 (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">":第 %1$d 个,共 %2$d 个"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"已暂停:触摸即可继续上传"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"上传现有照片"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"对于还未从手机中上传到私人网络相册的照片和视频,上传过程可能需要一段时间,但会在后台进行。确定要继续吗?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"是"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"否"</string>
-</resources>
diff --git a/email2/res/values-zh-rTW/strings.xml b/email2/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 2b41f6506..000000000
--- a/email2/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"讀取電子郵件附件"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"允許這個應用程式讀取您的電子郵件附件。"</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"存取電子郵件供應商資料"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"允許這個應用程式存取您的電子郵件資料庫,包括收到的郵件、寄件備份、使用者名稱和密碼。"</string>
- <string name="app_name" msgid="5815426892327290362">"電子郵件"</string>
- <string name="compose_title" msgid="427986915662706899">"撰寫郵件"</string>
- <string name="debug_title" msgid="5175710493691536719">"偵錯"</string>
- <string name="next_action" msgid="3931301986364184415">"下一步"</string>
- <string name="okay_action" msgid="8365197396795675617">"確定"</string>
- <string name="cancel_action" msgid="6967435583794021865">"取消"</string>
- <string name="previous_action" msgid="5181616311579820981">"上一步"</string>
- <string name="send_action" msgid="1729766205562446418">"傳送"</string>
- <string name="reply_action" msgid="4262472229221507619">"回覆"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"回覆所有人"</string>
- <string name="delete_action" msgid="8421026208288857155">"刪除"</string>
- <string name="forward_action" msgid="669174181042344116">"轉寄"</string>
- <string name="favorite_action" msgid="4664259801498253756">"加上星號"</string>
- <string name="done_action" msgid="7497990549515580249">"完成"</string>
- <string name="create_action" msgid="3062715563215392251">"建立新回應"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"刪除"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"沒有任何快速回應。"</string>
- <string name="discard_action" msgid="6532206074859505968">"捨棄"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"儲存草稿"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"插入快速回應"</string>
- <string name="read_action" msgid="4701484794504781686">"標示為已讀取"</string>
- <string name="unread_action" msgid="6280399049357552826">"標示為未讀取"</string>
- <string name="set_star_action" msgid="4660317166196258160">"標上星號"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"移除星號"</string>
- <string name="refresh_action" msgid="5951383001436708175">"重新整理"</string>
- <string name="add_account_action" msgid="8835736309476033727">"新增帳戶"</string>
- <string name="compose_action" msgid="4045702519637388045">"撰寫郵件"</string>
- <string name="search_action" msgid="6325101454876682308">"搜尋"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"帳戶設定"</string>
- <string name="settings_action" msgid="6334807007967459412">"設定"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"同步處理選項"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"標示為未讀取"</string>
- <string name="move_action" msgid="3059189775933985898">"移動"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"新增副本/密件副本"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"新增副本/密件副本"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"附加檔案"</string>
- <string name="close_action" msgid="533058985745238100">"關閉"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"傳送所有郵件"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"選擇附件"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"移至"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"正在載入郵件..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"連線問題。"</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"無法載入郵件文字,郵件可能過大以致於無法檢視。"</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"移動郵件"</item>
- <item quantity="other" msgid="371256717624461324">"移動郵件數"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"POP3 帳戶不支援郵件移動功能。"</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"無法移動,因為選取了多個帳戶。"</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"無法移動 [草稿]、[寄件匣] 及 [寄件備份] 中的郵件。"</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> 封未讀取郵件 (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> 封未讀取郵件 (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> 封未讀取郵件 (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> 個帳戶"</item>
- <item quantity="other" msgid="2723797835410343458">"於 <xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g> 個帳戶"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"收件者:<xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> 封新郵件"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"所有帳戶"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> 個帳戶"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> 個帳戶"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"收件匣"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"寄件匣"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"草稿"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"垃圾桶"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"寄件備份"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"垃圾郵件"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"未讀取"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"收件匣 (未讀取)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"收信匣 (全部)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"合併檢視 (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> 個帳戶"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> 個帳戶"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"版本:<xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"收件匣"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"已加星號"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"草稿"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"寄件匣"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"合併檢視"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"顯示所有資料夾"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"帳戶"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"最近使用的資料夾 (<xliff:g id="EMAIL_ADDRESS">%s</xliff:g>)"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"所有資料夾"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"最近使用的資料夾"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"主旨"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"無主旨"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"載入更多郵件"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"已選取 <xliff:g id="MESSAGE_COUNT">%d</xliff:g> 封郵件"</item>
- <item quantity="other" msgid="7901361399231876038">"已選取 <xliff:g id="MESSAGE_COUNT">%d</xliff:g> 封郵件"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"沒有郵件"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"收件者"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"副本"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"密件副本"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"主旨"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"寄件者:"</string>
- <string name="to" msgid="4392614766835725698">"收件者"</string>
- <string name="cc" msgid="7017720927911078193">"副本"</string>
- <string name="bcc" msgid="3098643138241111579">"密件副本"</string>
- <string name="subject_hint" msgid="7253964583324677128">"主旨"</string>
- <string name="body_hint" msgid="4279864165439577668">"撰寫電子郵件"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"--------原始郵件 --------"\n"主旨:<xliff:g id="SUBJECT">%1$s</xliff:g>"\n"寄件者:<xliff:g id="SENDER">%2$s</xliff:g>"\n"收件者:<xliff:g id="TO">%3$s</xliff:g>"\n"副本:<xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>提到:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"包含引用文字"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"包含文字"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"請至少新增一個收件者。"</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"部分電子郵件地址無效。"</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"檔案過大,超過附件大小限制。"</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"插入快速回應"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g>以及其他 <xliff:g id="NUMBER">%2$d</xliff:g> 位"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"收件者:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"副本:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"密件副本:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"日期:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"寄件者:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"主旨:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"檢視"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"安裝"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"播放"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"載入"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"資訊"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"儲存"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"已儲存"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"停止"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"已將附件另存為 <xliff:g id="FILENAME">%s</xliff:g>。"</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"無法儲存附件。"</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"傳送轉寄的郵件之前,系統會先下載郵件中一或多個附件。"</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"郵件"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"邀請"</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"附件 (<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>)"</item>
- <item quantity="other" msgid="974463163535515223">"附件 (<xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>)"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"顯示圖片"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"永遠顯示"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"一律顯示這位寄件者所傳送的圖片"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"系統將會自動顯示這位寄件者所傳送的圖片。"</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"於日曆中查看"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"日曆邀請"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"您要參加嗎?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" 是"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" 不確定"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" 否"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"您已接受這個邀請。"</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"您已回覆「可能」接受邀請。"</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"您已拒絕這個邀請。"</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"顯示詳細資料"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"郵件詳細資料"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"附件資訊"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"需要 Wi-Fi 連線"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Wi-Fi 設定"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"應用程式設定"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"無法開啟附件。"</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"這類附件可能含有惡意軟體,因此您無法儲存或開啟這個檔案。"</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"受限於這個帳戶的安全性政策,系統無法儲存或開啟這個附件。"</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"這個附件過大,無法透過行動網路下載,您可以在下次連上 WiFi 網路時重新下載。"</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"您所安裝的應用程式都無法開啟這個附件,不妨從 Android Market 下載適用的應用程式試試看。"</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"這個附件是應用程式,您必須前往 [設定] &gt; [應用程式] 中勾選 [不明的來源],才能安裝這個應用程式。"</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"您無法直接透過電子郵件安裝應用程式。請先儲存這個應用程式,然後使用「下載」應用程式進行安裝。"</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"無法下載附件。"</string>
- <string name="message_decode_error" msgid="5016042255170947834">"為郵件解碼時發生錯誤。"</string>
- <string name="eml_view_title" msgid="8827210108543430336">"檢視 <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"您要刪除這封郵件嗎?"</item>
- <item quantity="other" msgid="4437637377522896262">"您要刪除這些郵件嗎?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"已刪除訊息。"</item>
- <item quantity="other" msgid="6574961322865652255">"已刪除訊息。"</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"已捨棄郵件。"</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"已儲存郵件草稿。"</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"無法顯示附件。"</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"無法載入附件「<xliff:g id="FILENAME">%s</xliff:g>」。"</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"正在開啟郵件…"</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> 封郵件已移至<xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> 封郵件已移至<xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"無法轉寄一或多個附件。"</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"無法轉寄附件"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> 登入失敗。"</string>
- <string name="login_failed_title" msgid="7624349996212476176">"無法登入"</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"較新"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"較舊"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"帳戶設定"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"電子郵件帳戶"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"只要幾個步驟即可設定您的帳戶。"</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"電子郵件地址"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"密碼"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"預設使用這個帳戶傳送電子郵件"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"手動設定"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"輸入有效的電子郵件地址和密碼。"</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"複製帳戶"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"您的「<xliff:g id="DUPLICATE">%s</xliff:g>」帳戶已經使用這個使用者名稱。"</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"這組密碼的開頭或結尾為一或多個空白字元,許多伺服器都不支援包含空白字元的密碼。"</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"正在擷取帳戶資訊..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"正在檢查收信伺服器設定..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"正在檢查外寄伺服器設定..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"帳戶設定"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"您的帳戶已設定完成,可以開始收發電子郵件了!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"設定帳戶名稱 (選擇性)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"您的姓名 (顯示於外寄郵件)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"這個欄位不能留空。"</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"帳戶設定"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"帳戶類型"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"帳戶類型為何?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"帳戶設定"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"內送伺服器設定"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"使用者名稱"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"密碼"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"伺服器"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"通訊埠"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"安全性類型"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"無"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (接受所有憑證)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (接受所有憑證)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"從伺服器中刪除電子郵件"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"永不刪除"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"當我從收件匣刪除時"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP 路徑字首"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"選用"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"帳戶設定"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"外寄伺服器設定"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP 伺服器"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"通訊埠"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"安全性類型"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"要求登入"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"使用者名稱"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"密碼"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"帳戶設定"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"伺服器設定"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"伺服器"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"網域\\使用者名稱"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"使用安全連線 (SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"接受所有安全資料傳輸層 (SSL) 憑證"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"用戶端憑證"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"選取"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"使用用戶端憑證"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"移除"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"無"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"行動裝置 ID"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"帳戶設定"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"帳戶選項"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"收件匣檢查頻率"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"不要檢查"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"自動 (預先載入)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"每 5 分鐘檢查一次"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"每 10 分鐘檢查一次"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"每 15 分鐘檢查一次"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"每 30 分鐘檢查一次"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"每小時檢查一次"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"預設使用這個帳戶傳送電子郵件"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"收到電子郵件時通知我"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"同步處理這個帳戶的聯絡人資訊"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"同步處理這個帳戶的日曆"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"同步處理這個帳戶的電子郵件"</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"連上 Wi-Fi 時自動下載附件。"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"無法完成"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"同步處理的天數"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"自動"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"1 天"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"3 天"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"1 週"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"2 週"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"1 個月"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"全部"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"使用帳戶預設值"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"使用者名稱或密碼不正確。"</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"使用者名稱或密碼不正確。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"無法安全連線至伺服器。"</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"無法安全連線至伺服器。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"需要用戶端憑證,您要透過用戶端憑證連線到伺服器嗎?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"憑證無效或無法使用。"</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"伺服器傳回錯誤,請檢查您的使用者名稱和密碼,然後再試一次。"</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"無法連線至伺服器。"</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"無法連線至伺服器。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"必須使用 TLS,但此伺服器不支援。"</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"伺服器不支援這些驗證方法。"</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"發生安全性錯誤,無法連線至伺服器。"</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"無法連線至伺服器。"</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"您輸入的伺服器位址不正確,或是電子郵件不支援伺服器所需的通訊協定版本。"</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"您沒有與這個伺服器保持同步的權限。如要瞭解詳情,請與您的伺服器管理員聯絡。"</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"遠端安全性管理"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"<xliff:g id="SERVER">%s</xliff:g> 伺服器要求您的授權,使其可遠端控制 Android 裝置的一些安全性功能,您要結束這個帳戶的設定程序嗎?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"您的 Android 裝置不支援這個伺服器所需的安全性功能,包括:<xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"您無法變更帳戶的使用者名稱。如要以其他使用者名稱新增帳戶,請輕觸 [新增帳戶]。"</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"警告:如果停用「電子郵件」應用程式的裝置管理權限,系統將刪除所有需要使用這項權限的「電子郵件」帳戶,以及帳戶中所有的電子郵件、聯絡人、日曆活動和其他資料。"</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"安全性更新"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"您必須更新 <xliff:g id="ACCOUNT">%s</xliff:g> 的安全性設定。"</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"因為不符合安全性需求,系統無法同步處理「<xliff:g id="ACCOUNT">%s</xliff:g>」帳戶。"</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"「<xliff:g id="ACCOUNT">%s</xliff:g>」帳戶的安全性設定必須更新。"</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"「<xliff:g id="ACCOUNT">%s</xliff:g>」帳戶已自行變更安全性設定,使用者不需採取任何行動。"</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"安全性必須更新"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"安全性政策已變更"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"不符合安全性政策標準"</string>
- <string name="account_security_title" msgid="3511543138560418587">"裝置安全性"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"<xliff:g id="SERVER">%s</xliff:g> 伺服器要求您的授權,使其可遠端控制 Android 裝置的一些安全性功能。"</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"請編輯資料"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"您必須變更「<xliff:g id="ACCOUNT">%s</xliff:g>」的螢幕鎖定 PIN 或密碼。"</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"螢幕上鎖密碼即將過期"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"您的螢幕上鎖 PIN 或密碼已過期。"</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"螢幕上鎖密碼已過期"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"螢幕上鎖密碼即將過期"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"您必須儘快變更螢幕上鎖 PIN 或密碼,否則 <xliff:g id="ACCOUNT">%s</xliff:g> 的資料將遭到清除,要立即變更嗎?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"螢幕鎖定密碼已過期"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"<xliff:g id="ACCOUNT">%s</xliff:g> 的資料已從您的裝置中清除,如要還原這些資料,請變更螢幕上鎖 PIN 或密碼,要立即變更嗎?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"要捨棄尚未儲存的變更?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"無法登入"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"<xliff:g id="ACCOUNT">%s</xliff:g> 的使用者名稱或密碼不正確。您要現在更新嗎?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"預設帳戶"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"預設使用這個帳戶傳送電子郵件"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"下載附件"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"透過 WiFi 自動下載最新郵件的附件"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"電子郵件通知"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"同步處理頻率和通知等其他設定"</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"收到電子郵件時傳送通知"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"收件匣檢查頻率"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"內收設定"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"使用者名稱、密碼和其他內送伺服器設定"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"外寄設定"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"使用者名稱、密碼和其他外寄伺服器設定"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"強制執行的政策"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"無"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"不支援的政策"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"無"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"嘗試同步處理"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"輕觸這裡即可同步處理這個帳戶"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"帳戶名稱"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"您的姓名"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"簽名檔"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"快速回應"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"編輯您撰寫電子郵件時經常插入的文字"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"在送出的郵件後面附加文字"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"通知設定"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"資料用量"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"安全性政策"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"編輯快速回應"</string>
- <string name="save_action" msgid="1988862706623227093">"儲存"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"同步處理聯絡人"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"同步處理此帳戶的聯絡人"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"同步處理日曆"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"同步處理這個帳戶的日曆活動"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"同步處理電子郵件"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"同步處理此帳戶的電子郵件"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"震動"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"收到電子郵件時震動提醒"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"一律"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"靜音時才啟用"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"永遠不要"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"震動"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"選擇鈴聲"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"伺服器設定"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"移除帳戶"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"系統將從 [電子郵件] 中移除帳戶「<xliff:g id="ACCOUNT">%s</xliff:g>」。"</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"移除帳戶"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"移除帳戶"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"同步處理選項"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"同步處理選項 (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"同步處理設定"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"檢查頻率"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"同步處理的天數"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"電子郵件帳戶"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"選擇帳戶"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"選取資料夾"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"找不到帳戶,帳戶可能已遭移除。"</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"找不到資料夾,資料夾可能已遭移除。"</string>
- <string name="provider_note_live" msgid="2995297671709325333">"只有部分包含 POP 存取功能的「Plus」帳戶能與這個程式連線。如果您輸入的電子郵件地址和密碼無誤,卻仍無法登入,表示您可能尚未購買「Plus」帳戶。請啟動網頁瀏覽器,以存取這些電子郵件帳戶。"</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"設定這個電子郵件帳戶前,請先造訪 T-Online 網站,並設定 POP3 電子郵件收發功能的密碼。"</string>
- <string name="exchange_name" msgid="1190783774800310346">"公司"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Microsoft Exchange ActiveSync"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"無法建立帳戶,請再試一次。"</string>
- <string name="device_admin_label" msgid="8680224994637869414">"電子郵件"</string>
- <string name="device_admin_description" msgid="426727923791430306">"啟用伺服器專用安全性政策"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"搜尋中 <xliff:g id="DOMAIN">%s</xliff:g>…"</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"只有 <xliff:g id="RESULTS">%1$d</xliff:g> 個來自 <xliff:g id="DOMAIN">%2$s</xliff:g> 的搜尋結果"</item>
- <item quantity="other" msgid="7816121892960632123">"共有 <xliff:g id="RESULTS">%1$d</xliff:g> 個來自 <xliff:g id="DOMAIN">%2$s</xliff:g> 的搜尋結果"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"設定"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"一般設定"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"應用程式"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"自動推進"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"選擇刪除郵件後所要顯示的畫面"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"隱藏核取方塊"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"在郵件清單中,輕觸並按住項目即可選取"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"刪除前需確認"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"郵件"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"傳送前需確認"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"郵件"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"推進至"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"較新的郵件"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"較舊的郵件"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"郵件清單"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"郵件文字大小"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"最小字體"</item>
- <item msgid="4415205108584620118">"小字體"</item>
- <item msgid="4550219696381691112">"適中字體"</item>
- <item msgid="6227813549949219991">"大字體"</item>
- <item msgid="1197917420815786571">"最大字體"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"郵件文字大小"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"最小"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"小"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"適中"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"大"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"最大"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"回覆所有人"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"將「回覆所有人」做為預設的回信方式"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"詢問後才可顯示圖片"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"系統不會自動顯示郵件中的圖片"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"「顯示圖片」已清除。"</string>
- <string name="position_of_count" msgid="7989353140376877792">"第 <xliff:g id="ID_1">%1$d</xliff:g> 封,共 <xliff:g id="ID_2">%2$s</xliff:g> 封"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"正在等待同步處理"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"您的電子郵件即將顯示。"</string>
- <string name="widget_other_views" msgid="4988574907386539499">"輕觸圖示即可變更。"</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"整合式收件匣"</string>
- <string name="widget_unread" msgid="4404711399009077833">"未讀取"</string>
- <string name="widget_starred" msgid="8290352707134011791">"已加星號"</string>
- <string name="widget_loading" msgid="2340962056927255554">"載入中..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"輕觸即可設定。"</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"您尚未設定電子郵件帳戶。"</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"搜尋電子郵件"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"搜尋<xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"「<xliff:g id="ID_1">%1$s</xliff:g>」的搜尋結果"</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"正在等待結果"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"有些伺服器可能需要較長的時間。"</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"資料夾"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"不允許使用裝置相機"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"需要裝置密碼"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"限制重複使用最近用過的密碼"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"強制密碼到期"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"要求裝置在閒置時鎖定螢幕"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"限制同步處理的日曆活動數量"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"限制同步處理的電子郵件數量"</string>
- <string name="quick_1" msgid="3426057697353380951">"感謝您!"</string>
- <string name="quick_2" msgid="4188036352885736617">"這主意不錯!"</string>
- <string name="quick_3" msgid="8061819976353395585">"我稍晚看過後回覆您。"</string>
- <string name="quick_4" msgid="3988974084396883051">"開會討論吧。"</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"系統會在漫遊時停用這個帳戶的背景同步處理。"</string>
- <string name="confirm_response" msgid="5747902757569543165">"正在傳送回應..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"沒有任何郵件。"</string>
-</resources>
diff --git a/email2/res/values-zh-rTW/uploader.xml b/email2/res/values-zh-rTW/uploader.xml
deleted file mode 100644
index 3fd744b66..000000000
--- a/email2/res/values-zh-rTW/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"即時上傳"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"即時上傳相簿"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"上傳中"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"已完成"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"已暫停"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d 張相片 • %3$d 部影片"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d 張相片 • %2$d 部影片"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"低電量"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"超出相片配額"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"漫遊中"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"正在等待 WiFi 連線"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"充電時繼續執行"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"正在等待連線"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"%s 內重試"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"顯示待處理的上傳項目"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"顯示已完成的上傳項目"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"線上查看"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"顯示待處理的上傳項目"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"隱藏待處理的上傳項目"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"顯示詳細資料"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"隱藏詳細資料"</string>
- <string name="menu_settings" msgid="5088116127086866634">"設定"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"上傳日期:%s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"帳戶"</string>
- <string name="upload" msgid="2615541458361216022">"上傳"</string>
- <string name="ok" msgid="2516349681897895312">"確定"</string>
- <string name="cancel" msgid="1207103189404543868">"取消"</string>
- <string name="uploading_to" msgid="3986362895940069510">"正在上傳至 "<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" 使用者:"<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s「%2$s」"</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"上傳初始化失敗。"</string>
- <string name="toast_file_error" msgid="1315722681020841350">"檔案無法使用。"</string>
- <string name="account_error" msgid="1904775271866104941">"無法擷取帳戶資訊。"</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"登入您的帳戶時發生問題。"</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"正在等待重試"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"正在等待 WiFi 連線"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"上傳中"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"失敗"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"已完成"</string>
- <string name="pause_state_running" msgid="711411177620353982">"上傳中"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"已手動暫停"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"已暫停 - 低電量"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"已暫停 - 充電時繼續執行"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"已暫停 - 正在等待連線"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"已暫停 - 超出 Picasa 網路相簿配額"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"已暫停 - 正在等待 WiFi 連線"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"已暫停 - 漫遊中"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"正在等待重試"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 分鐘"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 分鐘"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 分鐘"</string>
- <string name="retry_no_data" msgid="630347885498641534">"沒有數據連線"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"帳戶的磁碟空間配額不足"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"找不到檔案"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"服務錯誤"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"網路錯誤"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"驗證失敗"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"待處理的上傳項目 [%d]"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"已完成上傳 [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"暫停上傳"</string>
- <string name="manager_resume" msgid="1608630525599824933">"繼續上傳"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"立即上傳"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"稍後上傳"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"不要上傳"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"查看"</string>
- <string name="manager_retry" msgid="939534318469518843">"重試"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"上傳已取消"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"上傳已完成"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"全部同步處理"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"上次同步處理時間:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"已完成項目清單中沒有任何內容。"</string>
- <string name="notify_uploads" msgid="8593982942665493037">"即時上傳"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"上傳已完成"</string>
- <string name="notify_paused" msgid="3999817913227671338">"上傳已暫停"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"尚未啟用即時上傳程式"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"大型檔案只能透過 WiFi 連線上傳。"</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"正在掃描檔案..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"正在準備要上傳的 <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> 張相片和 <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> 部影片..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"沒有其他相片/影片需要上傳。"</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"與伺服器通訊時發生錯誤,請稍後再試。"</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"全部同步處理已取消"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"全部同步處理"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"查看已完成的上傳項目"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"查看待處理項目"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"一般"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"暫停上傳所有項目"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"充電"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"手機充電時才上傳。"</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"可連上 Wi-Fi 時才上傳。"</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"相片"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"帳戶"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"上傳所用的網路"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"相片大小"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"影片"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"帳戶"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"相片帳戶將用來上傳影片。"</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"上傳所用的網路"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"目前暫時使用相片網路連線設定。"</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"行動網路僅用於上傳相片"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"透過行動網路上傳相片和影片"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"僅透過 Wi-Fi 上傳相片和影片"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"關於"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"即時上傳版本"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"建議:1600 像素 (適用於分享、列印、螢幕保護程式)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"原始大小 (上傳速度最慢)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"已暫停 - 未使用 SD 卡"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"未使用 SD 卡"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"即時上傳設定"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"即時上傳"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"自動將新的相片和影片上傳至私人網路相簿"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"上傳狀態"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"進階"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"使用行動網路時上傳"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"漫遊時上傳"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"透過數據網路漫遊時上傳相片和影片"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"使用電池電源時上傳"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"僅於充電時上傳相片和影片"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"上傳現有的相片"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"立即上傳手機中現存的所有相片和影片"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"已停用"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s:%2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"上傳中 (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">":第 %1$d 個,共 %2$d 個"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"已暫停:輕觸即可繼續上傳"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"上傳現有的相片"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"雖然將手機中未上傳的相片和影片上傳至網路上的私人相簿需要一段時間,但系統會在背景完成上傳作業,您確定要繼續嗎?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"是"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"否"</string>
-</resources>
diff --git a/email2/res/values-zu/strings.xml b/email2/res/values-zu/strings.xml
deleted file mode 100644
index 72a0e3596..000000000
--- a/email2/res/values-zu/strings.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Funda okunamathiselwe kwi-imeyili"</string>
- <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Ivumela i-app ukufunda okunamathiselwe kwe-imeyili yakho."</string>
- <string name="permission_access_provider_label" msgid="378256653525377586">"Finyelela kwimininingo yomhlinzeki we-imeyli"</string>
- <string name="permission_access_provider_desc" msgid="6296566558584670348">"Ivumela lolu hlelo lokusebenza ukufinyelela kumininingo yakho egciniwe ye-Imeyili, kuhlanganise imiyalezo etholiwe, imiyalezo ethunyelwe, amagama abasebenzisi kanye namaphasiwedi."</string>
- <string name="app_name" msgid="5815426892327290362">"I-imeyli"</string>
- <string name="compose_title" msgid="427986915662706899">"Bhala"</string>
- <string name="debug_title" msgid="5175710493691536719">"Lungisa iphutha"</string>
- <string name="next_action" msgid="3931301986364184415">"Okulandelayo"</string>
- <string name="okay_action" msgid="8365197396795675617">"KULUNGILE"</string>
- <string name="cancel_action" msgid="6967435583794021865">"Khansela"</string>
- <string name="previous_action" msgid="5181616311579820981">"Okwandulele"</string>
- <string name="send_action" msgid="1729766205562446418">"Thumela"</string>
- <string name="reply_action" msgid="4262472229221507619">"Phendula"</string>
- <string name="reply_all_action" msgid="6192179825726332152">"Phendula bonke"</string>
- <string name="delete_action" msgid="8421026208288857155">"Susa"</string>
- <string name="forward_action" msgid="669174181042344116">"Dlulisa"</string>
- <string name="favorite_action" msgid="4664259801498253756">"Inkanyezi"</string>
- <string name="done_action" msgid="7497990549515580249">"Kwenziwe"</string>
- <string name="create_action" msgid="3062715563215392251">"Yenza okusha"</string>
- <string name="delete_quick_response_action" msgid="3076922270182841978">"Susa"</string>
- <string name="quick_responses_empty_view" msgid="3960050972306132367">"Azikho izimpendulo ezisheshayo."</string>
- <string name="discard_action" msgid="6532206074859505968">"Lahla"</string>
- <string name="save_draft_action" msgid="6413714270991417223">"Londoloza okusazolungiswa"</string>
- <string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Faka impendulo esheshayo"</string>
- <string name="read_action" msgid="4701484794504781686">"Beka uphawu njengokufundiwe"</string>
- <string name="unread_action" msgid="6280399049357552826">"Beka uphawu njengokungafundiwe"</string>
- <string name="set_star_action" msgid="4660317166196258160">"Faka inkanyezi"</string>
- <string name="remove_star_action" msgid="6689770999647007163">"Khipha inkanyezi"</string>
- <string name="refresh_action" msgid="5951383001436708175">"Qala kabusha"</string>
- <string name="add_account_action" msgid="8835736309476033727">"Engeza i-akhawunti"</string>
- <string name="compose_action" msgid="4045702519637388045">"Bhala"</string>
- <string name="search_action" msgid="6325101454876682308">"Sesha"</string>
- <string name="account_settings_action" msgid="4494079183315085171">"Izilungiselelo ze-akhawunti"</string>
- <string name="settings_action" msgid="6334807007967459412">"Izilungiselelo"</string>
- <string name="menu_folder_options" msgid="2871906096248843471">"Vumelanisa okukhethwa kukho"</string>
- <string name="mark_as_unread_action" msgid="3766298115778767554">"Maka njengokungafundiwe"</string>
- <string name="move_action" msgid="3059189775933985898">"Khipha"</string>
- <string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
- <string name="add_cc_bcc_menu" msgid="4757145078498200242">"Engeza Cc/Bcc"</string>
- <string name="add_file_attachment" msgid="2203398371671979481">"Namathisela ifayela"</string>
- <string name="close_action" msgid="533058985745238100">"Vala"</string>
- <string name="message_list_send_pending_messages_action" msgid="8502942186631824114">"Thumela yonke imilayezo"</string>
- <string name="choose_attachment_dialog_title" msgid="81937507117528954">"Khetha isinamathiseli"</string>
- <string name="move_to_folder_dialog_title" msgid="2614318192482193898">"Hambisa ku"</string>
- <string name="status_loading_messages" msgid="6552307237621292344">"Ilayisha imiyalezo..."</string>
- <string name="status_network_error" msgid="2611654064403817391">"Inkinga yoxhumano"</string>
- <string name="error_loading_message_body" msgid="6775234299515596760">"Yehlulekile ukufaka umbhalo womlayezo. Umlayezo ungabe ube mkhulu kakhulu ukuba ungabukwa."</string>
- <plurals name="move_messages">
- <item quantity="one" msgid="320885379869442589">"Khipha umyalezo"</item>
- <item quantity="other" msgid="371256717624461324">"Khipha imiyalezo"</item>
- </plurals>
- <string name="cannot_move_protocol_not_supported_toast" msgid="6558083148128616292">"Ukuhambisa akusekelwe kuma-akhawunti e-POP3"</string>
- <string name="cannot_move_multiple_accounts_toast" msgid="7922594026384944163">"Ayikwazi ukukhipha ngoba okukhethiwe kuqukethe ama-akhawunti ahlukene."</string>
- <string name="cannot_move_special_mailboxes_toast" msgid="7093107954841896970">"Imilayezo Esazolungiswa, Ebhokisini lemilayezo Ephumayo kanye Nethunyelwe ayikwazi ukukhishwa."</string>
- <plurals name="notification_new_one_account_fmt">
- <item quantity="one" msgid="3422945912787702191">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> Akufundiwe (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="few" msgid="6543078667692990869">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> akufundiwe (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="6937673814351448076">"<xliff:g id="UNREAD_MESSAGE_COUNT">%1$d</xliff:g> akufundiwe (<xliff:g id="ACCOUNT">%2$s</xliff:g>)"</item>
- </plurals>
- <plurals name="notification_new_multi_account_fmt">
- <item quantity="few" msgid="1991747245324120305">"kuma-akhawunti angu-<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g>"</item>
- <item quantity="other" msgid="2723797835410343458">"kuma-akhawunti angu-<xliff:g id="NUMBER_ACCOUNTS">%d</xliff:g>"</item>
- </plurals>
- <string name="notification_to_account" msgid="2078557719010667913">"Kuya ku-<xliff:g id="RECEIVER_NAME">%1$s</xliff:g>"</string>
- <string name="notification_multiple_new_messages_fmt" msgid="2606649762841566104">"<xliff:g id="ID_1">%1$d</xliff:g> imilayezo emisha"</string>
- <string name="account_name_display_all" msgid="837218861494831989">"Wonke ama-akhawunti"</string>
- <plurals name="number_of_accounts">
- <item quantity="one" msgid="6343953132237244947">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> i-akhawunti"</item>
- <item quantity="other" msgid="8548760449976444566">"<xliff:g id="NUM_ACCOUNTS">%1$d</xliff:g> Ama-akhawunti"</item>
- </plurals>
- <string name="mailbox_name_display_inbox" msgid="3542327124749861736">"Ibhokisi lemiyalezo engenayo"</string>
- <string name="mailbox_name_display_outbox" msgid="2826214174661417662">"Ibhokisi lemiyalezo ephumayo"</string>
- <string name="mailbox_name_display_drafts" msgid="4868718300700514319">"Okungaphelele"</string>
- <string name="mailbox_name_display_trash" msgid="9139069064580630647">"Udoti"</string>
- <string name="mailbox_name_display_sent" msgid="3426058998191869523">"Thunyelwe"</string>
- <string name="mailbox_name_display_junk" msgid="9046762505977999288">"Okungafuneki"</string>
- <string name="mailbox_name_display_unread" msgid="1015674989793998695">"Akufundiwe"</string>
- <string name="picker_mailbox_name_all_unread" msgid="6392491216581687644">"Ibhokisi Lemiyalezo Engenayo (alifundiwe)"</string>
- <string name="picker_mailbox_name_all_inbox" msgid="2277030979530376085">"Ibhokisi lemiyalezo engenayo (yonke)"</string>
- <string name="picker_combined_view_fmt" msgid="6276294768978512737">"Ukubuka okuhlanganisiwe (<xliff:g id="COUNT">%s</xliff:g>)"</string>
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" msgid="380235084337895804">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> i-akhawunti"</item>
- <item quantity="other" msgid="4145163147488719025">"<xliff:g id="ACCOUNT_COUNT">%d</xliff:g> ama-akhawunti"</item>
- </plurals>
- <string name="debug_version_fmt" msgid="6160213145745376955">"Inguqulo:<xliff:g id="VERSION">%s</xliff:g>"</string>
- <string name="account_folder_list_summary_inbox" msgid="7518263761297423255">"Ibhokisi lemiyalezo engenayo"</string>
- <string name="account_folder_list_summary_starred" msgid="3134312269246375723">"Okunenkanyezi"</string>
- <string name="account_folder_list_summary_drafts" msgid="5514845993247300437">"Okungaphelele"</string>
- <string name="account_folder_list_summary_outbox" msgid="3059836696049399377">"Ibhokisi lemiyalezo ephumayo"</string>
- <string name="mailbox_list_account_selector_combined_view" msgid="1556327299894225044">"Ukubuka okuhlanganisiwe"</string>
- <string name="mailbox_list_account_selector_show_all_folders" msgid="4185052839366909439">"Bonisa onke amafolda"</string>
- <string name="mailbox_list_account_selector_account_header" msgid="4261295503836387876">"Ama-akhawunti"</string>
- <string name="mailbox_list_account_selector_mailbox_header_fmt" msgid="3320144348694625092">"Thumela amafolda futhi <xliff:g id="EMAIL_ADDRESS">%s</xliff:g>"</string>
- <string name="mailbox_list_user_mailboxes" msgid="484260487104726379">"Wonke amafolda"</string>
- <string name="mailbox_list_recent_mailboxes" msgid="8922653040520361032">"Amafolda akamuva"</string>
- <string name="message_subject_description" msgid="3597047441062021199">"Isihloko"</string>
- <string name="message_is_empty_description" msgid="4004644319382041459">"Asikho isihloko"</string>
- <string name="message_list_load_more_messages_action" msgid="7428302707908825692">"Layisha eminye imiyalezo"</string>
- <plurals name="message_view_selected_message_count">
- <item quantity="one" msgid="5064657358375178519">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> khethiwe"</item>
- <item quantity="other" msgid="7901361399231876038">"<xliff:g id="MESSAGE_COUNT">%d</xliff:g> khethiwe"</item>
- </plurals>
- <string name="message_list_no_messages" msgid="7846910091922523867">"Ayikho imiyalezo"</string>
- <string name="message_compose_to_hint" msgid="2891895306418177013">"Kuya ku"</string>
- <string name="message_compose_cc_hint" msgid="8481884461031434144">"Cc"</string>
- <string name="message_compose_bcc_hint" msgid="9177337492358841680">"Bcc"</string>
- <string name="message_compose_subject_hint" msgid="6993487234024160782">"Isihloko"</string>
- <string name="message_compose_from_label" msgid="4084843296548498041">"Kusuka:"</string>
- <string name="to" msgid="4392614766835725698">"Kuya"</string>
- <string name="cc" msgid="7017720927911078193">"Cc"</string>
- <string name="bcc" msgid="3098643138241111579">"Bcc"</string>
- <string name="subject_hint" msgid="7253964583324677128">"Isihloko"</string>
- <string name="body_hint" msgid="4279864165439577668">"Ukwakha i-imeyili"</string>
- <string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Umyalezo Wangempela --------"\n"Isihloko: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Kusuka ku: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Kuya ku: <xliff:g id="TO">%3$s</xliff:g>"\n"CC: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
- <string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>ubhale:"\n\n</string>
- <string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Hlanganisa umbhalo ocashuniwe"</string>
- <string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Hlanganisa umbhalo"</string>
- <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Ngeza okungenani umamukeli oyedwa."</string>
- <string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Amanye amakheli e-imeyili awalungile."</string>
- <string name="message_compose_attachment_size" msgid="4401081828287333647">"Ifayela inkulu kakhulu ukuba inamathiselwe."</string>
- <string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Faka izimpendulo ezisheshayo"</string>
- <string name="message_compose_display_name" msgid="6415258924917140704">"<xliff:g id="NAME">%1$s</xliff:g> kanye nabanye abangu-<xliff:g id="NUMBER">%2$d</xliff:g>"</string>
- <string name="message_view_to_label" msgid="6485191743265527381">"Iya ku:"</string>
- <string name="message_view_cc_label" msgid="6322992216371163122">"Cc:"</string>
- <string name="message_view_bcc_label" msgid="7577479221285310198">"Bcc:"</string>
- <string name="message_view_date_label" msgid="7033814961837313339">"Idethi:"</string>
- <string name="message_view_from_label" msgid="6055076379282772675">"Kusuka:"</string>
- <string name="message_view_subject_label" msgid="3731022187530000852">"Isihloko:"</string>
- <string name="message_view_attachment_view_action" msgid="4408093860407096078">"Buka"</string>
- <string name="message_view_attachment_install_action" msgid="381211378884166381">"Faka"</string>
- <string name="message_view_attachment_play_action" msgid="5214215414665114061">"Dlala"</string>
- <string name="message_view_attachment_load_action" msgid="8645178445048233745">"Layisha"</string>
- <string name="message_view_attachment_info_action" msgid="3908148393469626740">"Ulwazi"</string>
- <string name="message_view_attachment_save_action" msgid="4704436274670997903">"Londoloza"</string>
- <string name="message_view_attachment_saved" msgid="3432810414785232025">"Kulondoloziwe"</string>
- <string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Misa"</string>
- <string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Isinamathiseli silondolozwe njenge-<xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Ayikwazanga ukugcina okunamathiselwe."</string>
- <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Eyodwa noma eyengeziwe yezinamathiseli kumlayezo wakho odluliselwe izolandwa ngaphambi kokuthumelwa."</string>
- <string name="message_view_show_message_action" msgid="5134222901019191436">"Umyalezo"</string>
- <string name="message_view_show_invite_action" msgid="8862797393776226777">"Mema..."</string>
- <plurals name="message_view_show_attachments_action">
- <item quantity="one" msgid="7594476368958824007">"Isinamathiseli <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- <item quantity="other" msgid="974463163535515223">"Izinamathiseli <xliff:g id="NUM_ATTACHMENT">%1$d</xliff:g>"</item>
- </plurals>
- <string name="message_view_show_pictures_action" msgid="5059936981743072545">"Bonisa izithombe"</string>
- <string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Bonisa njalo"</string>
- <string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Njalo bonisa izithombe eziphuma kulo mthumeli"</string>
- <string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Izithombe eziphuma kulo mthumeli zizoboniswa ngokuzenzakalelayo."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Buka Ekhalendeni"</string>
- <string name="message_view_invite_title" msgid="3418949733434713805">"Isimemo sekhalenda"</string>
- <string name="message_view_invite_text" msgid="1212799906603873708">"Uyahamba?"</string>
- <string name="message_view_invite_accept" msgid="744546668021679819">" Yebo"</string>
- <string name="message_view_invite_maybe" msgid="7555189462441562318">" Mhlawumbe"</string>
- <string name="message_view_invite_decline" msgid="6119797303297149463">" Cha"</string>
- <string name="message_view_invite_toast_yes" msgid="6802274503171644414">"Wamukele lesi simemo"</string>
- <string name="message_view_invite_toast_maybe" msgid="8547454326090527202">"Uphendule \"mhlawumbe\" kulesi simemo"</string>
- <string name="message_view_invite_toast_no" msgid="1842341256942784143">"Unqabe lesi simemo"</string>
- <string name="message_view_show_details" msgid="6287415596441037095">"Bonisa imininingwane"</string>
- <string name="message_view_message_details_dialog_title" msgid="9042008615386883449">"Imininingwane yomlayezo"</string>
- <string name="attachment_info_dialog_default_title" msgid="4995755709689009622">"Imniningwane yokunamathesilwayo kwi-imeyli"</string>
- <string name="attachment_info_dialog_wifi_title" msgid="3174350153882915382">"Ukuxhumana kungenazintambo kuyadingeka"</string>
- <string name="attachment_info_wifi_settings" msgid="96432970927503597">"Izilungiselelo ze-Wi-Fi"</string>
- <string name="attachment_info_application_settings" msgid="4124655487276125596">"Izilungiselelo zohlelo lokusebenza"</string>
- <string name="attachment_info_unknown" msgid="8342655396805943320">"Ayikwazi ukuvula okunamathiselwayo"</string>
- <string name="attachment_info_malware" msgid="6576029010855055528">"Angeke ukwazi ukulondoloza noma ukuvula leli fayela ngoba lolu hlobo lokunamatheliswa kwi-imeyli kungenzeka ukuthi luqukethe i-software enokuthile okungahambi kahle."</string>
- <string name="attachment_info_policy" msgid="3560422300127587508">"Lokhu okunamathiselwe kwi-imeyli angeke kulondolozwe noma kuvulwe ngenxa yemigomo yezokuphepha yale akhawunti."</string>
- <string name="attachment_info_wifi_only" msgid="1481120960014563617">"Lokhu okunamathiselwa kwi-imeyili kukhulu kakhulu ukuba kungalayishwa ngohleloxhumano lweselula. Ungalilayisha ngokuzayo uma uxhuma kuhleloxhumano lokuxhumana kunenazintambo."</string>
- <string name="attachment_info_no_intent" msgid="8139209405745777924">"Alukho uhlelo lokungiselela ukusebenza olufakiwe olungakwazi ukuthi luvule lokhu okunamathiselwe kule imeyili. Zama ukulayisha ungenisa uhlelo lokusebenza olufanele kwiMakethe ye-Android."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Lokhu okunamathiselwe kuwuhlelo lokusebenza. Kumele ubheke Imithombo Engaziwa kwiZilungiselelo &gt; Faka uhlelo lokusebenza ngaphambi kokuba uyifake."</string>
- <string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Uhlelo lokusebenza alukwazi ukuthi lufakwe ngqo ukusuka kwi-imeyili. Qala ngokulondoloza lolu hlelo lokusebenza bese ulufaka usebenzisa uhlelo lokusebenza Lokulayisha ungenisa."</string>
- <string name="attachment_not_found" msgid="7155322700141145123">"Yehlulekile ukulondoloza okunamathiselwe kwi-imeyili."</string>
- <string name="message_decode_error" msgid="5016042255170947834">"Bekunephutha ngesikhathi kulungiswa umlayezo."</string>
- <string name="eml_view_title" msgid="8827210108543430336">"Ukubuka <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_delete_dialog_title" msgid="6603370107217227252"></string>
- <plurals name="message_delete_confirm">
- <item quantity="one" msgid="3799616435056423256">"Susa lo mlayezo?"</item>
- <item quantity="other" msgid="4437637377522896262">"Susa le miyalezo?"</item>
- </plurals>
- <plurals name="message_deleted_toast">
- <item quantity="one" msgid="710742672464447084">"Umyalezo ususiwe."</item>
- <item quantity="other" msgid="6574961322865652255">"Imiyalezo isusiwe."</item>
- </plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Umlayezo ulahliwe."</string>
- <string name="message_saved_toast" msgid="8443125659172627665">"Umlayezo ulondolozwe njengokungaphelele"</string>
- <string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Ayikwazi ukuveza okunamekiwe."</string>
- <string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Yehlulekile ukufaka okunamathiselwe kwi-imeyli \" <xliff:g id="FILENAME">%s</xliff:g>\"."</string>
- <string name="message_view_parse_message_toast" msgid="8830378966553031281">"Ivula umyalezo..."</string>
- <plurals name="message_moved_toast">
- <item quantity="one" msgid="3098493230185412871">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> umyalezo uhambiswe e-<xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="2286739630865943494">"<xliff:g id="NUM_MESSAGE">%1$d</xliff:g> imiyalezo ihambiswe e-<xliff:g id="MAILBOX_NAME">%2$s</xliff:g>"</item>
- </plurals>
- <string name="forward_download_failed_ticker" msgid="6176608320359303255">"Ayikwazi ukudlulisa isinamathiseli esisodwa noma ezengeziwe"</string>
- <string name="forward_download_failed_title" msgid="6139701848515572511">"Okunamathiselwa kwi-imeyli akuthunyelwanga"</string>
- <string name="login_failed_ticker" msgid="2169365211566829350">"I-<xliff:g id="ACCOUNT_NAME">%s</xliff:g> ingene ngemvume ngempumelelo."</string>
- <string name="login_failed_title" msgid="7624349996212476176">"Ayikwazanga ukungena ngemvume."</string>
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- <item quantity="other" msgid="4613385949384337840">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
- </plurals>
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" msgid="869981846437074463">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- <item quantity="other" msgid="8869993299924901593">"<xliff:g id="SIZE_IN_KILOBYTES">%d</xliff:g>KB"</item>
- </plurals>
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" msgid="7527095670565758434">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- <item quantity="other" msgid="4365876866570165282">"<xliff:g id="SIZE_IN_MEGABYTES">%d</xliff:g>MB"</item>
- </plurals>
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" msgid="6261986598249539093">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- <item quantity="other" msgid="1041353825053598633">"<xliff:g id="SIZE_IN_GIGABYTES">%d</xliff:g>GB"</item>
- </plurals>
- <string name="message_view_move_to_newer" msgid="2190862552581773765">"Okusha kunokunye"</string>
- <string name="message_view_move_to_older" msgid="4993043091356700890">"Okudadlana"</string>
- <string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
- <string name="account_setup_basics_title" msgid="3578333196594678422">"Ukumisa i-akhawunti"</string>
- <string name="account_setup_basics_headline" msgid="6726590205905464015">"I-akhawunti ye-Imeyli"</string>
- <string name="accounts_welcome" msgid="8337750045270269649">"Ungasetha i-akhawunti yakho ngezinyathelo ezimbalwa."</string>
- <string name="account_setup_basics_email_label" msgid="3454164053624112047">"Ikheli le-imeyli"</string>
- <string name="account_setup_basics_password_label" msgid="9133549799291519298">"Iphasiwedi"</string>
- <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Thumela i-imeyli kusuka kule akhawunti ngokwakhona"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ukumisela"</string>
- <string name="account_setup_username_password_toast" msgid="3968270274727947460">"Sicela uthayiphe ikheli le-imeyili elilungile kanye nephasiwedi."</string>
- <string name="account_duplicate_dlg_title" msgid="8089732986912704425">"I-akhawunti Ephindiwe"</string>
- <string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Usuvele usebenzisa leli gama lomsebenzisi kule akhawunti \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
- <string name="account_password_spaces_error" msgid="8928309156658903257">"Le phasiwedi iqala noma igcina ngezimpawu"</string>
- <string name="account_setup_check_settings_retr_info_msg" msgid="4121970450267725664">"Ilanda ulwazi le-akhawunti..."</string>
- <string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Ihlola izilungiselelo zesiphakeli ezingenayo..."</string>
- <string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Ihlola izilungiselelo zesiphakeli eziphumayo..."</string>
- <string name="account_setup_names_title" msgid="8483517350241119291">"Ukumisa i-akhawunti"</string>
- <string name="account_setup_names_headline" msgid="914858472109729140">"I-akhawunti yakho imisiwe, futhi i-imeyli isendleleni!"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Nike le-akhawunti igama (okokuzikhethela)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Igama lakho (liboniswa emiyalezweni ephumayo)"</string>
- <string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Lesi sikhundla akumele singabi nalutho."</string>
- <string name="account_setup_account_type_title" msgid="7156551693961182124">"Ukumisa i-akhawunti"</string>
- <string name="account_setup_account_type_headline" msgid="3574102329184831086">"Uhlobo lwe-akhawunti"</string>
- <string name="account_setup_account_type_instructions" msgid="114515540798408760">"Yiluphi uhlobo lwe-akhawunti lolu?"</string>
- <string name="account_setup_incoming_title" msgid="6796626791039136005">"Ukumisa i-akhawunti"</string>
- <string name="account_setup_incoming_headline" msgid="6183711037633407184">"Izilungiselelo zeseva engenayo"</string>
- <string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Igama lomsebenzisi"</string>
- <string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Iphasiwedi"</string>
- <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Isiphakeli"</string>
- <string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Imbobo yokuxhuma"</string>
- <string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Uhlobo lokuphepha"</string>
- <string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Lutho"</string>
- <string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"i-SSL/i-TLS (Yamukela zonke izitifiketi)"</string>
- <string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"i-SSL/i-TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"I-STARTTLS (Yamukela zonke izitifiketi)"</string>
- <string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"I-STARTTLS"</string>
- <string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Susa i-imeyili kwisiphakeli"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Akusoze"</string>
- <string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"Lapho ngisusa Ebhokisini lokungenayo"</string>
- <string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"Isiqalo sendlela ye-IMAP"</string>
- <string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"Okokuzithandela"</string>
- <string name="account_setup_outgoing_title" msgid="7208495965665711539">"Ukumisa i-akhawunti"</string>
- <string name="account_setup_outgoing_headline" msgid="2025001060935366394">"Izilungiselelo zeseva eziphumayo"</string>
- <string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Iseva ye-SMTP"</string>
- <string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Imbobo yokuxhuma"</string>
- <string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Uhlobo lokuphepha"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Kudingeka ukungena ngemvume"</string>
- <string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Igama lomsebenzisi"</string>
- <string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Iphasiwedi"</string>
- <string name="account_setup_exchange_title" msgid="396004732514751781">"Ukuhlela i-akhawunti"</string>
- <string name="account_setup_exchange_headline" msgid="6099049671599242131">"Izilungiselelo Zeseva"</string>
- <string name="account_setup_exchange_server_label" msgid="795137797983360826">"Iseva"</string>
- <string name="account_setup_exchange_username_label" msgid="6517176180828983060">"Isizinda/Igama lomsebenzisi"</string>
- <string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Sebenzisa uxhumano oluphephile (I-SSL)"</string>
- <string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Yamukela zonke izitifikethi ze-SSL"</string>
- <string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Isitifikethi sekhasimende"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Khetha"</string>
- <string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Sebenzisa isitifiketi sekhasimende"</string>
- <string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Susa"</string>
- <string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Lutho"</string>
- <string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"i-ID Yedivaysi Yefoni"</string>
- <string name="account_setup_options_title" msgid="9016600767888846051">"Izilungiselelo ze-akhawunti"</string>
- <string name="account_setup_options_headline" msgid="4181274232835368085">"Okukhethwa kukho kwe-akhawunti"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Ukuhlola ukuvama kwebhokisi lemiyalezo engenayo"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Akusoze"</string>
- <string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Okuzenzakalelayo (Dudula)"</string>
- <string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Njalo ngamaminithi angu-5"</string>
- <string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"Njalo ngamaminithi angu-10"</string>
- <string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Njalo ngamaminithi angu-15"</string>
- <string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Njalo ngamaminithi angu-30"</string>
- <string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Njalo ngehora"</string>
- <string name="account_setup_options_default_label" msgid="2617227194283720914">"Thumela i-imeyli kusuka kule akhawunti ngokuzenzakalelayo"</string>
- <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Ngazise lapho i-imeyli ifika"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Vumelanisa othintana nabo kusuka kule akhawunti"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Vumelanisa ikhalenda kule akhawunti"</string>
- <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Vumelanisa i-imeyli kule akhawunti."</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Layisha okunamathiselwa kwi-imeyili ngokuzenzakalelayo uma uxhunyiwe kukuxhuma kungenazintambo"</string>
- <string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Ayikwazanga ukuqeda"</string>
- <string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Izinsuku zokuvumelanisa"</string>
- <string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Okuzenzakalelayo"</string>
- <string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"Usuku olulodwa"</string>
- <string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Izinsuku ezintathu"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"Iviki elilodwa"</string>
- <string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Amaviki amabili"</string>
- <string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Inyanga eyodwa"</string>
- <string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Konke"</string>
- <string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Sebenzisa okuzenzakalelayo kwe-akhawunti"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Igama lakho lomsebenzisi noma iphasiwedi ayilungile."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Igama lomsebenzisi noma iphasiwedi ayilungile."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Ayikwazi ukuxhuma ngokuphephile kwiseva."</string>
- <string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Ayikwazi ukuxhuma ngokuphephile kwiseva. "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Isititiketi seklayenti siyadingeka. Ingabe ufuna ukuxhuma kuseva ngesitifiketi seklayenti?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Isitifiketi asivumelekile noma asifinyeleleki."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Iseva iphendule ngephutha, sicela uhlole igama lakho lomsebenzisi nephasiwedi bese uzama futhi."</string>
- <string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Ayikwazi ukuxhuma kwiseva."</string>
- <string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Ayikwazi ukuxhuma kwiseva. "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_tls_required" msgid="307030406688611327">"I-TLS iyadingeka kodwa ayisekelwa iseva."</string>
- <string name="account_setup_failed_auth_required" msgid="6799839150250217566">"Izindlela zokuqinisekisa azisekelwa yiseva."</string>
- <string name="account_setup_failed_security" msgid="925820957665764964">"Ayikwazanga ukuvula uxhumano kwisiphakeli ngenxa yephutha lokuphepha."</string>
- <string name="account_setup_failed_ioerror" msgid="7802604687451830378">"Ayikwazi ukuvula uxhumano kwiseva."</string>
- <string name="account_setup_failed_protocol_unsupported" msgid="4607759927226943569">"Ufake ikheli leseva elingalungile noma isiphakeli sidinga inguqulo yomthetho olandelwayo lowo i-Imeyli engawusekeli."</string>
- <string name="account_setup_failed_access_denied" msgid="6835358740050287051">"Awunayo imvume yokuvumelanisa ngalesisiphakeli. Thintana nomqondisi wesiphakeli sakho ukuze uthole ukwazisa okungaphezulu."</string>
- <string name="account_setup_security_required_title" msgid="1850321535870447468">"Ukuphatha ukuphepha kokulawula okukude"</string>
- <string name="account_setup_security_policies_required_fmt" msgid="5410714107656671761">"Iseva<xliff:g id="SERVER">%s</xliff:g> idinga ukuba uyivumele ukuba ilawule kude ezinye izici zokuphepha zedivayisi ye-Android yakho. Ingabe ufuna ukuqedela ukumisa le-akhawunti?"</string>
- <string name="account_setup_failed_security_policies_unsupported" msgid="3210264746877120355">"Lesi siphakeli sidinga izici zokuphepha ezingasekelwa idivayisi yakho ye-Android, kuhlanganisa: <xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_username_uneditable_error" msgid="1618869759801584109">"Awukwazi ukushintsha igama lomsebenzi le-akhawunti. Ukuze wengeze i-akhawunti ngegama lomsebenzi elihlukile, thinta Faka i-akhawunti."</string>
- <string name="disable_admin_warning" msgid="6196985268695592382">"ISEXWAYISO: Yenza kungasebenzi imvume yohlelo lokusebenza lwe-Imeyli ukubhalisa idivaysi yakho kuzosusa wonke ama-akhawunti e-Imeyli ayidingayo, kuhlanganise ne-imeyli yayo, othintana nabo, amakhalenda, izenzakalo, neminye imininingo."</string>
- <string name="account_security_dialog_title" msgid="430041952584831904">"Okwakamuva kwezokuphepha"</string>
- <string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> idinga ukuba ubuyekeze izilungiselelo zakho zokuzivikela."</string>
- <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"I-Akhawuni \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ayikwazi ukuvumelanisa ngenxa yezimfuneko sokuphepha."</string>
- <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"I-Akhawunti \"<xliff:g id="ACCOUNT">%s</xliff:g>\" idinga ukubuyekeza izilungiselelo zokuphepha."</string>
- <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"I-Akhawunti \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ishintshe izilungiselelo zayo zokuphepha; asikho isenzo somsebenzisi esidingekayo."</string>
- <string name="security_notification_content_update_title" msgid="2429762903228690154">"Ukubuyekeza ezokuphepha kuyadingeka"</string>
- <string name="security_notification_content_change_title" msgid="443490921895642130">"Izinqubomgomo zokuphepha zishintshiwe"</string>
- <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Izinqubomgomo zokuphepha azikwazi ukuhlangabezwa"</string>
- <string name="account_security_title" msgid="3511543138560418587">"Ukuphepha kweDivaysi"</string>
- <string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Iseva <xliff:g id="SERVER">%s</xliff:g> idinga ukuba uyivumele ukuba ilawule kude ezinye izici zokuphepha kwedivayisi ye-Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Hlela imininingwane"</string>
- <string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" idinga ukuba ushintshe iphinikhodi yokuvala isikrini noma iphasiwedi"</string>
- <string name="password_expire_warning_content_title" msgid="7174669014074849304">"Iphasiwedi yokuvala isikrini iphelelwa isikhathi"</string>
- <string name="password_expired_ticker" msgid="4230570412974108968">"Iphinikhodi noma iphasiwedi yakho yokuvala isikrini iphelelwe isikhathi."</string>
- <string name="password_expired_content_title" msgid="4349518706602252979">"Iphasiwedi yokuvala isikrini iphelelwe isikhathi"</string>
- <string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Iphasiwedi yesikrini yokuvala iphelelwa isikhathi"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Udinga ukushintsha i-PIN yesikrini sakho sokukhuya noma iphasiwedi ngokushesha, noma idatha ye-<xliff:g id="ACCOUNT">%s</xliff:g> izosulwa. Ufuna ukuyishintsha manje?"</string>
- <string name="password_expired_dialog_title" msgid="2186547998125938084">"Iphasiwedi yokuvala isikrini iphelelwe isikhathi"</string>
- <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Idatha le-<xliff:g id="ACCOUNT">%s</xliff:g> lisuliwe kudivayisi. Ungalibuyisa ngokushintsha i-PIN yakho yokukhiya isikrini noma iphasiwedi. Ufuna ukuyishintsha manje?"</string>
- <string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Lahla izinguquko ezingagciniwe?"</string>
- <string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Ayikwazanga ukungena ngemvume."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Igama lomsebenzisi noma iphasiwedi ye-<xliff:g id="ACCOUNT">%s</xliff:g> ayilungile. Ufuna ukuzivuselela manje?"</string>
- <string name="account_settings_default_label" msgid="3575963379680943640">"I-akhawunti ezenzakalelayo"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Thumela i-imeyli kusuka kule akhawunti ngokuzenzakalelayo"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Layisha ngokungenisa okunamathelayo"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Dawuniloda ngokuzenzakalla ukunamathiseleka emiyalezweni yakamuva nge-Wi-Fi"</string>
- <string name="account_settings_notify_label" msgid="1630001017303007974">"Izaziso ze-Imeyli"</string>
- <string name="account_settings_summary" msgid="8403582255413830007">"Ukuvama kokuvumelanisa, isaziso, nokunye."</string>
- <string name="account_settings_notify_summary" msgid="8134339460923068254">"Thumela isaziso uma i-imeyili ifika"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Ukuvama ukuhlola ibhokisi lemiyalezo engenayo"</string>
- <string name="account_settings_incoming_label" msgid="7858928031806297542">"Izilungiselelo ezingenayo"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Igama lombebenzisi, iphasiwedi, nezinye izilungiselelo zeseva ezingenayo"</string>
- <string name="account_settings_outgoing_label" msgid="4464829249980026745">"Izilungiselelo eziphumayo"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Igama lomsebenzisi, iphasiwedi, nezinye izilungiselelo zeseva eziphumayo"</string>
- <string name="account_settings_enforced_label" msgid="7429582254433588882">"Izinqubomgomo ziphoqiwe"</string>
- <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Lutho"</string>
- <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Izinqubomo ezingasekelwe"</string>
- <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Lutho"</string>
- <string name="account_settings_retry_label" msgid="1104680719299842829">"Zama ukuvumelanisa"</string>
- <string name="account_settings_retry_summary" msgid="2703599639846201913">"Thinta lapha ukuze uvumelanise le akhawunti"</string>
- <string name="account_settings_description_label" msgid="8894815221204511715">"Igama le-akhawunti"</string>
- <string name="account_settings_name_label" msgid="8186406122590008449">"Igama lakho"</string>
- <string name="account_settings_signature_label" msgid="4091969938785803201">"Isiginesha"</string>
- <string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Izimpendulo ezisheshayo"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Hlela umbhalo owusebenzisa njalo uma ubhala ama-imeyli"</string>
- <string name="account_settings_signature_hint" msgid="7262183168962779403">"Jobelela umbhalo emiyalezweni oyithumelayo"</string>
- <string name="account_settings_notifications" msgid="1042620094281375043">"Izilungiselelo zesaziso"</string>
- <string name="account_settings_data_usage" msgid="6669107430575866736">"Ukusebenzisa idatha"</string>
- <string name="account_settings_policies" msgid="6292833636418641840">"Izinqubomgomo zokuphepha"</string>
- <string name="edit_quick_response_dialog" msgid="4322494050816995390">"Hlela izimpendulo ezisheshayo"</string>
- <string name="save_action" msgid="1988862706623227093">"Londoloza"</string>
- <string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Vumelanisa othintana nabo"</string>
- <string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Vumelanisa othintana nabo bale akhawunti"</string>
- <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Vumelanisa ikhalenda"</string>
- <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Vumelanisa umcimbi wekhalenda kule akhawunti"</string>
- <string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Vumelanisa i-imeyli"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Vumelanisa i-imeyli yale akhawunti"</string>
- <string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Dlidliza"</string>
- <string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Iyadlidliza futhi lapho i-imeyli ifika"</string>
- <string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Njalo"</string>
- <string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"Kuphela uma ithulile"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"Akusoze"</string>
- <string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"Dlidliza"</string>
- <string name="account_settings_ringtone" msgid="8229878374785575207">"Khetha ithoni yokukhala"</string>
- <string name="account_settings_servers" msgid="4925493817981624242">"Izilungiselelo Zeseva"</string>
- <string name="account_delete_dlg_title" msgid="6806087520856396608">"Khipha i-akhawunti"</string>
- <string name="account_delete_dlg_instructions_fmt" msgid="8236846322040271280">"I-akhawunti\"<xliff:g id="ACCOUNT">%s</xliff:g>\" izokhishwa kwi-Imeyili"</string>
- <string name="account_settings_category_delete_account" msgid="5128545184407925226">"Khipha i-akhawunti"</string>
- <string name="account_settings_delete_account_label" msgid="4889158717472601718">"Susa i-akhawunti"</string>
- <string name="mailbox_settings_activity_title" msgid="4705845931573373274">"Vumelanisa okukhethwa kukho"</string>
- <string name="mailbox_settings_activity_title_with_mailbox" msgid="6485481250424219240">"Vumelanisa okukhethwa kukho (<xliff:g id="MAILBOXX_NAME">%s</xliff:g>)"</string>
- <string name="mailbox_preferences_header" msgid="9077316556563252246">"Vumelanisa izilungiselelo"</string>
- <string name="mailbox_settings_mailbox_check_frequency_label" msgid="1246075442689328906">"Hlola i-frequency"</string>
- <string name="mailbox_settings_mailbox_sync_window_label" msgid="2957945231022052672">"Izinsuku zokuvumelanisa"</string>
- <string name="account_shortcut_picker_name" msgid="1994861845225243190">"I-akhawunti ye-imeyli"</string>
- <string name="account_shortcut_picker_title" msgid="1039929224016048015">"Khetha i-akhawunti"</string>
- <string name="mailbox_shortcut_picker_title" msgid="4152973927804882131">"Khetha ifolda"</string>
- <string name="toast_account_not_found" msgid="8144242451730692816">"I-akhawunti ayitholakalanga. Kungenzeka isusiwe."</string>
- <string name="toast_mailbox_not_found" msgid="4960014581292378895">"Ifolda ayitholakalanga. Kungenze ukuthi isusiwe"</string>
- <string name="provider_note_live" msgid="2995297671709325333">"Kuphela amanye ama-akhawunti \"Okuhlanganisa\" ahlanganisa ukufinyelela i-POP okuvumela lolu hlelo ukuxhuma. Uma ungakwazi ukungena ngekheli lakho le-imeyili elilungile kanye nephasiwedi, kungase kwenzeke awunayo i-akhawunti ekhokhelwe \"Hlanganisa\". Sicela uqalise isipheqululis seWebhu ukuthola ukufinyelela kulama akhawunti e-imeyili."</string>
- <string name="provider_note_t_online" msgid="1630642061431427894">"Ngaphambi kokuhlela le-akhawunti ye-imeyili, sicela uvakashele Iwebhusayithi ye-T-Online bese wenza iphasiwedi ukufinyelela kwi-imeyili ye-POP3."</string>
- <string name="exchange_name" msgid="1190783774800310346">"Inhlangano"</string>
- <string name="exchange_name_alternate" msgid="5772529644749041052">"Ukuvumelanisa Okusebenzayo Kokushintshanisa kwe-Microsoft"</string>
- <string name="system_account_create_failed" msgid="3673792980526246177">"Ayikwazanga ukwenza i-akhawunti. Zama futhi."</string>
- <string name="device_admin_label" msgid="8680224994637869414">"I-imeyli"</string>
- <string name="device_admin_description" msgid="426727923791430306">"Ivumela izinqubomgomo zokuphepha eziqondene neseva"</string>
- <string name="gal_searching_fmt" msgid="6140450617663543464">"Iyasesha <xliff:g id="DOMAIN">%s</xliff:g>..."</string>
- <plurals name="gal_completed_fmt">
- <item quantity="one" msgid="7496785524617037642">"<xliff:g id="RESULTS">%1$d</xliff:g> imiphumela ephuma <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- <item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> imiphumela ephuma <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
- </plurals>
- <string name="settings_activity_title" msgid="5185915603716333904">"Izilungiselelo"</string>
- <string name="header_label_general_preferences" msgid="8243724566056800991">"Izilungiselelo ezijwayelekile"</string>
- <string name="category_general_preferences" msgid="2742423840964045801">"Uhlelo lokusebenza"</string>
- <string name="general_preference_auto_advance_label" msgid="213945004511666631">"Okuseqophelweni okuzenzakalelayo"</string>
- <string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Khetha ukuthi isiphi isikrini esizoboniswa emuva kokuba ususe umyalezo"</string>
- <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Fihla amabhokisi okuhlola"</string>
- <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Ezinhlwini zemilayezo, thinta bese ubamba ukuze ukhethe"</string>
- <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Qinisekisa ngaphambi kokususa"</string>
- <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Imilayezo"</string>
- <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Qinisekisa ngaphambi kokuthumela"</string>
- <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Imilayezo"</string>
- <string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Dlulela ku"</string>
- <string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Umyalezo omusha"</string>
- <string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Umyalezo wakudala"</string>
- <string name="general_preference_auto_advance_message_list" msgid="7834069275897767359">"Uhlu lomyalezo"</string>
- <string name="general_preference_text_zoom_label" msgid="4021955890499565713">"Usayizi wombhalo womyalezo"</string>
- <string-array name="general_preference_text_zoom_summary_array">
- <item msgid="4693576184223089069">"Umbhalo omncane"</item>
- <item msgid="4415205108584620118">"Umbhalo omncane"</item>
- <item msgid="4550219696381691112">"Umbhalo ongubukhulu obujwayelekile"</item>
- <item msgid="6227813549949219991">"Umbhalo omkhulu"</item>
- <item msgid="1197917420815786571">"Umbhalo omkhulu"</item>
- </string-array>
- <string name="general_preference_text_zoom_dialog_title" msgid="7446841758331151643">"Usayizi wombhalo womyalezo"</string>
- <string name="general_preference_text_zoom_tiny" msgid="2948174583663330937">"Ncane kakhulu"</string>
- <string name="general_preference_text_zoom_small" msgid="6618520238223144876">"Ncane"</string>
- <string name="general_preference_text_zoom_normal" msgid="1765540147950855479">"Jwayelekile"</string>
- <string name="general_preference_text_zoom_large" msgid="6874323663381586918">"Okukhulu"</string>
- <string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Nkulu kakhulu"</string>
- <string name="general_preference_reply_all_label" msgid="7806833609810003510">"Phendula konke"</string>
- <string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Enza \"Phendula konke\" idifalithi yezimpendulo zemiyaezo"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Cela ukukhombisa izithombe"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Izithombe emilayezweni ingekwe ivezwe"</string>
- <string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Bonisa izithombe\" ezisusiwe"</string>
- <string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> ku-<xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Ilinde ukuvumelanisa"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"I-imeyli yakho izovela maduze."</string>
- <string name="widget_other_views" msgid="4988574907386539499">"Cindezela isithonjana ukuze ushintshe."</string>
- <string name="widget_all_mail" msgid="4352573990283094963">"Ibhokisi lemiyalezo engenayo elihlanganisiwe"</string>
- <string name="widget_unread" msgid="4404711399009077833">"Akufundiwe"</string>
- <string name="widget_starred" msgid="8290352707134011791">"Okunenkanyezi"</string>
- <string name="widget_loading" msgid="2340962056927255554">"Iyalayisha..."</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Cindezela ukuze ulungisele ukusebenza."</string>
- <string name="widget_no_accounts" msgid="2412482205591224408">"Awukayilungiseleli ukusebenza i-akhawunti yakho."</string>
- <string name="more_than_999" msgid="8704425397397918798">"999+"</string>
- <string name="search_hint" msgid="2200412192574686497">"Sesha i-imeyli"</string>
- <string name="search_mailbox_hint" msgid="7854987729678942790">"Sesha <xliff:g id="ID_1">%1$s</xliff:g>"</string>
- <string name="search_header_text_fmt" msgid="3857004638127418247">"Imiphumela yosesho ye-\"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
- <string name="search_slow_warning_title" msgid="2826118321880530239">"Ilinde imiphumela"</string>
- <string name="search_slow_warning_message" msgid="8494483410797387903">"Amanye amaseva angathatha isikhathi eside."</string>
- <string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Amafolda"</string>
- <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Ungavumeli ukusebenza kwekhamera yedivayisi"</string>
- <string name="policy_require_password" msgid="7177274900480984702">"Idinga iphasiwedi yedivayisi"</string>
- <string name="policy_password_history" msgid="5743544498302303181">"Khawulela ukusetshenziswa kabusha kwamaphasiwedi wakamuva"</string>
- <string name="policy_password_expiration" msgid="1248123255253649199">"Cela ukuthi amaphasiwedi aphalwe isikhathi"</string>
- <string name="policy_screen_timeout" msgid="414869965358468080">"Dinga idivayisi yokumisa ukukhiya isikrini sayo"</string>
- <string name="policy_calendar_age" msgid="627405158087482302">"Khawulela inombolo yemicimbi yekhalenda evunyelanisiwe"</string>
- <string name="policy_email_age" msgid="7144148367145424963">"Khawulela inombolo yama-imeyili avumelanisiwe"</string>
- <string name="quick_1" msgid="3426057697353380951">"Siyabonga!"</string>
- <string name="quick_2" msgid="4188036352885736617">"Kuzwaka kukuhle kimi!"</string>
- <string name="quick_3" msgid="8061819976353395585">"Ngizofunda lokho emvakwesikhashana."</string>
- <string name="quick_4" msgid="3988974084396883051">"Masihlele umhlangano ukuxoxisana ngalokhu."</string>
- <string name="require_manual_sync_message" msgid="7777357288642785955">"Ukuvumelaniswa okungemumva kule-akhawunti ayisebenzi ngesikhathi usazula zula."</string>
- <string name="confirm_response" msgid="5747902757569543165">"Thumela impendulo..."</string>
- <string name="no_conversations" msgid="5559527390337162819">"Ayikho imilayezo."</string>
-</resources>
diff --git a/email2/res/values-zu/uploader.xml b/email2/res/values-zu/uploader.xml
deleted file mode 100644
index 60a78f11a..000000000
--- a/email2/res/values-zu/uploader.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="7812006268714926951">"Ukulayisha oku-Instant"</string>
- <string name="picasa_default_destination" msgid="2052406684123992574">"Ama-albhamu okulayisha a-Instant"</string>
- <string name="summary_title_uploading" msgid="3357617474017589370">"Iyalayisha"</string>
- <string name="summary_title_finished" msgid="7775292294989807025">"Kuqedile"</string>
- <string name="summary_title_paused" msgid="8936561302881926595">"Kumisiwe okwesikhashana"</string>
- <string name="summary_subtitle_uploading_format" msgid="8787409179557302869">"%1$d%% • %2$d izithombe • %3$d amavidiyo"</string>
- <string name="summary_subtitle_counts_format" msgid="7867903205999702138">"%1$d izithombe • %2$d amavidiyo"</string>
- <string name="summary_subtitle_paused_low_battery" msgid="7030423720574078362">"ibhetri iphansi"</string>
- <string name="summary_subtitle_paused_photos_quota" msgid="3057279018089658614">"isilinganiso sezithombe sidluliwe"</string>
- <string name="summary_subtitle_paused_roaming" msgid="974863046888934062">"Iyazulazula"</string>
- <string name="summary_subtitle_paused_need_wifi" msgid="2264018871872109546">"ilinde i-Wi-Fi"</string>
- <string name="summary_subtitle_paused_need_charger" msgid="3256171133661659691">"imisiwe ize ishaje"</string>
- <string name="summary_subtitle_paused_need_network" msgid="1922651711990030201">"ilinde uxhumano"</string>
- <string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"iyazama futhi e-%s"</string>
- <string name="summary_menu_show_pending" msgid="658361192495996">"Bonisa Ukulayisha Okusalindile"</string>
- <string name="summary_menu_show_finished" msgid="8544099132633066086">"Bonisa Ukulayisha Okuqedile"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Buka Uxhumekile kwi-Inthanethi"</string>
- <string name="menu_show_pending_items" msgid="8798191388238604213">"Bonisa Ukulayisha Okusalindile"</string>
- <string name="menu_hide_pending_items" msgid="9216079748638469160">"Fihla Ukulayisha Okulindile"</string>
- <string name="menu_show_completed_items" msgid="4380487776635859783">"Bonisa Imininingwane"</string>
- <string name="menu_hide_completed_items" msgid="6126007571523662799">"Fihla imininingwane"</string>
- <string name="menu_settings" msgid="5088116127086866634">"Izilungiselelo"</string>
- <string name="format_date_uploaded" msgid="803752037646090928">"Kulayishiwe %s"</string>
- <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
- <string name="account" msgid="5199161365824352613">"I-akhawunti"</string>
- <string name="upload" msgid="2615541458361216022">"Layisha"</string>
- <string name="ok" msgid="2516349681897895312">"KULUNGILE"</string>
- <string name="cancel" msgid="1207103189404543868">"Khansela"</string>
- <string name="uploading_to" msgid="3986362895940069510">"Ilayisha kwi-"<b>"%s"</b></string>
- <string name="uploading_for" msgid="1735961974624867111">" ye-"<b>"%s"</b></string>
- <string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
- <string name="toast_intent_error" msgid="6164928822619692280">"Ukuqalisa ukulayisha kwehlulekile."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Ifayela ayitholakali."</string>
- <string name="account_error" msgid="1904775271866104941">"Yehlulekile ukuthola ukwaziswa kwe-akhawunti."</string>
- <string name="toast_failed_auth" msgid="2196450105656960566">"Kube khona inkinga yokungena ngemvume kwi-akhawunti yakho."</string>
- <string name="upload_state_queued" msgid="3990598443227105526"></string>
- <string name="upload_state_waiting_retry" msgid="471790705731784779">"Ilinde ukuzama futhi"</string>
- <string name="upload_state_waiting_wifi" msgid="234662717256366625">"Ilinde i-Wi-Fi"</string>
- <string name="upload_state_uploading" msgid="82854465974176047">"Iyalayisha"</string>
- <string name="upload_state_failed" msgid="3799932718800848294">"Kwehlulekile"</string>
- <string name="upload_state_completed" msgid="5638163990418071018">"Kuqediwe"</string>
- <string name="pause_state_running" msgid="711411177620353982">"iyalayisha"</string>
- <string name="pause_state_manually_paused" msgid="4837627990158796573">"kumiswe okwesikhashana ngesandla"</string>
- <string name="pause_state_low_battery" msgid="3154677586511229063">"kumiswe okwesikhashana - ibhetri iphansi"</string>
- <string name="pause_state_need_charger" msgid="5014741655713255815">"imiswe okwesikhashana - imisiwe ize ishaje"</string>
- <string name="pause_state_need_connectivity" msgid="338696137467815955">"kumiswe okwesikhshana - kulinde uxhumano"</string>
- <string name="pause_state_need_photos_quota" msgid="4026149712680343993">"imisiwe okwesikhashana - ingaphezu kwesilinganiso se-PWA"</string>
- <string name="pause_state_need_wifi" msgid="231858819136516913">"kumiswe okwesikhashana - kwe-wifi"</string>
- <string name="pause_state_roaming" msgid="1811348200068311099">"kumiswe okwesikhashana - kuyazulazula"</string>
- <string name="pause_state_retrying" msgid="3734440128828177639">"ilinde ukuzama futhi"</string>
- <string name="retry_in_1min" msgid="2242454935194420914">"1 iminithi"</string>
- <string name="retry_in_2min" msgid="5845688527405283031">"2 amaminithi"</string>
- <string name="retry_in_5min" msgid="3153220715959570358">"5 amaminithi"</string>
- <string name="retry_no_data" msgid="630347885498641534">"Alukho uxhumano lwedatha"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"I-akhawunti ingaphandle kwesilinganiso sediski"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Ifayela ayitholakalanga"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Iphutha lensizakalo"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Iphutha lenethiwekhi"</string>
- <string name="failed_server_auth" msgid="2428208784689362254">"Ukuqinisekisa kwehlulekile"</string>
- <string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Ukulayisha okulindile [%d}"</string>
- <string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Iqede okulayishwayo [%d]"</string>
- <string name="manager_pause" msgid="7046645023617816964">"Misi okwesikhashana ukulayisha"</string>
- <string name="manager_resume" msgid="1608630525599824933">"Qalisa ukulayisha"</string>
- <string name="manager_upload_now" msgid="2284408578936376342">"Layisha manje"</string>
- <string name="manager_upload_later" msgid="5453932124711705632">"Layisha emva kwesikhathi"</string>
- <string name="manager_do_not_upload" msgid="1934417351195364210">"Ungalayishi"</string>
- <string name="manager_view_media" msgid="3714544539986850549">"Buka"</string>
- <string name="manager_retry" msgid="939534318469518843">"Zama futhi"</string>
- <string name="manager_toast_canceled" msgid="2331820022556147571">"Ukulayisha kukhanseliwe"</string>
- <string name="manager_toast_not_canceled" msgid="4274246237708259185">"Ukulayisha kakade kuqedile"</string>
- <string name="manager_sync_all" msgid="5207146576940014345">"Vumelanisa konke"</string>
- <string name="manager_activity_last_sync_format" msgid="3521722786363963155">"Ukuvumelanisa Kokugcina:"\n"%1$s"\n"%2$s"</string>
- <string name="finished_empty" msgid="689924777356099393">"Uhlu lwezintwana eziqedile alunalutho."</string>
- <string name="notify_uploads" msgid="8593982942665493037">"Ukulayisha oku-Instant"</string>
- <string name="notify_resolved" msgid="8111194870485485674">"Ukulayisha kuqedile"</string>
- <string name="notify_paused" msgid="3999817913227671338">"Ukulayisha kumiswe isikhashana"</string>
- <string name="notify_activation_reminder" msgid="1639234651193843030">"Ukulayisha oku-Instant akukakaqaliswa"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Amafayela amakhulu kakhulu azolayishwa ngoxhumano lwe-Wi-Fi kuphela."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Iskena amafayili..."</string>
- <string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Ilungiselela <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> izithombe na <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> mavidiyo ukuze alayishwe..."</string>
- <string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Azikho izithombe/amavidiyo angeziwe adingwa ukulayishwa."</string>
- <string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Kube khona inkinga yokuxhumana neseva. Sicela uzame futhi emva kwesikhathi."</string>
- <string name="dialog_sync_all_canceled" msgid="2595386304244274687">"Ukuvumelanisa konke kukhanseliwe"</string>
- <string name="dialog_sync_all_error_title" msgid="6227689508729774372">"Vumelanisa konke"</string>
- <string name="manager_view_completed" msgid="5119780300858727185">"Ukubuka Kuqedile"</string>
- <string name="manager_view_pending" msgid="4403346072556950609">"Buka Okusalindile"</string>
- <string name="preference_category_title_general" msgid="330919434495694575">"Okuvamile"</string>
- <string name="preference_title_pause_all_uploads" msgid="4188909974244266321">"Misa okwesikhashana konke ukulayisha"</string>
- <string name="preference_title_need_power" msgid="9165152026296632685">"Amandla"</string>
- <string name="preference_summary_need_power" msgid="1829578224249216151">"Layisha kuphela lapho ifini ishajwa."</string>
- <string name="preference_title_need_wifi" msgid="2398468701949227352">"Wi-Fi"</string>
- <string name="preference_summary_need_wifi" msgid="4627730244549568487">"Layisha kuphela lapho i-Wi-Fi itholakala."</string>
- <string name="preference_category_title_photos" msgid="8558221017057440259">"Izithombe"</string>
- <string name="preference_title_photos_account" msgid="1235191190019405102">"I-akhawunti"</string>
- <string name="preference_title_photos_upload_connectivity" msgid="8026800699913042033">"Imibandela yokulayisha"</string>
- <string name="preference_title_photo_size" msgid="2291608017215972660">"Usayizi wesithombe"</string>
- <string name="preference_category_title_videos" msgid="8962400910793075570">"Amavidiyo"</string>
- <string name="preference_title_videos_account" msgid="6675545508568161301">"I-akhawunti"</string>
- <string name="preference_title_videos_account_summary" msgid="2925385281151195648">"I-akhawunti yezithombe izosetshenziselwa ukulayisha amavidiyo."</string>
- <string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Imibandela yokulayisha"</string>
- <string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Izilungiselelo zoxhumano lwezithombe ziyasebenzisa okwamanje."</string>
- <string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Izithombe kuphela ngezinhleloxhumano zeselula"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Izithombe namavidiyo ngezinhleloxhumano zeselula"</string>
- <string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Izithombe namavidiyo nge-Wi-Fi kuphela"</string>
- <string name="preference_category_title_about" msgid="3001183168471659844">"Mayelana"</string>
- <string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Inguqulo yokulayisha e-Instant"</string>
- <string name="photos_upload_dimension_1600" msgid="2261848079760937674">"Okunconywayo: amaphikseli angu-1600 (okwabelana, ukuphrinta nesilondolozi sihenqo)"</string>
- <string name="photos_upload_dimension_original" msgid="6807552546029109517">"Usayizi wasekuqaleni (ukulayisha okulengayo)"</string>
- <string name="pause_state_need_media" msgid="3849758767808306320">"Kumisiwe okwesikhashana - ikhadi le-SD alitholakali"</string>
- <string name="summary_subtitle_paused_need_media" msgid="8674787576306211689">"Ikhadi le-SD alitholakali"</string>
- <string name="preference_plus_title" msgid="8505499389432915393">"Izilungiselelo zokulayisha ezi-Instant"</string>
- <string name="preference_plus_enable_cs" msgid="8946492352805623630">"Ukulayisha oku-Instant"</string>
- <string name="preference_plus_enable_cs_summary" msgid="8412139973136041010">"Layisha izithombe ezinstha ngokuzenzakalelayo izithombe namavidiyo ku-albhamu yewebhu yangasese"</string>
- <string name="preference_plus_upload_status" msgid="7925576302519589779">"Layisha isimo"</string>
- <string name="preference_plus_category_advanced" msgid="1159923217131890712">"Okuthuthukisiwe"</string>
- <string name="preference_plus_mobile_data_connection" msgid="5368391437581896915">"Ukulayisha kweselula"</string>
- <string name="preference_plus_sync_while_roaming" msgid="137428136220746649">"Uluzulazula kokulayisha"</string>
- <string name="preference_plus_sync_while_roaming_summary" msgid="358436280727344717">"Layisha izithombe &amp; namavidiyo uma uzulazula kuhleloxhumano lwedatha"</string>
- <string name="preference_plus_delay_sync_until_charging" msgid="2327042451671101467">"Okulayishiwe Kubhetri"</string>
- <string name="preference_plus_delay_sync_until_charging_summary" msgid="8613924819421248445">"Layisha izithombe &amp; namavidiyo uma ushaja kuphela"</string>
- <string name="preference_plus_sync_all" msgid="2563137874388611459">"Layisha izithombe ezikhona kakade"</string>
- <string name="preference_plus_sync_all_description" msgid="2789041515679642463">"Layisha izithombe ezikhona kakade &amp; namavidiyo ocingweni lakho"</string>
- <string name="summary_subtitle_disabled" msgid="8964378166312900703">"Akusebenzi"</string>
- <string name="preference_summary_header_format" msgid="8850267704647137239">"%1$s \"%2$s"</string>
- <string name="preference_summary_uploading_percent" msgid="3266958005329832043">"Iyalayisha (%1$d%%)"</string>
- <string name="preference_summary_uploading_format" msgid="6092575579212954671">":%1$d kwezingu-%2$d:"</string>
- <string name="preference_summary_uploading_paused" msgid="2413016492323452882">"Kumisiwe okwesikhashana: thinta ukuqhuba ukulayisha futhi"</string>
- <string name="preference_plus_sync_all_prompt_title" msgid="7677605572146032195">"Layisha izithombe ezikhona kakade"</string>
- <string name="preference_plus_sync_all_prompt_text" msgid="2215794846784161524">"Ilayisha izithombe namavidiyo angakalayishwa kusuka efonini yakho kuya kwi-albhamu yangasese kuwebhu kungathatha isikhashana, kodwa izoqedwa esizindeni. Uyaqiniseka ukuthi ufuna ukuqhubeka?"</string>
- <string name="preference_plus_sync_all_prompt_yes" msgid="4844977073896196919">"Yebo"</string>
- <string name="preference_plus_sync_all_prompt_no" msgid="4216190537695947368">"Cha"</string>
-</resources>
diff --git a/email2/res/values/arrays.xml b/email2/res/values/arrays.xml
deleted file mode 100644
index d51fb17f2..000000000
--- a/email2/res/values/arrays.xml
+++ /dev/null
@@ -1,215 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
-
- <!-- Do not change any of the values in this array without checking/changing -->
- <!-- related values in: AccountSetupBasics.java & AccountSetupOptions.java -->
-
- <!-- In particular, 15 minutes is hardcoded as the default for new accounts. -->
-
- <string-array name="account_settings_check_frequency_entries">
- <item>@string/account_setup_options_mail_check_frequency_never</item>
- <item>@string/account_setup_options_mail_check_frequency_5min</item>
- <item>@string/account_setup_options_mail_check_frequency_10min</item>
- <item>@string/account_setup_options_mail_check_frequency_15min</item>
- <item>@string/account_setup_options_mail_check_frequency_30min</item>
- <item>@string/account_setup_options_mail_check_frequency_1hour</item>
- </string-array>
-
- <string-array name="account_settings_check_frequency_values" translatable="false">
- <item>-1</item>
- <item>5</item>
- <item>10</item>
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
-
-
- <!-- The arrays that are presented to push-enabled accounts -->
- <string-array name="account_settings_check_frequency_entries_push">
- <item>@string/account_setup_options_mail_check_frequency_push</item>
- <item>@string/account_setup_options_mail_check_frequency_never</item>
- <item>@string/account_setup_options_mail_check_frequency_5min</item>
- <item>@string/account_setup_options_mail_check_frequency_10min</item>
- <item>@string/account_setup_options_mail_check_frequency_15min</item>
- <item>@string/account_setup_options_mail_check_frequency_30min</item>
- <item>@string/account_setup_options_mail_check_frequency_1hour</item>
- </string-array>
-
- <string-array name="account_settings_check_frequency_values_push" translatable="false">
- <item>-2</item>
- <item>-1</item>
- <item>5</item>
- <item>10</item>
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
-
- <!-- Mail sync window sizes for EAS accounts -->
- <string-array name="account_settings_mail_window_entries">
- <item>@string/account_setup_options_mail_window_auto</item>
- <item>@string/account_setup_options_mail_window_1day</item>
- <item>@string/account_setup_options_mail_window_3days</item>
- <item>@string/account_setup_options_mail_window_1week</item>
- <item>@string/account_setup_options_mail_window_2weeks</item>
- <item>@string/account_setup_options_mail_window_1month</item>
- <item>@string/account_setup_options_mail_window_all</item>
- </string-array>
-
- <!-- Mail sync window size codes for EAS accounts -->
- <string-array name="account_settings_mail_window_values" translatable="false">
- <item>-2</item>
- <item>1</item>
- <item>2</item>
- <item>3</item>
- <item>4</item>
- <item>5</item>
- <item>6</item>
- </string-array>
-
- <!-- Mail sync window sizes for EAS mailboxes. It's the same thing as
- account_settings_mail_window_entries, but has 0=default. -->
- <string-array name="account_settings_mail_window_entries_with_default">
- <item>@string/account_setup_options_mail_window_default</item>
- <item>@string/account_setup_options_mail_window_auto</item>
- <item>@string/account_setup_options_mail_window_1day</item>
- <item>@string/account_setup_options_mail_window_3days</item>
- <item>@string/account_setup_options_mail_window_1week</item>
- <item>@string/account_setup_options_mail_window_2weeks</item>
- <item>@string/account_setup_options_mail_window_1month</item>
- <item>@string/account_setup_options_mail_window_all</item>
- </string-array>
-
- <!-- Mail sync window size codes for EAS milboxes. It's the same thing as
- account_settings_mail_window_values, but has 0=default. -->
- <string-array name="account_settings_mail_window_values_with_default" translatable="false">
- <item>0</item>
- <item>-2</item>
- <item>1</item>
- <item>2</item>
- <item>3</item>
- <item>4</item>
- <item>5</item>
- <item>6</item>
- </string-array>
-
- <!-- The vibrate notification modes -->
- <string-array name="account_settings_vibrate_when_entries">
- <!-- Always -->
- <item>@string/account_settings_vibrate_when_always</item>
- <!-- Only when the phone is in Silent mode -->
- <item>@string/account_settings_vibrate_when_silent</item>
- <!-- Never -->
- <item>@string/account_settings_vibrate_when_never</item>
- </string-array>
-
- <!-- The vibrate notification values -->
- <string-array translatable="false" name="account_settings_vibrate_when_values">
- <item>always</item>
- <item>silent</item>
- <item>never</item>
- </string-array>
-
- <!-- Auto-advance options (DO NOT change the order. Code assumes this order)-->
- <string-array name="general_preference_auto_advance_entries">
- <!-- Move to newer -->
- <item>@string/general_preference_auto_advance_newer</item>
- <!-- Move to older -->
- <item>@string/general_preference_auto_advance_older</item>
- <!-- Move to message list -->
- <item>@string/general_preference_auto_advance_message_list</item>
- </string-array>
-
- <!-- Auto-advance option values (DO NOT change the order. Code assumes this order)-->
- <string-array translatable="false" name="general_preference_auto_advance_values">
- <!-- Move to newer -->
- <item>newer</item>
- <!-- Move to older -->
- <item>older</item>
- <!-- Move to message list -->
- <item>list</item>
- </string-array>
-
- <!-- Text Zoom options (DO NOT change the order. Code assumes this order)-->
- <string-array name="general_preference_text_zoom_entries">
- <item>@string/general_preference_text_zoom_tiny</item>
- <item>@string/general_preference_text_zoom_small</item>
- <item>@string/general_preference_text_zoom_normal</item>
- <item>@string/general_preference_text_zoom_large</item>
- <item>@string/general_preference_text_zoom_huge</item>
- </string-array>
-
- <!-- Text Zoom option values (DO NOT change the order. Code assumes this order)-->
- <string-array translatable="false" name="general_preference_text_zoom_values">
- <item>tiny</item>
- <item>small</item>
- <item>normal</item>
- <item>large</item>
- <item>huge</item>
- </string-array>
-
- <!-- Arrays "mailbox_display_names" and "mailbox_display_icons" MUST match the order
- of the types of mailboxes defined in EmailContent -->
- <string-array name="mailbox_display_names" translatable="false">
- <!-- TYPE_INBOX = 0 -->
- <item>@string/mailbox_name_display_inbox</item>
- <!-- TYPE_MAIL = 1 -->
- <item></item>
- <!-- TYPE_PARENT = 2 -->
- <item></item>
- <!-- TYPE_DRAFTS = 3 -->
- <item>@string/mailbox_name_display_drafts</item>
- <!-- TYPE_OUTBOX = 4 -->
- <item>@string/mailbox_name_display_outbox</item>
- <!-- TYPE_SENT = 5 -->
- <item>@string/mailbox_name_display_sent</item>
- <!-- TYPE_TRASH = 6 -->
- <item>@string/mailbox_name_display_trash</item>
- <!-- TYPE_JUNK = 7 -->
- <item>@string/mailbox_name_display_junk</item>
- </string-array>
-
- <!-- A small number of default quick responses -->
- <string-array name="default_quick_responses">
- <item>@string/quick_1</item>
- <item>@string/quick_2</item>
- <item>@string/quick_3</item>
- <item>@string/quick_4</item>
- </string-array>
-
- <!-- Account color chips on combined view -->
- <array name="combined_view_account_colors" translatable="false">
- <item>@color/combined_view_account_color_1</item>
- <item>@color/combined_view_account_color_2</item>
- <item>@color/combined_view_account_color_3</item>
- <item>@color/combined_view_account_color_4</item>
- <item>@color/combined_view_account_color_5</item>
- <item>@color/combined_view_account_color_6</item>
- <item>@color/combined_view_account_color_7</item>
- <item>@color/combined_view_account_color_8</item>
- <item>@color/combined_view_account_color_9</item>
- </array>
-
- <!-- Host addresses starting with these infer an smtp address replacing the word with "smtp" -->
- <string-array translatable="false" name="smtp_host_prefixes">
- <item>pop3</item>
- <item>pop</item>
- <item>imap</item>
- </string-array>
-</resources>
diff --git a/email2/res/values/attrs.xml b/email2/res/values/attrs.xml
deleted file mode 100644
index 7faf95d24..000000000
--- a/email2/res/values/attrs.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Defines attributes for custom views -->
-
-<resources>
- <declare-styleable name="SizeBoundingFrameLayout_attributes">
- <attr name="maxWidth" format="dimension"/>
- <attr name="maxHeight" format="dimension"/>
- </declare-styleable>
- <declare-styleable name="EmailServiceInfo">
- <attr name="protocol" format="string"/>
- <attr name="name" format="string"/>
- <attr name="accountType" format="string"/>
- <attr name="serviceClass" format="string"/>
- <attr name="intent" format="string"/>
- <attr name="port" format="integer"/>
- <attr name="portSsl" format="integer"/>
- <attr name="defaultSsl" format="boolean"/>
- <attr name="offerTls" format="boolean"/>
- <attr name="offerCerts" format="boolean"/>
- <attr name="offerLocalDeletes" format="boolean"/>
- <attr name="defaultLocalDeletes" format="integer"/>
- <attr name="offerPrefix" format="boolean"/>
- <attr name="usesSmtp" format="boolean"/>
- <attr name="syncChanges" format="boolean"/>
- <attr name="syncContacts" format="boolean"/>
- <attr name="syncCalendar" format="boolean"/>
- <attr name="usesAutodiscover" format="boolean"/>
- <attr name="offerLookback" format="boolean"/>
- <attr name="defaultLookback">
- <enum name="auto" value="-2"/>
- <enum name="days1" value="1"/>
- <enum name="days3" value="2"/>
- <enum name="weeks1" value="3"/>
- <enum name="weeks2" value="4"/>
- <enum name="months1" value="5"/>
- <enum name="all" value="6"/>
- </attr>
- <attr name="offerAttachmentPreload" format="boolean"/>
- <attr name="syncIntervalStrings" format="reference"/>
- <attr name="syncIntervals" format="reference"/>
- <attr name="defaultSyncInterval">
- <enum name="push" value="-2"/>
- <enum name="never" value="-1"/>
- <enum name="mins5" value="5"/>
- <enum name="mins10" value="10"/>
- <enum name="mins15" value="15"/>
- <enum name="mins30" value="30"/>
- <enum name="mins60" value="60"/>
- </attr>
- </declare-styleable>
-</resources>
diff --git a/email2/res/values/build_number.xml b/email2/res/values/build_number.xml
deleted file mode 100644
index 9c414d2a2..000000000
--- a/email2/res/values/build_number.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <string name="build_number" translatable="false">20080722-0001</string>
-</resources>
diff --git a/email2/res/values/colors.xml b/email2/res/values/colors.xml
deleted file mode 100644
index a50494161..000000000
--- a/email2/res/values/colors.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- See also values-xlarge for specializations for xlarge screens -->
-<!-- See also values-xlarge for specializations for xlarge screens -->
-<resources>
- <!-- Account setup screens -->
- <color name="account_setup_headline_color">#5E802B</color>
- <color name="account_setup_info_text_color">#000000</color>
- <color name="account_setup_label_text_color">#666666</color>
- <color name="account_setup_divider_color">#CCCCCC</color>
-
- <!-- Main UI -->
- <color name="connection_error_banner">#fffff1a8</color>
-
- <!-- Standard text colors -->
- <color name="text_secondary_color">#666666</color>
- <color name="text_ternary_color">#aaaaaa</color>
-
- <!-- Account color chips on combined view -->
- <color name="combined_view_account_color_1">#ff71aea7</color>
- <color name="combined_view_account_color_2">#ff621919</color>
- <color name="combined_view_account_color_3">#ff18462f</color>
- <color name="combined_view_account_color_4">#ffbf8e52</color>
- <color name="combined_view_account_color_5">#ff001f79</color>
- <color name="combined_view_account_color_6">#ffa8afc2</color>
- <color name="combined_view_account_color_7">#ff6b64c4</color>
- <color name="combined_view_account_color_8">#ff738359</color>
- <color name="combined_view_account_color_9">#ff9d50a4</color>
-
- <color name="button_text_color">#777777</color>
- <color name="button_text_disabled_color">#cccccc</color>
-</resources> \ No newline at end of file
diff --git a/email2/res/values/dimensions.xml b/email2/res/values/dimensions.xml
deleted file mode 100644
index a466dd309..000000000
--- a/email2/res/values/dimensions.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- non-xlarge -->
-
-<resources>
- <dimen name="button_minWidth">100sp</dimen>
- <dimen name="message_list_item_height_wide">70sp</dimen>
- <dimen name="message_list_item_height_normal">70sp</dimen>
- <dimen name="message_list_item_color_tip_width">35dip</dimen>
- <dimen name="message_list_item_color_tip_height">6dip</dimen>
- <dimen name="message_list_badge_margin">4dip</dimen>
- <dimen name="message_list_icon_padding_compensation">3dip</dimen>
-
- <!-- Account settings fragments -->
- <dimen name="settings_fragment_padding_top">16dip</dimen>
- <dimen name="settings_fragment_padding_left">16dip</dimen>
- <dimen name="settings_fragment_padding_right">16dip</dimen>
-
- <!-- Account setup fragments -->
- <dimen name="setup_fragment_padding_top">16dip</dimen>
- <dimen name="setup_fragment_padding_left">16dip</dimen>
- <dimen name="setup_fragment_padding_right">16dip</dimen>
-
- <!-- inset distance for settings buttons -->
- <dimen name="settings_buttons_padding_top">48dip</dimen>
- <dimen name="settings_buttons_padding_bottom">48dip</dimen>
-
- <!-- In setup screens, the inset for all items below the headline+hairline -->
- <dimen name="setup_item_inset_left">0dip</dimen>
- <dimen name="setup_item_inset_right">0dip</dimen>
-
- <!-- Username/password entry -->
- <dimen name="setup_credentials_input_width">340dip</dimen>
-
- <!-- Message list items -->
- <dimen name="replystate_margin_left">8dip</dimen>
- <dimen name="replystate_margin_right">0dip</dimen>
- <dimen name="replystate_margin_top">10sp</dimen>
-</resources>
diff --git a/email2/res/values/strings.xml b/email2/res/values/strings.xml
deleted file mode 100644
index 237ff1164..000000000
--- a/email2/res/values/strings.xml
+++ /dev/null
@@ -1,1304 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Names of packages and authorities that are common to all apps
- and read from resources -->
- <!-- Name of the search suggestions authority that looks up recent suggestions. This
- needs to be modified in AndroidManifest.xml and res/xml/searchable.xml as well. -->
- <string name="suggestions_authority" translatable="false">com.android.email.suggestionsprovider</string>
-
- <!-- Permissions label for reading attachments -->
- <string name="permission_read_attachment_label">Read email attachments</string>
- <!-- Permissions description for reading attachments -->
- <string name="permission_read_attachment_desc">Allows the app to read your email
- attachments.</string>
- <!-- Permissions label for accessing the main provider -->
- <string name="permission_access_provider_label">Access email provider data</string>
- <!-- Permissions description for accessing the main provider -->
- <string name="permission_access_provider_desc">Allows the app to access your email
- database, including received messages, sent messages, usernames, and passwords.</string>
-
- <!-- Name of application on Home screen -->
- <string name="app_name">Email</string>
- <!-- Title of compose screen -->
- <string name="compose_title">Compose</string>
- <!-- Title of debug screen -->
- <string name="debug_title">Debug</string>
-
- <!-- Actions will be used as buttons and in menu items -->
- <skip />
-
- <!-- Button name used as part of a multi-step process -->
- <string name="next_action">Next</string>
- <!-- Button name used to confirm acceptance of dialog boxes, warnings, errors, etc. -->
- <string name="okay_action">OK</string>
- <!-- Button name used to cancel out of dialog boxes -->
- <string name="cancel_action">Cancel</string>
- <!-- Button name used to move to previous step during setup sequence [CHAR_LIMIT=16] -->
- <string name="previous_action">Previous</string>
- <!-- Menu item/button name -->
- <string name="send_action">Send</string>
- <!-- Menu item/button name -->
- <string name="reply_action">Reply</string>
- <!-- Menu item/button name -->
- <string name="reply_all_action">Reply all</string>
- <!-- Menu item/button name -->
- <string name="delete_action">Delete</string>
- <!-- Menu item/button name -->
- <string name="forward_action">Forward</string>
- <!-- Menu/Button item name and label for marking a message as a favorite
- (usually called starred) [CHAR LIMIT=40] -->
- <string name="favorite_action">Star</string>
- <!-- Button name used to complete a multi-step process -->
- <string name="done_action">Done</string>
- <!-- Button name used to create a new quick response [CHAR_LIMIT=16] -->
- <string name="create_action">Create new</string>
- <!-- Button name used to delete a quick response [CHAR_LIMIT=16] -->
- <string name="delete_quick_response_action">Delete</string>
- <!-- Message informing user when a list that would contain quick responses
- is empty [CHAR_LIMIT=80] -->
- <string name="quick_responses_empty_view">No quick responses.</string>
- <!-- Menu item/button name -->
- <string name="discard_action">Discard</string>
- <!-- Menu item/button name [CHAR_LIMIT=16] -->
- <string name="save_draft_action">Save draft</string>
- <!-- Menu item/button name. Pressing will insert previously saved text
- into message body. [CHAR_LIMIT=24] -->
- <string name="show_quick_text_list_dialog_action">Insert quick response</string>
- <!-- Menu item/button name -->
- <string name="read_action">Mark read</string>
- <!-- Menu item/button name -->
- <string name="unread_action">Mark unread</string>
- <!-- Menu item/button name -->
- <string name="set_star_action">Add star</string>
- <!-- Menu item/button name -->
- <string name="remove_star_action">Remove star</string>
- <!-- Menu item -->
- <string name="refresh_action">Refresh</string>
- <!-- Menu item -->
- <string name="add_account_action">Add account</string>
- <!-- Menu item -->
- <string name="compose_action">Compose</string>
- <!-- Menu item/button name -->
- <string name="search_action">Search</string>
- <!-- Menu item -->
- <string name="account_settings_action">Account settings</string>
- <!-- Menu item for settings [CHAR LIMIT=40]-->
- <string name="settings_action">Settings</string>
- <!-- Menu item: options for this mailbox. [CHAR LIMIT = 32] -->
- <string name="menu_folder_options">Sync options</string>
- <!-- Menu item -->
- <string name="mark_as_unread_action">Mark as unread</string>
- <!-- Menu item for moving messages to folders [CHAR LIMIT=10] -->
- <string name="move_action">Move</string>
- <!-- Button label for adding CC/BCC fields on message compose. [CHAR LIMIT=16] -->
- <string name="plus_cc_label">+ Cc/Bcc</string>
- <!-- Menu item label for adding CC/BCC fields on message compose. [CHAR LIMIT=20] -->
- <string name="add_cc_bcc_menu">Add Cc/Bcc</string>
- <!-- Menu item label for adding an attachment on message compose. [CHAR LIMIT=20] -->
- <string name="add_file_attachment">Attach file</string>
- <!-- Generic button [CHAR LIMIT=16] -->
- <string name="close_action">Close</string>
- <!-- Command shown on Outbox to send all pending messages [CHAR LIMIT=20] -->
- <string name="message_list_send_pending_messages_action">Send all messages</string>
- <!-- Appears in choose attachment dialog title -->
- <string name="choose_attachment_dialog_title">Choose attachment</string>
- <!-- Dialog title to select a mailbox to which the user moves messages [CHAR LIMIT=20] -->
- <string name="move_to_folder_dialog_title">Move to</string>
- <!-- Appears in message list view while messages are being loaded [CHAR LIMIT=260dip] -->
- <string name="status_loading_messages">Loading messages\u2026</string>
- <!-- Appears in message list view when there's a network error. -->
- <!-- Also appears in a toast, in the message viewer, when there's a network error. -->
- <string name="status_network_error">Connection problem.</string>
- <!-- Dialog text when we are unable to load the message for display -->
- <string name="error_loading_message_body">Couldn\'t load the message text. The message
- may be too large to view.</string>
- <!-- Text shown with dragged messages to indicate how many are being dragged [CHAR LIMIT=40]-->
- <plurals name="move_messages">
- <item quantity="one">Move message</item>
- <item quantity="other">Move messages</item>
- </plurals>
- <!-- Toast shown when a message(s) can't be moved because it's not supported by the POP3
- protocol. [CHAR LIMIT=none]-->
- <string name="cannot_move_protocol_not_supported_toast">Move isn\'t supported on POP3 accounts.
- </string>
- <!-- Toast shown when messages can't be moved because the selection contains multiple accounts'
- messages. [CHAR LIMIT=none]-->
- <string name="cannot_move_multiple_accounts_toast">Can\'t move because selection contains multiple
- accounts.</string>
- <!-- Toast shown when messages can't be moved because they're in a special mailbox. "Drafts",
- "Outbox" and "Sent". [CHAR LIMIT=none]-->
- <string name="cannot_move_special_mailboxes_toast">Messages in Drafts, Outbox, and Sent can\'t be
- moved.</string>
-
- <!-- Notification message in notifications window when one account has
- one or more new messages; e.g, "279 unread (someone@google.com)". -->
- <plurals name="notification_new_one_account_fmt">
- <!-- Case of one new message. -->
- <item quantity="one"><xliff:g id="unread_message_count" example="1">%1$d</xliff:g> unread (<xliff:g id="account">%2$s</xliff:g>)</item>
-
- <!-- Case of "few" (small number of) new messages. -->
- <item quantity="few"><xliff:g id="unread_message_count" example="2">%1$d</xliff:g> unread (<xliff:g id="account">%2$s</xliff:g>)</item>
-
- <!-- Case of a plural number of new messages. -->
- <item quantity="other"><xliff:g id="unread_message_count" example="279">%1$d</xliff:g> unread (<xliff:g id="account">%2$s</xliff:g>)</item>
- </plurals>
-
- <!-- Notification message in notifications window when 2+ accounts have new mail; e.g, "in 3 accounts". -->
- <plurals name="notification_new_multi_account_fmt">
- <!-- Case of "few" (small number of) accounts with unread messages. -->
- <item quantity="few">in <xliff:g id="number_accounts" example="2">%d</xliff:g> accounts</item>
- <!-- Case of plural number of accounts with unread messages. -->
- <item quantity="other">in <xliff:g id="number_accounts" example="10">%d</xliff:g> accounts</item>
- </plurals>
- <!-- String to indicate which account received a new message. [CHAR LIMIT=none] -->
- <string name="notification_to_account">to <xliff:g id="receiver_name"
- example="Main">%1$s</xliff:g></string>
-
- <!-- Notification for multiple messages [CHAR LIMIT=60] -->
- <string name="notification_multiple_new_messages_fmt">
- <xliff:g example="2">%1$d</xliff:g> new messages</string>
-
- <!-- Name given to "all accounts" in the account picker for shortcuts and widget [CHAR LIMIT=20] -->
- <string name="account_name_display_all">All accounts</string>
-
- <!-- The number of accounts configured. [CHAR LIMIT=16] -->
- <plurals name="number_of_accounts">
- <item quantity="one"><xliff:g id="num_accounts" example="1">%1$d</xliff:g> account</item>
- <item quantity="other"><xliff:g id="num_accounts" example="2">%1$d</xliff:g> accounts</item>
- </plurals>
- <!-- The next set of strings are used server-side and must not be localized. -->
- <!-- Do Not Translate. This is the name of the "inbox" folder, on the server. -->
- <string name="mailbox_name_server_inbox" translatable="false">Inbox</string>
- <!-- Do Not Translate. This is the name of the "outbox" folder, on the server. -->
- <string name="mailbox_name_server_outbox" translatable="false">Outbox</string>
- <!-- Do Not Translate. This is the name of the "drafts" folder, on the server. -->
- <string name="mailbox_name_server_drafts" translatable="false">Drafts</string>
- <!-- Do Not Translate. This is the name of the "trash" folder, on the server. -->
- <string name="mailbox_name_server_trash" translatable="false">Trash</string>
- <!-- Do Not Translate. This is the name of the "sent" folder, on the server. -->
- <string name="mailbox_name_server_sent" translatable="false">Sent</string>
- <!-- Do Not Translate. This is the name of the "junk" folder, on the server. -->
- <string name="mailbox_name_server_junk" translatable="false">Junk</string>
-
- <!-- The next set of strings are used in local display and may be localized. -->
- <!-- In the UI, the inbox will be displayed with this name -->
- <string name="mailbox_name_display_inbox">Inbox</string>
- <!-- In the UI, the outbox will be displayed with this name -->
- <string name="mailbox_name_display_outbox">Outbox</string>
- <!-- In the UI, the drafts will be displayed with this name -->
- <string name="mailbox_name_display_drafts">Drafts</string>
- <!-- In the UI, the trash will be displayed with this name -->
- <string name="mailbox_name_display_trash">Trash</string>
- <!-- In the UI, the sent will be displayed with this name -->
- <string name="mailbox_name_display_sent">Sent</string>
- <!-- In the UI, the junk will be displayed with this name -->
- <string name="mailbox_name_display_junk">Junk</string>
- <!-- In the UI, the unread will be displayed with this name [CHAR LIMIT=15] -->
- <string name="mailbox_name_display_unread">Unread</string>
- <!-- In the shortcut/widget configuration UI, the label for selecting only the unread messages in an account's inbox [CHAR LIMIT=30] -->
- <string name="picker_mailbox_name_all_unread">Inbox (unread)</string>
- <!-- In the shortcut/widget configuration UI, the label for selecting all messages in an account's inbox [CHAR LIMIT=30] -->
- <string name="picker_mailbox_name_all_inbox">Inbox (all)</string>
- <!-- In the shortcut/widget configuration UI, use this for the "all accounts" account list item [CHAR LIMIT=30] -->
- <string name="picker_combined_view_fmt">Combined view (<xliff:g id="count">%s</xliff:g>)</string>
- <!-- Count of accounts; used in picker_combined_view_fmt -->
- <plurals name="picker_combined_view_account_count">
- <item quantity="one" ><xliff:g id="account_count" example="1">%d</xliff:g> account</item>
- <item quantity="other"><xliff:g id="account_count" example="9">%d</xliff:g> accounts</item>
- </plurals>
-
- <!-- Version number, shown only on debug screen -->
- <string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
- <!-- Do Not Translate. Checkbox label, shown only on debug screen -->
- <string name="debug_enable_debug_logging_label" translatable="false">
- Enable extra debug logging?</string>
- <!-- Do Not Translate. Checkbox label, shown only on debug screen -->
- <string name="debug_enable_verbose_logging_label" translatable="false">
- Enable extremely verbose logging?</string>
- <!-- Do Not Translate. Checkbox label, shown only on debug screen -->
- <string name="debug_enable_file_logging_label" translatable="false">
- Enable sd card logging?</string>
- <!-- Do Not Translate. Button label, shown only on debug screen -->
- <string name="debug_clear_webview_cache" translatable="false">
- Clear WebView cache</string>
- <!-- Do Not Translate. Checkbox label, shown on debug screen. -->
- <string name="debug_disable_graphics_acceleration_label" translatable="false">
- Disable hardware graphics acceleration</string>
- <!-- Do Not Translate. Checkbox label, shown on debug screen. -->
- <string name="debug_force_one_minute_refresh_label" translatable="false">
- Force 1-minute refresh for POP/IMAP</string>
- <!-- Do Not Translate. Checkbox label, shown on debug screen. -->
- <string name="debug_enable_strict_mode_label" translatable="false">
- Enable strict mode (with logging)</string>
-
- <!-- The summary section entry in the AccountFolder list to display all inboxes -->
- <string name="account_folder_list_summary_inbox">Inbox</string>
- <!-- The summary section entry in the AccountFolder list to display all starred
- [CHAR LIMIT=200dip] -->
- <string name="account_folder_list_summary_starred">Starred</string>
- <!-- The summary section entry in the AccountFolder list to display all drafts
- [CHAR LIMIT=200dip] -->
- <string name="account_folder_list_summary_drafts">Drafts</string>
- <!-- The summary section entry in the AccountFolder list to display all outboxes
- [CHAR LIMIT=200dip] -->
- <string name="account_folder_list_summary_outbox">Outbox</string>
-
- <!-- Label shown in the account selector to select "Combined view", which contains
- Combined Inbox, Combined Outbox, etc. [CHAR LIMIT=30] -->
- <string name="mailbox_list_account_selector_combined_view">Combined view</string>
- <!-- Label shown in the account/mailbox selector to switch to the show all the top-level mailboxes. [CHAR LIMIT=30] -->
- <string name="mailbox_list_account_selector_show_all_folders">Show all folders</string>
- <!-- Account list header in the account/mailbox selector. [CHAR LIMIT=30] -->
- <string name="mailbox_list_account_selector_account_header">Accounts</string>
- <!-- Recent mailbox header in the account/mailbox selector. [CHAR LIMIT=30] -->
- <string name="mailbox_list_account_selector_mailbox_header_fmt">
- Recent folders (<xliff:g id="email_address">%s</xliff:g>)</string>
-
- <!-- Mailbox list header for user folders [CHAR LIMIT=30] -->
- <string name="mailbox_list_user_mailboxes">All folders</string>
- <!-- Mailbox list header for recent folders [CHAR LIMIT=30] -->
- <string name="mailbox_list_recent_mailboxes">Recent folders</string>
-
- <!-- Announces the subject field for a message for users with accessibility requirements -->
- <string name="message_subject_description">Subject</string>
- <!-- Announces that a message has no sender or subject
- to users with accessibility requirements -->
- <string name="message_is_empty_description">No subject</string>
- <!-- Appears at the bottom of list of messages; user selects to load more messages from that folder. -->
- <string name="message_list_load_more_messages_action">Load more messages</string>
- <!-- The number of messages that are currently selected for various operations such as
- "delete message(s)" [CHAR LIMIT=32] -->
- <plurals name="message_view_selected_message_count">
- <item quantity="one" ><xliff:g id="message_count" example="1">%d</xliff:g> selected</item>
- <item quantity="other"><xliff:g id="message_count" example="9">%d</xliff:g> selected</item>
- </plurals>
- <!-- Message to show when there are no messages (emails) in the selected mailbox.
- [CHAR LIMIT=26] -->
- <string name="message_list_no_messages">No messages</string>
- <!-- Hint text in To field -->
- <string name="message_compose_to_hint">To</string>
- <!-- Hint text in Cc field -->
- <string name="message_compose_cc_hint">Cc</string>
- <!-- Hint text in Bcc field -->
- <string name="message_compose_bcc_hint">Bcc</string>
- <!-- Hint text in Subject field -->
- <string name="message_compose_subject_hint">Subject</string>
- <!-- Label for From field [CHAR LIMIT=12] -->
- <string name="message_compose_from_label">From:</string>
- <!-- Label for To field [CHAR LIMIT=12] -->
- <string name="to">To</string>
- <!-- Label for Cc field [CHAR LIMIT=12] -->
- <string name="cc">Cc</string>
- <!-- Label for Bcc field [CHAR LIMIT=12] -->
- <string name="bcc">Bcc</string>
- <!-- Label for Subject field [CHAR LIMIT=12] -->
- <string name="subject_hint">Subject</string>
- <!-- Hint text in Message composer body field -->
- <string name="body_hint">Compose email</string>
- <!-- Header for forwarded original messages -->
- <string name="message_compose_fwd_header_fmt">\n\n-------- Original Message --------\nSubject: <xliff:g id="subject">%1$s</xliff:g>\nFrom: <xliff:g id="sender">%2$s</xliff:g>\nTo: <xliff:g id="to">%3$s</xliff:g>\nCC: <xliff:g id="cc">%4$s</xliff:g>\n\n</string>
- <!-- Header for replied-to messages -->
- <string name="message_compose_reply_header_fmt">\n\n<xliff:g id="sender">%s</xliff:g> wrote:\n\n</string>
- <!-- Heading that appears before forwarded text -->
- <string name="message_compose_quoted_text_label">Include quoted text</string>
- <!-- Label of checkbox to include original message in a forwarded/replied message
- [CHAR_LIMIT=32] -->
- <string name="message_compose_include_quoted_text_checkbox_label">Include text</string>
- <!-- Toast that appears if you try to send with no recipients. -->
- <string name="message_compose_error_no_recipients">Add at least one recipient.</string>
- <!-- An address field contains invalid email addresses. -->
- <string name="message_compose_error_invalid_email">Some email addresses are invalid.</string>
- <!-- Toast that appears when an attachment is too big to send. -->
- <string name="message_compose_attachment_size">File too large to attach.</string>
- <!-- Title for dialog containing list of quick responses that user may insert
- into message body. [CHAR_LIMIT=30] -->
- <string name="message_compose_insert_quick_response_list_title">Insert quick response</string>
- <!-- Display name for composed message, indicating the destination of the message.
- e.g. "John and 2 others" -->
- <string name="message_compose_display_name"><xliff:g id="name" example="John">%1$s</xliff:g> and <xliff:g id="number" example="27">%2$d</xliff:g> others</string>
- <!-- Label for To field in read message view -->
- <string name="message_view_to_label">To:</string>
- <!-- Label for CC field in read message view -->
- <string name="message_view_cc_label">Cc:</string>
- <string name="message_view_bcc_label">Bcc:</string>
- <!-- Label for the date field. [CHAR LIMIT=20]-->
- <string name="message_view_date_label">Date:</string>
- <!-- Label for the from field. [CHAR LIMIT=20]-->
- <string name="message_view_from_label">From:</string>
- <!-- Label for the subject field. [CHAR LIMIT=20]-->
- <string name="message_view_subject_label">Subject:</string>
- <!-- Button name to view an attachment [CHAR LIMIT=10]-->
- <string name="message_view_attachment_view_action">View</string>
- <!-- Button name to install an .apk attachment [CHAR LIMIT=10]-->
- <string name="message_view_attachment_install_action">Install</string>
- <!-- Button name to play a media (i.e. audio/video) attachment [CHAR LIMIT=10]-->
- <string name="message_view_attachment_play_action">Play</string>
- <!-- Button name, to load an attachment from the mail server [CHAR LIMIT=10]-->
- <string name="message_view_attachment_load_action">Load</string>
- <!-- Button name, to show info about an attachment from the mail server [CHAR LIMIT=10]-->
- <string name="message_view_attachment_info_action">Info</string>
- <!-- Button name, to save the attachment to SD card [CHAR LIMIT=10]-->
- <string name="message_view_attachment_save_action">Save</string>
- <!-- Disabled button text to indicate an attachment has been saved [CHAR LIMIT=10] -->
- <string name="message_view_attachment_saved">Saved</string>
- <!-- Button name, to cancel a queued attachment download [CHAR LIMIT=10]-->
- <string name="message_view_attachment_cancel_action">Stop</string>
- <!-- Toast after saving attachment [CHAR LIMIT=30] -->
- <string name="message_view_status_attachment_saved">Attachment saved
-as <xliff:g id="filename">%s</xliff:g>.</string>
- <!-- Toast after attachment could not be saved [CHAR LIMIT=30] -->
- <string name="message_view_status_attachment_not_saved">Couldn\'t save attachment.</string>
- <!-- Toast upon using "send" when one or more attachments will need to be background loaded
- [CHAR LIMIT=none]-->
- <string name="message_view_attachment_background_load">One or more attachments in your
- forwarded message will be downloaded prior to sending.</string>
- <!--Button on the message view screen to show the message content [CHAR LIMIT=16] -->
- <string name="message_view_show_message_action">Message</string>
- <!--Button on the message view screen to show the calendar invite [CHAR LIMIT=16] -->
- <string name="message_view_show_invite_action">Invite</string>
- <!--Button on the message view screen to show the attachments [CHAR LIMIT=16] -->
- <plurals name="message_view_show_attachments_action">
- <item quantity="one">Attachment <xliff:g id="num_attachment" example="1" >%1$d</xliff:g>
- </item>
- <item quantity="other">Attachments <xliff:g id="num_attachment" example="3" >%1$d</xliff:g>
- </item>
- </plurals>
- <!-- Button on the message view screen to show the embedded pictures [CHAR LIMIT=16] -->
- <string name="message_view_show_pictures_action">Show pictures</string>
- <!-- Button on the message view screen to always show pictures from the given
- sender [CHAR LIMIT=32] -->
- <string name="message_view_always_show_pictures_button">Always show</string>
- <!-- Prompt on the message view screen whether or not to always show pictures from the
- given sender [CHAR LIMIT=80] -->
- <string name="message_view_always_show_pictures_prompt"
- >Always show pictures from this sender</string>
- <!-- Confirmation toast to indicate that the user has chosen to always show
- pictures from the given sender [CHAR LIMIT=160] -->
- <string name="message_view_always_show_pictures_confirmation"
- >Pictures from this sender will be shown automatically.</string>
- <!-- Calendar invitation, label of the button to open in calendar [CHAR LIMIT=24] -->
- <string name="message_view_invite_view">View in Calendar</string>
- <!-- String shown with a calendar invitation. -->
- <string name="message_view_invite_title">Calendar invite</string>
- <!-- String shown with a calendar invitation. -->
- <string name="message_view_invite_text">Going?</string>
- <!-- Button text: Calendar invitation: Accept. The leading space is used for spacing -->
- <string name="message_view_invite_accept">" Yes"</string>
- <!-- Button text: Calendar invitation: Maybe. The leading space is used for spacing -->
- <string name="message_view_invite_maybe">" Maybe"</string>
- <!-- Button text: Calendar invitation: Decline. The leading space is used for spacing -->
- <string name="message_view_invite_decline">" No"</string>
- <!-- Toast shown following a meeting invite reply, accepted -->
- <string name="message_view_invite_toast_yes">You\'ve accepted this invitation.</string>
- <!-- Toast shown following a meeting invite reply, maybe -->
- <string name="message_view_invite_toast_maybe">
- You\'ve replied \"maybe\" to this invitation.</string>
- <!-- Toast shown following a meeting invite reply, declined -->
- <string name="message_view_invite_toast_no">You\'ve declined this invitation.</string>
- <!--Confirmation dialog title shown when user tries to delete messages. [CHAR LIMIT=16] -->
- <!-- Link label to show to/cc/bcc of the curent message [CHAR LIMIT=32] -->
- <string name="message_view_show_details">Show details</string>
- <!-- Title of the dialog box to show to/cc/bcc of the message. [CHAR LIMIT=32] -->
- <string name="message_view_message_details_dialog_title">Message details</string>
-
- <!-- Title for most attachment info dialogs [CHAR LIMIT=32] -->
- <string name="attachment_info_dialog_default_title">Attachment info</string>
- <!-- Title when Wi-Fi settings prevent attachments from downloading [CHAR LIMIT=32] -->
- <string name="attachment_info_dialog_wifi_title">Wi-Fi connection required</string>
- <!-- Text of button to launch the Wi-Fi settings activity [CHAR LIMIT=24] -->
- <string name="attachment_info_wifi_settings">Wi-Fi settings</string>
- <!-- Text of button to launch the application settings activity [CHAR LIMIT=24] -->
- <string name="attachment_info_application_settings">App settings</string>
- <!-- Message body when we don't know exactly why an attachment can't be shown -->
- <string name="attachment_info_unknown">Can\'t open attachment.</string>
- <!-- Message body when the attachment is suspected of being malware -->
- <string name="attachment_info_malware">
- You can\'t save or open this file because this type of attachment
- might contain malicious software.</string>
- <!-- Message body when the attachment can't be loaded due to security policy restrictions -->
- <string name="attachment_info_policy">
- This attachment can\'t be saved or opened because of
- this account\'s security policies.</string>
- <!-- Message body when the attachment can only be downloaded over Wi-Fi -->
- <string name="attachment_info_wifi_only">
- This attachment is too large to download over a mobile network.
- You can download it the next time you connect to a Wi-Fi network.</string>
- <!-- Message body when no activities can open the attachment -->
- <string name="attachment_info_no_intent">
- There is no installed app that can open this attachment.
- Try downloading an appropriate app from Android Market.</string>
- <!-- Message body when the attachment is an application, but, side loading is disabled -->
- <string name="attachment_info_sideload_disabled">
- This attachment is an app. You must check Unknown Sources
- in Settings &gt; Apps before you can install it.</string>
- <!-- Message body when the attachment is an application, and side loading is enabled -->
- <string name="attachment_info_apk_install_disabled">
- Apps can\'t be installed directly from email. First save
- this app and then install it using the Downloads app.</string>
- <!-- Error banner when an attachment could not be downloaded due to a problem at the server
- [CHAR LIMIT=100] -->
- <string name="attachment_not_found">Couldn\'t download the attachment.</string>
-
- <!-- String used in place of a message that could not be properly decoded (e.g. bad base64
- data was received.) [CHAR LIMIT=none] -->
- <string name="message_decode_error">There was an error while decoding the message.</string>
-
- <!-- Title of the EML viewer activity. [CHAR LIMIT=32] -->
- <string name="eml_view_title">Viewing
- <xliff:g id="filename" example="test.eml">%s</xliff:g></string>
-
- <string name="message_delete_dialog_title"></string>
- <!--Confirmation dialog text shown when user tries to delete messages. [CHAR LIMIT=32] -->
- <plurals name="message_delete_confirm">
- <item quantity="one">Delete this message?</item>
- <item quantity="other">Delete these messages?</item>
- </plurals>
- <!-- Toast shown briefly while deleting a message -->
- <plurals name="message_deleted_toast">
- <item quantity="one">Message deleted.</item>
- <item quantity="other">Messages deleted.</item>
- </plurals>
- <!-- Toast shown briefly while deleting an unsent (draft) message -->
- <string name="message_discarded_toast">Message discarded.</string>
- <!-- Toast shown briefly while saving a draft -->
- <string name="message_saved_toast">Message saved as draft.</string>
- <!-- String that is displayed when the attachment could not be displayed. -->
- <string name="message_view_display_attachment_toast">Can\'t display
- attachment.</string>
- <!-- String that is displayed when the attachment could not be loaded.[CHAR LIMIT=none] -->
- <string name="message_view_load_attachment_failed_toast">Couldn\'t load attachment \"
- <xliff:g id="filename">%s</xliff:g>\".</string>
- <!-- String that is displayed when a long message is being parsed. [CHAR LIMIT=none] -->
- <string name="message_view_parse_message_toast">Opening message\u2026</string>
- <!-- Toast shown after moving a message to a different mailbox. [CHAR LIMIT=none]-->
- <plurals name="message_moved_toast">
- <item quantity="one" ><xliff:g id="num_message" example="1" >%1$d</xliff:g>
- message moved to <xliff:g id="mailbox_name" example="Inbox" >%2$s</xliff:g></item>
- <item quantity="other" ><xliff:g id="num_message" example="5" >%1$d</xliff:g>
- messages moved to <xliff:g id="mailbox_name" example="Inbox" >%2$s</xliff:g></item>
- </plurals>
-
- <!-- Notification ticker when a forwarded attachment couldn't be sent [CHAR LIMIT=none] -->
- <string name="forward_download_failed_ticker">Couldn\'t forward one or more attachments.</string>
- <!-- Notification title when a forwarded attachment couldn't be sent [CHAR LIMIT=30]-->
- <string name="forward_download_failed_title">Attachment not forwarded</string>
-
- <!-- Notification ticker when email account authentication fails [CHAR LIMIT=none] -->
- <string name="login_failed_ticker">
- <xliff:g id="account_name">%s</xliff:g> signin unsuccessful.</string>
- <!-- Notification title when email account authentication fails [CHAR LIMIT=30]-->
- <string name="login_failed_title">Couldn\'t sign in</string>
-
- <!-- Size unit for bytes for attachments [CHAR LIMIT=10] -->
- <plurals name="message_view_attachment_bytes">
- <item quantity="one" ><xliff:g id="size_in_bytes" example="1" >%d</xliff:g>B</item>
- <item quantity="other"><xliff:g id="size_in_bytes" example="279">%d</xliff:g>B</item>
- </plurals>
- <!-- Size unit for kilo bytes for attachments [CHAR LIMIT=10] -->
- <plurals name="message_view_attachment_kilobytes">
- <item quantity="one" ><xliff:g id="size_in_kilobytes" example="1" >%d</xliff:g>KB</item>
- <item quantity="other"><xliff:g id="size_in_kilobytes" example="279">%d</xliff:g>KB</item>
- </plurals>
- <!-- Size unit for mega bytes for attachments [CHAR LIMIT=10] -->
- <plurals name="message_view_attachment_megabytes">
- <item quantity="one" ><xliff:g id="size_in_megabytes" example="1" >%d</xliff:g>MB</item>
- <item quantity="other"><xliff:g id="size_in_megabytes" example="279">%d</xliff:g>MB</item>
- </plurals>
- <!-- Size unit for giga bytes for attachments [CHAR LIMIT=10] -->
- <plurals name="message_view_attachment_gigabytes">
- <item quantity="one" ><xliff:g id="size_in_gigabytes" example="1" >%d</xliff:g>GB</item>
- <item quantity="other"><xliff:g id="size_in_gigabytes" example="279">%d</xliff:g>GB</item>
- </plurals>
-
- <!-- The label of the next button on the message view screen. -->
- <string name="message_view_move_to_newer">Newer</string>
- <!-- The label of the previous button on the message view screen. -->
- <string name="message_view_move_to_older">Older</string>
-
- <!-- A simple divider between subject and message snippet in the message list view
- [CHAR LIMIT=4]-->
- <string name="message_list_subject_snippet_divider">\u0020\u2014\u0020</string>
-
- <!-- Title of screen when setting up new email account [CHAR LIMIT=45] -->
- <string name="account_setup_basics_title">Account setup</string>
- <!-- Headline of screen when setting up new email account (large text over divider)
- [CHAR LIMIT=none] -->
- <string name="account_setup_basics_headline">Email account</string>
- <!-- On "Set up email" screen, enthusiastic welcome message. -->
- <string name="accounts_welcome">You can set up your account in just a few steps.
- </string>
- <!-- On "Set up email" screen, hint for account email address text field -->
- <string name="account_setup_basics_email_label">Email address</string>
- <!-- On "Set up email" screen, hint for account email password text field -->
- <string name="account_setup_basics_password_label">Password</string>
- <!-- On "Set up email" screen, checkbox label for making the new account the default account -->
- <string name="account_setup_basics_default_label">
- Send email from this account by default</string>
- <!-- Button name on "Set up email" screen -->
- <string name="account_setup_basics_manual_setup_action">Manual setup</string>
- <!-- Toast when we can't build a URI from the given email & password -->
- <!-- Note, the error message in the toast is purposefully vague, because I *don't* know
- exactly what's wrong. -->
- <string name="account_setup_username_password_toast">
- Type a valid email address and password.</string>
- <!-- Title of dialog shown when a duplicate account is created -->
- <string name="account_duplicate_dlg_title">Duplicate account</string>
- <!-- Message of dialog shown when a duplicate account is created. The display name of
- the duplicate account is displayed. -->
- <string name="account_duplicate_dlg_message_fmt">
- You\'re already using this username for the account \"<xliff:g id="duplicate">%s</xliff:g>\".
- </string>
- <!-- String that is displayed as error text for passwords with leading or trailing
- spaces. [CHAR LIMIT=none] -->
- <string name="account_password_spaces_error">This password starts or ends with one or more
- space characters. Many servers don\'t support passwords with spaces.</string>
-
- <!-- On check-settings screen, this is the initially-displayed message. -->
- <string name="account_setup_check_settings_retr_info_msg">
- Retrieving account information\u2026</string>
- <!-- Appears on screen while system is checking incoming server settings -->
- <string name="account_setup_check_settings_check_incoming_msg">
- Checking incoming server settings\u2026</string>
- <!-- Appears on screen while system is checking outgoing server settings -->
- <string name="account_setup_check_settings_check_outgoing_msg">
- Checking outgoing server settings\u2026</string>
-
- <!-- Title of "Set up email" screen after success [CHAR LIMIT=45] -->
- <string name="account_setup_names_title">Account setup</string>
- <!-- Text that appears on "Set up email" screen after successfully setting up an account
- [CHAR LIMIT=none] -->
- <string name="account_setup_names_headline">
- Your account is set up and email is on its way!</string>
- <!-- On "Set up email" screen, label of text field -->
- <string name="account_setup_names_account_name_label">
- Give this account a name (optional)</string>
- <!-- On "Set up email" screen, label of text field -->
- <string name="account_setup_names_user_name_label">
- Your name (displayed on outgoing messages)</string>
- <!-- On "Set up email" screen, error pop-up when user_name field is empty [CHAR LIMIT=none] -->
- <string name="account_setup_names_user_name_empty_error">This field can\'t be blank.</string>
-
- <!-- Activity Title for the account type selector (IMAP or POP3 or EAS) [CHAR LIMIT=45] -->
- <string name="account_setup_account_type_title">Account setup</string>
- <!-- Headline for the the account type selector (IMAP or POP3 or EAS) [CHAR LIMIT=none] -->
- <string name="account_setup_account_type_headline">Account type</string>
- <!-- "Add new email account" screen, text that appears on screen -->
- <string name="account_setup_account_type_instructions">What type of account is this?</string>
-
- <!-- Do Not Translate. "Add new email account" screen, button name in response to what
- type of account this is -->
- <string name="account_setup_account_type_pop_action" translatable="false">POP3</string>
- <!-- Do Not Translate. "Add new email account" screen, button name in response to what
- type of account this is -->
- <string name="account_setup_account_type_imap_action" translatable="false">IMAP</string>
- <!-- Do Not Translate. "Add new email account" screen, button name in response to what
- type of account this is -->
- <string name="account_setup_account_type_exchange_action" translatable="false">Exchange</string>
- <!-- Do Not Translate. "Add new email account" screen, button name in
- response to what type of account this is -->
- <string name="account_setup_account_type_exchange_action_alternate"
- translatable="false">Microsoft Exchange ActiveSync</string>
-
- <!-- "Incoming server settings" screen, title [CHAR LIMIT=45] -->
- <string name="account_setup_incoming_title">Account setup</string>
- <!-- "Incoming server settings" screen, headline (text over divider) [CHAR LIMIT=none] -->
- <string name="account_setup_incoming_headline">Incoming server settings</string>
- <!-- "Incoming server settings" screen, label for text field -->
- <string name="account_setup_incoming_username_label">Username</string>
- <!-- "Incoming server settings" screen, label for text field -->
- <string name="account_setup_incoming_password_label">Password</string>
- <!-- "Incoming server settings" screen, label for text field -->
- <string name="account_setup_incoming_server_label">Server</string>
- <!-- "Incoming server settings" screen, label for text field -->
- <string name="account_setup_incoming_port_label">Port</string>
- <!-- "Incoming server settings" screen, label for pop-up menu -->
- <string name="account_setup_incoming_security_label">Security type</string>
- <!-- "Incoming server settings" screen, option for "Security type" pop-up menu indicating
- the desire for an unencrypted session -->
- <string name="account_setup_incoming_security_none_label">None</string>
- <!-- "Incoming server settings" screen, option for "Security type" pop-up menu indicating
- the desire for an encrypted session on the selected port, accepting all SSL certificates -->
- <string name="account_setup_incoming_security_ssl_trust_certificates_label">
- SSL/TLS (Accept all certificates)</string>
- <!-- "Incoming server settings" screen, option for "Security type" pop-up menu indicating
- the desire for an encrypted session on the selected port, including SSL certificate
- checks -->
- <string name="account_setup_incoming_security_ssl_label">SSL/TLS</string>
- <!-- "Incoming server settings" screen, option for "Security type" pop-up menu indicating
- the desire for an encrypted session overlaid on a plain text session using the selected
- port, accepting all SSL certificates -->
- <string name="account_setup_incoming_security_tls_trust_certificates_label">
- STARTTLS (accept all certificates)</string>
- <!-- "Incoming server settings" screen, option for "Security type" pop-up menu indicating
- the desire for an encrypted session overlaid on a plain text session on the selected
- port, including SSL certificate checks -->
- <string name="account_setup_incoming_security_tls_label">STARTTLS</string>
- <!-- "Incoming server settings" screen, label for pop-up menu -->
- <string name="account_setup_incoming_delete_policy_label">Delete email from server</string>
- <!-- "Incoming server settings" screen, options in pop-up menu for Delete email from server: -->
- <!-- "Incoming server settings" screen, options in pop-up menu for Delete email from server: -->
- <string name="account_setup_incoming_delete_policy_never_label">Never</string>
- <!-- "Incoming server settings" screen, options in pop-up menu for Delete email from server: -->
- <string name="account_setup_incoming_delete_policy_delete_label">
- When I delete from Inbox</string>
- <!-- "Incoming server settings" screen, label for setting IMAP path prefix: -->
- <string name="account_setup_incoming_imap_path_prefix_label">IMAP path prefix</string>
- <!-- "Incoming server settings" screen, hint for setting IMAP path prefix: -->
- <string name="account_setup_incoming_imap_path_prefix_hint">Optional</string>
-
- <!-- "Outgoing server settings" screen, title [CHAR LIMIT=45] -->
- <string name="account_setup_outgoing_title">Account setup</string>
- <!-- "Outgoing server settings" screen, headline (text over divider) [CHAR LIMIT=none] -->
- <string name="account_setup_outgoing_headline">Outgoing server settings</string>
- <!-- On "Outgoing server settings" screen, label for text field -->
- <string name="account_setup_outgoing_smtp_server_label">SMTP server</string>
- <!-- On "Outgoing server settings" screen, label for text field -->
- <string name="account_setup_outgoing_port_label">Port</string>
- <!-- On "Outgoing server settings" screen, label for pop-up menu -->
- <string name="account_setup_outgoing_security_label">Security type</string>
- <!-- On "Outgoing server settings" screen, label for check box -->
- <string name="account_setup_outgoing_require_login_label">Require signin</string>
- <!-- On "Outgoing server settings" screen, label for text field -->
- <string name="account_setup_outgoing_username_label">Username</string>
- <!-- On "Outgoing server settings" screen, label for text field -->
- <string name="account_setup_outgoing_password_label">Password</string>
-
- <!-- Title of "Exchange server settings" screen [CHAR LIMIT=45] -->
- <string name="account_setup_exchange_title">Account setup</string>
- <!-- Headline of "Exchange server settings" screen (text over divider) [CHAR LIMIT=none] -->
- <string name="account_setup_exchange_headline">Server settings</string>
- <!-- On "Exchange" setup screen, the name of the server -->
- <string name="account_setup_exchange_server_label">Server</string>
- <!-- On "Exchange" setup screen, the domain\\username -->
- <string name="account_setup_exchange_username_label">Domain\\Username</string>
- <!-- On "Exchange" setup screen, the use-SSL checkbox label -->
- <string name="account_setup_exchange_ssl_label">Use secure connection (SSL)</string>
- <!-- On "Exchange" setup screen, the trust ssl certificates checkbox label -->
- <string name="account_setup_exchange_trust_certificates_label">Accept all SSL certificates</string>
- <!-- On "Exchange" setup screen, a heading title for the current client certificate [CHAR LIMIT=50] -->
- <string name="account_setup_exchange_certificate_title">Client certificate</string>
- <!-- On "Exchange" setup screen, a button label to include a client certificate [CHAR LIMIT=35] -->
- <string name="account_setup_exchange_select_certificate">Select</string>
- <!-- On "Exchange" setup screen, a button label to include a client certificate [CHAR LIMIT=35] -->
- <string name="account_setup_exchange_use_certificate">Use client certificate</string>
- <!-- On "Exchange" setup screen, a button label to remove the currently used client certificate [CHAR LIMIT=35] -->
- <string name="account_setup_exchange_remove_certificate">Remove</string>
- <!-- On "Exchange" setup screen, placeholder text to indicate no client
- certificate is used [CHAR LIMIT=50] -->
- <string name="account_setup_exchange_no_certificate">None</string>
- <!-- On "Exchange" setup screen, the exchange device-id label [CHAR LIMIT=30] -->
- <string name="account_setup_exchange_device_id_label">Mobile Device ID</string>
-
- <!-- In Account setup options screen, Activity title [CHAR LIMIT=45] -->
- <string name="account_setup_options_title">Account settings</string>
- <!-- In Account setup options screen, Activity headline [CHAR LIMIT=none] -->
- <string name="account_setup_options_headline">Account options</string>
- <!-- In Account setup options screen, label for email check frequency selector -->
- <string name="account_setup_options_mail_check_frequency_label">Inbox checking frequency</string>
- <!-- In Account setup options & Account Settings screens, label for email check frequency option -->
- <string name="account_setup_options_mail_check_frequency_never">Never</string>
- <!-- In Account setup options & Account Settings screens, label for email check frequency option -->
- <string name="account_setup_options_mail_check_frequency_push">Automatic (Push)</string>
- <!-- In Account setup options & Account Settings screens, email check frequency option -->
- <string name="account_setup_options_mail_check_frequency_5min">Every 5 minutes</string>
- <!-- In Account setup options & Account Settings screens, email check frequency option -->
- <string name="account_setup_options_mail_check_frequency_10min">Every 10 minutes</string>
- <!-- In Account setup options & Account Settings screens, email check frequency option -->
- <string name="account_setup_options_mail_check_frequency_15min">Every 15 minutes</string>
- <!-- In Account setup options & Account Settings screens, email check frequency option -->
- <string name="account_setup_options_mail_check_frequency_30min">Every 30 minutes</string>
- <!-- In Account setup options & Account Settings screens, email check frequency option -->
- <string name="account_setup_options_mail_check_frequency_1hour">Every hour</string>
- <!-- Check box label on "Set up email" screen to make this the default account -->
- <!-- Note, this should usually match the default account summary preference string -->
- <string name="account_setup_options_default_label">Send email from this account by default</string>
- <!-- In Account setup options & Account Settings screens, check box for new-mail notification -->
- <string name="account_setup_options_notify_label">Notify me when email arrives</string>
- <!-- In Account setup options screen, optional check box to also sync contacts -->
- <string name="account_setup_options_sync_contacts_label">Sync contacts from this account</string>
- <!-- In Account setup options screen, optional check box to also sync contacts -->
- <string name="account_setup_options_sync_calendar_label">Sync calendar from this account</string>
- <!-- In Account setup options screen, check box to sync email -->
- <string name="account_setup_options_sync_email_label">Sync email from this account</string>
- <!-- In Account setup options screen, check box to auto-download attachments [CHAR LIMIT=none] -->
- <string name="account_setup_options_background_attachments_label">
- Automatically download attachments when connected to Wi-Fi</string>
- <!-- Dialog title when "setup" could not finish -->
- <string name="account_setup_failed_dlg_title">Couldn\'t finish</string>
- <!-- In Account setup options screen, label for email lookback selector -->
- <string name="account_setup_options_mail_window_label">Days to sync</string>
- <!-- In account setup options & account settings screens (exchange), sync window length; this
- implies loading a 'reasonable' number of messages [CHAR LIMIT=25] -->
- <string name="account_setup_options_mail_window_auto">Automatic</string>
- <!-- A sync window length setting (i.e. load messages this far back) [CHAR LIMIT=25] -->
- <string name="account_setup_options_mail_window_1day">One day</string>
- <!-- A sync window length setting (i.e. load messages this far back) [CHAR LIMIT=25] -->
- <string name="account_setup_options_mail_window_3days">Three days</string>
- <!-- A sync window length setting (i.e. load messages this far back) [CHAR LIMIT=25] -->
- <string name="account_setup_options_mail_window_1week">One week</string>
- <!-- A sync window length setting (i.e. load messages this far back) [CHAR LIMIT=25] -->
- <string name="account_setup_options_mail_window_2weeks">Two weeks</string>
- <!-- A sync window length setting (i.e. load messages this far back) [CHAR LIMIT=25] -->
- <string name="account_setup_options_mail_window_1month">One month</string>
- <!-- A sync window length setting (i.e. load messages this far back) [CHAR LIMIT=25] -->
- <string name="account_setup_options_mail_window_all">All</string>
- <!-- Per-mailbox sync window setting. This means "use the account's sync window setting" [CHAR LIMIT=25] -->
- <string name="account_setup_options_mail_window_default">Use account\'s default</string>
-
- <!-- "Setup could not finish" dialog text; e.g., Username or password incorrect -->
- <string name="account_setup_failed_dlg_auth_message">Username or password is incorrect.</string>
- <!-- "Setup could not finish" dialog text; e.g., Username or password incorrect\n(ERR01 Account does not exist) -->
- <string name="account_setup_failed_dlg_auth_message_fmt">Username or password is incorrect.\n(<xliff:g id="error">%s</xliff:g>)</string>
-
- <!-- An error message presented to the user when the server's identity
- cannot be established or trusted [CHAR LIMIT=NONE] -->
- <string name="account_setup_failed_dlg_certificate_message"
- >Can\'t safely connect to server.</string>
- <!-- An error message presented to the user when the server's identity
- cannot be established or trusted [CHAR LIMIT=NONE] -->
- <string name="account_setup_failed_dlg_certificate_message_fmt"
- >Can\'t safely connect to server.\n(<xliff:g id="error">%s</xliff:g>)</string>
- <!-- An error message presented to the user when the server requires a
- client certificate to connect [CHAR LIMIT=NONE] -->
- <string name="account_setup_failed_certificate_required"
- >A client certificate is required. Do you want to connect to the server with a client certificate?</string>
- <!-- An error message presented to the user when the certificate they
- specified for connecting to a server is inaccessible [CHAR LIMIT=NONE] -->
- <string name="account_setup_failed_certificate_inaccessible"
- >The certificate is invalid or inaccessible.</string>
-
- <!-- Dialog text for ambiguous setup failure; server error/bad credentials [CHAR LIMIT=none] -->
- <string name="account_setup_failed_check_credentials_message">
- The server responded with an error. Check your username and password, then try again.</string>
-
- <!-- "Setup could not finish" dialog text; e.g., Cannot connect to server -->
- <string name="account_setup_failed_dlg_server_message">Can\'t connect to server.</string>
- <!-- "Setup could not finish" dialog text; e.g., Cannot connect to server\n(Connection timed out) -->
- <string name="account_setup_failed_dlg_server_message_fmt">Can\'t connect to server.\n(<xliff:g id="error">%s</xliff:g>)</string>
-
- <!-- Additional diagnostic text when TLS was required but the server doesn't support it -->
- <string name="account_setup_failed_tls_required">TLS required but not supported by server.</string>
- <!-- Additional diagnostic text when server does not support any of our authentication methods -->
- <string name="account_setup_failed_auth_required">Authentication methods aren\'t supported by server.</string>
- <!-- Additional diagnostic text when server connection failed due to security error -->
- <string name="account_setup_failed_security">Couldn\'t open connection to server due to security error.</string>
- <!-- Additional diagnostic text when server connection failed due to io error (connection) -->
- <string name="account_setup_failed_ioerror">Couldn\'t open connection to server.</string>
- <!-- Additional diagnostic text when server connection failed due to our inability to support a
- required EAS protocol version [CHAR LIMIT=none] -->
- <string name="account_setup_failed_protocol_unsupported">
- You typed an incorrect server address or the server requires a protocol version that
- Email doesn\'t support.</string>
- <!-- Additional diagnostic text when server access was denied; the user should contact the
- administrator of the server for more information [CHAR LIMIT=none] -->
- <string name="account_setup_failed_access_denied">
- You don\'t have permission to sync with this server. Contact your server\'s
- administrator for more information.</string>
-
- <!-- Dialog title when validation requires security provisioning (e.g. support
- for device lock PIN, or remote wipe.) and we ask the user permission before continuing -->
- <string name="account_setup_security_required_title">Remote security administration</string>
- <!-- Additional diagnostic text when validation requires security provisioning (e.g. support
- for device lock PIN, or remote wipe.) and we ask the user permission before continuing.
- [CHAR LIMIT=none] -->
- <string name="account_setup_security_policies_required_fmt">
- The server <xliff:g id="server">%s</xliff:g> requires that you allow it to remotely control
- some security features of your Android device. Do you want to finish setting up this
- account?</string>
- <!-- Additional diagnostic text when validation failed due to required provisioning not
- being supported [CHAR LIMIT=none] -->
- <string name="account_setup_failed_security_policies_unsupported">
- This server requires security features that your Android device doesn\'t support,
- including: <xliff:g id="error">%s</xliff:g></string>
- <!-- The user name can only be changed during initial account setup. [CHAR LIMIT=none] -->
- <string name="account_setup_username_uneditable_error">You can\'t change an account\'s username.
- To add an account with a different username, touch Add Account.</string>
- <!-- Warning given to users when they request disabling device administration (i.e. that their
- administered accounts will be deleted) [CHAR LIMIT=none] -->
- <string name="disable_admin_warning">WARNING: Deactivating the Email app\'s authority
- to administer your device will delete all email accounts that require it, along with their
- email, contacts, calendar events, and other data.</string>
-
- <!-- Dialog shown when the account requires some amount of device security provisioning,
- just before jumping into system settings such as Device Policy grant, PIN/password,
- or encryption setup. [CHAR_LIMIT=40] -->
- <string name="account_security_dialog_title">Security update</string>
- <!-- Additional diagnostic text when the account requires some amount of device security
- provisioning, just before jumping into system settings such as Device Policy grant,
- PIN/password, or encryption setup. [CHAR LIMIT=none] -->
- <string name="account_security_dialog_content_fmt">
- <xliff:g id="account">%s</xliff:g> requires that you update your security
- settings.</string>
-
- <!-- Notification ticker when device security required (note: unused in Holo XL) -->
- <string name="security_unsupported_ticker_fmt">
- Account \"<xliff:g id="account">%s</xliff:g>\" can\'t be synced due to security
- requirements.</string>
- <!-- Notification ticker when device security required (note: unused in Holo XL) -->
- <string name="security_needed_ticker_fmt">
- Account \"<xliff:g id="account">%s</xliff:g>\" requires security settings update.
- </string>
- <!-- Notification ticker when device security required (note: unused in Holo XL) -->
- <string name="security_changed_ticker_fmt">
- Account \"<xliff:g id="account">%s</xliff:g>\" changed its security settings; no user
- action is required.
- </string>
- <!-- Notification content title when device security required [CHAR_LIMIT=30] -->
- <string name="security_notification_content_update_title">Security update required</string>
- <!-- Notification content title when device security policies have changed [CHAR_LIMIT=36] -->
- <string name="security_notification_content_change_title">Security policies have
- changed</string>
- <!-- Notification content title when device security policies cannot be met [CHAR_LIMIT=30] -->
- <string name="security_notification_content_unsupported_title">Security policies can\'t be
- met</string>
- <!-- Title of the activity that dispatches changes to device security. Not normally seen. -->
- <string name="account_security_title">Device security</string>
- <!-- Additional diagnostic text when the email app asserts control of the phone.
- [CHAR LIMIT=none] -->
- <string name="account_security_policy_explanation_fmt">
- The server <xliff:g id="server">%s</xliff:g> requires that you allow it to remotely control
- some security features of your Android device.</string>
-
- <!-- "Setup could not finish" dialog action button -->
- <string name="account_setup_failed_dlg_edit_details_action">Edit details</string>
-
- <!-- Notification ticker when device password is getting ready to expire [CHAR_LIMIT=80] -->
- <string name="password_expire_warning_ticker_fmt">
- \"<xliff:g id="account">%s</xliff:g>\" requires that you change your lock screen
- PIN or password.</string>
- <!-- Notification content title when device password is getting ready to expire
- [CHAR_LIMIT=30] -->
- <string name="password_expire_warning_content_title">Lock screen password expiring</string>
-
- <!-- Notification ticker when device password has expired [CHAR_LIMIT=80] -->
- <string name="password_expired_ticker">Your lock screen PIN or password has expired.</string>
- <!-- Notification content title when device password has expired [CHAR_LIMIT=28] -->
- <string name="password_expired_content_title">Lock screen password expired</string>
-
- <!-- Dialog title if device pin/password is going to expire soon. [CHAR_LIMIT=40] -->
- <string name="password_expire_warning_dialog_title">Lock screen password expiring</string>
- <!-- Dialog content device pin/password is going to expire soon. [CHAR_LIMIT=none] -->
- <string name="password_expire_warning_dialog_content_fmt">
- You need to change your lock screen PIN or password soon, or the data for
- <xliff:g id="account">%s</xliff:g> will be erased. Do you want to change it now?</string>
-
- <!-- Dialog title if device pin/password has already expired. [CHAR_LIMIT=40] -->
- <string name="password_expired_dialog_title">Lock screen password expired</string>
- <!-- Dialog content device pin/password has already expired. [CHAR_LIMIT=none] -->
- <string name="password_expired_dialog_content_fmt">
- The data for <xliff:g id="account">%s</xliff:g> is being erased from your device.
- You can restore it by changing your lock screen PIN or password. Do you want to change it now?</string>
-
- <!-- On AccountSettingsXL, dialog text if you try to exit in/out/eas fragment (server settings)
- without checking/saving [CHAR LIMIT=none]-->
- <string name="account_settings_exit_server_settings">Discard unsaved changes?</string>
-
- <!-- On AccountSettingsXL, dialog title if you were brought here due to a login failure.
- [CHAR_LIMIT=40] -->
- <string name="account_settings_login_dialog_title">Couldn\'t sign in</string>
- <!-- On AccountSettingsXL, dialog content if you were brought here due to a login failure.
- [CHAR_LIMIT=none] -->
- <string name="account_settings_login_dialog_content_fmt">
- The username or password for <xliff:g id="account">%s</xliff:g> is incorrect.
- Do you want to update them now?</string>
-
- <!-- On Settings screen, setting option name -->
- <string name="account_settings_default_label">Default account</string>
- <!-- Check box "summary" label on "Account options" screen to make this the default account -->
- <!-- Note, this should usually match the default account account setup checkbox string -->
- <string name="account_settings_default_summary">Send email from this account by default</string>
- <!-- On Settings screen, setting option name -->
- <!-- Title of account preference for downloading attachments in background [CHAR LIMIT=32] -->
- <string name="account_settings_background_attachments_label">
- Download attachments</string>
- <!-- Summary of account preference for downloading attachments in background [CHAR LIMIT=64] -->
- <string name="account_settings_background_attachments_summary">
- Auto-download attachments to recent messages via Wi-Fi</string>
- <string name="account_settings_notify_label">Email notifications</string>
- <!-- On Settings screen, summary line when called via AccountManager for Exchange accounts
- [CHAR LIMIT=50] -->
- <string name="account_settings_summary">Sync frequency, notifications, etc.</string>
- <!-- On Settings screen, setting summary text -->
- <string name="account_settings_notify_summary">Send notification when email arrives</string>
- <!-- On Settings screen, setting option name and title of dialog box that opens -->
- <string name="account_settings_mail_check_frequency_label">Inbox check frequency</string>
- <!-- On Settings screen, setting option name -->
- <string name="account_settings_incoming_label">Incoming settings</string>
- <!-- On Settings screen, setting option summary [CHAR LIMIT=64] -->
- <string name="account_settings_incoming_summary">
- Username, password, and other incoming server settings</string>
- <!-- On Settings screen, setting option name -->
- <string name="account_settings_outgoing_label">Outgoing settings</string>
- <!-- On Settings screen, setting option summary [CHAR LIMIT=64] -->
- <string name="account_settings_outgoing_summary">
- Username, password, and other outgoing server settings</string>
- <!-- On Settings screen, setting option name -->
- <string name="account_settings_enforced_label">Policies enforced</string>
- <!-- On Settings screen, setting option summary [CHAR LIMIT=64] -->
- <string name="account_settings_enforced_summary">None</string>
- <!-- On Settings screen, setting option name -->
- <string name="account_settings_unsupported_label">Unsupported policies</string>
- <!-- On Settings screen, setting option summary [CHAR LIMIT=64] -->
- <string name="account_settings_unsupported_summary">None</string>
- <!-- On Settings screen, label for button that attempts to sync the account -->
- <string name="account_settings_retry_label">Attempt sync</string>
- <!-- On Settings screen, summmary for button that attempts to sync an account [CHAR LIMIT=64] -->
- <string name="account_settings_retry_summary">Touch here to sync this account</string>
- <!-- On Settings screen, setting option name -->
- <string name="account_settings_description_label">Account name</string>
- <!-- On Settings screen, setting option name -->
- <string name="account_settings_name_label">Your name</string>
- <!-- On Settings screen, setting option name -->
- <string name="account_settings_signature_label">Signature</string>
- <!-- On Settings screen, setting option name. Allows user to modify saved quick responses
- for insertion in message body. [CHAR_LIMIT=24]-->
- <string name="account_settings_edit_quick_responses_label">Quick responses</string>
- <!-- On Settings screen, setting option summary [CHAR LIMIT=64] -->
- <string name="account_settings_edit_quick_responses_summary">
- Edit text that you frequently insert when composing email</string>
- <!-- On Settings screen, setting option name -->
- <string name="account_settings_signature_hint">Append text to messages you send</string>
- <!-- On Settings screen, section heading -->
- <string name="account_settings_notifications">Notification settings</string>
- <!-- On Settings screen, section heading for data usage [CHAR LIMIT=70] -->
- <string name="account_settings_data_usage">Data usage</string>
- <!-- On Settings screen, section heading -->
- <string name="account_settings_policies">Security policies</string>
-
- <!-- On settings screen, dialog heading informing user to edit a quick response -->
- <string name="edit_quick_response_dialog">Edit quick response</string>
- <!-- On settings screen, edit quick response dialog's "save" button -->
- <string name="save_action">Save</string>
-
- <!-- On settings screen, sync contacts check box label [CHAR LIMIT=20]-->
- <string name="account_settings_sync_contacts_enable">Sync contacts</string>
- <!-- On settings screen, sync contacts summary text [CHAR LIMIT=35] -->
- <string name="account_settings_sync_contacts_summary">Sync contacts for this account</string>
- <!-- On settings screen, sync calendar check box label [CHAR LIMIT=20]-->
- <string name="account_settings_sync_calendar_enable">Sync calendar</string>
- <!-- On settings screen, sync calendar summary text [CHAR LIMIT=50] -->
- <string name="account_settings_sync_calendar_summary">Sync calendar event for this account</string>
- <!-- On settings screen, sync email check box label [CHAR LIMIT=20]-->
- <string name="account_settings_sync_email_enable">Sync email</string>
- <!-- On settings screen, sync email summary text [CHAR LIMIT=35] -->
- <string name="account_settings_sync_email_summary">Sync email for this account</string>
-
- <!-- On Settings screen, vibrate pop-up menu label -->
- <string name="account_settings_vibrate_when_label">Vibrate</string>
- <!-- On Settings screen, vibrate pop-up menu summary text -->
- <string name="account_settings_vibrate_when_summary">Also vibrate when email arrives</string>
- <!-- On Settings screen, vibrate pop-up menu option "always" text -->
- <string name="account_settings_vibrate_when_always">Always</string>
- <!-- On Settings screen, vibrate pop-up menu option "silent" text -->
- <string name="account_settings_vibrate_when_silent">Only when silent</string>
- <!-- On Settings screen, vibrate pop-up menu option "never" text -->
- <string name="account_settings_vibrate_when_never">Never</string>
-
- <!-- Dialog title for the Vibrate dialog -->
- <string name="account_settings_vibrate_when_dlg_title">Vibrate</string>
-
- <!-- On Settings screen, setting option name -->
- <string name="account_settings_ringtone">Choose ringtone</string>
- <!-- On Settings screen, section heading -->
- <string name="account_settings_servers">Server settings</string>
- <!-- Title of Remove account confirmation dialog box -->
- <string name="account_delete_dlg_title">Remove account</string>
- <!-- Message of Remove account confirmation dialog box -->
- <string name="account_delete_dlg_instructions_fmt">
- The account \"<xliff:g id="account">%s</xliff:g>\" will be removed from Email.</string>
-
- <!-- On Settings screen, section heading for delete account [CHAR LIMIT=none] -->
- <string name="account_settings_category_delete_account">Remove account</string>
- <!-- On Settings screen, settings option for delete account [CHAR LIMIT=none] -->
- <string name="account_settings_delete_account_label">Remove account</string>
-
- <!-- Mailbox settings activity title [CHAR LIMIT=none] -->
- <string name="mailbox_settings_activity_title">Sync options</string>
- <!-- Mailbox settings activity title, with the target folder name [CHAR LIMIT=none] -->
- <string name="mailbox_settings_activity_title_with_mailbox">Sync options (<xliff:g id="mailboxx_name" example="Family">%s</xliff:g>)</string>
- <!-- Mailbox "sync settings" preference header [CHAR LIMIT=none] -->
- <string name="mailbox_preferences_header">Sync settings</string>
- <!-- On mailbox settings screen: Mailbox check frequency setting label [CHAR LIMIT=none] -->
- <string name="mailbox_settings_mailbox_check_frequency_label">Check frequency</string>
- <!-- On mailbox settings screen: Mailbox sync window (the number of days to synchronize email for) setting label [CHAR LIMIT=none] -->
- <string name="mailbox_settings_mailbox_sync_window_label">Days to sync</string>
-
- <!-- Strings used for account shortcut picker -->
- <!-- String displayed in launcher [CHAR_LIMIT=10] -->
- <string name="account_shortcut_picker_name">Email account</string>
- <!-- Title of the account list for the shortcut picker [CHAR_LIMIT=20] -->
- <string name="account_shortcut_picker_title">Choose an account</string>
- <!-- Title of mailbox list for the shortcut picker [CHAR_LIMIT=20] -->
- <string name="mailbox_shortcut_picker_title">Select a folder</string>
-
- <!-- Toast shown when the selected account no longer exists. This is used when, for example,
- a shotcut or a widget is stale and points at a deleted account.
- [CHAR_LIMIT=none]-->
- <string name="toast_account_not_found">Account wasn\'t found. It may have been removed.</string>
-
- <!-- Toast shown when the selected folder no longer exists. This is used when, for example,
- a shotcut or a widget is stale and points at a deleted folder.
- [CHAR_LIMIT=none]-->
- <string name="toast_mailbox_not_found">Folder wasn\'t found. It may have been removed.</string>
-
- <!-- Message that appears when adding a Windows Live Hotmail Plus account -->
- <string name="provider_note_live">Only some \"Plus\" accounts include POP access
- allowing this program to connect. If you\'re not able to sign in with
- your correct email address and password, you may not have a paid
- \"Plus\" account. Launch the web browser to gain access to
- these email accounts.</string>
- <!-- Message that appears when adding a T-Online account -->
- <string name="provider_note_t_online">Before setting up this email account, visit the T-Online website and create a password for POP3 email access.</string>
-
- <!-- Name of Microsoft Exchange account type; used by AccountManager -->
- <string name="exchange_name">Corporate</string>
- <!-- Name of Microsoft Exchange account type; used by AccountManager -->
- <string name="exchange_name_alternate">Microsoft Exchange ActiveSync</string>
-
- <!-- Message that appears if the AccountManager cannot create the system Account -->
- <string name="system_account_create_failed">Couldn\'t create the account. Try again.</string>
-
- <!-- Strings that support the DeviceAdmin / DevicePolicyManager API -->
- <!-- Name of the DeviceAdmin (seen in settings & in user confirmation screen) -->
- <string name="device_admin_label">Email</string>
- <!-- Long-form description of the DeviceAdmin (2nd line in settings & in user conf. screen) -->
- <string name="device_admin_description">Enables server-specified security policies</string>
-
- <!-- Strings used for GAL access -->
-
- <!-- Displayed in small separator in to/cc/bcc dropdowns, when searching GAL begins.
- Example: "Searching bigcompany.com..." -->
- <string name="gal_searching_fmt">Searching <xliff:g id="domain">%s</xliff:g>\u2026</string>
- <!-- Displayed in small separator in to/cc/bcc dropdowns, when searching GAL completes,
- and all of the server results are being displayed. Example:
- "5 results from bigcompany.com..." -->
- <plurals name="gal_completed_fmt">
- <!-- Case of one result from server. -->
- <item quantity="one"><xliff:g id="results" example="1">%1$d</xliff:g> result
- from <xliff:g id="domain">%2$s</xliff:g></item>
-
- <!-- Case of multiple results from server -->
- <item quantity="other"><xliff:g id="results" example="20">%1$d</xliff:g> results
- from <xliff:g id="domain">%2$s</xliff:g></item>
- </plurals>
-
- <!-- Settings activity title [CHAR LIMIT=40]-->
- <string name="settings_activity_title">Settings</string>
-
- <!-- General Preferences Screen -->
- <!-- Label in preferences header to describe general preferences [CHAR LIMIT=32] -->
- <string name="header_label_general_preferences">General settings</string>
- <!-- First category in general preferences [CHAR LIMIT=64] -->
- <string name="category_general_preferences">Application</string>
-
- <!-- General preference: Label of the setting for the direction to move to
- when deleting the current message.
- Options contain "newer message","older message", etc. [CHAR LIMIT=32] -->
- <string name="general_preference_auto_advance_label">Auto-advance</string>
- <!-- General preference: Description of the setting for the direction to move to
- when deleting the current message.
- Options contain "newer message","older message", etc. [CHAR LIMIT=64] -->
- <string name="general_preference_auto_advance_summary">Choose which screen to show after you
- delete a message</string>
- <!-- General preference: Label of the setting for hiding checkboxes in the
- message list [CHAR LIMIT=32] -->
- <string name="general_preference_hide_checkboxes_label">Hide checkboxes</string>
- <!-- General preference: Description of the setting for hiding checkboxes in the
- message list [CHAR LIMIT=64] -->
- <string name="general_preference_hide_checkboxes_summary">In lists of messages, touch and
- hold to select</string>
- <!-- General preference: Label of the setting for requiring confirmation before
- message deletion [CHAR LIMIT=32] -->
- <string name="general_preference_confirm_delete_label">Confirm before deleting</string>
- <!-- General preference: Description of the setting for requiring confirmation before
- message deletion [CHAR LIMIT=64] -->
- <string name="general_preference_confirm_delete_summary">Messages</string>
- <!-- General preference: Label of the setting for requiring confirmation before
- message sending [CHAR LIMIT=32] -->
- <string name="general_preference_confirm_send_label">Confirm before sending</string>
- <!-- General preference: Description of the setting for requiring confirmation before
- message sending [CHAR LIMIT=32] -->
- <string name="general_preference_confirm_send_summary">Messages</string>
- <!-- General preference: Title of the dialog box containing options for setting for
- the direction to move to when deleting the current message.
- Options contain "newer message","older message", etc. [CHAR LIMIT=32] -->
- <string name="general_preference_auto_advance_dialog_title">Advance to</string>
- <!-- General preference: Option for the setting for
- the direction to move to when deleting the current message.
- This option is for "move to the newer message" [CHAR LIMIT=32] -->
- <string name="general_preference_auto_advance_newer">Newer message</string>
- <!-- General preference: Option for the setting for
- the direction to move to when deleting the current message.
- This option is for "move to the older message" [CHAR LIMIT=32] -->
- <string name="general_preference_auto_advance_older">Older message</string>
- <!-- General preference: Option for the setting for
- the direction to move to when deleting the current message.
- This option is for "move back to the message list" [CHAR LIMIT=32] -->
- <string name="general_preference_auto_advance_message_list">Message list</string>
-
- <!-- General preference: Label of the setting for the text zoom. [CHAR LIMIT=32] -->
- <string name="general_preference_text_zoom_label">Message text size</string>
- <!-- General preference: Description of each setting for text zoom. The entries here must
- correspond to the strings general_preference_text_zoom_tiny,
- general_preference_text_zoom_small, general_preference_text_zoom_normal, etc.
- [CHAR LIMIT=64] -->
- <string-array name="general_preference_text_zoom_summary_array">
- <item>Tiny text</item>
- <item>Small text</item>
- <item>Normal-sized text</item>
- <item>Large text</item>
- <item>Huge text</item>
- </string-array>
-
- <!-- The message text size values -->
- <string-array translatable="false" name="general_preference_text_zoom_size">
- <item>0.8</item>
- <item>0.9</item>
- <item>1.0</item>
- <item>1.2</item>
- <item>1.5</item>
- </string-array>
-
- <!-- General preference: Title of the dialog box with options for text zoom. [CHAR LIMIT=32] -->
- <string name="general_preference_text_zoom_dialog_title">Message text size</string>
- <!-- General preference: Text zoom. Value is "tiny" (-2) [CHAR LIMIT=32] -->
- <string name="general_preference_text_zoom_tiny">Tiny</string>
- <!-- General preference: Text zoom. Value is "small" (-1) [CHAR LIMIT=32] -->
- <string name="general_preference_text_zoom_small">Small</string>
- <!-- General preference: Text zoom. Value is "normal" (0) [CHAR LIMIT=32] -->
- <string name="general_preference_text_zoom_normal">Normal</string>
- <!-- General preference: Text zoom. Value is "large" (+1) [CHAR LIMIT=32] -->
- <string name="general_preference_text_zoom_large">Large</string>
- <!-- General preference: Text zoom. Value is "huge" (+2) [CHAR LIMIT=32] -->
- <string name="general_preference_text_zoom_huge">Huge</string>
-
- <!-- Settings screen, Reply to all default setting title [CHAR LIMIT=30] -->
- <string msgid="6469564953937885304" name="general_preference_reply_all_label">Reply all</string>
- <!-- Settings screen, Reply to all default setting summary [CHAR LIMIT=70] -->
- <string msgid="3356918650886350497" name="general_preference_reply_all_summary">Make \"Reply all\" the default for message replies</string>
-
- <!-- Settings screen, title used to clear the setting for the list of
- senders to automatically show pictures for [CHAR LIMIT=80] -->
- <string name="general_preferences_clear_trusted_senders_title"
- >Ask to show pictures</string>
- <!-- Settings screen, summary for clearing the settings for the list of
- senders to automatically show pictures for [CHAR LIMIT=160] -->
- <string name="general_preferences_clear_trusted_senders_summary"
- >Pictures in messages won\'t be shown automatically</string>
- <!-- Message shown in toast when the user taps to clear the lsit of senders
- to automatically show pictures for [CHAR LIMIT=80] -->
- <string name="trusted_senders_cleared">\"Show pictures\" cleared.</string>
-
- <!-- Generic string for "current position" / "total number" [CHAR LIMIT=12] -->
- <string name="position_of_count"><xliff:g example="1">%1$d</xliff:g> of <xliff:g
- example="12">%2$s</xliff:g></string>
-
- <!-- Message shown during the first sync after an account is set up. [CHAR LIMIT=NONE] -->
- <string name="waitinf_for_sync_message_1">Waiting for sync</string>
- <!-- Message shown during the first sync after an account is set up. [CHAR LIMIT=NONE] -->
- <string name="waitinf_for_sync_message_2">Your email will appear soon.</string>
-
- <!-- Widget -->
- <!-- Instruction for how to move to different widget views [CHAR LIMIT=20] -->
- <string name="widget_other_views">Touch icon to change.</string>
- <!-- Header for the "Combined Inbox" view (showing mail in all inboxes) [CHAR LIMIT=20] -->
- <string name="widget_all_mail">Combined Inbox</string>
- <!-- Header for the "Unread" widget view (showing all unread mail) [CHAR LIMIT=20] -->
- <string name="widget_unread">Unread</string>
- <!-- Header for the "Starred" widget view (showing all starred mail) [CHAR LIMIT=20] -->
- <string name="widget_starred">Starred</string>
- <!-- Shown when waiting for mail data to be loaded into the widget list view [CHAR LIMIT=20] -->
- <string name="widget_loading">Loading\u2026</string>
- <!-- Shown when no accounts are configured and the widget supports changing
- on the fly [CHAR LIMIT=35] -->
- <string name="widget_touch_to_configure">Touch to set up.</string>
- <!-- Shown in a toast when no accounts are configured and the Email widget
- cannot be created in the first place [CHAR LIMIT=none] -->
- <string name="widget_no_accounts">You haven\'t set up an email account yet.</string>
-
- <!-- Generic string shown instead of regular numbers, when a number is larger than 999.
- This should not be altered if the original string ("999+") makes sense in the
- target language. Typical alternatives include "+999" and ">999". [CHAR_LIMIT=4] -->
- <string name="more_than_999">999+</string>
-
- <!-- The hint used in the search box when searching all mailboxes [CHAR LIMIT=35] -->
- <string name="search_hint">Search email</string>
-
- <!-- The hint used in the search box when searching a single mailbox [CHAR LIMIT=35] -->
- <string name="search_mailbox_hint">Search <xliff:g example="Inbox">%1$s</xliff:g></string>
-
- <!-- The title above the messages list when showing search results. [CHAR LIMIT=50] -->
- <string name="search_header_text_fmt"
- >Search results for \"<xliff:g example="search query">%1$s</xliff:g>\"</string>
-
- <!-- A warning title to show to the user when search results are taking a long
- time. [CHAR LIMIT=NONE] -->
- <string name="search_slow_warning_title">Waiting for results</string>
-
- <!-- A warning message to show to the user when search results are taking a long
- time. [CHAR LIMIT=NONE] -->
- <string name="search_slow_warning_message">Some servers may take a long time.</string>
-
- <!-- Title shown on the action bar on the mailbox list screen. [CHAR LIMIT=16] -->
- <string name="action_bar_mailbox_list_title">Folders</string>
-
- <!-- A long placeholder string to be used in template XML files message_list_item_*.xml.
- Used only in layout computation, and never actually exposed to the user. -->
- <string name="long_string" translatable="false">looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong</string>
-
- <!-- A policy disallowing the user of the device's camera [CHAR LIMIT=50] -->
- <string name="policy_dont_allow_camera">Disallow use of the device\'s camera</string>
- <!-- A policy requiring a device lock screen password [CHAR LIMIT=50] -->
- <string name="policy_require_password">Require device password</string>
- <!-- A policy disallowing the reuse of recent passwords [CHAR LIMIT=50] -->
- <string name="policy_password_history">Restrict the reuse of recent passwords</string>
- <!-- A policy that forces a password to expire after a set period of time [CHAR LIMIT=50] -->
- <string name="policy_password_expiration">Require passwords to expire</string>
- <!-- A policy requiring a maximum amount of time the device can sit idle before the lock screen
- is activated [CHAR LIMIT=50] -->
- <string name="policy_screen_timeout">Require an idle device to lock its screen</string>
- <!-- A policy limiting the number of old calendar events synced [CHAR LIMIT=50] -->
- <string name="policy_calendar_age">Limit the number of calendar events synced</string>
- <!-- A policy limiting the number of emails synced [CHAR LIMIT=50] -->
- <string name="policy_email_age">Limit the number of emails synced</string>
-
- <!-- The four strings below represent "quick responses" which the user can insert into a
- message being composed with just a couple of taps. These four responses MUST be defined,
- but need not include a string (i.e. they are optional). Further, the responses can be
- customized as necessary by the translator, in case one or more of these is inappropriate in
- a particular locale or if there are better options available. -->
- <!-- A "quick response", i.e. a quick reply to a received mail [CHAR LIMIT=NONE] -->
- <string name="quick_1">Thanks!</string>
- <!-- A "quick response", i.e. a quick reply to a received mail [CHAR LIMIT=NONE] -->
- <string name="quick_2">Sounds good to me!</string>
- <!-- A "quick response", i.e. a quick reply to a received mail [CHAR LIMIT=NONE] -->
- <string name="quick_3">I\'ll read this later and get back to you.</string>
- <!-- A "quick response", i.e. a quick reply to a received mail [CHAR LIMIT=NONE] -->
- <string name="quick_4">Let\'s set up a meeting to discuss this.</string>
-
- <!-- This is the message warning the user that they must sync manually when roaming. [CHAR LIMIT=none]-->
- <string name="require_manual_sync_message">Background sync for this account is disabled while\
- roaming.</string>
-
- <!-- This is shown when a user responds to a meeting invitation [CHAR LIMIT=none]-->
- <string name="confirm_response">Sending response...</string>
-
- <!-- Displayed in the middle of the screen when the inbox is empty [CHAR LIMIT 100]-->
- <string name="no_conversations">No messages.</string>
-</resources>
-
diff --git a/email2/res/values/styles.xml b/email2/res/values/styles.xml
deleted file mode 100644
index 956a86cff..000000000
--- a/email2/res/values/styles.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- non-xlarge. See also values-xlarge for specializations for xlarge screens -->
-<resources>
- <!-- The headline at the top of every account settings fragments (in preferences) -->
- <!-- TODO these are estimates for the phone UX - final sizes TBD -->
- <style name="accountSettingsHeadline">
- <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
- </style>
-
- <!-- The large headline at the top of every account setup screen -->
- <!-- TODO these are estimates for the phone UX - final sizes TBD -->
- <style name="accountSetupHeadline">
- <item name="android:textSize">22sp</item>
- <item name="android:textColor">@color/account_setup_headline_color</item>
- </style>
-
- <!-- Wizard buttons on the account setup screens -->
- <!-- TODO these are estimates for the phone UX - final sizes TBD -->
- <style name="accountSetupButton">
- <item name="android:layout_width">160sp</item>
- <item name="android:layout_height">40sp</item>
- <item name="android:textColor">?android:attr/textColorPrimary</item>
- <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
- </style>
-
- <!-- Cancel/Done buttons on the account settings (server settings) fragments -->
- <style name="accountSettingsButton">
- <item name="android:layout_width">160sp</item>
- <item name="android:layout_height">40sp</item>
- <item name="android:textColor">?android:attr/textColorPrimary</item>
- <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
- </style>
-</resources>
-
diff --git a/email2/res/values/uploader.xml b/email2/res/values/uploader.xml
deleted file mode 100644
index 232b5446b..000000000
--- a/email2/res/values/uploader.xml
+++ /dev/null
@@ -1,355 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!-- Copyright 2009 Google Inc. All Rights Reserved. -->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
- <!-- Application's title (for title bars, the application manager, etc.) [CHAR LIMIT=20] -->
- <string name="application_name">Instant Upload</string>
-
- <!-- Default Picasa upload destination: the CameraSync album [CHAR LIMIT=NONE]-->
- <string name="picasa_default_destination">Instant Upload Album</string>
-
- <!-- Summary screen: title when uploading -->
- <string name="summary_title_uploading">Uploading</string>
-
- <!-- Summary screen: title when displaying finished uploads -->
- <string name="summary_title_finished">Finished</string>
-
- <!-- Summary screen: title when displaying finished uploads -->
- <string name="summary_title_paused">Paused</string>
-
- <!-- Summary screen: subtitle showing the # of photos and videos to be uploaded -->
- <string name="summary_subtitle_uploading_format">%1$d%% • %2$d photos • %3$d videos</string>
-
- <!-- Summary screen: subtitle showing the # of photos and videos that have finished uploading -->
- <string name="summary_subtitle_counts_format">%1$d photos • %2$d videos</string>
-
- <!-- Summary screen: subtitle for when the app is paused due to low battery -->
- <string name="summary_subtitle_paused_low_battery">low battery</string>
-
- <!-- Summary screen: subtitle for when the app is paused due out of photos quota condition -->
- <string name="summary_subtitle_paused_photos_quota">exceeded photos quota</string>
-
- <!-- Summary screen: subtitle for when the app is paused due to Data Roaming -->
- <string name="summary_subtitle_paused_roaming">roaming</string>
-
- <!-- Summary screen: subtitle for when the app is paused due to needing WiFi for this item -->
- <string name="summary_subtitle_paused_need_wifi">waiting for WiFi</string>
-
- <!-- Summary screen: subtitle for when the app is paused due to needing the charger -->
- <string name="summary_subtitle_paused_need_charger">delayed until charging</string>
-
- <!-- Summary screen: subtitle for when the app is paused due to needing a data connection -->
- <string name="summary_subtitle_paused_need_network">waiting for connection</string>
-
- <!-- Summary screen: subtitle for when the app is paused due to needing a data connection -->
- <string name="summary_subtitle_paused_retry_format">retrying in %s</string>
-
- <!-- Summary screen menu: label button to switch to pending uploads view -->
- <string name="summary_menu_show_pending">Show Pending Uploads</string>
-
- <!-- Summary screen menu: label button to switch to finished uploads view -->
- <string name="summary_menu_show_finished">Show Finished Uploads</string>
-
- <!-- Menu label button to launch the browser to view Picasa Web Albums -->
- <string name="menu_view_online">View Online</string>
-
- <string name="menu_show_pending_items">Show Pending Uploads</string>
- <string name="menu_hide_pending_items">Hide Pending Uploads</string>
-
- <string name="menu_show_completed_items">Show Details</string>
- <string name="menu_hide_completed_items">Hide Details</string>
-
- <!-- Settings menu item title -->
- <string name="menu_settings">Settings</string>
-
- <!-- Finished uploads per-item upload date formatting -->
- <string name="format_date_uploaded">Uploaded %s</string>
-
- <!-- Format a percentage value for use in a progress bar -->
- <string name="format_progress_percent"><xliff:g id="number" example="50">%d</xliff:g><xliff:g id="percentsign" example="%">%%</xliff:g></string>
-
- <!-- Label for the account selection spinner. -->
- <string name="account">Account</string>
-
- <!-- Button to start an upload (on the upload settings page) -->
- <string name="upload">Upload</string>
- <!-- Button to confirm the settings on the initial launch -->
- <string name="ok">OK</string>
- <!-- Button to cancel the starting of an upload (on the upload settings page) -->
- <string name="cancel">Cancel</string>
-
- <!-- First half of the dialog message shown while an upload is starting - 'Uploading to [destination]' -->
- <string name="uploading_to">Uploading to <b>%s</b></string>
- <!-- Second half of the dialog message shown while an upload is starting.
- In some cases, this is omitted - ' for [username]' -->
- <string name="uploading_for"> for <b>%s</b></string>
- <!-- Format for the destination string of an upload - '[Picasa] "[Photo Title]"'. -->
- <string name="destination_format">%1$s \"%2$s\"</string>
-
- <!-- Toast shown when the application is started in an incorrect way (by another application). -->
- <string name="toast_intent_error">Upload initialization failed.</string>
- <!-- Toast shown when we fail to access a file to upload. -->
- <string name="toast_file_error">File not available.</string>
- <!-- Toast shown when we there's a problem retrieving the user account information. -->
- <string name="account_error">Failed to retrieve account information.</string>
- <!-- Dialog shown after we failed to log into the user's account -->
- <string name="toast_failed_auth">There was a problem signing into your account.</string>
-
- <!-- State of a file while its waiting for its turn to be uploaded: intentionally blank -->
- <string name="upload_state_queued"></string>
- <!-- State of an upload while it's waiting to retry after some kind of problem -->
- <string name="upload_state_waiting_retry">Waiting to retry</string>
- <!-- State of a large upload while it's waiting for a WiFi connection -->
- <string name="upload_state_waiting_wifi">Waiting for WiFi</string>
- <!-- State of a file while it's being uploaded -->
- <string name="upload_state_uploading">Uploading</string>
- <!-- State of a file after it failed to be uploaded -->
- <string name="upload_state_failed">Failed</string>
- <!-- State of a file after it was uploaded successfully -->
- <string name="upload_state_completed">Completed</string>
-
- <!-- Human-readable name of PAUSE_STATE_RUNNING -->
- <string name="pause_state_running">uploading</string>
- <!-- Human-readable name of PAUSE_STATE_MANUALLY_PAUSED -->
- <string name="pause_state_manually_paused">manually paused</string>
- <!-- Human-readable name of PAUSE_STATE_LOW_BATTERY -->
- <string name="pause_state_low_battery">paused - low battery</string>
- <!-- Human-readable name of PAUSE_STATE_NEED_CHARGER -->
- <string name="pause_state_need_charger">paused - delayed until charging</string>
- <!-- Human-readable name of PAUSE_STATE_NEED_CONNECTIVITY -->
- <string name="pause_state_need_connectivity">paused - waiting for connection</string>
- <!-- Human-readable name of pause_state_need_photos_quota -->
- <string name="pause_state_need_photos_quota">paused - out of PWA quota</string>
- <!-- Human-readable name of PAUSE_STATE_NEED_WIFI -->
- <string name="pause_state_need_wifi">paused - waiting for wifi</string>
- <!-- Human-readable name of PAUSE_STATE_ROAMING -->
- <string name="pause_state_roaming">paused - roaming</string>
- <!-- Human-readable name of PAUSE_STATE_RETRYING -->
- <string name="pause_state_retrying">waiting to retry</string>
-
- <!-- State detail for "Waiting to retry", when waiting to retry in 1 minute after a network failure -->
- <string name="retry_in_1min">1 minute</string>
- <!-- State detail for "Waiting to retry", when waiting to retry in 2 minutes after a network failure -->
- <string name="retry_in_2min">2 minutes</string>
- <!-- State detail for "Waiting to retry", when waiting to retry in 5 minutes after a network failure -->
- <string name="retry_in_5min">5 minutes</string>
- <!-- State detail for "Waiting to retry", when waiting for the data connection to come back -->
- <string name="retry_no_data">No data connection</string>
- <!-- Toast text for "Out of quota", when waiting for account server space to free up -->
- <string name="account_out_of_quota">Account is out of disk quota</string>
-
- <!-- State detail for "Failed", when we couldn't find the file to upload -->
- <string name="completed_no_file">File not found</string>
- <!-- State detail for "Failed", when the server responded in an unexpected way -->
- <string name="failed_bad_response">Service error</string>
- <!-- State detail for "Failed", when we bail out after several network failures -->
- <string name="failed_network_error">Network error</string>
- <!-- State detail for "Failed", when the server failed to authorize the user -->
- <string name="failed_server_auth">Authentication failed</string>
-
- <!-- Format for the list switcher button when the pending list is being displayed -->
- <string name="manager_list_switcher_pending_format">Pending uploads [%d]</string>
- <!-- Format for the list switcher button when the completed uploads list is being displayed -->
- <string name="manager_list_switcher_completed_format">Completed uploads [%d]</string>
-
- <!-- Label for the button to pause the upload service -->
- <string name="manager_pause">Pause uploads</string>
- <!-- Label for the button to resume the upload service -->
- <string name="manager_resume">Resume uploads</string>
- <!-- Label for the button to mark a photo for immediate upload -->
- <string name="manager_upload_now">Upload now</string>
- <!-- Label for the button to change when a photo is to be uploaded -->
- <string name="manager_upload_later">Upload later</string>
- <!-- Label for the button to mark a photo as do not upload -->
- <string name="manager_do_not_upload">Do not upload</string>
- <!-- Label for the button to view the photo or video -->
- <string name="manager_view_media">View</string>
- <!-- Label for the button to retry one failed upload -->
- <string name="manager_retry">Retry</string>
- <!-- Toast confirming the canceling of one pending upload -->
- <string name="manager_toast_canceled">Upload canceled</string>
- <!-- Toast shown when the user tries to cancel an already finished (completed or failed) upload -->
- <string name="manager_toast_not_canceled">Upload already finished</string>
- <!-- Label for the button to resync all photos with the server -->
- <string name="manager_sync_all">Sync all</string>
- <!-- Text shown when the uploads list is empty. 1=date; 2=time -->
- <string name="manager_activity_last_sync_format">Last Sync:\n%1$s\n%2$s</string>
-
- <!-- Text shown when the finished items list is empty -->
- <string name="finished_empty">Finished items list is empty.</string>
-
- <!-- Notification label used in all notifications [CHAR LIMIT=25] -->
- <string name="notify_uploads">Instant Upload</string>
- <!-- Notification when all uploads are finished (completed or failed, so this should be neutral) -->
- <string name="notify_resolved">Uploads finished</string>
- <!-- Notification when the upload service is paused -->
- <string name="notify_paused">Uploads paused</string>
- <!-- Notification when the upload application was not initialized -->
- <string name="notify_activation_reminder">Instant Upload hasn\'t been activated yet</string>
-
- <!-- Toast explaining that large files are only uploaded when there is an active WiFi connection (shown on first large upload) -->
- <!-- TODO: Probably remove this, rename ID if not. -->
- <string name="dialog_first_wifi">Large files will be uploaded over a WiFi connection only.</string>
-
- <!-- Sync All progress dialog message when scanning locally and querying the server -->
- <string name="dialog_sync_all_scanning">Scanning for files...</string>
-
- <!-- Sync All progress dialog message when enqueueing requests -->
- <string name="dialog_sync_all_preparing">Preparing <xliff:g id="photocount" example="5">%1$d</xliff:g> photos and <xliff:g id="videocount" example="4">%2$d</xliff:g> videos for upload...</string>
-
- <!-- Toast displayed when Sync All found nothing to do -->
- <string name="dialog_sync_all_found_none">No additional photos/videos need to be uploaded.</string>
-
- <!-- Sync All dialog message when a server error occurs -->
- <string name="dialog_sync_all_server_error">There was a problem communicating with the server. Please try again later.</string>
-
- <!-- Sync All toast when the process canceled -->
- <string name="dialog_sync_all_canceled">Sync all canceled</string>
-
- <!-- Sync All dialog title for any errors -->
- <string name="dialog_sync_all_error_title">Sync All</string>
-
- <!-- ManagerActivity view completed uploads menu title -->
- <string name="manager_view_completed">View Completed</string>
-
- <!-- ManagerActivity view pending uploads menu title -->
- <string name="manager_view_pending">View Pending</string>
-
- <!-- Preferences category title: general category -->
- <string name="preference_category_title_general">General</string>
-
- <!-- Preference title: Pause all uploads -->
- <string name="preference_title_pause_all_uploads">Pause all uploads</string>
-
- <!-- Preference title: select if battery recharging is required before uploading -->
- <string name="preference_title_need_power">Power</string>
-
- <!-- Preference summary: checkbox to determine if battery recharging is required before uploading -->
- <string name="preference_summary_need_power">Upload only when the phone is being charged.</string>
-
- <!-- Preference title: select if battery recharging is required before uploading -->
- <string name="preference_title_need_wifi">Wi-Fi</string>
-
- <!-- Preference summary: checkbox to determine if WiFi/WiMAX must be available -->
- <string name="preference_summary_need_wifi">Upload only when Wi-Fi is available.</string>
-
- <!-- Preferences category title: photos -->
- <string name="preference_category_title_photos">Photos</string>
-
- <!-- Preference title: Photos Account -->
- <string name="preference_title_photos_account">Account</string>
-
- <!-- Preference title: select the networks to upload photos -->
- <string name="preference_title_photos_upload_connectivity">Upload conditions</string>
-
- <!-- Preference title: Photo size -->
- <string name="preference_title_photo_size">Photo size</string>
-
- <!-- Preferences category title: videos -->
- <string name="preference_category_title_videos">Videos</string>
-
- <!-- Preference title: Photos Account -->
- <string name="preference_title_videos_account">Account</string>
-
- <!-- Preference title: Photos Account -->
- <string name="preference_title_videos_account_summary">The photos account will be used video uploads.</string>
-
- <!-- Preference title: select the networks to upload videos -->
- <string name="preference_title_videos_upload_connectivity">Upload conditions</string>
-
- <!-- Preference title: select the networks to upload videos -->
- <string name="preference_title_videos_upload_connectivity_summary">Photos connectivity settings are used for now.</string>
-
- <!-- Preference mobile data usage: for photos only -->
- <string name="preference_mobile_data_usage_for_photos_only">Only photos via mobile networks</string>
-
- <!-- Preference mobile data usage: for all media -->
- <string name="preference_mobile_data_usage_for_all_media">Photos &amp; videos via mobile networks</string>
-
- <!-- Preference mobile data usage: never -->
- <string name="preference_mobile_data_usage_never">Photos &amp; videos via Wi-Fi only</string>
-
- <!-- Preference category title: "About" -->
- <string name="preference_category_title_about">About</string>
-
- <!-- Preference title: CameraSync Version [CHAR LIMIT=20]-->
- <string name="preference_title_camera_sync_version">Instant Upload Version</string>
-
- <!-- Preference photos upload dimensions label: 1600px max -->
- <string name="photos_upload_dimension_1600">Recommended: 1600 pixels (for sharing, prints and screensavers)</string>
-
- <!-- Preference photos upload dimensions label: original size -->
- <string name="photos_upload_dimension_original">Original size (slowest upload)</string>
-
- <!-- Pause state text that shows the SD card is needed -->
- <string name="pause_state_need_media">paused - SD card unavailable</string>
-
- <!-- Subtitle text for the summary view, detailing why we are not uploading -->
- <string name="summary_subtitle_paused_need_media">SD card unavailable</string>
-
- <!-- Preference screen title: Instant Upload detailed settings button [CHAR LIMIT=20] -->
- <string name="preference_plus_title">Instant Upload settings</string>
-
- <!-- Preference title: Enable CameraSync checkbox description [CHAR LIMIT=19]-->
- <string name="preference_plus_enable_cs">Instant Upload</string>
-
- <!-- Preference title: description for Enable CameraSync-->
- <string name="preference_plus_enable_cs_summary">Automatically upload new photos &amp; videos to a private web album</string>
-
- <!-- Preference title: CameraSync Upload status-->
- <string name="preference_plus_upload_status">Upload status</string>
-
- <!-- Preference category: Advanced settings-->
- <string name="preference_plus_category_advanced">Advanced</string>
-
- <!-- Preference title: setting for Use mobile data connection-->
- <string name="preference_plus_mobile_data_connection">Mobile uploads</string>
-
- <!-- Preference title: Sync while roaming-->
- <string name="preference_plus_sync_while_roaming">Roaming uploads</string>
-
- <!-- Preference summary: Sync while roaming-->
- <string name="preference_plus_sync_while_roaming_summary">Upload photos &amp; videos when roaming on data network</string>
-
- <!-- Preference title: Delay Sync until charging phone-->
- <string name="preference_plus_delay_sync_until_charging">Battery uploads</string>
-
- <!-- Preference summary: Delay Sync until charging phone-->
- <string name="preference_plus_delay_sync_until_charging_summary">Upload photos &amp; videos only when charging</string>
-
- <!-- Preference title: Sync all photos and videos-->
- <string name="preference_plus_sync_all">Upload existing photos</string>
-
- <!-- Preference title: description for Sync all photos and videos-->
- <string name="preference_plus_sync_all_description">Upload any existing photos &amp; videos from your phone now</string>
-
- <!-- Summary screen: subtitle for when the app is disabled-->
- <string name="summary_subtitle_disabled">Disabled</string>
-
- <!-- Preference summary: Summary string header, example "paused: waiting for wifi"-->
- <string name="preference_summary_header_format">%1$s: %2$s</string>
-
- <!-- Preference summary: uploading format for Uploading and percent number "Uploading (50%)"-->
- <string name="preference_summary_uploading_percent">Uploading (%1$d%%)</string>
-
- <!-- Preference summary: format for uploading "3 of 5"-->
- <string name="preference_summary_uploading_format">: %1$d of %2$d</string>
-
- <!-- Preference summary: subtitle for when uploading is paused-->
- <string name="preference_summary_uploading_paused">Paused: touch to resume uploading</string>
-
- <!-- Preference summary: title for sync all confirm dialog -->
- <string name="preference_plus_sync_all_prompt_title">Upload existing photos</string>
-
- <!-- Preference summary: text for sync all confirm dialog -->
- <string name="preference_plus_sync_all_prompt_text">Uploading photos and videos that have not already been uploaded from your phone to a private album on the web can take a while, but will be done in the background. Are you sure you want to continue?</string>
-
- <!-- Preference summary: Yes button text for sync all confirm dialog -->
- <string name="preference_plus_sync_all_prompt_yes">Yes</string>
-
- <!-- Preference summary: No button text for sync all confirm dialog -->
- <string name="preference_plus_sync_all_prompt_no">No</string>
-
-</resources>
diff --git a/email2/res/xml/account_preferences.xml b/email2/res/xml/account_preferences.xml
deleted file mode 100644
index f5b45a657..000000000
--- a/email2/res/xml/account_preferences.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- NOTE: The string in android:action must match the one in AccountSettings.java -->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
- <PreferenceCategory />
-
- <PreferenceScreen
- android:key="account_settings"
- android:title="@string/account_settings_action"
- android:summary="@string/account_settings_summary">
- <intent
- android:action="com.android.email.activity.setup.ACCOUNT_MANAGER_ENTRY"
- />
- </PreferenceScreen>
-
-</PreferenceScreen>
diff --git a/email2/res/xml/account_settings_preferences.xml b/email2/res/xml/account_settings_preferences.xml
deleted file mode 100755
index 03cb7c61a..000000000
--- a/email2/res/xml/account_settings_preferences.xml
+++ /dev/null
@@ -1,158 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
- <EditTextPreference
- android:key="account_description"
- android:title="@string/account_settings_description_label"
- android:summary=""
- android:dialogTitle="@string/account_settings_description_label"
- android:inputType="textCapWords" />
-
- <EditTextPreference
- android:key="account_name"
- android:title="@string/account_settings_name_label"
- android:summary=""
- android:dialogTitle="@string/account_settings_name_label"
- android:inputType="textPersonName|textCapWords" />
-
- <EditTextPreference
- android:key="account_signature"
- android:title="@string/account_settings_signature_label"
- android:summary="@string/account_settings_signature_hint"
- android:dialogTitle="@string/account_settings_signature_label"
- android:inputType="textCapSentences|textMultiLine" />
-
- <PreferenceScreen
- android:key="account_quick_responses"
- android:title="@string/account_settings_edit_quick_responses_label"
- android:summary="@string/account_settings_edit_quick_responses_summary" />
-
- <CheckBoxPreference
- android:key="account_default"
- android:title="@string/account_settings_default_label"
- android:summary="@string/account_settings_default_summary" />
-
- <PreferenceCategory
- android:key="data_usage"
- android:title="@string/account_settings_data_usage">
-
- <ListPreference
- android:key="account_check_frequency"
- android:order="1"
- android:title="@string/account_settings_mail_check_frequency_label"
- android:entries="@array/account_settings_check_frequency_entries"
- android:entryValues="@array/account_settings_check_frequency_values"
- android:dialogTitle="@string/account_settings_mail_check_frequency_label" />
-
- <!-- Reserve order#2 here for window size (if inserted) -->
-
- <CheckBoxPreference
- android:key="account_sync_email"
- android:order="3"
- android:defaultValue="true"
- android:title="@string/account_settings_sync_email_enable"
- android:summary="@string/account_settings_sync_email_summary" />
- <CheckBoxPreference
- android:key="account_sync_contacts"
- android:order="4"
- android:defaultValue="true"
- android:title="@string/account_settings_sync_contacts_enable"
- android:summary="@string/account_settings_sync_contacts_summary" />
- <CheckBoxPreference
- android:key="account_sync_calendar"
- android:order="5"
- android:defaultValue="true"
- android:title="@string/account_settings_sync_calendar_enable"
- android:summary="@string/account_settings_sync_calendar_summary" />
-
- <!-- (will hide on POP3 accounts) -->
- <CheckBoxPreference
- android:key="account_background_attachments"
- android:order="6"
- android:title="@string/account_settings_background_attachments_label"
- android:summary="@string/account_settings_background_attachments_summary" />
-
- </PreferenceCategory>
-
- <PreferenceCategory
- android:key="account_notifications"
- android:title="@string/account_settings_notifications">
-
- <CheckBoxPreference
- android:key="account_notify"
- android:title="@string/account_settings_notify_label"
- android:defaultValue="true"
- android:summary="@string/account_settings_notify_summary" />
-
- <RingtonePreference
- android:key="account_ringtone"
- android:layout="?android:attr/preferenceLayoutChild"
- android:dependency="account_notify"
- android:title="@string/account_settings_ringtone"
- android:ringtoneType="notification"
- android:defaultValue="content://settings/system/notification_sound" />
-
- <ListPreference
- android:key="account_settings_vibrate_when"
- android:layout="?android:attr/preferenceLayoutChild"
- android:dependency="account_notify"
- android:defaultValue="never"
- android:title="@string/account_settings_vibrate_when_label"
- android:summary="@string/account_settings_vibrate_when_summary"
- android:entries="@array/account_settings_vibrate_when_entries"
- android:entryValues="@array/account_settings_vibrate_when_values"
- android:dialogTitle="@string/account_settings_vibrate_when_dlg_title" />
-
- </PreferenceCategory>
-
- <PreferenceCategory
- android:key="account_servers"
- android:title="@string/account_settings_servers">
-
- <PreferenceScreen
- android:key="incoming"
- android:title="@string/account_settings_incoming_label"
- android:summary="@string/account_settings_incoming_summary" />
-
- <PreferenceScreen
- android:key="outgoing"
- android:title="@string/account_settings_outgoing_label"
- android:summary="@string/account_settings_outgoing_summary" />
- </PreferenceCategory>
-
- <PreferenceCategory
- android:key="account_policies"
- android:title="@string/account_settings_policies">
-
- <com.android.email.activity.setup.PolicyListPreference
- android:key="policies_enforced"
- android:title="@string/account_settings_enforced_label"
- android:summary="@string/account_settings_enforced_summary" />
-
- <com.android.email.activity.setup.PolicyListPreference
- android:key="policies_unsupported"
- android:title="@string/account_settings_unsupported_label"
- android:summary="@string/account_settings_unsupported_summary" />
-
- <Preference
- android:key="policies_retry_account"
- android:title="@string/account_settings_retry_label"
- android:summary="@string/account_settings_retry_summary" />
- </PreferenceCategory>
-
-</PreferenceScreen>
diff --git a/email2/res/xml/authenticator_alternate.xml b/email2/res/xml/authenticator_alternate.xml
deleted file mode 100644
index 44b756667..000000000
--- a/email2/res/xml/authenticator_alternate.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2010, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<!-- The attributes in this XML file provide configuration information -->
-<!-- for the Account Manager. -->
-
-<!-- The only difference from authenticator.xml is android:label. -->
-
-<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
- android:accountType="com.android.exchange"
- android:icon="@drawable/ic_exchange_selected"
- android:smallIcon="@drawable/ic_exchange_minitab_selected"
- android:label="@string/exchange_name_alternate"
- android:accountPreferences="@xml/account_preferences"
-/>
diff --git a/email2/res/xml/device_admin.xml b/email2/res/xml/device_admin.xml
deleted file mode 100644
index e700f79e1..000000000
--- a/email2/res/xml/device_admin.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<device-admin xmlns:android="http://schemas.android.com/apk/res/android"
- android:visible="false">
- <uses-policies>
- <limit-password />
- <watch-login />
- <force-lock />
- <wipe-data />
- <expire-password />
- <encrypted-storage />
- <disable-camera />
- </uses-policies>
-</device-admin>
diff --git a/email2/res/xml/eas_authenticator.xml b/email2/res/xml/eas_authenticator.xml
deleted file mode 100644
index ae82c1766..000000000
--- a/email2/res/xml/eas_authenticator.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2009, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<!-- The attributes in this XML file provide configuration information -->
-<!-- for the Account Manager. -->
-
-<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
- android:accountType="com.android.exchange"
- android:icon="@drawable/ic_exchange_selected"
- android:smallIcon="@drawable/ic_exchange_minitab_selected"
- android:label="@string/exchange_name"
- android:accountPreferences="@xml/account_preferences"
-/>
diff --git a/email2/res/xml/eastest_authenticator.xml b/email2/res/xml/eastest_authenticator.xml
deleted file mode 100644
index bf7002ba0..000000000
--- a/email2/res/xml/eastest_authenticator.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2011, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<!-- The attributes in this XML file provide configuration information -->
-<!-- for the Account Manager. -->
-
-<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
- android:accountType="com.android.test_exchange"
- android:icon="@drawable/ic_exchange_selected"
- android:smallIcon="@drawable/ic_exchange_minitab_selected"
- android:label="com.android.test_exchange"
- android:accountPreferences="@xml/account_preferences"
-/>
diff --git a/email2/res/xml/general_preferences.xml b/email2/res/xml/general_preferences.xml
deleted file mode 100644
index abb01f6af..000000000
--- a/email2/res/xml/general_preferences.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- App-wide preferences -->
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
- <CheckBoxPreference
- android:key="confirm_delete"
- android:persistent="true"
- android:defaultValue="false"
- android:title="@string/general_preference_confirm_delete_label"
- android:summary="@string/general_preference_confirm_delete_summary" />
-
- <CheckBoxPreference
- android:key="confirm_send"
- android:persistent="true"
- android:defaultValue="false"
- android:title="@string/general_preference_confirm_send_label"
- android:summary="@string/general_preference_confirm_send_summary" />
-
- <ListPreference
- android:key="auto_advance"
- android:title="@string/general_preference_auto_advance_label"
- android:summary="@string/general_preference_auto_advance_summary"
- android:entries="@array/general_preference_auto_advance_entries"
- android:entryValues="@array/general_preference_auto_advance_values"
- android:dialogTitle="@string/general_preference_auto_advance_dialog_title" />
-
- <!-- Note, summary is set dynamically in GeneralPreferences.java -->
- <ListPreference
- android:key="text_zoom"
- android:title="@string/general_preference_text_zoom_label"
- android:entries="@array/general_preference_text_zoom_entries"
- android:entryValues="@array/general_preference_text_zoom_values"
- android:dialogTitle="@string/general_preference_text_zoom_dialog_title" />
-
- <CheckBoxPreference
- android:key="hide_checkboxes"
- android:persistent="true"
- android:defaultValue="false"
- android:title="@string/general_preference_hide_checkboxes_label"
- android:summary="@string/general_preference_hide_checkboxes_summary" />
-
- <!-- This may be removed in GeneralPreferences.java -->
- <CheckBoxPreference
- android:key="reply_all"
- android:persistent="true"
- android:defaultValue="false"
- android:title="@string/general_preference_reply_all_label"
- android:summary="@string/general_preference_reply_all_summary" />
-
- <PreferenceScreen
- android:key="clear_trusted_senders"
- android:title="@string/general_preferences_clear_trusted_senders_title"
- android:summary="@string/general_preferences_clear_trusted_senders_summary" />
-
-</PreferenceScreen>
diff --git a/email2/res/xml/mailbox_preferences.xml b/email2/res/xml/mailbox_preferences.xml
deleted file mode 100644
index 361986a98..000000000
--- a/email2/res/xml/mailbox_preferences.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
- <!-- summary is set at runtime -->
- <ListPreference
- android:key="check_frequency"
- android:title="@string/mailbox_settings_mailbox_check_frequency_label"
- android:dialogTitle="@string/mailbox_settings_mailbox_check_frequency_label"
- android:entries="@array/account_settings_check_frequency_entries_push"
- android:entryValues="@array/account_settings_check_frequency_values_push"
- android:persistent="false"
- />
-
- <!-- summary is set at runtime -->
- <ListPreference
- android:key="sync_window"
- android:title="@string/mailbox_settings_mailbox_sync_window_label"
- android:dialogTitle="@string/mailbox_settings_mailbox_sync_window_label"
- android:entries="@array/account_settings_mail_window_entries_with_default"
- android:entryValues="@array/account_settings_mail_window_values_with_default"
- android:persistent="false"
- />
-
-</PreferenceScreen>
diff --git a/email2/res/xml/pop_imap_authenticator.xml b/email2/res/xml/pop_imap_authenticator.xml
deleted file mode 100644
index ca34a8c9f..000000000
--- a/email2/res/xml/pop_imap_authenticator.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2010, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<!-- The attributes in this XML file provide configuration information -->
-<!-- for the Account Manager. -->
-
-<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
- android:accountType="com.android.email"
- android:icon="@mipmap/ic_launcher_mail"
- android:smallIcon="@drawable/stat_notify_email_generic"
- android:label="@string/app_name"
- android:accountPreferences="@xml/account_preferences"
-/>
diff --git a/email2/res/xml/providers.xml b/email2/res/xml/providers.xml
deleted file mode 100644
index 2541fe0da..000000000
--- a/email2/res/xml/providers.xml
+++ /dev/null
@@ -1,440 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
- <!--
- This file contains configuration data for commonly-used email providers.
-
- ==== CONTENT GUIDELINES ====
-
- This file should only be used for email providers that are considered "universal"
- and are appropriate for *all* android platform devices. These entries must be accessible
- from all networks. It should be reasonable for any user to obtain an account on these
- networks, and test accounts must be easily obtainable. No entries should be added
- that are device, product, or carrier-specific.
-
- Entries that are device, product or carrier-specific should be added as overlays
- in the appropriate providers_product.xml file.
-
- ==== FORMAT OF ENTRIES ====
-
- This file is used to specify providers that we know default settings for
- so that the user can set up their account by simply entering their email
- address and password.
-
- When a user starts this process, the email address is parsed, the domain
- broken out and used to search this file for a provider. If one is found the
- provider's settings are used to attempt to connect to the account.
-
- At this time, the id and label attributes are not used. However, please include them
- if you make edits to this file. id must also be completely unique. label will be shown
- to the user when there are multiple options provided for a single domain (not currently
- supported).
-
- A provider contains the settings for setting up an email account
- that ends with the given domain. Domains should be unique within
- this file. Each provider should have at least one incoming section and
- one outgoing section. If more than one is specified only the first
- will be used.
-
- Valid incoming uri schemes are:
- imap IMAP with no transport security.
- imap+tls+ IMAP with required TLS transport security.
- If TLS is not available the connection fails.
- imap+ssl+ IMAP with required SSL transport security.
- If SSL is not available the connection fails.
-
- pop3 POP3 with no transport security.
- pop3+tls+ POP3 with required TLS transport security.
- If TLS is not available the connection fails.
- pop3+ssl+ POP3 with required SSL transport security.
- If SSL is not available the connection fails.
-
- Valid outgoing uri schemes are:
- smtp SMTP with no transport security.
- smtp+tls+ SMTP with required TLS transport security.
- If TLS is not available the connection fails.
- smtp+ssl+ SMTP with required SSL transport security.
- If SSL is not available the connection fails.
-
- To the above schemes you may also add "trustallcerts" to indicate that,
- although link encryption is still required, "non-trusted" certificates may
- will be excepted. For example, "imap+ssl+trustallcerts" or
- "smtp+tls+trustallcerts". This should only used when necessary, as it
- could allow a spoofed server to intercept password and mail.
-
- The URIs must contain all of the information to make a connection,
- including a port if the service uses a non-default port. The default
- ports are as follows:
- imap 143 pop3 110 smtp 587
- imap+tls+ 143 pop3+tls+ 110 smtp+tls+ 587
- imap+ssl+ 993 pop3+ssl+ 995 smtp+ssl+ 465
-
- ==== DOMAIN PATTERNS ====
-
- Often times a hosting company will have multiple mail server addresses. Often
- times used for load balancing or based upon geographical boundaries. In these
- cases, it would be unwieldy to maintain a list of 2-dozen providers that all
- point to essentially the same mail server. To alleviate this, domains may
- contain pattern matching characters that can be used to match user entered
- domains without knowing the exact domain.
-
- An asterisk (*) is used to match that part of a domain name that is demarcated
- by a period (dot); no other characters may appear on either side of an asterisk.
- Therefore, foo.*.com and *.mail.com are valid, whereas a*.com and foo.c* are not.
- An asterisk is also not greedy; it only matches a single part of a domain name;
- therefore, foo.bar.bletch is NOT matched by foo.*; it does, however, match
- foo.*.* or foo.bar.*.
-
- The alternate is the wild card character - a '?'. The wild card character
- matches any single character. This is very useful when the number of characters
- is known (such as the country code in the domain).
-
- ==== TEMPLATES ====
-
- Both the username and uri attributes (for both incoming and outgoing elements)
- are templates.
-
- The username attribute is used to supply a template for the username
- that will be presented to the server. This username is built from a
- set of variables that are substituted with parts of the user specified
- email address.
-
- Valid substitution values for all templates are:
- $email - the email address the user entered
- $user - the string before the @ sign in the email address the user entered
- $domain - the string after the @ sign in the email address the user entered
-
- The username attribute MUST be specified for the incoming element, so the POP3 or IMAP
- server can identify the mailbox to be opened.
-
- The username attribute MAY be the empty string for the outgoing element, but only if the
- SMTP server supports anonymous transmission (most don't).
- -->
-
-<providers>
-
- <!-- Gmail variants -->
- <provider id="gmail" label="Gmail" domain="gmail.com">
- <incoming uri="imap+ssl+://imap.gmail.com" username="$email" />
- <outgoing uri="smtp+ssl+://smtp.gmail.com" username="$email" />
- </provider>
- <provider id="googlemail" label="Google Mail" domain="googlemail.com">
- <incoming uri="imap+ssl+://imap.googlemail.com" username="$email" />
- <outgoing uri="smtp+ssl+://smtp.googlemail.com" username="$email" />
- </provider>
- <provider id="google" label="Google" domain="google.com">
- <incoming uri="imap+ssl+://imap.gmail.com" username="$email" />
- <outgoing uri="smtp+ssl+://smtp.gmail.com" username="$email" />
- </provider>
- <provider id="android" label="Android" domain="android.com">
- <incoming uri="imap+ssl+://imap.gmail.com" username="$email" />
- <outgoing uri="smtp+ssl+://smtp.gmail.com" username="$email" />
- </provider>
-
- <!-- USA -->
-
- <!-- AOL and variants -->
- <!-- Note, AOL appears to support SSL on both sides, as well -->
- <provider id="aim" label="AIM" domain="aim.com">
- <incoming uri="imap+ssl+://imap.aim.com" label="IMAP" username="$email" />
- <outgoing uri="smtp+ssl+://smtp.aim.com" username="$email" />
- </provider>
- <!-- Note, AOL appears to support SSL on both sides, as well -->
- <provider id="aol" label="AOL" domain="aol.com">
- <incoming uri="imap+ssl+://imap.aol.com" label="IMAP" username="$email" />
- <outgoing uri="smtp+ssl+://smtp.aol.com" username="$email" />
- </provider>
-
- <!-- MobileMe and variants -->
- <provider id="dotmac" label=".Mac" domain="mac.com">
- <incoming uri="imap+ssl+://mail.mac.com" username="$email" />
- <outgoing uri="smtp+tls+://smtp.mac.com" username="$email" />
- </provider>
- <!-- Note: Mac Mail.app sets IMAP to mail.mac.com, but it's the same server -->
- <provider id="mobileme" label="MobileMe" domain="me.com">
- <incoming uri="imap+ssl+://mail.me.com" username="$email" />
- <outgoing uri="smtp+tls+://smtp.me.com" username="$email" />
- </provider>
-
- <!-- Hotmail and variants. NOTE: These are handled by exchange if available, else POP3. -->
- <!-- EXCHANGE-REMOVE-SECTION-START -->
- <provider id="live1" label="Windows Live Hotmail Plus" domain="live.*">
- <incoming uri="eas+ssl+://m.hotmail.com" username="$email" />
- <outgoing uri="eas+ssl+://m.hotmail.com" username="$email" />
- </provider>
- <provider id="live2" label="Windows Live Hotmail Plus" domain="live.*.*">
- <incoming uri="eas+ssl+://m.hotmail.com" username="$email" />
- <outgoing uri="eas+ssl+://m.hotmail.com" username="$email" />
- </provider>
- <provider id="live3" label="Windows Live Hotmail Plus" domain="*.live.*">
- <incoming uri="eas+ssl+://m.hotmail.com" username="$email" />
- <outgoing uri="eas+ssl+://m.hotmail.com" username="$email" />
- </provider>
- <provider id="hotmail1" label="Windows Live Hotmail Plus" domain="hotmail.*">
- <incoming uri="eas+ssl+://m.hotmail.com" username="$email" />
- <outgoing uri="eas+ssl+://m.hotmail.com" username="$email" />
- </provider>
- <provider id="hotmail2" label="Windows Live Hotmail Plus" domain="hotmail.*.*">
- <incoming uri="eas+ssl+://m.hotmail.com" username="$email" />
- <outgoing uri="eas+ssl+://m.hotmail.com" username="$email" />
- </provider>
- <provider id="hotmail3" label="Windows Live Hotmail Plus" domain="livemail.*">
- <incoming uri="eas+ssl+://m.hotmail.com" username="$email" />
- <outgoing uri="eas+ssl+://m.hotmail.com" username="$email" />
- </provider>
- <provider id="hotmail4" label="Windows Live Hotmail Plus" domain="livemail.*.*">
- <incoming uri="eas+ssl+://m.hotmail.com" username="$email" />
- <outgoing uri="eas+ssl+://m.hotmail.com" username="$email" />
- </provider>
- <provider id="msn" label="Windows Live Hotmail Plus" domain="msn.*">
- <incoming uri="eas+ssl+://m.hotmail.com" username="$email" />
- <outgoing uri="eas+ssl+://m.hotmail.com" username="$email" />
- </provider>
- <provider id="msnhotmail" label="Windows Live Hotmail Plus" domain="msnhotmail.com">
- <incoming uri="eas+ssl+://m.hotmail.com" username="$email" />
- <outgoing uri="eas+ssl+://m.hotmail.com" username="$email" />
- </provider>
- <!-- EXCHANGE-REMOVE-SECTION-END -->
- <provider id="live" label="Windows Live Hotmail Plus" domain="live.com"
- note="@string/provider_note_live">
- <incoming uri="pop3+ssl+://pop3.live.com" username="$email" />
- <outgoing uri="smtp+tls+://smtp.live.com" username="$email" />
- </provider>
- <provider id="hotmail" label="Windows Live Hotmail Plus" domain="hotmail.com"
- note="@string/provider_note_live">
- <incoming uri="pop3+ssl+://pop3.live.com" username="$email" />
- <outgoing uri="smtp+tls+://smtp.live.com" username="$email" />
- </provider>
- <provider id="msn" label="Windows Live Hotmail Plus" domain="msn.com"
- note="@string/provider_note_live">
- <incoming uri="pop3+ssl+://pop3.live.com" username="$email" />
- <outgoing uri="smtp+tls+://smtp.live.com" username="$email" />
- </provider>
-
- <!-- Yahoo! Mail variants -->
- <provider id="yahoo" label="Yahoo!" domain="yahoo.com">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="rocketmail" label="Yahoo! RocketMail" domain="rocketmail.com">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="ymail" label="Yahoo!" domain="ymail.com">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="bellsouth" label="AT&amp;T Bell South" domain="bellsouth.net">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="att" label="AT&amp;T" domain="att.net">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="pacbell" label="AT&amp;T Pacific Bell" domain="pacbell.net">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="sbcglobal" label="AT&amp;T SBC Global" domain="sbcglobal.net">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="swbell" label="AT&amp;T Southwest Bell" domain="swbell.net">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="btinternet" label="BT Internet" domain="btinternet.com">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="btopenworld" label="BT Open World" domain="btopenworld.com">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="talk21" label="BT Talk 21" domain="talk21.com">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="rogers" label="Rogers" domain="rogers.com">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="rogers-nl" label="Rogers" domain="nl.rogers.com">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
-
- <!-- Roadrunner variants -->
- <provider id="rr-roadrunner" label="RoadRunner" domain="roadrunner.com">
- <incoming uri="pop3://pop-server.roadrunner.com" username="$email" />
- <outgoing uri="smtp://mobile-smtp.roadrunner.com" username="$email" />
- </provider>
- <provider id="rr-global" label="RoadRunner" domain="*.rr.com">
- <incoming uri="pop3://pop-server.$domain" username="$email" />
- <outgoing uri="smtp://mobile-smtp.roadrunner.com" username="$email" />
- </provider>
-
- <!-- USA (other)-->
- <provider id="comcast" label="Comcast" domain="comcast.net">
- <incoming uri="pop3+ssl+://mail.comcast.net" username="$user" />
- <outgoing uri="smtp+ssl+://smtp.comcast.net" username="$user" />
- </provider>
- <provider id="compuserve" label="CompuServe" domain="cs.com">
- <incoming uri="imap://imap.cs.com" username="$user" />
- <outgoing uri="smtp://smtp.cs.com" username="$user" />
- </provider>
- <provider id="cox" label="Cox" domain="cox.net">
- <incoming uri="pop3+ssl+://pop.east.cox.net" username="$user" />
- <outgoing uri="smtp+ssl+://smtp.east.cox.net" username="$user" />
- </provider>
- <provider id="earthlink" label="Earthlink" domain="earthlink.net">
- <incoming uri="pop3://pop.earthlink.net" username="$email" />
- <outgoing uri="smtp://smtpauth.earthlink.net:587" username="$email" />
- </provider>
- <!-- Tested with imap/ssl (no connection) and imap/tls (unsupported)-->
- <!-- Tested with smtp/ssl (no connection) and smtp/tls (unsupported)-->
- <provider id="juno" label="Juno" domain="juno.com">
- <incoming uri="pop3://pop.juno.com" username="$user" />
- <outgoing uri="smtp://smtp.juno.com" username="$user" />
- </provider>
- <provider id="netzero" label="NetZero" domain="netzero.com">
- <incoming uri="pop3://pop.netzero.com" username="$user" />
- <outgoing uri="smtp://smtp.netzero.com" username="$user" />
- </provider>
- <provider id="verizon" label="Verizon" domain="verizon.net">
- <incoming uri="pop3://incoming.verizon.net" username="$user" />
- <outgoing uri="smtp://outgoing.verizon.net" username="$user" />
- </provider>
-
- <!-- UK -->
- <provider id="aol-uk" label="AOL" domain="aol.co.uk">
- <incoming uri="imap+ssl+://imap.uk.aol.com" label="IMAP" username="$user" />
- <outgoing uri="smtp+ssl+://smtp.uk.aol.com" username="$user" />
- </provider>
-
- <!-- Germany -->
- <provider id="freenet" label="Freenet" domain="freenet.de">
- <incoming uri="pop3://mx.freenet.de" username="$user" />
- <outgoing uri="smtp+ssl://mx.freenet.de" username="$email" />
- </provider>
- <provider id="gmx" label="GMX" domain="gmx.de">
- <incoming uri="pop3://pop.gmx.net" username="$email" />
- <outgoing uri="smtp://mail.gmx.net" username="$email" />
- </provider>
- <provider id="T-Online" label="T-Online" domain="t-online.de"
- note="@string/provider_note_t_online">
- <incoming uri="pop3://popmail.t-online.de" username="$email" />
- <outgoing uri="smtp://smtpmail.t-online.de" username="$email" />
- </provider>
- <provider id="web.de" label="Web.de" domain="web.de">
- <incoming uri="pop3://pop3.web.de" username="$user" />
- <outgoing uri="smtp://smtp.web.de" username="$user" />
- </provider>
-
- <!-- Netherlands -->
- <!-- TODO: For all of these, please confirm POP3, and switch to IMAP if supported -->
- <!-- TODO: username="" in incoming element is broken - will not work -->
- <!-- Disabled until username="" is resolved
- <provider id="hetnet" label="Het Net" domain="hetnet.nl">
- <incoming uri="pop3://pop.hetnet.nl" username="" />
- <outgoing uri="smtp://mailhost.hetnet.nl" username="" />
- </provider>
- -->
- <!-- Disabled until test accounts provided
- <provider id="planet inet" label="Planet Internet" domain="planet.nl">
- <incoming uri="pop3://pop.planet.nl" username="$user" />
- <outgoing uri="smtp://mail.planet.nl" username="" />
- </provider>
- -->
- <!-- TODO: username="" in incoming element is broken - will not work -->
- <!-- Disabled until username="" is resolved
- <provider id="tiscali" label="Tiscali" domain="tiscali.nl">
- <incoming uri="pop3://pop3.tiscali.nl" username="" />
- <outgoing uri="smtp://smtp.tiscali.nl" username="" />
- </provider>
- -->
- <!-- Disabled until test accounts provided
- <provider id="wanadoo" label="Wanadoo" domain="wanadoo.nl">
- <incoming uri="pop3://pop.wanadoo.nl" username="$user" />
- <outgoing uri="smtp://smtp.wanadoo.nl" username="$user" />
- </provider>
- -->
-
- <!-- Poland -->
- <provider id="onet" label="Onet.pl" domain="poczta.onet.pl">
- <incoming uri="pop3://pop3.poczta.onet.pl" username="$email" />
- <outgoing uri="smtp://smtp.poczta.onet.pl" username="$email" />
- </provider>
- <provider id="wirtualna" label="Wirtualna Polska" domain="wp.pl">
- <incoming uri="pop3://pop3.wp.pl" username="$user" />
- <outgoing uri="smtp://smtp.wp.pl" username="$user" />
- </provider>
- <provider id="interia" label="Interia" domain="interia.pl">
- <incoming uri="pop3+ssl://poczta.interia.pl" username="$user" />
- <outgoing uri="smtp+ssl://poczta.interia.pl" username="$user" />
- </provider>
- <provider id="o2" label="O2" domain="o2.pl">
- <incoming uri="pop3+ssl://poczta.o2.pl" username="$user" />
- <outgoing uri="smtp+ssl://poczta.o2.pl" username="$user" />
- </provider>
-
- <!-- Korea -->
- <provider id="daum" label="Daum Hanmail" domain="hanmail.net">
- <incoming uri="imap+ssl+://imap.hanmail.net" username="$user" />
- <outgoing uri="smtp+ssl+://smtp.hanmail.net" username="$user" />
- </provider>
- <provider id="naver" label="NAVER" domain="naver.com">
- <incoming uri="imap+ssl+://imap.naver.com" username="$user" />
- <outgoing uri="smtp+tls+://smtp.naver.com" username="$user" />
- </provider>
- <provider id="paran" label="Paran" domain="paran.com">
- <incoming uri="imap+ssl+://imap.paran.com" username="$email" />
- <outgoing uri="smtp+ssl+://smtp.paran.com" username="$email" />
- </provider>
-
- <!-- Yahoo! country-specific email domains -->
- <provider id="yahoo-y7" label="Yahoo!7" domain="y7mail.com">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="kimo" label="Yahoo! Taiwan" domain="kimo.com">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <!-- Note: Yahoo! Japan's ne.jp and co.jp domains do not yet support open IMAP -->
- <provider id="yahoo-jp-ybb" label="Yahoo! Japan" domain="ybb.ne.jp">
- <incoming uri="pop3+ssl+://android.ybbpop.mail.yahoo.co.jp" username="$email" />
- <outgoing uri="smtp+ssl+://android.ybbsmtp.mail.yahoo.co.jp" username="$email" />
- </provider>
- <!-- Note: Yahoo! Japan's co.jp domain requires $user rather than the usual $email -->
- <provider id="yahoo-jp" label="Yahoo! Japan" domain="yahoo.co.jp">
- <incoming uri="pop3+ssl+://android.pop.mail.yahoo.co.jp" username="$user" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.co.jp" username="$user" />
- </provider>
- <provider id="yahoo-com-XX" label="Country specific Yahoo!" domain="yahoo.com.??">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="yahoo-co-XX" label="Country specific Yahoo!" domain="yahoo.co.??">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
- <provider id="yahoo-XX" label="Country specific Yahoo!" domain="yahoo.??">
- <incoming uri="imap+ssl+://android.imap.mail.yahoo.com" username="$email" />
- <outgoing uri="smtp+ssl+://android.smtp.mail.yahoo.com" username="$email" />
- </provider>
-</providers>
diff --git a/email2/res/xml/providers_product.xml b/email2/res/xml/providers_product.xml
deleted file mode 100644
index f10382dfb..000000000
--- a/email2/res/xml/providers_product.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
- <!--
- Email providers that are considered "universal" and are appropriate for *all* android
- platform devices should be defined in providers.xml.
-
- Entries that are device, product or carrier-specific should be added as overlays
- in the appropriate providers_product.xml file.
-
- Because overlays must correspond to an existing platform resource, this empty placeholder
- is included in the platform build.
- -->
-
-<providers_product>
-
- <!-- THIS SECTION MUST REMAIN EMPTY -->
-
-</providers_product>
diff --git a/email2/res/xml/searchable.xml b/email2/res/xml/searchable.xml
deleted file mode 100644
index 434d29974..000000000
--- a/email2/res/xml/searchable.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2012 Google Inc.
- Licensed to The Android Open Source Project.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<searchable xmlns:android="http://schemas.android.com/apk/res/android"
- android:label="@string/search_title"
- android:hint="@string/search_hint"
- android:icon="@drawable/ic_menu_search_holo_light"
- android:searchSuggestAuthority="com.android.email.suggestionsprovider"
- android:searchSuggestSelection="query LIKE ?"
- android:searchSuggestIntentAction="android.intent.action.SEARCH"
- android:imeOptions="actionSearch" />
diff --git a/email2/res/xml/senders.xml b/email2/res/xml/senders.xml
deleted file mode 100644
index 81ef68fea..000000000
--- a/email2/res/xml/senders.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
- <!--
- This file contains configuration data for commonly-used email sender.
-
- ==== CONTENT GUIDELINES ====
-
- This file should only be used for email store that are considered "universal"
- and are appropriate for *all* android platform devices. These entries must be accessible
- from all networks. It should be reasonable for any user to obtain an account on these
- networks, and test accounts must be easily obtainable. No entries should be added
- that are device, product, or carrier-specific.
-
- Entries that are device, product or carrier-specific should be added as overlays
- in the appropriate senders_product.xml file.
- -->
-
-<senders>
- <sender scheme="smtp" class="com.android.email.mail.transport.SmtpSender" />
- <sender scheme="eas" class="com.android.email.mail.transport.ExchangeSender" />
-</senders>
diff --git a/email2/res/xml/senders_product.xml b/email2/res/xml/senders_product.xml
deleted file mode 100644
index edb8aeca4..000000000
--- a/email2/res/xml/senders_product.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
- <!--
- Email stores that are considered "universal" and are appropriate for *all* android
- platform devices should be defined in senders.xml.
-
- Entries that are device, product or carrier-specific should be added as overlays
- in the appropriate senders_product.xml file.
-
- Because overlays must correspond to an existing platform resource, this empty placeholder
- is included in the platform build.
- -->
-
-<senders_products>
-
- <!-- THIS SECTION MUST REMAIN EMPTY -->
- <!-- Actual entries should be in the overlay files found elsewhere -->
-
-</senders_products>
diff --git a/email2/res/xml/services.xml b/email2/res/xml/services.xml
deleted file mode 100644
index 5cbb1f9a3..000000000
--- a/email2/res/xml/services.xml
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!--
- Email services (protocols) are defined here. For the present, these are baked into the Email
- apk; the goal is for remote services to register themselves into this file.
-
- The required attributes are as follows (except that EITHER serviceClass or intent is required):
- protocol: the unique name used to identify the protocol
- name: the name of the account type option presented to users during account setup
- accountType: the AccountManager type of accounts created using this service
- serviceClass: a class implementing IEmailService (or null, if the service is remote)
- intent: the intent used to connect to a remote IEmailService
- port: the (default) port used when creating accounts using this service
- portSsl: as above, when SSL is selected
- syncIntervalStrings: a reference to an array of sync interval options
- syncIntervals: a reference to an array of values corresponding to syncIntervalStrings
- defaultSyncInterval: the default sync interval, selected from enums defined in attrs.xml
-
- The following optional attributes default to "false":
- offerTls: whether a TLS option (e.g. STARTTLS) is offered for this service
- offerCerts: whether or not certificate authentication is an option for this service
- usesSmtp: whether SMTP is used as the outgoing protocol for this service
- offerPrefix: whether a "prefix" is offered to the user (for IMAP)
- offerLocalDeletes: whether an option to delete locally is offered
- syncChanges: whether non-deletion changes to messages sync back to the server
- offerAttachmentPreload: whether to offer attachment preloading (pre-caching)
- usesAutodiscover: whether to attempt using the "autodiscover" API when creating
- an account
- offerLookback: whether a sync "lookback" is offered (rather than the POP/IMAP
- legacy "25 most recent messages synced")
- defaultLookback: if "lookback" is offered, an enum of possible lookbacks
- syncCalendar: whether this service is capable of syncing a calendar (offering a checkbox)
- syncContacts: whether this service is capable of syncing contacts (offering a checkbox)
--->
-
-<emailservices xmlns:email="http://schemas.android.com/apk/res/com.android.email">
- <emailservice
- email:protocol="pop3"
- email:name="POP3"
- email:accountType="com.android.email"
- email:serviceClass="com.android.email.service.ImapService"
- email:port="110"
- email:portSsl="995"
- email:syncIntervalStrings="@array/account_settings_check_frequency_entries"
- email:syncIntervals="@array/account_settings_check_frequency_values"
- email:defaultSyncInterval="mins15"
-
- email:offerTls="true"
- email:usesSmtp="true"
- email:offerLocalDeletes="true"
- />
- <emailservice
- email:protocol="imap"
- email:name="IMAP"
- email:accountType="com.android.email"
- email:serviceClass="com.android.email.service.Pop3Service"
- email:port="143"
- email:portSsl="993"
- email:syncIntervalStrings="@array/account_settings_check_frequency_entries"
- email:syncIntervals="@array/account_settings_check_frequency_values"
- email:defaultSyncInterval="mins15"
-
- email:offerTls="true"
- email:usesSmtp="true"
- email:offerAttachmentPreload="true"
- email:offerPrefix="true"
- email:syncChanges="true"
- />
- <emailservice
- email:protocol="eas"
- email:name="Exchange"
- email:accountType="com.android.exchange"
- email:intent="com.android.email.EXCHANGE_INTENT"
- email:port="80"
- email:portSsl="443"
- email:syncIntervalStrings="@array/account_settings_check_frequency_entries_push"
- email:syncIntervals="@array/account_settings_check_frequency_values_push"
- email:defaultSyncInterval="push"
-
- email:defaultSsl="true"
- email:offerCerts="true"
- email:syncChanges="true"
- email:usesAutodiscover="true"
- email:offerAttachmentPreload="true"
- email:offerLookback="true"
- email:defaultLookback="auto"
- email:syncContacts="true"
- email:syncCalendar="true"
- />
-</emailservices>
diff --git a/email2/res/xml/syncadapter_pop_imap.xml b/email2/res/xml/syncadapter_pop_imap.xml
deleted file mode 100644
index f4a7120fc..000000000
--- a/email2/res/xml/syncadapter_pop_imap.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2010, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<!-- The attributes in this XML file provide configuration information -->
-<!-- for the SyncAdapter. -->
-
-<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
- android:contentAuthority="com.android.email.provider"
- android:accountType="com.android.email"
- android:supportsUploading="true"
- android:allowParallelSyncs="true"
-/>
diff --git a/email2/res/xml/widget_info.xml b/email2/res/xml/widget_info.xml
deleted file mode 100644
index 047857ece..000000000
--- a/email2/res/xml/widget_info.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
- android:minWidth="180dip"
- android:minHeight="110dip"
- android:updatePeriodMillis="0"
- android:previewImage="@drawable/email_widget_preview"
- android:initialLayout="@layout/widget"
- android:resizeMode="horizontal|vertical"
- android:configure="com.android.email2.ui.MailboxSelectionActivityEmail"
- />
diff --git a/email2/src/com/android/email/AttachmentInfo.java b/email2/src/com/android/email/AttachmentInfo.java
deleted file mode 100644
index 91a330026..000000000
--- a/email2/src/com/android/email/AttachmentInfo.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import com.android.emailcommon.internet.MimeUtility;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.utility.AttachmentUtilities;
-import com.android.emailcommon.utility.Utility;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.database.Cursor;
-import android.net.ConnectivityManager;
-import android.net.Uri;
-import android.provider.Settings;
-import android.text.TextUtils;
-
-import java.util.List;
-
-/**
- * Encapsulates commonly used attachment information related to suitability for viewing and saving,
- * based on the attachment's filename and mimetype.
- */
-public class AttachmentInfo {
- // Projection which can be used with the constructor taking a Cursor argument
- public static final String[] PROJECTION = new String[] {Attachment.RECORD_ID, Attachment.SIZE,
- Attachment.FILENAME, Attachment.MIME_TYPE, Attachment.ACCOUNT_KEY, Attachment.FLAGS};
- // Offsets into PROJECTION
- public static final int COLUMN_ID = 0;
- public static final int COLUMN_SIZE = 1;
- public static final int COLUMN_FILENAME = 2;
- public static final int COLUMN_MIME_TYPE = 3;
- public static final int COLUMN_ACCOUNT_KEY = 4;
- public static final int COLUMN_FLAGS = 5;
-
- /** Attachment not denied */
- public static final int ALLOW = 0x00;
- /** Attachment suspected of being malware */
- public static final int DENY_MALWARE = 0x01;
- /** Attachment too large; must download over wi-fi */
- public static final int DENY_WIFIONLY = 0x02;
- /** No receiving intent to handle attachment type */
- public static final int DENY_NOINTENT = 0x04;
- /** Side load of applications is disabled */
- public static final int DENY_NOSIDELOAD = 0x08;
- // TODO Remove DENY_APKINSTALL when we can install directly from the Email activity
- /** Unable to install any APK */
- public static final int DENY_APKINSTALL = 0x10;
- /** Security policy prohibits install */
- public static final int DENY_POLICY = 0x20;
-
- public final long mId;
- public final long mSize;
- public final String mName;
- public final String mContentType;
- public final long mAccountKey;
- public final int mFlags;
-
- /** Whether or not this attachment can be viewed */
- public final boolean mAllowView;
- /** Whether or not this attachment can be saved */
- public final boolean mAllowSave;
- /** Whether or not this attachment can be installed [only true for APKs] */
- public final boolean mAllowInstall;
- /** Reason(s) why this attachment is denied from being viewed */
- public final int mDenyFlags;
-
- public AttachmentInfo(Context context, Attachment attachment) {
- this(context, attachment.mId, attachment.mSize, attachment.mFileName, attachment.mMimeType,
- attachment.mAccountKey, attachment.mFlags);
- }
-
- public AttachmentInfo(Context context, Cursor c) {
- this(context, c.getLong(COLUMN_ID), c.getLong(COLUMN_SIZE), c.getString(COLUMN_FILENAME),
- c.getString(COLUMN_MIME_TYPE), c.getLong(COLUMN_ACCOUNT_KEY),
- c.getInt(COLUMN_FLAGS));
- }
-
- public AttachmentInfo(Context context, AttachmentInfo info) {
- this(context, info.mId, info.mSize, info.mName, info.mContentType, info.mAccountKey,
- info.mFlags);
- }
-
- public AttachmentInfo(Context context, long id, long size, String fileName, String mimeType,
- long accountKey, int flags) {
- mSize = size;
- mContentType = AttachmentUtilities.inferMimeType(fileName, mimeType);
- mName = fileName;
- mId = id;
- mAccountKey = accountKey;
- mFlags = flags;
- boolean canView = true;
- boolean canSave = true;
- boolean canInstall = false;
- int denyFlags = ALLOW;
-
- // Don't enable the "save" button if we've got no place to save the file
- if (!Utility.isExternalStorageMounted()) {
- canSave = false;
- }
-
- // Check for acceptable / unacceptable attachments by MIME-type
- if ((!MimeUtility.mimeTypeMatches(mContentType,
- AttachmentUtilities.ACCEPTABLE_ATTACHMENT_VIEW_TYPES)) ||
- (MimeUtility.mimeTypeMatches(mContentType,
- AttachmentUtilities.UNACCEPTABLE_ATTACHMENT_VIEW_TYPES))) {
- canView = false;
- }
-
- // Check for unacceptable attachments by filename extension
- String extension = AttachmentUtilities.getFilenameExtension(mName);
- if (!TextUtils.isEmpty(extension) &&
- Utility.arrayContains(AttachmentUtilities.UNACCEPTABLE_ATTACHMENT_EXTENSIONS,
- extension)) {
- canView = false;
- canSave = false;
- denyFlags |= DENY_MALWARE;
- }
-
- // Check for policy restrictions on download
- if ((flags & Attachment.FLAG_POLICY_DISALLOWS_DOWNLOAD) != 0) {
- canView = false;
- canSave = false;
- denyFlags |= DENY_POLICY;
- }
-
- // Check for installable attachments by filename extension
- extension = AttachmentUtilities.getFilenameExtension(mName);
- if (!TextUtils.isEmpty(extension) &&
- Utility.arrayContains(AttachmentUtilities.INSTALLABLE_ATTACHMENT_EXTENSIONS,
- extension)) {
- boolean sideloadEnabled;
- sideloadEnabled = Settings.Secure.getInt(context.getContentResolver(),
- Settings.Secure.INSTALL_NON_MARKET_APPS, 0 /* sideload disabled */) == 1;
- canSave &= sideloadEnabled;
- canView = canSave;
- canInstall = canSave;
- if (!sideloadEnabled) {
- denyFlags |= DENY_NOSIDELOAD;
- }
- }
-
- // Check for file size exceeded
- // The size limit is overridden when on a wifi connection - any size is OK
- if (mSize > AttachmentUtilities.MAX_ATTACHMENT_DOWNLOAD_SIZE) {
- int networkType = EmailConnectivityManager.getActiveNetworkType(context);
- if (networkType != ConnectivityManager.TYPE_WIFI) {
- canView = false;
- canSave = false;
- denyFlags |= DENY_WIFIONLY;
- }
- }
-
- // Check to see if any activities can view this attachment; if none, we can't view it
- Intent intent = getAttachmentIntent(context, 0);
- PackageManager pm = context.getPackageManager();
- List<ResolveInfo> activityList = pm.queryIntentActivities(intent, 0 /*no account*/);
- if (activityList.isEmpty()) {
- canView = false;
- canSave = false;
- denyFlags |= DENY_NOINTENT;
- }
-
- mAllowView = canView;
- mAllowSave = canSave;
- mAllowInstall = canInstall;
- mDenyFlags = denyFlags;
- }
-
- /**
- * Returns an <code>Intent</code> to load the given attachment.
- * @param context the caller's context
- * @param accountId the account associated with the attachment (or 0 if we don't need to
- * resolve from attachmentUri to contentUri)
- * @return an Intent suitable for viewing the attachment
- */
- public Intent getAttachmentIntent(Context context, long accountId) {
- Uri contentUri = getUriForIntent(context, accountId);
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setDataAndType(contentUri, mContentType);
- intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
- | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
- return intent;
- }
-
- protected Uri getUriForIntent(Context context, long accountId) {
- Uri contentUri = AttachmentUtilities.getAttachmentUri(accountId, mId);
- if (accountId > 0) {
- contentUri = AttachmentUtilities.resolveAttachmentIdToContentUri(
- context.getContentResolver(), contentUri);
- }
-
- return contentUri;
- }
-
- /**
- * An attachment is eligible for download if it can either be viewed or saved (or both)
- * @return whether the attachment is eligible for download
- */
- public boolean isEligibleForDownload() {
- return mAllowView || mAllowSave;
- }
-
- @Override
- public int hashCode() {
- return (int) (mId ^ (mId >>> 32));
- }
-
- @Override
- public boolean equals(Object o) {
- if (o == this) {
- return true;
- }
-
- if ((o == null) || (o.getClass() != getClass())) {
- return false;
- }
-
- return ((AttachmentInfo) o).mId == mId;
- }
-
- @Override
- public String toString() {
- return "{Attachment " + mId + ":" + mName + "," + mContentType + "," + mSize + "}";
- }
-}
diff --git a/email2/src/com/android/email/Clock.java b/email2/src/com/android/email/Clock.java
deleted file mode 100644
index a2b44bb9b..000000000
--- a/email2/src/com/android/email/Clock.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-/**
- * A class provide the current time (like {@link System#currentTimeMillis()}).
- * It's intended to be mocked out for unit tests.
- */
-public class Clock {
- public static final Clock INSTANCE = new Clock();
-
- protected Clock() {
- }
-
- public long getTime() {
- return System.currentTimeMillis();
- }
-}
diff --git a/email2/src/com/android/email/EmailAddressValidator.java b/email2/src/com/android/email/EmailAddressValidator.java
deleted file mode 100644
index a9f82bc21..000000000
--- a/email2/src/com/android/email/EmailAddressValidator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import com.android.emailcommon.mail.Address;
-
-import android.widget.AutoCompleteTextView.Validator;
-
-public class EmailAddressValidator implements Validator {
- public CharSequence fixText(CharSequence invalidText) {
- return "";
- }
-
- public boolean isValid(CharSequence text) {
- return Address.parse(text.toString()).length > 0;
- }
-}
diff --git a/email2/src/com/android/email/EmailConnectivityManager.java b/email2/src/com/android/email/EmailConnectivityManager.java
deleted file mode 100644
index 6746152d1..000000000
--- a/email2/src/com/android/email/EmailConnectivityManager.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.net.NetworkInfo.State;
-import android.os.Bundle;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-import android.util.Log;
-
-import com.android.email2.ui.MailActivityEmail;
-
-/**
- * Encapsulates functionality of ConnectivityManager for use in the Email application. In
- * particular, this class provides callbacks for connectivity lost, connectivity restored, and
- * background setting changed, as well as providing a method that waits for connectivity
- * to be available without holding a wake lock
- *
- * To use, EmailConnectivityManager mgr = new EmailConnectivityManager(context, "Name");
- * When done, mgr.unregister() to unregister the internal receiver
- *
- * TODO: Use this class in ExchangeService
- */
-public class EmailConnectivityManager extends BroadcastReceiver {
- private static final String TAG = "EmailConnectivityManager";
-
- // Loop time while waiting (stopgap in case we don't get a broadcast)
- private static final int CONNECTIVITY_WAIT_TIME = 10*60*1000;
-
- // Sentinel value for "no active network"
- public static final int NO_ACTIVE_NETWORK = -1;
-
- // The name of this manager (used for logging)
- private final String mName;
- // The monitor lock we use while waiting for connectivity
- private final Object mLock = new Object();
- // The instantiator's context
- private final Context mContext;
- // The wake lock used while running (so we don't fall asleep during execution/callbacks)
- private final WakeLock mWakeLock;
- private final android.net.ConnectivityManager mConnectivityManager;
-
- // Set when we abort waitForConnectivity() via stopWait
- private boolean mStop = false;
- // The thread waiting for connectivity
- private Thread mWaitThread;
- // Whether or not we're registered with the system connectivity manager
- private boolean mRegistered = true;
-
- public EmailConnectivityManager(Context context, String name) {
- mContext = context;
- mName = name;
- mConnectivityManager =
- (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
- PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
- mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, name);
- mContext.registerReceiver(this, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
- }
-
- public boolean isAutoSyncAllowed() {
- return ContentResolver.getMasterSyncAutomatically();
- }
-
- public void stopWait() {
- mStop = true;
- Thread thread= mWaitThread;
- if (thread != null) {
- thread.interrupt();
- }
- }
-
- /**
- * Called when network connectivity has been restored; this method should be overridden by
- * subclasses as necessary. NOTE: CALLED ON UI THREAD
- * @param networkType as defined by ConnectivityManager
- */
- public void onConnectivityRestored(int networkType) {
- }
-
- /**
- * Called when network connectivity has been lost; this method should be overridden by
- * subclasses as necessary. NOTE: CALLED ON UI THREAD
- * @param networkType as defined by ConnectivityManager
- */
- public void onConnectivityLost(int networkType) {
- }
-
- public void unregister() {
- try {
- mContext.unregisterReceiver(this);
- } catch (RuntimeException e) {
- // Don't crash if we didn't register
- } finally {
- mRegistered = false;
- }
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
- Bundle extras = intent.getExtras();
- if (extras != null) {
- NetworkInfo networkInfo =
- (NetworkInfo)extras.get(ConnectivityManager.EXTRA_NETWORK_INFO);
- if (networkInfo == null) return;
- State state = networkInfo.getState();
- if (state == State.CONNECTED) {
- synchronized (mLock) {
- mLock.notifyAll();
- }
- onConnectivityRestored(networkInfo.getType());
- } else if (state == State.DISCONNECTED) {
- onConnectivityLost(networkInfo.getType());
- }
- }
- }
- }
-
- /**
- * Request current connectivity status
- * @return whether there is connectivity at this time
- */
- public boolean hasConnectivity() {
- NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
- return (info != null);
- }
-
- /**
- * Get the type of the currently active data network
- * @return the type of the active network (or NO_ACTIVE_NETWORK)
- */
- public int getActiveNetworkType() {
- return getActiveNetworkType(mConnectivityManager);
- }
-
- static public int getActiveNetworkType(Context context) {
- ConnectivityManager cm =
- (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
- return getActiveNetworkType(cm);
- }
-
- static public int getActiveNetworkType(ConnectivityManager cm) {
- NetworkInfo info = cm.getActiveNetworkInfo();
- if (info == null) return NO_ACTIVE_NETWORK;
- return info.getType();
- }
-
- public void waitForConnectivity() {
- // If we're unregistered, throw an exception
- if (!mRegistered) {
- throw new IllegalStateException("ConnectivityManager not registered");
- }
- boolean waiting = false;
- mWaitThread = Thread.currentThread();
- // Acquire the wait lock while we work
- mWakeLock.acquire();
- try {
- while (!mStop) {
- NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
- if (info != null) {
- // We're done if there's an active network
- if (waiting) {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, mName + ": Connectivity wait ended");
- }
- }
- return;
- } else {
- if (!waiting) {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, mName + ": Connectivity waiting...");
- }
- waiting = true;
- }
- // Wait until a network is connected (or 10 mins), but let the device sleep
- synchronized (mLock) {
- // Don't hold a lock during our wait
- mWakeLock.release();
- try {
- mLock.wait(CONNECTIVITY_WAIT_TIME);
- } catch (InterruptedException e) {
- // This is fine; we just go around the loop again
- }
- // Get the lock back and check again for connectivity
- mWakeLock.acquire();
- }
- }
- }
- } finally {
- // Make sure we always release the wait lock
- if (mWakeLock.isHeld()) {
- mWakeLock.release();
- }
- mWaitThread = null;
- }
- }
-}
diff --git a/email2/src/com/android/email/FixedLengthInputStream.java b/email2/src/com/android/email/FixedLengthInputStream.java
deleted file mode 100644
index 753c03181..000000000
--- a/email2/src/com/android/email/FixedLengthInputStream.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A filtering InputStream that stops allowing reads after the given length has been read. This
- * is used to allow a client to read directly from an underlying protocol stream without reading
- * past where the protocol handler intended the client to read.
- */
-public class FixedLengthInputStream extends InputStream {
- private final InputStream mIn;
- private final int mLength;
- private int mCount;
-
- public FixedLengthInputStream(InputStream in, int length) {
- this.mIn = in;
- this.mLength = length;
- }
-
- @Override
- public int available() throws IOException {
- return mLength - mCount;
- }
-
- @Override
- public int read() throws IOException {
- if (mCount < mLength) {
- mCount++;
- return mIn.read();
- } else {
- return -1;
- }
- }
-
- @Override
- public int read(byte[] b, int offset, int length) throws IOException {
- if (mCount < mLength) {
- int d = mIn.read(b, offset, Math.min(mLength - mCount, length));
- if (d == -1) {
- return -1;
- } else {
- mCount += d;
- return d;
- }
- } else {
- return -1;
- }
- }
-
- @Override
- public int read(byte[] b) throws IOException {
- return read(b, 0, b.length);
- }
-
- public int getLength() {
- return mLength;
- }
-
- @Override
- public String toString() {
- return String.format("FixedLengthInputStream(in=%s, length=%d)", mIn.toString(), mLength);
- }
-}
diff --git a/email2/src/com/android/email/LegacyConversions.java b/email2/src/com/android/email/LegacyConversions.java
deleted file mode 100644
index 453c85459..000000000
--- a/email2/src/com/android/email/LegacyConversions.java
+++ /dev/null
@@ -1,478 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.util.Log;
-
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.internet.MimeBodyPart;
-import com.android.emailcommon.internet.MimeHeader;
-import com.android.emailcommon.internet.MimeMessage;
-import com.android.emailcommon.internet.MimeMultipart;
-import com.android.emailcommon.internet.MimeUtility;
-import com.android.emailcommon.internet.TextBody;
-import com.android.emailcommon.mail.Address;
-import com.android.emailcommon.mail.Flag;
-import com.android.emailcommon.mail.Message;
-import com.android.emailcommon.mail.Message.RecipientType;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.mail.Part;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.AttachmentUtilities;
-import com.android.mail.providers.UIProvider;
-
-import org.apache.commons.io.IOUtils;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-
-public class LegacyConversions {
-
- /** DO NOT CHECK IN "TRUE" */
- private static final boolean DEBUG_ATTACHMENTS = false;
-
- /** Used for mapping folder names to type codes (e.g. inbox, drafts, trash) */
- private static final HashMap<String, Integer>
- sServerMailboxNames = new HashMap<String, Integer>();
-
- /**
- * Values for HEADER_ANDROID_BODY_QUOTED_PART to tag body parts
- */
- /* package */ static final String BODY_QUOTED_PART_REPLY = "quoted-reply";
- /* package */ static final String BODY_QUOTED_PART_FORWARD = "quoted-forward";
- /* package */ static final String BODY_QUOTED_PART_INTRO = "quoted-intro";
-
- /**
- * Copy field-by-field from a "store" message to a "provider" message
- * @param message The message we've just downloaded (must be a MimeMessage)
- * @param localMessage The message we'd like to write into the DB
- * @result true if dirty (changes were made)
- */
- public static boolean updateMessageFields(EmailContent.Message localMessage, Message message,
- long accountId, long mailboxId) throws MessagingException {
-
- Address[] from = message.getFrom();
- Address[] to = message.getRecipients(Message.RecipientType.TO);
- Address[] cc = message.getRecipients(Message.RecipientType.CC);
- Address[] bcc = message.getRecipients(Message.RecipientType.BCC);
- Address[] replyTo = message.getReplyTo();
- String subject = message.getSubject();
- Date sentDate = message.getSentDate();
- Date internalDate = message.getInternalDate();
-
- if (from != null && from.length > 0) {
- localMessage.mDisplayName = from[0].toFriendly();
- }
- if (sentDate != null) {
- localMessage.mTimeStamp = sentDate.getTime();
- }
- if (subject != null) {
- localMessage.mSubject = subject;
- }
- localMessage.mFlagRead = message.isSet(Flag.SEEN);
- if (message.isSet(Flag.ANSWERED)) {
- localMessage.mFlags |= EmailContent.Message.FLAG_REPLIED_TO;
- }
-
- // Keep the message in the "unloaded" state until it has (at least) a display name.
- // This prevents early flickering of empty messages in POP download.
- if (localMessage.mFlagLoaded != EmailContent.Message.FLAG_LOADED_COMPLETE) {
- if (localMessage.mDisplayName == null || "".equals(localMessage.mDisplayName)) {
- localMessage.mFlagLoaded = EmailContent.Message.FLAG_LOADED_UNLOADED;
- } else {
- localMessage.mFlagLoaded = EmailContent.Message.FLAG_LOADED_PARTIAL;
- }
- }
- localMessage.mFlagFavorite = message.isSet(Flag.FLAGGED);
-// public boolean mFlagAttachment = false;
-// public int mFlags = 0;
-
- localMessage.mServerId = message.getUid();
- if (internalDate != null) {
- localMessage.mServerTimeStamp = internalDate.getTime();
- }
-// public String mClientId;
-
- // Only replace the local message-id if a new one was found. This is seen in some ISP's
- // which may deliver messages w/o a message-id header.
- String messageId = ((MimeMessage)message).getMessageId();
- if (messageId != null) {
- localMessage.mMessageId = messageId;
- }
-
-// public long mBodyKey;
- localMessage.mMailboxKey = mailboxId;
- localMessage.mAccountKey = accountId;
-
- if (from != null && from.length > 0) {
- localMessage.mFrom = Address.pack(from);
- }
-
- localMessage.mTo = Address.pack(to);
- localMessage.mCc = Address.pack(cc);
- localMessage.mBcc = Address.pack(bcc);
- localMessage.mReplyTo = Address.pack(replyTo);
-
-// public String mText;
-// public String mHtml;
-// public String mTextReply;
-// public String mHtmlReply;
-
-// // Can be used while building messages, but is NOT saved by the Provider
-// transient public ArrayList<Attachment> mAttachments = null;
-
- return true;
- }
-
- /**
- * Copy attachments from MimeMessage to provider Message.
- *
- * @param context a context for file operations
- * @param localMessage the attachments will be built against this message
- * @param attachments the attachments to add
- * @throws IOException
- */
- public static void updateAttachments(Context context, EmailContent.Message localMessage,
- ArrayList<Part> attachments) throws MessagingException, IOException {
- localMessage.mAttachments = null;
- for (Part attachmentPart : attachments) {
- addOneAttachment(context, localMessage, attachmentPart);
- }
- }
-
- /**
- * Add a single attachment part to the message
- *
- * This will skip adding attachments if they are already found in the attachments table.
- * The heuristic for this will fail (false-positive) if two identical attachments are
- * included in a single POP3 message.
- * TODO: Fix that, by (elsewhere) simulating an mLocation value based on the attachments
- * position within the list of multipart/mixed elements. This would make every POP3 attachment
- * unique, and might also simplify the code (since we could just look at the positions, and
- * ignore the filename, etc.)
- *
- * TODO: Take a closer look at encoding and deal with it if necessary.
- *
- * @param context a context for file operations
- * @param localMessage the attachments will be built against this message
- * @param part a single attachment part from POP or IMAP
- * @throws IOException
- */
- private static void addOneAttachment(Context context, EmailContent.Message localMessage,
- Part part) throws MessagingException, IOException {
-
- Attachment localAttachment = new Attachment();
-
- // Transfer fields from mime format to provider format
- String contentType = MimeUtility.unfoldAndDecode(part.getContentType());
- String name = MimeUtility.getHeaderParameter(contentType, "name");
- if (name == null) {
- String contentDisposition = MimeUtility.unfoldAndDecode(part.getDisposition());
- name = MimeUtility.getHeaderParameter(contentDisposition, "filename");
- }
-
- // Incoming attachment: Try to pull size from disposition (if not downloaded yet)
- long size = 0;
- String disposition = part.getDisposition();
- if (disposition != null) {
- String s = MimeUtility.getHeaderParameter(disposition, "size");
- if (s != null) {
- size = Long.parseLong(s);
- }
- }
-
- // Get partId for unloaded IMAP attachments (if any)
- // This is only provided (and used) when we have structure but not the actual attachment
- String[] partIds = part.getHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA);
- String partId = partIds != null ? partIds[0] : null;
-
- // Run the mime type through inferMimeType in case we have something generic and can do
- // better using the filename extension
- String mimeType = AttachmentUtilities.inferMimeType(name, part.getMimeType());
- localAttachment.mMimeType = mimeType;
- localAttachment.mFileName = name;
- localAttachment.mSize = size; // May be reset below if file handled
- localAttachment.mContentId = part.getContentId();
- localAttachment.mContentUri = null; // Will be rewritten by saveAttachmentBody
- localAttachment.mMessageKey = localMessage.mId;
- localAttachment.mLocation = partId;
- localAttachment.mEncoding = "B"; // TODO - convert other known encodings
- localAttachment.mAccountKey = localMessage.mAccountKey;
-
- if (DEBUG_ATTACHMENTS) {
- Log.d(Logging.LOG_TAG, "Add attachment " + localAttachment);
- }
-
- // To prevent duplication - do we already have a matching attachment?
- // The fields we'll check for equality are:
- // mFileName, mMimeType, mContentId, mMessageKey, mLocation
- // NOTE: This will false-positive if you attach the exact same file, twice, to a POP3
- // message. We can live with that - you'll get one of the copies.
- Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, localMessage.mId);
- Cursor cursor = context.getContentResolver().query(uri, Attachment.CONTENT_PROJECTION,
- null, null, null);
- boolean attachmentFoundInDb = false;
- try {
- while (cursor.moveToNext()) {
- Attachment dbAttachment = new Attachment();
- dbAttachment.restore(cursor);
- // We test each of the fields here (instead of in SQL) because they may be
- // null, or may be strings.
- if (stringNotEqual(dbAttachment.mFileName, localAttachment.mFileName)) continue;
- if (stringNotEqual(dbAttachment.mMimeType, localAttachment.mMimeType)) continue;
- if (stringNotEqual(dbAttachment.mContentId, localAttachment.mContentId)) continue;
- if (stringNotEqual(dbAttachment.mLocation, localAttachment.mLocation)) continue;
- // We found a match, so use the existing attachment id, and stop looking/looping
- attachmentFoundInDb = true;
- localAttachment.mId = dbAttachment.mId;
- if (DEBUG_ATTACHMENTS) {
- Log.d(Logging.LOG_TAG, "Skipped, found db attachment " + dbAttachment);
- }
- break;
- }
- } finally {
- cursor.close();
- }
-
- // Save the attachment (so far) in order to obtain an id
- if (!attachmentFoundInDb) {
- localAttachment.save(context);
- }
-
- // If an attachment body was actually provided, we need to write the file now
- saveAttachmentBody(context, part, localAttachment, localMessage.mAccountKey);
-
- if (localMessage.mAttachments == null) {
- localMessage.mAttachments = new ArrayList<Attachment>();
- }
- localMessage.mAttachments.add(localAttachment);
- localMessage.mFlagAttachment = true;
- }
-
- /**
- * Helper for addOneAttachment that compares two strings, deals with nulls, and treats
- * nulls and empty strings as equal.
- */
- /* package */ static boolean stringNotEqual(String a, String b) {
- if (a == null && b == null) return false; // fast exit for two null strings
- if (a == null) a = "";
- if (b == null) b = "";
- return !a.equals(b);
- }
-
- /**
- * Save the body part of a single attachment, to a file in the attachments directory.
- */
- public static void saveAttachmentBody(Context context, Part part, Attachment localAttachment,
- long accountId) throws MessagingException, IOException {
- if (part.getBody() != null) {
- long attachmentId = localAttachment.mId;
-
- InputStream in = part.getBody().getInputStream();
-
- File saveIn = AttachmentUtilities.getAttachmentDirectory(context, accountId);
- if (!saveIn.exists()) {
- saveIn.mkdirs();
- }
- File saveAs = AttachmentUtilities.getAttachmentFilename(context, accountId,
- attachmentId);
- saveAs.createNewFile();
- FileOutputStream out = new FileOutputStream(saveAs);
- long copySize = IOUtils.copy(in, out);
- in.close();
- out.close();
-
- // update the attachment with the extra information we now know
- String contentUriString = AttachmentUtilities.getAttachmentUri(
- accountId, attachmentId).toString();
-
- localAttachment.mSize = copySize;
- localAttachment.mContentUri = contentUriString;
-
- // update the attachment in the database as well
- ContentValues cv = new ContentValues();
- cv.put(AttachmentColumns.SIZE, copySize);
- cv.put(AttachmentColumns.CONTENT_URI, contentUriString);
- cv.put(AttachmentColumns.UI_STATE, UIProvider.AttachmentState.SAVED);
- Uri uri = ContentUris.withAppendedId(Attachment.CONTENT_URI, attachmentId);
- context.getContentResolver().update(uri, cv, null, null);
- }
- }
-
- /**
- * Read a complete Provider message into a legacy message (for IMAP upload). This
- * is basically the equivalent of LocalFolder.getMessages() + LocalFolder.fetch().
- */
- public static Message makeMessage(Context context, EmailContent.Message localMessage)
- throws MessagingException {
- MimeMessage message = new MimeMessage();
-
- // LocalFolder.getMessages() equivalent: Copy message fields
- message.setSubject(localMessage.mSubject == null ? "" : localMessage.mSubject);
- Address[] from = Address.unpack(localMessage.mFrom);
- if (from.length > 0) {
- message.setFrom(from[0]);
- }
- message.setSentDate(new Date(localMessage.mTimeStamp));
- message.setUid(localMessage.mServerId);
- message.setFlag(Flag.DELETED,
- localMessage.mFlagLoaded == EmailContent.Message.FLAG_LOADED_DELETED);
- message.setFlag(Flag.SEEN, localMessage.mFlagRead);
- message.setFlag(Flag.FLAGGED, localMessage.mFlagFavorite);
-// message.setFlag(Flag.DRAFT, localMessage.mMailboxKey == draftMailboxKey);
- message.setRecipients(RecipientType.TO, Address.unpack(localMessage.mTo));
- message.setRecipients(RecipientType.CC, Address.unpack(localMessage.mCc));
- message.setRecipients(RecipientType.BCC, Address.unpack(localMessage.mBcc));
- message.setReplyTo(Address.unpack(localMessage.mReplyTo));
- message.setInternalDate(new Date(localMessage.mServerTimeStamp));
- message.setMessageId(localMessage.mMessageId);
-
- // LocalFolder.fetch() equivalent: build body parts
- message.setHeader(MimeHeader.HEADER_CONTENT_TYPE, "multipart/mixed");
- MimeMultipart mp = new MimeMultipart();
- mp.setSubType("mixed");
- message.setBody(mp);
-
- try {
- addTextBodyPart(mp, "text/html", null,
- EmailContent.Body.restoreBodyHtmlWithMessageId(context, localMessage.mId));
- } catch (RuntimeException rte) {
- Log.d(Logging.LOG_TAG, "Exception while reading html body " + rte.toString());
- }
-
- try {
- addTextBodyPart(mp, "text/plain", null,
- EmailContent.Body.restoreBodyTextWithMessageId(context, localMessage.mId));
- } catch (RuntimeException rte) {
- Log.d(Logging.LOG_TAG, "Exception while reading text body " + rte.toString());
- }
-
- boolean isReply = (localMessage.mFlags & EmailContent.Message.FLAG_TYPE_REPLY) != 0;
- boolean isForward = (localMessage.mFlags & EmailContent.Message.FLAG_TYPE_FORWARD) != 0;
-
- // If there is a quoted part (forwarding or reply), add the intro first, and then the
- // rest of it. If it is opened in some other viewer, it will (hopefully) be displayed in
- // the same order as we've just set up the blocks: composed text, intro, replied text
- if (isReply || isForward) {
- try {
- addTextBodyPart(mp, "text/plain", BODY_QUOTED_PART_INTRO,
- EmailContent.Body.restoreIntroTextWithMessageId(context, localMessage.mId));
- } catch (RuntimeException rte) {
- Log.d(Logging.LOG_TAG, "Exception while reading text reply " + rte.toString());
- }
-
- String replyTag = isReply ? BODY_QUOTED_PART_REPLY : BODY_QUOTED_PART_FORWARD;
- try {
- addTextBodyPart(mp, "text/html", replyTag,
- EmailContent.Body.restoreReplyHtmlWithMessageId(context, localMessage.mId));
- } catch (RuntimeException rte) {
- Log.d(Logging.LOG_TAG, "Exception while reading html reply " + rte.toString());
- }
-
- try {
- addTextBodyPart(mp, "text/plain", replyTag,
- EmailContent.Body.restoreReplyTextWithMessageId(context, localMessage.mId));
- } catch (RuntimeException rte) {
- Log.d(Logging.LOG_TAG, "Exception while reading text reply " + rte.toString());
- }
- }
-
- // Attachments
- // TODO: Make sure we deal with these as structures and don't accidentally upload files
-// Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, localMessage.mId);
-// Cursor attachments = context.getContentResolver().query(uri, Attachment.CONTENT_PROJECTION,
-// null, null, null);
-// try {
-//
-// } finally {
-// attachments.close();
-// }
-
- return message;
- }
-
- /**
- * Helper method to add a body part for a given type of text, if found
- *
- * @param mp The text body part will be added to this multipart
- * @param contentType The content-type of the text being added
- * @param quotedPartTag If non-null, HEADER_ANDROID_BODY_QUOTED_PART will be set to this value
- * @param partText The text to add. If null, nothing happens
- */
- private static void addTextBodyPart(MimeMultipart mp, String contentType, String quotedPartTag,
- String partText) throws MessagingException {
- if (partText == null) {
- return;
- }
- TextBody body = new TextBody(partText);
- MimeBodyPart bp = new MimeBodyPart(body, contentType);
- if (quotedPartTag != null) {
- bp.addHeader(MimeHeader.HEADER_ANDROID_BODY_QUOTED_PART, quotedPartTag);
- }
- mp.addBodyPart(bp);
- }
-
-
- /**
- * Infer mailbox type from mailbox name. Used by MessagingController (for live folder sync).
- */
- public static synchronized int inferMailboxTypeFromName(Context context, String mailboxName) {
- if (sServerMailboxNames.size() == 0) {
- // preload the hashmap, one time only
- sServerMailboxNames.put(
- context.getString(R.string.mailbox_name_server_inbox).toLowerCase(),
- Mailbox.TYPE_INBOX);
- sServerMailboxNames.put(
- context.getString(R.string.mailbox_name_server_outbox).toLowerCase(),
- Mailbox.TYPE_OUTBOX);
- sServerMailboxNames.put(
- context.getString(R.string.mailbox_name_server_drafts).toLowerCase(),
- Mailbox.TYPE_DRAFTS);
- sServerMailboxNames.put(
- context.getString(R.string.mailbox_name_server_trash).toLowerCase(),
- Mailbox.TYPE_TRASH);
- sServerMailboxNames.put(
- context.getString(R.string.mailbox_name_server_sent).toLowerCase(),
- Mailbox.TYPE_SENT);
- sServerMailboxNames.put(
- context.getString(R.string.mailbox_name_server_junk).toLowerCase(),
- Mailbox.TYPE_JUNK);
- }
- if (mailboxName == null || mailboxName.length() == 0) {
- return Mailbox.TYPE_MAIL;
- }
- String lowerCaseName = mailboxName.toLowerCase();
- Integer type = sServerMailboxNames.get(lowerCaseName);
- if (type != null) {
- return type;
- }
- return Mailbox.TYPE_MAIL;
- }
-}
diff --git a/email2/src/com/android/email/MessagingExceptionStrings.java b/email2/src/com/android/email/MessagingExceptionStrings.java
deleted file mode 100644
index cb2c6070c..000000000
--- a/email2/src/com/android/email/MessagingExceptionStrings.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import com.android.emailcommon.mail.MessagingException;
-
-import android.content.Context;
-
-/**
- * @return the error message associated with this exception.
- */
-public class MessagingExceptionStrings {
- public static String getErrorString(Context context, MessagingException e) {
- return context.getResources().getString(getErrorStringResourceId(e));
- }
-
- /**
- * @return the resource ID of the error message associated with this exception.
- */
- private static int getErrorStringResourceId(MessagingException e) {
- switch (e.getExceptionType()) {
- case MessagingException.IOERROR:
- return R.string.account_setup_failed_ioerror;
- case MessagingException.ATTACHMENT_NOT_FOUND:
- return R.string.attachment_not_found;
- case MessagingException.TLS_REQUIRED:
- return R.string.account_setup_failed_tls_required;
- case MessagingException.AUTH_REQUIRED:
- return R.string.account_setup_failed_auth_required;
- case MessagingException.GENERAL_SECURITY:
- return R.string.account_setup_failed_security;
- // TODO Generate a unique string for this case, which is the case
- // where the security policy needs to be updated.
- case MessagingException.SECURITY_POLICIES_REQUIRED:
- return R.string.account_setup_failed_security;
- case MessagingException.ACCESS_DENIED:
- return R.string.account_setup_failed_access_denied;
- case MessagingException.CLIENT_CERTIFICATE_ERROR:
- return R.string.account_setup_failed_certificate_inaccessible;
- }
- return R.string.status_network_error; // default
- }
-}
diff --git a/email2/src/com/android/email/NotificationController.java b/email2/src/com/android/email/NotificationController.java
deleted file mode 100644
index 42112fbd7..000000000
--- a/email2/src/com/android/email/NotificationController.java
+++ /dev/null
@@ -1,1070 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import android.app.Notification;
-import android.app.Notification.Builder;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.database.ContentObserver;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.media.AudioManager;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Process;
-import android.text.SpannableString;
-import android.text.TextUtils;
-import android.text.style.TextAppearanceSpan;
-import android.util.Log;
-
-import com.android.email.activity.ContactStatusLoader;
-import com.android.email.activity.setup.AccountSecurity;
-import com.android.email.activity.setup.AccountSettings;
-import com.android.email.provider.EmailProvider;
-import com.android.email.service.EmailBroadcastProcessorService;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.Address;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-import com.android.mail.providers.Conversation;
-import com.android.mail.providers.Folder;
-import com.android.mail.providers.UIProvider;
-import com.android.mail.utils.Utils;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.util.HashMap;
-import java.util.HashSet;
-
-/**
- * Class that manages notifications.
- */
-public class NotificationController {
- private static final String TAG = "NotificationController";
-
- /** Reserved for {@link com.android.exchange.CalendarSyncEnabler} */
- @SuppressWarnings("unused")
- private static final int NOTIFICATION_ID_EXCHANGE_CALENDAR_ADDED = 2;
- private static final int NOTIFICATION_ID_ATTACHMENT_WARNING = 3;
- private static final int NOTIFICATION_ID_PASSWORD_EXPIRING = 4;
- private static final int NOTIFICATION_ID_PASSWORD_EXPIRED = 5;
-
- private static final int NOTIFICATION_ID_BASE_MASK = 0xF0000000;
- private static final int NOTIFICATION_ID_BASE_NEW_MESSAGES = 0x10000000;
- private static final int NOTIFICATION_ID_BASE_LOGIN_WARNING = 0x20000000;
- private static final int NOTIFICATION_ID_BASE_SECURITY_NEEDED = 0x30000000;
- private static final int NOTIFICATION_ID_BASE_SECURITY_CHANGED = 0x40000000;
-
- /** Selection to retrieve accounts that should we notify user for changes */
- private final static String NOTIFIED_ACCOUNT_SELECTION =
- Account.FLAGS + "&" + Account.FLAGS_NOTIFY_NEW_MAIL + " != 0";
-
- private static final String NEW_MAIL_MAILBOX_ID = "com.android.email.new_mail.mailboxId";
- private static final String NEW_MAIL_MESSAGE_ID = "com.android.email.new_mail.messageId";
- private static final String NEW_MAIL_MESSAGE_COUNT = "com.android.email.new_mail.messageCount";
- private static final String NEW_MAIL_UNREAD_COUNT = "com.android.email.new_mail.unreadCount";
-
- private static NotificationThread sNotificationThread;
- private static Handler sNotificationHandler;
- private static NotificationController sInstance;
- private final Context mContext;
- private final NotificationManager mNotificationManager;
- private final AudioManager mAudioManager;
- private final Bitmap mGenericSenderIcon;
- private final Bitmap mGenericMultipleSenderIcon;
- private final Clock mClock;
- /** Maps account id to its observer */
- private final HashMap<Long, ContentObserver> mNotificationMap;
- private ContentObserver mAccountObserver;
-
- /**
- * Timestamp indicating when the last message notification sound was played.
- * Used for throttling.
- */
- private long mLastMessageNotifyTime;
-
- /**
- * Minimum interval between notification sounds.
- * Since a long sync (either on account setup or after a long period of being offline) can cause
- * several notifications consecutively, it can be pretty overwhelming to get a barrage of
- * notification sounds. Throttle them using this value.
- */
- private static final long MIN_SOUND_INTERVAL_MS = 15 * 1000; // 15 seconds
-
- /** Constructor */
- @VisibleForTesting
- NotificationController(Context context, Clock clock) {
- mContext = context.getApplicationContext();
- mNotificationManager = (NotificationManager) context.getSystemService(
- Context.NOTIFICATION_SERVICE);
- mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
- mGenericSenderIcon = BitmapFactory.decodeResource(mContext.getResources(),
- R.drawable.ic_contact_picture);
- mGenericMultipleSenderIcon = BitmapFactory.decodeResource(mContext.getResources(),
- R.drawable.ic_notification_multiple_mail_holo_dark);
- mClock = clock;
- mNotificationMap = new HashMap<Long, ContentObserver>();
- }
-
- /** Singleton access */
- public static synchronized NotificationController getInstance(Context context) {
- if (sInstance == null) {
- sInstance = new NotificationController(context, Clock.INSTANCE);
- }
- return sInstance;
- }
-
- /**
- * Return whether or not a notification, based on the passed-in id, needs to be "ongoing"
- * @param notificationId the notification id to check
- * @return whether or not the notification must be "ongoing"
- */
- private boolean needsOngoingNotification(int notificationId) {
- // "Security needed" must be ongoing so that the user doesn't close it; otherwise, sync will
- // be prevented until a reboot. Consider also doing this for password expired.
- return (notificationId & NOTIFICATION_ID_BASE_MASK) == NOTIFICATION_ID_BASE_SECURITY_NEEDED;
- }
-
- /**
- * Returns a {@link Notification.Builder}} for an event with the given account. The account
- * contains specific rules on ring tone usage and these will be used to modify the notification
- * behaviour.
- *
- * @param accountId The id of the account this notification is being built for.
- * @param ticker Text displayed when the notification is first shown. May be {@code null}.
- * @param title The first line of text. May NOT be {@code null}.
- * @param contentText The second line of text. May NOT be {@code null}.
- * @param intent The intent to start if the user clicks on the notification.
- * @param largeIcon A large icon. May be {@code null}
- * @param number A number to display using {@link Builder#setNumber(int)}. May
- * be {@code null}.
- * @param enableAudio If {@code false}, do not play any sound. Otherwise, play sound according
- * to the settings for the given account.
- * @return A {@link Notification} that can be sent to the notification service.
- */
- private Notification.Builder createBaseAccountNotificationBuilder(long accountId, String ticker,
- CharSequence title, String contentText, Intent intent, Bitmap largeIcon,
- Integer number, boolean enableAudio, boolean ongoing) {
- // Pending Intent
- PendingIntent pending = null;
- if (intent != null) {
- pending = PendingIntent.getActivity(
- mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
- }
-
- // NOTE: the ticker is not shown for notifications in the Holo UX
- final Notification.Builder builder = new Notification.Builder(mContext)
- .setContentTitle(title)
- .setContentText(contentText)
- .setContentIntent(pending)
- .setLargeIcon(largeIcon)
- .setNumber(number == null ? 0 : number)
- .setSmallIcon(R.drawable.stat_notify_email_generic)
- .setWhen(mClock.getTime())
- .setTicker(ticker)
- .setOngoing(ongoing);
-
- if (enableAudio) {
- Account account = Account.restoreAccountWithId(mContext, accountId);
- setupSoundAndVibration(builder, account);
- }
-
- return builder;
- }
-
- /**
- * Generic notifier for any account. Uses notification rules from account.
- *
- * @param accountId The account id this notification is being built for.
- * @param ticker Text displayed when the notification is first shown. May be {@code null}.
- * @param title The first line of text. May NOT be {@code null}.
- * @param contentText The second line of text. May NOT be {@code null}.
- * @param intent The intent to start if the user clicks on the notification.
- * @param notificationId The ID of the notification to register with the service.
- */
- private void showNotification(long accountId, String ticker, String title,
- String contentText, Intent intent, int notificationId) {
- final Notification.Builder builder = createBaseAccountNotificationBuilder(accountId, ticker,
- title, contentText, intent, null, null, true,
- needsOngoingNotification(notificationId));
- mNotificationManager.notify(notificationId, builder.getNotification());
- }
-
- /**
- * Returns a notification ID for new message notifications for the given account.
- */
- private int getNewMessageNotificationId(long mailboxId) {
- // We assume accountId will always be less than 0x0FFFFFFF; is there a better way?
- return (int) (NOTIFICATION_ID_BASE_NEW_MESSAGES + mailboxId);
- }
-
- /**
- * Tells the notification controller if it should be watching for changes to the message table.
- * This is the main life cycle method for message notifications. When we stop observing
- * database changes, we save the state [e.g. message ID and count] of the most recent
- * notification shown to the user. And, when we start observing database changes, we restore
- * the saved state.
- * @param watch If {@code true}, we register observers for all accounts whose settings have
- * notifications enabled. Otherwise, all observers are unregistered.
- */
- public void watchForMessages(final boolean watch) {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "Notifications being toggled: " + watch);
- }
- // Don't create the thread if we're only going to stop watching
- if (!watch && sNotificationThread == null) return;
-
- ensureHandlerExists();
- // Run this on the message notification handler
- sNotificationHandler.post(new Runnable() {
- @Override
- public void run() {
- ContentResolver resolver = mContext.getContentResolver();
- if (!watch) {
- unregisterMessageNotification(Account.ACCOUNT_ID_COMBINED_VIEW);
- if (mAccountObserver != null) {
- resolver.unregisterContentObserver(mAccountObserver);
- mAccountObserver = null;
- }
-
- // tear down the event loop
- sNotificationThread.quit();
- sNotificationThread = null;
- return;
- }
-
- // otherwise, start new observers for all notified accounts
- registerMessageNotification(Account.ACCOUNT_ID_COMBINED_VIEW);
- // If we're already observing account changes, don't do anything else
- if (mAccountObserver == null) {
- if (MailActivityEmail.DEBUG) {
- Log.i(Logging.LOG_TAG, "Observing account changes for notifications");
- }
- mAccountObserver = new AccountContentObserver(sNotificationHandler, mContext);
- resolver.registerContentObserver(Account.NOTIFIER_URI, true, mAccountObserver);
- }
- }
- });
- }
-
- /**
- * Ensures the notification handler exists and is ready to handle requests.
- */
- private static synchronized void ensureHandlerExists() {
- if (sNotificationThread == null) {
- sNotificationThread = new NotificationThread();
- sNotificationHandler = new Handler(sNotificationThread.getLooper());
- }
- }
-
- /**
- * Registers an observer for changes to mailboxes in the given account.
- * NOTE: This must be called on the notification handler thread.
- * @param accountId The ID of the account to register the observer for. May be
- * {@link Account#ACCOUNT_ID_COMBINED_VIEW} to register observers for all
- * accounts that allow for user notification.
- */
- private void registerMessageNotification(long accountId) {
- ContentResolver resolver = mContext.getContentResolver();
- if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- Cursor c = resolver.query(
- Account.CONTENT_URI, EmailContent.ID_PROJECTION,
- NOTIFIED_ACCOUNT_SELECTION, null, null);
- try {
- while (c.moveToNext()) {
- long id = c.getLong(EmailContent.ID_PROJECTION_COLUMN);
- registerMessageNotification(id);
- }
- } finally {
- c.close();
- }
- } else {
- ContentObserver obs = mNotificationMap.get(accountId);
- if (obs != null) return; // we're already observing; nothing to do
- if (MailActivityEmail.DEBUG) {
- Log.i(Logging.LOG_TAG, "Registering for notifications for account " + accountId);
- }
- ContentObserver observer = new MessageContentObserver(
- sNotificationHandler, mContext, accountId);
- resolver.registerContentObserver(Message.NOTIFIER_URI, true, observer);
- mNotificationMap.put(accountId, observer);
- // Now, ping the observer for any initial notifications
- observer.onChange(true);
- }
- }
-
- /**
- * Unregisters the observer for the given account. If the specified account does not have
- * a registered observer, no action is performed. This will not clear any existing notification
- * for the specified account. Use {@link NotificationManager#cancel(int)}.
- * NOTE: This must be called on the notification handler thread.
- * @param accountId The ID of the account to unregister from. To unregister all accounts that
- * have observers, specify an ID of {@link Account#ACCOUNT_ID_COMBINED_VIEW}.
- */
- private void unregisterMessageNotification(long accountId) {
- ContentResolver resolver = mContext.getContentResolver();
- if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- if (MailActivityEmail.DEBUG) {
- Log.i(Logging.LOG_TAG, "Unregistering notifications for all accounts");
- }
- // cancel all existing message observers
- for (ContentObserver observer : mNotificationMap.values()) {
- resolver.unregisterContentObserver(observer);
- }
- mNotificationMap.clear();
- } else {
- if (MailActivityEmail.DEBUG) {
- Log.i(Logging.LOG_TAG, "Unregistering notifications for account " + accountId);
- }
- ContentObserver observer = mNotificationMap.remove(accountId);
- if (observer != null) {
- resolver.unregisterContentObserver(observer);
- }
- }
- }
-
- /**
- * Returns a picture of the sender of the given message. If no picture is available, returns
- * {@code null}.
- *
- * NOTE: DO NOT CALL THIS METHOD FROM THE UI THREAD (DATABASE ACCESS)
- */
- private Bitmap getSenderPhoto(Message message) {
- Address sender = Address.unpackFirst(message.mFrom);
- if (sender == null) {
- return null;
- }
- String email = sender.getAddress();
- if (TextUtils.isEmpty(email)) {
- return null;
- }
- Bitmap photo = ContactStatusLoader.getContactInfo(mContext, email).mPhoto;
-
- if (photo != null) {
- final Resources res = mContext.getResources();
- final int idealIconHeight =
- res.getDimensionPixelSize(android.R.dimen.notification_large_icon_height);
- final int idealIconWidth =
- res.getDimensionPixelSize(android.R.dimen.notification_large_icon_width);
-
- if (photo.getHeight() < idealIconHeight) {
- // We should scale this image to fit the intended size
- photo = Bitmap.createScaledBitmap(
- photo, idealIconWidth, idealIconHeight, true);
- }
- }
- return photo;
- }
-
- public static final String EXTRA_ACCOUNT = "account";
- public static final String EXTRA_CONVERSATION = "conversationUri";
- public static final String EXTRA_FOLDER = "folder";
-
- private Intent createViewConversationIntent(Conversation conversation, Folder folder,
- com.android.mail.providers.Account account) {
- final Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
- intent.setDataAndType(conversation.uri, account.mimeType);
- intent.putExtra(EXTRA_ACCOUNT, account);
- intent.putExtra(EXTRA_FOLDER, folder);
- intent.putExtra(EXTRA_CONVERSATION, conversation);
- return intent;
- }
-
- private Cursor getUiCursor(Uri uri, String[] projection) {
- Cursor c = mContext.getContentResolver().query(uri, projection, null, null, null);
- if (c == null) return null;
- if (c.moveToFirst()) {
- return c;
- } else {
- c.close();
- return null;
- }
- }
-
- private Intent createViewConversationIntent(Message message) {
- Cursor c = getUiCursor(EmailProvider.uiUri("uiaccount", message.mAccountKey),
- UIProvider.ACCOUNTS_PROJECTION);
- if (c == null) {
- Log.w(TAG, "Can't find account for message " + message.mId);
- return null;
- }
- com.android.mail.providers.Account acct = new com.android.mail.providers.Account(c);
- c.close();
- c = getUiCursor(EmailProvider.uiUri("uifolder", message.mMailboxKey),
- UIProvider.FOLDERS_PROJECTION);
- if (c == null) {
- Log.w(TAG, "Can't find folder for message " + message.mId + ", folder " +
- message.mMailboxKey);
- return null;
- }
- Folder folder = new Folder(c);
- c.close();
- c = getUiCursor(EmailProvider.uiUri("uiconversation", message.mId),
- UIProvider.CONVERSATION_PROJECTION);
- if (c == null) {
- Log.w(TAG, "Can't find conversation for message " + message.mId);
- return null;
- }
- Conversation conv = new Conversation(c);
- c.close();
- return createViewConversationIntent(conv, folder, acct);
- }
-
- /**
- * Returns a "new message" notification for the given account.
- *
- * NOTE: DO NOT CALL THIS METHOD FROM THE UI THREAD (DATABASE ACCESS)
- */
- @VisibleForTesting
- Notification createNewMessageNotification(long mailboxId, long newMessageId,
- int unseenMessageCount, int unreadCount) {
- final Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, mailboxId);
- if (mailbox == null) {
- return null;
- }
- final Account account = Account.restoreAccountWithId(mContext, mailbox.mAccountKey);
- if (account == null) {
- return null;
- }
- // Get the latest message
- final Message message = Message.restoreMessageWithId(mContext, newMessageId);
- if (message == null) {
- return null; // no message found???
- }
-
- String senderName = Address.toFriendly(Address.unpack(message.mFrom));
- if (senderName == null) {
- senderName = ""; // Happens when a message has no from.
- }
- final boolean multipleUnseen = unseenMessageCount > 1;
- final Bitmap senderPhoto = multipleUnseen
- ? mGenericMultipleSenderIcon
- : getSenderPhoto(message);
- final SpannableString title = getNewMessageTitle(senderName, unseenMessageCount);
- // TODO: add in display name on the second line for the text, once framework supports
- // multiline texts.
- // Show account name if an inbox; otherwise mailbox name
- final String text = multipleUnseen
- ? ((mailbox.mType == Mailbox.TYPE_INBOX) ? account.mDisplayName :
- mailbox.mDisplayName)
- : message.mSubject;
- final Bitmap largeIcon = senderPhoto != null ? senderPhoto : mGenericSenderIcon;
- final Integer number = unreadCount > 1 ? unreadCount : null;
- Intent intent = createViewConversationIntent(message);
- if (intent == null) {
- return null;
- }
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |
- Intent.FLAG_ACTIVITY_TASK_ON_HOME);
- long now = mClock.getTime();
- boolean enableAudio = (now - mLastMessageNotifyTime) > MIN_SOUND_INTERVAL_MS;
- final Notification.Builder builder = createBaseAccountNotificationBuilder(
- mailbox.mAccountKey, title.toString(), title, text,
- intent, largeIcon, number, enableAudio, false);
- if (Utils.isRunningJellybeanOrLater()) {
- // For a new-style notification
- if (multipleUnseen) {
- final Cursor messageCursor =
- mContext.getContentResolver().query(ContentUris.withAppendedId(
- EmailContent.MAILBOX_NOTIFICATION_URI, mailbox.mAccountKey),
- EmailContent.NOTIFICATION_PROJECTION, null, null, null);
-
- try {
- if (messageCursor != null && messageCursor.getCount() > 0) {
- final int maxNumDigestItems = mContext.getResources().getInteger(
- R.integer.max_num_notification_digest_items);
- // The body of the notification is the account name, or the label name.
- builder.setSubText(text);
-
- Notification.InboxStyle digest = new Notification.InboxStyle(builder);
-
- digest.setBigContentTitle(title);
-
- int numDigestItems = 0;
- // We can assume that the current position of the cursor is on the
- // newest message
- messageCursor.moveToFirst();
- do {
- final long messageId =
- messageCursor.getLong(EmailContent.ID_PROJECTION_COLUMN);
-
- // Get the latest message
- final Message digestMessage =
- Message.restoreMessageWithId(mContext, messageId);
- if (digestMessage != null) {
- final CharSequence digestLine =
- getSingleMessageInboxLine(mContext, digestMessage);
- digest.addLine(digestLine);
- numDigestItems++;
- }
- } while (numDigestItems <= maxNumDigestItems && messageCursor.moveToNext());
-
- // We want to clear the content text in this case. The content text would
- // have been set in createBaseAccountNotificationBuilder, but since the
- // same string was set in as the subtext, we don't want to show a
- // duplicate string.
- builder.setContentText(null);
- }
- } finally {
- if (messageCursor != null) {
- messageCursor.close();
- }
- }
- } else {
- // The notification content will be the subject of the conversation.
- builder.setContentText(getSingleMessageLittleText(mContext, message.mSubject));
-
- // The notification subtext will be the subject of the conversation for inbox
- // notifications, or will based on the the label name for user label notifications.
- builder.setSubText(account.mDisplayName);
-
- final Notification.BigTextStyle bigText = new Notification.BigTextStyle(builder);
- bigText.bigText(getSingleMessageBigText(mContext, message));
- }
- }
-
- mLastMessageNotifyTime = now;
- return builder.getNotification();
- }
-
- /**
- * Sets the bigtext for a notification for a single new conversation
- * @param context
- * @param message New message that triggered the notification.
- * @return a {@link CharSequence} suitable for use in {@link Notification.BigTextStyle}
- */
- private static CharSequence getSingleMessageInboxLine(Context context, Message message) {
- final String subject = message.mSubject;
- final String snippet = message.mSnippet;
- final String senders = Address.toFriendly(Address.unpack(message.mFrom));
-
- final String subjectSnippet = !TextUtils.isEmpty(subject) ? subject : snippet;
-
- final TextAppearanceSpan notificationPrimarySpan =
- new TextAppearanceSpan(context, R.style.NotificationPrimaryText);
-
- if (TextUtils.isEmpty(senders)) {
- // If the senders are empty, just use the subject/snippet.
- return subjectSnippet;
- }
- else if (TextUtils.isEmpty(subjectSnippet)) {
- // If the subject/snippet is empty, just use the senders.
- final SpannableString spannableString = new SpannableString(senders);
- spannableString.setSpan(notificationPrimarySpan, 0, senders.length(), 0);
-
- return spannableString;
- } else {
- final String formatString = context.getResources().getString(
- R.string.multiple_new_message_notification_item);
- final TextAppearanceSpan notificationSecondarySpan =
- new TextAppearanceSpan(context, R.style.NotificationSecondaryText);
-
- final String instantiatedString = String.format(formatString, senders, subjectSnippet);
-
- final SpannableString spannableString = new SpannableString(instantiatedString);
-
- final boolean isOrderReversed = formatString.indexOf("%2$s") <
- formatString.indexOf("%1$s");
- final int primaryOffset =
- (isOrderReversed ? instantiatedString.lastIndexOf(senders) :
- instantiatedString.indexOf(senders));
- final int secondaryOffset =
- (isOrderReversed ? instantiatedString.lastIndexOf(subjectSnippet) :
- instantiatedString.indexOf(subjectSnippet));
- spannableString.setSpan(notificationPrimarySpan,
- primaryOffset, primaryOffset + senders.length(), 0);
- spannableString.setSpan(notificationSecondarySpan,
- secondaryOffset, secondaryOffset + subjectSnippet.length(), 0);
- return spannableString;
- }
- }
-
- /**
- * Sets the bigtext for a notification for a single new conversation
- * @param context
- * @param subject Subject of the new message that triggered the notification
- * @return a {@link CharSequence} suitable for use in {@link Notification.ContentText}
- */
- private static CharSequence getSingleMessageLittleText(Context context, String subject) {
- if (subject == null) {
- return null;
- }
- final TextAppearanceSpan notificationSubjectSpan = new TextAppearanceSpan(
- context, R.style.NotificationPrimaryText);
-
- final SpannableString spannableString = new SpannableString(subject);
- spannableString.setSpan(notificationSubjectSpan, 0, subject.length(), 0);
-
- return spannableString;
- }
-
-
- /**
- * Sets the bigtext for a notification for a single new conversation
- * @param context
- * @param message New message that triggered the notification
- * @return a {@link CharSequence} suitable for use in {@link Notification.BigTextStyle}
- */
- private static CharSequence getSingleMessageBigText(Context context, Message message) {
- final TextAppearanceSpan notificationSubjectSpan = new TextAppearanceSpan(
- context, R.style.NotificationPrimaryText);
-
- final String subject = message.mSubject;
- final String snippet = message.mSnippet;
-
- if (TextUtils.isEmpty(subject)) {
- // If the subject is empty, just use the snippet.
- return snippet;
- }
- else if (TextUtils.isEmpty(snippet)) {
- // If the snippet is empty, just use the subject.
- final SpannableString spannableString = new SpannableString(subject);
- spannableString.setSpan(notificationSubjectSpan, 0, subject.length(), 0);
-
- return spannableString;
- } else {
- final String notificationBigTextFormat = context.getResources().getString(
- R.string.single_new_message_notification_big_text);
-
- // Localizers may change the order of the parameters, look at how the format
- // string is structured.
- final boolean isSubjectFirst = notificationBigTextFormat.indexOf("%2$s") >
- notificationBigTextFormat.indexOf("%1$s");
- final String bigText = String.format(notificationBigTextFormat, subject, snippet);
- final SpannableString spannableString = new SpannableString(bigText);
-
- final int subjectOffset =
- (isSubjectFirst ? bigText.indexOf(subject) : bigText.lastIndexOf(subject));
- spannableString.setSpan(notificationSubjectSpan,
- subjectOffset, subjectOffset + subject.length(), 0);
-
- return spannableString;
- }
- }
-
- /**
- * Creates a notification title for a new message. If there is only a single message,
- * show the sender name. Otherwise, show "X new messages".
- */
- @VisibleForTesting
- SpannableString getNewMessageTitle(String sender, int unseenCount) {
- String title;
- if (unseenCount > 1) {
- title = String.format(
- mContext.getString(R.string.notification_multiple_new_messages_fmt),
- unseenCount);
- } else {
- title = sender;
- }
- return new SpannableString(title);
- }
-
- /** Returns the system's current ringer mode */
- @VisibleForTesting
- int getRingerMode() {
- return mAudioManager.getRingerMode();
- }
-
- /** Sets up the notification's sound and vibration based upon account details. */
- @VisibleForTesting
- void setupSoundAndVibration(Notification.Builder builder, Account account) {
- final int flags = account.mFlags;
- final String ringtoneUri = account.mRingtoneUri;
- final boolean vibrate = (flags & Account.FLAGS_VIBRATE_ALWAYS) != 0;
- final boolean vibrateWhenSilent = (flags & Account.FLAGS_VIBRATE_WHEN_SILENT) != 0;
- final boolean isRingerSilent = getRingerMode() != AudioManager.RINGER_MODE_NORMAL;
-
- int defaults = Notification.DEFAULT_LIGHTS;
- if (vibrate || (vibrateWhenSilent && isRingerSilent)) {
- defaults |= Notification.DEFAULT_VIBRATE;
- }
-
- builder.setSound((ringtoneUri == null) ? null : Uri.parse(ringtoneUri))
- .setDefaults(defaults);
- }
-
- /**
- * Show (or update) a notification that the given attachment could not be forwarded. This
- * is a very unusual case, and perhaps we shouldn't even send a notification. For now,
- * it's helpful for debugging.
- *
- * NOTE: DO NOT CALL THIS METHOD FROM THE UI THREAD (DATABASE ACCESS)
- */
- public void showDownloadForwardFailedNotification(Attachment attachment) {
- Message message = Message.restoreMessageWithId(mContext, attachment.mMessageKey);
- if (message == null) return;
- Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, message.mMailboxKey);
- showNotification(mailbox.mAccountKey,
- mContext.getString(R.string.forward_download_failed_ticker),
- mContext.getString(R.string.forward_download_failed_title),
- attachment.mFileName,
- null,
- NOTIFICATION_ID_ATTACHMENT_WARNING);
- }
-
- /**
- * Returns a notification ID for login failed notifications for the given account account.
- */
- private int getLoginFailedNotificationId(long accountId) {
- return NOTIFICATION_ID_BASE_LOGIN_WARNING + (int)accountId;
- }
-
- /**
- * Show (or update) a notification that there was a login failure for the given account.
- *
- * NOTE: DO NOT CALL THIS METHOD FROM THE UI THREAD (DATABASE ACCESS)
- */
- public void showLoginFailedNotification(long accountId) {
- final Account account = Account.restoreAccountWithId(mContext, accountId);
- if (account == null) return;
- final Mailbox mailbox = Mailbox.restoreMailboxOfType(mContext, account.mId,
- Mailbox.TYPE_INBOX);
- if (mailbox == null) return;
- showNotification(mailbox.mAccountKey,
- mContext.getString(R.string.login_failed_ticker, account.mDisplayName),
- mContext.getString(R.string.login_failed_title),
- account.getDisplayName(),
- AccountSettings.createAccountSettingsIntent(mContext, accountId,
- account.mDisplayName),
- getLoginFailedNotificationId(accountId));
- }
-
- /**
- * Cancels the login failed notification for the given account.
- */
- public void cancelLoginFailedNotification(long accountId) {
- mNotificationManager.cancel(getLoginFailedNotificationId(accountId));
- }
-
- /**
- * Cancels the new message notification for a given mailbox
- */
- public void cancelNewMessageNotification(long mailboxId) {
- mNotificationManager.cancel(getNewMessageNotificationId(mailboxId));
- }
-
- /**
- * Show (or update) a notification that the user's password is expiring. The given account
- * is used to update the display text, but, all accounts share the same notification ID.
- *
- * NOTE: DO NOT CALL THIS METHOD FROM THE UI THREAD (DATABASE ACCESS)
- */
- public void showPasswordExpiringNotification(long accountId) {
- Account account = Account.restoreAccountWithId(mContext, accountId);
- if (account == null) return;
-
- Intent intent = AccountSecurity.actionDevicePasswordExpirationIntent(mContext,
- accountId, false);
- String accountName = account.getDisplayName();
- String ticker =
- mContext.getString(R.string.password_expire_warning_ticker_fmt, accountName);
- String title = mContext.getString(R.string.password_expire_warning_content_title);
- showNotification(accountId, ticker, title, accountName, intent,
- NOTIFICATION_ID_PASSWORD_EXPIRING);
- }
-
- /**
- * Show (or update) a notification that the user's password has expired. The given account
- * is used to update the display text, but, all accounts share the same notification ID.
- *
- * NOTE: DO NOT CALL THIS METHOD FROM THE UI THREAD (DATABASE ACCESS)
- */
- public void showPasswordExpiredNotification(long accountId) {
- Account account = Account.restoreAccountWithId(mContext, accountId);
- if (account == null) return;
-
- Intent intent = AccountSecurity.actionDevicePasswordExpirationIntent(mContext,
- accountId, true);
- String accountName = account.getDisplayName();
- String ticker = mContext.getString(R.string.password_expired_ticker);
- String title = mContext.getString(R.string.password_expired_content_title);
- showNotification(accountId, ticker, title, accountName, intent,
- NOTIFICATION_ID_PASSWORD_EXPIRED);
- }
-
- /**
- * Cancels any password expire notifications [both expired & expiring].
- */
- public void cancelPasswordExpirationNotifications() {
- mNotificationManager.cancel(NOTIFICATION_ID_PASSWORD_EXPIRING);
- mNotificationManager.cancel(NOTIFICATION_ID_PASSWORD_EXPIRED);
- }
-
- /**
- * Show (or update) a security needed notification. If tapped, the user is taken to a
- * dialog asking whether he wants to update his settings.
- */
- public void showSecurityNeededNotification(Account account) {
- Intent intent = AccountSecurity.actionUpdateSecurityIntent(mContext, account.mId, true);
- String accountName = account.getDisplayName();
- String ticker =
- mContext.getString(R.string.security_needed_ticker_fmt, accountName);
- String title = mContext.getString(R.string.security_notification_content_update_title);
- showNotification(account.mId, ticker, title, accountName, intent,
- (int)(NOTIFICATION_ID_BASE_SECURITY_NEEDED + account.mId));
- }
-
- /**
- * Show (or update) a security changed notification. If tapped, the user is taken to the
- * account settings screen where he can view the list of enforced policies
- */
- public void showSecurityChangedNotification(Account account) {
- Intent intent = AccountSettings.createAccountSettingsIntent(mContext, account.mId, null);
- String accountName = account.getDisplayName();
- String ticker =
- mContext.getString(R.string.security_changed_ticker_fmt, accountName);
- String title = mContext.getString(R.string.security_notification_content_change_title);
- showNotification(account.mId, ticker, title, accountName, intent,
- (int)(NOTIFICATION_ID_BASE_SECURITY_CHANGED + account.mId));
- }
-
- /**
- * Show (or update) a security unsupported notification. If tapped, the user is taken to the
- * account settings screen where he can view the list of unsupported policies
- */
- public void showSecurityUnsupportedNotification(Account account) {
- Intent intent = AccountSettings.createAccountSettingsIntent(mContext, account.mId, null);
- String accountName = account.getDisplayName();
- String ticker =
- mContext.getString(R.string.security_unsupported_ticker_fmt, accountName);
- String title = mContext.getString(R.string.security_notification_content_unsupported_title);
- showNotification(account.mId, ticker, title, accountName, intent,
- (int)(NOTIFICATION_ID_BASE_SECURITY_NEEDED + account.mId));
- }
-
- /**
- * Cancels all security needed notifications.
- */
- public void cancelSecurityNeededNotification() {
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- Cursor c = mContext.getContentResolver().query(Account.CONTENT_URI,
- Account.ID_PROJECTION, null, null, null);
- try {
- while (c.moveToNext()) {
- long id = c.getLong(Account.ID_PROJECTION_COLUMN);
- mNotificationManager.cancel(
- (int)(NOTIFICATION_ID_BASE_SECURITY_NEEDED + id));
- }
- }
- finally {
- c.close();
- }
- }});
- }
-
- /**
- * Observer invoked whenever a message we're notifying the user about changes.
- */
- private static class MessageContentObserver extends ContentObserver {
- private final Context mContext;
- private final long mAccountId;
-
- public MessageContentObserver(
- Handler handler, Context context, long accountId) {
- super(handler);
- mContext = context;
- mAccountId = accountId;
- }
-
- @Override
- public void onChange(boolean selfChange) {
- ContentObserver observer = sInstance.mNotificationMap.get(mAccountId);
- Account account = Account.restoreAccountWithId(mContext, mAccountId);
- if (observer == null || account == null) {
- Log.w(Logging.LOG_TAG, "Couldn't find account for changed message notification");
- return;
- }
-
- ContentResolver resolver = mContext.getContentResolver();
- Cursor c = resolver.query(ContentUris.withAppendedId(
- EmailContent.MAILBOX_NOTIFICATION_URI, mAccountId),
- EmailContent.NOTIFICATION_PROJECTION, null, null, null);
- try {
- while (c.moveToNext()) {
- long mailboxId = c.getLong(EmailContent.NOTIFICATION_MAILBOX_ID_COLUMN);
- if (mailboxId == 0) continue;
- int messageCount =
- c.getInt(EmailContent.NOTIFICATION_MAILBOX_MESSAGE_COUNT_COLUMN);
- int unreadCount =
- c.getInt(EmailContent.NOTIFICATION_MAILBOX_UNREAD_COUNT_COLUMN);
-
- Mailbox m = Mailbox.restoreMailboxWithId(mContext, mailboxId);
- long newMessageId = Utility.getFirstRowLong(mContext,
- ContentUris.withAppendedId(
- EmailContent.MAILBOX_MOST_RECENT_MESSAGE_URI, mailboxId),
- Message.ID_COLUMN_PROJECTION, null, null, null,
- Message.ID_MAILBOX_COLUMN_ID, -1L);
- Log.d(Logging.LOG_TAG, "Changes to " + account.mDisplayName + "/" +
- m.mDisplayName + ", count: " + messageCount + ", lastNotified: " +
- m.mLastNotifiedMessageKey + ", mostRecent: " + newMessageId);
- // Broadcast intent here
- Intent i = new Intent(EmailBroadcastProcessorService.ACTION_NOTIFY_NEW_MAIL);
- // Required by UIProvider
- i.setType(EmailProvider.EMAIL_APP_MIME_TYPE);
- i.putExtra(UIProvider.UpdateNotificationExtras.EXTRA_FOLDER,
- Uri.parse(EmailProvider.uiUriString("uifolder", mailboxId)));
- i.putExtra(UIProvider.UpdateNotificationExtras.EXTRA_ACCOUNT,
- Uri.parse(EmailProvider.uiUriString("uiaccount", m.mAccountKey)));
- i.putExtra(UIProvider.UpdateNotificationExtras.EXTRA_UPDATED_UNREAD_COUNT,
- unreadCount);
- // Required by our notification controller
- i.putExtra(NEW_MAIL_MAILBOX_ID, mailboxId);
- i.putExtra(NEW_MAIL_MESSAGE_ID, newMessageId);
- i.putExtra(NEW_MAIL_MESSAGE_COUNT, messageCount);
- i.putExtra(NEW_MAIL_UNREAD_COUNT, unreadCount);
- mContext.sendOrderedBroadcast(i, null);
- }
- } finally {
- c.close();
- }
- }
- }
-
- public static void notifyNewMail(Context context, Intent i) {
- Log.d(Logging.LOG_TAG, "Sending notification to system...");
- NotificationController nc = NotificationController.getInstance(context);
- ContentResolver resolver = context.getContentResolver();
- long mailboxId = i.getLongExtra(NEW_MAIL_MAILBOX_ID, -1);
- long newMessageId = i.getLongExtra(NEW_MAIL_MESSAGE_ID, -1);
- int messageCount = i.getIntExtra(NEW_MAIL_MESSAGE_COUNT, 0);
- int unreadCount = i.getIntExtra(NEW_MAIL_UNREAD_COUNT, 0);
- Notification n = nc.createNewMessageNotification(mailboxId, newMessageId,
- messageCount, unreadCount);
- if (n != null) {
- // Make the notification visible
- nc.mNotificationManager.notify(nc.getNewMessageNotificationId(mailboxId), n);
- }
- // Save away the new values
- ContentValues cv = new ContentValues();
- cv.put(MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY, newMessageId);
- cv.put(MailboxColumns.LAST_NOTIFIED_MESSAGE_COUNT, messageCount);
- resolver.update(ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId), cv,
- null, null);
- }
-
- /**
- * Observer invoked whenever an account is modified. This could mean the user changed the
- * notification settings.
- */
- private static class AccountContentObserver extends ContentObserver {
- private final Context mContext;
- public AccountContentObserver(Handler handler, Context context) {
- super(handler);
- mContext = context;
- }
-
- @Override
- public void onChange(boolean selfChange) {
- final ContentResolver resolver = mContext.getContentResolver();
- final Cursor c = resolver.query(Account.CONTENT_URI, EmailContent.ID_PROJECTION,
- NOTIFIED_ACCOUNT_SELECTION, null, null);
- final HashSet<Long> newAccountList = new HashSet<Long>();
- final HashSet<Long> removedAccountList = new HashSet<Long>();
- if (c == null) {
- // Suspender time ... theoretically, this will never happen
- Log.wtf(Logging.LOG_TAG, "#onChange(); NULL response for account id query");
- return;
- }
- try {
- while (c.moveToNext()) {
- long accountId = c.getLong(EmailContent.ID_PROJECTION_COLUMN);
- newAccountList.add(accountId);
- }
- } finally {
- if (c != null) {
- c.close();
- }
- }
- // NOTE: Looping over three lists is not necessarily the most efficient. However, the
- // account lists are going to be very small, so, this will not be necessarily bad.
- // Cycle through existing notification list and adjust as necessary
- for (long accountId : sInstance.mNotificationMap.keySet()) {
- if (!newAccountList.remove(accountId)) {
- // account id not in the current set of notifiable accounts
- removedAccountList.add(accountId);
- }
- }
- // A new account was added to the notification list
- for (long accountId : newAccountList) {
- sInstance.registerMessageNotification(accountId);
- }
- // An account was removed from the notification list
- for (long accountId : removedAccountList) {
- sInstance.unregisterMessageNotification(accountId);
- int notificationId = sInstance.getNewMessageNotificationId(accountId);
- sInstance.mNotificationManager.cancel(notificationId);
- }
- }
- }
-
- /**
- * Thread to handle all notification actions through its own {@link Looper}.
- */
- private static class NotificationThread implements Runnable {
- /** Lock to ensure proper initialization */
- private final Object mLock = new Object();
- /** The {@link Looper} that handles messages for this thread */
- private Looper mLooper;
-
- NotificationThread() {
- new Thread(null, this, "EmailNotification").start();
- synchronized (mLock) {
- while (mLooper == null) {
- try {
- mLock.wait();
- } catch (InterruptedException ex) {
- }
- }
- }
- }
-
- @Override
- public void run() {
- synchronized (mLock) {
- Looper.prepare();
- mLooper = Looper.myLooper();
- mLock.notifyAll();
- }
- Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
- Looper.loop();
- }
- void quit() {
- mLooper.quit();
- }
- Looper getLooper() {
- return mLooper;
- }
- }
-}
diff --git a/email2/src/com/android/email/PeekableInputStream.java b/email2/src/com/android/email/PeekableInputStream.java
deleted file mode 100644
index e1c35a2bd..000000000
--- a/email2/src/com/android/email/PeekableInputStream.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A filtering InputStream that allows single byte "peeks" without consuming the byte. The
- * client of this stream can call peek() to see the next available byte in the stream
- * and a subsequent read will still return the peeked byte.
- */
-public class PeekableInputStream extends InputStream {
- private final InputStream mIn;
- private boolean mPeeked;
- private int mPeekedByte;
-
- public PeekableInputStream(InputStream in) {
- this.mIn = in;
- }
-
- @Override
- public int read() throws IOException {
- if (!mPeeked) {
- return mIn.read();
- } else {
- mPeeked = false;
- return mPeekedByte;
- }
- }
-
- public int peek() throws IOException {
- if (!mPeeked) {
- mPeekedByte = read();
- mPeeked = true;
- }
- return mPeekedByte;
- }
-
- @Override
- public int read(byte[] b, int offset, int length) throws IOException {
- if (!mPeeked) {
- return mIn.read(b, offset, length);
- } else {
- b[0] = (byte)mPeekedByte;
- mPeeked = false;
- int r = mIn.read(b, offset + 1, length - 1);
- if (r == -1) {
- return 1;
- } else {
- return r + 1;
- }
- }
- }
-
- @Override
- public int read(byte[] b) throws IOException {
- return read(b, 0, b.length);
- }
-
- @Override
- public String toString() {
- return String.format("PeekableInputStream(in=%s, peeked=%b, peekedByte=%d)",
- mIn.toString(), mPeeked, mPeekedByte);
- }
-}
diff --git a/email2/src/com/android/email/Preferences.java b/email2/src/com/android/email/Preferences.java
deleted file mode 100644
index c4bb9360d..000000000
--- a/email2/src/com/android/email/Preferences.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-
-import java.util.HashSet;
-import java.util.UUID;
-
-public class Preferences {
-
- // Preferences file
- public static final String PREFERENCES_FILE = "AndroidMail.Main";
-
- // Preferences field names
- private static final String ACCOUNT_UUIDS = "accountUuids";
- private static final String ENABLE_DEBUG_LOGGING = "enableDebugLogging";
- private static final String ENABLE_EXCHANGE_LOGGING = "enableExchangeLogging";
- private static final String ENABLE_EXCHANGE_FILE_LOGGING = "enableExchangeFileLogging";
- private static final String INHIBIT_GRAPHICS_ACCELERATION = "inhibitGraphicsAcceleration";
- private static final String FORCE_ONE_MINUTE_REFRESH = "forceOneMinuteRefresh";
- private static final String ENABLE_STRICT_MODE = "enableStrictMode";
- private static final String DEVICE_UID = "deviceUID";
- private static final String ONE_TIME_INITIALIZATION_PROGRESS = "oneTimeInitializationProgress";
- private static final String AUTO_ADVANCE_DIRECTION = "autoAdvance";
- private static final String TEXT_ZOOM = "textZoom";
- private static final String BACKGROUND_ATTACHMENTS = "backgroundAttachments";
- private static final String TRUSTED_SENDERS = "trustedSenders";
- private static final String LAST_ACCOUNT_USED = "lastAccountUsed";
- private static final String REQUIRE_MANUAL_SYNC_DIALOG_SHOWN = "requireManualSyncDialogShown";
- private static final String CONFIRM_DELETE = "confirm_delete";
- private static final String CONFIRM_SEND = "confirm_send";
- private static final String HIDE_CHECKBOXES = "hide_checkboxes";
-
- public static final int AUTO_ADVANCE_NEWER = 0;
- public static final int AUTO_ADVANCE_OLDER = 1;
- public static final int AUTO_ADVANCE_MESSAGE_LIST = 2;
- // "move to older" was the behavior on older versions.
- private static final int AUTO_ADVANCE_DEFAULT = AUTO_ADVANCE_OLDER;
- private static final boolean CONFIRM_DELETE_DEFAULT = false;
- private static final boolean CONFIRM_SEND_DEFAULT = false;
- private static final boolean HIDE_CHECKBOXES_DEFAULT = false;
-
- // The following constants are used as offsets into R.array.general_preference_text_zoom_size.
- public static final int TEXT_ZOOM_TINY = 0;
- public static final int TEXT_ZOOM_SMALL = 1;
- public static final int TEXT_ZOOM_NORMAL = 2;
- public static final int TEXT_ZOOM_LARGE = 3;
- public static final int TEXT_ZOOM_HUGE = 4;
- // "normal" will be the default
- public static final int TEXT_ZOOM_DEFAULT = TEXT_ZOOM_NORMAL;
-
- // Starting something new here:
- // REPLY_ALL is saved by the framework (CheckBoxPreference's parent, Preference).
- // i.e. android:persistent=true in general_preferences.xml
- public static final String REPLY_ALL = "reply_all";
- // Reply All Default - when changing this, be sure to update general_preferences.xml
- public static final boolean REPLY_ALL_DEFAULT = false;
-
- private static Preferences sPreferences;
-
- private final SharedPreferences mSharedPreferences;
-
- /**
- * A set of trusted senders for whom images and external resources should automatically be
- * loaded for.
- * Lazilly created.
- */
- private HashSet<String> mTrustedSenders = null;
-
- private Preferences(Context context) {
- mSharedPreferences = context.getSharedPreferences(PREFERENCES_FILE, Context.MODE_PRIVATE);
- }
-
- /**
- * TODO need to think about what happens if this gets GCed along with the
- * Activity that initialized it. Do we lose ability to read Preferences in
- * further Activities? Maybe this should be stored in the Application
- * context.
- */
- public static synchronized Preferences getPreferences(Context context) {
- if (sPreferences == null) {
- sPreferences = new Preferences(context);
- }
- return sPreferences;
- }
-
- public static SharedPreferences getSharedPreferences(Context context) {
- return getPreferences(context).mSharedPreferences;
- }
-
- public static String getLegacyBackupPreference(Context context) {
- return getPreferences(context).mSharedPreferences.getString(ACCOUNT_UUIDS, null);
- }
-
- public static void clearLegacyBackupPreference(Context context) {
- getPreferences(context).mSharedPreferences.edit().remove(ACCOUNT_UUIDS).apply();
- }
-
- public void setEnableDebugLogging(boolean value) {
- mSharedPreferences.edit().putBoolean(ENABLE_DEBUG_LOGGING, value).apply();
- }
-
- public boolean getEnableDebugLogging() {
- return mSharedPreferences.getBoolean(ENABLE_DEBUG_LOGGING, false);
- }
-
- public void setEnableExchangeLogging(boolean value) {
- mSharedPreferences.edit().putBoolean(ENABLE_EXCHANGE_LOGGING, value).apply();
- }
-
- public boolean getEnableExchangeLogging() {
- return mSharedPreferences.getBoolean(ENABLE_EXCHANGE_LOGGING, false);
- }
-
- public void setEnableExchangeFileLogging(boolean value) {
- mSharedPreferences.edit().putBoolean(ENABLE_EXCHANGE_FILE_LOGGING, value).apply();
- }
-
- public boolean getEnableExchangeFileLogging() {
- return mSharedPreferences.getBoolean(ENABLE_EXCHANGE_FILE_LOGGING, false);
- }
-
- public void setInhibitGraphicsAcceleration(boolean value) {
- mSharedPreferences.edit().putBoolean(INHIBIT_GRAPHICS_ACCELERATION, value).apply();
- }
-
- public boolean getInhibitGraphicsAcceleration() {
- return mSharedPreferences.getBoolean(INHIBIT_GRAPHICS_ACCELERATION, false);
- }
-
- public void setForceOneMinuteRefresh(boolean value) {
- mSharedPreferences.edit().putBoolean(FORCE_ONE_MINUTE_REFRESH, value).apply();
- }
-
- public boolean getForceOneMinuteRefresh() {
- return mSharedPreferences.getBoolean(FORCE_ONE_MINUTE_REFRESH, false);
- }
-
- public void setEnableStrictMode(boolean value) {
- mSharedPreferences.edit().putBoolean(ENABLE_STRICT_MODE, value).apply();
- }
-
- public boolean getEnableStrictMode() {
- return mSharedPreferences.getBoolean(ENABLE_STRICT_MODE, false);
- }
-
- /**
- * Generate a new "device UID". This is local to Email app only, to prevent possibility
- * of correlation with any other user activities in any other apps.
- * @return a persistent, unique ID
- */
- public synchronized String getDeviceUID() {
- String result = mSharedPreferences.getString(DEVICE_UID, null);
- if (result == null) {
- result = UUID.randomUUID().toString();
- mSharedPreferences.edit().putString(DEVICE_UID, result).apply();
- }
- return result;
- }
-
- public int getOneTimeInitializationProgress() {
- return mSharedPreferences.getInt(ONE_TIME_INITIALIZATION_PROGRESS, 0);
- }
-
- public void setOneTimeInitializationProgress(int progress) {
- mSharedPreferences.edit().putInt(ONE_TIME_INITIALIZATION_PROGRESS, progress).apply();
- }
-
- public int getAutoAdvanceDirection() {
- return mSharedPreferences.getInt(AUTO_ADVANCE_DIRECTION, AUTO_ADVANCE_DEFAULT);
- }
-
- public void setAutoAdvanceDirection(int direction) {
- mSharedPreferences.edit().putInt(AUTO_ADVANCE_DIRECTION, direction).apply();
- }
-
- public boolean getHideCheckboxes() {
- return mSharedPreferences.getBoolean(HIDE_CHECKBOXES, HIDE_CHECKBOXES_DEFAULT);
- }
-
- public void setHideCheckboxes(boolean set) {
- mSharedPreferences.edit().putBoolean(HIDE_CHECKBOXES, set).apply();
- }
-
- public boolean getConfirmDelete() {
- return mSharedPreferences.getBoolean(CONFIRM_DELETE, CONFIRM_DELETE_DEFAULT);
- }
-
- public void setConfirmDelete(boolean set) {
- mSharedPreferences.edit().putBoolean(CONFIRM_DELETE, set).apply();
- }
-
- public boolean getConfirmSend() {
- return mSharedPreferences.getBoolean(CONFIRM_SEND, CONFIRM_SEND_DEFAULT);
- }
-
- public void setConfirmSend(boolean set) {
- mSharedPreferences.edit().putBoolean(CONFIRM_SEND, set).apply();
- }
-
- public int getTextZoom() {
- return mSharedPreferences.getInt(TEXT_ZOOM, TEXT_ZOOM_DEFAULT);
- }
-
- public void setTextZoom(int zoom) {
- mSharedPreferences.edit().putInt(TEXT_ZOOM, zoom).apply();
- }
-
- public boolean getBackgroundAttachments() {
- return mSharedPreferences.getBoolean(BACKGROUND_ATTACHMENTS, false);
- }
-
- public void setBackgroundAttachments(boolean allowed) {
- mSharedPreferences.edit().putBoolean(BACKGROUND_ATTACHMENTS, allowed).apply();
- }
-
- /**
- * Determines whether or not a sender should be trusted and images should automatically be
- * shown for messages by that sender.
- */
- public boolean shouldShowImagesFor(String email) {
- if (mTrustedSenders == null) {
- try {
- mTrustedSenders = parseEmailSet(mSharedPreferences.getString(TRUSTED_SENDERS, ""));
- } catch (JSONException e) {
- // Something went wrong, and the data is corrupt. Just clear it to be safe.
- Log.w(Logging.LOG_TAG, "Trusted sender set corrupted. Clearing");
- mSharedPreferences.edit().putString(TRUSTED_SENDERS, "").apply();
- mTrustedSenders = new HashSet<String>();
- }
- }
- return mTrustedSenders.contains(email);
- }
-
- /**
- * Marks a sender as trusted so that images from that sender will automatically be shown.
- */
- public void setSenderAsTrusted(String email) {
- if (!mTrustedSenders.contains(email)) {
- mTrustedSenders.add(email);
- mSharedPreferences
- .edit()
- .putString(TRUSTED_SENDERS, packEmailSet(mTrustedSenders))
- .apply();
- }
- }
-
- /**
- * Clears all trusted senders asynchronously.
- */
- public void clearTrustedSenders() {
- mTrustedSenders = new HashSet<String>();
- mSharedPreferences
- .edit()
- .putString(TRUSTED_SENDERS, packEmailSet(mTrustedSenders))
- .apply();
- }
-
- HashSet<String> parseEmailSet(String serialized) throws JSONException {
- HashSet<String> result = new HashSet<String>();
- if (!TextUtils.isEmpty(serialized)) {
- JSONArray arr = new JSONArray(serialized);
- for (int i = 0, len = arr.length(); i < len; i++) {
- result.add((String) arr.get(i));
- }
- }
- return result;
- }
-
- String packEmailSet(HashSet<String> set) {
- return new JSONArray(set).toString();
- }
-
- /**
- * Returns the last used account ID as set by {@link #setLastUsedAccountId}.
- * The system makes no attempt to automatically track what is considered a "use" - clients
- * are expected to call {@link #setLastUsedAccountId} manually.
- *
- * Note that the last used account may have been deleted in the background so there is also
- * no guarantee that the account exists.
- */
- public long getLastUsedAccountId() {
- return mSharedPreferences.getLong(LAST_ACCOUNT_USED, Account.NO_ACCOUNT);
- }
-
- /**
- * Sets the specified ID of the last account used. Treated as an opaque ID and does not
- * validate the value. Value is saved asynchronously.
- */
- public void setLastUsedAccountId(long accountId) {
- mSharedPreferences
- .edit()
- .putLong(LAST_ACCOUNT_USED, accountId)
- .apply();
- }
-
- /**
- * Gets whether the require manual sync dialog has been shown for the specified account.
- * It should only be shown once per account.
- */
- public boolean getHasShownRequireManualSync(Context context, Account account) {
- return getBoolean(context, account.getEmailAddress(), REQUIRE_MANUAL_SYNC_DIALOG_SHOWN,
- false);
- }
-
- /**
- * Sets whether the require manual sync dialog has been shown for the specified account.
- * It should only be shown once per account.
- */
- public void setHasShownRequireManualSync(Context context, Account account, boolean value) {
- setBoolean(context, account.getEmailAddress(), REQUIRE_MANUAL_SYNC_DIALOG_SHOWN, value);
- }
-
-
- /**
- * Get whether to show the manual sync dialog. This dialog is shown when the user is roaming,
- * connected to a mobile network, the administrator has set the RequireManualSyncWhenRoaming
- * flag to true, and the dialog has not been shown before for the supplied account.
- */
- public boolean shouldShowRequireManualSync(Context context, Account account) {
- return Account.isAutomaticSyncDisabledByRoaming(context, account.mId)
- && !getHasShownRequireManualSync(context, account);
- }
-
- public void clear() {
- mSharedPreferences.edit().clear().apply();
- }
-
- public void dump() {
- if (Logging.LOGD) {
- for (String key : mSharedPreferences.getAll().keySet()) {
- Log.v(Logging.LOG_TAG, key + " = " + mSharedPreferences.getAll().get(key));
- }
- }
- }
-
- /**
- * Utility method for setting a boolean value on a per-account preference.
- */
- private void setBoolean(Context context, String account, String key, Boolean value) {
- mSharedPreferences.edit().putBoolean(makeKey(account, key), value).apply();
- }
-
- /**
- * Utility method for getting a boolean value from a per-account preference.
- */
- private boolean getBoolean(Context context, String account, String key, boolean def) {
- return mSharedPreferences.getBoolean(makeKey(account, key), def);
- }
-
- /**
- * Utility method for creating a per account preference key.
- */
- private String makeKey(String account, String key) {
- return account != null ? account + "-" + key : key;
- }
-}
diff --git a/email2/src/com/android/email/RequireManualSyncDialog.java b/email2/src/com/android/email/RequireManualSyncDialog.java
deleted file mode 100644
index d1c60b9a2..000000000
--- a/email2/src/com/android/email/RequireManualSyncDialog.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import com.android.emailcommon.provider.Account;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.content.res.Resources;
-
-public class RequireManualSyncDialog extends AlertDialog implements OnClickListener {
-
- public RequireManualSyncDialog(Context context, Account account) {
- super(context);
- setMessage(context.getResources().getString(R.string.require_manual_sync_message));
- setButton(DialogInterface.BUTTON_POSITIVE, context.getString(android.R.string.ok), this);
- Preferences.getPreferences(context).setHasShownRequireManualSync(context, account, true);
- }
-
- /** {@inheritDoc} */
- public void onClick(DialogInterface dialog, int which) {
- // No-op.
- }
-} \ No newline at end of file
diff --git a/email2/src/com/android/email/ResourceHelper.java b/email2/src/com/android/email/ResourceHelper.java
deleted file mode 100644
index e3c15c12e..000000000
--- a/email2/src/com/android/email/ResourceHelper.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Paint;
-
-/**
- * Helper class to load resources.
- */
-public class ResourceHelper {
- public final static int UNDEFINED_RESOURCE_ID = -1;
-
- private static ResourceHelper sInstance;
- private final Context mContext;
- private final Resources mResources;
-
- private final int[] mAccountColors;
- private final Paint[] mAccountColorPaints;
- private final TypedArray mAccountColorArray;
-
- private ResourceHelper(Context context) {
- mContext = context.getApplicationContext();
- mResources = mContext.getResources();
-
- mAccountColorArray = mResources.obtainTypedArray(R.array.combined_view_account_colors);
- mAccountColors = mResources.getIntArray(R.array.combined_view_account_colors);
- mAccountColorPaints = new Paint[mAccountColors.length];
- for (int i = 0; i < mAccountColors.length; i++) {
- Paint p = new Paint();
- p.setColor(mAccountColors[i]);
- mAccountColorPaints[i] = p;
- }
- }
-
- public static synchronized ResourceHelper getInstance(Context context) {
- if (sInstance == null) {
- sInstance = new ResourceHelper(context);
- }
- return sInstance;
- }
-
- /* package */ int getAccountColorIndex(long accountId) {
- // The account ID is 1-based, so -1.
- // Use abs so that it'd work for -1 as well.
- return Math.abs((int) ((accountId - 1) % mAccountColors.length));
- }
-
- /**
- * @return color for an account.
- */
- public int getAccountColor(long accountId) {
- return mAccountColors[getAccountColorIndex(accountId)];
- }
-
- /**
- * @return The resource ID for an account color.
- * Otherwise, {@value #UNDEFINED_RESOURCE_ID} if color was not specified via ID.
- */
- public int getAccountColorId(long accountId) {
- return mAccountColorArray.getResourceId(getAccountColorIndex(accountId),
- UNDEFINED_RESOURCE_ID);
- }
-
- /**
- * @return {@link Paint} equivalent to {@link #getAccountColor}.
- */
- public Paint getAccountColorPaint(long accountId) {
- return mAccountColorPaints[getAccountColorIndex(accountId)];
- }
-}
diff --git a/email2/src/com/android/email/SecurityPolicy.java b/email2/src/com/android/email/SecurityPolicy.java
deleted file mode 100644
index 9b6cfb8bd..000000000
--- a/email2/src/com/android/email/SecurityPolicy.java
+++ /dev/null
@@ -1,856 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import android.app.admin.DeviceAdminInfo;
-import android.app.admin.DeviceAdminReceiver;
-import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
-import android.content.ContentProviderOperation;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.OperationApplicationException;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.email.provider.EmailProvider;
-import com.android.email.service.EmailBroadcastProcessorService;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.provider.EmailContent.PolicyColumns;
-import com.android.emailcommon.provider.Policy;
-import com.android.emailcommon.utility.TextUtilities;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.util.ArrayList;
-
-/**
- * Utility functions to support reading and writing security policies, and handshaking the device
- * into and out of various security states.
- */
-public class SecurityPolicy {
- private static final String TAG = "Email/SecurityPolicy";
- private static SecurityPolicy sInstance = null;
- private Context mContext;
- private DevicePolicyManager mDPM;
- private final ComponentName mAdminName;
- private Policy mAggregatePolicy;
-
- // Messages used for DevicePolicyManager callbacks
- private static final int DEVICE_ADMIN_MESSAGE_ENABLED = 1;
- private static final int DEVICE_ADMIN_MESSAGE_DISABLED = 2;
- private static final int DEVICE_ADMIN_MESSAGE_PASSWORD_CHANGED = 3;
- private static final int DEVICE_ADMIN_MESSAGE_PASSWORD_EXPIRING = 4;
-
- private static final String HAS_PASSWORD_EXPIRATION =
- PolicyColumns.PASSWORD_EXPIRATION_DAYS + ">0";
-
- /**
- * Get the security policy instance
- */
- public synchronized static SecurityPolicy getInstance(Context context) {
- if (sInstance == null) {
- sInstance = new SecurityPolicy(context.getApplicationContext());
- }
- return sInstance;
- }
-
- /**
- * Private constructor (one time only)
- */
- private SecurityPolicy(Context context) {
- mContext = context.getApplicationContext();
- mDPM = null;
- mAdminName = new ComponentName(context, PolicyAdmin.class);
- mAggregatePolicy = null;
- }
-
- /**
- * For testing only: Inject context into already-created instance
- */
- /* package */ void setContext(Context context) {
- mContext = context;
- }
-
- /**
- * Compute the aggregate policy for all accounts that require it, and record it.
- *
- * The business logic is as follows:
- * min password length take the max
- * password mode take the max (strongest mode)
- * max password fails take the min
- * max screen lock time take the min
- * require remote wipe take the max (logical or)
- * password history take the max (strongest mode)
- * password expiration take the min (strongest mode)
- * password complex chars take the max (strongest mode)
- * encryption take the max (logical or)
- *
- * @return a policy representing the strongest aggregate. If no policy sets are defined,
- * a lightweight "nothing required" policy will be returned. Never null.
- */
- @VisibleForTesting
- Policy computeAggregatePolicy() {
- boolean policiesFound = false;
- Policy aggregate = new Policy();
- aggregate.mPasswordMinLength = Integer.MIN_VALUE;
- aggregate.mPasswordMode = Integer.MIN_VALUE;
- aggregate.mPasswordMaxFails = Integer.MAX_VALUE;
- aggregate.mPasswordHistory = Integer.MIN_VALUE;
- aggregate.mPasswordExpirationDays = Integer.MAX_VALUE;
- aggregate.mPasswordComplexChars = Integer.MIN_VALUE;
- aggregate.mMaxScreenLockTime = Integer.MAX_VALUE;
- aggregate.mRequireRemoteWipe = false;
- aggregate.mRequireEncryption = false;
-
- // This can never be supported at this time. It exists only for historic reasons where
- // this was able to be supported prior to the introduction of proper removable storage
- // support for external storage.
- aggregate.mRequireEncryptionExternal = false;
-
- Cursor c = mContext.getContentResolver().query(Policy.CONTENT_URI,
- Policy.CONTENT_PROJECTION, null, null, null);
- Policy policy = new Policy();
- try {
- while (c.moveToNext()) {
- policy.restore(c);
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "Aggregate from: " + policy);
- }
- aggregate.mPasswordMinLength =
- Math.max(policy.mPasswordMinLength, aggregate.mPasswordMinLength);
- aggregate.mPasswordMode = Math.max(policy.mPasswordMode, aggregate.mPasswordMode);
- if (policy.mPasswordMaxFails > 0) {
- aggregate.mPasswordMaxFails =
- Math.min(policy.mPasswordMaxFails, aggregate.mPasswordMaxFails);
- }
- if (policy.mMaxScreenLockTime > 0) {
- aggregate.mMaxScreenLockTime = Math.min(policy.mMaxScreenLockTime,
- aggregate.mMaxScreenLockTime);
- }
- if (policy.mPasswordHistory > 0) {
- aggregate.mPasswordHistory =
- Math.max(policy.mPasswordHistory, aggregate.mPasswordHistory);
- }
- if (policy.mPasswordExpirationDays > 0) {
- aggregate.mPasswordExpirationDays =
- Math.min(policy.mPasswordExpirationDays, aggregate.mPasswordExpirationDays);
- }
- if (policy.mPasswordComplexChars > 0) {
- aggregate.mPasswordComplexChars = Math.max(policy.mPasswordComplexChars,
- aggregate.mPasswordComplexChars);
- }
- aggregate.mRequireRemoteWipe |= policy.mRequireRemoteWipe;
- aggregate.mRequireEncryption |= policy.mRequireEncryption;
- aggregate.mDontAllowCamera |= policy.mDontAllowCamera;
- policiesFound = true;
- }
- } finally {
- c.close();
- }
- if (policiesFound) {
- // final cleanup pass converts any untouched min/max values to zero (not specified)
- if (aggregate.mPasswordMinLength == Integer.MIN_VALUE) aggregate.mPasswordMinLength = 0;
- if (aggregate.mPasswordMode == Integer.MIN_VALUE) aggregate.mPasswordMode = 0;
- if (aggregate.mPasswordMaxFails == Integer.MAX_VALUE) aggregate.mPasswordMaxFails = 0;
- if (aggregate.mMaxScreenLockTime == Integer.MAX_VALUE) aggregate.mMaxScreenLockTime = 0;
- if (aggregate.mPasswordHistory == Integer.MIN_VALUE) aggregate.mPasswordHistory = 0;
- if (aggregate.mPasswordExpirationDays == Integer.MAX_VALUE)
- aggregate.mPasswordExpirationDays = 0;
- if (aggregate.mPasswordComplexChars == Integer.MIN_VALUE)
- aggregate.mPasswordComplexChars = 0;
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "Calculated Aggregate: " + aggregate);
- }
- return aggregate;
- }
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "Calculated Aggregate: no policy");
- }
- return Policy.NO_POLICY;
- }
-
- /**
- * Return updated aggregate policy, from cached value if possible
- */
- public synchronized Policy getAggregatePolicy() {
- if (mAggregatePolicy == null) {
- mAggregatePolicy = computeAggregatePolicy();
- }
- return mAggregatePolicy;
- }
-
- /**
- * Get the dpm. This mainly allows us to make some utility calls without it, for testing.
- */
- /* package */ synchronized DevicePolicyManager getDPM() {
- if (mDPM == null) {
- mDPM = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
- }
- return mDPM;
- }
-
- /**
- * API: Report that policies may have been updated due to rewriting values in an Account; we
- * clear the aggregate policy (so it can be recomputed) and set the policies in the DPM
- */
- public synchronized void policiesUpdated() {
- mAggregatePolicy = null;
- setActivePolicies();
- }
-
- /**
- * API: Report that policies may have been updated *and* the caller vouches that the
- * change is a reduction in policies. This forces an immediate change to device state.
- * Typically used when deleting accounts, although we may use it for server-side policy
- * rollbacks.
- */
- public void reducePolicies() {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "reducePolicies");
- }
- policiesUpdated();
- }
-
- /**
- * API: Query used to determine if a given policy is "active" (the device is operating at
- * the required security level).
- *
- * @param policy the policies requested, or null to check aggregate stored policies
- * @return true if the requested policies are active, false if not.
- */
- public boolean isActive(Policy policy) {
- int reasons = getInactiveReasons(policy);
- if (MailActivityEmail.DEBUG && (reasons != 0)) {
- StringBuilder sb = new StringBuilder("isActive for " + policy + ": ");
- if (reasons == 0) {
- sb.append("true");
- } else {
- sb.append("FALSE -> ");
- }
- if ((reasons & INACTIVE_NEED_ACTIVATION) != 0) {
- sb.append("no_admin ");
- }
- if ((reasons & INACTIVE_NEED_CONFIGURATION) != 0) {
- sb.append("config ");
- }
- if ((reasons & INACTIVE_NEED_PASSWORD) != 0) {
- sb.append("password ");
- }
- if ((reasons & INACTIVE_NEED_ENCRYPTION) != 0) {
- sb.append("encryption ");
- }
- if ((reasons & INACTIVE_PROTOCOL_POLICIES) != 0) {
- sb.append("protocol ");
- }
- Log.d(TAG, sb.toString());
- }
- return reasons == 0;
- }
-
- /**
- * Return bits from isActive: Device Policy Manager has not been activated
- */
- public final static int INACTIVE_NEED_ACTIVATION = 1;
-
- /**
- * Return bits from isActive: Some required configuration is not correct (no user action).
- */
- public final static int INACTIVE_NEED_CONFIGURATION = 2;
-
- /**
- * Return bits from isActive: Password needs to be set or updated
- */
- public final static int INACTIVE_NEED_PASSWORD = 4;
-
- /**
- * Return bits from isActive: Encryption has not be enabled
- */
- public final static int INACTIVE_NEED_ENCRYPTION = 8;
-
- /**
- * Return bits from isActive: Protocol-specific policies cannot be enforced
- */
- public final static int INACTIVE_PROTOCOL_POLICIES = 16;
-
- /**
- * API: Query used to determine if a given policy is "active" (the device is operating at
- * the required security level).
- *
- * This can be used when syncing a specific account, by passing a specific set of policies
- * for that account. Or, it can be used at any time to compare the device
- * state against the aggregate set of device policies stored in all accounts.
- *
- * This method is for queries only, and does not trigger any change in device state.
- *
- * NOTE: If there are multiple accounts with password expiration policies, the device
- * password will be set to expire in the shortest required interval (most secure). This method
- * will return 'false' as soon as the password expires - irrespective of which account caused
- * the expiration. In other words, all accounts (that require expiration) will run/stop
- * based on the requirements of the account with the shortest interval.
- *
- * @param policy the policies requested, or null to check aggregate stored policies
- * @return zero if the requested policies are active, non-zero bits indicates that more work
- * is needed (typically, by the user) before the required security polices are fully active.
- */
- public int getInactiveReasons(Policy policy) {
- // select aggregate set if needed
- if (policy == null) {
- policy = getAggregatePolicy();
- }
- // quick check for the "empty set" of no policies
- if (policy == Policy.NO_POLICY) {
- return 0;
- }
- int reasons = 0;
- DevicePolicyManager dpm = getDPM();
- if (isActiveAdmin()) {
- // check each policy explicitly
- if (policy.mPasswordMinLength > 0) {
- if (dpm.getPasswordMinimumLength(mAdminName) < policy.mPasswordMinLength) {
- reasons |= INACTIVE_NEED_PASSWORD;
- }
- }
- if (policy.mPasswordMode > 0) {
- if (dpm.getPasswordQuality(mAdminName) < policy.getDPManagerPasswordQuality()) {
- reasons |= INACTIVE_NEED_PASSWORD;
- }
- if (!dpm.isActivePasswordSufficient()) {
- reasons |= INACTIVE_NEED_PASSWORD;
- }
- }
- if (policy.mMaxScreenLockTime > 0) {
- // Note, we use seconds, dpm uses milliseconds
- if (dpm.getMaximumTimeToLock(mAdminName) > policy.mMaxScreenLockTime * 1000) {
- reasons |= INACTIVE_NEED_CONFIGURATION;
- }
- }
- if (policy.mPasswordExpirationDays > 0) {
- // confirm that expirations are currently set
- long currentTimeout = dpm.getPasswordExpirationTimeout(mAdminName);
- if (currentTimeout == 0
- || currentTimeout > policy.getDPManagerPasswordExpirationTimeout()) {
- reasons |= INACTIVE_NEED_PASSWORD;
- }
- // confirm that the current password hasn't expired
- long expirationDate = dpm.getPasswordExpiration(mAdminName);
- long timeUntilExpiration = expirationDate - System.currentTimeMillis();
- boolean expired = timeUntilExpiration < 0;
- if (expired) {
- reasons |= INACTIVE_NEED_PASSWORD;
- }
- }
- if (policy.mPasswordHistory > 0) {
- if (dpm.getPasswordHistoryLength(mAdminName) < policy.mPasswordHistory) {
- // There's no user action for changes here; this is just a configuration change
- reasons |= INACTIVE_NEED_CONFIGURATION;
- }
- }
- if (policy.mPasswordComplexChars > 0) {
- if (dpm.getPasswordMinimumNonLetter(mAdminName) < policy.mPasswordComplexChars) {
- reasons |= INACTIVE_NEED_PASSWORD;
- }
- }
- if (policy.mRequireEncryption) {
- int encryptionStatus = getDPM().getStorageEncryptionStatus();
- if (encryptionStatus != DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE) {
- reasons |= INACTIVE_NEED_ENCRYPTION;
- }
- }
- if (policy.mDontAllowCamera && !dpm.getCameraDisabled(mAdminName)) {
- reasons |= INACTIVE_NEED_CONFIGURATION;
- }
- // password failures are counted locally - no test required here
- // no check required for remote wipe (it's supported, if we're the admin)
-
- if (policy.mProtocolPoliciesUnsupported != null) {
- reasons |= INACTIVE_PROTOCOL_POLICIES;
- }
-
- // If we made it all the way, reasons == 0 here. Otherwise it's a list of grievances.
- return reasons;
- }
- // return false, not active
- return INACTIVE_NEED_ACTIVATION;
- }
-
- /**
- * Set the requested security level based on the aggregate set of requests.
- * If the set is empty, we release our device administration. If the set is non-empty,
- * we only proceed if we are already active as an admin.
- */
- public void setActivePolicies() {
- DevicePolicyManager dpm = getDPM();
- // compute aggregate set of policies
- Policy aggregatePolicy = getAggregatePolicy();
- // if empty set, detach from policy manager
- if (aggregatePolicy == Policy.NO_POLICY) {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "setActivePolicies: none, remove admin");
- }
- dpm.removeActiveAdmin(mAdminName);
- } else if (isActiveAdmin()) {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "setActivePolicies: " + aggregatePolicy);
- }
- // set each policy in the policy manager
- // password mode & length
- dpm.setPasswordQuality(mAdminName, aggregatePolicy.getDPManagerPasswordQuality());
- dpm.setPasswordMinimumLength(mAdminName, aggregatePolicy.mPasswordMinLength);
- // screen lock time
- dpm.setMaximumTimeToLock(mAdminName, aggregatePolicy.mMaxScreenLockTime * 1000);
- // local wipe (failed passwords limit)
- dpm.setMaximumFailedPasswordsForWipe(mAdminName, aggregatePolicy.mPasswordMaxFails);
- // password expiration (days until a password expires). API takes mSec.
- dpm.setPasswordExpirationTimeout(mAdminName,
- aggregatePolicy.getDPManagerPasswordExpirationTimeout());
- // password history length (number of previous passwords that may not be reused)
- dpm.setPasswordHistoryLength(mAdminName, aggregatePolicy.mPasswordHistory);
- // password minimum complex characters.
- // Note, in Exchange, "complex chars" simply means "non alpha", but in the DPM,
- // setting the quality to complex also defaults min symbols=1 and min numeric=1.
- // We always / safely clear minSymbols & minNumeric to zero (there is no policy
- // configuration in which we explicitly require a minimum number of digits or symbols.)
- dpm.setPasswordMinimumSymbols(mAdminName, 0);
- dpm.setPasswordMinimumNumeric(mAdminName, 0);
- dpm.setPasswordMinimumNonLetter(mAdminName, aggregatePolicy.mPasswordComplexChars);
- // Device capabilities
- dpm.setCameraDisabled(mAdminName, aggregatePolicy.mDontAllowCamera);
-
- // encryption required
- dpm.setStorageEncryption(mAdminName, aggregatePolicy.mRequireEncryption);
- }
- }
-
- /**
- * Convenience method; see javadoc below
- */
- public static void setAccountHoldFlag(Context context, long accountId, boolean newState) {
- Account account = Account.restoreAccountWithId(context, accountId);
- if (account != null) {
- setAccountHoldFlag(context, account, newState);
- }
- }
-
- /**
- * API: Set/Clear the "hold" flag in any account. This flag serves a dual purpose:
- * Setting it gives us an indication that it was blocked, and clearing it gives EAS a
- * signal to try syncing again.
- * @param context
- * @param account the account whose hold flag is to be set/cleared
- * @param newState true = security hold, false = free to sync
- */
- public static void setAccountHoldFlag(Context context, Account account, boolean newState) {
- if (newState) {
- account.mFlags |= Account.FLAGS_SECURITY_HOLD;
- } else {
- account.mFlags &= ~Account.FLAGS_SECURITY_HOLD;
- }
- ContentValues cv = new ContentValues();
- cv.put(AccountColumns.FLAGS, account.mFlags);
- account.update(context, cv);
- }
-
- /**
- * API: Sync service should call this any time a sync fails due to isActive() returning false.
- * This will kick off the notify-acquire-admin-state process and/or increase the security level.
- * The caller needs to write the required policies into this account before making this call.
- * Should not be called from UI thread - uses DB lookups to prepare new notifications
- *
- * @param accountId the account for which sync cannot proceed
- */
- public void policiesRequired(long accountId) {
- Account account = Account.restoreAccountWithId(mContext, accountId);
- // In case the account has been deleted, just return
- if (account == null) return;
- if (account.mPolicyKey == 0) return;
- Policy policy = Policy.restorePolicyWithId(mContext, account.mPolicyKey);
- if (policy == null) return;
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "policiesRequired for " + account.mDisplayName + ": " + policy);
- }
-
- // Mark the account as "on hold".
- setAccountHoldFlag(mContext, account, true);
-
- // Put up an appropriate notification
- if (policy.mProtocolPoliciesUnsupported == null) {
- NotificationController.getInstance(mContext).showSecurityNeededNotification(account);
- } else {
- NotificationController.getInstance(mContext).showSecurityUnsupportedNotification(
- account);
- }
- }
-
- public static void clearAccountPolicy(Context context, Account account) {
- setAccountPolicy(context, account, null, null);
- }
-
- /**
- * Set the policy for an account atomically; this also removes any other policy associated with
- * the account and sets the policy key for the account. If policy is null, the policyKey is
- * set to 0 and the securitySyncKey to null. Also, update the account object to reflect the
- * current policyKey and securitySyncKey
- * @param context the caller's context
- * @param account the account whose policy is to be set
- * @param policy the policy to set, or null if we're clearing the policy
- * @param securitySyncKey the security sync key for this account (ignored if policy is null)
- */
- public static void setAccountPolicy(Context context, Account account, Policy policy,
- String securitySyncKey) {
- ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
-
- // Make sure this is a valid policy set
- if (policy != null) {
- policy.normalize();
- // Add the new policy (no account will yet reference this)
- ops.add(ContentProviderOperation.newInsert(
- Policy.CONTENT_URI).withValues(policy.toContentValues()).build());
- // Make the policyKey of the account our newly created policy, and set the sync key
- ops.add(ContentProviderOperation.newUpdate(
- ContentUris.withAppendedId(Account.CONTENT_URI, account.mId))
- .withValueBackReference(AccountColumns.POLICY_KEY, 0)
- .withValue(AccountColumns.SECURITY_SYNC_KEY, securitySyncKey)
- .build());
- } else {
- ops.add(ContentProviderOperation.newUpdate(
- ContentUris.withAppendedId(Account.CONTENT_URI, account.mId))
- .withValue(AccountColumns.SECURITY_SYNC_KEY, null)
- .withValue(AccountColumns.POLICY_KEY, 0)
- .build());
- }
-
- // Delete the previous policy associated with this account, if any
- if (account.mPolicyKey > 0) {
- ops.add(ContentProviderOperation.newDelete(
- ContentUris.withAppendedId(
- Policy.CONTENT_URI, account.mPolicyKey)).build());
- }
-
- try {
- context.getContentResolver().applyBatch(EmailContent.AUTHORITY, ops);
- account.refresh(context);
- } catch (RemoteException e) {
- // This is fatal to a remote process
- throw new IllegalStateException("Exception setting account policy.");
- } catch (OperationApplicationException e) {
- // Can't happen; our provider doesn't throw this exception
- }
- }
-
- public void setAccountPolicy(long accountId, Policy policy, String securityKey) {
- Account account = Account.restoreAccountWithId(mContext, accountId);
- Policy oldPolicy = null;
- if (account.mPolicyKey > 0) {
- oldPolicy = Policy.restorePolicyWithId(mContext, account.mPolicyKey);
- }
- boolean policyChanged = (oldPolicy == null) || !oldPolicy.equals(policy);
- if (!policyChanged && (TextUtilities.stringOrNullEquals(securityKey,
- account.mSecuritySyncKey))) {
- Log.d(Logging.LOG_TAG, "setAccountPolicy; policy unchanged");
- } else {
- setAccountPolicy(mContext, account, policy, securityKey);
- policiesUpdated();
- }
-
- boolean setHold = false;
- if (policy.mProtocolPoliciesUnsupported != null) {
- // We can't support this, reasons in unsupportedRemotePolicies
- Log.d(Logging.LOG_TAG,
- "Notify policies for " + account.mDisplayName + " not supported.");
- setHold = true;
- NotificationController.getInstance(mContext).showSecurityUnsupportedNotification(
- account);
- // Erase data
- Uri uri = EmailProvider.uiUri("uiaccountdata", accountId);
- mContext.getContentResolver().delete(uri, null, null);
- } else if (isActive(policy)) {
- if (policyChanged) {
- Log.d(Logging.LOG_TAG, "Notify policies for " + account.mDisplayName + " changed.");
- // Notify that policies changed
- NotificationController.getInstance(mContext).showSecurityChangedNotification(
- account);
- }
- } else {
- setHold = true;
- Log.d(Logging.LOG_TAG, "Notify policies for " + account.mDisplayName +
- " are not being enforced.");
- // Put up a notification
- NotificationController.getInstance(mContext).showSecurityNeededNotification(account);
- }
- // Set/clear the account hold.
- setAccountHoldFlag(mContext, account, setHold);
- }
-
- /**
- * Called from the notification's intent receiver to register that the notification can be
- * cleared now.
- */
- public void clearNotification() {
- NotificationController.getInstance(mContext).cancelSecurityNeededNotification();
- }
-
- /**
- * API: Remote wipe (from server). This is final, there is no confirmation. It will only
- * return to the caller if there is an unexpected failure. The wipe includes external storage.
- */
- public void remoteWipe() {
- DevicePolicyManager dpm = getDPM();
- if (dpm.isAdminActive(mAdminName)) {
- dpm.wipeData(DevicePolicyManager.WIPE_EXTERNAL_STORAGE);
- } else {
- Log.d(Logging.LOG_TAG, "Could not remote wipe because not device admin.");
- }
- }
- /**
- * If we are not the active device admin, try to become so.
- *
- * Also checks for any policies that we have added during the lifetime of this app.
- * This catches the case where the user granted an earlier (smaller) set of policies
- * but an app upgrade requires that new policies be granted.
- *
- * @return true if we are already active, false if we are not
- */
- public boolean isActiveAdmin() {
- DevicePolicyManager dpm = getDPM();
- return dpm.isAdminActive(mAdminName)
- && dpm.hasGrantedPolicy(mAdminName, DeviceAdminInfo.USES_POLICY_EXPIRE_PASSWORD)
- && dpm.hasGrantedPolicy(mAdminName, DeviceAdminInfo.USES_ENCRYPTED_STORAGE)
- && dpm.hasGrantedPolicy(mAdminName, DeviceAdminInfo.USES_POLICY_DISABLE_CAMERA);
- }
-
- /**
- * Report admin component name - for making calls into device policy manager
- */
- public ComponentName getAdminComponent() {
- return mAdminName;
- }
-
- /**
- * Delete all accounts whose security flags aren't zero (i.e. they have security enabled).
- * This method is synchronous, so it should normally be called within a worker thread (the
- * exception being for unit tests)
- *
- * @param context the caller's context
- */
- /*package*/ void deleteSecuredAccounts(Context context) {
- ContentResolver cr = context.getContentResolver();
- // Find all accounts with security and delete them
- Cursor c = cr.query(Account.CONTENT_URI, EmailContent.ID_PROJECTION,
- Account.SECURITY_NONZERO_SELECTION, null, null);
- try {
- Log.w(TAG, "Email administration disabled; deleting " + c.getCount() +
- " secured account(s)");
- while (c.moveToNext()) {
- long accountId = c.getLong(EmailContent.ID_PROJECTION_COLUMN);
- Uri uri = EmailProvider.uiUri("uiaccountdata", accountId);
- cr.delete(uri, null, null);
- }
- } finally {
- c.close();
- }
- policiesUpdated();
- }
-
- /**
- * Internal handler for enabled->disabled transitions. Deletes all secured accounts.
- * Must call from worker thread, not on UI thread.
- */
- /*package*/ void onAdminEnabled(boolean isEnabled) {
- if (!isEnabled) {
- deleteSecuredAccounts(mContext);
- }
- }
-
- /**
- * Handle password expiration - if any accounts appear to have triggered this, put up
- * warnings, or even shut them down.
- *
- * NOTE: If there are multiple accounts with password expiration policies, the device
- * password will be set to expire in the shortest required interval (most secure). The logic
- * in this method operates based on the aggregate setting - irrespective of which account caused
- * the expiration. In other words, all accounts (that require expiration) will run/stop
- * based on the requirements of the account with the shortest interval.
- */
- private void onPasswordExpiring(Context context) {
- // 1. Do we have any accounts that matter here?
- long nextExpiringAccountId = findShortestExpiration(context);
-
- // 2. If not, exit immediately
- if (nextExpiringAccountId == -1) {
- return;
- }
-
- // 3. If yes, are we warning or expired?
- long expirationDate = getDPM().getPasswordExpiration(mAdminName);
- long timeUntilExpiration = expirationDate - System.currentTimeMillis();
- boolean expired = timeUntilExpiration < 0;
- if (!expired) {
- // 4. If warning, simply put up a generic notification and report that it came from
- // the shortest-expiring account.
- NotificationController.getInstance(mContext).showPasswordExpiringNotification(
- nextExpiringAccountId);
- } else {
- // 5. Actually expired - find all accounts that expire passwords, and wipe them
- boolean wiped = wipeExpiredAccounts(context);
- if (wiped) {
- NotificationController.getInstance(mContext).showPasswordExpiredNotification(
- nextExpiringAccountId);
- }
- }
- }
-
- /**
- * Find the account with the shortest expiration time. This is always assumed to be
- * the account that forces the password to be refreshed.
- * @return -1 if no expirations, or accountId if one is found
- */
- @VisibleForTesting
- /*package*/ static long findShortestExpiration(Context context) {
- long policyId = Utility.getFirstRowLong(context, Policy.CONTENT_URI, Policy.ID_PROJECTION,
- HAS_PASSWORD_EXPIRATION, null, PolicyColumns.PASSWORD_EXPIRATION_DAYS + " ASC",
- EmailContent.ID_PROJECTION_COLUMN, -1L);
- if (policyId < 0) return -1L;
- return Policy.getAccountIdWithPolicyKey(context, policyId);
- }
-
- /**
- * For all accounts that require password expiration, put them in security hold and wipe
- * their data.
- * @param context
- * @param controller
- * @return true if one or more accounts were wiped
- */
- @VisibleForTesting
- /*package*/ static boolean wipeExpiredAccounts(Context context) {
- boolean result = false;
- Cursor c = context.getContentResolver().query(Policy.CONTENT_URI,
- Policy.ID_PROJECTION, HAS_PASSWORD_EXPIRATION, null, null);
- try {
- while (c.moveToNext()) {
- long policyId = c.getLong(Policy.ID_PROJECTION_COLUMN);
- long accountId = Policy.getAccountIdWithPolicyKey(context, policyId);
- if (accountId < 0) continue;
- Account account = Account.restoreAccountWithId(context, accountId);
- if (account != null) {
- // Mark the account as "on hold".
- setAccountHoldFlag(context, account, true);
- // Erase data
- Uri uri = EmailProvider.uiUri("uiaccountdata", accountId);
- context.getContentResolver().delete(uri, null, null);
- // Report one or more were found
- result = true;
- }
- }
- } finally {
- c.close();
- }
- return result;
- }
-
- /**
- * Callback from EmailBroadcastProcessorService. This provides the workers for the
- * DeviceAdminReceiver calls. These should perform the work directly and not use async
- * threads for completion.
- */
- public static void onDeviceAdminReceiverMessage(Context context, int message) {
- SecurityPolicy instance = SecurityPolicy.getInstance(context);
- switch (message) {
- case DEVICE_ADMIN_MESSAGE_ENABLED:
- instance.onAdminEnabled(true);
- break;
- case DEVICE_ADMIN_MESSAGE_DISABLED:
- instance.onAdminEnabled(false);
- break;
- case DEVICE_ADMIN_MESSAGE_PASSWORD_CHANGED:
- // TODO make a small helper for this
- // Clear security holds (if any)
- Account.clearSecurityHoldOnAllAccounts(context);
- // Cancel any active notifications (if any are posted)
- NotificationController.getInstance(context).cancelPasswordExpirationNotifications();
- break;
- case DEVICE_ADMIN_MESSAGE_PASSWORD_EXPIRING:
- instance.onPasswordExpiring(instance.mContext);
- break;
- }
- }
-
- /**
- * Device Policy administrator. This is primarily a listener for device state changes.
- * Note: This is instantiated by incoming messages.
- * Note: This is actually a BroadcastReceiver and must remain within the guidelines required
- * for proper behavior, including avoidance of ANRs.
- * Note: We do not implement onPasswordFailed() because the default behavior of the
- * DevicePolicyManager - complete local wipe after 'n' failures - is sufficient.
- */
- public static class PolicyAdmin extends DeviceAdminReceiver {
-
- /**
- * Called after the administrator is first enabled.
- */
- @Override
- public void onEnabled(Context context, Intent intent) {
- EmailBroadcastProcessorService.processDevicePolicyMessage(context,
- DEVICE_ADMIN_MESSAGE_ENABLED);
- }
-
- /**
- * Called prior to the administrator being disabled.
- */
- @Override
- public void onDisabled(Context context, Intent intent) {
- EmailBroadcastProcessorService.processDevicePolicyMessage(context,
- DEVICE_ADMIN_MESSAGE_DISABLED);
- }
-
- /**
- * Called when the user asks to disable administration; we return a warning string that
- * will be presented to the user
- */
- @Override
- public CharSequence onDisableRequested(Context context, Intent intent) {
- return context.getString(R.string.disable_admin_warning);
- }
-
- /**
- * Called after the user has changed their password.
- */
- @Override
- public void onPasswordChanged(Context context, Intent intent) {
- EmailBroadcastProcessorService.processDevicePolicyMessage(context,
- DEVICE_ADMIN_MESSAGE_PASSWORD_CHANGED);
- }
-
- /**
- * Called when device password is expiring
- */
- @Override
- public void onPasswordExpiring(Context context, Intent intent) {
- EmailBroadcastProcessorService.processDevicePolicyMessage(context,
- DEVICE_ADMIN_MESSAGE_PASSWORD_EXPIRING);
- }
- }
-}
diff --git a/email2/src/com/android/email/SingleRunningTask.java b/email2/src/com/android/email/SingleRunningTask.java
deleted file mode 100644
index 2f40b6272..000000000
--- a/email2/src/com/android/email/SingleRunningTask.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import android.util.Log;
-
-import com.android.emailcommon.Logging;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * Base class for a task that runs at most one instance at any given moment.
- *
- * Call {@link #run} to start the task. If the task is already running on another thread, it'll do
- * nothing.
- */
-public abstract class SingleRunningTask<Param> {
- private final AtomicBoolean mIsRunning = new AtomicBoolean(false);
- private final String mLogTaskName;
-
- public SingleRunningTask(String logTaskName) {
- mLogTaskName = logTaskName;
- }
-
- /**
- * Calls {@link #runInternal} if it's not running already.
- */
- public final void run(Param param) {
- if (mIsRunning.compareAndSet(false, true)) {
- Log.i(Logging.LOG_TAG, mLogTaskName + ": start");
- try {
- runInternal(param);
- } finally {
- mIsRunning.set(false);
- }
- }
- }
-
- /**
- * The actual task must be implemented by subclasses.
- */
- protected abstract void runInternal(Param param);
-
- /* package */ boolean isRunningForTest() {
- return mIsRunning.get();
- }
-}
diff --git a/email2/src/com/android/email/StopWatch.java b/email2/src/com/android/email/StopWatch.java
deleted file mode 100644
index 20088b751..000000000
--- a/email2/src/com/android/email/StopWatch.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import com.android.emailcommon.Logging;
-
-import android.os.SystemClock;
-import android.util.Log;
-
-/**
- * A simple class to measure elapsed time.
- *
- * <code>
- * StopWatch s = StopWatch.start();
- * // Do your stuff
- * s.split();
- * // More stuff
- * s.split();
- * // More stuff
- * s.stop();
- * </code>
- */
-public class StopWatch {
- private final String mName;
- private final long mStart;
- private long mLastSplit;
-
- private StopWatch(String name) {
- mName = name;
- mStart = getCurrentTime();
- mLastSplit = mStart;
- Log.w(Logging.LOG_TAG, "StopWatch(" + mName + ") start");
- }
-
- public static StopWatch start(String name) {
- return new StopWatch(name);
- }
-
- public void split(String label) {
- long now = getCurrentTime() ;
- long elapse = now - mLastSplit;
- Log.w(Logging.LOG_TAG, "StopWatch(" + mName + ") split(" + label + ") " + elapse);
- mLastSplit = now;
- }
-
- public void stop() {
- long now = getCurrentTime();
- long elapse = now - mLastSplit;
- Log.w(Logging.LOG_TAG, "StopWatch(" + mName + ") stop: "
- + (now - mLastSplit)
- + " (total " + (now - mStart) + ")");
- }
-
- private static long getCurrentTime() {
- // We might want to use other counters, such as currentThreadTimeMillis().
- // TODO add option for that?
- return SystemClock.elapsedRealtime();
- }
-}
diff --git a/email2/src/com/android/email/VendorPolicyLoader.java b/email2/src/com/android/email/VendorPolicyLoader.java
deleted file mode 100644
index 8f97afea8..000000000
--- a/email2/src/com/android/email/VendorPolicyLoader.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import com.android.email.activity.setup.AccountSettingsUtils.Provider;
-import com.android.emailcommon.Logging;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.os.Bundle;
-import android.util.Log;
-
-import java.lang.reflect.Method;
-
-/**
- * A bridge class to the email vendor policy apk.
- *
- * <p>Email vendor policy is a system apk named "com.android.email.helper". When exists, it must
- * contain a class called "com.android.email.policy.EmailPolicy" with a static public method
- * <code>Bundle getPolicy(String, Bundle)</code>, which serves vendor specific configurations.
- *
- * <p>A vendor policy apk is optional. The email application will operate properly when none is
- * found.
- */
-public class VendorPolicyLoader {
- private static final String POLICY_PACKAGE = "com.android.email.policy";
- private static final String POLICY_CLASS = POLICY_PACKAGE + ".EmailPolicy";
- private static final String GET_POLICY_METHOD = "getPolicy";
- private static final Class<?>[] ARGS = new Class<?>[] {String.class, Bundle.class};
-
- // call keys and i/o bundle keys
- // when there is only one parameter or return value, use call key
- private static final String USE_ALTERNATE_EXCHANGE_STRINGS = "useAlternateExchangeStrings";
- private static final String GET_IMAP_ID = "getImapId";
- private static final String GET_IMAP_ID_USER = "getImapId.user";
- private static final String GET_IMAP_ID_HOST = "getImapId.host";
- private static final String GET_IMAP_ID_CAPA = "getImapId.capabilities";
- private static final String FIND_PROVIDER = "findProvider";
- private static final String FIND_PROVIDER_IN_URI = "findProvider.inUri";
- private static final String FIND_PROVIDER_IN_USER = "findProvider.inUser";
- private static final String FIND_PROVIDER_OUT_URI = "findProvider.outUri";
- private static final String FIND_PROVIDER_OUT_USER = "findProvider.outUser";
- private static final String FIND_PROVIDER_NOTE = "findProvider.note";
-
- /** Singleton instance */
- private static VendorPolicyLoader sInstance;
-
- private final Method mPolicyMethod;
-
- public static VendorPolicyLoader getInstance(Context context) {
- if (sInstance == null) {
- // It's okay to instantiate VendorPolicyLoader multiple times. No need to synchronize.
- sInstance = new VendorPolicyLoader(context);
- }
- return sInstance;
- }
-
- /**
- * For testing only.
- *
- * Replaces the instance with a new instance that loads a specified class.
- */
- public static void injectPolicyForTest(Context context, String apkPackageName, Class<?> clazz) {
- String name = clazz.getName();
- Log.d(Logging.LOG_TAG, String.format("Using policy: package=%s name=%s",
- apkPackageName, name));
- sInstance = new VendorPolicyLoader(context, apkPackageName, name, true);
- }
-
- /**
- * For testing only.
- *
- * Clear the instance so that the next {@link #getInstance} call will return a regular,
- * non-injected instance.
- */
- public static void clearInstanceForTest() {
- sInstance = null;
- }
-
- private VendorPolicyLoader(Context context) {
- this(context, POLICY_PACKAGE, POLICY_CLASS, false);
- }
-
- /**
- * Constructor for testing, where we need to use an alternate package/class name, and skip
- * the system apk check.
- */
- /* package */ VendorPolicyLoader(Context context, String apkPackageName, String className,
- boolean allowNonSystemApk) {
- if (!allowNonSystemApk && !isSystemPackage(context, apkPackageName)) {
- mPolicyMethod = null;
- return;
- }
-
- Class<?> clazz = null;
- Method method = null;
- try {
- final Context policyContext = context.createPackageContext(apkPackageName,
- Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
- final ClassLoader classLoader = policyContext.getClassLoader();
- clazz = classLoader.loadClass(className);
- method = clazz.getMethod(GET_POLICY_METHOD, ARGS);
- } catch (NameNotFoundException ignore) {
- // Package not found -- it's okay - there's no policy .apk found, which is OK
- } catch (ClassNotFoundException e) {
- // Class not found -- probably not OK, but let's not crash here
- Log.w(Logging.LOG_TAG, "VendorPolicyLoader: " + e);
- } catch (NoSuchMethodException e) {
- // Method not found -- probably not OK, but let's not crash here
- Log.w(Logging.LOG_TAG, "VendorPolicyLoader: " + e);
- }
- mPolicyMethod = method;
- }
-
- // Not private for testing
- /* package */ static boolean isSystemPackage(Context context, String packageName) {
- try {
- ApplicationInfo ai = context.getPackageManager().getApplicationInfo(packageName, 0);
- return (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
- } catch (NameNotFoundException e) {
- return false; // Package not found.
- }
- }
-
- /**
- * Calls the getPolicy method in the policy apk, if one exists. This method never returns null;
- * It returns an empty {@link Bundle} when there is no policy apk (or even if the inner
- * getPolicy returns null).
- */
- // Not private for testing
- /* package */ Bundle getPolicy(String policy, Bundle args) {
- Bundle ret = null;
- if (mPolicyMethod != null) {
- try {
- ret = (Bundle) mPolicyMethod.invoke(null, policy, args);
- } catch (Exception e) {
- Log.w(Logging.LOG_TAG, "VendorPolicyLoader", e);
- }
- }
- return (ret != null) ? ret : Bundle.EMPTY;
- }
-
- /**
- * Returns true if alternate exchange descriptive text is required.
- *
- * Vendor function:
- * Select: USE_ALTERNATE_EXCHANGE_STRINGS
- * Params: none
- * Result: USE_ALTERNATE_EXCHANGE_STRINGS (boolean)
- */
- public boolean useAlternateExchangeStrings() {
- return getPolicy(USE_ALTERNATE_EXCHANGE_STRINGS, null)
- .getBoolean(USE_ALTERNATE_EXCHANGE_STRINGS, false);
- }
-
- /**
- * Returns additional key/value pairs for the IMAP ID string.
- *
- * Vendor function:
- * Select: GET_IMAP_ID
- * Params: GET_IMAP_ID_USER (String)
- * GET_IMAP_ID_HOST (String)
- * GET_IMAP_ID_CAPABILITIES (String)
- * Result: GET_IMAP_ID (String)
- *
- * @param userName the server that is being contacted (e.g. "imap.server.com")
- * @param host the server that is being contacted (e.g. "imap.server.com")
- * @param capabilities reported capabilities, if known. null is OK
- * @return zero or more key/value pairs, quoted and delimited by spaces. If there is
- * nothing to add, return null.
- */
- public String getImapIdValues(String userName, String host, String capabilities) {
- Bundle params = new Bundle();
- params.putString(GET_IMAP_ID_USER, userName);
- params.putString(GET_IMAP_ID_HOST, host);
- params.putString(GET_IMAP_ID_CAPA, capabilities);
- String result = getPolicy(GET_IMAP_ID, params).getString(GET_IMAP_ID);
- return result;
- }
-
- /**
- * Returns provider setup information for a given email address
- *
- * Vendor function:
- * Select: FIND_PROVIDER
- * Param: FIND_PROVIDER (String)
- * Result: FIND_PROVIDER_IN_URI
- * FIND_PROVIDER_IN_USER
- * FIND_PROVIDER_OUT_URI
- * FIND_PROVIDER_OUT_USER
- * FIND_PROVIDER_NOTE (optional - null is OK)
- *
- * Note, if we get this far, we expect "correct" results from the policy method. But throwing
- * checked exceptions requires a bunch of upstream changes, so we're going to catch them here
- * and add logging. Other exceptions may escape here (such as null pointers) to fail fast.
- *
- * @param domain The domain portion of the user's email address
- * @return suitable Provider definition, or null if no match found
- */
- public Provider findProviderForDomain(String domain) {
- Bundle params = new Bundle();
- params.putString(FIND_PROVIDER, domain);
- Bundle out = getPolicy(FIND_PROVIDER, params);
- if (out != null && !out.isEmpty()) {
- Provider p = new Provider();
- p.id = null;
- p.label = null;
- p.domain = domain;
- p.incomingUriTemplate = out.getString(FIND_PROVIDER_IN_URI);
- p.incomingUsernameTemplate = out.getString(FIND_PROVIDER_IN_USER);
- p.outgoingUriTemplate = out.getString(FIND_PROVIDER_OUT_URI);
- p.outgoingUsernameTemplate = out.getString(FIND_PROVIDER_OUT_USER);
- p.note = out.getString(FIND_PROVIDER_NOTE);
- return p;
- }
- return null;
- }
-}
diff --git a/email2/src/com/android/email/activity/ActivityHelper.java b/email2/src/com/android/email/activity/ActivityHelper.java
deleted file mode 100644
index ebab0e54a..000000000
--- a/email2/src/com/android/email/activity/ActivityHelper.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.content.ActivityNotFoundException;
-import android.content.Intent;
-import android.net.Uri;
-import android.provider.Browser;
-import android.view.WindowManager;
-
-import com.android.email.activity.setup.AccountSecurity;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.provider.Account;
-
-/**
- * Various methods that are used by both 1-pane and 2-pane activities.
- *
- * Common code used by the activities and the fragments.
- */
-public final class ActivityHelper {
- private ActivityHelper() {
- }
-
- /**
- * Open an URL in a message.
- *
- * This is intended to mirror the operation of the original
- * (see android.webkit.CallbackProxy) with one addition of intent flags
- * "FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET". This improves behavior when sublaunching
- * other apps via embedded URI's.
- *
- * We also use this hook to catch "mailto:" links and handle them locally.
- *
- * @param activity parent activity
- * @param url URL to open
- * @param senderAccountId if the URL is mailto:, we use this account as the sender.
- * TODO When MessageCompose implements the account selector, this won't be necessary.
- * Pass {@link Account#NO_ACCOUNT} to use the default account.
- * @return true if the URI has successfully been opened.
- */
- public static boolean openUrlInMessage(Activity activity, String url, long senderAccountId) {
- // hijack mailto: uri's and handle locally
- //***
- //if (url != null && url.toLowerCase().startsWith("mailto:")) {
- // return MessageCompose.actionCompose(activity, url, senderAccountId);
- //}
-
- // Handle most uri's via intent launch
- boolean result = false;
- Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
- intent.addCategory(Intent.CATEGORY_BROWSABLE);
- intent.putExtra(Browser.EXTRA_APPLICATION_ID, activity.getPackageName());
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
- try {
- activity.startActivity(intent);
- result = true;
- } catch (ActivityNotFoundException ex) {
- // No applications can handle it. Ignore.
- }
- return result;
- }
-
- /**
- * If configured via debug flags, inhibit hardware graphics acceleration. Must be called
- * early in onCreate().
- *
- * NOTE: Currently, this only works if HW accel is *not* enabled via the manifest.
- */
- public static void debugSetWindowFlags(Activity activity) {
- if (MailActivityEmail.sDebugInhibitGraphicsAcceleration) {
- // Clear the flag in the activity's window
- activity.getWindow().setFlags(0,
- WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
- } else {
- // Set the flag in the activity's window
- activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
- WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
- }
- }
-
- public static void showSecurityHoldDialog(Activity callerActivity, long accountId) {
- callerActivity.startActivity(
- AccountSecurity.actionUpdateSecurityIntent(callerActivity, accountId, true));
- }
-
-}
diff --git a/email2/src/com/android/email/activity/ContactStatusLoader.java b/email2/src/com/android/email/activity/ContactStatusLoader.java
deleted file mode 100644
index ff5df0999..000000000
--- a/email2/src/com/android/email/activity/ContactStatusLoader.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.content.AsyncTaskLoader;
-import android.content.ContentUris;
-import android.content.Context;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.net.Uri;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.StatusUpdates;
-import android.util.Log;
-
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-/**
- * Loader to load presence statuses and the contact photo.
- */
-public class ContactStatusLoader extends AsyncTaskLoader<ContactStatusLoader.Result> {
- @VisibleForTesting
- static final int PRESENCE_UNKNOWN_RESOURCE_ID = android.R.drawable.presence_offline;
-
- /** email address -> photo id, presence */
- /* package */ static final String[] PROJECTION_PHOTO_ID_PRESENCE = new String[] {
- Contacts.PHOTO_ID,
- Contacts.CONTACT_PRESENCE
- };
- private static final int COLUMN_PHOTO_ID = 0;
- private static final int COLUMN_PRESENCE = 1;
-
- /** photo id -> photo data */
- /* package */ static final String[] PHOTO_PROJECTION = new String[] {
- Photo.PHOTO
- };
- private static final int PHOTO_COLUMN = 0;
-
- private final Context mContext;
- private final String mEmailAddress;
-
- /**
- * Class that encapsulates the result.
- */
- public static class Result {
- public static final Result UNKNOWN = new Result(null, PRESENCE_UNKNOWN_RESOURCE_ID, null);
-
- /** Contact photo. Null if unknown */
- public final Bitmap mPhoto;
-
- /** Presence image resource ID. Always has a valid value, even if unknown. */
- public final int mPresenceResId;
-
- /** URI for opening quick contact. Null if unknown. */
- public final Uri mLookupUri;
-
- public Result(Bitmap photo, int presenceResId, Uri lookupUri) {
- mPhoto = photo;
- mPresenceResId = presenceResId;
- mLookupUri = lookupUri;
- }
-
- public boolean isUnknown() {
- return PRESENCE_UNKNOWN_RESOURCE_ID == mPresenceResId;
- }
- }
-
- public ContactStatusLoader(Context context, String emailAddress) {
- super(context);
- mContext = context;
- mEmailAddress = emailAddress;
- }
-
- @Override
- public Result loadInBackground() {
- return getContactInfo(mContext, mEmailAddress);
- }
-
- /**
- * Synchronously loads contact data.
- *
- * NOTE: DO NOT CALL THIS METHOD FROM THE UI THREAD (DATABASE ACCESS)
- */
- public static Result getContactInfo(Context context, String emailAddress) {
- // Load photo-id and presence status.
- Uri uri = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(emailAddress));
- Cursor c = context.getContentResolver().query(
- uri,
- PROJECTION_PHOTO_ID_PRESENCE, null, null, null);
- if (c == null) {
- return Result.UNKNOWN;
- }
- final long photoId;
- final int presenceStatus;
- try {
- if (!c.moveToFirst()) {
- return Result.UNKNOWN;
- }
- photoId = c.getLong(COLUMN_PHOTO_ID);
- presenceStatus = c.getInt(COLUMN_PRESENCE);
- } finally {
- c.close();
- }
-
- // Convert presence status into the res id.
- final int presenceStatusResId = StatusUpdates.getPresenceIconResourceId(presenceStatus);
-
- // load photo from photo-id.
- Bitmap photo = null;
- if (photoId != -1) {
- final byte[] photoData = Utility.getFirstRowBlob(context,
- ContentUris.withAppendedId(Data.CONTENT_URI, photoId), PHOTO_PROJECTION,
- null, null, null, PHOTO_COLUMN, null);
- if (photoData != null) {
- try {
- photo = BitmapFactory.decodeByteArray(photoData, 0, photoData.length, null);
- } catch (OutOfMemoryError e) {
- Log.d(Logging.LOG_TAG, "Decoding bitmap failed with " + e.getMessage());
- }
- }
- }
-
- // Get lookup URI
- final Uri lookupUri = Data.getContactLookupUri(context.getContentResolver(), uri);
- return new Result(photo, presenceStatusResId, lookupUri);
- }
-
- @Override
- protected void onStartLoading() {
- cancelLoad();
- forceLoad();
- }
-
- @Override
- protected void onStopLoading() {
- cancelLoad();
- }
-
- @Override
- protected void onReset() {
- stopLoading();
- }
-}
diff --git a/email2/src/com/android/email/activity/EventViewer.java b/email2/src/com/android/email/activity/EventViewer.java
deleted file mode 100644
index 7eebeef11..000000000
--- a/email2/src/com/android/email/activity/EventViewer.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * Copyright (c) 2012, Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.content.ContentUris;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.CalendarContract;
-
-import com.android.emailcommon.mail.MeetingInfo;
-import com.android.emailcommon.mail.PackedString;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.utility.Utility;
-
-public class EventViewer extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Uri uri = getIntent().getData();
- long messageId = Long.parseLong(uri.getLastPathSegment());
- Message msg = Message.restoreMessageWithId(this, messageId);
- if (msg == null) {
- finish();
- } else {
- PackedString info = new PackedString(msg.mMeetingInfo);
- String uid = info.get(MeetingInfo.MEETING_UID);
- long eventId = -1;
- if (uid != null) {
- Cursor c = getContentResolver().query(CalendarContract.Events.CONTENT_URI,
- new String[] {CalendarContract.Events._ID},
- CalendarContract.Events.SYNC_DATA2 + "=?",
- new String[] {uid}, null);
- if (c != null) {
- try {
- if (c.getCount() == 1) {
- c.moveToFirst();
- eventId = c.getLong(0);
- }
- } finally {
- c.close();
- }
- }
- }
- Intent intent = new Intent(Intent.ACTION_VIEW);
- if (eventId != -1) {
- uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventId);
- } else {
- long time =
- Utility.parseEmailDateTimeToMillis(info.get(MeetingInfo.MEETING_DTSTART));
- uri = Uri.parse("content://com.android.calendar/time/" + time);
- intent.putExtra("VIEW", "DAY");
- }
- intent.setData(uri);
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
- startActivity(intent);
- finish();
- }
- }
-}
diff --git a/email2/src/com/android/email/activity/InsertQuickResponseDialog.java b/email2/src/com/android/email/activity/InsertQuickResponseDialog.java
deleted file mode 100644
index 5a5689a9d..000000000
--- a/email2/src/com/android/email/activity/InsertQuickResponseDialog.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import com.android.email.R;
-import com.android.email.activity.setup.
- AccountSettingsEditQuickResponsesFragment.QuickResponseFinder;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.utility.EmailAsyncTask;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.Fragment;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ListView;
-
-/**
- * Dialog which lists QuickResponses for the specified account. On user selection, will call
- * Callback.onQuickResponseSelected() with the selected QuickResponse text.
- */
-public class InsertQuickResponseDialog extends DialogFragment
- implements DialogInterface.OnClickListener, OnItemClickListener {
- private ListView mQuickResponsesView;
- private EmailAsyncTask.Tracker mTaskTracker;
-
- // Key for the Account object in the arguments bundle
- private static final String ACCOUNT_KEY = "account";
-
- /**
- * Callback interface for when user selects a QuickResponse.
- */
- public interface Callback {
- /**
- * Handles the text of the selected QuickResponse.
- */
- public void onQuickResponseSelected(CharSequence quickResponse);
- }
-
- /**
- * Create and returns new dialog.
- *
- * @param callbackFragment fragment that implements {@link Callback}. Or null, in which case
- * the parent activity must implement {@link Callback}.
- */
- public static InsertQuickResponseDialog
- newInstance(Fragment callbackFragment, Account account) {
- final InsertQuickResponseDialog dialog = new InsertQuickResponseDialog();
-
- // If a target is set, it MUST implement Callback. Fail-fast if not.
- final Callback callback;
- if (callbackFragment != null) {
- try {
- callback = (Callback) callbackFragment;
- } catch (ClassCastException e) {
- throw new ClassCastException(callbackFragment.toString()
- + " must implement Callback");
- }
- dialog.setTargetFragment(callbackFragment, 0);
- }
-
- Bundle args = new Bundle();
- args.putParcelable(ACCOUNT_KEY, account);
- dialog.setArguments(args);
- return dialog;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- // If target not set, the parent activity MUST implement Callback. Fail-fast if not.
- final Fragment targetFragment = getTargetFragment();
- if (targetFragment != null) {
- final Callback callback;
- try {
- callback = (Callback) getActivity();
- } catch (ClassCastException e) {
- throw new ClassCastException(getActivity().toString() + " must implement Callback");
- }
- }
-
- // Now that Callback implementation is verified, build the dialog
- final Context context = getActivity();
- final AlertDialog.Builder b = new AlertDialog.Builder(context);
-
- mQuickResponsesView = new ListView(context);
-
- Account account = (Account) getArguments().getParcelable(ACCOUNT_KEY);
- mTaskTracker = new EmailAsyncTask.Tracker();
- new QuickResponseFinder(mTaskTracker, account.mId, mQuickResponsesView,
- context, null, this, false).executeParallel();
-
- b.setTitle(getResources()
- .getString(R.string.message_compose_insert_quick_response_list_title))
- .setView(mQuickResponsesView)
- .setNegativeButton(R.string.cancel_action, this);
- return b.create();
- }
-
- @Override
- public void onDestroy() {
- mTaskTracker.cancellAllInterrupt();
- super.onDestroy();
- }
-
- /**
- * Implements OnItemClickListener.
- */
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- getCallback().onQuickResponseSelected(
- mQuickResponsesView.getItemAtPosition(position).toString());
- dismiss();
- }
-
- /**
- * Implements DialogInterface.OnClickListener
- */
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (which == DialogInterface.BUTTON_NEGATIVE) {
- dialog.cancel();
- }
- }
-
- private Callback getCallback() {
- Fragment targetFragment = getTargetFragment();
- if (targetFragment != null) {
- return (Callback) targetFragment;
- }
- return (Callback) getActivity();
- }
-}
diff --git a/email2/src/com/android/email/activity/UiUtilities.java b/email2/src/com/android/email/activity/UiUtilities.java
deleted file mode 100644
index de853d31a..000000000
--- a/email2/src/com/android/email/activity/UiUtilities.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.res.Resources;
-import android.view.View;
-
-import com.android.email.R;
-
-public class UiUtilities {
- private UiUtilities() {
- }
-
- /**
- * Formats the given size as a String in bytes, kB, MB or GB. Ex: 12,315,000 = 11 MB
- */
- public static String formatSize(Context context, long size) {
- final Resources res = context.getResources();
- final long KB = 1024;
- final long MB = (KB * 1024);
- final long GB = (MB * 1024);
-
- int resId;
- int value;
-
- if (size < KB) {
- resId = R.plurals.message_view_attachment_bytes;
- value = (int) size;
- } else if (size < MB) {
- resId = R.plurals.message_view_attachment_kilobytes;
- value = (int) (size / KB);
- } else if (size < GB) {
- resId = R.plurals.message_view_attachment_megabytes;
- value = (int) (size / MB);
- } else {
- resId = R.plurals.message_view_attachment_gigabytes;
- value = (int) (size / GB);
- }
- return res.getQuantityString(resId, value, value);
- }
-
- public static String getMessageCountForUi(Context context, int count,
- boolean replaceZeroWithBlank) {
- if (replaceZeroWithBlank && (count == 0)) {
- return "";
- } else if (count > 999) {
- return context.getString(R.string.more_than_999);
- } else {
- return Integer.toString(count);
- }
- }
-
- /** Generics version of {@link Activity#findViewById} */
- @SuppressWarnings("unchecked")
- public static <T extends View> T getViewOrNull(Activity parent, int viewId) {
- return (T) parent.findViewById(viewId);
- }
-
- /** Generics version of {@link View#findViewById} */
- @SuppressWarnings("unchecked")
- public static <T extends View> T getViewOrNull(View parent, int viewId) {
- return (T) parent.findViewById(viewId);
- }
-
- /**
- * Same as {@link Activity#findViewById}, but crashes if there's no view.
- */
- @SuppressWarnings("unchecked")
- public static <T extends View> T getView(Activity parent, int viewId) {
- return (T) checkView(parent.findViewById(viewId));
- }
-
- /**
- * Same as {@link View#findViewById}, but crashes if there's no view.
- */
- @SuppressWarnings("unchecked")
- public static <T extends View> T getView(View parent, int viewId) {
- return (T) checkView(parent.findViewById(viewId));
- }
-
- private static View checkView(View v) {
- if (v == null) {
- throw new IllegalArgumentException("View doesn't exist");
- }
- return v;
- }
-
- /**
- * Same as {@link View#setVisibility(int)}, but doesn't crash even if {@code view} is null.
- */
- public static void setVisibilitySafe(View v, int visibility) {
- if (v != null) {
- v.setVisibility(visibility);
- }
- }
-
- /**
- * Same as {@link View#setVisibility(int)}, but doesn't crash even if {@code view} is null.
- */
- public static void setVisibilitySafe(Activity parent, int viewId, int visibility) {
- setVisibilitySafe(parent.findViewById(viewId), visibility);
- }
-
- /**
- * Same as {@link View#setVisibility(int)}, but doesn't crash even if {@code view} is null.
- */
- public static void setVisibilitySafe(View parent, int viewId, int visibility) {
- setVisibilitySafe(parent.findViewById(viewId), visibility);
- }
-
- private static int sDebugForcedPaneMode = 0;
-
- /**
- * Force 1-pane UI or 2-pane UI.
- *
- * @param paneMode Set 1 if 1-pane UI should be used. Set 2 if 2-pane UI should be used.
- * Set 0 to use the default UI.
- */
- static void setDebugPaneMode(int paneMode) {
- sDebugForcedPaneMode = paneMode;
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java b/email2/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java
deleted file mode 100644
index 4bcd7c1ec..000000000
--- a/email2/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java
+++ /dev/null
@@ -1,940 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.app.ProgressDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.email.R;
-import com.android.email.mail.Sender;
-import com.android.email.mail.Store;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Policy;
-import com.android.emailcommon.service.EmailServiceProxy;
-import com.android.emailcommon.utility.Utility;
-
-/**
- * Check incoming or outgoing settings, or perform autodiscovery.
- *
- * There are three components that work together. 1. This fragment is retained and non-displayed,
- * and controls the overall process. 2. An AsyncTask that works with the stores/services to
- * check the accounts settings. 3. A stateless progress dialog (which will be recreated on
- * orientation changes).
- *
- * There are also two lightweight error dialogs which are used for notification of terminal
- * conditions.
- */
-public class AccountCheckSettingsFragment extends Fragment {
-
- public final static String TAG = "AccountCheckSettingsFragment";
-
- // Debugging flags - for debugging the UI
- // If true, use a "fake" account check cycle
- private static final boolean DEBUG_FAKE_CHECK_CYCLE = false; // DO NOT CHECK IN TRUE
- // If true, use fake check cycle, return failure
- private static final boolean DEBUG_FAKE_CHECK_ERR = false; // DO NOT CHECK IN TRUE
- // If true, use fake check cycle, return "security required"
- private static final boolean DEBUG_FORCE_SECURITY_REQUIRED = false; // DO NOT CHECK IN TRUE
-
- // State
- private final static int STATE_START = 0;
- private final static int STATE_CHECK_AUTODISCOVER = 1;
- private final static int STATE_CHECK_INCOMING = 2;
- private final static int STATE_CHECK_OUTGOING = 3;
- private final static int STATE_CHECK_OK = 4; // terminal
- private final static int STATE_CHECK_SHOW_SECURITY = 5; // terminal
- private final static int STATE_CHECK_ERROR = 6; // terminal
- private final static int STATE_AUTODISCOVER_AUTH_DIALOG = 7; // terminal
- private final static int STATE_AUTODISCOVER_RESULT = 8; // terminal
- private int mState = STATE_START;
-
- // Support for UI
- private boolean mAttached;
- private boolean mPaused = false;
- private CheckingDialog mCheckingDialog;
- private MessagingException mProgressException;
-
- // Support for AsyncTask and account checking
- AccountCheckTask mAccountCheckTask;
-
- // Result codes returned by onCheckSettingsComplete.
- /** Check settings returned successfully */
- public final static int CHECK_SETTINGS_OK = 0;
- /** Check settings failed due to connection, authentication, or other server error */
- public final static int CHECK_SETTINGS_SERVER_ERROR = 1;
- /** Check settings failed due to user refusing to accept security requirements */
- public final static int CHECK_SETTINGS_SECURITY_USER_DENY = 2;
- /** Check settings failed due to certificate being required - user needs to pick immediately. */
- public final static int CHECK_SETTINGS_CLIENT_CERTIFICATE_NEEDED = 3;
-
- // Result codes returned by onAutoDiscoverComplete.
- /** AutoDiscover completed successfully with server setup data */
- public final static int AUTODISCOVER_OK = 0;
- /** AutoDiscover completed with no data (no server or AD not supported) */
- public final static int AUTODISCOVER_NO_DATA = 1;
- /** AutoDiscover reported authentication error */
- public final static int AUTODISCOVER_AUTHENTICATION = 2;
-
- /**
- * Callback interface for any target or activity doing account check settings
- */
- public interface Callbacks {
- /**
- * Called when CheckSettings completed
- * @param result check settings result code - success is CHECK_SETTINGS_OK
- */
- public void onCheckSettingsComplete(int result);
-
- /**
- * Called when autodiscovery completes.
- * @param result autodiscovery result code - success is AUTODISCOVER_OK
- * @param hostAuth configuration data returned by AD server, or null if no data available
- */
- public void onAutoDiscoverComplete(int result, HostAuth hostAuth);
- }
-
- /**
- * Create a retained, invisible fragment that checks accounts
- *
- * @param mode incoming or outgoing
- */
- public static AccountCheckSettingsFragment newInstance(int mode, Fragment parentFragment) {
- AccountCheckSettingsFragment f = new AccountCheckSettingsFragment();
- f.setTargetFragment(parentFragment, mode);
- return f;
- }
-
- /**
- * Fragment initialization. Because we never implement onCreateView, and call
- * setRetainInstance here, this creates an invisible, persistent, "worker" fragment.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setRetainInstance(true);
- }
-
- /**
- * This is called when the Fragment's Activity is ready to go, after
- * its content view has been installed; it is called both after
- * the initial fragment creation and after the fragment is re-attached
- * to a new activity.
- */
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- mAttached = true;
-
- // If this is the first time, start the AsyncTask
- if (mAccountCheckTask == null) {
- int checkMode = getTargetRequestCode();
- Account checkAccount = SetupData.getAccount();
- mAccountCheckTask = (AccountCheckTask)
- new AccountCheckTask(checkMode, checkAccount)
- .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
- }
-
- /**
- * When resuming, restart the progress/error UI if necessary by re-reporting previous values
- */
- @Override
- public void onResume() {
- super.onResume();
- mPaused = false;
-
- if (mState != STATE_START) {
- reportProgress(mState, mProgressException);
- }
- }
-
- @Override
- public void onPause() {
- super.onPause();
- mPaused = true;
- }
-
- /**
- * This is called when the fragment is going away. It is NOT called
- * when the fragment is being propagated between activity instances.
- */
- @Override
- public void onDestroy() {
- super.onDestroy();
- if (mAccountCheckTask != null) {
- Utility.cancelTaskInterrupt(mAccountCheckTask);
- mAccountCheckTask = null;
- }
- }
-
- /**
- * This is called right before the fragment is detached from its current activity instance.
- * All reporting and callbacks are halted until we reattach.
- */
- @Override
- public void onDetach() {
- super.onDetach();
- mAttached = false;
- }
-
- /**
- * The worker (AsyncTask) will call this (in the UI thread) to report progress. If we are
- * attached to an activity, update the progress immediately; If not, simply hold the
- * progress for later.
- * @param newState The new progress state being reported
- */
- private void reportProgress(int newState, MessagingException ex) {
- mState = newState;
- mProgressException = ex;
-
- // If we are attached, create, recover, and/or update the dialog
- if (mAttached && !mPaused) {
- FragmentManager fm = getFragmentManager();
-
- switch (newState) {
- case STATE_CHECK_OK:
- // immediately terminate, clean up, and report back
- // 1. get rid of progress dialog (if any)
- recoverAndDismissCheckingDialog();
- // 2. exit self
- fm.popBackStack();
- // 3. report OK back to target fragment or activity
- getCallbackTarget().onCheckSettingsComplete(CHECK_SETTINGS_OK);
- break;
- case STATE_CHECK_SHOW_SECURITY:
- // 1. get rid of progress dialog (if any)
- recoverAndDismissCheckingDialog();
- // 2. launch the error dialog, if needed
- if (fm.findFragmentByTag(SecurityRequiredDialog.TAG) == null) {
- String message = ex.getMessage();
- if (message != null) {
- message = message.trim();
- }
- SecurityRequiredDialog securityRequiredDialog =
- SecurityRequiredDialog.newInstance(this, message);
- fm.beginTransaction()
- .add(securityRequiredDialog, SecurityRequiredDialog.TAG)
- .commit();
- }
- break;
- case STATE_CHECK_ERROR:
- case STATE_AUTODISCOVER_AUTH_DIALOG:
- // 1. get rid of progress dialog (if any)
- recoverAndDismissCheckingDialog();
- // 2. launch the error dialog, if needed
- if (fm.findFragmentByTag(ErrorDialog.TAG) == null) {
- ErrorDialog errorDialog = ErrorDialog.newInstance(
- getActivity(), this, mProgressException);
- fm.beginTransaction()
- .add(errorDialog, ErrorDialog.TAG)
- .commit();
- }
- break;
- case STATE_AUTODISCOVER_RESULT:
- HostAuth autoDiscoverResult = ((AutoDiscoverResults) ex).mHostAuth;
- // 1. get rid of progress dialog (if any)
- recoverAndDismissCheckingDialog();
- // 2. exit self
- fm.popBackStack();
- // 3. report back to target fragment or activity
- getCallbackTarget().onAutoDiscoverComplete(
- (autoDiscoverResult != null) ? AUTODISCOVER_OK : AUTODISCOVER_NO_DATA,
- autoDiscoverResult);
- break;
- default:
- // Display a normal progress message
- mCheckingDialog = (CheckingDialog) fm.findFragmentByTag(CheckingDialog.TAG);
-
- if (mCheckingDialog == null) {
- mCheckingDialog = CheckingDialog.newInstance(this, mState);
- fm.beginTransaction()
- .add(mCheckingDialog, CheckingDialog.TAG)
- .commit();
- } else {
- mCheckingDialog.updateProgress(mState);
- }
- break;
- }
- }
- }
-
- /**
- * Find the callback target, either a target fragment or the activity
- */
- private Callbacks getCallbackTarget() {
- Fragment target = getTargetFragment();
- if (target instanceof Callbacks) {
- return (Callbacks) target;
- }
- Activity activity = getActivity();
- if (activity instanceof Callbacks) {
- return (Callbacks) activity;
- }
- throw new IllegalStateException();
- }
-
- /**
- * Recover and dismiss the progress dialog fragment
- */
- private void recoverAndDismissCheckingDialog() {
- if (mCheckingDialog == null) {
- mCheckingDialog = (CheckingDialog)
- getFragmentManager().findFragmentByTag(CheckingDialog.TAG);
- }
- if (mCheckingDialog != null) {
- mCheckingDialog.dismissAllowingStateLoss();
- mCheckingDialog = null;
- }
- }
-
- /**
- * This is called when the user clicks "cancel" on the progress dialog. Shuts everything
- * down and dismisses everything.
- * This should cause us to remain in the current screen (not accepting the settings)
- */
- private void onCheckingDialogCancel() {
- // 1. kill the checker
- Utility.cancelTaskInterrupt(mAccountCheckTask);
- mAccountCheckTask = null;
- // 2. kill self with no report - this is "cancel"
- finish();
- }
-
- private void onEditCertificateOk() {
- Callbacks callbackTarget = getCallbackTarget();
- getCallbackTarget().onCheckSettingsComplete(CHECK_SETTINGS_CLIENT_CERTIFICATE_NEEDED);
- finish();
- }
-
- /**
- * This is called when the user clicks "edit" from the error dialog. The error dialog
- * should have already dismissed itself.
- * Depending on the context, the target will remain in the current activity (e.g. editing
- * settings) or return to its own parent (e.g. enter new credentials).
- */
- private void onErrorDialogEditButton() {
- // 1. handle "edit" - notify callback that we had a problem with the test
- Callbacks callbackTarget = getCallbackTarget();
- if (mState == STATE_AUTODISCOVER_AUTH_DIALOG) {
- // report auth error to target fragment or activity
- callbackTarget.onAutoDiscoverComplete(AUTODISCOVER_AUTHENTICATION, null);
- } else {
- // report check settings failure to target fragment or activity
- callbackTarget.onCheckSettingsComplete(CHECK_SETTINGS_SERVER_ERROR);
- }
- finish();
- }
-
- /** Kill self if not already killed. */
- private void finish() {
- FragmentManager fm = getFragmentManager();
- if (fm != null) {
- fm.popBackStack();
- }
- }
-
- /**
- * This is called when the user clicks "ok" or "cancel" on the "security required" dialog.
- * Shuts everything down and dismisses everything, and reports the result appropriately.
- */
- private void onSecurityRequiredDialogResultOk(boolean okPressed) {
- // 1. handle OK/cancel - notify that security is OK and we can proceed
- Callbacks callbackTarget = getCallbackTarget();
- callbackTarget.onCheckSettingsComplete(
- okPressed ? CHECK_SETTINGS_OK : CHECK_SETTINGS_SECURITY_USER_DENY);
-
- // 2. kill self if not already killed by callback
- FragmentManager fm = getFragmentManager();
- if (fm != null) {
- fm.popBackStack();
- }
- }
-
- /**
- * This exception class is used to report autodiscover results via the reporting mechanism.
- */
- public static class AutoDiscoverResults extends MessagingException {
- public final HostAuth mHostAuth;
-
- /**
- * @param authenticationError true if auth failure, false for result (or no response)
- * @param hostAuth null for "no autodiscover", non-null for server info to return
- */
- public AutoDiscoverResults(boolean authenticationError, HostAuth hostAuth) {
- super(null);
- if (authenticationError) {
- mExceptionType = AUTODISCOVER_AUTHENTICATION_FAILED;
- } else {
- mExceptionType = AUTODISCOVER_AUTHENTICATION_RESULT;
- }
- mHostAuth = hostAuth;
- }
- }
-
- /**
- * This AsyncTask does the actual account checking
- *
- * TODO: It would be better to remove the UI complete from here (the exception->string
- * conversions).
- */
- private class AccountCheckTask extends AsyncTask<Void, Integer, MessagingException> {
-
- final Context mContext;
- final int mMode;
- final Account mAccount;
- final String mStoreHost;
- final String mCheckEmail;
- final String mCheckPassword;
-
- /**
- * Create task and parameterize it
- * @param mode bits request operations
- * @param checkAccount account holding values to be checked
- */
- public AccountCheckTask(int mode, Account checkAccount) {
- mContext = getActivity().getApplicationContext();
- mMode = mode;
- mAccount = checkAccount;
- mStoreHost = checkAccount.mHostAuthRecv.mAddress;
- mCheckEmail = checkAccount.mEmailAddress;
- mCheckPassword = checkAccount.mHostAuthRecv.mPassword;
- }
-
- @Override
- protected MessagingException doInBackground(Void... params) {
- if (DEBUG_FAKE_CHECK_CYCLE) {
- return fakeChecker();
- }
-
- try {
- if ((mMode & SetupData.CHECK_AUTODISCOVER) != 0) {
- if (isCancelled()) return null;
- publishProgress(STATE_CHECK_AUTODISCOVER);
- Log.d(Logging.LOG_TAG, "Begin auto-discover for " + mCheckEmail);
- Store store = Store.getInstance(mAccount, mContext);
- Bundle result = store.autoDiscover(mContext, mCheckEmail, mCheckPassword);
- // Result will be one of:
- // null: remote exception - proceed to manual setup
- // MessagingException.AUTHENTICATION_FAILED: username/password rejected
- // Other error: proceed to manual setup
- // No error: return autodiscover results
- if (result == null) {
- return new AutoDiscoverResults(false, null);
- }
- int errorCode =
- result.getInt(EmailServiceProxy.AUTO_DISCOVER_BUNDLE_ERROR_CODE);
- if (errorCode == MessagingException.AUTODISCOVER_AUTHENTICATION_FAILED) {
- return new AutoDiscoverResults(true, null);
- } else if (errorCode != MessagingException.NO_ERROR) {
- return new AutoDiscoverResults(false, null);
- } else {
- HostAuth serverInfo = (HostAuth)
- result.getParcelable(EmailServiceProxy.AUTO_DISCOVER_BUNDLE_HOST_AUTH);
- return new AutoDiscoverResults(false, serverInfo);
- }
- }
-
- // Check Incoming Settings
- if ((mMode & SetupData.CHECK_INCOMING) != 0) {
- if (isCancelled()) return null;
- Log.d(Logging.LOG_TAG, "Begin check of incoming email settings");
- publishProgress(STATE_CHECK_INCOMING);
- Store store = Store.getInstance(mAccount, mContext);
- Bundle bundle = store.checkSettings();
- int resultCode = MessagingException.UNSPECIFIED_EXCEPTION;
- if (bundle != null) {
- resultCode = bundle.getInt(
- EmailServiceProxy.VALIDATE_BUNDLE_RESULT_CODE);
- }
- if (resultCode == MessagingException.SECURITY_POLICIES_REQUIRED) {
- SetupData.setPolicy((Policy)bundle.getParcelable(
- EmailServiceProxy.VALIDATE_BUNDLE_POLICY_SET));
- return new MessagingException(resultCode, mStoreHost);
- } else if (resultCode == MessagingException.SECURITY_POLICIES_UNSUPPORTED) {
- Policy policy = (Policy)bundle.getParcelable(
- EmailServiceProxy.VALIDATE_BUNDLE_POLICY_SET);
- String unsupported = policy.mProtocolPoliciesUnsupported;
- String[] data = unsupported.split("" + Policy.POLICY_STRING_DELIMITER);
- return new MessagingException(resultCode, mStoreHost, data);
- } else if (resultCode != MessagingException.NO_ERROR) {
- String errorMessage =
- bundle.getString(EmailServiceProxy.VALIDATE_BUNDLE_ERROR_MESSAGE);
- return new MessagingException(resultCode, errorMessage);
- }
- }
-
- // Check Outgoing Settings
- if ((mMode & SetupData.CHECK_OUTGOING) != 0) {
- if (isCancelled()) return null;
- Log.d(Logging.LOG_TAG, "Begin check of outgoing email settings");
- publishProgress(STATE_CHECK_OUTGOING);
- Sender sender = Sender.getInstance(mContext, mAccount);
- sender.close();
- sender.open();
- sender.close();
- }
-
- // If we reached the end, we completed the check(s) successfully
- return null;
- } catch (final MessagingException me) {
- // Some of the legacy account checkers return errors by throwing MessagingException,
- // which we catch and return here.
- return me;
- }
- }
-
- /**
- * Dummy background worker, for testing UI only.
- */
- private MessagingException fakeChecker() {
- // Dummy: Publish a series of progress setups, 2 sec delays between them;
- // then return "ok" (null)
- final int DELAY = 2*1000;
- if (isCancelled()) return null;
- if ((mMode & SetupData.CHECK_AUTODISCOVER) != 0) {
- publishProgress(STATE_CHECK_AUTODISCOVER);
- try {
- Thread.sleep(DELAY);
- } catch (InterruptedException e) { }
- if (DEBUG_FAKE_CHECK_ERR) {
- return new MessagingException(MessagingException.AUTHENTICATION_FAILED);
- }
- // Return "real" AD results
- HostAuth auth = new HostAuth();
- auth.setLogin("user", "password");
- auth.setConnection(HostAuth.LEGACY_SCHEME_EAS, "testserver.com", 0);
- return new AutoDiscoverResults(false, auth);
- }
- if (isCancelled()) return null;
- if ((mMode & SetupData.CHECK_INCOMING) != 0) {
- publishProgress(STATE_CHECK_INCOMING);
- try {
- Thread.sleep(DELAY);
- } catch (InterruptedException e) { }
- if (DEBUG_FAKE_CHECK_ERR) {
- return new MessagingException(MessagingException.IOERROR);
- } else if (DEBUG_FORCE_SECURITY_REQUIRED) {
- return new MessagingException(MessagingException.SECURITY_POLICIES_REQUIRED);
- }
- }
- if (isCancelled()) return null;
- if ((mMode & SetupData.CHECK_OUTGOING) != 0) {
- publishProgress(STATE_CHECK_OUTGOING);
- try {
- Thread.sleep(DELAY);
- } catch (InterruptedException e) { }
- if (DEBUG_FAKE_CHECK_ERR) {
- return new MessagingException(MessagingException.TLS_REQUIRED);
- }
- }
- return null;
- }
-
- /**
- * Progress reports (runs in UI thread). This should be used for real progress only
- * (not for errors).
- */
- @Override
- protected void onProgressUpdate(Integer... progress) {
- if (isCancelled()) return;
- reportProgress(progress[0], null);
- }
-
- /**
- * Result handler (runs in UI thread).
- *
- * AutoDiscover authentication errors are handled a bit differently than the
- * other errors; If encountered, we display the error dialog, but we return with
- * a different callback used only for AutoDiscover.
- *
- * @param result null for a successful check; exception for various errors
- */
- @Override
- protected void onPostExecute(MessagingException result) {
- if (isCancelled()) return;
- if (result == null) {
- reportProgress(STATE_CHECK_OK, null);
- } else {
- int progressState = STATE_CHECK_ERROR;
- int exceptionType = result.getExceptionType();
-
- switch (exceptionType) {
- // NOTE: AutoDiscover reports have their own reporting state, handle differently
- // from the other exception types
- case MessagingException.AUTODISCOVER_AUTHENTICATION_FAILED:
- progressState = STATE_AUTODISCOVER_AUTH_DIALOG;
- break;
- case MessagingException.AUTODISCOVER_AUTHENTICATION_RESULT:
- progressState = STATE_AUTODISCOVER_RESULT;
- break;
- // NOTE: Security policies required has its own report state, handle it a bit
- // differently from the other exception types.
- case MessagingException.SECURITY_POLICIES_REQUIRED:
- progressState = STATE_CHECK_SHOW_SECURITY;
- break;
- }
- reportProgress(progressState, result);
- }
- }
- }
-
- private static String getErrorString(Context context, MessagingException ex) {
- int id;
- String message = ex.getMessage();
- if (message != null) {
- message = message.trim();
- }
- switch (ex.getExceptionType()) {
- // The remaining exception types are handled by setting the state to
- // STATE_CHECK_ERROR (above, default) and conversion to specific error strings.
- case MessagingException.CERTIFICATE_VALIDATION_ERROR:
- id = TextUtils.isEmpty(message)
- ? R.string.account_setup_failed_dlg_certificate_message
- : R.string.account_setup_failed_dlg_certificate_message_fmt;
- break;
- case MessagingException.AUTHENTICATION_FAILED:
- case MessagingException.AUTODISCOVER_AUTHENTICATION_FAILED:
- id = TextUtils.isEmpty(message)
- ? R.string.account_setup_failed_dlg_auth_message
- : R.string.account_setup_failed_dlg_auth_message_fmt;
- break;
- case MessagingException.AUTHENTICATION_FAILED_OR_SERVER_ERROR:
- id = R.string.account_setup_failed_check_credentials_message;
- break;
- case MessagingException.IOERROR:
- id = R.string.account_setup_failed_ioerror;
- break;
- case MessagingException.TLS_REQUIRED:
- id = R.string.account_setup_failed_tls_required;
- break;
- case MessagingException.AUTH_REQUIRED:
- id = R.string.account_setup_failed_auth_required;
- break;
- case MessagingException.SECURITY_POLICIES_UNSUPPORTED:
- id = R.string.account_setup_failed_security_policies_unsupported;
- // Belt and suspenders here; there should always be a non-empty array here
- String[] unsupportedPolicies = (String[]) ex.getExceptionData();
- if (unsupportedPolicies == null) {
- Log.w(TAG, "No data for unsupported policies?");
- break;
- }
- // Build a string, concatenating policies we don't support
- StringBuilder sb = new StringBuilder();
- boolean first = true;
- for (String policyName: unsupportedPolicies) {
- if (first) {
- first = false;
- } else {
- sb.append(", ");
- }
- sb.append(policyName);
- }
- message = sb.toString();
- break;
- case MessagingException.ACCESS_DENIED:
- id = R.string.account_setup_failed_access_denied;
- break;
- case MessagingException.PROTOCOL_VERSION_UNSUPPORTED:
- id = R.string.account_setup_failed_protocol_unsupported;
- break;
- case MessagingException.GENERAL_SECURITY:
- id = R.string.account_setup_failed_security;
- break;
- case MessagingException.CLIENT_CERTIFICATE_REQUIRED:
- id = R.string.account_setup_failed_certificate_required;
- break;
- case MessagingException.CLIENT_CERTIFICATE_ERROR:
- id = R.string.account_setup_failed_certificate_inaccessible;
- break;
- default:
- id = TextUtils.isEmpty(message)
- ? R.string.account_setup_failed_dlg_server_message
- : R.string.account_setup_failed_dlg_server_message_fmt;
- break;
- }
- return TextUtils.isEmpty(message)
- ? context.getString(id)
- : context.getString(id, message);
- }
-
- /**
- * Simple dialog that shows progress as we work through the settings checks.
- * This is stateless except for its UI (e.g. current strings) and can be torn down or
- * recreated at any time without affecting the account checking progress.
- */
- public static class CheckingDialog extends DialogFragment {
- @SuppressWarnings("hiding")
- public final static String TAG = "CheckProgressDialog";
-
- // Extras for saved instance state
- private final String EXTRA_PROGRESS_STRING = "CheckProgressDialog.Progress";
-
- // UI
- private String mProgressString;
-
- /**
- * Create a dialog that reports progress
- * @param progress initial progress indication
- */
- public static CheckingDialog newInstance(AccountCheckSettingsFragment parentFragment,
- int progress) {
- CheckingDialog f = new CheckingDialog();
- f.setTargetFragment(parentFragment, progress);
- return f;
- }
-
- /**
- * Update the progress of an existing dialog
- * @param progress latest progress to be displayed
- */
- public void updateProgress(int progress) {
- mProgressString = getProgressString(progress);
- AlertDialog dialog = (AlertDialog) getDialog();
- if (dialog != null && mProgressString != null) {
- dialog.setMessage(mProgressString);
- }
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- Context context = getActivity();
- if (savedInstanceState != null) {
- mProgressString = savedInstanceState.getString(EXTRA_PROGRESS_STRING);
- }
- if (mProgressString == null) {
- mProgressString = getProgressString(getTargetRequestCode());
- }
- final AccountCheckSettingsFragment target =
- (AccountCheckSettingsFragment) getTargetFragment();
-
- ProgressDialog dialog = new ProgressDialog(context);
- dialog.setIndeterminate(true);
- dialog.setMessage(mProgressString);
- dialog.setButton(DialogInterface.BUTTON_NEGATIVE,
- context.getString(R.string.cancel_action),
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dismiss();
- target.onCheckingDialogCancel();
- }
- });
- return dialog;
- }
-
- /**
- * Listen for cancellation, which can happen from places other than the
- * negative button (e.g. touching outside the dialog), and stop the checker
- */
- @Override
- public void onCancel(DialogInterface dialog) {
- AccountCheckSettingsFragment target =
- (AccountCheckSettingsFragment) getTargetFragment();
- target.onCheckingDialogCancel();
- super.onCancel(dialog);
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putString(EXTRA_PROGRESS_STRING, mProgressString);
- }
-
- /**
- * Convert progress to message
- */
- private String getProgressString(int progress) {
- int stringId = 0;
- switch (progress) {
- case STATE_CHECK_AUTODISCOVER:
- stringId = R.string.account_setup_check_settings_retr_info_msg;
- break;
- case STATE_CHECK_INCOMING:
- stringId = R.string.account_setup_check_settings_check_incoming_msg;
- break;
- case STATE_CHECK_OUTGOING:
- stringId = R.string.account_setup_check_settings_check_outgoing_msg;
- break;
- }
- return getActivity().getString(stringId);
- }
- }
-
- /**
- * The standard error dialog. Calls back to onErrorDialogButton().
- */
- public static class ErrorDialog extends DialogFragment {
- @SuppressWarnings("hiding")
- public final static String TAG = "ErrorDialog";
-
- // Bundle keys for arguments
- private final static String ARGS_MESSAGE = "ErrorDialog.Message";
- private final static String ARGS_EXCEPTION_ID = "ErrorDialog.ExceptionId";
-
- /**
- * Use {@link #newInstance} This public constructor is still required so
- * that DialogFragment state can be automatically restored by the
- * framework.
- */
- public ErrorDialog() {
- }
-
- public static ErrorDialog newInstance(Context context, AccountCheckSettingsFragment target,
- MessagingException ex) {
- ErrorDialog fragment = new ErrorDialog();
- Bundle arguments = new Bundle();
- arguments.putString(ARGS_MESSAGE, getErrorString(context, ex));
- arguments.putInt(ARGS_EXCEPTION_ID, ex.getExceptionType());
- fragment.setArguments(arguments);
- fragment.setTargetFragment(target, 0);
- return fragment;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final Context context = getActivity();
- final Bundle arguments = getArguments();
- final String message = arguments.getString(ARGS_MESSAGE);
- final int exceptionId = arguments.getInt(ARGS_EXCEPTION_ID);
- final AccountCheckSettingsFragment target =
- (AccountCheckSettingsFragment) getTargetFragment();
-
- AlertDialog.Builder builder = new AlertDialog.Builder(context)
- .setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(context.getString(R.string.account_setup_failed_dlg_title))
- .setMessage(message)
- .setCancelable(true);
-
- if (exceptionId == MessagingException.CLIENT_CERTIFICATE_REQUIRED) {
- // Certificate error - show two buttons so the host fragment can auto pop
- // into the appropriate flow.
- builder.setPositiveButton(
- context.getString(android.R.string.ok),
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dismiss();
- target.onEditCertificateOk();
- }
- });
- builder.setNegativeButton(
- context.getString(android.R.string.cancel),
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dismiss();
- target.onErrorDialogEditButton();
- }
- });
-
- } else {
- // "Normal" error - just use a single "Edit details" button.
- builder.setPositiveButton(
- context.getString(R.string.account_setup_failed_dlg_edit_details_action),
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dismiss();
- target.onErrorDialogEditButton();
- }
- });
- }
-
- return builder.create();
- }
-
- }
-
- /**
- * The "security required" error dialog. This is presented whenever an exchange account
- * reports that it will require security policy control, and provide the user with the
- * opportunity to accept or deny this.
- *
- * If the user clicks OK, calls onSecurityRequiredDialogResultOk(true) which reports back
- * to the target as if the settings check was "ok". If the user clicks "cancel", calls
- * onSecurityRequiredDialogResultOk(false) which simply closes the checker (this is the
- * same as any other failed check.)
- */
- public static class SecurityRequiredDialog extends DialogFragment {
- @SuppressWarnings("hiding")
- public final static String TAG = "SecurityRequiredDialog";
-
- // Bundle keys for arguments
- private final static String ARGS_HOST_NAME = "SecurityRequiredDialog.HostName";
-
- public static SecurityRequiredDialog newInstance(AccountCheckSettingsFragment target,
- String hostName) {
- SecurityRequiredDialog fragment = new SecurityRequiredDialog();
- Bundle arguments = new Bundle();
- arguments.putString(ARGS_HOST_NAME, hostName);
- fragment.setArguments(arguments);
- fragment.setTargetFragment(target, 0);
- return fragment;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final Context context = getActivity();
- final Bundle arguments = getArguments();
- final String hostName = arguments.getString(ARGS_HOST_NAME);
- final AccountCheckSettingsFragment target =
- (AccountCheckSettingsFragment) getTargetFragment();
-
- return new AlertDialog.Builder(context)
- .setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(context.getString(R.string.account_setup_security_required_title))
- .setMessage(context.getString(
- R.string.account_setup_security_policies_required_fmt, hostName))
- .setCancelable(true)
- .setPositiveButton(
- context.getString(R.string.okay_action),
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dismiss();
- target.onSecurityRequiredDialogResultOk(true);
- }
- })
- .setNegativeButton(
- context.getString(R.string.cancel_action),
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dismiss();
- target.onSecurityRequiredDialogResultOk(false);
- }
- })
- .create();
- }
-
- }
-
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountSecurity.java b/email2/src/com/android/email/activity/setup/AccountSecurity.java
deleted file mode 100644
index 8b4e20e50..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSecurity.java
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.FragmentManager;
-import android.app.admin.DevicePolicyManager;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.util.Log;
-
-import com.android.email.R;
-import com.android.email.SecurityPolicy;
-import com.android.email.activity.ActivityHelper;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.utility.Utility;
-
-/**
- * Psuedo-activity (no UI) to bootstrap the user up to a higher desired security level. This
- * bootstrap requires the following steps.
- *
- * 1. Confirm the account of interest has any security policies defined - exit early if not
- * 2. If not actively administrating the device, ask Device Policy Manager to start that
- * 3. When we are actively administrating, check current policies and see if they're sufficient
- * 4. If not, set policies
- * 5. If necessary, request for user to update device password
- * 6. If necessary, request for user to activate device encryption
- */
-public class AccountSecurity extends Activity {
- private static final String TAG = "Email/AccountSecurity";
-
- private static final boolean DEBUG = true; // STOPSHIP Don't ship with this set to true
-
- private static final String EXTRA_ACCOUNT_ID = "ACCOUNT_ID";
- private static final String EXTRA_SHOW_DIALOG = "SHOW_DIALOG";
- private static final String EXTRA_PASSWORD_EXPIRING = "EXPIRING";
- private static final String EXTRA_PASSWORD_EXPIRED = "EXPIRED";
-
- private static final int REQUEST_ENABLE = 1;
- private static final int REQUEST_PASSWORD = 2;
- private static final int REQUEST_ENCRYPTION = 3;
-
- private boolean mTriedAddAdministrator = false;
- private boolean mTriedSetPassword = false;
- private boolean mTriedSetEncryption = false;
- private Account mAccount;
-
- /**
- * Used for generating intent for this activity (which is intended to be launched
- * from a notification.)
- *
- * @param context Calling context for building the intent
- * @param accountId The account of interest
- * @param showDialog If true, a simple warning dialog will be shown before kicking off
- * the necessary system settings. Should be true anywhere the context of the security settings
- * is not clear (e.g. any time after the account has been set up).
- * @return an Intent which can be used to view that account
- */
- public static Intent actionUpdateSecurityIntent(Context context, long accountId,
- boolean showDialog) {
- Intent intent = new Intent(context, AccountSecurity.class);
- intent.putExtra(EXTRA_ACCOUNT_ID, accountId);
- intent.putExtra(EXTRA_SHOW_DIALOG, showDialog);
- return intent;
- }
-
- /**
- * Used for generating intent for this activity (which is intended to be launched
- * from a notification.) This is a special mode of this activity which exists only
- * to give the user a dialog (for context) about a device pin/password expiration event.
- */
- public static Intent actionDevicePasswordExpirationIntent(Context context, long accountId,
- boolean expired) {
- Intent intent = new ForwardingIntent(context, AccountSecurity.class);
- intent.putExtra(EXTRA_ACCOUNT_ID, accountId);
- intent.putExtra(expired ? EXTRA_PASSWORD_EXPIRED : EXTRA_PASSWORD_EXPIRING, true);
- return intent;
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityHelper.debugSetWindowFlags(this);
-
- Intent i = getIntent();
- final long accountId = i.getLongExtra(EXTRA_ACCOUNT_ID, -1);
- final boolean showDialog = i.getBooleanExtra(EXTRA_SHOW_DIALOG, false);
- final boolean passwordExpiring = i.getBooleanExtra(EXTRA_PASSWORD_EXPIRING, false);
- final boolean passwordExpired = i.getBooleanExtra(EXTRA_PASSWORD_EXPIRED, false);
- SecurityPolicy security = SecurityPolicy.getInstance(this);
- security.clearNotification();
- if (accountId == -1) {
- finish();
- return;
- }
-
- mAccount = Account.restoreAccountWithId(AccountSecurity.this, accountId);
- if (mAccount == null) {
- finish();
- return;
- }
-
- // Special handling for password expiration events
- if (passwordExpiring || passwordExpired) {
- FragmentManager fm = getFragmentManager();
- if (fm.findFragmentByTag("password_expiration") == null) {
- PasswordExpirationDialog dialog =
- PasswordExpirationDialog.newInstance(mAccount.getDisplayName(),
- passwordExpired);
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "Showing password expiration dialog");
- }
- dialog.show(fm, "password_expiration");
- }
- return;
- }
- // Otherwise, handle normal security settings flow
- if (mAccount.mPolicyKey != 0) {
- // This account wants to control security
- if (showDialog) {
- // Show dialog first, unless already showing (e.g. after rotation)
- FragmentManager fm = getFragmentManager();
- if (fm.findFragmentByTag("security_needed") == null) {
- SecurityNeededDialog dialog =
- SecurityNeededDialog.newInstance(mAccount.getDisplayName());
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "Showing security needed dialog");
- }
- dialog.show(fm, "security_needed");
- }
- } else {
- // Go directly to security settings
- tryAdvanceSecurity(mAccount);
- }
- return;
- }
- finish();
- }
-
- /**
- * After any of the activities return, try to advance to the "next step"
- */
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- tryAdvanceSecurity(mAccount);
- super.onActivityResult(requestCode, resultCode, data);
- }
-
- /**
- * Walk the user through the required steps to become an active administrator and with
- * the requisite security settings for the given account.
- *
- * These steps will be repeated each time we return from a given attempt (e.g. asking the
- * user to choose a device pin/password). In a typical activation, we may repeat these
- * steps a few times. It may go as far as step 5 (password) or step 6 (encryption), but it
- * will terminate when step 2 (isActive()) succeeds.
- *
- * If at any point we do not advance beyond a given user step, (e.g. the user cancels
- * instead of setting a password) we simply repost the security notification, and exit.
- * We never want to loop here.
- */
- private void tryAdvanceSecurity(Account account) {
- SecurityPolicy security = SecurityPolicy.getInstance(this);
- // Step 1. Check if we are an active device administrator, and stop here to activate
- if (!security.isActiveAdmin()) {
- if (mTriedAddAdministrator) {
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "Not active admin: repost notification");
- }
- repostNotification(account, security);
- finish();
- } else {
- mTriedAddAdministrator = true;
- // retrieve name of server for the format string
- HostAuth hostAuth = HostAuth.restoreHostAuthWithId(this, account.mHostAuthKeyRecv);
- if (hostAuth == null) {
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "No HostAuth: repost notification");
- }
- repostNotification(account, security);
- finish();
- } else {
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "Not active admin: post initial notification");
- }
- // try to become active - must happen here in activity, to get result
- Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
- intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
- security.getAdminComponent());
- intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
- this.getString(R.string.account_security_policy_explanation_fmt,
- hostAuth.mAddress));
- startActivityForResult(intent, REQUEST_ENABLE);
- }
- }
- return;
- }
-
- // Step 2. Check if the current aggregate security policy is being satisfied by the
- // DevicePolicyManager (the current system security level).
- if (security.isActive(null)) {
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "Security active; clear holds");
- }
- Account.clearSecurityHoldOnAllAccounts(this);
- security.clearNotification();
- finish();
- return;
- }
-
- // Step 3. Try to assert the current aggregate security requirements with the system.
- security.setActivePolicies();
-
- // Step 4. Recheck the security policy, and determine what changes are needed (if any)
- // to satisfy the requirements.
- int inactiveReasons = security.getInactiveReasons(null);
-
- // Step 5. If password is needed, try to have the user set it
- if ((inactiveReasons & SecurityPolicy.INACTIVE_NEED_PASSWORD) != 0) {
- if (mTriedSetPassword) {
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "Password needed; repost notification");
- }
- repostNotification(account, security);
- finish();
- } else {
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "Password needed; request it via DPM");
- }
- mTriedSetPassword = true;
- // launch the activity to have the user set a new password.
- Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
- startActivityForResult(intent, REQUEST_PASSWORD);
- }
- return;
- }
-
- // Step 6. If encryption is needed, try to have the user set it
- if ((inactiveReasons & SecurityPolicy.INACTIVE_NEED_ENCRYPTION) != 0) {
- if (mTriedSetEncryption) {
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "Encryption needed; repost notification");
- }
- repostNotification(account, security);
- finish();
- } else {
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "Encryption needed; request it via DPM");
- }
- mTriedSetEncryption = true;
- // launch the activity to start up encryption.
- Intent intent = new Intent(DevicePolicyManager.ACTION_START_ENCRYPTION);
- startActivityForResult(intent, REQUEST_ENCRYPTION);
- }
- return;
- }
-
- // Step 7. No problems were found, so clear holds and exit
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "Policies enforced; clear holds");
- }
- Account.clearSecurityHoldOnAllAccounts(this);
- security.clearNotification();
- finish();
- }
-
- /**
- * Mark an account as not-ready-for-sync and post a notification to bring the user back here
- * eventually.
- */
- private void repostNotification(final Account account, final SecurityPolicy security) {
- if (account == null) return;
- Utility.runAsync(new Runnable() {
- @Override
- public void run() {
- security.policiesRequired(account.mId);
- }
- });
- }
-
- /**
- * Dialog briefly shown in some cases, to indicate the user that a security update is needed.
- * If the user clicks OK, we proceed into the "tryAdvanceSecurity" flow. If the user cancels,
- * we repost the notification and finish() the activity.
- */
- public static class SecurityNeededDialog extends DialogFragment
- implements DialogInterface.OnClickListener {
- private static final String BUNDLE_KEY_ACCOUNT_NAME = "account_name";
-
- /**
- * Create a new dialog.
- */
- public static SecurityNeededDialog newInstance(String accountName) {
- final SecurityNeededDialog dialog = new SecurityNeededDialog();
- Bundle b = new Bundle();
- b.putString(BUNDLE_KEY_ACCOUNT_NAME, accountName);
- dialog.setArguments(b);
- return dialog;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final String accountName = getArguments().getString(BUNDLE_KEY_ACCOUNT_NAME);
-
- final Context context = getActivity();
- final Resources res = context.getResources();
- final AlertDialog.Builder b = new AlertDialog.Builder(context);
- b.setTitle(R.string.account_security_dialog_title);
- b.setIconAttribute(android.R.attr.alertDialogIcon);
- b.setMessage(res.getString(R.string.account_security_dialog_content_fmt, accountName));
- b.setPositiveButton(R.string.okay_action, this);
- b.setNegativeButton(R.string.cancel_action, this);
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "Posting security needed dialog");
- }
- return b.create();
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dismiss();
- AccountSecurity activity = (AccountSecurity) getActivity();
- if (activity.mAccount == null) {
- // Clicked before activity fully restored - probably just monkey - exit quickly
- activity.finish();
- return;
- }
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "User accepts; advance to next step");
- }
- activity.tryAdvanceSecurity(activity.mAccount);
- break;
- case DialogInterface.BUTTON_NEGATIVE:
- if (MailActivityEmail.DEBUG || DEBUG) {
- Log.d(TAG, "User declines; repost notification");
- }
- activity.repostNotification(
- activity.mAccount, SecurityPolicy.getInstance(activity));
- activity.finish();
- break;
- }
- }
- }
-
- /**
- * Dialog briefly shown in some cases, to indicate the user that the PIN/Password is expiring
- * or has expired. If the user clicks OK, we launch the password settings screen.
- */
- public static class PasswordExpirationDialog extends DialogFragment
- implements DialogInterface.OnClickListener {
- private static final String BUNDLE_KEY_ACCOUNT_NAME = "account_name";
- private static final String BUNDLE_KEY_EXPIRED = "expired";
-
- /**
- * Create a new dialog.
- */
- public static PasswordExpirationDialog newInstance(String accountName, boolean expired) {
- final PasswordExpirationDialog dialog = new PasswordExpirationDialog();
- Bundle b = new Bundle();
- b.putString(BUNDLE_KEY_ACCOUNT_NAME, accountName);
- b.putBoolean(BUNDLE_KEY_EXPIRED, expired);
- dialog.setArguments(b);
- return dialog;
- }
-
- /**
- * Note, this actually creates two slightly different dialogs (for expiring vs. expired)
- */
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final String accountName = getArguments().getString(BUNDLE_KEY_ACCOUNT_NAME);
- final boolean expired = getArguments().getBoolean(BUNDLE_KEY_EXPIRED);
- final int titleId = expired
- ? R.string.password_expired_dialog_title
- : R.string.password_expire_warning_dialog_title;
- final int contentId = expired
- ? R.string.password_expired_dialog_content_fmt
- : R.string.password_expire_warning_dialog_content_fmt;
-
- final Context context = getActivity();
- final Resources res = context.getResources();
- final AlertDialog.Builder b = new AlertDialog.Builder(context);
- b.setTitle(titleId);
- b.setIconAttribute(android.R.attr.alertDialogIcon);
- b.setMessage(res.getString(contentId, accountName));
- b.setPositiveButton(R.string.okay_action, this);
- b.setNegativeButton(R.string.cancel_action, this);
- return b.create();
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dismiss();
- AccountSecurity activity = (AccountSecurity) getActivity();
- if (which == DialogInterface.BUTTON_POSITIVE) {
- Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
- activity.startActivity(intent);
- }
- activity.finish();
- }
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountServerBaseFragment.java b/email2/src/com/android/email/activity/setup/AccountServerBaseFragment.java
deleted file mode 100644
index 917200724..000000000
--- a/email2/src/com/android/email/activity/setup/AccountServerBaseFragment.java
+++ /dev/null
@@ -1,435 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.Activity;
-import android.app.Fragment;
-import android.content.Context;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnFocusChangeListener;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
-import android.widget.TextView;
-import android.widget.TextView.OnEditorActionListener;
-
-import com.android.email.R;
-import com.android.email.activity.UiUtilities;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.utility.Utility;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-/**
- * Common base class for server settings fragments, so they can be more easily manipulated by
- * AccountSettingsXL. Provides the following common functionality:
- *
- * Activity-provided callbacks
- * Activity callback during onAttach
- * Present "Next" button and respond to its clicks
- */
-public abstract class AccountServerBaseFragment extends Fragment
- implements AccountCheckSettingsFragment.Callbacks, OnClickListener {
-
- public static Bundle sSetupModeArgs = null;
- protected static URI sDefaultUri;
-
- private static final String BUNDLE_KEY_SETTINGS = "AccountServerBaseFragment.settings";
- private static final String BUNDLE_KEY_ACTIVITY_TITLE = "AccountServerBaseFragment.title";
-
- protected Context mContext;
- protected Callback mCallback = EmptyCallback.INSTANCE;
- /**
- * Whether or not we are in "settings mode". We re-use the same screens for both the initial
- * account creation as well as subsequent account modification. If <code>mSettingsMode</code>
- * if <code>false</code>, we are in account creation mode. Otherwise, we are in account
- * modification mode.
- */
- protected boolean mSettingsMode;
- /*package*/ HostAuth mLoadedSendAuth;
- /*package*/ HostAuth mLoadedRecvAuth;
-
- // This is null in the setup wizard screens, and non-null in AccountSettings mode
- private Button mProceedButton;
- // This is used to debounce multiple clicks on the proceed button (which does async work)
- private boolean mProceedButtonPressed;
- /*package*/ String mBaseScheme = "protocol";
-
- /**
- * Callback interface that owning activities must provide
- */
- public interface Callback {
- /**
- * Called each time the user-entered input transitions between valid and invalid
- * @param enable true to enable proceed/next button, false to disable
- */
- public void onEnableProceedButtons(boolean enable);
-
- /**
- * Called when user clicks "next". Starts account checker.
- * @param checkMode values from {@link SetupData}
- * @param target the fragment that requested the check
- */
- public void onProceedNext(int checkMode, AccountServerBaseFragment target);
-
- /**
- * Called when account checker completes. Fragments are responsible for saving
- * own edited data; This is primarily for the activity to do post-check navigation.
- * @param result check settings result code - success is CHECK_SETTINGS_OK
- * @param setupMode signals if we were editing or creating
- */
- public void onCheckSettingsComplete(int result, int setupMode);
- }
-
- private static class EmptyCallback implements Callback {
- public static final Callback INSTANCE = new EmptyCallback();
- @Override public void onEnableProceedButtons(boolean enable) { }
- @Override public void onProceedNext(int checkMode, AccountServerBaseFragment target) { }
- @Override public void onCheckSettingsComplete(int result, int setupMode) { }
- }
-
- /**
- * Get the static arguments bundle that forces a server settings fragment into "settings" mode
- * (If not included, you'll be in "setup" mode which behaves slightly differently.)
- */
- public static synchronized Bundle getSettingsModeArgs() {
- if (sSetupModeArgs == null) {
- sSetupModeArgs = new Bundle();
- sSetupModeArgs.putBoolean(BUNDLE_KEY_SETTINGS, true);
- }
- return sSetupModeArgs;
- }
-
- public AccountServerBaseFragment() {
- if (sDefaultUri == null) {
- try {
- sDefaultUri = new URI("");
- } catch (URISyntaxException ignore) {
- // ignore; will never happen
- }
- }
- }
-
- /**
- * At onCreate time, read the fragment arguments
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- // Get arguments, which modally switch us into "settings" mode (different appearance)
- mSettingsMode = false;
- if (getArguments() != null) {
- mSettingsMode = getArguments().getBoolean(BUNDLE_KEY_SETTINGS);
- }
- setHasOptionsMenu(true);
- }
-
- /**
- * Called from onCreateView, to do settings mode configuration
- */
- protected void onCreateViewSettingsMode(View view) {
- if (mSettingsMode) {
- UiUtilities.getView(view, R.id.cancel).setOnClickListener(this);
- mProceedButton = (Button) UiUtilities.getView(view, R.id.done);
- mProceedButton.setOnClickListener(this);
- mProceedButton.setEnabled(false);
- }
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- // startPreferencePanel launches this fragment with the right title initially, but
- // if the device is rotate we must set the title ourselves
- if (mSettingsMode && savedInstanceState != null) {
- getActivity().setTitle(savedInstanceState.getString(BUNDLE_KEY_ACTIVITY_TITLE));
- }
- super.onActivityCreated(savedInstanceState);
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- outState.putString(BUNDLE_KEY_ACTIVITY_TITLE, (String) getActivity().getTitle());
- }
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
- mContext = activity;
- }
-
- @Override
- public void onDetach() {
- super.onDetach();
-
- // Ensure that we don't have any callbacks at this point.
- mCallback = EmptyCallback.INSTANCE;
- }
-
- @Override
- public void onPause() {
- // Hide the soft keyboard if we lose focus
- InputMethodManager imm =
- (InputMethodManager)mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
- imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
- super.onPause();
- }
-
- /**
- * Implements OnClickListener
- */
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.cancel:
- getActivity().onBackPressed();
- break;
- case R.id.done:
- // Simple debounce - just ignore while checks are underway
- if (mProceedButtonPressed) {
- return;
- }
- mProceedButtonPressed = true;
- onNext();
- break;
- }
- }
-
- /**
- * Activity provides callbacks here.
- */
- public void setCallback(Callback callback) {
- mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback;
- mContext = getActivity();
- }
-
- /**
- * Enable/disable the "next" button
- */
- public void enableNextButton(boolean enable) {
- // If we are in settings "mode" we may be showing our own next button, and we'll
- // enable it directly, here
- if (mProceedButton != null) {
- mProceedButton.setEnabled(enable);
- }
- clearButtonBounce();
-
- // TODO: This supports the phone UX activities and will be removed
- mCallback.onEnableProceedButtons(enable);
- }
-
- /**
- * Performs async operations as part of saving changes to the settings.
- * Check for duplicate account
- * Display dialog if necessary
- * Else, proceed via mCallback.onProceedNext
- */
- protected void startDuplicateTaskCheck(long accountId, String checkHost, String checkLogin,
- int checkSettingsMode) {
- new DuplicateCheckTask(accountId, checkHost, checkLogin, checkSettingsMode)
- .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
-
- /**
- * Make the given text view uneditable. If the text view is ever focused, the specified
- * error message will be displayed.
- */
- protected void makeTextViewUneditable(final TextView view, final String errorMessage) {
- // We're editing an existing account; don't allow modification of the user name
- if (mSettingsMode) {
- view.setKeyListener(null);
- view.setFocusable(true);
- view.setOnFocusChangeListener(new OnFocusChangeListener() {
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if (hasFocus) {
- // Framework will not auto-hide IME; do it ourselves
- InputMethodManager imm = (InputMethodManager)mContext.
- getSystemService(Context.INPUT_METHOD_SERVICE);
- imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
- view.setError(errorMessage);
- } else {
- view.setError(null);
- }
- }
- });
- view.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (view.getError() == null) {
- view.setError(errorMessage);
- } else {
- view.setError(null);
- }
- }
- });
- }
- }
-
- /**
- * A keyboard listener which dismisses the keyboard when "DONE" is pressed, but doesn't muck
- * around with focus. This is useful in settings screens, as we don't want focus to change
- * since some fields throw up errors when they're focused to give the user more info.
- */
- protected final OnEditorActionListener mDismissImeOnDoneListener =
- new OnEditorActionListener() {
- @Override
- public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
- if (actionId == EditorInfo.IME_ACTION_DONE) {
- // Dismiss soft keyboard but don't modify focus.
- final Context context = getActivity();
- if (context == null) {
- return false;
- }
- InputMethodManager imm = (InputMethodManager) context.getSystemService(
- Context.INPUT_METHOD_SERVICE);
- if (imm != null && imm.isActive()) {
- imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
- }
- return true;
- }
- return false;
- }
- };
-
- /**
- * Clears the "next" button de-bounce flags and allows the "next" button to activate.
- */
- private void clearButtonBounce() {
- mProceedButtonPressed = false;
- }
-
- private class DuplicateCheckTask extends AsyncTask<Void, Void, Account> {
-
- private final long mAccountId;
- private final String mCheckHost;
- private final String mCheckLogin;
- private final int mCheckSettingsMode;
-
- public DuplicateCheckTask(long accountId, String checkHost, String checkLogin,
- int checkSettingsMode) {
- mAccountId = accountId;
- mCheckHost = checkHost;
- mCheckLogin = checkLogin;
- mCheckSettingsMode = checkSettingsMode;
- }
-
- @Override
- protected Account doInBackground(Void... params) {
- Account account = Utility.findExistingAccount(mContext, mAccountId,
- mCheckHost, mCheckLogin);
- return account;
- }
-
- @Override
- protected void onPostExecute(Account duplicateAccount) {
- AccountServerBaseFragment fragment = AccountServerBaseFragment.this;
- if (duplicateAccount != null) {
- // Show duplicate account warning
- DuplicateAccountDialogFragment dialogFragment =
- DuplicateAccountDialogFragment.newInstance(duplicateAccount.mDisplayName);
- dialogFragment.show(fragment.getFragmentManager(),
- DuplicateAccountDialogFragment.TAG);
- } else {
- // Otherwise, proceed with the save/check
- mCallback.onProceedNext(mCheckSettingsMode, fragment);
- }
- clearButtonBounce();
- }
- }
-
- /**
- * Implements AccountCheckSettingsFragment.Callbacks
- *
- * Handle OK or error result from check settings. Save settings (async), and then
- * exit to previous fragment.
- */
- @Override
- public void onCheckSettingsComplete(final int settingsResult) {
- new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... params) {
- if (settingsResult == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
- if (SetupData.getFlowMode() == SetupData.FLOW_MODE_EDIT) {
- saveSettingsAfterEdit();
- } else {
- saveSettingsAfterSetup();
- }
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(Void result) {
- // Signal to owning activity that a settings check completed
- mCallback.onCheckSettingsComplete(settingsResult, SetupData.getFlowMode());
- }
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
-
- /**
- * Implements AccountCheckSettingsFragment.Callbacks
- * This is overridden only by AccountSetupExchange
- */
- @Override
- public void onAutoDiscoverComplete(int result, HostAuth hostAuth) {
- throw new IllegalStateException();
- }
-
- /**
- * Returns whether or not any settings have changed.
- */
- public boolean haveSettingsChanged() {
- Account account = SetupData.getAccount();
-
- HostAuth sendAuth = account.getOrCreateHostAuthSend(mContext);
- boolean sendChanged = (mLoadedSendAuth != null && !mLoadedSendAuth.equals(sendAuth));
-
- HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext);
- boolean recvChanged = (mLoadedRecvAuth != null && !mLoadedRecvAuth.equals(recvAuth));
-
- return sendChanged || recvChanged;
- }
-
- public boolean setHostAuthFromAutodiscover(HostAuth hostAuth) {
- // This is overridden, if necessary
- return true;
- }
-
- /**
- * Save settings after "OK" result from checker. Concrete classes must implement.
- * This is called from a worker thread and is allowed to perform DB operations.
- */
- public abstract void saveSettingsAfterEdit();
-
- /**
- * Save settings after "OK" result from checker. Concrete classes must implement.
- * This is called from a worker thread and is allowed to perform DB operations.
- */
- public abstract void saveSettingsAfterSetup();
-
- /**
- * Respond to a click of the "Next" button. Concrete classes must implement.
- */
- public abstract void onNext();
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountSettings.java b/email2/src/com/android/email/activity/setup/AccountSettings.java
deleted file mode 100644
index 23eb17fa9..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSettings.java
+++ /dev/null
@@ -1,848 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.ActionBar;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.Fragment;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.database.ContentObserver;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.preference.PreferenceActivity;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MenuItem;
-
-import com.android.email.R;
-import com.android.email.activity.ActivityHelper;
-import com.android.email.mail.Sender;
-import com.android.email.provider.EmailProvider;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.utility.IntentUtilities;
-import com.android.emailcommon.utility.Utility;
-import com.android.mail.providers.Folder;
-import com.android.mail.providers.UIProvider.EditSettingsExtras;
-
-import java.util.List;
-
-/**
- * Handles account preferences, using multi-pane arrangement when possible.
- *
- * This activity uses the following fragments:
- * AccountSettingsFragment
- * Account{Incoming/Outgoing}Fragment
- * AccountCheckSettingsFragment
- * GeneralPreferences
- * DebugFragment
- *
- * TODO: Delete account - on single-pane view (phone UX) the account list doesn't update properly
- * TODO: Handle dynamic changes to the account list (exit if necessary). It probably makes
- * sense to use a loader for the accounts list, because it would provide better support for
- * dealing with accounts being added/deleted and triggering the header reload.
- */
-public class AccountSettings extends PreferenceActivity {
- /*
- * Intent to open account settings for account=1
- adb shell am start -a android.intent.action.EDIT \
- -d '"content://ui.email.android.com/settings?ACCOUNT_ID=1"'
- */
-
- // Intent extras for our internal activity launch
- private static final String EXTRA_ENABLE_DEBUG = "AccountSettings.enable_debug";
- private static final String EXTRA_LOGIN_WARNING_FOR_ACCOUNT = "AccountSettings.for_account";
- private static final String EXTRA_TITLE = "AccountSettings.title";
- public static final String EXTRA_NO_ACCOUNTS = "AccountSettings.no_account";
-
- // Intent extras for launch directly from system account manager
- // NOTE: This string must match the one in res/xml/account_preferences.xml
- private static final String ACTION_ACCOUNT_MANAGER_ENTRY =
- "com.android.email.activity.setup.ACCOUNT_MANAGER_ENTRY";
- // NOTE: This constant should eventually be defined in android.accounts.Constants
- private static final String EXTRA_ACCOUNT_MANAGER_ACCOUNT = "account";
-
- // Key for arguments bundle for QuickResponse editing
- private static final String QUICK_RESPONSE_ACCOUNT_KEY = "account";
-
- // Key codes used to open a debug settings fragment.
- private static final int[] SECRET_KEY_CODES = {
- KeyEvent.KEYCODE_D, KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_B, KeyEvent.KEYCODE_U,
- KeyEvent.KEYCODE_G
- };
- private int mSecretKeyCodeIndex = 0;
-
- // Support for account-by-name lookup
- private static final String SELECTION_ACCOUNT_EMAIL_ADDRESS =
- AccountColumns.EMAIL_ADDRESS + "=?";
-
- // When the user taps "Email Preferences" 10 times in a row, we'll enable the debug settings.
- private int mNumGeneralHeaderClicked = 0;
-
- private long mRequestedAccountId;
- private Header mRequestedAccountHeader;
- private Header[] mAccountListHeaders;
- private Header mAppPreferencesHeader;
- /* package */ Fragment mCurrentFragment;
- private long mDeletingAccountId = -1;
- private boolean mShowDebugMenu;
- private List<Header> mGeneratedHeaders;
-
- // Async Tasks
- private LoadAccountListTask mLoadAccountListTask;
- private GetAccountIdFromAccountTask mGetAccountIdFromAccountTask;
- private ContentObserver mAccountObserver;
-
- // Specific callbacks used by settings fragments
- private final AccountSettingsFragmentCallback mAccountSettingsFragmentCallback
- = new AccountSettingsFragmentCallback();
- private final AccountServerSettingsFragmentCallback mAccountServerSettingsFragmentCallback
- = new AccountServerSettingsFragmentCallback();
-
- /**
- * Display (and edit) settings for a specific account, or -1 for any/all accounts
- */
- public static void actionSettings(Activity fromActivity, long accountId) {
- fromActivity.startActivity(createAccountSettingsIntent(fromActivity, accountId, null));
- }
-
- /**
- * Create and return an intent to display (and edit) settings for a specific account, or -1
- * for any/all accounts. If an account name string is provided, a warning dialog will be
- * displayed as well.
- */
- public static Intent createAccountSettingsIntent(Context context, long accountId,
- String loginWarningAccountName) {
- final Uri.Builder b = IntentUtilities.createActivityIntentUrlBuilder("settings");
- IntentUtilities.setAccountId(b, accountId);
- Intent i = new Intent(Intent.ACTION_EDIT, b.build());
- if (loginWarningAccountName != null) {
- i.putExtra(EXTRA_LOGIN_WARNING_FOR_ACCOUNT, loginWarningAccountName);
- }
- return i;
- }
-
- /**
- * Launch generic settings and pre-enable the debug preferences
- */
- public static void actionSettingsWithDebug(Context fromContext) {
- Intent i = new Intent(fromContext, AccountSettings.class);
- i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- i.putExtra(EXTRA_ENABLE_DEBUG, true);
- fromContext.startActivity(i);
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityHelper.debugSetWindowFlags(this);
-
- final Intent i = getIntent();
- if (savedInstanceState == null) {
- // If we are not restarting from a previous instance, we need to
- // figure out the initial prefs to show. (Otherwise, we want to
- // continue showing whatever the user last selected.)
- if (ACTION_ACCOUNT_MANAGER_ENTRY.equals(i.getAction())) {
- // This case occurs if we're changing account settings from Settings -> Accounts
- mGetAccountIdFromAccountTask =
- (GetAccountIdFromAccountTask) new GetAccountIdFromAccountTask()
- .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, i);
- } else if (i.hasExtra(EditSettingsExtras.EXTRA_FOLDER)) {
- launchMailboxSettings(i);
- return;
- } else if (i.hasExtra(EXTRA_NO_ACCOUNTS)) {
- AccountSetupBasics.actionNewAccountWithResult(this);
- finish();
- return;
- } else {
- // Otherwise, we're called from within the Email app and look for our extras
- mRequestedAccountId = IntentUtilities.getAccountIdFromIntent(i);
- String loginWarningAccount = i.getStringExtra(EXTRA_LOGIN_WARNING_FOR_ACCOUNT);
- if (loginWarningAccount != null) {
- // Show dialog (first time only - don't re-show on a rotation)
- LoginWarningDialog dialog = LoginWarningDialog.newInstance(loginWarningAccount);
- dialog.show(getFragmentManager(), "loginwarning");
- }
- }
- }
- mShowDebugMenu = i.getBooleanExtra(EXTRA_ENABLE_DEBUG, false);
-
- String title = i.getStringExtra(EXTRA_TITLE);
- if (title != null) {
- setTitle(title);
- }
-
- getActionBar().setDisplayOptions(
- ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP);
-
- mAccountObserver = new ContentObserver(Utility.getMainThreadHandler()) {
- @Override
- public void onChange(boolean selfChange) {
- updateAccounts();
- }
- };
- }
-
- @Override
- public void onResume() {
- super.onResume();
- getContentResolver().registerContentObserver(Account.NOTIFIER_URI, true, mAccountObserver);
- updateAccounts();
- }
-
- @Override
- public void onPause() {
- super.onPause();
- getContentResolver().unregisterContentObserver(mAccountObserver);
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- Utility.cancelTaskInterrupt(mLoadAccountListTask);
- mLoadAccountListTask = null;
- Utility.cancelTaskInterrupt(mGetAccountIdFromAccountTask);
- mGetAccountIdFromAccountTask = null;
- }
-
- /**
- * Listen for secret sequence and, if heard, enable debug menu
- */
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (event.getKeyCode() == SECRET_KEY_CODES[mSecretKeyCodeIndex]) {
- mSecretKeyCodeIndex++;
- if (mSecretKeyCodeIndex == SECRET_KEY_CODES.length) {
- mSecretKeyCodeIndex = 0;
- enableDebugMenu();
- }
- } else {
- mSecretKeyCodeIndex = 0;
- }
- return super.onKeyDown(keyCode, event);
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- getMenuInflater().inflate(R.menu.account_settings_add_account_option, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- // The app icon on the action bar is pressed. Just emulate a back press.
- // TODO: this should navigate to the main screen, even if a sub-setting is open.
- // But we shouldn't just finish(), as we want to show "discard changes?" dialog
- // when necessary.
- onBackPressed();
- break;
- case R.id.add_new_account:
- onAddNewAccount();
- break;
- default:
- return super.onOptionsItemSelected(item);
- }
- return true;
- }
-
- @Override
- public Intent onBuildStartFragmentIntent(String fragmentName, Bundle args,
- int titleRes, int shortTitleRes) {
- Intent result = super.onBuildStartFragmentIntent(
- fragmentName, args, titleRes, shortTitleRes);
-
- // When opening a sub-settings page (e.g. account specific page), see if we want to modify
- // the activity title.
- String title = AccountSettingsFragment.getTitleFromArgs(args);
- if ((titleRes == 0) && (title != null)) {
- result.putExtra(EXTRA_TITLE, title);
- }
- return result;
- }
-
- /**
- * Any time we exit via this pathway, and we are showing a server settings fragment,
- * we put up the exit-save-changes dialog. This will work for the following cases:
- * Cancel button
- * Back button
- * Up arrow in application icon
- * It will *not* apply in the following cases:
- * Click the parent breadcrumb - need to find a hook for this
- * Click in the header list (e.g. another account) - handled elsewhere
- */
- @Override
- public void onBackPressed() {
- if (mCurrentFragment instanceof AccountServerBaseFragment) {
- boolean changed = ((AccountServerBaseFragment) mCurrentFragment).haveSettingsChanged();
- if (changed) {
- UnsavedChangesDialogFragment dialogFragment =
- UnsavedChangesDialogFragment.newInstanceForBack();
- dialogFragment.show(getFragmentManager(), UnsavedChangesDialogFragment.TAG);
- return; // Prevent "back" from being handled
- }
- }
- super.onBackPressed();
- }
-
- private void launchMailboxSettings(Intent intent) {
- final Folder folder = (Folder)intent.getParcelableExtra(EditSettingsExtras.EXTRA_FOLDER);
-
- // TODO: determine from the account if we should navigate to the mailbox settings.
- // See bug 6242668
-
- // Get the mailbox id from the folder
- final long mailboxId = Long.parseLong(folder.uri.getPathSegments().get(1));
-
- MailboxSettings.start(this, mailboxId);
- finish();
- }
-
-
- private void enableDebugMenu() {
- mShowDebugMenu = true;
- invalidateHeaders();
- }
-
- private void onAddNewAccount() {
- AccountSetupBasics.actionNewAccount(this);
- }
-
- /**
- * Start the async reload of the accounts list (if the headers are being displayed)
- */
- private void updateAccounts() {
- if (hasHeaders()) {
- Utility.cancelTaskInterrupt(mLoadAccountListTask);
- mLoadAccountListTask = (LoadAccountListTask)
- new LoadAccountListTask().executeOnExecutor(
- AsyncTask.THREAD_POOL_EXECUTOR, mDeletingAccountId);
- }
- }
-
- /**
- * Write the current header (accounts) array into the one provided by the PreferenceActivity.
- * Skip any headers that match mDeletingAccountId (this is a quick-hide algorithm while a
- * background thread works on deleting the account). Also sets mRequestedAccountHeader if
- * we find the requested account (by id).
- */
- @Override
- public void onBuildHeaders(List<Header> target) {
- // Assume the account is unspecified
- mRequestedAccountHeader = null;
-
- // Always add app preferences as first header
- target.clear();
- target.add(getAppPreferencesHeader());
-
- // Then add zero or more account headers as necessary
- if (mAccountListHeaders != null) {
- int headerCount = mAccountListHeaders.length;
- for (int index = 0; index < headerCount; index++) {
- Header header = mAccountListHeaders[index];
- if (header != null && header.id != HEADER_ID_UNDEFINED) {
- if (header.id != mDeletingAccountId) {
- target.add(header);
- if (header.id == mRequestedAccountId) {
- mRequestedAccountHeader = header;
- mRequestedAccountId = -1;
- }
- }
- }
- }
- }
-
- // finally, if debug header is enabled, show it
- if (mShowDebugMenu) {
- // setup lightweight header for debugging
- Header debugHeader = new Header();
- debugHeader.title = getText(R.string.debug_title);
- debugHeader.summary = null;
- debugHeader.iconRes = 0;
- debugHeader.fragment = DebugFragment.class.getCanonicalName();
- debugHeader.fragmentArguments = null;
- target.add(debugHeader);
- }
-
- // Save for later use (see forceSwitch)
- mGeneratedHeaders = target;
- }
-
- /**
- * Generate and return the first header, for app preferences
- */
- private Header getAppPreferencesHeader() {
- // Set up fixed header for general settings
- if (mAppPreferencesHeader == null) {
- mAppPreferencesHeader = new Header();
- mAppPreferencesHeader.title = getText(R.string.header_label_general_preferences);
- mAppPreferencesHeader.summary = null;
- mAppPreferencesHeader.iconRes = 0;
- mAppPreferencesHeader.fragment = GeneralPreferences.class.getCanonicalName();
- mAppPreferencesHeader.fragmentArguments = null;
- }
- return mAppPreferencesHeader;
- }
-
- /**
- * This AsyncTask reads the accounts list and generates the headers. When the headers are
- * ready, we'll trigger PreferenceActivity to refresh the account list with them.
- *
- * The array generated and stored in mAccountListHeaders may be sparse so any readers should
- * check for and skip over null entries, and should not assume array length is # of accounts.
- *
- * TODO: Smaller projection
- * TODO: Convert to Loader
- * TODO: Write a test, including operation of deletingAccountId param
- */
- private class LoadAccountListTask extends AsyncTask<Long, Void, Object[]> {
-
- @Override
- protected Object[] doInBackground(Long... params) {
- Header[] result = null;
- Boolean deletingAccountFound = false;
- long deletingAccountId = params[0];
-
- Cursor c = getContentResolver().query(
- Account.CONTENT_URI,
- Account.CONTENT_PROJECTION, null, null, null);
- try {
- int index = 0;
- int headerCount = c.getCount();
- result = new Header[headerCount];
-
- while (c.moveToNext()) {
- long accountId = c.getLong(Account.CONTENT_ID_COLUMN);
- if (accountId == deletingAccountId) {
- deletingAccountFound = true;
- continue;
- }
- String name = c.getString(Account.CONTENT_DISPLAY_NAME_COLUMN);
- String email = c.getString(Account.CONTENT_EMAIL_ADDRESS_COLUMN);
- Header newHeader = new Header();
- newHeader.id = accountId;
- newHeader.title = name;
- newHeader.summary = email;
- newHeader.fragment = AccountSettingsFragment.class.getCanonicalName();
- newHeader.fragmentArguments =
- AccountSettingsFragment.buildArguments(accountId, email);
-
- result[index++] = newHeader;
- }
- } finally {
- if (c != null) {
- c.close();
- }
- }
- return new Object[] { result, deletingAccountFound };
- }
-
- @Override
- protected void onPostExecute(Object[] result) {
- if (isCancelled() || result == null) return;
- // Extract the results
- Header[] headers = (Header[]) result[0];
- boolean deletingAccountFound = (Boolean) result[1];
- // report the settings
- mAccountListHeaders = headers;
- invalidateHeaders();
- if (!deletingAccountFound) {
- mDeletingAccountId = -1;
- }
- }
- }
-
- /**
- * Called when the user selects an item in the header list. Handles save-data cases as needed
- *
- * @param header The header that was selected.
- * @param position The header's position in the list.
- */
- @Override
- public void onHeaderClick(Header header, int position) {
- // special case when exiting the server settings fragments
- if (mCurrentFragment instanceof AccountServerBaseFragment) {
- boolean changed = ((AccountServerBaseFragment)mCurrentFragment).haveSettingsChanged();
- if (changed) {
- UnsavedChangesDialogFragment dialogFragment =
- UnsavedChangesDialogFragment.newInstanceForHeader(position);
- dialogFragment.show(getFragmentManager(), UnsavedChangesDialogFragment.TAG);
- return;
- }
- }
-
- // Secret keys: Click 10x to enable debug settings
- if (position == 0) {
- mNumGeneralHeaderClicked++;
- if (mNumGeneralHeaderClicked == 10) {
- enableDebugMenu();
- }
- } else {
- mNumGeneralHeaderClicked = 0;
- }
-
- // Process header click normally
- super.onHeaderClick(header, position);
- }
-
- /**
- * Switch to a specific header without checking for server settings fragments as done
- * in {@link #onHeaderClick(Header, int)}. Called after we interrupted a header switch
- * with a dialog, and the user OK'd it.
- */
- private void forceSwitchHeader(int position) {
- // Clear the current fragment; we're navigating away
- mCurrentFragment = null;
- // Ensure the UI visually shows the correct header selected
- setSelection(position);
- Header header = mGeneratedHeaders.get(position);
- switchToHeader(header);
- }
-
- /**
- * Forcefully go backward in the stack. This may potentially discard unsaved settings.
- */
- private void forceBack() {
- // Clear the current fragment; we're navigating away
- mCurrentFragment = null;
- onBackPressed();
- }
-
- @Override
- public void onAttachFragment(Fragment f) {
- super.onAttachFragment(f);
-
- if (f instanceof AccountSettingsFragment) {
- AccountSettingsFragment asf = (AccountSettingsFragment) f;
- asf.setCallback(mAccountSettingsFragmentCallback);
- } else if (f instanceof AccountServerBaseFragment) {
- AccountServerBaseFragment asbf = (AccountServerBaseFragment) f;
- asbf.setCallback(mAccountServerSettingsFragmentCallback);
- } else {
- // Possibly uninteresting fragment, such as a dialog.
- return;
- }
- mCurrentFragment = f;
-
- // When we're changing fragments, enable/disable the add account button
- invalidateOptionsMenu();
- }
-
- /**
- * Callbacks for AccountSettingsFragment
- */
- private class AccountSettingsFragmentCallback implements AccountSettingsFragment.Callback {
- @Override
- public void onSettingsChanged(Account account, String preference, Object value) {
- AccountSettings.this.onSettingsChanged(account, preference, value);
- }
- @Override
- public void onEditQuickResponses(Account account) {
- AccountSettings.this.onEditQuickResponses(account);
- }
- @Override
- public void onIncomingSettings(Account account) {
- AccountSettings.this.onIncomingSettings(account);
- }
- @Override
- public void onOutgoingSettings(Account account) {
- AccountSettings.this.onOutgoingSettings(account);
- }
- @Override
- public void abandonEdit() {
- finish();
- }
- }
-
- /**
- * Callbacks for AccountServerSettingsFragmentCallback
- */
- private class AccountServerSettingsFragmentCallback
- implements AccountServerBaseFragment.Callback {
- @Override
- public void onEnableProceedButtons(boolean enable) {
- // This is not used - it's a callback for the legacy activities
- }
-
- @Override
- public void onProceedNext(int checkMode, AccountServerBaseFragment target) {
- AccountCheckSettingsFragment checkerFragment =
- AccountCheckSettingsFragment.newInstance(checkMode, target);
- startPreferenceFragment(checkerFragment, true);
- }
-
- /**
- * After verifying a new server configuration as OK, we return here and continue. This
- * simply does a "back" to exit the settings screen.
- */
- @Override
- public void onCheckSettingsComplete(int result, int setupMode) {
- if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
- // Settings checked & saved; clear current fragment
- mCurrentFragment = null;
- onBackPressed();
- }
- }
- }
-
- /**
- * Some of the settings have changed. Update internal state as necessary.
- */
- public void onSettingsChanged(Account account, String preference, Object value) {
- if (AccountSettingsFragment.PREFERENCE_DESCRIPTION.equals(preference)) {
- for (Header header : mAccountListHeaders) {
- if (header.id == account.mId) {
- // Manually tweak the header title. We cannot rebuild the header list from
- // an account cursor as the account database has not been saved yet.
- header.title = value.toString();
- invalidateHeaders();
- break;
- }
- }
- }
- }
-
- /**
- * Dispatch to edit quick responses.
- */
- public void onEditQuickResponses(Account account) {
- try {
- Bundle args = new Bundle();
- args.putParcelable(QUICK_RESPONSE_ACCOUNT_KEY, account);
- startPreferencePanel(AccountSettingsEditQuickResponsesFragment.class.getName(), args,
- R.string.account_settings_edit_quick_responses_label, null, null, 0);
- } catch (Exception e) {
- Log.d(Logging.LOG_TAG, "Error while trying to invoke edit quick responses.", e);
- }
- }
-
- /**
- * Dispatch to edit incoming settings.
- */
- public void onIncomingSettings(Account account) {
- try {
- SetupData.init(SetupData.FLOW_MODE_EDIT, account);
- startPreferencePanel(AccountSetupIncomingFragment.class.getName(),
- AccountSetupIncomingFragment.getSettingsModeArgs(),
- R.string.account_settings_incoming_label, null, null, 0);
- } catch (Exception e) {
- Log.d(Logging.LOG_TAG, "Error while trying to invoke store settings.", e);
- }
- }
-
- /**
- * Dispatch to edit outgoing settings.
- *
- * TODO: Make things less hardwired
- */
- public void onOutgoingSettings(Account account) {
- try {
- Sender sender = Sender.getInstance(getApplication(), account);
- if (sender != null) {
- Class<? extends android.app.Activity> setting = sender.getSettingActivityClass();
- if (setting != null) {
- SetupData.init(SetupData.FLOW_MODE_EDIT, account);
- if (setting.equals(AccountSetupOutgoing.class)) {
- startPreferencePanel(AccountSetupOutgoingFragment.class.getName(),
- AccountSetupOutgoingFragment.getSettingsModeArgs(),
- R.string.account_settings_outgoing_label, null, null, 0);
- }
- }
- }
- } catch (Exception e) {
- Log.d(Logging.LOG_TAG, "Error while trying to invoke sender settings.", e);
- }
- }
-
- /**
- * Delete the selected account
- */
- public void deleteAccount(final Account account) {
- // Kick off the work to actually delete the account
- new Thread(new Runnable() {
- @Override
- public void run() {
- Uri uri = EmailProvider.uiUri("uiaccount", account.mId);
- getContentResolver().delete(uri, null, null);
- }}).start();
-
- // TODO: Remove ui glue for unified
- // Then update the UI as appropriate:
- // If single pane, return to the header list. If multi, rebuild header list
- if (onIsMultiPane()) {
- Header prefsHeader = getAppPreferencesHeader();
- this.switchToHeader(prefsHeader.fragment, prefsHeader.fragmentArguments);
- mDeletingAccountId = account.mId;
- updateAccounts();
- } else {
- // We should only be calling this while showing AccountSettingsFragment,
- // so a finish() should bring us back to headers. No point hiding the deleted account.
- finish();
- }
- }
-
- /**
- * This AsyncTask looks up an account based on its email address (which is what we get from
- * the Account Manager). When the account id is determined, we refresh the header list,
- * which will select the preferences for that account.
- */
- private class GetAccountIdFromAccountTask extends AsyncTask<Intent, Void, Long> {
-
- @Override
- protected Long doInBackground(Intent... params) {
- Intent intent = params[0];
- android.accounts.Account acct =
- (android.accounts.Account) intent.getParcelableExtra(EXTRA_ACCOUNT_MANAGER_ACCOUNT);
- return Utility.getFirstRowLong(AccountSettings.this, Account.CONTENT_URI,
- Account.ID_PROJECTION, SELECTION_ACCOUNT_EMAIL_ADDRESS,
- new String[] {acct.name}, null, Account.ID_PROJECTION_COLUMN, -1L);
- }
-
- @Override
- protected void onPostExecute(Long accountId) {
- if (accountId != -1 && !isCancelled()) {
- mRequestedAccountId = accountId;
- invalidateHeaders();
- }
- }
- }
-
- /**
- * Dialog fragment to show "exit with unsaved changes?" dialog
- */
- /* package */ static class UnsavedChangesDialogFragment extends DialogFragment {
- final static String TAG = "UnsavedChangesDialogFragment";
-
- // Argument bundle keys
- private final static String BUNDLE_KEY_HEADER = "UnsavedChangesDialogFragment.Header";
- private final static String BUNDLE_KEY_BACK = "UnsavedChangesDialogFragment.Back";
-
- /**
- * Creates a save changes dialog when the user selects a new header
- * @param position The new header index to make active if the user accepts the dialog. This
- * must be a valid header index although there is no error checking.
- */
- public static UnsavedChangesDialogFragment newInstanceForHeader(int position) {
- UnsavedChangesDialogFragment f = new UnsavedChangesDialogFragment();
- Bundle b = new Bundle();
- b.putInt(BUNDLE_KEY_HEADER, position);
- f.setArguments(b);
- return f;
- }
-
- /**
- * Creates a save changes dialog when the user navigates "back".
- * {@link #onBackPressed()} defines in which case this may be triggered.
- */
- public static UnsavedChangesDialogFragment newInstanceForBack() {
- UnsavedChangesDialogFragment f = new UnsavedChangesDialogFragment();
- Bundle b = new Bundle();
- b.putBoolean(BUNDLE_KEY_BACK, true);
- f.setArguments(b);
- return f;
- }
-
- // Force usage of newInstance()
- private UnsavedChangesDialogFragment() {
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final AccountSettings activity = (AccountSettings) getActivity();
- final int position = getArguments().getInt(BUNDLE_KEY_HEADER);
- final boolean isBack = getArguments().getBoolean(BUNDLE_KEY_BACK);
-
- return new AlertDialog.Builder(activity)
- .setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(android.R.string.dialog_alert_title)
- .setMessage(R.string.account_settings_exit_server_settings)
- .setPositiveButton(
- R.string.okay_action,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (isBack) {
- activity.forceBack();
- } else {
- activity.forceSwitchHeader(position);
- }
- dismiss();
- }
- })
- .setNegativeButton(
- activity.getString(R.string.cancel_action), null)
- .create();
- }
- }
-
- /**
- * Dialog briefly shown in some cases, to indicate the user that login failed. If the user
- * clicks OK, we simply dismiss the dialog, leaving the user in the account settings for
- * that account; If the user clicks "cancel", we exit account settings.
- */
- public static class LoginWarningDialog extends DialogFragment
- implements DialogInterface.OnClickListener {
- private static final String BUNDLE_KEY_ACCOUNT_NAME = "account_name";
-
- /**
- * Create a new dialog.
- */
- public static LoginWarningDialog newInstance(String accountName) {
- final LoginWarningDialog dialog = new LoginWarningDialog();
- Bundle b = new Bundle();
- b.putString(BUNDLE_KEY_ACCOUNT_NAME, accountName);
- dialog.setArguments(b);
- return dialog;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final String accountName = getArguments().getString(BUNDLE_KEY_ACCOUNT_NAME);
-
- final Context context = getActivity();
- final Resources res = context.getResources();
- final AlertDialog.Builder b = new AlertDialog.Builder(context);
- b.setTitle(R.string.account_settings_login_dialog_title);
- b.setIconAttribute(android.R.attr.alertDialogIcon);
- b.setMessage(res.getString(R.string.account_settings_login_dialog_content_fmt,
- accountName));
- b.setPositiveButton(R.string.okay_action, this);
- b.setNegativeButton(R.string.cancel_action, this);
- return b.create();
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dismiss();
- if (which == DialogInterface.BUTTON_NEGATIVE) {
- getActivity().finish();
- }
- }
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountSettingsEditQuickResponsesFragment.java b/email2/src/com/android/email/activity/setup/AccountSettingsEditQuickResponsesFragment.java
deleted file mode 100644
index 9e70aebdb..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSettingsEditQuickResponsesFragment.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import com.android.email.R;
-import com.android.email.activity.UiUtilities;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.QuickResponse;
-import com.android.emailcommon.utility.EmailAsyncTask;
-
-import android.app.Activity;
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.content.Context;
-import android.database.ContentObserver;
-import android.os.Bundle;
-import android.os.Handler;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
-
-/**
- * Lists quick responses associated with the specified email account. Allows users to create,
- * edit, and delete quick responses. Owning activity must:
- * <ul>
- * <li>Launch this fragment using startPreferencePanel().</li>
- * <li>Provide an Account as an argument named "account". This account's quick responses
- * will be read and potentially modified.</li>
- * </ul>
- *
- * <p>This fragment is run as a preference panel from AccountSettings.</p>
- */
-public class AccountSettingsEditQuickResponsesFragment extends Fragment
- implements OnClickListener {
- private ListView mQuickResponsesView;
- private Account mAccount;
- private Context mContext;
- private EmailAsyncTask.Tracker mTaskTracker;
-
- private static final String BUNDLE_KEY_ACTIVITY_TITLE
- = "AccountSettingsEditQuickResponsesFragment.title";
-
- // Helper class to place a TextView alongside "Delete" icon in the ListView
- // displaying the QuickResponses
- private static class ArrayAdapterWithButtons extends ArrayAdapter<QuickResponse> {
- private QuickResponse[] mQuickResponses;
- private final long mAccountId;
- private final Context mContext;
- private final FragmentManager mFragmentManager;
-
- private OnClickListener mOnEditListener = new OnClickListener() {
- @Override
- public void onClick(View view) {
- QuickResponse quickResponse = (QuickResponse) (view.getTag());
- EditQuickResponseDialog
- .newInstance(quickResponse, mAccountId)
- .show(mFragmentManager, null);
- }
- };
-
- private OnClickListener mOnDeleteListener = new OnClickListener() {
- @Override
- public void onClick(View view) {
- final QuickResponse quickResponse = (QuickResponse) view.getTag();
-
- // Delete the QuickResponse from the database. Content watchers used to
- // update the ListView of QuickResponses upon deletion.
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- EmailContent.delete(mContext, quickResponse.getBaseUri(),
- quickResponse.getId());
- }
- });
- }
- };
-
- private static final int resourceId = R.layout.quick_response_item;
- private static final int textViewId = R.id.quick_response_text;
-
- /**
- * Instantiates the custom ArrayAdapter, allowing editing and deletion of QuickResponses.
- * @param context - context of owning activity
- * @param quickResponses - the QuickResponses to represent in the ListView.
- * @param fragmentManager - fragmentManager to which an EditQuickResponseDialog will
- * attach itself.
- * @param accountId - accountId of the QuickResponses
- */
- public ArrayAdapterWithButtons(
- Context context, QuickResponse[] quickResponses,
- FragmentManager fragmentManager, long accountId) {
- super(context, resourceId, textViewId, quickResponses);
- mQuickResponses = quickResponses;
- mAccountId = accountId;
- mContext = context;
- mFragmentManager = fragmentManager;
- }
-
- @Override
- public View getView(final int position, View convertView, ViewGroup parent) {
- convertView = super.getView(position, convertView, parent);
- convertView.setTag(mQuickResponses[position]);
- convertView.setOnClickListener(mOnEditListener);
-
- ImageView deleteIcon = (ImageView) convertView.findViewById(R.id.delete_icon);
- deleteIcon.setTag(mQuickResponses[position]);
- deleteIcon.setOnClickListener(mOnDeleteListener);
-
- return convertView;
- }
- }
-
- /**
- * Finds existing QuickResponses for the specified account and attaches the contents to
- * a ListView. Optionally allows for editing and deleting of QuickResposnes from ListView.
- */
- public static class QuickResponseFinder extends EmailAsyncTask<Void, Void, QuickResponse[]> {
- private final long mAccountId;
- private final ListView mQuickResponsesView;
- private final Context mContext;
- private final FragmentManager mFragmentManager;
- private final OnItemClickListener mListener;
- private final boolean mIsEditable;
-
- /**
- * Finds all QuickResponses for the given account. Creates either a standard ListView
- * with a caller-implemented listener or one with a custom adapter that allows deleting
- * and editing of QuickResponses via EditQuickResponseDialog.
- *
- * @param tracker - tracks the finding and listing of QuickResponses. Should be canceled
- * onDestroy() or when the results are no longer needed.
- * @param accountId - id of the account whose QuickResponses are to be returned
- * @param quickResponsesView - ListView to which an ArrayAdapter with the QuickResponses
- * will be attached.
- * @param context - context of the owning activity
- * @param fragmentManager - required when isEditable is true so that an EditQuickResponse
- * dialog may properly attach itself. Unused when isEditable is false.
- * @param listener - optional when isEditable is true, unused when false.
- * @param isEditable - specifies whether the ListView will allow for user editing of
- * QuickResponses
- */
- public QuickResponseFinder(EmailAsyncTask.Tracker tracker, long accountId,
- ListView quickResponsesView, Context context, FragmentManager fragmentManager,
- OnItemClickListener listener, boolean isEditable) {
- super(tracker);
- mAccountId = accountId;
- mQuickResponsesView = quickResponsesView;
- mContext = context;
- mFragmentManager = fragmentManager;
- mListener = listener;
- mIsEditable = isEditable;
- }
-
- @Override
- protected QuickResponse[] doInBackground(Void... params) {
- QuickResponse[] quickResponses = QuickResponse.restoreQuickResponsesWithAccountId(
- mContext, mAccountId);
- return quickResponses;
- }
-
- @Override
- protected void onSuccess(QuickResponse[] quickResponseItems) {
- ArrayAdapter<QuickResponse> adapter;
- if (mIsEditable) {
- adapter = new ArrayAdapterWithButtons(
- mContext,
- quickResponseItems,
- mFragmentManager,
- mAccountId);
- } else {
- adapter = new ArrayAdapter<QuickResponse>(
- mContext,
- R.layout.insert_quick_response,
- quickResponseItems
- );
- mQuickResponsesView.setOnItemClickListener(mListener);
- }
- mQuickResponsesView.setAdapter(adapter);
- }
- }
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- // startPreferencePanel launches this fragment with the right title initially, but
- // if the device is rotate we must set the title ourselves
- if (savedInstanceState != null) {
- getActivity().setTitle(savedInstanceState.getString(BUNDLE_KEY_ACTIVITY_TITLE));
- }
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- outState.putString(BUNDLE_KEY_ACTIVITY_TITLE, (String) getActivity().getTitle());
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSettingsEditQuickResponsesFragment onCreate");
- }
- super.onCreate(savedInstanceState);
-
- Bundle args = getArguments();
- mAccount = args.getParcelable("account");
- mTaskTracker = new EmailAsyncTask.Tracker();
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSettingsEditQuickResponsesFragment onCreateView");
- }
- int layoutId = R.layout.account_settings_edit_quick_responses_fragment;
- View view = inflater.inflate(layoutId, container, false);
- mContext = getActivity();
-
- mQuickResponsesView = UiUtilities.getView(view,
- R.id.account_settings_quick_responses_list);
- TextView emptyView = (TextView)
- UiUtilities.getView(((ViewGroup) mQuickResponsesView.getParent()), R.id.empty_view);
- mQuickResponsesView.setEmptyView(emptyView);
-
- new QuickResponseFinder(mTaskTracker, mAccount.mId, mQuickResponsesView,
- mContext, getFragmentManager(), null, true)
- .executeParallel();
-
- this.getActivity().getContentResolver().registerContentObserver(
- QuickResponse.CONTENT_URI, false, new ContentObserver(new Handler()) {
- @Override
- public void onChange(boolean selfChange) {
- new QuickResponseFinder(mTaskTracker, mAccount.mId, mQuickResponsesView,
- mContext, getFragmentManager(), null, true)
- .executeParallel();
- }
- });
-
- UiUtilities.getView(view, R.id.create_new).setOnClickListener(this);
-
- return view;
- }
-
- @Override
- public void onDestroy() {
- mTaskTracker.cancellAllInterrupt();
- super.onDestroy();
- }
-
- /**
- * Implements OnClickListener
- */
- @Override
- public void onClick(View v) {
- if (v.getId() == R.id.create_new) {
- EditQuickResponseDialog
- .newInstance(null, mAccount.mId)
- .show(getFragmentManager(), null);
- }
- }
-} \ No newline at end of file
diff --git a/email2/src/com/android/email/activity/setup/AccountSettingsFragment.java b/email2/src/com/android/email/activity/setup/AccountSettingsFragment.java
deleted file mode 100644
index 7c5fc74dc..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSettingsFragment.java
+++ /dev/null
@@ -1,755 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.Activity;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.res.Resources;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.Vibrator;
-import android.preference.CheckBoxPreference;
-import android.preference.EditTextPreference;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.PreferenceCategory;
-import android.preference.RingtonePreference;
-import android.provider.CalendarContract;
-import android.provider.ContactsContract;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.email.R;
-import com.android.email.SecurityPolicy;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.AccountManagerTypes;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Policy;
-import com.android.emailcommon.utility.Utility;
-
-import java.util.ArrayList;
-
-/**
- * Fragment containing the main logic for account settings. This also calls out to other
- * fragments for server settings.
- *
- * TODO: Remove or make async the mAccountDirty reload logic. Probably no longer needed.
- * TODO: Can we defer calling addPreferencesFromResource() until after we load the account? This
- * could reduce flicker.
- */
-public class AccountSettingsFragment extends EmailPreferenceFragment
- implements Preference.OnPreferenceChangeListener {
-
- // Keys used for arguments bundle
- private static final String BUNDLE_KEY_ACCOUNT_ID = "AccountSettingsFragment.AccountId";
- private static final String BUNDLE_KEY_ACCOUNT_EMAIL = "AccountSettingsFragment.Email";
-
- public static final String PREFERENCE_DESCRIPTION = "account_description";
- private static final String PREFERENCE_NAME = "account_name";
- private static final String PREFERENCE_SIGNATURE = "account_signature";
- private static final String PREFERENCE_QUICK_RESPONSES = "account_quick_responses";
- private static final String PREFERENCE_FREQUENCY = "account_check_frequency";
- private static final String PREFERENCE_BACKGROUND_ATTACHMENTS =
- "account_background_attachments";
- private static final String PREFERENCE_DEFAULT = "account_default";
- private static final String PREFERENCE_CATEGORY_DATA_USAGE = "data_usage";
- private static final String PREFERENCE_CATEGORY_NOTIFICATIONS = "account_notifications";
- private static final String PREFERENCE_NOTIFY = "account_notify";
- private static final String PREFERENCE_VIBRATE_WHEN = "account_settings_vibrate_when";
- private static final String PREFERENCE_RINGTONE = "account_ringtone";
- private static final String PREFERENCE_CATEGORY_SERVER = "account_servers";
- private static final String PREFERENCE_CATEGORY_POLICIES = "account_policies";
- private static final String PREFERENCE_POLICIES_ENFORCED = "policies_enforced";
- private static final String PREFERENCE_POLICIES_UNSUPPORTED = "policies_unsupported";
- private static final String PREFERENCE_POLICIES_RETRY_ACCOUNT = "policies_retry_account";
- private static final String PREFERENCE_INCOMING = "incoming";
- private static final String PREFERENCE_OUTGOING = "outgoing";
- private static final String PREFERENCE_SYNC_CONTACTS = "account_sync_contacts";
- private static final String PREFERENCE_SYNC_CALENDAR = "account_sync_calendar";
- private static final String PREFERENCE_SYNC_EMAIL = "account_sync_email";
-
- // These strings must match account_settings_vibrate_when_* strings in strings.xml
- private static final String PREFERENCE_VALUE_VIBRATE_WHEN_ALWAYS = "always";
- private static final String PREFERENCE_VALUE_VIBRATE_WHEN_SILENT = "silent";
- private static final String PREFERENCE_VALUE_VIBRATE_WHEN_NEVER = "never";
-
- private EditTextPreference mAccountDescription;
- private EditTextPreference mAccountName;
- private EditTextPreference mAccountSignature;
- private ListPreference mCheckFrequency;
- private ListPreference mSyncWindow;
- private CheckBoxPreference mAccountBackgroundAttachments;
- private CheckBoxPreference mAccountDefault;
- private CheckBoxPreference mAccountNotify;
- private ListPreference mAccountVibrateWhen;
- private RingtonePreference mAccountRingtone;
- private CheckBoxPreference mSyncContacts;
- private CheckBoxPreference mSyncCalendar;
- private CheckBoxPreference mSyncEmail;
-
- private Context mContext;
- private Account mAccount;
- private boolean mAccountDirty;
- private long mDefaultAccountId;
- private Callback mCallback = EmptyCallback.INSTANCE;
- private boolean mStarted;
- private boolean mLoaded;
- private boolean mSaveOnExit;
-
- /** The e-mail of the account being edited. */
- private String mAccountEmail;
-
- // Async Tasks
- private AsyncTask<?,?,?> mLoadAccountTask;
-
- /**
- * Callback interface that owning activities must provide
- */
- public interface Callback {
- public void onSettingsChanged(Account account, String preference, Object value);
- public void onEditQuickResponses(Account account);
- public void onIncomingSettings(Account account);
- public void onOutgoingSettings(Account account);
- public void abandonEdit();
- }
-
- private static class EmptyCallback implements Callback {
- public static final Callback INSTANCE = new EmptyCallback();
- @Override public void onSettingsChanged(Account account, String preference, Object value) {}
- @Override public void onEditQuickResponses(Account account) {}
- @Override public void onIncomingSettings(Account account) {}
- @Override public void onOutgoingSettings(Account account) {}
- @Override public void abandonEdit() {}
- }
-
- /**
- * If launching with an arguments bundle, use this method to build the arguments.
- */
- public static Bundle buildArguments(long accountId, String email) {
- Bundle b = new Bundle();
- b.putLong(BUNDLE_KEY_ACCOUNT_ID, accountId);
- b.putString(BUNDLE_KEY_ACCOUNT_EMAIL, email);
- return b;
- }
-
- public static String getTitleFromArgs(Bundle args) {
- return (args == null) ? null : args.getString(BUNDLE_KEY_ACCOUNT_EMAIL);
- }
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
- mContext = activity;
- }
-
- /**
- * Called to do initial creation of a fragment. This is called after
- * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSettingsFragment onCreate");
- }
- super.onCreate(savedInstanceState);
-
- // Load the preferences from an XML resource
- addPreferencesFromResource(R.xml.account_settings_preferences);
-
- // Start loading the account data, if provided in the arguments
- // If not, activity must call startLoadingAccount() directly
- Bundle b = getArguments();
- if (b != null) {
- long accountId = b.getLong(BUNDLE_KEY_ACCOUNT_ID, -1);
- mAccountEmail = b.getString(BUNDLE_KEY_ACCOUNT_EMAIL);
- if (accountId >= 0 && !mLoaded) {
- startLoadingAccount(accountId);
- }
- }
-
- mAccountDirty = false;
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSettingsFragment onActivityCreated");
- }
- super.onActivityCreated(savedInstanceState);
- }
-
- /**
- * Called when the Fragment is visible to the user.
- */
- @Override
- public void onStart() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSettingsFragment onStart");
- }
- super.onStart();
- mStarted = true;
-
- // If the loaded account is ready now, load the UI
- if (mAccount != null && !mLoaded) {
- loadSettings();
- }
- }
-
- /**
- * Called when the fragment is visible to the user and actively running.
- * TODO: Don't read account data on UI thread. This should be fixed by removing the need
- * to do this, not by spinning up yet another thread.
- */
- @Override
- public void onResume() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSettingsFragment onResume");
- }
- super.onResume();
-
- if (mAccountDirty) {
- // if we are coming back from editing incoming or outgoing settings,
- // we need to refresh them here so we don't accidentally overwrite the
- // old values we're still holding here
- mAccount.mHostAuthRecv =
- HostAuth.restoreHostAuthWithId(mContext, mAccount.mHostAuthKeyRecv);
- mAccount.mHostAuthSend =
- HostAuth.restoreHostAuthWithId(mContext, mAccount.mHostAuthKeySend);
- // Because "delete policy" UI is on edit incoming settings, we have
- // to refresh that as well.
- Account refreshedAccount = Account.restoreAccountWithId(mContext, mAccount.mId);
- if (refreshedAccount == null || mAccount.mHostAuthRecv == null
- || mAccount.mHostAuthSend == null) {
- mSaveOnExit = false;
- mCallback.abandonEdit();
- return;
- }
- mAccount.setDeletePolicy(refreshedAccount.getDeletePolicy());
- mAccountDirty = false;
- }
- }
-
- @Override
- public void onPause() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSettingsFragment onPause");
- }
- super.onPause();
- if (mSaveOnExit) {
- saveSettings();
- }
- }
-
- /**
- * Called when the Fragment is no longer started.
- */
- @Override
- public void onStop() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSettingsFragment onStop");
- }
- super.onStop();
- mStarted = false;
- }
-
- /**
- * Listen to all preference changes in this class.
- * @param preference
- * @param newValue
- * @return
- */
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue){
- // Can't use a switch here. Falling back to a giant conditional.
- final String key = preference.getKey();
- if (key.equals(PREFERENCE_DESCRIPTION)){
- String summary = newValue.toString().trim();
- if (TextUtils.isEmpty(summary)) {
- summary = mAccount.mEmailAddress;
- }
- mAccountDescription.setSummary(summary);
- mAccountDescription.setText(summary);
- preferenceChanged(PREFERENCE_DESCRIPTION, summary);
- return false;
- } else if (key.equals(PREFERENCE_FREQUENCY)) {
- final String summary = newValue.toString();
- final int index = mCheckFrequency.findIndexOfValue(summary);
- mCheckFrequency.setSummary(mCheckFrequency.getEntries()[index]);
- mCheckFrequency.setValue(summary);
- preferenceChanged(PREFERENCE_FREQUENCY, newValue);
- return false;
- } else if (key.equals(PREFERENCE_SIGNATURE)) {
- // Clean up signature if it's only whitespace (which is easy to do on a
- // soft keyboard) but leave whitespace in place otherwise, to give the user
- // maximum flexibility, e.g. the ability to indent
- String signature = newValue.toString();
- if (signature.trim().isEmpty()) {
- signature = "";
- }
- mAccountSignature.setText(signature);
- preferenceChanged(PREFERENCE_SIGNATURE, signature);
- return false;
- } else if (key.equals(PREFERENCE_NAME)) {
- final String summary = newValue.toString().trim();
- if (!TextUtils.isEmpty(summary)) {
- mAccountName.setSummary(summary);
- mAccountName.setText(summary);
- preferenceChanged(PREFERENCE_NAME, summary);
- }
- return false;
- } else if (key.equals(PREFERENCE_VIBRATE_WHEN)) {
- final String vibrateSetting = newValue.toString();
- final int index = mAccountVibrateWhen.findIndexOfValue(vibrateSetting);
- mAccountVibrateWhen.setSummary(mAccountVibrateWhen.getEntries()[index]);
- mAccountVibrateWhen.setValue(vibrateSetting);
- preferenceChanged(PREFERENCE_VIBRATE_WHEN, newValue);
- return false;
- } else {
- // Default behavior, just indicate that the preferences were written
- preferenceChanged(key, newValue);
- return true;
- }
- }
-
- /**
- * Called when the fragment is no longer in use.
- */
- @Override
- public void onDestroy() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSettingsFragment onDestroy");
- }
- super.onDestroy();
-
- Utility.cancelTaskInterrupt(mLoadAccountTask);
- mLoadAccountTask = null;
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSettingsFragment onSaveInstanceState");
- }
- super.onSaveInstanceState(outState);
- }
-
- /**
- * Activity provides callbacks here
- */
- public void setCallback(Callback callback) {
- mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback;
- }
-
- /**
- * Start loading a single account in preparation for editing it
- */
- public void startLoadingAccount(long accountId) {
- Utility.cancelTaskInterrupt(mLoadAccountTask);
- mLoadAccountTask = new LoadAccountTask().executeOnExecutor(
- AsyncTask.THREAD_POOL_EXECUTOR, accountId);
- }
-
- /**
- * Async task to load account in order to view/edit it
- */
- private class LoadAccountTask extends AsyncTask<Long, Void, Object[]> {
- @Override
- protected Object[] doInBackground(Long... params) {
- long accountId = params[0];
- Account account = Account.restoreAccountWithId(mContext, accountId);
- if (account != null) {
- account.mHostAuthRecv =
- HostAuth.restoreHostAuthWithId(mContext, account.mHostAuthKeyRecv);
- account.mHostAuthSend =
- HostAuth.restoreHostAuthWithId(mContext, account.mHostAuthKeySend);
- if (account.mHostAuthRecv == null || account.mHostAuthSend == null) {
- account = null;
- }
- }
- long defaultAccountId = Account.getDefaultAccountId(mContext);
- return new Object[] { account, Long.valueOf(defaultAccountId) };
- }
-
- @Override
- protected void onPostExecute(Object[] results) {
- if (results != null && !isCancelled()) {
- Account account = (Account) results[0];
- if (account == null) {
- mSaveOnExit = false;
- mCallback.abandonEdit();
- } else {
- mAccount = account;
- mDefaultAccountId = (Long) results[1];
- if (mStarted && !mLoaded) {
- loadSettings();
- }
- }
- }
- }
- }
-
- /**
- * From a Policy, create and return an ArrayList of Strings that describe (simply) those
- * policies that are supported by the OS. At the moment, the strings are simple (e.g.
- * "password required"); we should probably add more information (# characters, etc.), though
- */
- private ArrayList<String> getSystemPoliciesList(Policy policy) {
- Resources res = mContext.getResources();
- ArrayList<String> policies = new ArrayList<String>();
- if (policy.mPasswordMode != Policy.PASSWORD_MODE_NONE) {
- policies.add(res.getString(R.string.policy_require_password));
- }
- if (policy.mPasswordHistory > 0) {
- policies.add(res.getString(R.string.policy_password_history));
- }
- if (policy.mPasswordExpirationDays > 0) {
- policies.add(res.getString(R.string.policy_password_expiration));
- }
- if (policy.mMaxScreenLockTime > 0) {
- policies.add(res.getString(R.string.policy_screen_timeout));
- }
- if (policy.mDontAllowCamera) {
- policies.add(res.getString(R.string.policy_dont_allow_camera));
- }
- if (policy.mMaxEmailLookback != 0) {
- policies.add(res.getString(R.string.policy_email_age));
- }
- if (policy.mMaxCalendarLookback != 0) {
- policies.add(res.getString(R.string.policy_calendar_age));
- }
- return policies;
- }
-
- private void setPolicyListSummary(ArrayList<String> policies, String policiesToAdd,
- String preferenceName) {
- Policy.addPolicyStringToList(policiesToAdd, policies);
- if (policies.size() > 0) {
- Preference p = findPreference(preferenceName);
- StringBuilder sb = new StringBuilder();
- for (String desc: policies) {
- sb.append(desc);
- sb.append('\n');
- }
- p.setSummary(sb.toString());
- }
- }
-
- /**
- * Load account data into preference UI
- */
- private void loadSettings() {
- // We can only do this once, so prevent repeat
- mLoaded = true;
- // Once loaded the data is ready to be saved, as well
- mSaveOnExit = false;
-
- mAccountDescription = (EditTextPreference) findPreference(PREFERENCE_DESCRIPTION);
- mAccountDescription.setSummary(mAccount.getDisplayName());
- mAccountDescription.setText(mAccount.getDisplayName());
- mAccountDescription.setOnPreferenceChangeListener(this);
-
- mAccountName = (EditTextPreference) findPreference(PREFERENCE_NAME);
- String senderName = mAccount.getSenderName();
- // In rare cases, sendername will be null; Change this to empty string to avoid NPE's
- if (senderName == null) senderName = "";
- mAccountName.setSummary(senderName);
- mAccountName.setText(senderName);
- mAccountName.setOnPreferenceChangeListener(this);
-
- mAccountSignature = (EditTextPreference) findPreference(PREFERENCE_SIGNATURE);
- mAccountSignature.setText(mAccount.getSignature());
- mAccountSignature.setOnPreferenceChangeListener(this);
-
- mCheckFrequency = (ListPreference) findPreference(PREFERENCE_FREQUENCY);
- String protocol = Account.getProtocol(mContext, mAccount.mId);
- EmailServiceInfo info = EmailServiceUtils.getServiceInfo(mContext, protocol);
- mCheckFrequency.setEntries(info.syncIntervalStrings);
- mCheckFrequency.setEntryValues(info.syncIntervals);
- mCheckFrequency.setValue(String.valueOf(mAccount.getSyncInterval()));
- mCheckFrequency.setSummary(mCheckFrequency.getEntry());
- mCheckFrequency.setOnPreferenceChangeListener(this);
-
- findPreference(PREFERENCE_QUICK_RESPONSES).setOnPreferenceClickListener(
- new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- mAccountDirty = true;
- mCallback.onEditQuickResponses(mAccount);
- return true;
- }
- });
-
- // Add check window preference
- PreferenceCategory dataUsageCategory =
- (PreferenceCategory) findPreference(PREFERENCE_CATEGORY_DATA_USAGE);
-
- mSyncWindow = null;
- if (info.offerLookback) {
- mSyncWindow = new ListPreference(mContext);
- mSyncWindow.setTitle(R.string.account_setup_options_mail_window_label);
- mSyncWindow.setValue(String.valueOf(mAccount.getSyncLookback()));
- mSyncWindow.setSummary(mSyncWindow.getEntry());
- MailboxSettings.setupLookbackPreferenceOptions(mContext, mSyncWindow, mAccount);
-
- // Must correspond to the hole in the XML file that's reserved.
- mSyncWindow.setOrder(2);
- mSyncWindow.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- final String summary = newValue.toString();
- int index = mSyncWindow.findIndexOfValue(summary);
- mSyncWindow.setSummary(mSyncWindow.getEntries()[index]);
- mSyncWindow.setValue(summary);
- preferenceChanged(preference.getKey(), newValue);
- return false;
- }
- });
- dataUsageCategory.addPreference(mSyncWindow);
- }
-
- mAccountBackgroundAttachments = (CheckBoxPreference)
- findPreference(PREFERENCE_BACKGROUND_ATTACHMENTS);
- if (!info.offerAttachmentPreload) {
- dataUsageCategory.removePreference(mAccountBackgroundAttachments);
- } else {
- mAccountBackgroundAttachments.setChecked(
- 0 != (mAccount.getFlags() & Account.FLAGS_BACKGROUND_ATTACHMENTS));
- mAccountBackgroundAttachments.setOnPreferenceChangeListener(this);
- }
-
- mAccountDefault = (CheckBoxPreference) findPreference(PREFERENCE_DEFAULT);
- mAccountDefault.setChecked(mAccount.mId == mDefaultAccountId);
- mAccountDefault.setOnPreferenceChangeListener(this);
-
- mAccountNotify = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFY);
- mAccountNotify.setChecked(0 != (mAccount.getFlags() & Account.FLAGS_NOTIFY_NEW_MAIL));
- mAccountNotify.setOnPreferenceChangeListener(this);
-
- mAccountRingtone = (RingtonePreference) findPreference(PREFERENCE_RINGTONE);
- mAccountRingtone.setOnPreferenceChangeListener(this);
-
- // The following two lines act as a workaround for the RingtonePreference
- // which does not let us set/get the value programmatically
- SharedPreferences prefs = mAccountRingtone.getPreferenceManager().getSharedPreferences();
- prefs.edit().putString(PREFERENCE_RINGTONE, mAccount.getRingtone()).apply();
-
- // Set the vibrator value, or hide it on devices w/o a vibrator
- mAccountVibrateWhen = (ListPreference) findPreference(PREFERENCE_VIBRATE_WHEN);
- Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
- if (vibrator.hasVibrator()) {
- // Calculate the value to set based on the choices, and set the value.
- final boolean vibrateAlways = 0 != (mAccount.getFlags() & Account.FLAGS_VIBRATE_ALWAYS);
- final boolean vibrateWhenSilent =
- 0 != (mAccount.getFlags() & Account.FLAGS_VIBRATE_WHEN_SILENT);
- final String vibrateSetting =
- vibrateAlways ? PREFERENCE_VALUE_VIBRATE_WHEN_ALWAYS :
- vibrateWhenSilent ? PREFERENCE_VALUE_VIBRATE_WHEN_SILENT :
- PREFERENCE_VALUE_VIBRATE_WHEN_NEVER;
- mAccountVibrateWhen.setValue(vibrateSetting);
-
- // Update the summary string.
- final int index = mAccountVibrateWhen.findIndexOfValue(vibrateSetting);
- mAccountVibrateWhen.setSummary(mAccountVibrateWhen.getEntries()[index]);
-
- // When the value is changed, update the summary in addition to the setting.
- mAccountVibrateWhen.setOnPreferenceChangeListener(this);
- } else {
- // No vibrator present. Remove the preference altogether.
- PreferenceCategory notificationsCategory = (PreferenceCategory)
- findPreference(PREFERENCE_CATEGORY_NOTIFICATIONS);
- notificationsCategory.removePreference(mAccountVibrateWhen);
- }
-
- final Preference retryAccount = findPreference(PREFERENCE_POLICIES_RETRY_ACCOUNT);
- final PreferenceCategory policiesCategory = (PreferenceCategory) findPreference(
- PREFERENCE_CATEGORY_POLICIES);
- if (mAccount.mPolicyKey > 0) {
- // Make sure we have most recent data from account
- mAccount.refresh(mContext);
- Policy policy = Policy.restorePolicyWithId(mContext, mAccount.mPolicyKey);
- if (policy == null) {
- // The account has been deleted? Crazy, but not impossible
- return;
- }
- if (policy.mProtocolPoliciesEnforced != null) {
- ArrayList<String> policies = getSystemPoliciesList(policy);
- setPolicyListSummary(policies, policy.mProtocolPoliciesEnforced,
- PREFERENCE_POLICIES_ENFORCED);
- }
- if (policy.mProtocolPoliciesUnsupported != null) {
- ArrayList<String> policies = new ArrayList<String>();
- setPolicyListSummary(policies, policy.mProtocolPoliciesUnsupported,
- PREFERENCE_POLICIES_UNSUPPORTED);
- } else {
- // Don't show "retry" unless we have unsupported policies
- policiesCategory.removePreference(retryAccount);
- }
- } else {
- // Remove the category completely if there are no policies
- getPreferenceScreen().removePreference(policiesCategory);
- }
-
- retryAccount.setOnPreferenceClickListener(
- new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- // Release the account
- SecurityPolicy.setAccountHoldFlag(mContext, mAccount, false);
- // Remove the preference
- policiesCategory.removePreference(retryAccount);
- return true;
- }
- });
- findPreference(PREFERENCE_INCOMING).setOnPreferenceClickListener(
- new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- mAccountDirty = true;
- mCallback.onIncomingSettings(mAccount);
- return true;
- }
- });
-
- // Hide the outgoing account setup link if it's not activated
- Preference prefOutgoing = findPreference(PREFERENCE_OUTGOING);
- if (info.usesSmtp) {
- prefOutgoing.setOnPreferenceClickListener(
- new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- mAccountDirty = true;
- mCallback.onOutgoingSettings(mAccount);
- return true;
- }
- });
- } else {
- PreferenceCategory serverCategory = (PreferenceCategory) findPreference(
- PREFERENCE_CATEGORY_SERVER);
- serverCategory.removePreference(prefOutgoing);
- }
-
- mSyncContacts = (CheckBoxPreference) findPreference(PREFERENCE_SYNC_CONTACTS);
- mSyncCalendar = (CheckBoxPreference) findPreference(PREFERENCE_SYNC_CALENDAR);
- mSyncEmail = (CheckBoxPreference) findPreference(PREFERENCE_SYNC_EMAIL);
- if (info.syncContacts || info.syncCalendar) {
- android.accounts.Account acct = new android.accounts.Account(mAccount.mEmailAddress,
- info.accountType);
- if (info.syncContacts) {
- mSyncContacts.setChecked(ContentResolver
- .getSyncAutomatically(acct, ContactsContract.AUTHORITY));
- mSyncContacts.setOnPreferenceChangeListener(this);
- } else {
- mSyncContacts.setChecked(false);
- mSyncContacts.setEnabled(false);
- }
- if (info.syncCalendar) {
- mSyncCalendar.setChecked(ContentResolver
- .getSyncAutomatically(acct, CalendarContract.AUTHORITY));
- mSyncCalendar.setOnPreferenceChangeListener(this);
- } else {
- mSyncCalendar.setChecked(false);
- mSyncCalendar.setEnabled(false);
- }
- mSyncEmail.setChecked(ContentResolver
- .getSyncAutomatically(acct, EmailContent.AUTHORITY));
- mSyncEmail.setOnPreferenceChangeListener(this);
- } else {
- dataUsageCategory.removePreference(mSyncContacts);
- dataUsageCategory.removePreference(mSyncCalendar);
- dataUsageCategory.removePreference(mSyncEmail);
- }
- }
-
- /**
- * Called any time a preference is changed.
- */
- private void preferenceChanged(String preference, Object value) {
- mCallback.onSettingsChanged(mAccount, preference, value);
- mSaveOnExit = true;
- }
-
- /*
- * Note: This writes the settings on the UI thread. This has to be done so the settings are
- * committed before we might be killed.
- */
- private void saveSettings() {
- // Turn off all controlled flags - will turn them back on while checking UI elements
- int newFlags = mAccount.getFlags() &
- ~(Account.FLAGS_NOTIFY_NEW_MAIL |
- Account.FLAGS_VIBRATE_ALWAYS | Account.FLAGS_VIBRATE_WHEN_SILENT |
- Account.FLAGS_BACKGROUND_ATTACHMENTS);
-
- newFlags |= mAccountBackgroundAttachments.isChecked() ?
- Account.FLAGS_BACKGROUND_ATTACHMENTS : 0;
- mAccount.setDefaultAccount(mAccountDefault.isChecked());
- // If the display name has been cleared, we'll reset it to the default value (email addr)
- mAccount.setDisplayName(mAccountDescription.getText().trim());
- // The sender name must never be empty (this is enforced by the preference editor)
- mAccount.setSenderName(mAccountName.getText().trim());
- mAccount.setSignature(mAccountSignature.getText());
- newFlags |= mAccountNotify.isChecked() ? Account.FLAGS_NOTIFY_NEW_MAIL : 0;
- mAccount.setSyncInterval(Integer.parseInt(mCheckFrequency.getValue()));
- if (mSyncWindow != null) {
- mAccount.setSyncLookback(Integer.parseInt(mSyncWindow.getValue()));
- }
- if (mAccountVibrateWhen.getValue().equals(PREFERENCE_VALUE_VIBRATE_WHEN_ALWAYS)) {
- newFlags |= Account.FLAGS_VIBRATE_ALWAYS;
- } else if (mAccountVibrateWhen.getValue().equals(PREFERENCE_VALUE_VIBRATE_WHEN_SILENT)) {
- newFlags |= Account.FLAGS_VIBRATE_WHEN_SILENT;
- }
- SharedPreferences prefs = mAccountRingtone.getPreferenceManager().getSharedPreferences();
- mAccount.setRingtone(prefs.getString(PREFERENCE_RINGTONE, null));
- mAccount.setFlags(newFlags);
-
- EmailServiceInfo info =
- EmailServiceUtils.getServiceInfo(mContext, mAccount.getProtocol(mContext));
- if (info.syncContacts || info.syncCalendar) {
- android.accounts.Account acct = new android.accounts.Account(mAccount.mEmailAddress,
- AccountManagerTypes.TYPE_EXCHANGE);
- ContentResolver.setSyncAutomatically(acct, ContactsContract.AUTHORITY,
- mSyncContacts.isChecked());
- ContentResolver.setSyncAutomatically(acct, CalendarContract.AUTHORITY,
- mSyncCalendar.isChecked());
- ContentResolver.setSyncAutomatically(acct, EmailContent.AUTHORITY,
- mSyncEmail.isChecked());
- }
-
- // Commit the changes
- // Note, this is done in the UI thread because at this point, we must commit
- // all changes - any time after onPause completes, we could be killed. This is analogous
- // to the way that SharedPreferences tries to work off-thread in apply(), but will pause
- // until completion in onPause().
- ContentValues cv = AccountSettingsUtils.getAccountContentValues(mAccount);
- mAccount.update(mContext, cv);
-
- // Run the remaining changes off-thread
- MailActivityEmail.setServicesEnabledAsync(mContext);
- }
-
- public String getAccountEmail() {
- // Get the e-mail address of the account being editted, if this is for an existing account.
- return mAccountEmail;
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountSettingsUtils.java b/email2/src/com/android/email/activity/setup/AccountSettingsUtils.java
deleted file mode 100644
index 16e9df148..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSettingsUtils.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.res.XmlResourceParser;
-import android.text.Editable;
-import android.text.TextUtils;
-import android.util.Log;
-import android.widget.EditText;
-
-import com.android.email.R;
-import com.android.email.VendorPolicyLoader;
-import com.android.email.provider.AccountBackupRestore;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.provider.QuickResponse;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.io.Serializable;
-
-public class AccountSettingsUtils {
-
- /** Pattern to match any part of a domain */
- private final static String WILD_STRING = "*";
- /** Will match any, single character */
- private final static char WILD_CHARACTER = '?';
- private final static String DOMAIN_SEPARATOR = "\\.";
-
- /**
- * Commits the UI-related settings of an account to the provider. This is static so that it
- * can be used by the various account activities. If the account has never been saved, this
- * method saves it; otherwise, it just saves the settings.
- * @param context the context of the caller
- * @param account the account whose settings will be committed
- */
- public static void commitSettings(Context context, Account account) {
- if (!account.isSaved()) {
- account.save(context);
-
- // Set up default quick responses here...
- String[] defaultQuickResponses =
- context.getResources().getStringArray(R.array.default_quick_responses);
- ContentValues cv = new ContentValues();
- cv.put(QuickResponse.ACCOUNT_KEY, account.mId);
- ContentResolver resolver = context.getContentResolver();
- for (String quickResponse: defaultQuickResponses) {
- // Allow empty entries (some localizations may not want to have the maximum
- // number)
- if (!TextUtils.isEmpty(quickResponse)) {
- cv.put(QuickResponse.TEXT, quickResponse);
- resolver.insert(QuickResponse.CONTENT_URI, cv);
- }
- }
- } else {
- ContentValues cv = getAccountContentValues(account);
- account.update(context, cv);
- }
-
- // Update the backup (side copy) of the accounts
- AccountBackupRestore.backup(context);
- }
-
- /**
- * Returns a set of content values to commit account changes (not including the foreign keys
- * for the two host auth's and policy) to the database. Does not actually commit anything.
- */
- public static ContentValues getAccountContentValues(Account account) {
- ContentValues cv = new ContentValues();
- cv.put(AccountColumns.IS_DEFAULT, account.mIsDefault);
- cv.put(AccountColumns.DISPLAY_NAME, account.getDisplayName());
- cv.put(AccountColumns.SENDER_NAME, account.getSenderName());
- cv.put(AccountColumns.SIGNATURE, account.getSignature());
- cv.put(AccountColumns.SYNC_INTERVAL, account.mSyncInterval);
- cv.put(AccountColumns.RINGTONE_URI, account.mRingtoneUri);
- cv.put(AccountColumns.FLAGS, account.mFlags);
- cv.put(AccountColumns.SYNC_LOOKBACK, account.mSyncLookback);
- cv.put(AccountColumns.SECURITY_SYNC_KEY, account.mSecuritySyncKey);
- return cv;
- }
-
- /**
- * Search the list of known Email providers looking for one that matches the user's email
- * domain. We check for vendor supplied values first, then we look in providers_product.xml,
- * and finally by the entries in platform providers.xml. This provides a nominal override
- * capability.
- *
- * A match is defined as any provider entry for which the "domain" attribute matches.
- *
- * @param domain The domain portion of the user's email address
- * @return suitable Provider definition, or null if no match found
- */
- public static Provider findProviderForDomain(Context context, String domain) {
- Provider p = VendorPolicyLoader.getInstance(context).findProviderForDomain(domain);
- if (p == null) {
- p = findProviderForDomain(context, domain, R.xml.providers_product);
- }
- if (p == null) {
- p = findProviderForDomain(context, domain, R.xml.providers);
- }
- return p;
- }
-
- /**
- * Search a single resource containing known Email provider definitions.
- *
- * @param domain The domain portion of the user's email address
- * @param resourceId Id of the provider resource to scan
- * @return suitable Provider definition, or null if no match found
- */
- /*package*/ static Provider findProviderForDomain(
- Context context, String domain, int resourceId) {
- try {
- XmlResourceParser xml = context.getResources().getXml(resourceId);
- int xmlEventType;
- Provider provider = null;
- while ((xmlEventType = xml.next()) != XmlResourceParser.END_DOCUMENT) {
- if (xmlEventType == XmlResourceParser.START_TAG
- && "provider".equals(xml.getName())) {
- String providerDomain = getXmlAttribute(context, xml, "domain");
- try {
- if (matchProvider(domain, providerDomain)) {
- provider = new Provider();
- provider.id = getXmlAttribute(context, xml, "id");
- provider.label = getXmlAttribute(context, xml, "label");
- provider.domain = domain.toLowerCase();
- provider.note = getXmlAttribute(context, xml, "note");
- }
- } catch (IllegalArgumentException e) {
- Log.w(Logging.LOG_TAG, "providers line: " + xml.getLineNumber() +
- "; Domain contains multiple globals");
- }
- }
- else if (xmlEventType == XmlResourceParser.START_TAG
- && "incoming".equals(xml.getName())
- && provider != null) {
- provider.incomingUriTemplate = getXmlAttribute(context, xml, "uri");
- provider.incomingUsernameTemplate = getXmlAttribute(context, xml, "username");
- }
- else if (xmlEventType == XmlResourceParser.START_TAG
- && "outgoing".equals(xml.getName())
- && provider != null) {
- provider.outgoingUriTemplate = getXmlAttribute(context, xml, "uri");
- provider.outgoingUsernameTemplate = getXmlAttribute(context, xml, "username");
- }
- else if (xmlEventType == XmlResourceParser.END_TAG
- && "provider".equals(xml.getName())
- && provider != null) {
- return provider;
- }
- }
- }
- catch (Exception e) {
- Log.e(Logging.LOG_TAG, "Error while trying to load provider settings.", e);
- }
- return null;
- }
-
- /**
- * Returns true if the string <code>s1</code> matches the string <code>s2</code>. The string
- * <code>s2</code> may contain any number of wildcards -- a '?' character -- and/or asterisk
- * characters -- '*'. Wildcards match any single character, while the asterisk matches a domain
- * part (i.e. substring demarcated by a period, '.')
- */
- @VisibleForTesting
- static boolean matchProvider(String testDomain, String providerDomain) {
- String[] testParts = testDomain.split(DOMAIN_SEPARATOR);
- String[] providerParts = providerDomain.split(DOMAIN_SEPARATOR);
- if (testParts.length != providerParts.length) {
- return false;
- }
- for (int i = 0; i < testParts.length; i++) {
- String testPart = testParts[i].toLowerCase();
- String providerPart = providerParts[i].toLowerCase();
- if (!providerPart.equals(WILD_STRING) &&
- !matchWithWildcards(testPart, providerPart)) {
- return false;
- }
- }
- return true;
- }
-
- private static boolean matchWithWildcards(String testPart, String providerPart) {
- int providerLength = providerPart.length();
- if (testPart.length() != providerLength){
- return false;
- }
- for (int i = 0; i < providerLength; i++) {
- char testChar = testPart.charAt(i);
- char providerChar = providerPart.charAt(i);
- if (testChar != providerChar && providerChar != WILD_CHARACTER) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Attempts to get the given attribute as a String resource first, and if it fails
- * returns the attribute as a simple String value.
- * @param xml
- * @param name
- * @return the requested resource
- */
- private static String getXmlAttribute(Context context, XmlResourceParser xml, String name) {
- int resId = xml.getAttributeResourceValue(null, name, 0);
- if (resId == 0) {
- return xml.getAttributeValue(null, name);
- }
- else {
- return context.getString(resId);
- }
- }
-
- public static class Provider implements Serializable {
- private static final long serialVersionUID = 8511656164616538989L;
-
- public String id;
- public String label;
- public String domain;
- public String incomingUriTemplate;
- public String incomingUsernameTemplate;
- public String outgoingUriTemplate;
- public String outgoingUsernameTemplate;
- public String incomingUri;
- public String incomingUsername;
- public String outgoingUri;
- public String outgoingUsername;
- public String note;
-
- /**
- * Expands templates in all of the provider fields that support them. Currently,
- * templates are used in 4 fields -- incoming and outgoing URI and user name.
- * @param email user-specified data used to replace template values
- */
- public void expandTemplates(String email) {
- String[] emailParts = email.split("@");
- String user = emailParts[0];
-
- incomingUri = expandTemplate(incomingUriTemplate, email, user);
- incomingUsername = expandTemplate(incomingUsernameTemplate, email, user);
- outgoingUri = expandTemplate(outgoingUriTemplate, email, user);
- outgoingUsername = expandTemplate(outgoingUsernameTemplate, email, user);
- }
-
- /**
- * Replaces all parameterized values in the given template. The values replaced are
- * $domain, $user and $email.
- */
- private String expandTemplate(String template, String email, String user) {
- String returnString = template;
- returnString = returnString.replaceAll("\\$email", email);
- returnString = returnString.replaceAll("\\$user", user);
- returnString = returnString.replaceAll("\\$domain", domain);
- return returnString;
- }
- }
-
- /**
- * Infer potential email server addresses from domain names
- *
- * Incoming: Prepend "imap" or "pop3" to domain, unless "pop", "pop3",
- * "imap", or "mail" are found.
- * Outgoing: Prepend "smtp" if domain starts with any in the host prefix array
- *
- * @param server name as we know it so far
- * @param incoming "pop3" or "imap" (or null)
- * @param outgoing "smtp" or null
- * @return the post-processed name for use in the UI
- */
- public static String inferServerName(Context context, String server, String incoming,
- String outgoing) {
- // Default values cause entire string to be kept, with prepended server string
- int keepFirstChar = 0;
- int firstDotIndex = server.indexOf('.');
- if (firstDotIndex != -1) {
- // look at first word and decide what to do
- String firstWord = server.substring(0, firstDotIndex).toLowerCase();
- String[] hostPrefixes =
- context.getResources().getStringArray(R.array.smtp_host_prefixes);
- boolean canSubstituteSmtp = Utility.arrayContains(hostPrefixes, firstWord);
- boolean isMail = "mail".equals(firstWord);
- // Now decide what to do
- if (incoming != null) {
- // For incoming, we leave imap/pop/pop3/mail alone, or prepend incoming
- if (canSubstituteSmtp || isMail) {
- return server;
- }
- } else {
- // For outgoing, replace imap/pop/pop3 with outgoing, leave mail alone, or
- // prepend outgoing
- if (canSubstituteSmtp) {
- keepFirstChar = firstDotIndex + 1;
- } else if (isMail) {
- return server;
- } else {
- // prepend
- }
- }
- }
- return ((incoming != null) ? incoming : outgoing) + '.' + server.substring(keepFirstChar);
- }
-
- /**
- * Helper to set error status on password fields that have leading or trailing spaces
- */
- public static void checkPasswordSpaces(Context context, EditText passwordField) {
- Editable password = passwordField.getText();
- int length = password.length();
- if (length > 0) {
- if (password.charAt(0) == ' ' || password.charAt(length-1) == ' ') {
- passwordField.setError(context.getString(R.string.account_password_spaces_error));
- }
- }
- }
-
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountSetupActivity.java b/email2/src/com/android/email/activity/setup/AccountSetupActivity.java
deleted file mode 100644
index 7257289d8..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSetupActivity.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.util.Log;
-
-/**
- * Superclass of all of the account setup activities; ensures that SetupData state is saved/restored
- * automatically as required
- */
-public class AccountSetupActivity extends Activity {
- private static final boolean DEBUG_SETUP_FLOWS = false; // Don't check in set to true
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- SetupData.restore(savedInstanceState);
- super.onCreate(savedInstanceState);
- if (DEBUG_SETUP_FLOWS) {
- Log.d(getClass().getName(), SetupData.debugString());
- }
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- SetupData.save(outState);
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountSetupBasics.java b/email2/src/com/android/email/activity/setup/AccountSetupBasics.java
deleted file mode 100644
index 506c82706..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSetupBasics.java
+++ /dev/null
@@ -1,744 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.accounts.AccountAuthenticatorResponse;
-import android.accounts.AccountManager;
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.FragmentTransaction;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.util.Log;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.android.email.EmailAddressValidator;
-import com.android.email.R;
-import com.android.email.activity.ActivityHelper;
-import com.android.email.activity.UiUtilities;
-import com.android.email.activity.setup.AccountSettingsUtils.Provider;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.service.SyncWindow;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.net.URISyntaxException;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.FutureTask;
-
-/**
- * Prompts the user for the email address and password. Also prompts for "Use this account as
- * default" if this is the 2nd+ account being set up.
- *
- * If the domain is well-known, the account is configured fully and checked immediately
- * using AccountCheckSettingsFragment. If this succeeds we proceed directly to AccountSetupOptions.
- *
- * If the domain is not known, or the user selects Manual setup, we invoke the
- * AccountSetupAccountType activity where the user can begin to manually configure the account.
- *
- * === Support for automated testing ==
- * This activity can also be launched directly via ACTION_CREATE_ACCOUNT. This is intended
- * only for use by continuous test systems, and is currently only available when
- * {@link ActivityManager#isRunningInTestHarness()} is set. To use this mode, you must construct
- * an intent which contains all necessary information to create the account. No connection
- * checking is done, so the account may or may not actually work. Here is a sample command, for a
- * gmail account "test_account" with a password of "test_password".
- *
- * $ adb shell am start -a com.android.email.CREATE_ACCOUNT \
- * -e EMAIL test_account@gmail.com \
- * -e USER "Test Account Name" \
- * -e INCOMING imap+ssl+://test_account:test_password@imap.gmail.com \
- * -e OUTGOING smtp+ssl+://test_account:test_password@smtp.gmail.com
- *
- * Note: For accounts that require the full email address in the login, encode the @ as %40.
- * Note: Exchange accounts that require device security policies cannot be created automatically.
- */
-public class AccountSetupBasics extends AccountSetupActivity
- implements OnClickListener, TextWatcher, AccountCheckSettingsFragment.Callbacks {
-
- private final static boolean ENTER_DEBUG_SCREEN = true;
-
- /**
- * Direct access for forcing account creation
- * For use by continuous automated test system (e.g. in conjunction with monkey tests)
- */
- private static final String ACTION_CREATE_ACCOUNT = "com.android.email.CREATE_ACCOUNT";
- private static final String EXTRA_FLOW_MODE = "FLOW_MODE";
- private static final String EXTRA_FLOW_ACCOUNT_TYPE = "FLOW_ACCOUNT_TYPE";
- private static final String EXTRA_CREATE_ACCOUNT_EMAIL = "EMAIL";
- private static final String EXTRA_CREATE_ACCOUNT_USER = "USER";
- private static final String EXTRA_CREATE_ACCOUNT_INCOMING = "INCOMING";
- private static final String EXTRA_CREATE_ACCOUNT_OUTGOING = "OUTGOING";
- private static final Boolean DEBUG_ALLOW_NON_TEST_HARNESS_CREATION = false;
-
- private static final String STATE_KEY_PROVIDER = "AccountSetupBasics.provider";
-
- // NOTE: If you change this value, confirm that the new interval exists in arrays.xml
- private static final int DEFAULT_ACCOUNT_CHECK_INTERVAL = 15;
-
- // Support for UI
- private EditText mEmailView;
- private EditText mPasswordView;
- private CheckBox mDefaultView;
- private final EmailAddressValidator mEmailValidator = new EmailAddressValidator();
- private Provider mProvider;
- private Button mManualButton;
- private Button mNextButton;
- private boolean mNextButtonInhibit;
- private boolean mPaused;
- private boolean mReportAccountAuthenticatorError;
-
- // FutureTask to look up the owner
- FutureTask<String> mOwnerLookupTask;
-
- public static void actionNewAccount(Activity fromActivity) {
- Intent i = new Intent(fromActivity, AccountSetupBasics.class);
- i.putExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_NORMAL);
- fromActivity.startActivity(i);
- }
-
- public static void actionNewAccountWithResult(Activity fromActivity) {
- Intent i = new ForwardingIntent(fromActivity, AccountSetupBasics.class);
- i.putExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_NO_ACCOUNTS);
- fromActivity.startActivity(i);
- }
-
- /**
- * This generates setup data that can be used to start a self-contained account creation flow
- * for exchange accounts.
- */
- public static Intent actionGetCreateAccountIntent(Context context, String accountManagerType) {
- Intent i = new Intent(context, AccountSetupBasics.class);
- i.putExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_ACCOUNT_MANAGER);
- i.putExtra(EXTRA_FLOW_ACCOUNT_TYPE, accountManagerType);
- return i;
- }
-
- public static void actionAccountCreateFinishedAccountFlow(Activity fromActivity) {
- // TODO: handle this case - modifying state on SetupData when instantiating an Intent
- // is not safe, since it's not guaranteed that an Activity will run with the Intent, and
- // information can get lost.
-
- Intent i= new ForwardingIntent(fromActivity, AccountSetupBasics.class);
- // If we're in the "account flow" (from AccountManager), we want to return to the caller
- // (in the settings app)
- SetupData.init(SetupData.FLOW_MODE_RETURN_TO_CALLER);
- i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- fromActivity.startActivity(i);
- }
-
- public static void actionAccountCreateFinishedWithResult(Activity fromActivity) {
- // TODO: handle this case - modifying state on SetupData when instantiating an Intent
- // is not safe, since it's not guaranteed that an Activity will run with the Intent, and
- // information can get lost.
-
- Intent i= new ForwardingIntent(fromActivity, AccountSetupBasics.class);
- // If we're in the "no accounts" flow, we want to return to the caller with a result
- SetupData.init(SetupData.FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT);
- i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- fromActivity.startActivity(i);
- }
-
- @SuppressWarnings("deprecation")
- public static void actionAccountCreateFinished(final Activity fromActivity,
- final long accountId) {
- Utility.runAsync(new Runnable() {
- @Override
- public void run() {
- Intent i = new Intent(fromActivity, AccountSetupBasics.class);
- // If we're not in the "account flow" (from AccountManager), we want to show the
- // message list for the new inbox
- Account account = Account.restoreAccountWithId(fromActivity, accountId);
- SetupData.init(SetupData.FLOW_MODE_RETURN_TO_MESSAGE_LIST, account);
- i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- fromActivity.startActivity(i);
- }});
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityHelper.debugSetWindowFlags(this);
-
- // Check for forced account creation first, as it comes from an externally-generated
- // intent and won't have any SetupData prepared.
- String action = getIntent().getAction();
- if (ACTION_CREATE_ACCOUNT.equals(action)) {
- SetupData.init(SetupData.FLOW_MODE_FORCE_CREATE);
- }
-
- int flowMode = getIntent().getIntExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_UNSPECIFIED);
- if (flowMode != SetupData.FLOW_MODE_UNSPECIFIED) {
- SetupData.init(flowMode, getIntent().getStringExtra(EXTRA_FLOW_ACCOUNT_TYPE));
- } else {
- // TODO: get rid of this case. It's not safe to rely on this global static state. It
- // should be specified in the Intent always.
- flowMode = SetupData.getFlowMode();
- }
-
- if (flowMode == SetupData.FLOW_MODE_RETURN_TO_CALLER) {
- // Return to the caller who initiated account creation
- finish();
- return;
- } else if (flowMode == SetupData.FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT) {
- if (EmailContent.count(this, Account.CONTENT_URI) > 0) {
- setResult(RESULT_OK);
- } else {
- setResult(RESULT_CANCELED);
- }
- finish();
- return;
- } else if (flowMode == SetupData.FLOW_MODE_RETURN_TO_MESSAGE_LIST) {
- Account account = SetupData.getAccount();
- if (account != null && account.mId >= 0) {
- // Show the message list for the new account
- //***
- //Welcome.actionOpenAccountInbox(this, account.mId);
- finish();
- return;
- }
- }
-
- setContentView(R.layout.account_setup_basics);
-
- mEmailView = (EditText) UiUtilities.getView(this, R.id.account_email);
- mPasswordView = (EditText) UiUtilities.getView(this, R.id.account_password);
- mDefaultView = (CheckBox) UiUtilities.getView(this, R.id.account_default);
-
- mEmailView.addTextChangedListener(this);
- mPasswordView.addTextChangedListener(this);
-
- // If there are one or more accounts already in existence, then display
- // the "use as default" checkbox (it defaults to hidden).
- new DisplayCheckboxTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
-
- boolean manualButtonDisplayed = true;
-
- // Configure buttons
- mManualButton = (Button) UiUtilities.getView(this, R.id.manual_setup);
- mNextButton = (Button) UiUtilities.getView(this, R.id.next);
- mManualButton.setVisibility(manualButtonDisplayed ? View.VISIBLE : View.INVISIBLE);
- mManualButton.setOnClickListener(this);
- mNextButton.setOnClickListener(this);
- // Force disabled until validator notifies otherwise
- onEnableProceedButtons(false);
- // Lightweight debounce while Async tasks underway
- mNextButtonInhibit = false;
-
- // Set aside incoming AccountAuthenticatorResponse, if there was any
- AccountAuthenticatorResponse authenticatorResponse =
- getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
- SetupData.setAccountAuthenticatorResponse(authenticatorResponse);
- if (authenticatorResponse != null) {
- // When this Activity is called as part of account authentification flow,
- // we are responsible for eventually reporting the result (success or failure) to
- // the account manager. Most exit paths represent an failed or abandoned setup,
- // so the default is to report the error. Success will be reported by the code in
- // AccountSetupOptions that commits the finally created account.
- mReportAccountAuthenticatorError = true;
- }
-
- // Load fields, but only once
- String userName = SetupData.getUsername();
- if (userName != null) {
- mEmailView.setText(userName);
- SetupData.setUsername(null);
- }
- String password = SetupData.getPassword();
- if (userName != null) {
- mPasswordView.setText(password);
- SetupData.setPassword(null);
- }
-
- // Handle force account creation immediately (now that fragment is set up)
- // This is never allowed in a normal user build and will exit immediately.
- if (SetupData.getFlowMode() == SetupData.FLOW_MODE_FORCE_CREATE) {
- if (!DEBUG_ALLOW_NON_TEST_HARNESS_CREATION &&
- !ActivityManager.isRunningInTestHarness()) {
- Log.e(Logging.LOG_TAG,
- "ERROR: Force account create only allowed while in test harness");
- finish();
- return;
- }
- Intent intent = getIntent();
- String email = intent.getStringExtra(EXTRA_CREATE_ACCOUNT_EMAIL);
- String user = intent.getStringExtra(EXTRA_CREATE_ACCOUNT_USER);
- String incoming = intent.getStringExtra(EXTRA_CREATE_ACCOUNT_INCOMING);
- String outgoing = intent.getStringExtra(EXTRA_CREATE_ACCOUNT_OUTGOING);
- if (TextUtils.isEmpty(email) || TextUtils.isEmpty(user) ||
- TextUtils.isEmpty(incoming) || TextUtils.isEmpty(outgoing)) {
- Log.e(Logging.LOG_TAG, "ERROR: Force account create requires extras EMAIL, USER, " +
- "INCOMING, OUTGOING");
- finish();
- return;
- }
- forceCreateAccount(email, user, incoming, outgoing);
- onCheckSettingsComplete(AccountCheckSettingsFragment.CHECK_SETTINGS_OK); // calls finish
- return;
- }
-
- if (savedInstanceState != null && savedInstanceState.containsKey(STATE_KEY_PROVIDER)) {
- mProvider = (Provider) savedInstanceState.getSerializable(STATE_KEY_PROVIDER);
- }
-
- // Launch a worker to look up the owner name. It should be ready well in advance of
- // the time the user clicks next or manual.
- mOwnerLookupTask = new FutureTask<String>(mOwnerLookupCallable);
- Utility.runAsync(mOwnerLookupTask);
- }
-
- @Override
- public void onPause() {
- super.onPause();
- mPaused = true;
- }
-
- @Override
- public void onResume() {
- super.onResume();
- mPaused = false;
- }
-
- @Override
- public void finish() {
- // If the account manager initiated the creation, and success was not reported,
- // then we assume that we're giving up (for any reason) - report failure.
- if (mReportAccountAuthenticatorError) {
- AccountAuthenticatorResponse authenticatorResponse =
- SetupData.getAccountAuthenticatorResponse();
- if (authenticatorResponse != null) {
- authenticatorResponse.onError(AccountManager.ERROR_CODE_CANCELED, "canceled");
- SetupData.setAccountAuthenticatorResponse(null);
- }
- }
- super.finish();
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- if (mProvider != null) {
- outState.putSerializable(STATE_KEY_PROVIDER, mProvider);
- }
- }
-
- /**
- * Implements OnClickListener
- */
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.next:
- // Simple debounce - just ignore while async checks are underway
- if (mNextButtonInhibit) {
- return;
- }
- onNext();
- break;
- case R.id.manual_setup:
- onManualSetup(false);
- break;
- }
- }
-
- /**
- * Implements TextWatcher
- */
- @Override
- public void afterTextChanged(Editable s) {
- validateFields();
- }
-
- /**
- * Implements TextWatcher
- */
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
-
- /**
- * Implements TextWatcher
- */
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- }
-
- private void validateFields() {
- boolean valid = Utility.isTextViewNotEmpty(mEmailView)
- && Utility.isTextViewNotEmpty(mPasswordView)
- && mEmailValidator.isValid(mEmailView.getText().toString().trim());
- onEnableProceedButtons(valid);
-
- // Warn (but don't prevent) if password has leading/trailing spaces
- AccountSettingsUtils.checkPasswordSpaces(this, mPasswordView);
- }
-
- /**
- * Return an existing username if found, or null. This is the result of the Callable (below).
- */
- private String getOwnerName() {
- String result = null;
- try {
- result = mOwnerLookupTask.get();
- } catch (InterruptedException e) {
- } catch (ExecutionException e) {
- }
- return result;
- }
-
- /**
- * Callable that returns the username (based on other accounts) or null.
- */
- private final Callable<String> mOwnerLookupCallable = new Callable<String>() {
- @Override
- public String call() {
- Context context = AccountSetupBasics.this;
- String name = null;
- long defaultId = Account.getDefaultAccountId(context);
- if (defaultId != -1) {
- Account account = Account.restoreAccountWithId(context, defaultId);
- if (account != null) {
- name = account.getSenderName();
- }
- }
- return name;
- }
- };
-
- /**
- * Finish the auto setup process, in some cases after showing a warning dialog.
- */
- private void finishAutoSetup() {
- String email = mEmailView.getText().toString().trim();
- String password = mPasswordView.getText().toString();
-
- try {
- mProvider.expandTemplates(email);
-
- Account account = SetupData.getAccount();
- HostAuth recvAuth = account.getOrCreateHostAuthRecv(this);
- HostAuth.setHostAuthFromString(recvAuth, mProvider.incomingUri);
- recvAuth.setLogin(mProvider.incomingUsername, password);
- EmailServiceInfo info = EmailServiceUtils.getServiceInfo(this, recvAuth.mProtocol);
- recvAuth.mPort =
- ((recvAuth.mFlags & HostAuth.FLAG_SSL) != 0) ? info.portSsl : info.port;
-
- HostAuth sendAuth = account.getOrCreateHostAuthSend(this);
- HostAuth.setHostAuthFromString(sendAuth, mProvider.outgoingUri);
- sendAuth.setLogin(mProvider.outgoingUsername, password);
-
- // Populate the setup data, assuming that the duplicate account check will succeed
- populateSetupData(getOwnerName(), email, mDefaultView.isChecked());
-
- // Stop here if the login credentials duplicate an existing account
- // Launch an Async task to do the work
- new DuplicateCheckTask(this, recvAuth.mAddress, mProvider.incomingUsername)
- .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- } catch (URISyntaxException e) {
- /*
- * If there is some problem with the URI we give up and go on to manual setup.
- * Technically speaking, AutoDiscover is OK here, since the user clicked "Next"
- * to get here. This will not happen in practice because we don't expect to
- * find any EAS accounts in the providers list.
- */
- onManualSetup(true);
- }
- }
-
- /**
- * Async task that continues the work of finishAutoSetup(). Checks for a duplicate
- * account and then either alerts the user, or continues.
- */
- private class DuplicateCheckTask extends AsyncTask<Void, Void, Account> {
- private final Context mContext;
- private final String mCheckHost;
- private final String mCheckLogin;
-
- public DuplicateCheckTask(Context context, String checkHost, String checkLogin) {
- mContext = context;
- mCheckHost = checkHost;
- mCheckLogin = checkLogin;
- // Prevent additional clicks on the next button during Async lookup
- mNextButtonInhibit = true;
- }
-
- @Override
- protected Account doInBackground(Void... params) {
- Account account = Utility.findExistingAccount(mContext, -1,
- mCheckHost, mCheckLogin);
- return account;
- }
-
- @Override
- protected void onPostExecute(Account duplicateAccount) {
- mNextButtonInhibit = false;
- // Exit immediately if the user left before we finished
- if (mPaused) return;
- // Show duplicate account warning, or proceed
- if (duplicateAccount != null) {
- DuplicateAccountDialogFragment dialogFragment =
- DuplicateAccountDialogFragment.newInstance(duplicateAccount.mDisplayName);
- dialogFragment.show(getFragmentManager(), DuplicateAccountDialogFragment.TAG);
- return;
- } else {
- AccountCheckSettingsFragment checkerFragment =
- AccountCheckSettingsFragment.newInstance(
- SetupData.CHECK_INCOMING | SetupData.CHECK_OUTGOING, null);
- FragmentTransaction transaction = getFragmentManager().beginTransaction();
- transaction.add(checkerFragment, AccountCheckSettingsFragment.TAG);
- transaction.addToBackStack("back");
- transaction.commit();
- }
- }
- }
-
- /**
- * When "next" button is clicked
- */
- private void onNext() {
- // Try auto-configuration from XML providers (unless in EAS mode, we can skip it)
- String email = mEmailView.getText().toString().trim();
- String[] emailParts = email.split("@");
- String domain = emailParts[1].trim();
- mProvider = AccountSettingsUtils.findProviderForDomain(this, domain);
- if (mProvider != null) {
- if (mProvider.note != null) {
- NoteDialogFragment dialogFragment =
- NoteDialogFragment.newInstance(mProvider.note);
- dialogFragment.show(getFragmentManager(), NoteDialogFragment.TAG);
- } else {
- finishAutoSetup();
- }
- return;
- }
- // Can't use auto setup (although EAS accounts may still be able to AutoDiscover)
- onManualSetup(true);
- }
-
- /**
- * When "manual setup" button is clicked
- *
- * @param allowAutoDiscover - true if the user clicked 'next' and (if the account is EAS)
- * it's OK to use autodiscover. false to prevent autodiscover and go straight to manual setup.
- * Ignored for IMAP & POP accounts.
- */
- private void onManualSetup(boolean allowAutoDiscover) {
- String email = mEmailView.getText().toString().trim();
- String password = mPasswordView.getText().toString();
- String[] emailParts = email.split("@");
- String user = emailParts[0].trim();
- String domain = emailParts[1].trim();
-
- // Alternate entry to the debug options screen (for devices without a physical keyboard:
- // Username: d@d.d
- // Password: debug
- if (ENTER_DEBUG_SCREEN && "d@d.d".equals(email) && "debug".equals(password)) {
- mEmailView.setText("");
- mPasswordView.setText("");
- AccountSettings.actionSettingsWithDebug(this);
- return;
- }
-
- Account account = SetupData.getAccount();
- HostAuth recvAuth = account.getOrCreateHostAuthRecv(this);
- recvAuth.setLogin(user, password);
- recvAuth.setConnection(null, domain, HostAuth.PORT_UNKNOWN, HostAuth.FLAG_NONE);
-
- HostAuth sendAuth = account.getOrCreateHostAuthSend(this);
- sendAuth.setLogin(user, password);
- sendAuth.setConnection(null, domain, HostAuth.PORT_UNKNOWN, HostAuth.FLAG_NONE);
-
- populateSetupData(getOwnerName(), email, mDefaultView.isChecked());
-
- SetupData.setAllowAutodiscover(allowAutoDiscover);
- AccountSetupType.actionSelectAccountType(this);
- }
-
- /**
- * To support continuous testing, we allow the forced creation of accounts.
- * This works in a manner fairly similar to automatic setup, in which the complete server
- * Uri's are available, except that we will also skip checking (as if both checks were true)
- * and all other UI.
- *
- * @param email The email address for the new account
- * @param user The user name for the new account
- * @param incoming The URI-style string defining the incoming account
- * @param outgoing The URI-style string defining the outgoing account
- */
- private void forceCreateAccount(String email, String user, String incoming, String outgoing) {
- Account account = SetupData.getAccount();
- try {
- HostAuth recvAuth = account.getOrCreateHostAuthRecv(this);
- HostAuth.setHostAuthFromString(recvAuth, incoming);
-
- HostAuth sendAuth = account.getOrCreateHostAuthSend(this);
- HostAuth.setHostAuthFromString(sendAuth, outgoing);
-
- populateSetupData(user, email, false);
- } catch (URISyntaxException e) {
- // If we can't set up the URL, don't continue - account setup pages will fail too
- Toast.makeText(
- this, R.string.account_setup_username_password_toast, Toast.LENGTH_LONG).show();
- }
- }
-
- public static void setDefaultsForProtocol(Context context, Account account) {
- String protocol = account.mHostAuthRecv.mProtocol;
- if (protocol == null) return;
- EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, protocol);
- account.mSyncInterval = info.defaultSyncInterval;
- account.mSyncLookback = info.defaultLookback;
- if (info.offerLocalDeletes) {
- account.setDeletePolicy(info.defaultLocalDeletes);
- }
- }
-
- /**
- * Populate SetupData's account with complete setup info.
- */
- private void populateSetupData(String senderName, String senderEmail, boolean isDefault) {
- Account account = SetupData.getAccount();
- account.setSenderName(senderName);
- account.setEmailAddress(senderEmail);
- account.setDisplayName(senderEmail);
- account.setDefaultAccount(isDefault);
- SetupData.setDefault(isDefault); // TODO - why duplicated, if already set in account
- setDefaultsForProtocol(this, account);
- }
-
- /**
- * Implements AccountCheckSettingsFragment.Callbacks
- *
- * This is used in automatic setup mode to jump directly down to the options screen.
- *
- * This is the only case where we finish() this activity but account setup is continuing,
- * so we inhibit reporting any error back to the Account manager.
- */
- @Override
- public void onCheckSettingsComplete(int result) {
- if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
- AccountSetupOptions.actionOptions(this);
- mReportAccountAuthenticatorError = false;
- finish();
- }
- }
-
- /**
- * Implements AccountCheckSettingsFragment.Callbacks
- * This is overridden only by AccountSetupExchange
- */
- @Override
- public void onAutoDiscoverComplete(int result, HostAuth hostAuth) {
- throw new IllegalStateException();
- }
-
- /**
- * AsyncTask checks count of accounts and displays "use this account as default" checkbox
- * if there are more than one.
- */
- private class DisplayCheckboxTask extends AsyncTask<Void, Void, Integer> {
-
- @Override
- protected Integer doInBackground(Void... params) {
- return EmailContent.count(AccountSetupBasics.this, Account.CONTENT_URI);
- }
-
- @Override
- protected void onPostExecute(Integer numAccounts) {
- if (numAccounts > 0) {
- Activity a = AccountSetupBasics.this;
- UiUtilities.setVisibilitySafe(mDefaultView, View.VISIBLE);
- UiUtilities.setVisibilitySafe(a, R.id.account_default_divider_1, View.VISIBLE);
- UiUtilities.setVisibilitySafe(a, R.id.account_default_divider_2, View.VISIBLE);
- }
- }
- }
-
- private void onEnableProceedButtons(boolean enabled) {
- mManualButton.setEnabled(enabled);
- mNextButton.setEnabled(enabled);
- }
-
- /**
- * Dialog fragment to show "setup note" dialog
- */
- public static class NoteDialogFragment extends DialogFragment {
- final static String TAG = "NoteDialogFragment";
-
- // Argument bundle keys
- private final static String BUNDLE_KEY_NOTE = "NoteDialogFragment.Note";
-
- /**
- * Create the dialog with parameters
- */
- public static NoteDialogFragment newInstance(String note) {
- NoteDialogFragment f = new NoteDialogFragment();
- Bundle b = new Bundle();
- b.putString(BUNDLE_KEY_NOTE, note);
- f.setArguments(b);
- return f;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- Context context = getActivity();
- final String note = getArguments().getString(BUNDLE_KEY_NOTE);
-
- return new AlertDialog.Builder(context)
- .setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(android.R.string.dialog_alert_title)
- .setMessage(note)
- .setPositiveButton(
- R.string.okay_action,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Activity a = getActivity();
- if (a instanceof AccountSetupBasics) {
- ((AccountSetupBasics)a).finishAutoSetup();
- }
- dismiss();
- }
- })
- .setNegativeButton(
- context.getString(R.string.cancel_action),
- null)
- .create();
- }
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountSetupIncoming.java b/email2/src/com/android/email/activity/setup/AccountSetupIncoming.java
deleted file mode 100644
index d17e4ceed..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSetupIncoming.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.Activity;
-import android.app.FragmentTransaction;
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-
-import com.android.email.R;
-import com.android.email.activity.ActivityHelper;
-import com.android.email.activity.UiUtilities;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-
-/**
- * Provides setup flow for IMAP/POP accounts.
- *
- * Uses AccountSetupIncomingFragment for primary UI. Uses AccountCheckSettingsFragment to validate
- * the settings as entered. If the account is OK, proceeds to AccountSetupOutgoing.
- */
-public class AccountSetupIncoming extends AccountSetupActivity
- implements AccountSetupIncomingFragment.Callback, OnClickListener {
-
- /* package */ AccountServerBaseFragment mFragment;
- private Button mNextButton;
- /* package */ boolean mNextButtonEnabled;
- private boolean mStartedAutoDiscovery;
- private EmailServiceInfo mServiceInfo;
-
- // Keys for savedInstanceState
- private final static String STATE_STARTED_AUTODISCOVERY =
- "AccountSetupExchange.StartedAutoDiscovery";
-
- public static void actionIncomingSettings(Activity fromActivity, int mode, Account account) {
- SetupData.setFlowMode(mode);
- SetupData.setAccount(account);
- fromActivity.startActivity(new Intent(fromActivity, AccountSetupIncoming.class));
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityHelper.debugSetWindowFlags(this);
-
- HostAuth hostAuth = SetupData.getAccount().mHostAuthRecv;
- mServiceInfo = EmailServiceUtils.getServiceInfo(this, hostAuth.mProtocol);
-
- setContentView(R.layout.account_setup_incoming);
- mFragment = (AccountServerBaseFragment)
- getFragmentManager().findFragmentById(R.id.setup_fragment);
-
- // Configure fragment
- mFragment.setCallback(this);
-
- mNextButton = (Button) UiUtilities.getView(this, R.id.next);
- mNextButton.setOnClickListener(this);
- UiUtilities.getView(this, R.id.previous).setOnClickListener(this);
-
- // One-shot to launch autodiscovery at the entry to this activity (but not if it restarts)
- if (mServiceInfo.usesAutodiscover) {
- mStartedAutoDiscovery = false;
- if (savedInstanceState != null) {
- mStartedAutoDiscovery = savedInstanceState.getBoolean(STATE_STARTED_AUTODISCOVERY);
- }
- if (!mStartedAutoDiscovery) {
- startAutoDiscover();
- }
- }
- }
-
- /**
- * Implements View.OnClickListener
- */
- @Override
- public void onClick(View view) {
- switch (view.getId()) {
- case R.id.next:
- mFragment.onNext();
- break;
- case R.id.previous:
- onBackPressed();
- break;
- }
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putBoolean(STATE_STARTED_AUTODISCOVERY, mStartedAutoDiscovery);
- }
-
- /**
- * If the conditions are right, launch the autodiscover fragment. If it succeeds (even
- * partially) it will prefill the setup fields and we can proceed as if the user entered them.
- *
- * Conditions for skipping:
- * Editing existing account
- * AutoDiscover blocked (used for unit testing only)
- * Username or password not entered yet
- */
- private void startAutoDiscover() {
- // Note that we've started autodiscovery - even if we decide not to do it,
- // this prevents repeating.
- mStartedAutoDiscovery = true;
-
- if (!SetupData.isAllowAutodiscover()) {
- return;
- }
-
- Account account = SetupData.getAccount();
- // If we've got a username and password and we're NOT editing, try autodiscover
- String username = account.mHostAuthRecv.mLogin;
- String password = account.mHostAuthRecv.mPassword;
- if (username != null && password != null) {
- onProceedNext(SetupData.CHECK_AUTODISCOVER, mFragment);
- }
- }
-
- /**
- * Implements AccountCheckSettingsFragment.Callbacks
- *
- * @param result configuration data returned by AD server, or null if no data available
- */
- public void onAutoDiscoverComplete(int result, HostAuth hostAuth) {
- // If authentication failed, exit immediately (to re-enter credentials)
- if (result == AccountCheckSettingsFragment.AUTODISCOVER_AUTHENTICATION) {
- finish();
- return;
- }
-
- // If data was returned, populate the account & populate the UI fields and validate it
- if (result == AccountCheckSettingsFragment.AUTODISCOVER_OK) {
- boolean valid = mFragment.setHostAuthFromAutodiscover(hostAuth);
- if (valid) {
- // "click" next to launch server verification
- mFragment.onNext();
- }
- }
- // Otherwise, proceed into this activity for manual setup
- }
-
- /**
- * Implements AccountServerBaseFragment.Callback
- *
- * Launches the account checker. Positive results are reported to onCheckSettingsOk().
- */
- public void onProceedNext(int checkMode, AccountServerBaseFragment target) {
- AccountCheckSettingsFragment checkerFragment =
- AccountCheckSettingsFragment.newInstance(checkMode, target);
- FragmentTransaction transaction = getFragmentManager().beginTransaction();
- transaction.add(checkerFragment, AccountCheckSettingsFragment.TAG);
- transaction.addToBackStack("back");
- transaction.commit();
- }
-
- /**
- * Implements AccountServerBaseFragment.Callback
- */
- public void onEnableProceedButtons(boolean enable) {
- mNextButtonEnabled = enable;
- mNextButton.setEnabled(enable);
- }
-
- /**
- * Implements AccountServerBaseFragment.Callback
- *
- * If the checked settings are OK, proceed to outgoing settings screen
- */
- public void onCheckSettingsComplete(int result, int setupMode) {
- if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
- if (mServiceInfo.usesSmtp) {
- AccountSetupOutgoing.actionOutgoingSettings(this, SetupData.getFlowMode(),
- SetupData.getAccount());
- } else {
- AccountSetupOptions.actionOptions(this);
- finish();
- }
- }
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java b/email2/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java
deleted file mode 100644
index c91163481..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java
+++ /dev/null
@@ -1,565 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.text.method.DigitsKeyListener;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.inputmethod.EditorInfo;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.EditText;
-import android.widget.Spinner;
-import android.widget.TextView;
-
-import com.android.email.R;
-import com.android.email.activity.UiUtilities;
-import com.android.email.provider.AccountBackupRestore;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
-import com.android.email.view.CertificateSelector;
-import com.android.email.view.CertificateSelector.HostCallback;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Device;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.utility.CertificateRequestor;
-import com.android.emailcommon.utility.Utility;
-
-import java.io.IOException;
-import java.util.ArrayList;
-
-/**
- * Provides UI for IMAP/POP account settings.
- *
- * This fragment is used by AccountSetupIncoming (for creating accounts) and by AccountSettingsXL
- * (for editing existing accounts).
- */
-public class AccountSetupIncomingFragment extends AccountServerBaseFragment
- implements HostCallback {
-
- private static final int CERTIFICATE_REQUEST = 0;
- private final static String STATE_KEY_CREDENTIAL = "AccountSetupIncomingFragment.credential";
- private final static String STATE_KEY_LOADED = "AccountSetupIncomingFragment.loaded";
-
- private EditText mUsernameView;
- private EditText mPasswordView;
- private TextView mServerLabelView;
- private EditText mServerView;
- private EditText mPortView;
- private Spinner mSecurityTypeView;
- private TextView mDeletePolicyLabelView;
- private Spinner mDeletePolicyView;
- private View mImapPathPrefixSectionView;
- private View mDeviceIdSectionView;
- private EditText mImapPathPrefixView;
- private CertificateSelector mClientCertificateSelector;
- // Delete policy as loaded from the device
- private int mLoadedDeletePolicy;
-
- // Support for lifecycle
- private boolean mStarted;
- private boolean mLoaded;
- private String mCacheLoginCredential;
- private HostAuth mRecvAuth;
- private EmailServiceInfo mServiceInfo;
-
- /**
- * Called to do initial creation of a fragment. This is called after
- * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onCreate");
- }
- super.onCreate(savedInstanceState);
-
- if (savedInstanceState != null) {
- mCacheLoginCredential = savedInstanceState.getString(STATE_KEY_CREDENTIAL);
- mLoaded = savedInstanceState.getBoolean(STATE_KEY_LOADED, false);
- }
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onCreateView");
- }
- int layoutId = mSettingsMode
- ? R.layout.account_settings_incoming_fragment
- : R.layout.account_setup_incoming_fragment;
-
- View view = inflater.inflate(layoutId, container, false);
- Context context = getActivity();
-
- mRecvAuth = SetupData.getAccount().mHostAuthRecv;
- mServiceInfo = EmailServiceUtils.getServiceInfo(mContext, mRecvAuth.mProtocol);
-
- mUsernameView = (EditText) UiUtilities.getView(view, R.id.account_username);
- mPasswordView = (EditText) UiUtilities.getView(view, R.id.account_password);
- mServerLabelView = (TextView) UiUtilities.getView(view, R.id.account_server_label);
- mServerView = (EditText) UiUtilities.getView(view, R.id.account_server);
- mPortView = (EditText) UiUtilities.getView(view, R.id.account_port);
- mSecurityTypeView = (Spinner) UiUtilities.getView(view, R.id.account_security_type);
- mDeletePolicyLabelView = (TextView) UiUtilities.getView(view,
- R.id.account_delete_policy_label);
- mDeletePolicyView = (Spinner) UiUtilities.getView(view, R.id.account_delete_policy);
- mImapPathPrefixSectionView = UiUtilities.getView(view, R.id.imap_path_prefix_section);
- mDeviceIdSectionView = UiUtilities.getView(view, R.id.device_id_section);
- mImapPathPrefixView = (EditText) UiUtilities.getView(view, R.id.imap_path_prefix);
- mClientCertificateSelector = UiUtilities.getView(view, R.id.client_certificate_selector);
-
- // Set up security type spinner
- ArrayList<SpinnerOption> securityTypes = new ArrayList<SpinnerOption>();
- securityTypes.add(
- new SpinnerOption(HostAuth.FLAG_NONE, context.getString(
- R.string.account_setup_incoming_security_none_label)));
- securityTypes.add(
- new SpinnerOption(HostAuth.FLAG_SSL, context.getString(
- R.string.account_setup_incoming_security_ssl_label)));
- securityTypes.add(
- new SpinnerOption(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, context.getString(
- R.string.account_setup_incoming_security_ssl_trust_certificates_label)));
- if (mServiceInfo.offerTls) {
- securityTypes.add(
- new SpinnerOption(HostAuth.FLAG_TLS, context.getString(
- R.string.account_setup_incoming_security_tls_label)));
- securityTypes.add(
- new SpinnerOption(HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL,
- context.getString(
- R.string.account_setup_incoming_security_tls_trust_certificates_label)));
- }
- ArrayAdapter<SpinnerOption> securityTypesAdapter = new ArrayAdapter<SpinnerOption>(
- context, android.R.layout.simple_spinner_item, securityTypes);
- securityTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- mSecurityTypeView.setAdapter(securityTypesAdapter);
-
- if (mServiceInfo.offerLocalDeletes) {
- SpinnerOption deletePolicies[] = {
- new SpinnerOption(Account.DELETE_POLICY_NEVER,
- context.getString(
- R.string.account_setup_incoming_delete_policy_never_label)),
- new SpinnerOption(Account.DELETE_POLICY_ON_DELETE,
- context.getString(
- R.string.account_setup_incoming_delete_policy_delete_label)),
- };
- ArrayAdapter<SpinnerOption> deletePoliciesAdapter =
- new ArrayAdapter<SpinnerOption>(context,
- android.R.layout.simple_spinner_item, deletePolicies);
- deletePoliciesAdapter.setDropDownViewResource(
- android.R.layout.simple_spinner_dropdown_item);
- mDeletePolicyView.setAdapter(deletePoliciesAdapter);
- }
-
- // Updates the port when the user changes the security type. This allows
- // us to show a reasonable default which the user can change.
- mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
- updatePortFromSecurityType();
- }
-
- public void onNothingSelected(AdapterView<?> arg0) { }
- });
-
- // After any text edits, call validateFields() which enables or disables the Next button
- TextWatcher validationTextWatcher = new TextWatcher() {
- public void afterTextChanged(Editable s) {
- validateFields();
- }
-
- public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
- public void onTextChanged(CharSequence s, int start, int before, int count) { }
- };
- // We're editing an existing account; don't allow modification of the user name
- if (mSettingsMode) {
- makeTextViewUneditable(mUsernameView,
- getString(R.string.account_setup_username_uneditable_error));
- }
- mUsernameView.addTextChangedListener(validationTextWatcher);
- mPasswordView.addTextChangedListener(validationTextWatcher);
- mServerView.addTextChangedListener(validationTextWatcher);
- mPortView.addTextChangedListener(validationTextWatcher);
-
- // Only allow digits in the port field.
- mPortView.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
-
- // Additional setup only used while in "settings" mode
- onCreateViewSettingsMode(view);
-
- return view;
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onActivityCreated");
- }
- super.onActivityCreated(savedInstanceState);
- mClientCertificateSelector.setHostActivity(this);
- }
-
- /**
- * Called when the Fragment is visible to the user.
- */
- @Override
- public void onStart() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onStart");
- }
- super.onStart();
- mStarted = true;
- configureEditor();
- loadSettings();
- }
-
- /**
- * Called when the fragment is visible to the user and actively running.
- */
- @Override
- public void onResume() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onResume");
- }
- super.onResume();
- validateFields();
- }
-
- @Override
- public void onPause() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onPause");
- }
- super.onPause();
- }
-
- /**
- * Called when the Fragment is no longer started.
- */
- @Override
- public void onStop() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onStop");
- }
- super.onStop();
- mStarted = false;
- }
-
- /**
- * Called when the fragment is no longer in use.
- */
- @Override
- public void onDestroy() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onDestroy");
- }
- super.onDestroy();
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onSaveInstanceState");
- }
- super.onSaveInstanceState(outState);
-
- outState.putString(STATE_KEY_CREDENTIAL, mCacheLoginCredential);
- outState.putBoolean(STATE_KEY_LOADED, mLoaded);
- }
-
- /**
- * Activity provides callbacks here. This also triggers loading and setting up the UX
- */
- @Override
- public void setCallback(Callback callback) {
- super.setCallback(callback);
- if (mStarted) {
- configureEditor();
- loadSettings();
- }
- }
-
- /**
- * Configure the editor for the account type
- */
- private void configureEditor() {
- Account account = SetupData.getAccount();
- if (account == null) {
- return;
- }
- TextView lastView = mImapPathPrefixView;
- mBaseScheme = account.mHostAuthRecv.mProtocol;
- mServerLabelView.setText(R.string.account_setup_incoming_server_label);
- mServerView.setContentDescription(getResources().getText(
- R.string.account_setup_incoming_server_label));
- if (!mServiceInfo.offerPrefix) {
- mImapPathPrefixSectionView.setVisibility(View.GONE);
- lastView = mPortView;
- }
- if (!mServiceInfo.offerLocalDeletes) {
- mDeletePolicyLabelView.setVisibility(View.GONE);
- mDeletePolicyView.setVisibility(View.GONE);
- mPortView.setImeOptions(EditorInfo.IME_ACTION_NEXT);
- }
- lastView.setOnEditorActionListener(mDismissImeOnDoneListener);
- }
-
- /**
- * Load the current settings into the UI
- */
- private void loadSettings() {
- if (mLoaded) return;
-
- Account account = SetupData.getAccount();
- HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext);
-
- String username = recvAuth.mLogin;
- if (username != null) {
- //*** For eas?
- // Add a backslash to the start of the username, but only if the username has no
- // backslash in it.
- //if (userName.indexOf('\\') < 0) {
- // userName = "\\" + userName;
- //}
- mUsernameView.setText(username);
- }
- String password = recvAuth.mPassword;
- if (password != null) {
- mPasswordView.setText(password);
- // Since username is uneditable, focus on the next editable field
- if (mSettingsMode) {
- mPasswordView.requestFocus();
- }
- }
-
- if (mServiceInfo.offerPrefix) {
- String prefix = recvAuth.mDomain;
- if (prefix != null && prefix.length() > 0) {
- mImapPathPrefixView.setText(prefix.substring(1));
- }
- }
-
- // The delete policy is set for all legacy accounts. For POP3 accounts, the user sets
- // the policy explicitly. For IMAP accounts, the policy is set when the Account object
- // is created. @see AccountSetupBasics#populateSetupData
- mLoadedDeletePolicy = account.getDeletePolicy();
- SpinnerOption.setSpinnerOptionValue(mDeletePolicyView, mLoadedDeletePolicy);
-
- int flags = recvAuth.mFlags;
- flags &= ~HostAuth.FLAG_AUTHENTICATE;
- if (mServiceInfo.defaultSsl) {
- flags |= HostAuth.FLAG_SSL;
- }
- SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, flags);
-
- String hostname = recvAuth.mAddress;
- if (hostname != null) {
- mServerView.setText(hostname);
- }
-
- int port = recvAuth.mPort;
- if (port != HostAuth.PORT_UNKNOWN) {
- mPortView.setText(Integer.toString(port));
- } else {
- updatePortFromSecurityType();
- }
-
- mLoadedRecvAuth = recvAuth;
- mLoaded = true;
- validateFields();
- }
-
- /**
- * Check the values in the fields and decide if it makes sense to enable the "next" button
- */
- private void validateFields() {
- if (!mLoaded) return;
- boolean enabled = Utility.isTextViewNotEmpty(mUsernameView)
- && Utility.isTextViewNotEmpty(mPasswordView)
- && Utility.isServerNameValid(mServerView)
- && Utility.isPortFieldValid(mPortView);
- enableNextButton(enabled);
-
- String userName = mUsernameView.getText().toString().trim();
- mCacheLoginCredential = userName;
-
- // Warn (but don't prevent) if password has leading/trailing spaces
- AccountSettingsUtils.checkPasswordSpaces(mContext, mPasswordView);
- }
-
- private int getPortFromSecurityType(boolean useSsl) {
- EmailServiceInfo info = EmailServiceUtils.getServiceInfo(mContext,
- SetupData.getAccount().mHostAuthRecv.mProtocol);
- return useSsl ? info.portSsl : info.port;
- }
-
- private boolean getSslSelected() {
- int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
- return ((securityType & HostAuth.FLAG_SSL) != 0);
- }
-
- public void onUseSslChanged(boolean useSsl) {
- if (mServiceInfo.offerCerts) {
- int mode = useSsl ? View.VISIBLE : View.GONE;
- mClientCertificateSelector.setVisibility(mode);
- String deviceId = "";
- try {
- deviceId = Device.getDeviceId(mContext);
- } catch (IOException e) {
- // Not required
- }
- ((TextView) UiUtilities.getView(getView(), R.id.device_id)).setText(deviceId);
-
- mDeviceIdSectionView.setVisibility(mode);
- //UiUtilities.setVisibilitySafe(getView(), R.id.client_certificate_divider, mode);
- }
- }
-
- private void updatePortFromSecurityType() {
- boolean sslSelected = getSslSelected();
- int port = getPortFromSecurityType(sslSelected);
- mPortView.setText(Integer.toString(port));
- onUseSslChanged(sslSelected);
- }
-
- /**
- * Entry point from Activity after editing settings and verifying them. Must be FLOW_MODE_EDIT.
- * Note, we update account here (as well as the account.mHostAuthRecv) because we edit
- * account's delete policy here.
- * Blocking - do not call from UI Thread.
- */
- @Override
- public void saveSettingsAfterEdit() {
- Account account = SetupData.getAccount();
- account.update(mContext, account.toContentValues());
- account.mHostAuthRecv.update(mContext, account.mHostAuthRecv.toContentValues());
- // Update the backup (side copy) of the accounts
- AccountBackupRestore.backup(mContext);
- }
-
- /**
- * Entry point from Activity after entering new settings and verifying them. For setup mode.
- */
- @Override
- public void saveSettingsAfterSetup() {
- Account account = SetupData.getAccount();
- HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext);
- HostAuth sendAuth = account.getOrCreateHostAuthSend(mContext);
-
- // Set the username and password for the outgoing settings to the username and
- // password the user just set for incoming. Use the verified host address to try and
- // pick a smarter outgoing address.
- String hostName =
- AccountSettingsUtils.inferServerName(mContext, recvAuth.mAddress, null, "smtp");
- sendAuth.setLogin(recvAuth.mLogin, recvAuth.mPassword);
- sendAuth.setConnection(sendAuth.mProtocol, hostName, sendAuth.mPort, sendAuth.mFlags);
- }
-
- /**
- * Entry point from Activity, when "next" button is clicked
- */
- @Override
- public void onNext() {
- Account account = SetupData.getAccount();
-
- // Make sure delete policy is an valid option before using it; otherwise, the results are
- // indeterminate, I suspect...
- if (mDeletePolicyView.getVisibility() == View.VISIBLE) {
- account.setDeletePolicy(
- (Integer) ((SpinnerOption) mDeletePolicyView.getSelectedItem()).value);
- }
-
- HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext);
- String userName = mUsernameView.getText().toString().trim();
- String userPassword = mPasswordView.getText().toString();
- recvAuth.setLogin(userName, userPassword);
-
- String serverAddress = mServerView.getText().toString().trim();
- int serverPort;
- try {
- serverPort = Integer.parseInt(mPortView.getText().toString().trim());
- } catch (NumberFormatException e) {
- serverPort = getPortFromSecurityType(getSslSelected());
- Log.d(Logging.LOG_TAG, "Non-integer server port; using '" + serverPort + "'");
- }
- int securityType = (Integer) ((SpinnerOption) mSecurityTypeView.getSelectedItem()).value;
- recvAuth.setConnection(mBaseScheme, serverAddress, serverPort, securityType);
- if (mServiceInfo.offerPrefix) {
- String prefix = mImapPathPrefixView.getText().toString().trim();
- recvAuth.mDomain = TextUtils.isEmpty(prefix) ? null : ("/" + prefix);
- } else {
- recvAuth.mDomain = null;
- }
-
- // Check for a duplicate account (requires async DB work) and if OK,
- // proceed with check
- startDuplicateTaskCheck(
- account.mId, serverAddress, mCacheLoginCredential, SetupData.CHECK_INCOMING);
- }
-
- @Override
- public boolean haveSettingsChanged() {
- boolean deletePolicyChanged = false;
-
- // Only verify the delete policy if the control is visible (i.e. is a pop3 account)
- if (mDeletePolicyView.getVisibility() == View.VISIBLE) {
- int newDeletePolicy =
- (Integer)((SpinnerOption)mDeletePolicyView.getSelectedItem()).value;
- deletePolicyChanged = mLoadedDeletePolicy != newDeletePolicy;
- }
-
- return deletePolicyChanged || super.haveSettingsChanged();
- }
-
- /**
- * Implements AccountCheckSettingsFragment.Callbacks
- */
- @Override
- public void onAutoDiscoverComplete(int result, HostAuth hostAuth) {
- AccountSetupIncoming activity = (AccountSetupIncoming) getActivity();
- activity.onAutoDiscoverComplete(result, hostAuth);
- }
-
- @Override
- public void onCertificateRequested() {
- Intent intent = new Intent(CertificateRequestor.ACTION_REQUEST_CERT);
- intent.setData(Uri.parse("eas://com.android.emailcommon/certrequest"));
- startActivityForResult(intent, CERTIFICATE_REQUEST);
- }
-
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == CERTIFICATE_REQUEST && resultCode == Activity.RESULT_OK) {
- String certAlias = data.getStringExtra(CertificateRequestor.RESULT_ALIAS);
- if (certAlias != null) {
- mClientCertificateSelector.setCertificate(certAlias);
- }
- }
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountSetupNames.java b/email2/src/com/android/email/activity/setup/AccountSetupNames.java
deleted file mode 100644
index 29f45a9b1..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSetupNames.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.Activity;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.provider.ContactsContract.Profile;
-import android.text.Editable;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.text.method.TextKeyListener;
-import android.text.method.TextKeyListener.Capitalize;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.EditText;
-
-import com.android.email.R;
-import com.android.email.activity.ActivityHelper;
-import com.android.email.activity.UiUtilities;
-import com.android.email.provider.AccountBackupRestore;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-
-/**
- * Final screen of setup process. Collect account nickname and/or username.
- */
-public class AccountSetupNames extends AccountSetupActivity implements OnClickListener {
- private static final int REQUEST_SECURITY = 0;
-
- private static final Uri PROFILE_URI = Profile.CONTENT_URI;
-
- private EditText mDescription;
- private EditText mName;
- private Button mNextButton;
- private boolean mRequiresName = true;
-
- public static void actionSetNames(Activity fromActivity) {
- fromActivity.startActivity(new ForwardingIntent(fromActivity, AccountSetupNames.class));
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityHelper.debugSetWindowFlags(this);
- setContentView(R.layout.account_setup_names);
- mDescription = (EditText) UiUtilities.getView(this, R.id.account_description);
- mName = (EditText) UiUtilities.getView(this, R.id.account_name);
- View accountNameLabel = UiUtilities.getView(this, R.id.account_name_label);
- mNextButton = (Button) UiUtilities.getView(this, R.id.next);
- mNextButton.setOnClickListener(this);
-
- TextWatcher validationTextWatcher = new TextWatcher() {
- @Override
- public void afterTextChanged(Editable s) {
- validateFields();
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- }
- };
- mName.addTextChangedListener(validationTextWatcher);
- mName.setKeyListener(TextKeyListener.getInstance(false, Capitalize.WORDS));
-
- Account account = SetupData.getAccount();
- if (account == null) {
- throw new IllegalStateException("unexpected null account");
- }
- if (account.mHostAuthRecv == null) {
- throw new IllegalStateException("unexpected null hostauth");
- }
- int flowMode = SetupData.getFlowMode();
-
- if (flowMode != SetupData.FLOW_MODE_FORCE_CREATE
- && flowMode != SetupData.FLOW_MODE_EDIT) {
- String accountEmail = account.mEmailAddress;
- mDescription.setText(accountEmail);
-
- // Move cursor to the end so it's easier to erase in case the user doesn't like it.
- mDescription.setSelection(accountEmail.length());
- }
-
- // Remember whether we're an EAS account, since it doesn't require the user name field
- EmailServiceInfo info =
- EmailServiceUtils.getServiceInfo(this, account.mHostAuthRecv.mProtocol);
- if (!info.usesSmtp) {
- mRequiresName = false;
- mName.setVisibility(View.GONE);
- accountNameLabel.setVisibility(View.GONE);
- } else {
- if (account != null && account.getSenderName() != null) {
- mName.setText(account.getSenderName());
- } else if (flowMode != SetupData.FLOW_MODE_FORCE_CREATE
- && flowMode != SetupData.FLOW_MODE_EDIT) {
- // Attempt to prefill the name field from the profile if we don't have it,
- prefillNameFromProfile();
- }
- }
-
- // Make sure the "done" button is in the proper state
- validateFields();
-
- // Proceed immediately if in account creation mode
- if (flowMode == SetupData.FLOW_MODE_FORCE_CREATE) {
- onNext();
- }
- }
-
- private void prefillNameFromProfile() {
- new EmailAsyncTask<Void, Void, String>(null) {
- @Override
- protected String doInBackground(Void... params) {
- String[] projection = new String[] { Profile.DISPLAY_NAME };
- return Utility.getFirstRowString(
- AccountSetupNames.this, PROFILE_URI, projection, null, null, null, 0);
- }
-
- @Override
- public void onSuccess(String result) {
- // Views can only be modified on the main thread.
- mName.setText(result);
- }
- }.executeParallel((Void[]) null);
- }
-
- /**
- * Implements OnClickListener
- */
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.next:
- onNext();
- break;
- }
- }
-
- /**
- * Check input fields for legal values and enable/disable next button
- */
- private void validateFields() {
- boolean enableNextButton = true;
- // Validation is based only on the "user name" field, not shown for EAS accounts
- if (mRequiresName) {
- String userName = mName.getText().toString().trim();
- if (TextUtils.isEmpty(userName)) {
- enableNextButton = false;
- mName.setError(getString(R.string.account_setup_names_user_name_empty_error));
- } else {
- mName.setError(null);
- }
- }
- mNextButton.setEnabled(enableNextButton);
- }
-
- /**
- * Block the back key if we are currently processing the "next" key"
- */
- @Override
- public void onBackPressed() {
- if (mNextButton.isEnabled()) {
- finishActivity();
- }
- }
-
- private void finishActivity() {
- if (SetupData.getFlowMode() == SetupData.FLOW_MODE_NO_ACCOUNTS) {
- AccountSetupBasics.actionAccountCreateFinishedWithResult(this);
- } else if (SetupData.getFlowMode() != SetupData.FLOW_MODE_NORMAL) {
- AccountSetupBasics.actionAccountCreateFinishedAccountFlow(this);
- } else {
- Account account = SetupData.getAccount();
- if (account != null) {
- AccountSetupBasics.actionAccountCreateFinished(this, account.mId);
- } else {
- // Safety check here; If mAccount is null (due to external issues or bugs)
- // just rewind back to Welcome, which can handle any configuration of accounts
- //***
- //Welcome.actionStart(this);
- }
- }
- finish();
- }
-
- /**
- * After clicking the next button, we'll start an async task to commit the data
- * and other steps to finish the creation of the account.
- */
- private void onNext() {
- mNextButton.setEnabled(false); // Protect against double-tap.
-
- // Update account object from UI
- Account account = SetupData.getAccount();
- String description = mDescription.getText().toString().trim();
- if (!TextUtils.isEmpty(description)) {
- account.setDisplayName(description);
- }
- account.setSenderName(mName.getText().toString().trim());
-
- // Launch async task for final commit work
- // Sicne it's a write task, use the serial executor so even if we ran the task twice
- // with different values the result would be consistent.
- new FinalSetupTask(account).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
- }
-
- /**
- * Final account setup work is handled in this AsyncTask:
- * Commit final values to provider
- * Trigger account backup
- * Check for security hold
- *
- * When this completes, we return to UI thread for the following steps:
- * If security hold, dispatch to AccountSecurity activity
- * Otherwise, return to AccountSetupBasics for conclusion.
- *
- * TODO: If there was *any* indication that security might be required, we could at least
- * force the DeviceAdmin activation step, without waiting for the initial sync/handshake
- * to fail.
- * TODO: If the user doesn't update the security, don't go to the MessageList.
- */
- private class FinalSetupTask extends AsyncTask<Void, Void, Boolean> {
-
- private final Account mAccount;
- private final Context mContext;
-
- public FinalSetupTask(Account account) {
- mAccount = account;
- mContext = AccountSetupNames.this;
- }
-
- @Override
- protected Boolean doInBackground(Void... params) {
- // Update the account in the database
- ContentValues cv = new ContentValues();
- cv.put(AccountColumns.DISPLAY_NAME, mAccount.getDisplayName());
- cv.put(AccountColumns.SENDER_NAME, mAccount.getSenderName());
- mAccount.update(mContext, cv);
-
- // Update the backup (side copy) of the accounts
- AccountBackupRestore.backup(AccountSetupNames.this);
-
- return Account.isSecurityHold(mContext, mAccount.mId);
- }
-
- @Override
- protected void onPostExecute(Boolean isSecurityHold) {
- if (!isCancelled()) {
- if (isSecurityHold) {
- Intent i = AccountSecurity.actionUpdateSecurityIntent(
- AccountSetupNames.this, mAccount.mId, false);
- startActivityForResult(i, REQUEST_SECURITY);
- } else {
- finishActivity();
- }
- }
- }
- }
-
- /**
- * Handle the eventual result from the security update activity
- *
- * TODO: If the user doesn't update the security, don't go to the MessageList.
- */
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- switch (requestCode) {
- case REQUEST_SECURITY:
- finishActivity();
- }
- super.onActivityResult(requestCode, resultCode, data);
- }
-
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountSetupOptions.java b/email2/src/com/android/email/activity/setup/AccountSetupOptions.java
deleted file mode 100644
index 7bd5ea2fe..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSetupOptions.java
+++ /dev/null
@@ -1,423 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.accounts.AccountAuthenticatorResponse;
-import android.accounts.AccountManager;
-import android.accounts.AccountManagerCallback;
-import android.accounts.AccountManagerFuture;
-import android.accounts.AuthenticatorException;
-import android.accounts.OperationCanceledException;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.ArrayAdapter;
-import android.widget.CheckBox;
-import android.widget.Spinner;
-
-import com.android.email.R;
-import com.android.email.activity.ActivityHelper;
-import com.android.email.activity.UiUtilities;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
-import com.android.email.service.MailService;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Policy;
-import com.android.emailcommon.service.SyncWindow;
-import com.android.emailcommon.utility.Utility;
-
-import java.io.IOException;
-
-public class AccountSetupOptions extends AccountSetupActivity implements OnClickListener {
-
- private Spinner mCheckFrequencyView;
- private Spinner mSyncWindowView;
- private CheckBox mDefaultView;
- private CheckBox mNotifyView;
- private CheckBox mSyncContactsView;
- private CheckBox mSyncCalendarView;
- private CheckBox mSyncEmailView;
- private CheckBox mBackgroundAttachmentsView;
- private View mAccountSyncWindowRow;
- private boolean mDonePressed = false;
- private EmailServiceInfo mServiceInfo;
-
- public static final int REQUEST_CODE_ACCEPT_POLICIES = 1;
-
- /** Default sync window for new EAS accounts */
- private static final int SYNC_WINDOW_EAS_DEFAULT = SyncWindow.SYNC_WINDOW_AUTO;
-
- public static void actionOptions(Activity fromActivity) {
- fromActivity.startActivity(new ForwardingIntent(fromActivity, AccountSetupOptions.class));
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityHelper.debugSetWindowFlags(this);
- setContentView(R.layout.account_setup_options);
-
- mCheckFrequencyView = (Spinner) UiUtilities.getView(this, R.id.account_check_frequency);
- mSyncWindowView = (Spinner) UiUtilities.getView(this, R.id.account_sync_window);
- mDefaultView = (CheckBox) UiUtilities.getView(this, R.id.account_default);
- mNotifyView = (CheckBox) UiUtilities.getView(this, R.id.account_notify);
- mSyncContactsView = (CheckBox) UiUtilities.getView(this, R.id.account_sync_contacts);
- mSyncCalendarView = (CheckBox) UiUtilities.getView(this, R.id.account_sync_calendar);
- mSyncEmailView = (CheckBox) UiUtilities.getView(this, R.id.account_sync_email);
- mSyncEmailView.setChecked(true);
- mBackgroundAttachmentsView = (CheckBox) UiUtilities.getView(this,
- R.id.account_background_attachments);
- mBackgroundAttachmentsView.setChecked(true);
- UiUtilities.getView(this, R.id.previous).setOnClickListener(this);
- UiUtilities.getView(this, R.id.next).setOnClickListener(this);
- mAccountSyncWindowRow = UiUtilities.getView(this, R.id.account_sync_window_row);
-
- Account account = SetupData.getAccount();
- mServiceInfo = EmailServiceUtils.getServiceInfo(getApplicationContext(),
- account.mHostAuthRecv.mProtocol);
- CharSequence[] frequencyValues = mServiceInfo.syncIntervals;
- CharSequence[] frequencyEntries = mServiceInfo.syncIntervalStrings;
-
- // Now create the array used by the sync interval Spinner
- SpinnerOption[] checkFrequencies = new SpinnerOption[frequencyEntries.length];
- for (int i = 0; i < frequencyEntries.length; i++) {
- checkFrequencies[i] = new SpinnerOption(
- Integer.valueOf(frequencyValues[i].toString()), frequencyEntries[i].toString());
- }
- ArrayAdapter<SpinnerOption> checkFrequenciesAdapter = new ArrayAdapter<SpinnerOption>(this,
- android.R.layout.simple_spinner_item, checkFrequencies);
- checkFrequenciesAdapter
- .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- mCheckFrequencyView.setAdapter(checkFrequenciesAdapter);
-
- if (mServiceInfo.offerLookback) {
- enableLookbackSpinner();
- }
-
- // Note: It is OK to use mAccount.mIsDefault here *only* because the account
- // has not been written to the DB yet. Ordinarily, call Account.getDefaultAccountId().
- if (account.mIsDefault || SetupData.isDefault()) {
- mDefaultView.setChecked(true);
- }
- mNotifyView.setChecked(
- (account.getFlags() & Account.FLAGS_NOTIFY_NEW_MAIL) != 0);
- SpinnerOption.setSpinnerOptionValue(mCheckFrequencyView, account.getSyncInterval());
-
- if (mServiceInfo.syncContacts) {
- mSyncContactsView.setVisibility(View.VISIBLE);
- mSyncContactsView.setChecked(true);
- UiUtilities.setVisibilitySafe(this, R.id.account_sync_contacts_divider, View.VISIBLE);
- }
- if (mServiceInfo.syncCalendar) {
- mSyncCalendarView.setVisibility(View.VISIBLE);
- mSyncCalendarView.setChecked(true);
- UiUtilities.setVisibilitySafe(this, R.id.account_sync_calendar_divider, View.VISIBLE);
- }
-
- if (!mServiceInfo.offerAttachmentPreload) {
- mBackgroundAttachmentsView.setVisibility(View.GONE);
- UiUtilities.setVisibilitySafe(this, R.id.account_background_attachments_divider,
- View.GONE);
- }
-
- // If we are just visiting here to fill in details, exit immediately
- if (SetupData.isAutoSetup() ||
- SetupData.getFlowMode() == SetupData.FLOW_MODE_FORCE_CREATE) {
- onDone();
- }
- }
-
- @Override
- public void finish() {
- // If the account manager initiated the creation, and success was not reported,
- // then we assume that we're giving up (for any reason) - report failure.
- AccountAuthenticatorResponse authenticatorResponse =
- SetupData.getAccountAuthenticatorResponse();
- if (authenticatorResponse != null) {
- authenticatorResponse.onError(AccountManager.ERROR_CODE_CANCELED, "canceled");
- SetupData.setAccountAuthenticatorResponse(null);
- }
- super.finish();
- }
-
- /**
- * Respond to clicks in the "Next" or "Previous" buttons
- */
- @Override
- public void onClick(View view) {
- switch (view.getId()) {
- case R.id.next:
- // Don't allow this more than once (Exchange accounts call an async method
- // before finish()'ing the Activity, which allows this code to potentially be
- // executed multiple times
- if (!mDonePressed) {
- onDone();
- mDonePressed = true;
- }
- break;
- case R.id.previous:
- onBackPressed();
- break;
- }
- }
-
- /**
- * Ths is called when the user clicks the "done" button.
- * It collects the data from the UI, updates the setup account record, and commits
- * the account to the database (making it real for the first time.)
- * Finally, we call setupAccountManagerAccount(), which will eventually complete via callback.
- */
- @SuppressWarnings("deprecation")
- private void onDone() {
- final Account account = SetupData.getAccount();
- if (account.isSaved()) {
- // Disrupting the normal flow could get us here, but if the account is already
- // saved, we've done this work
- return;
- }
- account.setDisplayName(account.getEmailAddress());
- int newFlags = account.getFlags() &
- ~(Account.FLAGS_NOTIFY_NEW_MAIL | Account.FLAGS_BACKGROUND_ATTACHMENTS);
- if (mNotifyView.isChecked()) {
- newFlags |= Account.FLAGS_NOTIFY_NEW_MAIL;
- }
- if (mBackgroundAttachmentsView.isChecked()) {
- newFlags |= Account.FLAGS_BACKGROUND_ATTACHMENTS;
- }
- account.setFlags(newFlags);
- account.setSyncInterval((Integer)((SpinnerOption)mCheckFrequencyView
- .getSelectedItem()).value);
- if (mAccountSyncWindowRow.getVisibility() == View.VISIBLE) {
- int window = (Integer)((SpinnerOption)mSyncWindowView.getSelectedItem()).value;
- account.setSyncLookback(window);
- }
- account.setDefaultAccount(mDefaultView.isChecked());
-
- if (account.mHostAuthRecv == null) {
- throw new IllegalStateException("in AccountSetupOptions with null mHostAuthRecv");
- }
-
- // Finish setting up the account, and commit it to the database
- // Set the incomplete flag here to avoid reconciliation issues in ExchangeService
- account.mFlags |= Account.FLAGS_INCOMPLETE;
- if (SetupData.getPolicy() != null) {
- account.mFlags |= Account.FLAGS_SECURITY_HOLD;
- account.mPolicy = SetupData.getPolicy();
- }
- boolean contacts = false;
- if (mServiceInfo.syncContacts) {
- contacts = mSyncContactsView.isChecked();
- }
- boolean calendar = false;
- if (mServiceInfo.syncCalendar) {
- calendar = mSyncCalendarView.isChecked();
- }
- boolean email = mSyncEmailView.isChecked();
-
- // Finally, write the completed account (for the first time) and then
- // install it into the Account manager as well. These are done off-thread.
- // The account manager will report back via the callback, which will take us to
- // the next operations.
- final boolean email2 = email;
- final boolean calendar2 = calendar;
- final boolean contacts2 = contacts;
- Utility.runAsync(new Runnable() {
- @Override
- public void run() {
- Context context = AccountSetupOptions.this;
- AccountSettingsUtils.commitSettings(context, account);
- MailService.setupAccountManagerAccount(context, account,
- email2, calendar2, contacts2, mAccountManagerCallback);
- }
- });
- }
-
- /**
- * This is called at the completion of MailService.setupAccountManagerAccount()
- */
- AccountManagerCallback<Bundle> mAccountManagerCallback = new AccountManagerCallback<Bundle>() {
- @Override
- public void run(AccountManagerFuture<Bundle> future) {
- try {
- Bundle bundle = future.getResult();
- bundle.keySet();
- AccountSetupOptions.this.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- optionsComplete();
- }
- });
- return;
- } catch (OperationCanceledException e) {
- Log.d(Logging.LOG_TAG, "addAccount was canceled");
- } catch (IOException e) {
- Log.d(Logging.LOG_TAG, "addAccount failed: " + e);
- } catch (AuthenticatorException e) {
- Log.d(Logging.LOG_TAG, "addAccount failed: " + e);
- }
- showErrorDialog(R.string.account_setup_failed_dlg_auth_message,
- R.string.system_account_create_failed);
- }
- };
-
- /**
- * This is called if MailService.setupAccountManagerAccount() fails for some reason
- */
- private void showErrorDialog(final int msgResId, final Object... args) {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- new AlertDialog.Builder(AccountSetupOptions.this)
- .setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(getString(R.string.account_setup_failed_dlg_title))
- .setMessage(getString(msgResId, args))
- .setCancelable(true)
- .setPositiveButton(
- getString(R.string.account_setup_failed_dlg_edit_details_action),
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- finish();
- }
- })
- .show();
- }
- });
- }
-
- /**
- * This is called after the account manager creates the new account.
- */
- private void optionsComplete() {
- // If the account manager initiated the creation, report success at this point
- AccountAuthenticatorResponse authenticatorResponse =
- SetupData.getAccountAuthenticatorResponse();
- if (authenticatorResponse != null) {
- authenticatorResponse.onResult(null);
- SetupData.setAccountAuthenticatorResponse(null);
- }
-
- // Now that AccountManager account creation is complete, clear the INCOMPLETE flag
- Account account = SetupData.getAccount();
- account.mFlags &= ~Account.FLAGS_INCOMPLETE;
- AccountSettingsUtils.commitSettings(AccountSetupOptions.this, account);
-
- // If we've got policies for this account, ask the user to accept.
- if ((account.mFlags & Account.FLAGS_SECURITY_HOLD) != 0) {
- Intent intent = AccountSecurity.actionUpdateSecurityIntent(this, account.mId, false);
- startActivityForResult(intent, AccountSetupOptions.REQUEST_CODE_ACCEPT_POLICIES);
- return;
- }
- saveAccountAndFinish();
- }
-
- /**
- * This is called after the AccountSecurity activity completes.
- */
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- saveAccountAndFinish();
- }
-
- /**
- * These are the final cleanup steps when creating an account:
- * Clear incomplete & security hold flags
- * Update account in DB
- * Enable email services
- * Enable exchange services
- * Move to final setup screen
- */
- @SuppressWarnings("deprecation")
- private void saveAccountAndFinish() {
- Utility.runAsync(new Runnable() {
- @Override
- public void run() {
- AccountSetupOptions context = AccountSetupOptions.this;
- // Clear the security hold flag now
- Account account = SetupData.getAccount();
- account.mFlags &= ~Account.FLAGS_SECURITY_HOLD;
- AccountSettingsUtils.commitSettings(context, account);
- // Start up services based on new account(s)
- MailActivityEmail.setServicesEnabledSync(context);
- EmailServiceUtils.startService(context, account.mHostAuthRecv.mProtocol);
- // Move to final setup screen
- AccountSetupNames.actionSetNames(context);
- finish();
- }
- });
- }
-
- /**
- * Enable an additional spinner using the arrays normally handled by preferences
- */
- private void enableLookbackSpinner() {
- // Show everything
- mAccountSyncWindowRow.setVisibility(View.VISIBLE);
-
- // Generate spinner entries using XML arrays used by the preferences
- CharSequence[] windowValues = getResources().getTextArray(
- R.array.account_settings_mail_window_values);
- CharSequence[] windowEntries = getResources().getTextArray(
- R.array.account_settings_mail_window_entries);
-
- // Find a proper maximum for email lookback, based on policy (if we have one)
- int maxEntry = windowEntries.length;
- Policy policy = SetupData.getAccount().mPolicy;
- if (policy != null) {
- int maxLookback = policy.mMaxEmailLookback;
- if (maxLookback != 0) {
- // Offset/Code 0 1 2 3 4 5
- // Entries auto, 1 day, 3 day, 1 week, 2 week, 1 month
- // Lookback N/A 1 day, 3 day, 1 week, 2 week, 1 month
- // Since our test below is i < maxEntry, we must set maxEntry to maxLookback + 1
- maxEntry = maxLookback + 1;
- }
- }
-
- // Now create the array used by the Spinner
- SpinnerOption[] windowOptions = new SpinnerOption[maxEntry];
- int defaultIndex = -1;
- for (int i = 0; i < maxEntry; i++) {
- final int value = Integer.valueOf(windowValues[i].toString());
- windowOptions[i] = new SpinnerOption(value, windowEntries[i].toString());
- if (value == SYNC_WINDOW_EAS_DEFAULT) {
- defaultIndex = i;
- }
- }
-
- ArrayAdapter<SpinnerOption> windowOptionsAdapter = new ArrayAdapter<SpinnerOption>(this,
- android.R.layout.simple_spinner_item, windowOptions);
- windowOptionsAdapter
- .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- mSyncWindowView.setAdapter(windowOptionsAdapter);
-
- SpinnerOption.setSpinnerOptionValue(mSyncWindowView,
- SetupData.getAccount().getSyncLookback());
- if (defaultIndex >= 0) {
- mSyncWindowView.setSelection(defaultIndex);
- }
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountSetupOutgoing.java b/email2/src/com/android/email/activity/setup/AccountSetupOutgoing.java
deleted file mode 100644
index 3c5f8bf69..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSetupOutgoing.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import com.android.email.R;
-import com.android.email.activity.ActivityHelper;
-import com.android.email.activity.UiUtilities;
-import com.android.emailcommon.provider.Account;
-
-import android.app.Activity;
-import android.app.FragmentTransaction;
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-
-/**
- * Provides setup flow for SMTP (for IMAP/POP accounts).
- *
- * Uses AccountSetupOutgoingFragment for primary UI. Uses AccountCheckSettingsFragment to validate
- * the settings as entered. If the account is OK, proceeds to AccountSetupOptions.
- */
-public class AccountSetupOutgoing extends Activity
- implements AccountSetupOutgoingFragment.Callback, OnClickListener {
-
- /* package */ AccountSetupOutgoingFragment mFragment;
- private Button mNextButton;
- /* package */ boolean mNextButtonEnabled;
-
- public static void actionOutgoingSettings(Activity fromActivity, int mode, Account account) {
- SetupData.setFlowMode(mode);
- SetupData.setAccount(account);
- fromActivity.startActivity(new Intent(fromActivity, AccountSetupOutgoing.class));
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityHelper.debugSetWindowFlags(this);
- setContentView(R.layout.account_setup_outgoing);
-
- mFragment = (AccountSetupOutgoingFragment)
- getFragmentManager().findFragmentById(R.id.setup_fragment);
-
- // Configure fragment
- mFragment.setCallback(this);
-
- mNextButton = (Button) UiUtilities.getView(this, R.id.next);
- mNextButton.setOnClickListener(this);
- UiUtilities.getView(this, R.id.previous).setOnClickListener(this);
- }
-
- /**
- * Implements View.OnClickListener
- */
- @Override
- public void onClick(View view) {
- switch (view.getId()) {
- case R.id.next:
- mFragment.onNext();
- break;
- case R.id.previous:
- onBackPressed();
- break;
- }
- }
-
- /**
- * Implements AccountServerBaseFragment.Callback
- *
- * Launches the account checker. Positive results are reported to onCheckSettingsOk().
- */
- public void onProceedNext(int checkMode, AccountServerBaseFragment target) {
- AccountCheckSettingsFragment checkerFragment =
- AccountCheckSettingsFragment.newInstance(checkMode, target);
- FragmentTransaction transaction = getFragmentManager().beginTransaction();
- transaction.add(checkerFragment, AccountCheckSettingsFragment.TAG);
- transaction.addToBackStack("back");
- transaction.commit();
- }
-
- /**
- * Implements AccountServerBaseFragment.Callback
- */
- public void onEnableProceedButtons(boolean enable) {
- mNextButtonEnabled = enable;
- mNextButton.setEnabled(enable);
- }
-
- /**
- * Implements AccountServerBaseFragment.Callback
- *
- * If the checked settings are OK, proceed to options screen
- */
- public void onCheckSettingsComplete(int result, int setupMode) {
- if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
- AccountSetupOptions.actionOptions(this);
- finish();
- }
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java b/email2/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java
deleted file mode 100644
index 7564dcf7a..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.Activity;
-import android.content.Context;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.text.method.DigitsKeyListener;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
-import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.EditText;
-import android.widget.Spinner;
-
-import com.android.email.R;
-import com.android.email.activity.UiUtilities;
-import com.android.email.provider.AccountBackupRestore;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.utility.Utility;
-
-/**
- * Provides UI for SMTP account settings (for IMAP/POP accounts).
- *
- * This fragment is used by AccountSetupOutgoing (for creating accounts) and by AccountSettingsXL
- * (for editing existing accounts).
- */
-public class AccountSetupOutgoingFragment extends AccountServerBaseFragment
- implements OnCheckedChangeListener {
-
- private final static String STATE_KEY_LOADED = "AccountSetupOutgoingFragment.loaded";
-
- private static final int SMTP_PORT_NORMAL = 587;
- private static final int SMTP_PORT_SSL = 465;
-
- private EditText mUsernameView;
- private EditText mPasswordView;
- private EditText mServerView;
- private EditText mPortView;
- private CheckBox mRequireLoginView;
- private Spinner mSecurityTypeView;
-
- // Support for lifecycle
- private boolean mStarted;
- private boolean mLoaded;
-
- /**
- * Called to do initial creation of a fragment. This is called after
- * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onCreate");
- }
- super.onCreate(savedInstanceState);
-
- if (savedInstanceState != null) {
- mLoaded = savedInstanceState.getBoolean(STATE_KEY_LOADED, false);
- }
- mBaseScheme = HostAuth.LEGACY_SCHEME_SMTP;
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onCreateView");
- }
- int layoutId = mSettingsMode
- ? R.layout.account_settings_outgoing_fragment
- : R.layout.account_setup_outgoing_fragment;
-
- View view = inflater.inflate(layoutId, container, false);
- Context context = getActivity();
-
- mUsernameView = (EditText) UiUtilities.getView(view, R.id.account_username);
- mPasswordView = (EditText) UiUtilities.getView(view, R.id.account_password);
- mServerView = (EditText) UiUtilities.getView(view, R.id.account_server);
- mPortView = (EditText) UiUtilities.getView(view, R.id.account_port);
- mRequireLoginView = (CheckBox) UiUtilities.getView(view, R.id.account_require_login);
- mSecurityTypeView = (Spinner) UiUtilities.getView(view, R.id.account_security_type);
- mRequireLoginView.setOnCheckedChangeListener(this);
-
- // Note: Strings are shared with AccountSetupIncomingFragment
- SpinnerOption securityTypes[] = {
- new SpinnerOption(HostAuth.FLAG_NONE, context.getString(
- R.string.account_setup_incoming_security_none_label)),
- new SpinnerOption(HostAuth.FLAG_SSL, context.getString(
- R.string.account_setup_incoming_security_ssl_label)),
- new SpinnerOption(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, context.getString(
- R.string.account_setup_incoming_security_ssl_trust_certificates_label)),
- new SpinnerOption(HostAuth.FLAG_TLS, context.getString(
- R.string.account_setup_incoming_security_tls_label)),
- new SpinnerOption(HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL, context.getString(
- R.string.account_setup_incoming_security_tls_trust_certificates_label)),
- };
-
- ArrayAdapter<SpinnerOption> securityTypesAdapter = new ArrayAdapter<SpinnerOption>(context,
- android.R.layout.simple_spinner_item, securityTypes);
- securityTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- mSecurityTypeView.setAdapter(securityTypesAdapter);
-
- // Updates the port when the user changes the security type. This allows
- // us to show a reasonable default which the user can change.
- mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
- updatePortFromSecurityType();
- }
-
- public void onNothingSelected(AdapterView<?> arg0) { }
- });
-
- // Calls validateFields() which enables or disables the Next button
- TextWatcher validationTextWatcher = new TextWatcher() {
- public void afterTextChanged(Editable s) {
- validateFields();
- }
-
- public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
- public void onTextChanged(CharSequence s, int start, int before, int count) { }
- };
- mUsernameView.addTextChangedListener(validationTextWatcher);
- mPasswordView.addTextChangedListener(validationTextWatcher);
- mServerView.addTextChangedListener(validationTextWatcher);
- mPortView.addTextChangedListener(validationTextWatcher);
-
- // Only allow digits in the port field.
- mPortView.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
-
- // Additional setup only used while in "settings" mode
- onCreateViewSettingsMode(view);
-
- return view;
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onActivityCreated");
- }
- super.onActivityCreated(savedInstanceState);
- }
-
- /**
- * Called when the Fragment is visible to the user.
- */
- @Override
- public void onStart() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onStart");
- }
- super.onStart();
- mStarted = true;
- loadSettings();
- }
-
- /**
- * Called when the fragment is visible to the user and actively running.
- */
- @Override
- public void onResume() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onResume");
- }
- super.onResume();
- validateFields();
- }
-
- @Override
- public void onPause() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onPause");
- }
- super.onPause();
- }
-
- /**
- * Called when the Fragment is no longer started.
- */
- @Override
- public void onStop() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onStop");
- }
- super.onStop();
- mStarted = false;
- }
-
- /**
- * Called when the fragment is no longer in use.
- */
- @Override
- public void onDestroy() {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onDestroy");
- }
- super.onDestroy();
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onSaveInstanceState");
- }
- super.onSaveInstanceState(outState);
-
- outState.putBoolean(STATE_KEY_LOADED, mLoaded);
- }
-
- /**
- * Activity provides callbacks here. This also triggers loading and setting up the UX
- */
- @Override
- public void setCallback(Callback callback) {
- super.setCallback(callback);
- if (mStarted) {
- loadSettings();
- }
- }
-
- /**
- * Load the current settings into the UI
- */
- private void loadSettings() {
- if (mLoaded) return;
-
- HostAuth sendAuth = SetupData.getAccount().getOrCreateHostAuthSend(mContext);
- if ((sendAuth.mFlags & HostAuth.FLAG_AUTHENTICATE) != 0) {
- String username = sendAuth.mLogin;
- if (username != null) {
- mUsernameView.setText(username);
- mRequireLoginView.setChecked(true);
- }
-
- String password = sendAuth.mPassword;
- if (password != null) {
- mPasswordView.setText(password);
- }
- }
-
- int flags = sendAuth.mFlags & ~HostAuth.FLAG_AUTHENTICATE;
- SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, flags);
-
- String hostname = sendAuth.mAddress;
- if (hostname != null) {
- mServerView.setText(hostname);
- }
-
- int port = sendAuth.mPort;
- if (port != -1) {
- mPortView.setText(Integer.toString(port));
- } else {
- updatePortFromSecurityType();
- }
-
- mLoadedSendAuth = sendAuth;
- mLoaded = true;
- validateFields();
- }
-
- /**
- * Preflight the values in the fields and decide if it makes sense to enable the "next" button
- */
- private void validateFields() {
- if (!mLoaded) return;
- boolean enabled =
- Utility.isServerNameValid(mServerView) && Utility.isPortFieldValid(mPortView);
-
- if (enabled && mRequireLoginView.isChecked()) {
- enabled = (Utility.isTextViewNotEmpty(mUsernameView)
- && Utility.isTextViewNotEmpty(mPasswordView));
- }
- enableNextButton(enabled);
- // Warn (but don't prevent) if password has leading/trailing spaces
- AccountSettingsUtils.checkPasswordSpaces(mContext, mPasswordView);
- }
-
- /**
- * implements OnCheckedChangeListener
- */
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- final int visibility = isChecked ? View.VISIBLE : View.GONE;
- UiUtilities.setVisibilitySafe(getView(), R.id.account_require_login_settings, visibility);
- UiUtilities.setVisibilitySafe(getView(), R.id.account_require_login_settings_2, visibility);
- validateFields();
- }
-
- private int getPortFromSecurityType() {
- int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
- int port = (securityType & HostAuth.FLAG_SSL) != 0 ? SMTP_PORT_SSL : SMTP_PORT_NORMAL;
- return port;
- }
-
- private void updatePortFromSecurityType() {
- int port = getPortFromSecurityType();
- mPortView.setText(Integer.toString(port));
- }
-
- /**
- * Entry point from Activity after editing settings and verifying them. Must be FLOW_MODE_EDIT.
- * Blocking - do not call from UI Thread.
- */
- @Override
- public void saveSettingsAfterEdit() {
- Account account = SetupData.getAccount();
- account.mHostAuthSend.update(mContext, account.mHostAuthSend.toContentValues());
- // Update the backup (side copy) of the accounts
- AccountBackupRestore.backup(mContext);
- }
-
- /**
- * Entry point from Activity after entering new settings and verifying them. For setup mode.
- */
- @Override
- public void saveSettingsAfterSetup() {
- }
-
- /**
- * Entry point from Activity, when "next" button is clicked
- */
- @Override
- public void onNext() {
- Account account = SetupData.getAccount();
- HostAuth sendAuth = account.getOrCreateHostAuthSend(mContext);
-
- if (mRequireLoginView.isChecked()) {
- String userName = mUsernameView.getText().toString().trim();
- String userPassword = mPasswordView.getText().toString();
- sendAuth.setLogin(userName, userPassword);
- } else {
- sendAuth.setLogin(null, null);
- }
-
- String serverAddress = mServerView.getText().toString().trim();
- int serverPort;
- try {
- serverPort = Integer.parseInt(mPortView.getText().toString().trim());
- } catch (NumberFormatException e) {
- serverPort = getPortFromSecurityType();
- Log.d(Logging.LOG_TAG, "Non-integer server port; using '" + serverPort + "'");
- }
- int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
- sendAuth.setConnection(mBaseScheme, serverAddress, serverPort, securityType);
- sendAuth.mDomain = null;
-
- mCallback.onProceedNext(SetupData.CHECK_OUTGOING, this);
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/AccountSetupType.java b/email2/src/com/android/email/activity/setup/AccountSetupType.java
deleted file mode 100644
index ff830945c..000000000
--- a/email2/src/com/android/email/activity/setup/AccountSetupType.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.RelativeLayout;
-import android.widget.RelativeLayout.LayoutParams;
-
-import com.android.email.R;
-import com.android.email.activity.ActivityHelper;
-import com.android.email.activity.UiUtilities;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-
-/**
- * Prompts the user to select an account type. The account type, along with the
- * passed in email address, password and makeDefault are then passed on to the
- * AccountSetupIncoming activity.
- */
-public class AccountSetupType extends AccountSetupActivity implements OnClickListener {
-
- public static void actionSelectAccountType(Activity fromActivity) {
- Intent i = new ForwardingIntent(fromActivity, AccountSetupType.class);
- fromActivity.startActivity(i);
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityHelper.debugSetWindowFlags(this);
- int flowMode = SetupData.getFlowMode();
-
- String accountType = SetupData.getFlowAccountType();
- // If we're in account setup flow mode, see if there's just one protocol that matches
- if (flowMode == SetupData.FLOW_MODE_ACCOUNT_MANAGER) {
- int matches = 0;
- String protocol = null;
- for (EmailServiceInfo info: EmailServiceUtils.getServiceInfoList(this)) {
- if (info.accountType.equals(accountType)) {
- protocol = info.protocol;
- matches++;
- }
- }
- // If so, select it...
- if (matches == 1) {
- onSelect(protocol);
- return;
- }
- }
-
- // Otherwise proceed into this screen
- setContentView(R.layout.account_setup_account_type);
- ViewGroup parent = UiUtilities.getView(this, R.id.accountTypes);
- boolean parentRelative = parent instanceof RelativeLayout;
- View lastView = parent.getChildAt(0);
- int i = 1;
- for (EmailServiceInfo info: EmailServiceUtils.getServiceInfoList(this)) {
- if (EmailServiceUtils.isServiceAvailable(this, info.protocol)) {
- // If we're looking for a specific account type, reject others
- if (accountType != null && !accountType.equals(info.accountType)) {
- continue;
- }
- LayoutInflater.from(this).inflate(R.layout.account_type, parent);
- Button button = (Button)parent.getChildAt(i);
- if (parentRelative) {
- LayoutParams params = (LayoutParams)button.getLayoutParams();
- params.addRule(RelativeLayout.BELOW, lastView.getId());
- }
- button.setId(i);
- button.setTag(info.protocol);
- button.setText(info.name);
- button.setOnClickListener(this);
- lastView = button;
- i++;
- // TODO: Remember vendor overlay for exchange name
- }
- }
- final Button previousButton = (Button) findViewById(R.id.previous); // xlarge only
- if (previousButton != null) previousButton.setOnClickListener(this);
- }
-
- /**
- * The user has selected an exchange account type. Set the mail delete policy here, because
- * there is no UI (for exchange), and switch the default sync interval to "push".
- */
- private void onSelect(String protocol) {
- Account account = SetupData.getAccount();
- HostAuth recvAuth = account.getOrCreateHostAuthRecv(this);
- recvAuth.setConnection(protocol, recvAuth.mAddress, recvAuth.mPort, recvAuth.mFlags);
- EmailServiceInfo info = EmailServiceUtils.getServiceInfo(this, protocol);
- if (info.usesAutodiscover) {
- SetupData.setCheckSettingsMode(SetupData.CHECK_AUTODISCOVER);
- } else {
- SetupData.setCheckSettingsMode(
- SetupData.CHECK_INCOMING | (info.usesSmtp ? SetupData.CHECK_OUTGOING : 0));
- }
- recvAuth.mLogin = recvAuth.mLogin + "@" + recvAuth.mAddress;
- AccountSetupBasics.setDefaultsForProtocol(this, account);
- AccountSetupIncoming.actionIncomingSettings(this, SetupData.getFlowMode(), account);
- // Back from the incoming screen returns to AccountSetupBasics
- finish();
- }
-
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.previous:
- finish();
- break;
- default:
- onSelect((String)v.getTag());
- break;
- }
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/DebugFragment.java b/email2/src/com/android/email/activity/setup/DebugFragment.java
deleted file mode 100644
index 48dd99818..000000000
--- a/email2/src/com/android/email/activity/setup/DebugFragment.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.Fragment;
-import android.content.Context;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.webkit.WebView;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
-import android.widget.CompoundButton.OnCheckedChangeListener;
-
-import com.android.email.Preferences;
-import com.android.email.R;
-import com.android.email.activity.UiUtilities;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-
-public class DebugFragment extends Fragment implements OnCheckedChangeListener,
- View.OnClickListener {
- private CheckBox mEnableDebugLoggingView;
- private CheckBox mEnableVerboseLoggingView;
- private CheckBox mEnableFileLoggingView;
- private CheckBox mInhibitGraphicsAccelerationView;
- private CheckBox mEnableStrictModeView;
-
- private Preferences mPreferences;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupBasicsFragment onCreateView");
- }
- View view = inflater.inflate(R.layout.debug, container, false);
-
- Context context = getActivity();
- mPreferences = Preferences.getPreferences(context);
-
- mEnableDebugLoggingView = (CheckBox) UiUtilities.getView(view, R.id.debug_logging);
- mEnableDebugLoggingView.setChecked(MailActivityEmail.DEBUG);
-
- mEnableVerboseLoggingView = (CheckBox) UiUtilities.getView(view, R.id.verbose_logging);
- mEnableFileLoggingView =
- (CheckBox) UiUtilities.getView(view, R.id.file_logging);
-
- // Note: To prevent recursion while presetting checkboxes, assign all listeners last
- mEnableDebugLoggingView.setOnCheckedChangeListener(this);
-
- if (EmailServiceUtils.areRemoteServicesInstalled(context)) {
- mEnableVerboseLoggingView.setChecked(MailActivityEmail.DEBUG_VERBOSE);
- mEnableFileLoggingView.setChecked(MailActivityEmail.DEBUG_FILE);
- mEnableVerboseLoggingView.setOnCheckedChangeListener(this);
- mEnableFileLoggingView.setOnCheckedChangeListener(this);
- } else {
- mEnableVerboseLoggingView.setVisibility(View.GONE);
- mEnableFileLoggingView.setVisibility(View.GONE);
- }
-
- UiUtilities.getView(view, R.id.clear_webview_cache).setOnClickListener(this);
-
- mInhibitGraphicsAccelerationView = (CheckBox)
- UiUtilities.getView(view, R.id.debug_disable_graphics_acceleration);
- mInhibitGraphicsAccelerationView.setChecked(
- MailActivityEmail.sDebugInhibitGraphicsAcceleration);
- mInhibitGraphicsAccelerationView.setOnCheckedChangeListener(this);
-
- mEnableStrictModeView = (CheckBox)
- UiUtilities.getView(view, R.id.debug_enable_strict_mode);
- mEnableStrictModeView.setChecked(mPreferences.getEnableStrictMode());
- mEnableStrictModeView.setOnCheckedChangeListener(this);
-
- return view;
- }
-
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- switch (buttonView.getId()) {
- case R.id.debug_logging:
- mPreferences.setEnableDebugLogging(isChecked);
- MailActivityEmail.DEBUG = isChecked;
- MailActivityEmail.DEBUG_EXCHANGE = isChecked;
- break;
- case R.id.verbose_logging:
- mPreferences.setEnableExchangeLogging(isChecked);
- MailActivityEmail.DEBUG_VERBOSE = isChecked;
- break;
- case R.id.file_logging:
- mPreferences.setEnableExchangeFileLogging(isChecked);
- MailActivityEmail.DEBUG_FILE = isChecked;
- break;
- case R.id.debug_disable_graphics_acceleration:
- MailActivityEmail.sDebugInhibitGraphicsAcceleration = isChecked;
- mPreferences.setInhibitGraphicsAcceleration(isChecked);
- break;
- case R.id.debug_enable_strict_mode:
- mPreferences.setEnableStrictMode(isChecked);
- MailActivityEmail.enableStrictMode(isChecked);
- break;
- }
-
- MailActivityEmail.updateLoggingFlags(getActivity());
- }
-
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.clear_webview_cache:
- clearWebViewCache();
- break;
- }
- }
-
- private void clearWebViewCache() {
- WebView webview = new WebView(getActivity());
- try {
- webview.clearCache(true);
- Log.w(Logging.LOG_TAG, "Cleard WebView cache.");
- } finally {
- webview.destroy();
- }
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/DuplicateAccountDialogFragment.java b/email2/src/com/android/email/activity/setup/DuplicateAccountDialogFragment.java
deleted file mode 100644
index 72f8936f8..000000000
--- a/email2/src/com/android/email/activity/setup/DuplicateAccountDialogFragment.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import com.android.email.R;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-
-/**
- * Dialog fragment to show "duplicate account" dialog
- */
-public class DuplicateAccountDialogFragment extends DialogFragment {
- public final static String TAG = "DuplicateAccountDialogFragment";
-
- // Argument bundle keys
- private final static String BUNDLE_KEY_ACCOUNT_NAME = "NoteDialogFragment.AccountName";
-
- /**
- * Create the dialog with parameters
- */
- public static DuplicateAccountDialogFragment newInstance(String note) {
- DuplicateAccountDialogFragment f = new DuplicateAccountDialogFragment();
- Bundle b = new Bundle();
- b.putString(BUNDLE_KEY_ACCOUNT_NAME, note);
- f.setArguments(b);
- return f;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- Context context = getActivity();
- String accountName = getArguments().getString(BUNDLE_KEY_ACCOUNT_NAME);
-
- return new AlertDialog.Builder(context)
- .setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(R.string.account_duplicate_dlg_title)
- .setMessage(context.getString(
- R.string.account_duplicate_dlg_message_fmt, accountName))
- .setPositiveButton(
- R.string.okay_action,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- dismiss();
- }
- })
- .create();
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/EditQuickResponseDialog.java b/email2/src/com/android/email/activity/setup/EditQuickResponseDialog.java
deleted file mode 100644
index e3ef21cfb..000000000
--- a/email2/src/com/android/email/activity/setup/EditQuickResponseDialog.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.email.activity.setup;
-
-import com.android.email.R;
-import com.android.emailcommon.provider.QuickResponse;
-import com.android.emailcommon.provider.EmailContent.QuickResponseColumns;
-import com.android.emailcommon.utility.EmailAsyncTask;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.EditText;
-
-/**
- * Dialog to edit the text of a given or new quick response
- */
-public class EditQuickResponseDialog extends DialogFragment
- implements DialogInterface.OnClickListener, TextWatcher {
- private EditText mQuickResponseEditText;
- private QuickResponse mQuickResponse;
- private AlertDialog mDialog;
-
- private static final String QUICK_RESPONSE_EDITED_STRING = "quick_response_edited_string";
- private static final String QUICK_RESPONSE = "quick_response";
-
- /**
- * Creates a new dialog to edit an existing QuickResponse or create a new
- * one.
- *
- * @param quickResponse - The QuickResponse fwhich the user is editing;
- * null if user is creating a new QuickResponse.
- * @param accountId - The accountId for the account which holds this QuickResponse
- */
- public static EditQuickResponseDialog newInstance(
- QuickResponse quickResponse, long accountId) {
- final EditQuickResponseDialog dialog = new EditQuickResponseDialog();
-
- Bundle args = new Bundle();
- args.putLong("accountId", accountId);
- if (quickResponse != null) {
- args.putParcelable(QUICK_RESPONSE, quickResponse);
- }
-
- dialog.setArguments(args);
- return dialog;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final Context context = getActivity();
- mQuickResponse = (QuickResponse) getArguments().getParcelable(QUICK_RESPONSE);
- View wrapper = LayoutInflater.from(context)
- .inflate(R.layout.quick_response_edit_dialog, null);
- mQuickResponseEditText = (EditText) wrapper.findViewById(R.id.quick_response_text);
- if (savedInstanceState != null) {
- String quickResponseSavedString =
- savedInstanceState.getString(QUICK_RESPONSE_EDITED_STRING);
- if (quickResponseSavedString != null) {
- mQuickResponseEditText.setText(quickResponseSavedString);
- }
- } else if (mQuickResponse != null) {
- mQuickResponseEditText.setText(mQuickResponse.toString());
- }
- mQuickResponseEditText.setSelection(mQuickResponseEditText.length());
- mQuickResponseEditText.addTextChangedListener(this);
-
- final AlertDialog.Builder b = new AlertDialog.Builder(context);
- b.setTitle(getResources().getString(R.string.edit_quick_response_dialog))
- .setView(wrapper)
- .setNegativeButton(R.string.cancel_action, this)
- .setPositiveButton(R.string.save_action, this);
- mDialog = b.create();
- return mDialog;
- }
-
- @Override
- public void onResume() {
- super.onResume();
- mDialog.getWindow()
- .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
- if (mQuickResponseEditText.length() == 0) {
- mDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
- }
- }
-
- // implements TextWatcher
- @Override
- public void afterTextChanged(Editable s) {
- mDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(s.length() > 0);
- }
-
- // implements TextWatcher
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
-
- // implements TextWatcher
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {}
-
- // Saves contents during orientation change
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putString(
- QUICK_RESPONSE_EDITED_STRING, mQuickResponseEditText.getText().toString());
- }
-
- /**
- * Implements DialogInterface.OnClickListener
- */
- @Override
- public void onClick(DialogInterface dialog, int which) {
- switch (which) {
- case DialogInterface.BUTTON_NEGATIVE:
- dialog.cancel();
- break;
- case DialogInterface.BUTTON_POSITIVE:
- final long accountId = getArguments().getLong("accountId");
- final String text = mQuickResponseEditText.getText().toString();
- final Context context = getActivity();
- if (mQuickResponse == null) {
- mQuickResponse = new QuickResponse(accountId, text);
- }
-
- // Insert the new QuickResponse into the database. Content watchers used to
- // update the ListView of QuickResponses upon insertion.
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- if (!mQuickResponse.isSaved()) {
- mQuickResponse.save(context);
- } else {
- ContentValues values = new ContentValues();
- values.put(QuickResponseColumns.TEXT, text);
- mQuickResponse.update(context, values);
- }
- }
-
- });
- break;
- }
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/EmailPreferenceFragment.java b/email2/src/com/android/email/activity/setup/EmailPreferenceFragment.java
deleted file mode 100644
index 9f379f873..000000000
--- a/email2/src/com/android/email/activity/setup/EmailPreferenceFragment.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.os.Bundle;
-import android.preference.PreferenceFragment;
-import android.view.Menu;
-import android.view.MenuInflater;
-
-public class EmailPreferenceFragment extends PreferenceFragment {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- //***
- //if (!UiUtilities.useTwoPane(getActivity())) {
- // menu.clear();
- //}
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/ForwardingIntent.java b/email2/src/com/android/email/activity/setup/ForwardingIntent.java
deleted file mode 100644
index 1fc913ef7..000000000
--- a/email2/src/com/android/email/activity/setup/ForwardingIntent.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Copyright (C) 2012 Google Inc.
- * Licensed to The Android Open Source Project.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *******************************************************************************/
-
-package com.android.email.activity.setup;
-
-import android.content.Context;
-import android.content.Intent;
-
-/**
- * An intent that forwards results
- */
-public class ForwardingIntent extends Intent {
- public ForwardingIntent(Context activity, Class klass) {
- super(activity, klass);
- setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/GeneralPreferences.java b/email2/src/com/android/email/activity/setup/GeneralPreferences.java
deleted file mode 100644
index 0418ea57a..000000000
--- a/email2/src/com/android/email/activity/setup/GeneralPreferences.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.database.Cursor;
-import android.os.Bundle;
-import android.preference.CheckBoxPreference;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceChangeListener;
-import android.preference.PreferenceScreen;
-import android.widget.Toast;
-
-import com.android.email.Preferences;
-import com.android.email.R;
-import com.android.email.provider.EmailProvider;
-import com.android.emailcommon.provider.Account;
-
-public class GeneralPreferences extends EmailPreferenceFragment implements
- OnPreferenceChangeListener {
-
- private static final String PREFERENCE_KEY_AUTO_ADVANCE = "auto_advance";
- private static final String PREFERENCE_KEY_TEXT_ZOOM = "text_zoom";
- private static final String PREFERENCE_KEY_CONFIRM_DELETE = "confirm_delete";
- private static final String PREFERENCE_KEY_CONFIRM_SEND = "confirm_send";
- private static final String PREFERENCE_KEY_HIDE_CHECKBOXES = "hide_checkboxes";
- private static final String PREFERENCE_KEY_CLEAR_TRUSTED_SENDERS = "clear_trusted_senders";
-
- private Preferences mPreferences;
- private ListPreference mAutoAdvance;
- /**
- * TODO: remove this when we've decided for certain that an app setting is unnecessary
- * (b/5287963)
- */
- @Deprecated
- private ListPreference mTextZoom;
- private CheckBoxPreference mConfirmDelete;
- private CheckBoxPreference mConfirmSend;
- private CheckBoxPreference mHideCheckboxes;
-
- private boolean mSettingsChanged = false;
-
- CharSequence[] mSizeSummaries;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- getPreferenceManager().setSharedPreferencesName(Preferences.PREFERENCES_FILE);
-
- // Load the preferences from an XML resource
- addPreferencesFromResource(R.xml.general_preferences);
-
- // Merely hide app pref for font size until we're sure it's unnecessary (b/5287963)
- getPreferenceScreen().removePreference(findPreference(PREFERENCE_KEY_TEXT_ZOOM));
- }
-
- @Override
- public void onResume() {
- loadSettings();
- mSettingsChanged = false;
- super.onResume();
- }
-
- @Override
- public void onPause() {
- super.onPause();
- if (mSettingsChanged) {
- // Notify all account settings listeners
- ContentResolver resolver = getActivity().getContentResolver();
- Cursor c = resolver.query(Account.CONTENT_URI, Account.ID_PROJECTION, null, null, null);
- if (c != null) {
- try {
- while (c.moveToNext()) {
- resolver.notifyChange(ContentUris.withAppendedId(
- EmailProvider.UIPROVIDER_SETTINGS_NOTIFIER, c.getLong(0)), null);
- }
- } finally {
- c.close();
- }
- }
- }
- }
-
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- String key = preference.getKey();
- // Indicate we need to send notifications to UI
- mSettingsChanged = true;
- if (PREFERENCE_KEY_AUTO_ADVANCE.equals(key)) {
- mPreferences.setAutoAdvanceDirection(mAutoAdvance.findIndexOfValue((String) newValue));
- return true;
- } else if (PREFERENCE_KEY_TEXT_ZOOM.equals(key)) {
- mPreferences.setTextZoom(mTextZoom.findIndexOfValue((String) newValue));
- reloadDynamicSummaries();
- return true;
- }
- return false;
- }
-
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
- if (getActivity() == null) {
- // Guard against monkeys.
- return false;
- }
- mSettingsChanged = true;
- String key = preference.getKey();
- if (key.equals(PREFERENCE_KEY_CLEAR_TRUSTED_SENDERS)) {
- mPreferences.clearTrustedSenders();
- Toast.makeText(
- getActivity(), R.string.trusted_senders_cleared, Toast.LENGTH_SHORT).show();
- return true;
- } else if (PREFERENCE_KEY_CONFIRM_DELETE.equals(key)) {
- mPreferences.setConfirmDelete(mConfirmDelete.isChecked());
- return true;
- } else if (PREFERENCE_KEY_CONFIRM_SEND.equals(key)) {
- mPreferences.setConfirmSend(mConfirmSend.isChecked());
- return true;
- } else if (PREFERENCE_KEY_HIDE_CHECKBOXES.equals(key)) {
- mPreferences.setHideCheckboxes(mHideCheckboxes.isChecked());
- return true;
- }
- return false;
- }
-
- private void loadSettings() {
- mPreferences = Preferences.getPreferences(getActivity());
- mAutoAdvance = (ListPreference) findPreference(PREFERENCE_KEY_AUTO_ADVANCE);
- mAutoAdvance.setValueIndex(mPreferences.getAutoAdvanceDirection());
- mAutoAdvance.setOnPreferenceChangeListener(this);
-
- mTextZoom = (ListPreference) findPreference(PREFERENCE_KEY_TEXT_ZOOM);
- if (mTextZoom != null) {
- mTextZoom.setValueIndex(mPreferences.getTextZoom());
- mTextZoom.setOnPreferenceChangeListener(this);
- }
-
- mConfirmDelete = (CheckBoxPreference) findPreference(PREFERENCE_KEY_CONFIRM_DELETE);
- mConfirmSend = (CheckBoxPreference) findPreference(PREFERENCE_KEY_CONFIRM_SEND);
- mHideCheckboxes = (CheckBoxPreference) findPreference(PREFERENCE_KEY_HIDE_CHECKBOXES);
-
- reloadDynamicSummaries();
- }
-
- /**
- * Reload any preference summaries that are updated dynamically
- */
- private void reloadDynamicSummaries() {
- if (mTextZoom != null) {
- int textZoomIndex = mPreferences.getTextZoom();
- // Update summary - but only load the array once
- if (mSizeSummaries == null) {
- mSizeSummaries = getActivity().getResources()
- .getTextArray(R.array.general_preference_text_zoom_summary_array);
- }
- CharSequence summary = null;
- if (textZoomIndex >= 0 && textZoomIndex < mSizeSummaries.length) {
- summary = mSizeSummaries[textZoomIndex];
- }
- mTextZoom.setSummary(summary);
- }
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/MailboxSettings.java b/email2/src/com/android/email/activity/setup/MailboxSettings.java
deleted file mode 100644
index e76951c4f..000000000
--- a/email2/src/com/android/email/activity/setup/MailboxSettings.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.ActionBar;
-import android.app.Activity;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.net.Uri;
-import android.os.Bundle;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceChangeListener;
-import android.preference.PreferenceActivity;
-import android.util.Log;
-import android.view.MenuItem;
-
-import com.android.email.R;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.provider.Policy;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.google.common.base.Objects;
-import com.google.common.base.Preconditions;
-
-/**
- * "Mailbox settings" activity.
- *
- * It's used to update per-mailbox sync settings. It normally updates Mailbox settings, unless
- * the target mailbox is Inbox, in which case it updates Account settings instead.
- *
- * All changes made by the user will not be immediately saved to the database, as changing the
- * sync window may result in removal of messages. Instead, we only save to the database in {@link
- * #onDestroy()}, unless it's called for configuration changes.
- */
-public class MailboxSettings extends PreferenceActivity {
- private static final String EXTRA_MAILBOX_ID = "MAILBOX_ID";
- private static final String BUNDLE_ACCOUNT = "MailboxSettings.account";
- private static final String BUNDLE_MAILBOX = "MailboxSettings.mailbox";
- private static final String BUNDLE_NEEDS_SAVE = "MailboxSettings.needsSave";
-
- private static final String PREF_CHECK_FREQUENCY_KEY = "check_frequency";
- private static final String PREF_SYNC_WINDOW_KEY = "sync_window";
-
- private final EmailAsyncTask.Tracker mTaskTracker = new EmailAsyncTask.Tracker();
-
- // Account and Mailbox -- directly loaded by LoadMailboxTask
- private Account mAccount;
- private Mailbox mMailbox;
- private boolean mNeedsSave;
-
- private ListPreference mSyncIntervalPref;
- private ListPreference mSyncLookbackPref;
-
- /**
- * Starts the activity for a mailbox.
- */
- public static final void start(Activity parent, long mailboxId) {
- Intent i = new Intent(parent, MailboxSettings.class);
- i.putExtra(EXTRA_MAILBOX_ID, mailboxId);
- parent.startActivity(i);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- final long mailboxId = getIntent().getLongExtra(EXTRA_MAILBOX_ID, Mailbox.NO_MAILBOX);
- if (mailboxId == Mailbox.NO_MAILBOX) {
- finish();
- return;
- }
-
- addPreferencesFromResource(R.xml.mailbox_preferences);
-
- mSyncIntervalPref = (ListPreference) findPreference(PREF_CHECK_FREQUENCY_KEY);
- mSyncLookbackPref = (ListPreference) findPreference(PREF_SYNC_WINDOW_KEY);
-
- mSyncIntervalPref.setOnPreferenceChangeListener(mPreferenceChanged);
- mSyncLookbackPref.setOnPreferenceChangeListener(mPreferenceChanged);
-
- // Make them disabled until we load data
- enablePreferences(false);
-
- if (savedInstanceState != null) {
- mAccount = savedInstanceState.getParcelable(BUNDLE_ACCOUNT);
- mMailbox = savedInstanceState.getParcelable(BUNDLE_MAILBOX);
- mNeedsSave = savedInstanceState.getBoolean(BUNDLE_NEEDS_SAVE);
- }
- if (mAccount == null) {
- new LoadMailboxTask(mailboxId).executeParallel((Void[]) null);
- } else {
- onDataLoaded();
- }
-
- // Always show "app up" as we expect our parent to be an Email activity.
- ActionBar actionBar = getActionBar();
- if (actionBar != null) {
- actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP);
- }
- }
-
- private void enablePreferences(boolean enabled) {
- mSyncIntervalPref.setEnabled(enabled);
- mSyncLookbackPref.setEnabled(enabled);
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putParcelable(BUNDLE_ACCOUNT, mAccount);
- outState.putParcelable(BUNDLE_MAILBOX, mMailbox);
- outState.putBoolean(BUNDLE_NEEDS_SAVE, mNeedsSave);
- }
-
- /**
- * We save all the settings in onDestroy, *unless it's for configuration changes*.
- */
- @Override
- protected void onDestroy() {
- mTaskTracker.cancellAllInterrupt();
- if (!isChangingConfigurations()) {
- saveToDatabase();
- }
- super.onDestroy();
- }
-
- /**
- * Loads {@link #mAccount} and {@link #mMailbox}.
- */
- private class LoadMailboxTask extends EmailAsyncTask<Void, Void, Void> {
- private final long mMailboxId;
-
- public LoadMailboxTask(long mailboxId) {
- super(mTaskTracker);
- mMailboxId = mailboxId;
- }
-
- @Override
- protected Void doInBackground(Void... params) {
- final Context c = MailboxSettings.this;
- mMailbox = Mailbox.restoreMailboxWithId(c, mMailboxId);
- if (mMailbox != null) {
- mAccount = Account.restoreAccountWithId(c, mMailbox.mAccountKey);
- }
- return null;
- }
-
- @Override
- protected void onSuccess(Void result) {
- if ((mAccount == null) || (mMailbox == null)) {
- finish(); // Account or mailbox removed.
- return;
- }
- onDataLoaded();
- }
- }
-
- /**
- * Setup the entries and entry values for the sync lookback preference
- * @param context the caller's context
- * @param pref a ListPreference to be set up
- * @param account the Account (or owner of a Mailbox) whose preference is being set
- */
- public static void setupLookbackPreferenceOptions(Context context, ListPreference pref,
- Account account) {
- Resources resources = context.getResources();
- // Load the complete list of entries/values
- CharSequence[] entries =
- resources.getTextArray(R.array.account_settings_mail_window_entries);
- CharSequence[] values =
- resources.getTextArray(R.array.account_settings_mail_window_values);
- // If we have a maximum lookback policy, enforce it
- if (account.mPolicyKey > 0) {
- Policy policy = Policy.restorePolicyWithId(context, account.mPolicyKey);
- if (policy != null && (policy.mMaxEmailLookback != 0)) {
- int maxEntry = policy.mMaxEmailLookback + 1;
- // Copy the proper number of values into new entries/values array
- CharSequence[] policyEntries = new CharSequence[maxEntry];
- CharSequence[] policyValues = new CharSequence[maxEntry];
- for (int i = 0; i < maxEntry; i++) {
- policyEntries[i] = entries[i];
- policyValues[i] = values[i];
- }
- // Point entries/values to the new arrays
- entries = policyEntries;
- values = policyValues;
- }
- }
- // Set up the preference
- pref.setEntries(entries);
- pref.setEntryValues(values);
- }
-
- /**
- * Called when {@link #mAccount} and {@link #mMailbox} are loaded (either by the async task
- * or from the saved state).
- */
- private void onDataLoaded() {
- Preconditions.checkNotNull(mAccount);
- Preconditions.checkNotNull(mMailbox);
-
- // Update the title with the mailbox name.
- ActionBar actionBar = getActionBar();
- String mailboxName = mMailbox.mDisplayName;
- if (actionBar != null) {
- actionBar.setTitle(mailboxName);
- actionBar.setSubtitle(getString(R.string.mailbox_settings_activity_title));
- } else {
- setTitle(getString(R.string.mailbox_settings_activity_title_with_mailbox, mailboxName));
- }
-
- setupLookbackPreferenceOptions(this, mSyncLookbackPref, mAccount);
-
- // Set default value & update summary
- mSyncIntervalPref.setValue(String.valueOf(getSyncInterval()));
- mSyncLookbackPref.setValue(String.valueOf(getSyncLookback()));
-
- updatePreferenceSummary();
-
- // Make then enabled
- enablePreferences(true);
- }
-
- private void updatePreferenceSummary() {
- mSyncIntervalPref.setSummary(mSyncIntervalPref.getEntry());
- mSyncLookbackPref.setSummary(mSyncLookbackPref.getEntry());
- }
-
- /**
- * @return current sync interval setting from the objects
- */
- private int getSyncInterval() {
- int syncInterval;
- if (mMailbox.mType == Mailbox.TYPE_INBOX) {
- syncInterval = mAccount.mSyncInterval;
- } else {
- if (mMailbox.mSyncInterval == 0) {
- // 0 is the default value, and it means "don't sync" (for non-inbox mailboxes)
- syncInterval = Mailbox.CHECK_INTERVAL_NEVER;
- } else {
- syncInterval = mMailbox.mSyncInterval;
- }
- }
- // In the case of the internal push states, use "push"
- if (syncInterval == Mailbox.CHECK_INTERVAL_PING ||
- syncInterval == Mailbox.CHECK_INTERVAL_PUSH_HOLD) {
- syncInterval = Mailbox.CHECK_INTERVAL_PUSH;
- }
- return syncInterval;
- }
-
- /**
- * @return current sync lookback setting from the objects
- */
- private int getSyncLookback() {
- if (mMailbox.mType == Mailbox.TYPE_INBOX) {
- return mAccount.mSyncLookback;
- } else {
- // Here, 0 is valid and means "use the account default sync window".
- return mMailbox.mSyncLookback;
- }
- }
-
- private final OnPreferenceChangeListener mPreferenceChanged = new OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- final ListPreference lp = (ListPreference) preference;
- if (Objects.equal(lp.getValue(), newValue)) {
- return false;
- }
- mNeedsSave = true;
- if (MailActivityEmail.DEBUG) {
- Log.i(Logging.LOG_TAG, "Setting changed");
- }
- // In order to set the current entry to the summary, we need to udpate the value
- // manually, rather than letting the framework do that (by returning true).
- lp.setValue((String) newValue);
- updatePreferenceSummary();
- updateObjects();
- return false;
- }
- };
-
- /**
- * Updates {@link #mAccount}/{@link #mMailbox}, but doesn't save to the database yet.
- */
- private void updateObjects() {
- final int syncInterval = Integer.valueOf(mSyncIntervalPref.getValue());
- final int syncLookback = Integer.valueOf(mSyncLookbackPref.getValue());
- if (MailActivityEmail.DEBUG) {
- Log.i(Logging.LOG_TAG, "Updating object: " + syncInterval + "," + syncLookback);
- }
- if (mMailbox.mType == Mailbox.TYPE_INBOX) {
- mAccount.mSyncInterval = syncInterval;
- mAccount.mSyncLookback = syncLookback;
- } else {
- mMailbox.mSyncInterval = syncInterval;
- mMailbox.mSyncLookback = syncLookback;
- }
- }
-
- /**
- * Save changes to the database.
- *
- * Note it's called from {@link #onDestroy()}, which is called on the UI thread where we're not
- * allowed to touch the database, so it uses {@link EmailAsyncTask} to do the save on a bg
- * thread. This unfortunately means there's a chance that the app gets killed before the save is
- * finished.
- */
- private void saveToDatabase() {
- if (!mNeedsSave) {
- return;
- }
- Log.i(Logging.LOG_TAG, "Saving mailbox settings...");
- enablePreferences(false);
-
- // Since the activity will be destroyed...
- // Create local references (Although it's really okay to touch members of a destroyed
- // activity...)
- final Account account = mAccount;
- final Mailbox mailbox = mMailbox;
- final Context context = getApplicationContext();
-
- new EmailAsyncTask<Void, Void, Void> (null /* no cancel */) {
- @Override
- protected Void doInBackground(Void... params) {
- final ContentValues cv = new ContentValues();
- final Uri uri;
-
- if (mailbox.mType == Mailbox.TYPE_INBOX) {
- cv.put(AccountColumns.SYNC_INTERVAL, account.mSyncInterval);
- cv.put(AccountColumns.SYNC_LOOKBACK, account.mSyncLookback);
- uri = ContentUris.withAppendedId(Account.CONTENT_URI, account.mId);
- } else {
- cv.put(MailboxColumns.SYNC_INTERVAL, mailbox.mSyncInterval);
- cv.put(MailboxColumns.SYNC_LOOKBACK, mailbox.mSyncLookback);
- uri = ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailbox.mId);
- }
- context.getContentResolver().update(uri, cv, null, null);
-
- Log.i(Logging.LOG_TAG, "Saved: " + uri);
- return null;
- }
-
- @Override
- protected void onSuccess(Void result) {
- // must be called on the ui thread
- //***
- //RefreshManager.getInstance(context).refreshMessageList(account.mId, mailbox.mId,
- // true);
- }
- }.executeSerial((Void [])null);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == android.R.id.home) {
- onBackPressed();
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/PolicyListPreference.java b/email2/src/com/android/email/activity/setup/PolicyListPreference.java
deleted file mode 100644
index 3a32438e7..000000000
--- a/email2/src/com/android/email/activity/setup/PolicyListPreference.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.content.Context;
-import android.preference.Preference;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.TextView;
-
-/**
- * Simple text preference allowing a large number of lines
- */
-public class PolicyListPreference extends Preference {
- // Arbitrary, but large number (we don't, and won't, have nearly this many)
- public static final int MAX_POLICIES = 24;
-
- public PolicyListPreference(Context ctx, AttributeSet attrs, int defStyle) {
- super(ctx, attrs, defStyle);
- }
-
- public PolicyListPreference(Context ctx, AttributeSet attrs) {
- super(ctx, attrs);
- }
-
- @Override
- protected void onBindView(View view) {
- super.onBindView(view);
- ((TextView)view.findViewById(android.R.id.summary)).setMaxLines(MAX_POLICIES);
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/SetupData.java b/email2/src/com/android/email/activity/setup/SetupData.java
deleted file mode 100644
index 6ffaf73f1..000000000
--- a/email2/src/com/android/email/activity/setup/SetupData.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.accounts.AccountAuthenticatorResponse;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.Policy;
-
-public class SetupData implements Parcelable {
- // The "extra" name for the Bundle saved with SetupData
- public static final String EXTRA_SETUP_DATA = "com.android.email.setupdata";
-
- // NORMAL is the standard entry from the Email app; EAS and POP_IMAP are used when entering via
- // Settings -> Accounts
- public static final int FLOW_MODE_UNSPECIFIED = -1;
- public static final int FLOW_MODE_NORMAL = 0;
- public static final int FLOW_MODE_ACCOUNT_MANAGER = 1;
- public static final int FLOW_MODE_EDIT = 3;
- public static final int FLOW_MODE_FORCE_CREATE = 4;
- // The following two modes are used to "pop the stack" and return from the setup flow. We
- // either return to the caller (if we're in an account type flow) or go to the message list
- public static final int FLOW_MODE_RETURN_TO_CALLER = 5;
- public static final int FLOW_MODE_RETURN_TO_MESSAGE_LIST = 6;
- public static final int FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT = 7;
- public static final int FLOW_MODE_NO_ACCOUNTS = 8;
-
- // For debug logging
- private static final String[] FLOW_MODES = {"normal", "eas", "pop/imap", "edit", "force",
- "rtc", "rtl"};
-
- // Mode bits for AccountSetupCheckSettings, indicating the type of check requested
- public static final int CHECK_INCOMING = 1;
- public static final int CHECK_OUTGOING = 2;
- public static final int CHECK_AUTODISCOVER = 4;
-
- // All access will be through getters/setters
- private int mFlowMode = FLOW_MODE_NORMAL;
- private String mFlowAccountType;
- private Account mAccount;
- private String mUsername;
- private String mPassword;
- private int mCheckSettingsMode = 0;
- private boolean mAllowAutodiscover = true;
- private Policy mPolicy;
- private boolean mAutoSetup = false;
- private boolean mDefault = false;
- private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null;
-
- // We only have one instance of SetupData; if/when the process is destroyed, this data will be
- // saved in the savedInstanceState Bundle
- private static SetupData INSTANCE = null;
-
- public static synchronized SetupData getInstance() {
- if (INSTANCE == null) {
- INSTANCE = new SetupData();
- }
- return INSTANCE;
- }
-
- // Don't allow instantiation outside of this class
- private SetupData() {
- }
-
- static public int getFlowMode() {
- return getInstance().mFlowMode;
- }
-
- static public String getFlowAccountType() {
- return getInstance().mFlowAccountType;
- }
-
- static public void setFlowMode(int mFlowMode) {
- getInstance().mFlowMode = mFlowMode;
- }
-
- static public Account getAccount() {
- return getInstance().mAccount;
- }
-
- static public void setAccount(Account mAccount) {
- getInstance().mAccount = mAccount;
- }
-
- static public String getUsername() {
- return getInstance().mUsername;
- }
-
- static public void setUsername(String mUsername) {
- getInstance().mUsername = mUsername;
- }
-
- static public String getPassword() {
- return getInstance().mPassword;
- }
-
- static public void setPassword(String mPassword) {
- getInstance().mPassword = mPassword;
- }
-
- static public void setCheckSettingsMode(int mCheckSettingsMode) {
- getInstance().mCheckSettingsMode = mCheckSettingsMode;
- }
-
- static public boolean isCheckIncoming() {
- return (getInstance().mCheckSettingsMode & CHECK_INCOMING) != 0;
- }
-
- static public boolean isCheckOutgoing() {
- return (getInstance().mCheckSettingsMode & CHECK_OUTGOING) != 0;
- }
- static public boolean isCheckAutodiscover() {
- return (getInstance().mCheckSettingsMode & CHECK_AUTODISCOVER) != 0;
- }
- static public boolean isAllowAutodiscover() {
- return getInstance().mAllowAutodiscover;
- }
-
- static public void setAllowAutodiscover(boolean mAllowAutodiscover) {
- getInstance().mAllowAutodiscover = mAllowAutodiscover;
- }
-
- static public Policy getPolicy() {
- return getInstance().mPolicy;
- }
-
- static public void setPolicy(Policy policy) {
- SetupData data = getInstance();
- data.mPolicy = policy;
- data.mAccount.mPolicy = policy;
- }
-
- static public boolean isAutoSetup() {
- return getInstance().mAutoSetup;
- }
-
- static public void setAutoSetup(boolean autoSetup) {
- getInstance().mAutoSetup = autoSetup;
- }
-
- static public boolean isDefault() {
- return getInstance().mDefault;
- }
-
- static public void setDefault(boolean _default) {
- getInstance().mDefault = _default;
- }
-
- static public AccountAuthenticatorResponse getAccountAuthenticatorResponse() {
- return getInstance().mAccountAuthenticatorResponse;
- }
-
- static public void setAccountAuthenticatorResponse(AccountAuthenticatorResponse response) {
- getInstance().mAccountAuthenticatorResponse = response;
- }
-
- public static void init(int flowMode) {
- SetupData data = getInstance();
- data.commonInit();
- data.mFlowMode = flowMode;
- }
-
- public static void init(int flowMode, String accountType) {
- SetupData data = getInstance();
- data.commonInit();
- data.mFlowMode = flowMode;
- data.mFlowAccountType = accountType;
- }
-
- public static void init(int flowMode, Account account) {
- SetupData data = getInstance();
- data.commonInit();
- data.mFlowMode = flowMode;
- data.mAccount = account;
- }
-
- void commonInit() {
- mPolicy = null;
- mAutoSetup = false;
- mAllowAutodiscover = true;
- mCheckSettingsMode = 0;
- mAccount = new Account();
- mDefault = false;
- mUsername = null;
- mPassword = null;
- mAccountAuthenticatorResponse = null;
- }
-
- // Parcelable methods
- @Override
- public int describeContents() {
- return 0;
- }
-
- public static final Parcelable.Creator<SetupData> CREATOR =
- new Parcelable.Creator<SetupData>() {
- @Override
- public SetupData createFromParcel(Parcel in) {
- return new SetupData(in);
- }
-
- @Override
- public SetupData[] newArray(int size) {
- return new SetupData[size];
- }
- };
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(mFlowMode);
- dest.writeParcelable(mAccount, 0);
- dest.writeString(mUsername);
- dest.writeString(mPassword);
- dest.writeInt(mCheckSettingsMode);
- dest.writeInt(mAllowAutodiscover ? 1 : 0);
- dest.writeParcelable(mPolicy, 0);
- dest.writeInt(mAutoSetup ? 1 : 0);
- dest.writeInt(mDefault ? 1 : 0);
- dest.writeParcelable(mAccountAuthenticatorResponse, 0);
- }
-
- public SetupData(Parcel in) {
- ClassLoader loader = getClass().getClassLoader();
- mFlowMode = in.readInt();
- mAccount = in.readParcelable(loader);
- mUsername = in.readString();
- mPassword = in.readString();
- mCheckSettingsMode = in.readInt();
- mAllowAutodiscover = in.readInt() == 1;
- mPolicy = in.readParcelable(loader);
- mAutoSetup = in.readInt() == 1;
- mDefault = in.readInt() == 1;
- mAccountAuthenticatorResponse = in.readParcelable(loader);
- }
-
- // Save/restore our SetupData (used in AccountSetupActivity)
- static public void save(Bundle bundle) {
- bundle.putParcelable(EXTRA_SETUP_DATA, getInstance());
- }
-
- static public synchronized SetupData restore(Bundle bundle) {
- if (bundle != null && bundle.containsKey(EXTRA_SETUP_DATA)) {
- INSTANCE = bundle.getParcelable(EXTRA_SETUP_DATA);
- return INSTANCE;
- } else {
- return getInstance();
- }
- }
-
- public static String debugString() {
- StringBuilder sb = new StringBuilder("SetupData");
- SetupData data = getInstance();
- sb.append(":flow=" + FLOW_MODES[data.mFlowMode]);
- sb.append(":acct=" + (data.mAccount == null ? "none" : data.mAccount.mId));
- if (data.mUsername != null) {
- sb.append(":user=" + data.mUsername);
- }
- if (data.mPassword != null) {
- sb.append(":pass=" + data.mPassword);
- }
- sb.append(":a/d=" + data.mAllowAutodiscover);
- sb.append(":auto=" + data.mAutoSetup);
- sb.append(":default=" + data.mDefault);
- sb.append(":check=");
- if (SetupData.isCheckIncoming()) sb.append("in+");
- if (SetupData.isCheckOutgoing()) sb.append("out+");
- if (SetupData.isCheckAutodiscover()) sb.append("a/d");
- sb.append(":policy=" + (data.mPolicy == null ? "none" : "exists"));
- return sb.toString();
- }
-}
diff --git a/email2/src/com/android/email/activity/setup/SpinnerOption.java b/email2/src/com/android/email/activity/setup/SpinnerOption.java
deleted file mode 100644
index 4bac76bbd..000000000
--- a/email2/src/com/android/email/activity/setup/SpinnerOption.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.widget.Spinner;
-
-public class SpinnerOption {
- public final Object value;
-
- public final String label;
-
- public static void setSpinnerOptionValue(Spinner spinner, Object value) {
- for (int i = 0, count = spinner.getCount(); i < count; i++) {
- SpinnerOption so = (SpinnerOption)spinner.getItemAtPosition(i);
- if (so.value.equals(value)) {
- spinner.setSelection(i, true);
- return;
- }
- }
- }
-
- public SpinnerOption(Object value, String label) {
- this.value = value;
- this.label = label;
- }
-
- @Override
- public String toString() {
- return label;
- }
-}
diff --git a/email2/src/com/android/email/data/ClosingMatrixCursor.java b/email2/src/com/android/email/data/ClosingMatrixCursor.java
deleted file mode 100644
index a01017433..000000000
--- a/email2/src/com/android/email/data/ClosingMatrixCursor.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.data;
-
-import android.database.Cursor;
-import android.database.MatrixCursor;
-
-
-/**
- * {@link MatrixCursor} which takes an extra {@link Cursor} to the constructor, and close
- * it when self is closed.
- */
-public class ClosingMatrixCursor extends MatrixCursor {
- private final Cursor mInnerCursor;
-
- public ClosingMatrixCursor(String[] columnNames, Cursor innerCursor) {
- super(columnNames);
- mInnerCursor = innerCursor;
- }
-
- @Override
- public void close() {
- if (mInnerCursor != null) {
- mInnerCursor.close();
- }
- super.close();
- }
-}
diff --git a/email2/src/com/android/email/mail/Sender.java b/email2/src/com/android/email/mail/Sender.java
deleted file mode 100644
index a2fb567a0..000000000
--- a/email2/src/com/android/email/mail/Sender.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail;
-
-import android.content.Context;
-import android.content.res.XmlResourceParser;
-import android.util.Log;
-
-import com.android.email.R;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-
-public abstract class Sender {
- protected static final int SOCKET_CONNECT_TIMEOUT = 10000;
-
- /**
- * Static named constructor. It should be overrode by extending class.
- * Because this method will be called through reflection, it can not be protected.
- */
- public static Sender newInstance(Context context, Account account)
- throws MessagingException {
- throw new MessagingException("Sender.newInstance: Unknown scheme in "
- + account.mDisplayName);
- }
-
- private static Sender instantiateSender(Context context, String className, Account account)
- throws MessagingException {
- Object o = null;
- try {
- Class<?> c = Class.forName(className);
- // and invoke "newInstance" class method and instantiate sender object.
- java.lang.reflect.Method m =
- c.getMethod("newInstance", Account.class, Context.class);
- o = m.invoke(null, account, context);
- } catch (Exception e) {
- Log.d(Logging.LOG_TAG, String.format(
- "exception %s invoking method %s#newInstance(Account, Context) for %s",
- e.toString(), className, account.mDisplayName));
- throw new MessagingException("can not instantiate Sender for " + account.mDisplayName);
- }
- if (!(o instanceof Sender)) {
- throw new MessagingException(
- account.mDisplayName + ": " + className + " create incompatible object");
- }
- return (Sender) o;
- }
-
- /**
- * Find Sender implementation consulting with sender.xml file.
- */
- private static Sender findSender(Context context, int resourceId, Account account)
- throws MessagingException {
- Sender sender = null;
- try {
- XmlResourceParser xml = context.getResources().getXml(resourceId);
- int xmlEventType;
- HostAuth sendAuth = account.getOrCreateHostAuthSend(context);
- // walk through senders.xml file.
- while ((xmlEventType = xml.next()) != XmlResourceParser.END_DOCUMENT) {
- if (xmlEventType == XmlResourceParser.START_TAG &&
- "sender".equals(xml.getName())) {
- String xmlScheme = xml.getAttributeValue(null, "scheme");
- if (sendAuth.mProtocol != null && sendAuth.mProtocol.startsWith(xmlScheme)) {
- // found sender entry whose scheme is matched with uri.
- // then load sender class.
- String className = xml.getAttributeValue(null, "class");
- sender = instantiateSender(context, className, account);
- }
- }
- }
- } catch (XmlPullParserException e) {
- // ignore
- } catch (IOException e) {
- // ignore
- }
- return sender;
- }
-
- /**
- * Get an instance of a mail sender for the given account. The account must be valid (i.e. has
- * at least an outgoing server name).
- *
- * @param context the caller's context
- * @param account the account of the sender.
- * @return an initialized sender of the appropriate class
- * @throws MessagingException If the sender cannot be obtained or if the account is invalid.
- */
- public synchronized static Sender getInstance(Context context, Account account)
- throws MessagingException {
- Context appContext = context.getApplicationContext();
- Sender sender = findSender(appContext, R.xml.senders_product, account);
- if (sender == null) {
- sender = findSender(appContext, R.xml.senders, account);
- }
- if (sender == null) {
- throw new MessagingException("Cannot find sender for account " + account.mDisplayName);
- }
- return sender;
- }
-
- /**
- * Get class of SettingActivity for this Sender class.
- * @return Activity class that has class method actionEditOutgoingSettings().
- */
- public Class<? extends android.app.Activity> getSettingActivityClass() {
- // default SettingActivity class
- return com.android.email.activity.setup.AccountSetupOutgoing.class;
- }
-
- public abstract void open() throws MessagingException;
-
- public abstract void sendMessage(long messageId) throws MessagingException;
-
- public abstract void close() throws MessagingException;
-}
diff --git a/email2/src/com/android/email/mail/Store.java b/email2/src/com/android/email/mail/Store.java
deleted file mode 100644
index 15cf4deb4..000000000
--- a/email2/src/com/android/email/mail/Store.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.util.Log;
-
-import com.android.email.mail.store.ImapStore;
-import com.android.email.mail.store.Pop3Store;
-import com.android.email.mail.store.ServiceStore;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.Folder;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.lang.reflect.Method;
-import java.util.HashMap;
-
-/**
- * Store is the legacy equivalent of the Account class
- */
-public abstract class Store {
- /**
- * A global suggestion to Store implementors on how much of the body
- * should be returned on FetchProfile.Item.BODY_SANE requests.
- */
- public static final int FETCH_BODY_SANE_SUGGESTED_SIZE = (50 * 1024);
-
- @VisibleForTesting
- static final HashMap<HostAuth, Store> sStores = new HashMap<HostAuth, Store>();
- protected Context mContext;
- protected Account mAccount;
- protected Transport mTransport;
- protected String mUsername;
- protected String mPassword;
-
- static final HashMap<String, Class<? extends Store>> sStoreClasses =
- new HashMap<String, Class<? extends Store>>();
-
- static {
- sStoreClasses.put(HostAuth.LEGACY_SCHEME_IMAP, ImapStore.class);
- sStoreClasses.put(HostAuth.LEGACY_SCHEME_POP3, Pop3Store.class);
- }
-
- /**
- * Static named constructor. It should be overrode by extending class.
- * Because this method will be called through reflection, it can not be protected.
- */
- static Store newInstance(Account account, Context context) throws MessagingException {
- throw new MessagingException("Store#newInstance: Unknown scheme in "
- + account.mDisplayName);
- }
-
- /**
- * Get an instance of a mail store for the given account. The account must be valid (i.e. has
- * at least an incoming server name).
- *
- * NOTE: The internal algorithm used to find a cached store depends upon the account's
- * HostAuth row. If this ever changes (e.g. such as the user updating the
- * host name or port), we will leak entries. This should not be typical, so, it is not
- * a critical problem. However, it is something we should consider fixing.
- *
- * @param account The account of the store.
- * @return an initialized store of the appropriate class
- * @throws MessagingException If the store cannot be obtained or if the account is invalid.
- */
- public synchronized static Store getInstance(Account account, Context context)
- throws MessagingException {
- HostAuth hostAuth = account.getOrCreateHostAuthRecv(context);
- // An existing account might have been deleted
- if (hostAuth == null) return null;
- Store store = sStores.get(hostAuth);
- if (store == null) {
- Context appContext = context.getApplicationContext();
- Class<? extends Store> klass = sStoreClasses.get(hostAuth.mProtocol);
- if (klass == null) {
- klass = ServiceStore.class;
- }
- try {
- // invoke "newInstance" class method
- Method m = klass.getMethod("newInstance", Account.class, Context.class);
- store = (Store)m.invoke(null, account, appContext);
- } catch (Exception e) {
- Log.d(Logging.LOG_TAG, String.format(
- "exception %s invoking method %s#newInstance(Account, Context) for %s",
- e.toString(), klass.getName(), account.mDisplayName));
- throw new MessagingException("Can't instantiate Store for " + account.mDisplayName);
- }
- // Don't cache this unless it's we've got a saved HostAuth
- if (hostAuth.mId != EmailContent.NOT_SAVED) {
- sStores.put(hostAuth, store);
- }
- }
- return store;
- }
-
- /**
- * Delete the mail store associated with the given account. The account must be valid (i.e. has
- * at least an incoming server name).
- *
- * The store should have been notified already by calling delete(), and the caller should
- * also take responsibility for deleting the matching LocalStore, etc.
- *
- * @throws MessagingException If the store cannot be removed or if the account is invalid.
- */
- public synchronized static Store removeInstance(Account account, Context context)
- throws MessagingException {
- return sStores.remove(HostAuth.restoreHostAuthWithId(context, account.mHostAuthKeyRecv));
- }
-
- /**
- * Some protocols require that a sent message be copied (uploaded) into the Sent folder
- * while others can take care of it automatically (ideally, on the server). This function
- * allows a given store to indicate which mode(s) it supports.
- * @return true if the store requires an upload into "sent", false if this happens automatically
- * for any sent message.
- */
- public boolean requireCopyMessageToSentFolder() {
- return true;
- }
-
- public Folder getFolder(String name) throws MessagingException {
- return null;
- }
-
- /**
- * Updates the local list of mailboxes according to what is located on the remote server.
- * <em>Note: This does not perform folder synchronization and it will not remove mailboxes
- * that are stored locally but not remotely.</em>
- * @return The set of remote folders
- * @throws MessagingException If there was a problem connecting to the remote server
- */
- public Folder[] updateFolders() throws MessagingException {
- return null;
- }
-
- public abstract Bundle checkSettings() throws MessagingException;
-
- /**
- * Handle discovery of account settings using only the user's email address and password
- * @param context the context of the caller
- * @param emailAddress the email address of the exchange user
- * @param password the password of the exchange user
- * @return a Bundle containing an error code and a HostAuth (if successful)
- * @throws MessagingException
- */
- public Bundle autoDiscover(Context context, String emailAddress, String password)
- throws MessagingException {
- return null;
- }
-
- /**
- * Updates the fields within the given mailbox. Only the fields that are important to
- * non-EAS accounts are modified.
- */
- protected static void updateMailbox(Mailbox mailbox, long accountId, String mailboxPath,
- char delimiter, boolean selectable, int type) {
- mailbox.mAccountKey = accountId;
- mailbox.mDelimiter = delimiter;
- String displayPath = mailboxPath;
- int pathIndex = mailboxPath.lastIndexOf(delimiter);
- if (pathIndex > 0) {
- displayPath = mailboxPath.substring(pathIndex + 1);
- }
- mailbox.mDisplayName = displayPath;
- if (selectable) {
- mailbox.mFlags = Mailbox.FLAG_HOLDS_MAIL | Mailbox.FLAG_ACCEPTS_MOVED_MAIL;
- }
- mailbox.mFlagVisible = true;
- //mailbox.mParentKey;
- //mailbox.mParentServerId;
- mailbox.mServerId = mailboxPath;
- //mailbox.mServerId;
- //mailbox.mSyncFrequency;
- //mailbox.mSyncKey;
- //mailbox.mSyncLookback;
- //mailbox.mSyncTime;
- mailbox.mType = type;
- //box.mUnreadCount;
- mailbox.mVisibleLimit = MailActivityEmail.VISIBLE_LIMIT_DEFAULT;
- }
-}
diff --git a/email2/src/com/android/email/mail/Transport.java b/email2/src/com/android/email/mail/Transport.java
deleted file mode 100644
index 8f8ad2e25..000000000
--- a/email2/src/com/android/email/mail/Transport.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail;
-
-import com.android.emailcommon.mail.CertificateValidationException;
-import com.android.emailcommon.mail.MessagingException;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.SocketException;
-
-/**
- * This interface defines a "transport", which is defined here as being one layer below the
- * specific wire protocols such as POP3, IMAP, or SMTP.
- *
- * Practically speaking, it provides a definition of the common functionality between them
- * (dealing with sockets & streams, SSL, logging, and so forth), and provides a seam just below
- * the individual protocols to enable better testing.
- *
- * The following features are supported and presumed to be common:
- *
- * Interpretation of URI
- * Support for SSL and TLS wireline security
- */
-public interface Transport extends Cloneable {
-
- /**
- * Connection security options for transport that supports SSL and/or TLS
- */
- public static final int CONNECTION_SECURITY_NONE = 0;
- public static final int CONNECTION_SECURITY_SSL = 1;
- public static final int CONNECTION_SECURITY_TLS = 2;
-
- /**
- * Get a new transport, using an existing one as a model. The new transport is configured as if
- * setUri() and setSecurity() have been called, but not opened or connected in any way.
- * @return a new Transport ready to open()
- */
- public Transport clone();
-
- /**
- * Sets the host
- */
- public void setHost(String host);
-
- /**
- * Sets the port
- */
- public void setPort(int port);
-
- /**
- * Returns the host or {@code null} if none was specified.
- */
- public String getHost();
-
- /**
- * Returns the port or {@code 0} if none was specified.
- */
- public int getPort();
-
- /**
- * Set the desired security mode for this connection.
- * @param connectionSecurity A value indicating the desired security mode.
- * @param trustAllCertificates true to allow unverifiable certificates to be used
- */
- public void setSecurity(int connectionSecurity, boolean trustAllCertificates);
-
- /**
- * @return Returns the desired security mode for this connection.
- */
- public int getSecurity();
-
- /**
- * @return true if the security mode indicates that SSL is possible
- */
- public boolean canTrySslSecurity();
-
- /**
- * @return true if the security mode indicates that TLS is possible
- */
- public boolean canTryTlsSecurity();
-
- /**
- * @return true if the security mode indicates that all certificates can be trusted
- */
- public boolean canTrustAllCertificates();
-
- /**
- * Set the socket timeout.
- * @param timeoutMilliseconds the read timeout value if greater than {@code 0}, or
- * {@code 0} for an infinite timeout.
- */
- public void setSoTimeout(int timeoutMilliseconds) throws SocketException;
-
- /**
- * Attempts to open the connection using the supplied parameters, and using SSL if indicated.
- */
- public void open() throws MessagingException, CertificateValidationException;
-
- /**
- * Attempts to reopen the connection using TLS.
- */
- public void reopenTls() throws MessagingException;
-
- /**
- * @return true if the connection is open
- */
- public boolean isOpen();
-
- /**
- * Closes the connection. Does not send any closure messages, simply closes the socket and the
- * associated streams. Best effort only. Catches all exceptions and always returns.
- *
- * MUST NOT throw any exceptions.
- */
- public void close();
-
- /**
- * @return returns the active input stream
- */
- public InputStream getInputStream();
-
- /**
- * @return returns the active output stream
- */
- public OutputStream getOutputStream();
-
- /**
- * Write a single line to the server, and may generate a log entry (if enabled).
- * @param s The text to send to the server.
- * @param sensitiveReplacement If the command includes sensitive data (e.g. authentication)
- * please pass a replacement string here (for logging). Most callers simply pass null,
- */
- void writeLine(String s, String sensitiveReplacement) throws IOException;
-
- /**
- * Reads a single line from the server. Any delimiter characters will not be included in the
- * result. May generate a log entry, if enabled.
- * @return Returns the string from the server.
- * @throws IOException
- */
- String readLine() throws IOException;
-
- /**
- * @return The local address. If we have an open socket, get the local address from this.
- * Otherwise simply use {@link InetAddress#getLocalHost}.
- */
- InetAddress getLocalAddress() throws IOException;
-}
diff --git a/email2/src/com/android/email/mail/internet/EmailHtmlUtil.java b/email2/src/com/android/email/mail/internet/EmailHtmlUtil.java
deleted file mode 100755
index acccdc0bd..000000000
--- a/email2/src/com/android/email/mail/internet/EmailHtmlUtil.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.internet;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class EmailHtmlUtil {
-
- // Regex that matches characters that have special meaning in HTML. '<', '>', '&' and
- // multiple continuous spaces.
- private static final Pattern PLAIN_TEXT_TO_ESCAPE = Pattern.compile("[<>&]| {2,}|\r?\n");
-
- /**
- * Escape some special character as HTML escape sequence.
- *
- * @param text Text to be displayed using WebView.
- * @return Text correctly escaped.
- */
- public static String escapeCharacterToDisplay(String text) {
- Pattern pattern = PLAIN_TEXT_TO_ESCAPE;
- Matcher match = pattern.matcher(text);
-
- if (match.find()) {
- StringBuilder out = new StringBuilder();
- int end = 0;
- do {
- int start = match.start();
- out.append(text.substring(end, start));
- end = match.end();
- int c = text.codePointAt(start);
- if (c == ' ') {
- // Escape successive spaces into series of "&nbsp;".
- for (int i = 1, n = end - start; i < n; ++i) {
- out.append("&nbsp;");
- }
- out.append(' ');
- } else if (c == '\r' || c == '\n') {
- out.append("<br>");
- } else if (c == '<') {
- out.append("&lt;");
- } else if (c == '>') {
- out.append("&gt;");
- } else if (c == '&') {
- out.append("&amp;");
- }
- } while (match.find());
- out.append(text.substring(end));
- text = out.toString();
- }
- return text;
- }
-}
diff --git a/email2/src/com/android/email/mail/store/ImapConnection.java b/email2/src/com/android/email/mail/store/ImapConnection.java
deleted file mode 100644
index e83b9fc24..000000000
--- a/email2/src/com/android/email/mail/store/ImapConnection.java
+++ /dev/null
@@ -1,520 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store;
-
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.email.mail.Transport;
-import com.android.email.mail.store.ImapStore.ImapException;
-import com.android.email.mail.store.imap.ImapConstants;
-import com.android.email.mail.store.imap.ImapList;
-import com.android.email.mail.store.imap.ImapResponse;
-import com.android.email.mail.store.imap.ImapResponseParser;
-import com.android.email.mail.store.imap.ImapUtility;
-import com.android.email.mail.transport.DiscourseLogger;
-import com.android.email.mail.transport.MailTransport;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.AuthenticationFailedException;
-import com.android.emailcommon.mail.CertificateValidationException;
-import com.android.emailcommon.mail.MessagingException;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import javax.net.ssl.SSLException;
-
-/**
- * A cacheable class that stores the details for a single IMAP connection.
- */
-class ImapConnection {
- // Always check in FALSE
- private static final boolean DEBUG_FORCE_SEND_ID = false;
-
- /** ID capability per RFC 2971*/
- public static final int CAPABILITY_ID = 1 << 0;
- /** NAMESPACE capability per RFC 2342 */
- public static final int CAPABILITY_NAMESPACE = 1 << 1;
- /** STARTTLS capability per RFC 3501 */
- public static final int CAPABILITY_STARTTLS = 1 << 2;
- /** UIDPLUS capability per RFC 4315 */
- public static final int CAPABILITY_UIDPLUS = 1 << 3;
-
- /** The capabilities supported; a set of CAPABILITY_* values. */
- private int mCapabilities;
- private static final String IMAP_REDACTED_LOG = "[IMAP command redacted]";
- Transport mTransport;
- private ImapResponseParser mParser;
- private ImapStore mImapStore;
- private String mUsername;
- private String mLoginPhrase;
- private String mIdPhrase = null;
- /** # of command/response lines to log upon crash. */
- private static final int DISCOURSE_LOGGER_SIZE = 64;
- private final DiscourseLogger mDiscourse = new DiscourseLogger(DISCOURSE_LOGGER_SIZE);
- /**
- * Next tag to use. All connections associated to the same ImapStore instance share the same
- * counter to make tests simpler.
- * (Some of the tests involve multiple connections but only have a single counter to track the
- * tag.)
- */
- private final AtomicInteger mNextCommandTag = new AtomicInteger(0);
-
-
- // Keep others from instantiating directly
- ImapConnection(ImapStore store, String username, String password) {
- setStore(store, username, password);
- }
-
- void setStore(ImapStore store, String username, String password) {
- if (username != null && password != null) {
- mUsername = username;
-
- // build the LOGIN string once (instead of over-and-over again.)
- // apply the quoting here around the built-up password
- mLoginPhrase = ImapConstants.LOGIN + " " + mUsername + " "
- + ImapUtility.imapQuoted(password);
- }
- mImapStore = store;
- }
- void open() throws IOException, MessagingException {
- if (mTransport != null && mTransport.isOpen()) {
- return;
- }
-
- try {
- // copy configuration into a clean transport, if necessary
- if (mTransport == null) {
- mTransport = mImapStore.cloneTransport();
- }
-
- mTransport.open();
- mTransport.setSoTimeout(MailTransport.SOCKET_READ_TIMEOUT);
-
- createParser();
-
- // BANNER
- mParser.readResponse();
-
- // CAPABILITY
- ImapResponse capabilities = queryCapabilities();
-
- boolean hasStartTlsCapability =
- capabilities.contains(ImapConstants.STARTTLS);
-
- // TLS
- ImapResponse newCapabilities = doStartTls(hasStartTlsCapability);
- if (newCapabilities != null) {
- capabilities = newCapabilities;
- }
-
- // NOTE: An IMAP response MUST be processed before issuing any new IMAP
- // requests. Subsequent requests may destroy previous response data. As
- // such, we save away capability information here for future use.
- setCapabilities(capabilities);
- String capabilityString = capabilities.flatten();
-
- // ID
- doSendId(isCapable(CAPABILITY_ID), capabilityString);
-
- // LOGIN
- doLogin();
-
- // NAMESPACE (only valid in the Authenticated state)
- doGetNamespace(isCapable(CAPABILITY_NAMESPACE));
-
- // Gets the path separator from the server
- doGetPathSeparator();
-
- mImapStore.ensurePrefixIsValid();
- } catch (SSLException e) {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, e.toString());
- }
- throw new CertificateValidationException(e.getMessage(), e);
- } catch (IOException ioe) {
- // NOTE: Unlike similar code in POP3, I'm going to rethrow as-is. There is a lot
- // of other code here that catches IOException and I don't want to break it.
- // This catch is only here to enhance logging of connection-time issues.
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, ioe.toString());
- }
- throw ioe;
- } finally {
- destroyResponses();
- }
- }
-
- /**
- * Closes the connection and releases all resources. This connection can not be used again
- * until {@link #setStore(ImapStore, String, String)} is called.
- */
- void close() {
- if (mTransport != null) {
- mTransport.close();
- mTransport = null;
- }
- destroyResponses();
- mParser = null;
- mImapStore = null;
- }
-
- /**
- * Returns whether or not the specified capability is supported by the server.
- */
- private boolean isCapable(int capability) {
- return (mCapabilities & capability) != 0;
- }
-
- /**
- * Sets the capability flags according to the response provided by the server.
- * Note: We only set the capability flags that we are interested in. There are many IMAP
- * capabilities that we do not track.
- */
- private void setCapabilities(ImapResponse capabilities) {
- if (capabilities.contains(ImapConstants.ID)) {
- mCapabilities |= CAPABILITY_ID;
- }
- if (capabilities.contains(ImapConstants.NAMESPACE)) {
- mCapabilities |= CAPABILITY_NAMESPACE;
- }
- if (capabilities.contains(ImapConstants.UIDPLUS)) {
- mCapabilities |= CAPABILITY_UIDPLUS;
- }
- if (capabilities.contains(ImapConstants.STARTTLS)) {
- mCapabilities |= CAPABILITY_STARTTLS;
- }
- }
-
- /**
- * Create an {@link ImapResponseParser} from {@code mTransport.getInputStream()} and
- * set it to {@link #mParser}.
- *
- * If we already have an {@link ImapResponseParser}, we
- * {@link #destroyResponses()} and throw it away.
- */
- private void createParser() {
- destroyResponses();
- mParser = new ImapResponseParser(mTransport.getInputStream(), mDiscourse);
- }
-
- void destroyResponses() {
- if (mParser != null) {
- mParser.destroyResponses();
- }
- }
-
- boolean isTransportOpenForTest() {
- return mTransport != null ? mTransport.isOpen() : false;
- }
-
- ImapResponse readResponse() throws IOException, MessagingException {
- return mParser.readResponse();
- }
-
- /**
- * Send a single command to the server. The command will be preceded by an IMAP command
- * tag and followed by \r\n (caller need not supply them).
- *
- * @param command The command to send to the server
- * @param sensitive If true, the command will not be logged
- * @return Returns the command tag that was sent
- */
- String sendCommand(String command, boolean sensitive)
- throws MessagingException, IOException {
- open();
- String tag = Integer.toString(mNextCommandTag.incrementAndGet());
- String commandToSend = tag + " " + command;
- mTransport.writeLine(commandToSend, sensitive ? IMAP_REDACTED_LOG : null);
- mDiscourse.addSentCommand(sensitive ? IMAP_REDACTED_LOG : commandToSend);
- return tag;
- }
-
-
- /**
- * Send a single, complex command to the server. The command will be preceded by an IMAP
- * command tag and followed by \r\n (caller need not supply them). After each piece of the
- * command, a response will be read which MUST be a continuation request.
- *
- * @param commands An array of Strings comprising the command to be sent to the server
- * @return Returns the command tag that was sent
- */
- String sendComplexCommand(List<String> commands, boolean sensitive) throws MessagingException,
- IOException {
- open();
- String tag = Integer.toString(mNextCommandTag.incrementAndGet());
- int len = commands.size();
- for (int i = 0; i < len; i++) {
- String commandToSend = commands.get(i);
- // The first part of the command gets the tag
- if (i == 0) {
- commandToSend = tag + " " + commandToSend;
- } else {
- // Otherwise, read the response from the previous part of the command
- ImapResponse response = readResponse();
- // If it isn't a continuation request, that's an error
- if (!response.isContinuationRequest()) {
- throw new MessagingException("Expected continuation request");
- }
- }
- // Send the command
- mTransport.writeLine(commandToSend, null);
- mDiscourse.addSentCommand(sensitive ? IMAP_REDACTED_LOG : commandToSend);
- }
- return tag;
- }
-
- List<ImapResponse> executeSimpleCommand(String command) throws IOException,
- MessagingException {
- return executeSimpleCommand(command, false);
- }
-
- /**
- * Read and return all of the responses from the most recent command sent to the server
- *
- * @return a list of ImapResponses
- * @throws IOException
- * @throws MessagingException
- */
- List<ImapResponse> getCommandResponses() throws IOException, MessagingException {
- ArrayList<ImapResponse> responses = new ArrayList<ImapResponse>();
- ImapResponse response;
- do {
- response = mParser.readResponse();
- responses.add(response);
- } while (!response.isTagged());
- if (!response.isOk()) {
- final String toString = response.toString();
- final String alert = response.getAlertTextOrEmpty().getString();
- destroyResponses();
- throw new ImapException(toString, alert);
- }
- return responses;
- }
-
- /**
- * Execute a simple command at the server, a simple command being one that is sent in a single
- * line of text
- *
- * @param command the command to send to the server
- * @param sensitive whether the command should be redacted in logs (used for login)
- * @return a list of ImapResponses
- * @throws IOException
- * @throws MessagingException
- */
- List<ImapResponse> executeSimpleCommand(String command, boolean sensitive)
- throws IOException, MessagingException {
- sendCommand(command, sensitive);
- return getCommandResponses();
- }
-
- /**
- * Execute a complex command at the server, a complex command being one that must be sent in
- * multiple lines due to the use of string literals
- *
- * @param commands a list of strings that comprise the command to be sent to the server
- * @param sensitive whether the command should be redacted in logs (used for login)
- * @return a list of ImapResponses
- * @throws IOException
- * @throws MessagingException
- */
- List<ImapResponse> executeComplexCommand(List<String> commands, boolean sensitive)
- throws IOException, MessagingException {
- sendComplexCommand(commands, sensitive);
- return getCommandResponses();
- }
-
- /**
- * Query server for capabilities.
- */
- private ImapResponse queryCapabilities() throws IOException, MessagingException {
- ImapResponse capabilityResponse = null;
- for (ImapResponse r : executeSimpleCommand(ImapConstants.CAPABILITY)) {
- if (r.is(0, ImapConstants.CAPABILITY)) {
- capabilityResponse = r;
- break;
- }
- }
- if (capabilityResponse == null) {
- throw new MessagingException("Invalid CAPABILITY response received");
- }
- return capabilityResponse;
- }
-
- /**
- * Sends client identification information to the IMAP server per RFC 2971. If
- * the server does not support the ID command, this will perform no operation.
- *
- * Interoperability hack: Never send ID to *.secureserver.net, which sends back a
- * malformed response that our parser can't deal with.
- */
- private void doSendId(boolean hasIdCapability, String capabilities)
- throws MessagingException {
- if (!hasIdCapability) return;
-
- // Never send ID to *.secureserver.net
- String host = mTransport.getHost();
- if (host.toLowerCase().endsWith(".secureserver.net")) return;
-
- // Assign user-agent string (for RFC2971 ID command)
- String mUserAgent =
- ImapStore.getImapId(mImapStore.getContext(), mUsername, host, capabilities);
-
- if (mUserAgent != null) {
- mIdPhrase = ImapConstants.ID + " (" + mUserAgent + ")";
- } else if (DEBUG_FORCE_SEND_ID) {
- mIdPhrase = ImapConstants.ID + " " + ImapConstants.NIL;
- }
- // else: mIdPhrase = null, no ID will be emitted
-
- // Send user-agent in an RFC2971 ID command
- if (mIdPhrase != null) {
- try {
- executeSimpleCommand(mIdPhrase);
- } catch (ImapException ie) {
- // Log for debugging, but this is not a fatal problem.
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, ie.toString());
- }
- } catch (IOException ioe) {
- // Special case to handle malformed OK responses and ignore them.
- // A true IOException will recur on the following login steps
- // This can go away after the parser is fixed - see bug 2138981
- }
- }
- }
-
- /**
- * Gets the user's Personal Namespace from the IMAP server per RFC 2342. If the user
- * explicitly sets a namespace (using setup UI) or if the server does not support the
- * namespace command, this will perform no operation.
- */
- private void doGetNamespace(boolean hasNamespaceCapability) throws MessagingException {
- // user did not specify a hard-coded prefix; try to get it from the server
- if (hasNamespaceCapability && !mImapStore.isUserPrefixSet()) {
- List<ImapResponse> responseList = Collections.emptyList();
-
- try {
- responseList = executeSimpleCommand(ImapConstants.NAMESPACE);
- } catch (ImapException ie) {
- // Log for debugging, but this is not a fatal problem.
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, ie.toString());
- }
- } catch (IOException ioe) {
- // Special case to handle malformed OK responses and ignore them.
- }
-
- for (ImapResponse response: responseList) {
- if (response.isDataResponse(0, ImapConstants.NAMESPACE)) {
- ImapList namespaceList = response.getListOrEmpty(1);
- ImapList namespace = namespaceList.getListOrEmpty(0);
- String namespaceString = namespace.getStringOrEmpty(0).getString();
- if (!TextUtils.isEmpty(namespaceString)) {
- mImapStore.setPathPrefix(ImapStore.decodeFolderName(namespaceString, null));
- mImapStore.setPathSeparator(namespace.getStringOrEmpty(1).getString());
- }
- }
- }
- }
- }
-
- /**
- * Logs into the IMAP server
- */
- private void doLogin()
- throws IOException, MessagingException, AuthenticationFailedException {
- try {
- // TODO eventually we need to add additional authentication
- // options such as SASL
- executeSimpleCommand(mLoginPhrase, true);
- } catch (ImapException ie) {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, ie.toString());
- }
- throw new AuthenticationFailedException(ie.getAlertText(), ie);
-
- } catch (MessagingException me) {
- throw new AuthenticationFailedException(null, me);
- }
- }
-
- /**
- * Gets the path separator per the LIST command in RFC 3501. If the path separator
- * was obtained while obtaining the namespace or there is no prefix defined, this
- * will perform no operation.
- */
- private void doGetPathSeparator() throws MessagingException {
- // user did not specify a hard-coded prefix; try to get it from the server
- if (mImapStore.isUserPrefixSet()) {
- List<ImapResponse> responseList = Collections.emptyList();
-
- try {
- responseList = executeSimpleCommand(ImapConstants.LIST + " \"\" \"\"");
- } catch (ImapException ie) {
- // Log for debugging, but this is not a fatal problem.
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, ie.toString());
- }
- } catch (IOException ioe) {
- // Special case to handle malformed OK responses and ignore them.
- }
-
- for (ImapResponse response: responseList) {
- if (response.isDataResponse(0, ImapConstants.LIST)) {
- mImapStore.setPathSeparator(response.getStringOrEmpty(2).getString());
- }
- }
- }
- }
-
- /**
- * Starts a TLS session with the IMAP server per RFC 3501. If the user has not opted
- * to use TLS or the server does not support the TLS capability, this will perform
- * no operation.
- */
- private ImapResponse doStartTls(boolean hasStartTlsCapability)
- throws IOException, MessagingException {
- if (mTransport.canTryTlsSecurity()) {
- if (hasStartTlsCapability) {
- // STARTTLS
- executeSimpleCommand(ImapConstants.STARTTLS);
-
- mTransport.reopenTls();
- mTransport.setSoTimeout(MailTransport.SOCKET_READ_TIMEOUT);
- createParser();
- // Per RFC requirement (3501-6.2.1) gather new capabilities
- return(queryCapabilities());
- } else {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "TLS not supported but required");
- }
- throw new MessagingException(MessagingException.TLS_REQUIRED);
- }
- }
- return null;
- }
-
- /** @see DiscourseLogger#logLastDiscourse() */
- void logLastDiscourse() {
- mDiscourse.logLastDiscourse();
- }
-} \ No newline at end of file
diff --git a/email2/src/com/android/email/mail/store/ImapFolder.java b/email2/src/com/android/email/mail/store/ImapFolder.java
deleted file mode 100644
index ead78d447..000000000
--- a/email2/src/com/android/email/mail/store/ImapFolder.java
+++ /dev/null
@@ -1,1134 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store;
-
-import android.content.Context;
-import android.text.TextUtils;
-import android.util.Base64DataException;
-import android.util.Log;
-
-import com.android.email.mail.store.ImapStore.ImapException;
-import com.android.email.mail.store.ImapStore.ImapMessage;
-import com.android.email.mail.store.imap.ImapConstants;
-import com.android.email.mail.store.imap.ImapElement;
-import com.android.email.mail.store.imap.ImapList;
-import com.android.email.mail.store.imap.ImapResponse;
-import com.android.email.mail.store.imap.ImapString;
-import com.android.email.mail.store.imap.ImapUtility;
-import com.android.email.mail.transport.CountingOutputStream;
-import com.android.email.mail.transport.EOLConvertingOutputStream;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.internet.BinaryTempFileBody;
-import com.android.emailcommon.internet.MimeBodyPart;
-import com.android.emailcommon.internet.MimeHeader;
-import com.android.emailcommon.internet.MimeMultipart;
-import com.android.emailcommon.internet.MimeUtility;
-import com.android.emailcommon.mail.AuthenticationFailedException;
-import com.android.emailcommon.mail.Body;
-import com.android.emailcommon.mail.FetchProfile;
-import com.android.emailcommon.mail.Flag;
-import com.android.emailcommon.mail.Folder;
-import com.android.emailcommon.mail.Message;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.mail.Part;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.service.SearchParams;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-
-class ImapFolder extends Folder {
- private final static Flag[] PERMANENT_FLAGS =
- { Flag.DELETED, Flag.SEEN, Flag.FLAGGED, Flag.ANSWERED };
- private static final int COPY_BUFFER_SIZE = 16*1024;
-
- private final ImapStore mStore;
- private final String mName;
- private int mMessageCount = -1;
- private ImapConnection mConnection;
- private OpenMode mMode;
- private boolean mExists;
- /** The local mailbox associated with this remote folder */
- Mailbox mMailbox;
- /** A set of hashes that can be used to track dirtiness */
- Object mHash[];
-
- /*package*/ ImapFolder(ImapStore store, String name) {
- mStore = store;
- mName = name;
- }
-
- private void destroyResponses() {
- if (mConnection != null) {
- mConnection.destroyResponses();
- }
- }
-
- @Override
- public void open(OpenMode mode)
- throws MessagingException {
- try {
- if (isOpen()) {
- if (mMode == mode) {
- // Make sure the connection is valid.
- // If it's not we'll close it down and continue on to get a new one.
- try {
- mConnection.executeSimpleCommand(ImapConstants.NOOP);
- return;
-
- } catch (IOException ioe) {
- ioExceptionHandler(mConnection, ioe);
- } finally {
- destroyResponses();
- }
- } else {
- // Return the connection to the pool, if exists.
- close(false);
- }
- }
- synchronized (this) {
- mConnection = mStore.getConnection();
- }
- // * FLAGS (\Answered \Flagged \Deleted \Seen \Draft NonJunk
- // $MDNSent)
- // * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft
- // NonJunk $MDNSent \*)] Flags permitted.
- // * 23 EXISTS
- // * 0 RECENT
- // * OK [UIDVALIDITY 1125022061] UIDs valid
- // * OK [UIDNEXT 57576] Predicted next UID
- // 2 OK [READ-WRITE] Select completed.
- try {
- doSelect();
- } catch (IOException ioe) {
- throw ioExceptionHandler(mConnection, ioe);
- } finally {
- destroyResponses();
- }
- } catch (AuthenticationFailedException e) {
- // Don't cache this connection, so we're forced to try connecting/login again
- mConnection = null;
- close(false);
- throw e;
- } catch (MessagingException e) {
- mExists = false;
- close(false);
- throw e;
- }
- }
-
- @Override
- @VisibleForTesting
- public boolean isOpen() {
- return mExists && mConnection != null;
- }
-
- @Override
- public OpenMode getMode() {
- return mMode;
- }
-
- @Override
- public void close(boolean expunge) {
- // TODO implement expunge
- mMessageCount = -1;
- synchronized (this) {
- mStore.poolConnection(mConnection);
- mConnection = null;
- }
- }
-
- @Override
- public String getName() {
- return mName;
- }
-
- @Override
- public boolean exists() throws MessagingException {
- if (mExists) {
- return true;
- }
- /*
- * This method needs to operate in the unselected mode as well as the selected mode
- * so we must get the connection ourselves if it's not there. We are specifically
- * not calling checkOpen() since we don't care if the folder is open.
- */
- ImapConnection connection = null;
- synchronized(this) {
- if (mConnection == null) {
- connection = mStore.getConnection();
- } else {
- connection = mConnection;
- }
- }
- try {
- connection.executeSimpleCommand(String.format(
- ImapConstants.STATUS + " \"%s\" (" + ImapConstants.UIDVALIDITY + ")",
- ImapStore.encodeFolderName(mName, mStore.mPathPrefix)));
- mExists = true;
- return true;
-
- } catch (MessagingException me) {
- // Treat IOERROR messaging exception as IOException
- if (me.getExceptionType() == MessagingException.IOERROR) {
- throw me;
- }
- return false;
-
- } catch (IOException ioe) {
- throw ioExceptionHandler(connection, ioe);
-
- } finally {
- connection.destroyResponses();
- if (mConnection == null) {
- mStore.poolConnection(connection);
- }
- }
- }
-
- // IMAP supports folder creation
- @Override
- public boolean canCreate(FolderType type) {
- return true;
- }
-
- @Override
- public boolean create(FolderType type) throws MessagingException {
- /*
- * This method needs to operate in the unselected mode as well as the selected mode
- * so we must get the connection ourselves if it's not there. We are specifically
- * not calling checkOpen() since we don't care if the folder is open.
- */
- ImapConnection connection = null;
- synchronized(this) {
- if (mConnection == null) {
- connection = mStore.getConnection();
- } else {
- connection = mConnection;
- }
- }
- try {
- connection.executeSimpleCommand(String.format(ImapConstants.CREATE + " \"%s\"",
- ImapStore.encodeFolderName(mName, mStore.mPathPrefix)));
- return true;
-
- } catch (MessagingException me) {
- return false;
-
- } catch (IOException ioe) {
- throw ioExceptionHandler(connection, ioe);
-
- } finally {
- connection.destroyResponses();
- if (mConnection == null) {
- mStore.poolConnection(connection);
- }
- }
- }
-
- @Override
- public void copyMessages(Message[] messages, Folder folder,
- MessageUpdateCallbacks callbacks) throws MessagingException {
- checkOpen();
- try {
- List<ImapResponse> responseList = mConnection.executeSimpleCommand(
- String.format(ImapConstants.UID_COPY + " %s \"%s\"",
- ImapStore.joinMessageUids(messages),
- ImapStore.encodeFolderName(folder.getName(), mStore.mPathPrefix)));
- // Build a message map for faster UID matching
- HashMap<String, Message> messageMap = new HashMap<String, Message>();
- boolean handledUidPlus = false;
- for (Message m : messages) {
- messageMap.put(m.getUid(), m);
- }
- // Process response to get the new UIDs
- for (ImapResponse response : responseList) {
- // All "BAD" responses are bad. Only "NO", tagged responses are bad.
- if (response.isBad() || (response.isNo() && response.isTagged())) {
- String responseText = response.getStatusResponseTextOrEmpty().getString();
- throw new MessagingException(responseText);
- }
- // Skip untagged responses; they're just status
- if (!response.isTagged()) {
- continue;
- }
- // No callback provided to report of UID changes; nothing more to do here
- // NOTE: We check this here to catch any server errors
- if (callbacks == null) {
- continue;
- }
- ImapList copyResponse = response.getListOrEmpty(1);
- String responseCode = copyResponse.getStringOrEmpty(0).getString();
- if (ImapConstants.COPYUID.equals(responseCode)) {
- handledUidPlus = true;
- String origIdSet = copyResponse.getStringOrEmpty(2).getString();
- String newIdSet = copyResponse.getStringOrEmpty(3).getString();
- String[] origIdArray = ImapUtility.getImapSequenceValues(origIdSet);
- String[] newIdArray = ImapUtility.getImapSequenceValues(newIdSet);
- // There has to be a 1:1 mapping between old and new IDs
- if (origIdArray.length != newIdArray.length) {
- throw new MessagingException("Set length mis-match; orig IDs \"" +
- origIdSet + "\" new IDs \"" + newIdSet + "\"");
- }
- for (int i = 0; i < origIdArray.length; i++) {
- final String id = origIdArray[i];
- final Message m = messageMap.get(id);
- if (m != null) {
- callbacks.onMessageUidChange(m, newIdArray[i]);
- }
- }
- }
- }
- // If the server doesn't support UIDPLUS, try a different way to get the new UID(s)
- if (callbacks != null && !handledUidPlus) {
- ImapFolder newFolder = (ImapFolder)folder;
- try {
- // Temporarily select the destination folder
- newFolder.open(OpenMode.READ_WRITE);
- // Do the search(es) ...
- for (Message m : messages) {
- String searchString = "HEADER Message-Id \"" + m.getMessageId() + "\"";
- String[] newIdArray = newFolder.searchForUids(searchString);
- if (newIdArray.length == 1) {
- callbacks.onMessageUidChange(m, newIdArray[0]);
- }
- }
- } catch (MessagingException e) {
- // Log, but, don't abort; failures here don't need to be propagated
- Log.d(Logging.LOG_TAG, "Failed to find message", e);
- } finally {
- newFolder.close(false);
- }
- // Re-select the original folder
- doSelect();
- }
- } catch (IOException ioe) {
- throw ioExceptionHandler(mConnection, ioe);
- } finally {
- destroyResponses();
- }
- }
-
- @Override
- public int getMessageCount() {
- return mMessageCount;
- }
-
- @Override
- public int getUnreadMessageCount() throws MessagingException {
- checkOpen();
- try {
- int unreadMessageCount = 0;
- List<ImapResponse> responses = mConnection.executeSimpleCommand(String.format(
- ImapConstants.STATUS + " \"%s\" (" + ImapConstants.UNSEEN + ")",
- ImapStore.encodeFolderName(mName, mStore.mPathPrefix)));
- // S: * STATUS mboxname (MESSAGES 231 UIDNEXT 44292)
- for (ImapResponse response : responses) {
- if (response.isDataResponse(0, ImapConstants.STATUS)) {
- unreadMessageCount = response.getListOrEmpty(2)
- .getKeyedStringOrEmpty(ImapConstants.UNSEEN).getNumberOrZero();
- }
- }
- return unreadMessageCount;
- } catch (IOException ioe) {
- throw ioExceptionHandler(mConnection, ioe);
- } finally {
- destroyResponses();
- }
- }
-
- @Override
- public void delete(boolean recurse) {
- throw new Error("ImapStore.delete() not yet implemented");
- }
-
- String[] getSearchUids(List<ImapResponse> responses) {
- // S: * SEARCH 2 3 6
- final ArrayList<String> uids = new ArrayList<String>();
- for (ImapResponse response : responses) {
- if (!response.isDataResponse(0, ImapConstants.SEARCH)) {
- continue;
- }
- // Found SEARCH response data
- for (int i = 1; i < response.size(); i++) {
- ImapString s = response.getStringOrEmpty(i);
- if (s.isString()) {
- uids.add(s.getString());
- }
- }
- }
- return uids.toArray(Utility.EMPTY_STRINGS);
- }
-
- @VisibleForTesting
- String[] searchForUids(String searchCriteria) throws MessagingException {
- checkOpen();
- try {
- try {
- String command = ImapConstants.UID_SEARCH + " " + searchCriteria;
- return getSearchUids(mConnection.executeSimpleCommand(command));
- } catch (ImapException e) {
- Log.d(Logging.LOG_TAG, "ImapException in search: " + searchCriteria);
- return Utility.EMPTY_STRINGS; // not found;
- } catch (IOException ioe) {
- throw ioExceptionHandler(mConnection, ioe);
- }
- } finally {
- destroyResponses();
- }
- }
-
- @Override
- @VisibleForTesting
- public Message getMessage(String uid) throws MessagingException {
- checkOpen();
-
- String[] uids = searchForUids(ImapConstants.UID + " " + uid);
- for (int i = 0; i < uids.length; i++) {
- if (uids[i].equals(uid)) {
- return new ImapMessage(uid, this);
- }
- }
- return null;
- }
-
- @VisibleForTesting
- protected static boolean isAsciiString(String str) {
- int len = str.length();
- for (int i = 0; i < len; i++) {
- char c = str.charAt(i);
- if (c >= 128) return false;
- }
- return true;
- }
-
- /**
- * Retrieve messages based on search parameters. We search FROM, TO, CC, SUBJECT, and BODY
- * We send: SEARCH OR FROM "foo" (OR TO "foo" (OR CC "foo" (OR SUBJECT "foo" BODY "foo"))), but
- * with the additional CHARSET argument and sending "foo" as a literal (e.g. {3}<CRLF>foo}
- */
- @Override
- @VisibleForTesting
- public Message[] getMessages(SearchParams params, MessageRetrievalListener listener)
- throws MessagingException {
- List<String> commands = new ArrayList<String>();
- String filter = params.mFilter;
- // All servers MUST accept US-ASCII, so we'll send this as the CHARSET unless we're really
- // dealing with a string that contains non-ascii characters
- String charset = "US-ASCII";
- if (!isAsciiString(filter)) {
- charset = "UTF-8";
- }
- // This is the length of the string in octets (bytes), formatted as a string literal {n}
- String octetLength = "{" + filter.getBytes().length + "}";
- // Break the command up into pieces ending with the string literal length
- commands.add(ImapConstants.UID_SEARCH + " CHARSET " + charset + " OR FROM " + octetLength);
- commands.add(filter + " (OR TO " + octetLength);
- commands.add(filter + " (OR CC " + octetLength);
- commands.add(filter + " (OR SUBJECT " + octetLength);
- commands.add(filter + " BODY " + octetLength);
- commands.add(filter + ")))");
- return getMessagesInternal(complexSearchForUids(commands), listener);
- }
-
- /* package */ String[] complexSearchForUids(List<String> commands) throws MessagingException {
- checkOpen();
- try {
- try {
- return getSearchUids(mConnection.executeComplexCommand(commands, false));
- } catch (ImapException e) {
- return Utility.EMPTY_STRINGS; // not found;
- } catch (IOException ioe) {
- throw ioExceptionHandler(mConnection, ioe);
- }
- } finally {
- destroyResponses();
- }
- }
-
- @Override
- @VisibleForTesting
- public Message[] getMessages(int start, int end, MessageRetrievalListener listener)
- throws MessagingException {
- if (start < 1 || end < 1 || end < start) {
- throw new MessagingException(String.format("Invalid range: %d %d", start, end));
- }
- return getMessagesInternal(
- searchForUids(String.format("%d:%d NOT DELETED", start, end)), listener);
- }
-
- @Override
- @VisibleForTesting
- public Message[] getMessages(String[] uids, MessageRetrievalListener listener)
- throws MessagingException {
- if (uids == null) {
- uids = searchForUids("1:* NOT DELETED");
- }
- return getMessagesInternal(uids, listener);
- }
-
- public Message[] getMessagesInternal(String[] uids, MessageRetrievalListener listener) {
- final ArrayList<Message> messages = new ArrayList<Message>(uids.length);
- for (int i = 0; i < uids.length; i++) {
- final String uid = uids[i];
- final ImapMessage message = new ImapMessage(uid, this);
- messages.add(message);
- if (listener != null) {
- listener.messageRetrieved(message);
- }
- }
- return messages.toArray(Message.EMPTY_ARRAY);
- }
-
- @Override
- public void fetch(Message[] messages, FetchProfile fp, MessageRetrievalListener listener)
- throws MessagingException {
- try {
- fetchInternal(messages, fp, listener);
- } catch (RuntimeException e) { // Probably a parser error.
- Log.w(Logging.LOG_TAG, "Exception detected: " + e.getMessage());
- if (mConnection != null) {
- mConnection.logLastDiscourse();
- }
- throw e;
- }
- }
-
- public void fetchInternal(Message[] messages, FetchProfile fp,
- MessageRetrievalListener listener) throws MessagingException {
- if (messages.length == 0) {
- return;
- }
- checkOpen();
- HashMap<String, Message> messageMap = new HashMap<String, Message>();
- for (Message m : messages) {
- messageMap.put(m.getUid(), m);
- }
-
- /*
- * Figure out what command we are going to run:
- * FLAGS - UID FETCH (FLAGS)
- * ENVELOPE - UID FETCH (INTERNALDATE UID RFC822.SIZE FLAGS BODY.PEEK[
- * HEADER.FIELDS (date subject from content-type to cc)])
- * STRUCTURE - UID FETCH (BODYSTRUCTURE)
- * BODY_SANE - UID FETCH (BODY.PEEK[]<0.N>) where N = max bytes returned
- * BODY - UID FETCH (BODY.PEEK[])
- * Part - UID FETCH (BODY.PEEK[ID]) where ID = mime part ID
- */
-
- final LinkedHashSet<String> fetchFields = new LinkedHashSet<String>();
-
- fetchFields.add(ImapConstants.UID);
- if (fp.contains(FetchProfile.Item.FLAGS)) {
- fetchFields.add(ImapConstants.FLAGS);
- }
- if (fp.contains(FetchProfile.Item.ENVELOPE)) {
- fetchFields.add(ImapConstants.INTERNALDATE);
- fetchFields.add(ImapConstants.RFC822_SIZE);
- fetchFields.add(ImapConstants.FETCH_FIELD_HEADERS);
- }
- if (fp.contains(FetchProfile.Item.STRUCTURE)) {
- fetchFields.add(ImapConstants.BODYSTRUCTURE);
- }
-
- if (fp.contains(FetchProfile.Item.BODY_SANE)) {
- fetchFields.add(ImapConstants.FETCH_FIELD_BODY_PEEK_SANE);
- }
- if (fp.contains(FetchProfile.Item.BODY)) {
- fetchFields.add(ImapConstants.FETCH_FIELD_BODY_PEEK);
- }
-
- final Part fetchPart = fp.getFirstPart();
- if (fetchPart != null) {
- String[] partIds =
- fetchPart.getHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA);
- if (partIds != null) {
- fetchFields.add(ImapConstants.FETCH_FIELD_BODY_PEEK_BARE
- + "[" + partIds[0] + "]");
- }
- }
-
- try {
- mConnection.sendCommand(String.format(
- ImapConstants.UID_FETCH + " %s (%s)", ImapStore.joinMessageUids(messages),
- Utility.combine(fetchFields.toArray(new String[fetchFields.size()]), ' ')
- ), false);
- ImapResponse response;
- int messageNumber = 0;
- do {
- response = null;
- try {
- response = mConnection.readResponse();
-
- if (!response.isDataResponse(1, ImapConstants.FETCH)) {
- continue; // Ignore
- }
- final ImapList fetchList = response.getListOrEmpty(2);
- final String uid = fetchList.getKeyedStringOrEmpty(ImapConstants.UID)
- .getString();
- if (TextUtils.isEmpty(uid)) continue;
-
- ImapMessage message = (ImapMessage) messageMap.get(uid);
- if (message == null) continue;
-
- if (fp.contains(FetchProfile.Item.FLAGS)) {
- final ImapList flags =
- fetchList.getKeyedListOrEmpty(ImapConstants.FLAGS);
- for (int i = 0, count = flags.size(); i < count; i++) {
- final ImapString flag = flags.getStringOrEmpty(i);
- if (flag.is(ImapConstants.FLAG_DELETED)) {
- message.setFlagInternal(Flag.DELETED, true);
- } else if (flag.is(ImapConstants.FLAG_ANSWERED)) {
- message.setFlagInternal(Flag.ANSWERED, true);
- } else if (flag.is(ImapConstants.FLAG_SEEN)) {
- message.setFlagInternal(Flag.SEEN, true);
- } else if (flag.is(ImapConstants.FLAG_FLAGGED)) {
- message.setFlagInternal(Flag.FLAGGED, true);
- }
- }
- }
- if (fp.contains(FetchProfile.Item.ENVELOPE)) {
- final Date internalDate = fetchList.getKeyedStringOrEmpty(
- ImapConstants.INTERNALDATE).getDateOrNull();
- final int size = fetchList.getKeyedStringOrEmpty(
- ImapConstants.RFC822_SIZE).getNumberOrZero();
- final String header = fetchList.getKeyedStringOrEmpty(
- ImapConstants.BODY_BRACKET_HEADER, true).getString();
-
- message.setInternalDate(internalDate);
- message.setSize(size);
- message.parse(Utility.streamFromAsciiString(header));
- }
- if (fp.contains(FetchProfile.Item.STRUCTURE)) {
- ImapList bs = fetchList.getKeyedListOrEmpty(
- ImapConstants.BODYSTRUCTURE);
- if (!bs.isEmpty()) {
- try {
- parseBodyStructure(bs, message, ImapConstants.TEXT);
- } catch (MessagingException e) {
- if (Logging.LOGD) {
- Log.v(Logging.LOG_TAG, "Error handling message", e);
- }
- message.setBody(null);
- }
- }
- }
- if (fp.contains(FetchProfile.Item.BODY)
- || fp.contains(FetchProfile.Item.BODY_SANE)) {
- // Body is keyed by "BODY[]...".
- // Previously used "BODY[..." but this can be confused with "BODY[HEADER..."
- // TODO Should we accept "RFC822" as well??
- ImapString body = fetchList.getKeyedStringOrEmpty("BODY[]", true);
- InputStream bodyStream = body.getAsStream();
- message.parse(bodyStream);
- }
- if (fetchPart != null && fetchPart.getSize() > 0) {
- InputStream bodyStream =
- fetchList.getKeyedStringOrEmpty("BODY[", true).getAsStream();
- String contentTransferEncoding = fetchPart.getHeader(
- MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING)[0];
-
- // TODO Don't create 2 temp files.
- // decodeBody creates BinaryTempFileBody, but we could avoid this
- // if we implement ImapStringBody.
- // (We'll need to share a temp file. Protect it with a ref-count.)
- fetchPart.setBody(decodeBody(bodyStream, contentTransferEncoding,
- fetchPart.getSize(), listener));
- }
-
- if (listener != null) {
- listener.messageRetrieved(message);
- }
- } finally {
- destroyResponses();
- }
- } while (!response.isTagged());
- } catch (IOException ioe) {
- throw ioExceptionHandler(mConnection, ioe);
- }
- }
-
- /**
- * Removes any content transfer encoding from the stream and returns a Body.
- * This code is taken/condensed from MimeUtility.decodeBody
- */
- private Body decodeBody(InputStream in, String contentTransferEncoding, int size,
- MessageRetrievalListener listener) throws IOException {
- // Get a properly wrapped input stream
- in = MimeUtility.getInputStreamForContentTransferEncoding(in, contentTransferEncoding);
- BinaryTempFileBody tempBody = new BinaryTempFileBody();
- OutputStream out = tempBody.getOutputStream();
- try {
- byte[] buffer = new byte[COPY_BUFFER_SIZE];
- int n = 0;
- int count = 0;
- while (-1 != (n = in.read(buffer))) {
- out.write(buffer, 0, n);
- count += n;
- if (listener != null) {
- listener.loadAttachmentProgress(count * 100 / size);
- }
- }
- } catch (Base64DataException bde) {
- String warning = "\n\n" + MailActivityEmail.getMessageDecodeErrorString();
- out.write(warning.getBytes());
- } finally {
- out.close();
- }
- return tempBody;
- }
-
- @Override
- public Flag[] getPermanentFlags() {
- return PERMANENT_FLAGS;
- }
-
- /**
- * Handle any untagged responses that the caller doesn't care to handle themselves.
- * @param responses
- */
- private void handleUntaggedResponses(List<ImapResponse> responses) {
- for (ImapResponse response : responses) {
- handleUntaggedResponse(response);
- }
- }
-
- /**
- * Handle an untagged response that the caller doesn't care to handle themselves.
- * @param response
- */
- private void handleUntaggedResponse(ImapResponse response) {
- if (response.isDataResponse(1, ImapConstants.EXISTS)) {
- mMessageCount = response.getStringOrEmpty(0).getNumberOrZero();
- }
- }
-
- private static void parseBodyStructure(ImapList bs, Part part, String id)
- throws MessagingException {
- if (bs.getElementOrNone(0).isList()) {
- /*
- * This is a multipart/*
- */
- MimeMultipart mp = new MimeMultipart();
- for (int i = 0, count = bs.size(); i < count; i++) {
- ImapElement e = bs.getElementOrNone(i);
- if (e.isList()) {
- /*
- * For each part in the message we're going to add a new BodyPart and parse
- * into it.
- */
- MimeBodyPart bp = new MimeBodyPart();
- if (id.equals(ImapConstants.TEXT)) {
- parseBodyStructure(bs.getListOrEmpty(i), bp, Integer.toString(i + 1));
-
- } else {
- parseBodyStructure(bs.getListOrEmpty(i), bp, id + "." + (i + 1));
- }
- mp.addBodyPart(bp);
-
- } else {
- if (e.isString()) {
- mp.setSubType(bs.getStringOrEmpty(i).getString().toLowerCase());
- }
- break; // Ignore the rest of the list.
- }
- }
- part.setBody(mp);
- } else {
- /*
- * This is a body. We need to add as much information as we can find out about
- * it to the Part.
- */
-
- /*
- body type
- body subtype
- body parameter parenthesized list
- body id
- body description
- body encoding
- body size
- */
-
- final ImapString type = bs.getStringOrEmpty(0);
- final ImapString subType = bs.getStringOrEmpty(1);
- final String mimeType =
- (type.getString() + "/" + subType.getString()).toLowerCase();
-
- final ImapList bodyParams = bs.getListOrEmpty(2);
- final ImapString cid = bs.getStringOrEmpty(3);
- final ImapString encoding = bs.getStringOrEmpty(5);
- final int size = bs.getStringOrEmpty(6).getNumberOrZero();
-
- if (MimeUtility.mimeTypeMatches(mimeType, MimeUtility.MIME_TYPE_RFC822)) {
- // A body type of type MESSAGE and subtype RFC822
- // contains, immediately after the basic fields, the
- // envelope structure, body structure, and size in
- // text lines of the encapsulated message.
- // [MESSAGE, RFC822, [NAME, filename.eml], NIL, NIL, 7BIT, 5974, NIL,
- // [INLINE, [FILENAME*0, Fwd: Xxx..., FILENAME*1, filename.eml]], NIL]
- /*
- * This will be caught by fetch and handled appropriately.
- */
- throw new MessagingException("BODYSTRUCTURE " + MimeUtility.MIME_TYPE_RFC822
- + " not yet supported.");
- }
-
- /*
- * Set the content type with as much information as we know right now.
- */
- final StringBuilder contentType = new StringBuilder(mimeType);
-
- /*
- * If there are body params we might be able to get some more information out
- * of them.
- */
- for (int i = 1, count = bodyParams.size(); i < count; i += 2) {
-
- // TODO We need to convert " into %22, but
- // because MimeUtility.getHeaderParameter doesn't recognize it,
- // we can't fix it for now.
- contentType.append(String.format(";\n %s=\"%s\"",
- bodyParams.getStringOrEmpty(i - 1).getString(),
- bodyParams.getStringOrEmpty(i).getString()));
- }
-
- part.setHeader(MimeHeader.HEADER_CONTENT_TYPE, contentType.toString());
-
- // Extension items
- final ImapList bodyDisposition;
-
- if (type.is(ImapConstants.TEXT) && bs.getElementOrNone(9).isList()) {
- // If media-type is TEXT, 9th element might be: [body-fld-lines] := number
- // So, if it's not a list, use 10th element.
- // (Couldn't find evidence in the RFC if it's ALWAYS 10th element.)
- bodyDisposition = bs.getListOrEmpty(9);
- } else {
- bodyDisposition = bs.getListOrEmpty(8);
- }
-
- final StringBuilder contentDisposition = new StringBuilder();
-
- if (bodyDisposition.size() > 0) {
- final String bodyDisposition0Str =
- bodyDisposition.getStringOrEmpty(0).getString().toLowerCase();
- if (!TextUtils.isEmpty(bodyDisposition0Str)) {
- contentDisposition.append(bodyDisposition0Str);
- }
-
- final ImapList bodyDispositionParams = bodyDisposition.getListOrEmpty(1);
- if (!bodyDispositionParams.isEmpty()) {
- /*
- * If there is body disposition information we can pull some more
- * information about the attachment out.
- */
- for (int i = 1, count = bodyDispositionParams.size(); i < count; i += 2) {
-
- // TODO We need to convert " into %22. See above.
- contentDisposition.append(String.format(";\n %s=\"%s\"",
- bodyDispositionParams.getStringOrEmpty(i - 1)
- .getString().toLowerCase(),
- bodyDispositionParams.getStringOrEmpty(i).getString()));
- }
- }
- }
-
- if ((size > 0)
- && (MimeUtility.getHeaderParameter(contentDisposition.toString(), "size")
- == null)) {
- contentDisposition.append(String.format(";\n size=%d", size));
- }
-
- if (contentDisposition.length() > 0) {
- /*
- * Set the content disposition containing at least the size. Attachment
- * handling code will use this down the road.
- */
- part.setHeader(MimeHeader.HEADER_CONTENT_DISPOSITION,
- contentDisposition.toString());
- }
-
- /*
- * Set the Content-Transfer-Encoding header. Attachment code will use this
- * to parse the body.
- */
- if (!encoding.isEmpty()) {
- part.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING,
- encoding.getString());
- }
-
- /*
- * Set the Content-ID header.
- */
- if (!cid.isEmpty()) {
- part.setHeader(MimeHeader.HEADER_CONTENT_ID, cid.getString());
- }
-
- if (size > 0) {
- if (part instanceof ImapMessage) {
- ((ImapMessage) part).setSize(size);
- } else if (part instanceof MimeBodyPart) {
- ((MimeBodyPart) part).setSize(size);
- } else {
- throw new MessagingException("Unknown part type " + part.toString());
- }
- }
- part.setHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA, id);
- }
-
- }
-
- /**
- * Appends the given messages to the selected folder. This implementation also determines
- * the new UID of the given message on the IMAP server and sets the Message's UID to the
- * new server UID.
- */
- @Override
- public void appendMessages(Message[] messages) throws MessagingException {
- checkOpen();
- try {
- for (Message message : messages) {
- // Create output count
- CountingOutputStream out = new CountingOutputStream();
- EOLConvertingOutputStream eolOut = new EOLConvertingOutputStream(out);
- message.writeTo(eolOut);
- eolOut.flush();
- // Create flag list (most often this will be "\SEEN")
- String flagList = "";
- Flag[] flags = message.getFlags();
- if (flags.length > 0) {
- StringBuilder sb = new StringBuilder();
- for (int i = 0, count = flags.length; i < count; i++) {
- Flag flag = flags[i];
- if (flag == Flag.SEEN) {
- sb.append(" " + ImapConstants.FLAG_SEEN);
- } else if (flag == Flag.FLAGGED) {
- sb.append(" " + ImapConstants.FLAG_FLAGGED);
- }
- }
- if (sb.length() > 0) {
- flagList = sb.substring(1);
- }
- }
-
- mConnection.sendCommand(
- String.format(ImapConstants.APPEND + " \"%s\" (%s) {%d}",
- ImapStore.encodeFolderName(mName, mStore.mPathPrefix),
- flagList,
- out.getCount()), false);
- ImapResponse response;
- do {
- response = mConnection.readResponse();
- if (response.isContinuationRequest()) {
- eolOut = new EOLConvertingOutputStream(
- mConnection.mTransport.getOutputStream());
- message.writeTo(eolOut);
- eolOut.write('\r');
- eolOut.write('\n');
- eolOut.flush();
- } else if (!response.isTagged()) {
- handleUntaggedResponse(response);
- }
- } while (!response.isTagged());
-
- // TODO Why not check the response?
-
- /*
- * Try to recover the UID of the message from an APPENDUID response.
- * e.g. 11 OK [APPENDUID 2 238268] APPEND completed
- */
- final ImapList appendList = response.getListOrEmpty(1);
- if ((appendList.size() >= 3) && appendList.is(0, ImapConstants.APPENDUID)) {
- String serverUid = appendList.getStringOrEmpty(2).getString();
- if (!TextUtils.isEmpty(serverUid)) {
- message.setUid(serverUid);
- continue;
- }
- }
-
- /*
- * Try to find the UID of the message we just appended using the
- * Message-ID header. If there are more than one response, take the
- * last one, as it's most likely the newest (the one we just uploaded).
- */
- String messageId = message.getMessageId();
- if (messageId == null || messageId.length() == 0) {
- continue;
- }
- // Most servers don't care about parenthesis in the search query [and, some
- // fail to work if they are used]
- String[] uids = searchForUids(String.format("HEADER MESSAGE-ID %s", messageId));
- if (uids.length > 0) {
- message.setUid(uids[0]);
- }
- // However, there's at least one server [AOL] that fails to work unless there
- // are parenthesis, so, try this as a last resort
- uids = searchForUids(String.format("(HEADER MESSAGE-ID %s)", messageId));
- if (uids.length > 0) {
- message.setUid(uids[0]);
- }
- }
- } catch (IOException ioe) {
- throw ioExceptionHandler(mConnection, ioe);
- } finally {
- destroyResponses();
- }
- }
-
- @Override
- public Message[] expunge() throws MessagingException {
- checkOpen();
- try {
- handleUntaggedResponses(mConnection.executeSimpleCommand(ImapConstants.EXPUNGE));
- } catch (IOException ioe) {
- throw ioExceptionHandler(mConnection, ioe);
- } finally {
- destroyResponses();
- }
- return null;
- }
-
- @Override
- public void setFlags(Message[] messages, Flag[] flags, boolean value)
- throws MessagingException {
- checkOpen();
-
- String allFlags = "";
- if (flags.length > 0) {
- StringBuilder flagList = new StringBuilder();
- for (int i = 0, count = flags.length; i < count; i++) {
- Flag flag = flags[i];
- if (flag == Flag.SEEN) {
- flagList.append(" " + ImapConstants.FLAG_SEEN);
- } else if (flag == Flag.DELETED) {
- flagList.append(" " + ImapConstants.FLAG_DELETED);
- } else if (flag == Flag.FLAGGED) {
- flagList.append(" " + ImapConstants.FLAG_FLAGGED);
- } else if (flag == Flag.ANSWERED) {
- flagList.append(" " + ImapConstants.FLAG_ANSWERED);
- }
- }
- allFlags = flagList.substring(1);
- }
- try {
- mConnection.executeSimpleCommand(String.format(
- ImapConstants.UID_STORE + " %s %s" + ImapConstants.FLAGS_SILENT + " (%s)",
- ImapStore.joinMessageUids(messages),
- value ? "+" : "-",
- allFlags));
-
- } catch (IOException ioe) {
- throw ioExceptionHandler(mConnection, ioe);
- } finally {
- destroyResponses();
- }
- }
-
- /**
- * Persists this folder. We will always perform the proper database operation (e.g.
- * 'save' or 'update'). As an optimization, if a folder has not been modified, no
- * database operations are performed.
- */
- void save(Context context) {
- final Mailbox mailbox = mMailbox;
- if (!mailbox.isSaved()) {
- mailbox.save(context);
- mHash = mailbox.getHashes();
- } else {
- Object[] hash = mailbox.getHashes();
- if (!Arrays.equals(mHash, hash)) {
- mailbox.update(context, mailbox.toContentValues());
- mHash = hash; // Save updated hash
- }
- }
- }
-
- /**
- * Selects the folder for use. Before performing any operations on this folder, it
- * must be selected.
- */
- private void doSelect() throws IOException, MessagingException {
- List<ImapResponse> responses = mConnection.executeSimpleCommand(
- String.format(ImapConstants.SELECT + " \"%s\"",
- ImapStore.encodeFolderName(mName, mStore.mPathPrefix)));
-
- // Assume the folder is opened read-write; unless we are notified otherwise
- mMode = OpenMode.READ_WRITE;
- int messageCount = -1;
- for (ImapResponse response : responses) {
- if (response.isDataResponse(1, ImapConstants.EXISTS)) {
- messageCount = response.getStringOrEmpty(0).getNumberOrZero();
- } else if (response.isOk()) {
- final ImapString responseCode = response.getResponseCodeOrEmpty();
- if (responseCode.is(ImapConstants.READ_ONLY)) {
- mMode = OpenMode.READ_ONLY;
- } else if (responseCode.is(ImapConstants.READ_WRITE)) {
- mMode = OpenMode.READ_WRITE;
- }
- } else if (response.isTagged()) { // Not OK
- throw new MessagingException("Can't open mailbox: "
- + response.getStatusResponseTextOrEmpty());
- }
- }
- if (messageCount == -1) {
- throw new MessagingException("Did not find message count during select");
- }
- mMessageCount = messageCount;
- mExists = true;
- }
-
- private void checkOpen() throws MessagingException {
- if (!isOpen()) {
- throw new MessagingException("Folder " + mName + " is not open.");
- }
- }
-
- private MessagingException ioExceptionHandler(ImapConnection connection, IOException ioe) {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "IO Exception detected: ", ioe);
- }
- connection.close();
- if (connection == mConnection) {
- mConnection = null; // To prevent close() from returning the connection to the pool.
- close(false);
- }
- return new MessagingException("IO Error", ioe);
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof ImapFolder) {
- return ((ImapFolder)o).mName.equals(mName);
- }
- return super.equals(o);
- }
-
- @Override
- public Message createMessage(String uid) {
- return new ImapMessage(uid, this);
- }
-}
diff --git a/email2/src/com/android/email/mail/store/ImapStore.java b/email2/src/com/android/email/mail/store/ImapStore.java
deleted file mode 100644
index a01105d07..000000000
--- a/email2/src/com/android/email/mail/store/ImapStore.java
+++ /dev/null
@@ -1,637 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store;
-
-import android.content.Context;
-import android.os.Build;
-import android.os.Bundle;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.Base64;
-import android.util.Log;
-
-import com.android.email.LegacyConversions;
-import com.android.email.Preferences;
-import com.android.email.R;
-import com.android.email.VendorPolicyLoader;
-import com.android.email.mail.Store;
-import com.android.email.mail.Transport;
-import com.android.email.mail.store.imap.ImapConstants;
-import com.android.email.mail.store.imap.ImapResponse;
-import com.android.email.mail.store.imap.ImapString;
-import com.android.email.mail.transport.MailTransport;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.internet.MimeMessage;
-import com.android.emailcommon.mail.AuthenticationFailedException;
-import com.android.emailcommon.mail.Flag;
-import com.android.emailcommon.mail.Folder;
-import com.android.emailcommon.mail.Message;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.service.EmailServiceProxy;
-import com.android.emailcommon.utility.Utility;
-import com.beetstra.jutf7.CharsetProvider;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.regex.Pattern;
-
-
-/**
- * <pre>
- * TODO Need to start keeping track of UIDVALIDITY
- * TODO Need a default response handler for things like folder updates
- * TODO In fetch(), if we need a ImapMessage and were given
- * something else we can try to do a pre-fetch first.
- * TODO Collect ALERT messages and show them to users.
- *
- * ftp://ftp.isi.edu/in-notes/rfc2683.txt When a client asks for
- * certain information in a FETCH command, the server may return the requested
- * information in any order, not necessarily in the order that it was requested.
- * Further, the server may return the information in separate FETCH responses
- * and may also return information that was not explicitly requested (to reflect
- * to the client changes in the state of the subject message).
- * </pre>
- */
-public class ImapStore extends Store {
- /** Charset used for converting folder names to and from UTF-7 as defined by RFC 3501. */
- private static final Charset MODIFIED_UTF_7_CHARSET =
- new CharsetProvider().charsetForName("X-RFC-3501");
-
- @VisibleForTesting static String sImapId = null;
- @VisibleForTesting String mPathPrefix;
- @VisibleForTesting String mPathSeparator;
-
- private final ConcurrentLinkedQueue<ImapConnection> mConnectionPool =
- new ConcurrentLinkedQueue<ImapConnection>();
-
- /**
- * Static named constructor.
- */
- public static Store newInstance(Account account, Context context) throws MessagingException {
- return new ImapStore(context, account);
- }
-
- /**
- * Creates a new store for the given account. Always use
- * {@link #newInstance(Account, Context)} to create an IMAP store.
- */
- private ImapStore(Context context, Account account) throws MessagingException {
- mContext = context;
- mAccount = account;
-
- HostAuth recvAuth = account.getOrCreateHostAuthRecv(context);
- if (recvAuth == null || !HostAuth.LEGACY_SCHEME_IMAP.equalsIgnoreCase(recvAuth.mProtocol)) {
- throw new MessagingException("Unsupported protocol");
- }
- // defaults, which can be changed by security modifiers
- int connectionSecurity = Transport.CONNECTION_SECURITY_NONE;
- int defaultPort = 143;
-
- // check for security flags and apply changes
- if ((recvAuth.mFlags & HostAuth.FLAG_SSL) != 0) {
- connectionSecurity = Transport.CONNECTION_SECURITY_SSL;
- defaultPort = 993;
- } else if ((recvAuth.mFlags & HostAuth.FLAG_TLS) != 0) {
- connectionSecurity = Transport.CONNECTION_SECURITY_TLS;
- }
- boolean trustCertificates = ((recvAuth.mFlags & HostAuth.FLAG_TRUST_ALL) != 0);
- int port = defaultPort;
- if (recvAuth.mPort != HostAuth.PORT_UNKNOWN) {
- port = recvAuth.mPort;
- }
- mTransport = new MailTransport("IMAP");
- mTransport.setHost(recvAuth.mAddress);
- mTransport.setPort(port);
- mTransport.setSecurity(connectionSecurity, trustCertificates);
-
- String[] userInfo = recvAuth.getLogin();
- if (userInfo != null) {
- mUsername = userInfo[0];
- mPassword = userInfo[1];
- } else {
- mUsername = null;
- mPassword = null;
- }
- mPathPrefix = recvAuth.mDomain;
- }
-
- @VisibleForTesting
- Collection<ImapConnection> getConnectionPoolForTest() {
- return mConnectionPool;
- }
-
- /**
- * For testing only. Injects a different root transport (it will be copied using
- * newInstanceWithConfiguration() each time IMAP sets up a new channel). The transport
- * should already be set up and ready to use. Do not use for real code.
- * @param testTransport The Transport to inject and use for all future communication.
- */
- @VisibleForTesting
- void setTransportForTest(Transport testTransport) {
- mTransport = testTransport;
- }
-
- /**
- * Return, or create and return, an string suitable for use in an IMAP ID message.
- * This is constructed similarly to the way the browser sets up its user-agent strings.
- * See RFC 2971 for more details. The output of this command will be a series of key-value
- * pairs delimited by spaces (there is no point in returning a structured result because
- * this will be sent as-is to the IMAP server). No tokens, parenthesis or "ID" are included,
- * because some connections may append additional values.
- *
- * The following IMAP ID keys may be included:
- * name Android package name of the program
- * os "android"
- * os-version "version; model; build-id"
- * vendor Vendor of the client/server
- * x-android-device-model Model (only revealed if release build)
- * x-android-net-operator Mobile network operator (if known)
- * AGUID A device+account UID
- *
- * In addition, a vendor policy .apk can append key/value pairs.
- *
- * @param userName the username of the account
- * @param host the host (server) of the account
- * @param capabilities a list of the capabilities from the server
- * @return a String for use in an IMAP ID message.
- */
- @VisibleForTesting
- static String getImapId(Context context, String userName, String host, String capabilities) {
- // The first section is global to all IMAP connections, and generates the fixed
- // values in any IMAP ID message
- synchronized (ImapStore.class) {
- if (sImapId == null) {
- TelephonyManager tm =
- (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
- String networkOperator = tm.getNetworkOperatorName();
- if (networkOperator == null) networkOperator = "";
-
- sImapId = makeCommonImapId(context.getPackageName(), Build.VERSION.RELEASE,
- Build.VERSION.CODENAME, Build.MODEL, Build.ID, Build.MANUFACTURER,
- networkOperator);
- }
- }
-
- // This section is per Store, and adds in a dynamic elements like UID's.
- // We don't cache the result of this work, because the caller does anyway.
- StringBuilder id = new StringBuilder(sImapId);
-
- // Optionally add any vendor-supplied id keys
- String vendorId = VendorPolicyLoader.getInstance(context).getImapIdValues(userName, host,
- capabilities);
- if (vendorId != null) {
- id.append(' ');
- id.append(vendorId);
- }
-
- // Generate a UID that mixes a "stable" device UID with the email address
- try {
- String devUID = Preferences.getPreferences(context).getDeviceUID();
- MessageDigest messageDigest;
- messageDigest = MessageDigest.getInstance("SHA-1");
- messageDigest.update(userName.getBytes());
- messageDigest.update(devUID.getBytes());
- byte[] uid = messageDigest.digest();
- String hexUid = Base64.encodeToString(uid, Base64.NO_WRAP);
- id.append(" \"AGUID\" \"");
- id.append(hexUid);
- id.append('\"');
- } catch (NoSuchAlgorithmException e) {
- Log.d(Logging.LOG_TAG, "couldn't obtain SHA-1 hash for device UID");
- }
- return id.toString();
- }
-
- /**
- * Helper function that actually builds the static part of the IMAP ID string. This is
- * separated from getImapId for testability. There is no escaping or encoding in IMAP ID so
- * any rogue chars must be filtered here.
- *
- * @param packageName context.getPackageName()
- * @param version Build.VERSION.RELEASE
- * @param codeName Build.VERSION.CODENAME
- * @param model Build.MODEL
- * @param id Build.ID
- * @param vendor Build.MANUFACTURER
- * @param networkOperator TelephonyManager.getNetworkOperatorName()
- * @return the static (never changes) portion of the IMAP ID
- */
- @VisibleForTesting
- static String makeCommonImapId(String packageName, String version,
- String codeName, String model, String id, String vendor, String networkOperator) {
-
- // Before building up IMAP ID string, pre-filter the input strings for "legal" chars
- // This is using a fairly arbitrary char set intended to pass through most reasonable
- // version, model, and vendor strings: a-z A-Z 0-9 - _ + = ; : . , / <space>
- // The most important thing is *not* to pass parens, quotes, or CRLF, which would break
- // the format of the IMAP ID list.
- Pattern p = Pattern.compile("[^a-zA-Z0-9-_\\+=;:\\.,/ ]");
- packageName = p.matcher(packageName).replaceAll("");
- version = p.matcher(version).replaceAll("");
- codeName = p.matcher(codeName).replaceAll("");
- model = p.matcher(model).replaceAll("");
- id = p.matcher(id).replaceAll("");
- vendor = p.matcher(vendor).replaceAll("");
- networkOperator = p.matcher(networkOperator).replaceAll("");
-
- // "name" "com.android.email"
- StringBuffer sb = new StringBuffer("\"name\" \"");
- sb.append(packageName);
- sb.append("\"");
-
- // "os" "android"
- sb.append(" \"os\" \"android\"");
-
- // "os-version" "version; build-id"
- sb.append(" \"os-version\" \"");
- if (version.length() > 0) {
- sb.append(version);
- } else {
- // default to "1.0"
- sb.append("1.0");
- }
- // add the build ID or build #
- if (id.length() > 0) {
- sb.append("; ");
- sb.append(id);
- }
- sb.append("\"");
-
- // "vendor" "the vendor"
- if (vendor.length() > 0) {
- sb.append(" \"vendor\" \"");
- sb.append(vendor);
- sb.append("\"");
- }
-
- // "x-android-device-model" the device model (on release builds only)
- if ("REL".equals(codeName)) {
- if (model.length() > 0) {
- sb.append(" \"x-android-device-model\" \"");
- sb.append(model);
- sb.append("\"");
- }
- }
-
- // "x-android-mobile-net-operator" "name of network operator"
- if (networkOperator.length() > 0) {
- sb.append(" \"x-android-mobile-net-operator\" \"");
- sb.append(networkOperator);
- sb.append("\"");
- }
-
- return sb.toString();
- }
-
-
- @Override
- public Folder getFolder(String name) {
- return new ImapFolder(this, name);
- }
-
- /**
- * Creates a mailbox hierarchy out of the flat data provided by the server.
- */
- @VisibleForTesting
- static void createHierarchy(HashMap<String, ImapFolder> mailboxes) {
- Set<String> pathnames = mailboxes.keySet();
- for (String path : pathnames) {
- final ImapFolder folder = mailboxes.get(path);
- final Mailbox mailbox = folder.mMailbox;
- int delimiterIdx = mailbox.mServerId.lastIndexOf(mailbox.mDelimiter);
- long parentKey = Mailbox.NO_MAILBOX;
- if (delimiterIdx != -1) {
- String parentPath = path.substring(0, delimiterIdx);
- final ImapFolder parentFolder = mailboxes.get(parentPath);
- final Mailbox parentMailbox = (parentFolder == null) ? null : parentFolder.mMailbox;
- if (parentMailbox != null) {
- parentKey = parentMailbox.mId;
- parentMailbox.mFlags
- |= (Mailbox.FLAG_HAS_CHILDREN | Mailbox.FLAG_CHILDREN_VISIBLE);
- }
- }
- mailbox.mParentKey = parentKey;
- }
- }
-
- /**
- * Creates a {@link Folder} and associated {@link Mailbox}. If the folder does not already
- * exist in the local database, a new row will immediately be created in the mailbox table.
- * Otherwise, the existing row will be used. Any changes to existing rows, will not be stored
- * to the database immediately.
- * @param accountId The ID of the account the mailbox is to be associated with
- * @param mailboxPath The path of the mailbox to add
- * @param delimiter A path delimiter. May be {@code null} if there is no delimiter.
- * @param selectable If {@code true}, the mailbox can be selected and used to store messages.
- */
- private ImapFolder addMailbox(Context context, long accountId, String mailboxPath,
- char delimiter, boolean selectable) {
- ImapFolder folder = (ImapFolder) getFolder(mailboxPath);
- Mailbox mailbox = Mailbox.getMailboxForPath(context, accountId, mailboxPath);
- if (mailbox.isSaved()) {
- // existing mailbox
- // mailbox retrieved from database; save hash _before_ updating fields
- folder.mHash = mailbox.getHashes();
- }
- updateMailbox(mailbox, accountId, mailboxPath, delimiter, selectable,
- LegacyConversions.inferMailboxTypeFromName(context, mailboxPath));
- if (folder.mHash == null) {
- // new mailbox
- // save hash after updating. allows tracking changes if the mailbox is saved
- // outside of #saveMailboxList()
- folder.mHash = mailbox.getHashes();
- // We must save this here to make sure we have a valid ID for later
- mailbox.save(mContext);
- }
- folder.mMailbox = mailbox;
- return folder;
- }
-
- /**
- * Persists the folders in the given list.
- */
- private static void saveMailboxList(Context context, HashMap<String, ImapFolder> folderMap) {
- for (ImapFolder imapFolder : folderMap.values()) {
- imapFolder.save(context);
- }
- }
-
- @Override
- public Folder[] updateFolders() throws MessagingException {
- ImapConnection connection = getConnection();
- try {
- HashMap<String, ImapFolder> mailboxes = new HashMap<String, ImapFolder>();
- // Establish a connection to the IMAP server; if necessary
- // This ensures a valid prefix if the prefix is automatically set by the server
- connection.executeSimpleCommand(ImapConstants.NOOP);
- String imapCommand = ImapConstants.LIST + " \"\" \"*\"";
- if (mPathPrefix != null) {
- imapCommand = ImapConstants.LIST + " \"\" \"" + mPathPrefix + "*\"";
- }
- List<ImapResponse> responses = connection.executeSimpleCommand(imapCommand);
- for (ImapResponse response : responses) {
- // S: * LIST (\Noselect) "/" ~/Mail/foo
- if (response.isDataResponse(0, ImapConstants.LIST)) {
- // Get folder name.
- ImapString encodedFolder = response.getStringOrEmpty(3);
- if (encodedFolder.isEmpty()) continue;
-
- String folderName = decodeFolderName(encodedFolder.getString(), mPathPrefix);
- if (ImapConstants.INBOX.equalsIgnoreCase(folderName)) continue;
-
- // Parse attributes.
- boolean selectable =
- !response.getListOrEmpty(1).contains(ImapConstants.FLAG_NO_SELECT);
- String delimiter = response.getStringOrEmpty(2).getString();
- char delimiterChar = '\0';
- if (!TextUtils.isEmpty(delimiter)) {
- delimiterChar = delimiter.charAt(0);
- }
- ImapFolder folder =
- addMailbox(mContext, mAccount.mId, folderName, delimiterChar, selectable);
- mailboxes.put(folderName, folder);
- }
- }
- String inboxName = mContext.getString(R.string.mailbox_name_display_inbox);
- Folder newFolder =
- addMailbox(mContext, mAccount.mId, inboxName, '\0', true /*selectable*/);
- mailboxes.put(ImapConstants.INBOX, (ImapFolder)newFolder);
- createHierarchy(mailboxes);
- saveMailboxList(mContext, mailboxes);
- return mailboxes.values().toArray(new Folder[] {});
- } catch (IOException ioe) {
- connection.close();
- throw new MessagingException("Unable to get folder list.", ioe);
- } catch (AuthenticationFailedException afe) {
- // We do NOT want this connection pooled, or we will continue to send NOOP and SELECT
- // commands to the server
- connection.destroyResponses();
- connection = null;
- throw afe;
- } finally {
- if (connection != null) {
- poolConnection(connection);
- }
- }
- }
-
- @Override
- public Bundle checkSettings() throws MessagingException {
- int result = MessagingException.NO_ERROR;
- Bundle bundle = new Bundle();
- ImapConnection connection = new ImapConnection(this, mUsername, mPassword);
- try {
- connection.open();
- connection.close();
- } catch (IOException ioe) {
- bundle.putString(EmailServiceProxy.VALIDATE_BUNDLE_ERROR_MESSAGE, ioe.getMessage());
- result = MessagingException.IOERROR;
- } finally {
- connection.destroyResponses();
- }
- bundle.putInt(EmailServiceProxy.VALIDATE_BUNDLE_RESULT_CODE, result);
- return bundle;
- }
-
- /**
- * Returns whether or not the prefix has been set by the user. This can be determined by
- * the fact that the prefix is set, but, the path separator is not set.
- */
- boolean isUserPrefixSet() {
- return TextUtils.isEmpty(mPathSeparator) && !TextUtils.isEmpty(mPathPrefix);
- }
-
- /** Sets the path separator */
- void setPathSeparator(String pathSeparator) {
- mPathSeparator = pathSeparator;
- }
-
- /** Sets the prefix */
- void setPathPrefix(String pathPrefix) {
- mPathPrefix = pathPrefix;
- }
-
- /** Gets the context for this store */
- Context getContext() {
- return mContext;
- }
-
- /** Returns a clone of the transport associated with this store. */
- Transport cloneTransport() {
- return mTransport.clone();
- }
-
- /**
- * Fixes the path prefix, if necessary. The path prefix must always end with the
- * path separator.
- */
- void ensurePrefixIsValid() {
- // Make sure the path prefix ends with the path separator
- if (!TextUtils.isEmpty(mPathPrefix) && !TextUtils.isEmpty(mPathSeparator)) {
- if (!mPathPrefix.endsWith(mPathSeparator)) {
- mPathPrefix = mPathPrefix + mPathSeparator;
- }
- }
- }
-
- /**
- * Gets a connection if one is available from the pool, or creates a new one if not.
- */
- ImapConnection getConnection() {
- ImapConnection connection = null;
- while ((connection = mConnectionPool.poll()) != null) {
- try {
- connection.setStore(this, mUsername, mPassword);
- connection.executeSimpleCommand(ImapConstants.NOOP);
- break;
- } catch (MessagingException e) {
- // Fall through
- } catch (IOException e) {
- // Fall through
- }
- connection.close();
- connection = null;
- }
- if (connection == null) {
- connection = new ImapConnection(this, mUsername, mPassword);
- }
- return connection;
- }
-
- /**
- * Save a {@link ImapConnection} in the pool for reuse. Any responses associated with the
- * connection are destroyed before adding the connection to the pool.
- */
- void poolConnection(ImapConnection connection) {
- if (connection != null) {
- connection.destroyResponses();
- mConnectionPool.add(connection);
- }
- }
-
- /**
- * Prepends the folder name with the given prefix and UTF-7 encodes it.
- */
- static String encodeFolderName(String name, String prefix) {
- // do NOT add the prefix to the special name "INBOX"
- if (ImapConstants.INBOX.equalsIgnoreCase(name)) return name;
-
- // Prepend prefix
- if (prefix != null) {
- name = prefix + name;
- }
-
- // TODO bypass the conversion if name doesn't have special char.
- ByteBuffer bb = MODIFIED_UTF_7_CHARSET.encode(name);
- byte[] b = new byte[bb.limit()];
- bb.get(b);
-
- return Utility.fromAscii(b);
- }
-
- /**
- * UTF-7 decodes the folder name and removes the given path prefix.
- */
- static String decodeFolderName(String name, String prefix) {
- // TODO bypass the conversion if name doesn't have special char.
- String folder;
- folder = MODIFIED_UTF_7_CHARSET.decode(ByteBuffer.wrap(Utility.toAscii(name))).toString();
- if ((prefix != null) && folder.startsWith(prefix)) {
- folder = folder.substring(prefix.length());
- }
- return folder;
- }
-
- /**
- * Returns UIDs of Messages joined with "," as the separator.
- */
- static String joinMessageUids(Message[] messages) {
- StringBuilder sb = new StringBuilder();
- boolean notFirst = false;
- for (Message m : messages) {
- if (notFirst) {
- sb.append(',');
- }
- sb.append(m.getUid());
- notFirst = true;
- }
- return sb.toString();
- }
-
- static class ImapMessage extends MimeMessage {
- ImapMessage(String uid, ImapFolder folder) {
- mUid = uid;
- mFolder = folder;
- }
-
- public void setSize(int size) {
- mSize = size;
- }
-
- @Override
- public void parse(InputStream in) throws IOException, MessagingException {
- super.parse(in);
- }
-
- public void setFlagInternal(Flag flag, boolean set) throws MessagingException {
- super.setFlag(flag, set);
- }
-
- @Override
- public void setFlag(Flag flag, boolean set) throws MessagingException {
- super.setFlag(flag, set);
- mFolder.setFlags(new Message[] { this }, new Flag[] { flag }, set);
- }
- }
-
- static class ImapException extends MessagingException {
- private static final long serialVersionUID = 1L;
-
- String mAlertText;
-
- public ImapException(String message, String alertText, Throwable throwable) {
- super(message, throwable);
- mAlertText = alertText;
- }
-
- public ImapException(String message, String alertText) {
- super(message);
- mAlertText = alertText;
- }
-
- public String getAlertText() {
- return mAlertText;
- }
-
- public void setAlertText(String alertText) {
- mAlertText = alertText;
- }
- }
-}
diff --git a/email2/src/com/android/email/mail/store/Pop3Store.java b/email2/src/com/android/email/mail/store/Pop3Store.java
deleted file mode 100644
index f78d19762..000000000
--- a/email2/src/com/android/email/mail/store/Pop3Store.java
+++ /dev/null
@@ -1,1082 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.util.Log;
-
-import com.android.email.R;
-import com.android.email.mail.Store;
-import com.android.email.mail.Transport;
-import com.android.email.mail.transport.MailTransport;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.internet.MimeMessage;
-import com.android.emailcommon.mail.AuthenticationFailedException;
-import com.android.emailcommon.mail.FetchProfile;
-import com.android.emailcommon.mail.Flag;
-import com.android.emailcommon.mail.Folder;
-import com.android.emailcommon.mail.Folder.OpenMode;
-import com.android.emailcommon.mail.Message;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.service.EmailServiceProxy;
-import com.android.emailcommon.service.SearchParams;
-import com.android.emailcommon.utility.LoggingInputStream;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-
-public class Pop3Store extends Store {
- // All flags defining debug or development code settings must be FALSE
- // when code is checked in or released.
- private static boolean DEBUG_FORCE_SINGLE_LINE_UIDL = false;
- private static boolean DEBUG_LOG_RAW_STREAM = false;
-
- private static final Flag[] PERMANENT_FLAGS = { Flag.DELETED };
- /** The name of the only mailbox available to POP3 accounts */
- private static final String POP3_MAILBOX_NAME = "INBOX";
- private final HashMap<String, Folder> mFolders = new HashMap<String, Folder>();
-
-// /**
-// * Detected latency, used for usage scaling.
-// * Usage scaling occurs when it is necessary to get information about
-// * messages that could result in large data loads. This value allows
-// * the code that loads this data to decide between using large downloads
-// * (high latency) or multiple round trips (low latency) to accomplish
-// * the same thing.
-// * Default is Integer.MAX_VALUE implying massive latency so that the large
-// * download method is used by default until latency data is collected.
-// */
-// private int mLatencyMs = Integer.MAX_VALUE;
-//
-// /**
-// * Detected throughput, used for usage scaling.
-// * Usage scaling occurs when it is necessary to get information about
-// * messages that could result in large data loads. This value allows
-// * the code that loads this data to decide between using large downloads
-// * (high latency) or multiple round trips (low latency) to accomplish
-// * the same thing.
-// * Default is Integer.MAX_VALUE implying massive bandwidth so that the
-// * large download method is used by default until latency data is
-// * collected.
-// */
-// private int mThroughputKbS = Integer.MAX_VALUE;
-
- /**
- * Static named constructor.
- */
- public static Store newInstance(Account account, Context context) throws MessagingException {
- return new Pop3Store(context, account);
- }
-
- /**
- * Creates a new store for the given account.
- */
- private Pop3Store(Context context, Account account) throws MessagingException {
- mContext = context;
- mAccount = account;
-
- HostAuth recvAuth = account.getOrCreateHostAuthRecv(context);
- if (recvAuth == null || !HostAuth.LEGACY_SCHEME_POP3.equalsIgnoreCase(recvAuth.mProtocol)) {
- throw new MessagingException("Unsupported protocol");
- }
- // defaults, which can be changed by security modifiers
- int connectionSecurity = Transport.CONNECTION_SECURITY_NONE;
- int defaultPort = 110;
-
- // check for security flags and apply changes
- if ((recvAuth.mFlags & HostAuth.FLAG_SSL) != 0) {
- connectionSecurity = Transport.CONNECTION_SECURITY_SSL;
- defaultPort = 995;
- } else if ((recvAuth.mFlags & HostAuth.FLAG_TLS) != 0) {
- connectionSecurity = Transport.CONNECTION_SECURITY_TLS;
- }
- boolean trustCertificates = ((recvAuth.mFlags & HostAuth.FLAG_TRUST_ALL) != 0);
-
- int port = defaultPort;
- if (recvAuth.mPort != HostAuth.PORT_UNKNOWN) {
- port = recvAuth.mPort;
- }
- mTransport = new MailTransport("POP3");
- mTransport.setHost(recvAuth.mAddress);
- mTransport.setPort(port);
- mTransport.setSecurity(connectionSecurity, trustCertificates);
-
- String[] userInfoParts = recvAuth.getLogin();
- if (userInfoParts != null) {
- mUsername = userInfoParts[0];
- mPassword = userInfoParts[1];
- }
- }
-
- /**
- * For testing only. Injects a different transport. The transport should already be set
- * up and ready to use. Do not use for real code.
- * @param testTransport The Transport to inject and use for all future communication.
- */
- /* package */ void setTransport(Transport testTransport) {
- mTransport = testTransport;
- }
-
- @Override
- public Folder getFolder(String name) {
- Folder folder = mFolders.get(name);
- if (folder == null) {
- folder = new Pop3Folder(name);
- mFolders.put(folder.getName(), folder);
- }
- return folder;
- }
-
- private final int[] DEFAULT_FOLDERS = {
- Mailbox.TYPE_DRAFTS,
- Mailbox.TYPE_OUTBOX,
- Mailbox.TYPE_SENT,
- Mailbox.TYPE_TRASH
- };
-
- @Override
- public Folder[] updateFolders() {
- String inboxName = mContext.getString(R.string.mailbox_name_display_inbox);
- Mailbox mailbox = Mailbox.getMailboxForPath(mContext, mAccount.mId, inboxName);
- updateMailbox(mailbox, mAccount.mId, inboxName, '\0', true, Mailbox.TYPE_INBOX);
- // Force the parent key to be "no mailbox" for the mail POP3 mailbox
- mailbox.mParentKey = Mailbox.NO_MAILBOX;
- if (mailbox.isSaved()) {
- mailbox.update(mContext, mailbox.toContentValues());
- } else {
- mailbox.save(mContext);
- }
-
- // Build default mailboxes as well, in case they're not already made.
- for (int type : DEFAULT_FOLDERS) {
- if (Mailbox.findMailboxOfType(mContext, mAccount.mId, type) == Mailbox.NO_MAILBOX) {
- String name = getMailboxServerName(mContext, type);
- Mailbox.newSystemMailbox(mAccount.mId, type, name).save(mContext);
- }
- }
-
- return new Folder[] { getFolder(inboxName) };
- }
-
-
- /**
- * Returns the server-side name for a specific mailbox.
- *
- * @return the resource string corresponding to the mailbox type, empty if not found.
- */
- public String getMailboxServerName(Context context, int mailboxType) {
- int resId = -1;
- switch (mailboxType) {
- case Mailbox.TYPE_INBOX:
- resId = R.string.mailbox_name_server_inbox;
- break;
- case Mailbox.TYPE_OUTBOX:
- resId = R.string.mailbox_name_server_outbox;
- break;
- case Mailbox.TYPE_DRAFTS:
- resId = R.string.mailbox_name_server_drafts;
- break;
- case Mailbox.TYPE_TRASH:
- resId = R.string.mailbox_name_server_trash;
- break;
- case Mailbox.TYPE_SENT:
- resId = R.string.mailbox_name_server_sent;
- break;
- case Mailbox.TYPE_JUNK:
- resId = R.string.mailbox_name_server_junk;
- break;
- }
- return resId != -1 ? context.getString(resId) : "";
- }
-
- /**
- * Used by account setup to test if an account's settings are appropriate. The definition
- * of "checked" here is simply, can you log into the account and does it meet some minimum set
- * of feature requirements?
- *
- * @throws MessagingException if there was some problem with the account
- */
- @Override
- public Bundle checkSettings() throws MessagingException {
- Pop3Folder folder = new Pop3Folder(POP3_MAILBOX_NAME);
- Bundle bundle = null;
- // Close any open or half-open connections - checkSettings should always be "fresh"
- if (mTransport.isOpen()) {
- folder.close(false);
- }
- try {
- folder.open(OpenMode.READ_WRITE);
- bundle = folder.checkSettings();
- } finally {
- folder.close(false); // false == don't expunge anything
- }
- return bundle;
- }
-
- class Pop3Folder extends Folder {
- private final HashMap<String, Pop3Message> mUidToMsgMap
- = new HashMap<String, Pop3Message>();
- private final HashMap<Integer, Pop3Message> mMsgNumToMsgMap
- = new HashMap<Integer, Pop3Message>();
- private final HashMap<String, Integer> mUidToMsgNumMap = new HashMap<String, Integer>();
- private final String mName;
- private int mMessageCount;
- private Pop3Capabilities mCapabilities;
-
- public Pop3Folder(String name) {
- if (name.equalsIgnoreCase(POP3_MAILBOX_NAME)) {
- mName = POP3_MAILBOX_NAME;
- } else {
- mName = name;
- }
- }
-
- /**
- * Used by account setup to test if an account's settings are appropriate. Here, we run
- * an additional test to see if UIDL is supported on the server. If it's not we
- * can't service this account.
- *
- * @return Bundle containing validation data (code and, if appropriate, error message)
- * @throws MessagingException if the account is not going to be useable
- */
- public Bundle checkSettings() throws MessagingException {
- Bundle bundle = new Bundle();
- int result = MessagingException.NO_ERROR;
- if (!mCapabilities.uidl) {
- try {
- UidlParser parser = new UidlParser();
- executeSimpleCommand("UIDL");
- // drain the entire output, so additional communications don't get confused.
- String response;
- while ((response = mTransport.readLine()) != null) {
- parser.parseMultiLine(response);
- if (parser.mEndOfMessage) {
- break;
- }
- }
- } catch (IOException ioe) {
- mTransport.close();
- result = MessagingException.IOERROR;
- bundle.putString(EmailServiceProxy.VALIDATE_BUNDLE_ERROR_MESSAGE,
- ioe.getMessage());
- }
- }
- bundle.putInt(EmailServiceProxy.VALIDATE_BUNDLE_RESULT_CODE, result);
- return bundle;
- }
-
- @Override
- public synchronized void open(OpenMode mode) throws MessagingException {
- if (mTransport.isOpen()) {
- return;
- }
-
- if (!mName.equalsIgnoreCase(POP3_MAILBOX_NAME)) {
- throw new MessagingException("Folder does not exist");
- }
-
- try {
- mTransport.open();
-
- // Eat the banner
- executeSimpleCommand(null);
-
- mCapabilities = getCapabilities();
-
- if (mTransport.canTryTlsSecurity()) {
- if (mCapabilities.stls) {
- executeSimpleCommand("STLS");
- mTransport.reopenTls();
- } else {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "TLS not supported but required");
- }
- throw new MessagingException(MessagingException.TLS_REQUIRED);
- }
- }
-
- try {
- executeSensitiveCommand("USER " + mUsername, "USER /redacted/");
- executeSensitiveCommand("PASS " + mPassword, "PASS /redacted/");
- } catch (MessagingException me) {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, me.toString());
- }
- throw new AuthenticationFailedException(null, me);
- }
- } catch (IOException ioe) {
- mTransport.close();
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, ioe.toString());
- }
- throw new MessagingException(MessagingException.IOERROR, ioe.toString());
- }
-
- Exception statException = null;
- try {
- String response = executeSimpleCommand("STAT");
- String[] parts = response.split(" ");
- if (parts.length < 2) {
- statException = new IOException();
- } else {
- mMessageCount = Integer.parseInt(parts[1]);
- }
- } catch (IOException ioe) {
- statException = ioe;
- } catch (NumberFormatException nfe) {
- statException = nfe;
- }
- if (statException != null) {
- mTransport.close();
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, statException.toString());
- }
- throw new MessagingException("POP3 STAT", statException);
- }
- mUidToMsgMap.clear();
- mMsgNumToMsgMap.clear();
- mUidToMsgNumMap.clear();
- }
-
- @Override
- public OpenMode getMode() {
- return OpenMode.READ_WRITE;
- }
-
- /**
- * Close the folder (and the transport below it).
- *
- * MUST NOT return any exceptions.
- *
- * @param expunge If true all deleted messages will be expunged (TODO - not implemented)
- */
- @Override
- public void close(boolean expunge) {
- try {
- executeSimpleCommand("QUIT");
- }
- catch (Exception e) {
- // ignore any problems here - just continue closing
- }
- mTransport.close();
- }
-
- @Override
- public String getName() {
- return mName;
- }
-
- // POP3 does not folder creation
- @Override
- public boolean canCreate(FolderType type) {
- return false;
- }
-
- @Override
- public boolean create(FolderType type) {
- return false;
- }
-
- @Override
- public boolean exists() {
- return mName.equalsIgnoreCase(POP3_MAILBOX_NAME);
- }
-
- @Override
- public int getMessageCount() {
- return mMessageCount;
- }
-
- @Override
- public int getUnreadMessageCount() {
- return -1;
- }
-
- @Override
- public Message getMessage(String uid) throws MessagingException {
- if (mUidToMsgNumMap.size() == 0) {
- try {
- indexMsgNums(1, mMessageCount);
- } catch (IOException ioe) {
- mTransport.close();
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "Unable to index during getMessage " + ioe);
- }
- throw new MessagingException("getMessages", ioe);
- }
- }
- Pop3Message message = mUidToMsgMap.get(uid);
- return message;
- }
-
- @Override
- public Message[] getMessages(int start, int end, MessageRetrievalListener listener)
- throws MessagingException {
- if (start < 1 || end < 1 || end < start) {
- throw new MessagingException(String.format("Invalid message set %d %d",
- start, end));
- }
- try {
- indexMsgNums(start, end);
- } catch (IOException ioe) {
- mTransport.close();
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, ioe.toString());
- }
- throw new MessagingException("getMessages", ioe);
- }
- ArrayList<Message> messages = new ArrayList<Message>();
- for (int msgNum = start; msgNum <= end; msgNum++) {
- Pop3Message message = mMsgNumToMsgMap.get(msgNum);
- messages.add(message);
- if (listener != null) {
- listener.messageRetrieved(message);
- }
- }
- return messages.toArray(new Message[messages.size()]);
- }
-
- /**
- * Ensures that the given message set (from start to end inclusive)
- * has been queried so that uids are available in the local cache.
- * @param start
- * @param end
- * @throws MessagingException
- * @throws IOException
- */
- private void indexMsgNums(int start, int end)
- throws MessagingException, IOException {
- int unindexedMessageCount = 0;
- for (int msgNum = start; msgNum <= end; msgNum++) {
- if (mMsgNumToMsgMap.get(msgNum) == null) {
- unindexedMessageCount++;
- }
- }
- if (unindexedMessageCount == 0) {
- return;
- }
- UidlParser parser = new UidlParser();
- if (DEBUG_FORCE_SINGLE_LINE_UIDL ||
- (unindexedMessageCount < 50 && mMessageCount > 5000)) {
- /*
- * In extreme cases we'll do a UIDL command per message instead of a bulk
- * download.
- */
- for (int msgNum = start; msgNum <= end; msgNum++) {
- Pop3Message message = mMsgNumToMsgMap.get(msgNum);
- if (message == null) {
- String response = executeSimpleCommand("UIDL " + msgNum);
- if (!parser.parseSingleLine(response)) {
- throw new IOException();
- }
- message = new Pop3Message(parser.mUniqueId, this);
- indexMessage(msgNum, message);
- }
- }
- } else {
- String response = executeSimpleCommand("UIDL");
- while ((response = mTransport.readLine()) != null) {
- if (!parser.parseMultiLine(response)) {
- throw new IOException();
- }
- if (parser.mEndOfMessage) {
- break;
- }
- int msgNum = parser.mMessageNumber;
- if (msgNum >= start && msgNum <= end) {
- Pop3Message message = mMsgNumToMsgMap.get(msgNum);
- if (message == null) {
- message = new Pop3Message(parser.mUniqueId, this);
- indexMessage(msgNum, message);
- }
- }
- }
- }
- }
-
- private void indexUids(ArrayList<String> uids)
- throws MessagingException, IOException {
- HashSet<String> unindexedUids = new HashSet<String>();
- for (String uid : uids) {
- if (mUidToMsgMap.get(uid) == null) {
- unindexedUids.add(uid);
- }
- }
- if (unindexedUids.size() == 0) {
- return;
- }
- /*
- * If we are missing uids in the cache the only sure way to
- * get them is to do a full UIDL list. A possible optimization
- * would be trying UIDL for the latest X messages and praying.
- */
- UidlParser parser = new UidlParser();
- String response = executeSimpleCommand("UIDL");
- while ((response = mTransport.readLine()) != null) {
- parser.parseMultiLine(response);
- if (parser.mEndOfMessage) {
- break;
- }
- if (unindexedUids.contains(parser.mUniqueId)) {
- Pop3Message message = mUidToMsgMap.get(parser.mUniqueId);
- if (message == null) {
- message = new Pop3Message(parser.mUniqueId, this);
- }
- indexMessage(parser.mMessageNumber, message);
- }
- }
- }
-
- /**
- * Simple parser class for UIDL messages.
- *
- * <p>NOTE: In variance with RFC 1939, we allow multiple whitespace between the
- * message-number and unique-id fields. This provides greater compatibility with some
- * non-compliant POP3 servers, e.g. mail.comcast.net.
- */
- /* package */ class UidlParser {
-
- /**
- * Caller can read back message-number from this field
- */
- public int mMessageNumber;
- /**
- * Caller can read back unique-id from this field
- */
- public String mUniqueId;
- /**
- * True if the response was "end-of-message"
- */
- public boolean mEndOfMessage;
- /**
- * True if an error was reported
- */
- public boolean mErr;
-
- /**
- * Construct & Initialize
- */
- public UidlParser() {
- mErr = true;
- }
-
- /**
- * Parse a single-line response. This is returned from a command of the form
- * "UIDL msg-num" and will be formatted as: "+OK msg-num unique-id" or
- * "-ERR diagnostic text"
- *
- * @param response The string returned from the server
- * @return true if the string parsed as expected (e.g. no syntax problems)
- */
- public boolean parseSingleLine(String response) {
- mErr = false;
- if (response == null || response.length() == 0) {
- return false;
- }
- char first = response.charAt(0);
- if (first == '+') {
- String[] uidParts = response.split(" +");
- if (uidParts.length >= 3) {
- try {
- mMessageNumber = Integer.parseInt(uidParts[1]);
- } catch (NumberFormatException nfe) {
- return false;
- }
- mUniqueId = uidParts[2];
- mEndOfMessage = true;
- return true;
- }
- } else if (first == '-') {
- mErr = true;
- return true;
- }
- return false;
- }
-
- /**
- * Parse a multi-line response. This is returned from a command of the form
- * "UIDL" and will be formatted as: "." or "msg-num unique-id".
- *
- * @param response The string returned from the server
- * @return true if the string parsed as expected (e.g. no syntax problems)
- */
- public boolean parseMultiLine(String response) {
- mErr = false;
- if (response == null || response.length() == 0) {
- return false;
- }
- char first = response.charAt(0);
- if (first == '.') {
- mEndOfMessage = true;
- return true;
- } else {
- String[] uidParts = response.split(" +");
- if (uidParts.length >= 2) {
- try {
- mMessageNumber = Integer.parseInt(uidParts[0]);
- } catch (NumberFormatException nfe) {
- return false;
- }
- mUniqueId = uidParts[1];
- mEndOfMessage = false;
- return true;
- }
- }
- return false;
- }
- }
-
- private void indexMessage(int msgNum, Pop3Message message) {
- mMsgNumToMsgMap.put(msgNum, message);
- mUidToMsgMap.put(message.getUid(), message);
- mUidToMsgNumMap.put(message.getUid(), msgNum);
- }
-
- @Override
- public Message[] getMessages(String[] uids, MessageRetrievalListener listener) {
- throw new UnsupportedOperationException(
- "Pop3Folder.getMessage(MessageRetrievalListener)");
- }
-
- /**
- * Fetch the items contained in the FetchProfile into the given set of
- * Messages in as efficient a manner as possible.
- * @param messages
- * @param fp
- * @throws MessagingException
- */
- @Override
- public void fetch(Message[] messages, FetchProfile fp, MessageRetrievalListener listener)
- throws MessagingException {
- if (messages == null || messages.length == 0) {
- return;
- }
- ArrayList<String> uids = new ArrayList<String>();
- for (Message message : messages) {
- uids.add(message.getUid());
- }
- try {
- indexUids(uids);
- if (fp.contains(FetchProfile.Item.ENVELOPE)) {
- // Note: We never pass the listener for the ENVELOPE call, because we're going
- // to be calling the listener below in the per-message loop.
- fetchEnvelope(messages, null);
- }
- } catch (IOException ioe) {
- mTransport.close();
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, ioe.toString());
- }
- throw new MessagingException("fetch", ioe);
- }
- for (int i = 0, count = messages.length; i < count; i++) {
- Message message = messages[i];
- if (!(message instanceof Pop3Message)) {
- throw new MessagingException("Pop3Store.fetch called with non-Pop3 Message");
- }
- Pop3Message pop3Message = (Pop3Message)message;
- try {
- if (fp.contains(FetchProfile.Item.BODY)) {
- fetchBody(pop3Message, -1);
- }
- else if (fp.contains(FetchProfile.Item.BODY_SANE)) {
- /*
- * To convert the suggested download size we take the size
- * divided by the maximum line size (76).
- */
- fetchBody(pop3Message,
- FETCH_BODY_SANE_SUGGESTED_SIZE / 76);
- }
- else if (fp.contains(FetchProfile.Item.STRUCTURE)) {
- /*
- * If the user is requesting STRUCTURE we are required to set the body
- * to null since we do not support the function.
- */
- pop3Message.setBody(null);
- }
- if (listener != null) {
- listener.messageRetrieved(message);
- }
- } catch (IOException ioe) {
- mTransport.close();
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, ioe.toString());
- }
- throw new MessagingException("Unable to fetch message", ioe);
- }
- }
- }
-
- private void fetchEnvelope(Message[] messages,
- MessageRetrievalListener listener) throws IOException, MessagingException {
- int unsizedMessages = 0;
- for (Message message : messages) {
- if (message.getSize() == -1) {
- unsizedMessages++;
- }
- }
- if (unsizedMessages == 0) {
- return;
- }
- if (unsizedMessages < 50 && mMessageCount > 5000) {
- /*
- * In extreme cases we'll do a command per message instead of a bulk request
- * to hopefully save some time and bandwidth.
- */
- for (int i = 0, count = messages.length; i < count; i++) {
- Message message = messages[i];
- if (!(message instanceof Pop3Message)) {
- throw new MessagingException(
- "Pop3Store.fetch called with non-Pop3 Message");
- }
- Pop3Message pop3Message = (Pop3Message)message;
- String response = executeSimpleCommand(String.format("LIST %d",
- mUidToMsgNumMap.get(pop3Message.getUid())));
- try {
- String[] listParts = response.split(" ");
- int msgNum = Integer.parseInt(listParts[1]);
- int msgSize = Integer.parseInt(listParts[2]);
- pop3Message.setSize(msgSize);
- } catch (NumberFormatException nfe) {
- throw new IOException();
- }
- if (listener != null) {
- listener.messageRetrieved(pop3Message);
- }
- }
- } else {
- HashSet<String> msgUidIndex = new HashSet<String>();
- for (Message message : messages) {
- msgUidIndex.add(message.getUid());
- }
- String response = executeSimpleCommand("LIST");
- while ((response = mTransport.readLine()) != null) {
- if (response.equals(".")) {
- break;
- }
- Pop3Message pop3Message = null;
- int msgSize = 0;
- try {
- String[] listParts = response.split(" ");
- int msgNum = Integer.parseInt(listParts[0]);
- msgSize = Integer.parseInt(listParts[1]);
- pop3Message = mMsgNumToMsgMap.get(msgNum);
- } catch (NumberFormatException nfe) {
- throw new IOException();
- }
- if (pop3Message != null && msgUidIndex.contains(pop3Message.getUid())) {
- pop3Message.setSize(msgSize);
- if (listener != null) {
- listener.messageRetrieved(pop3Message);
- }
- }
- }
- }
- }
-
- /**
- * Fetches the body of the given message, limiting the stored data
- * to the specified number of lines. If lines is -1 the entire message
- * is fetched. This is implemented with RETR for lines = -1 or TOP
- * for any other value. If the server does not support TOP it is
- * emulated with RETR and extra lines are thrown away.
- *
- * Note: Some servers (e.g. live.com) don't support CAPA, but turn out to
- * support TOP after all. For better performance on these servers, we'll always
- * probe TOP, and fall back to RETR when it's truly unsupported.
- *
- * @param message
- * @param lines
- */
- private void fetchBody(Pop3Message message, int lines)
- throws IOException, MessagingException {
- String response = null;
- int messageId = mUidToMsgNumMap.get(message.getUid());
- if (lines == -1) {
- // Fetch entire message
- response = executeSimpleCommand(String.format("RETR %d", messageId));
- } else {
- // Fetch partial message. Try "TOP", and fall back to slower "RETR" if necessary
- try {
- response = executeSimpleCommand(String.format("TOP %d %d", messageId, lines));
- } catch (MessagingException me) {
- response = executeSimpleCommand(String.format("RETR %d", messageId));
- }
- }
- if (response != null) {
- try {
- InputStream in = mTransport.getInputStream();
- if (DEBUG_LOG_RAW_STREAM && MailActivityEmail.DEBUG) {
- in = new LoggingInputStream(in);
- }
- message.parse(new Pop3ResponseInputStream(in));
- }
- catch (MessagingException me) {
- /*
- * If we're only downloading headers it's possible
- * we'll get a broken MIME message which we're not
- * real worried about. If we've downloaded the body
- * and can't parse it we need to let the user know.
- */
- if (lines == -1) {
- throw me;
- }
- }
- }
- }
-
- @Override
- public Flag[] getPermanentFlags() {
- return PERMANENT_FLAGS;
- }
-
- @Override
- public void appendMessages(Message[] messages) {
- }
-
- @Override
- public void delete(boolean recurse) {
- }
-
- @Override
- public Message[] expunge() {
- return null;
- }
-
- @Override
- public void setFlags(Message[] messages, Flag[] flags, boolean value)
- throws MessagingException {
- if (!value || !Utility.arrayContains(flags, Flag.DELETED)) {
- /*
- * The only flagging we support is setting the Deleted flag.
- */
- return;
- }
- try {
- for (Message message : messages) {
- executeSimpleCommand(String.format("DELE %s",
- mUidToMsgNumMap.get(message.getUid())));
- }
- }
- catch (IOException ioe) {
- mTransport.close();
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, ioe.toString());
- }
- throw new MessagingException("setFlags()", ioe);
- }
- }
-
- @Override
- public void copyMessages(Message[] msgs, Folder folder, MessageUpdateCallbacks callbacks) {
- throw new UnsupportedOperationException("copyMessages is not supported in POP3");
- }
-
-// private boolean isRoundTripModeSuggested() {
-// long roundTripMethodMs =
-// (uncachedMessageCount * 2 * mLatencyMs);
-// long bulkMethodMs =
-// (mMessageCount * 58) / (mThroughputKbS * 1024 / 8) * 1000;
-// }
-
- private Pop3Capabilities getCapabilities() throws IOException {
- Pop3Capabilities capabilities = new Pop3Capabilities();
- try {
- String response = executeSimpleCommand("CAPA");
- while ((response = mTransport.readLine()) != null) {
- if (response.equals(".")) {
- break;
- }
- if (response.equalsIgnoreCase("STLS")){
- capabilities.stls = true;
- }
- else if (response.equalsIgnoreCase("UIDL")) {
- capabilities.uidl = true;
- }
- else if (response.equalsIgnoreCase("PIPELINING")) {
- capabilities.pipelining = true;
- }
- else if (response.equalsIgnoreCase("USER")) {
- capabilities.user = true;
- }
- else if (response.equalsIgnoreCase("TOP")) {
- capabilities.top = true;
- }
- }
- }
- catch (MessagingException me) {
- /*
- * The server may not support the CAPA command, so we just eat this Exception
- * and allow the empty capabilities object to be returned.
- */
- }
- return capabilities;
- }
-
- /**
- * Send a single command and wait for a single line response. Reopens the connection,
- * if it is closed. Leaves the connection open.
- *
- * @param command The command string to send to the server.
- * @return Returns the response string from the server.
- */
- private String executeSimpleCommand(String command) throws IOException, MessagingException {
- return executeSensitiveCommand(command, null);
- }
-
- /**
- * Send a single command and wait for a single line response. Reopens the connection,
- * if it is closed. Leaves the connection open.
- *
- * @param command The command string to send to the server.
- * @param sensitiveReplacement If the command includes sensitive data (e.g. authentication)
- * please pass a replacement string here (for logging).
- * @return Returns the response string from the server.
- */
- private String executeSensitiveCommand(String command, String sensitiveReplacement)
- throws IOException, MessagingException {
- open(OpenMode.READ_WRITE);
-
- if (command != null) {
- mTransport.writeLine(command, sensitiveReplacement);
- }
-
- String response = mTransport.readLine();
-
- if (response.length() > 1 && response.charAt(0) == '-') {
- throw new MessagingException(response);
- }
-
- return response;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof Pop3Folder) {
- return ((Pop3Folder) o).mName.equals(mName);
- }
- return super.equals(o);
- }
-
- @Override
- @VisibleForTesting
- public boolean isOpen() {
- return mTransport.isOpen();
- }
-
- @Override
- public Message createMessage(String uid) {
- return new Pop3Message(uid, this);
- }
-
- @Override
- public Message[] getMessages(SearchParams params, MessageRetrievalListener listener) {
- return null;
- }
- }
-
- public static class Pop3Message extends MimeMessage {
- public Pop3Message(String uid, Pop3Folder folder) {
- mUid = uid;
- mFolder = folder;
- mSize = -1;
- }
-
- public void setSize(int size) {
- mSize = size;
- }
-
- @Override
- public void parse(InputStream in) throws IOException, MessagingException {
- super.parse(in);
- }
-
- @Override
- public void setFlag(Flag flag, boolean set) throws MessagingException {
- super.setFlag(flag, set);
- mFolder.setFlags(new Message[] { this }, new Flag[] { flag }, set);
- }
- }
-
- /**
- * POP3 Capabilities as defined in RFC 2449. This is not a complete list of CAPA
- * responses - just those that we use in this client.
- */
- class Pop3Capabilities {
- /** The STLS (start TLS) command is supported */
- public boolean stls;
- /** the TOP command (retrieve a partial message) is supported */
- public boolean top;
- /** USER and PASS login/auth commands are supported */
- public boolean user;
- /** the optional UIDL command is supported (unused) */
- public boolean uidl;
- /** the server is capable of accepting multiple commands at a time (unused) */
- public boolean pipelining;
-
- @Override
- public String toString() {
- return String.format("STLS %b, TOP %b, USER %b, UIDL %b, PIPELINING %b",
- stls,
- top,
- user,
- uidl,
- pipelining);
- }
- }
-
- // TODO figure out what is special about this and merge it into MailTransport
- class Pop3ResponseInputStream extends InputStream {
- private final InputStream mIn;
- private boolean mStartOfLine = true;
- private boolean mFinished;
-
- public Pop3ResponseInputStream(InputStream in) {
- mIn = in;
- }
-
- @Override
- public int read() throws IOException {
- if (mFinished) {
- return -1;
- }
- int d = mIn.read();
- if (mStartOfLine && d == '.') {
- d = mIn.read();
- if (d == '\r') {
- mFinished = true;
- mIn.read();
- return -1;
- }
- }
-
- mStartOfLine = (d == '\n');
-
- return d;
- }
- }
-}
diff --git a/email2/src/com/android/email/mail/store/ServiceStore.java b/email2/src/com/android/email/mail/store/ServiceStore.java
deleted file mode 100644
index 9b9ecf705..000000000
--- a/email2/src/com/android/email/mail/store/ServiceStore.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.os.RemoteException;
-
-import com.android.email.mail.Store;
-import com.android.email.service.EmailServiceUtils;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.service.EmailServiceProxy;
-import com.android.emailcommon.service.IEmailService;
-
-/**
- * Base class for service-based stores
- */
-public class ServiceStore extends Store {
- protected final HostAuth mHostAuth;
-
- /**
- * Creates a new store for the given account.
- */
- public ServiceStore(Account account, Context context) throws MessagingException {
- mContext = context;
- mHostAuth = account.getOrCreateHostAuthRecv(mContext);
- }
-
- /**
- * Static named constructor.
- */
- public static Store newInstance(Account account, Context context) throws MessagingException {
- return new ServiceStore(account, context);
- }
-
- private IEmailService getService() {
- return EmailServiceUtils.getService(mContext, null, mHostAuth.mProtocol);
- }
-
- @Override
- public Bundle checkSettings() throws MessagingException {
- /**
- * Here's where we check the settings
- * @throws MessagingException if we can't authenticate the account
- */
- try {
- IEmailService svc = getService();
- // Use a longer timeout for the validate command. Note that the instanceof check
- // shouldn't be necessary; we'll do it anyway, just to be safe
- if (svc instanceof EmailServiceProxy) {
- ((EmailServiceProxy)svc).setTimeout(90);
- }
- return svc.validate(mHostAuth);
- } catch (RemoteException e) {
- throw new MessagingException("Call to validate generated an exception", e);
- }
- }
-
- /**
- * We handle AutoDiscover here, wrapping the EmailService call. The service call returns a
- * HostAuth and we return null if there was a service issue
- */
- @Override
- public Bundle autoDiscover(Context context, String username, String password) {
- try {
- return getService().autoDiscover(username, password);
- } catch (RemoteException e) {
- return null;
- }
- }
-}
diff --git a/email2/src/com/android/email/mail/store/imap/ImapConstants.java b/email2/src/com/android/email/mail/store/imap/ImapConstants.java
deleted file mode 100644
index eee2ac44e..000000000
--- a/email2/src/com/android/email/mail/store/imap/ImapConstants.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store.imap;
-
-import com.android.email.mail.Store;
-
-public final class ImapConstants {
- private ImapConstants() {}
-
- public static final String FETCH_FIELD_BODY_PEEK_BARE = "BODY.PEEK";
- public static final String FETCH_FIELD_BODY_PEEK = FETCH_FIELD_BODY_PEEK_BARE + "[]";
- public static final String FETCH_FIELD_BODY_PEEK_SANE
- = String.format("BODY.PEEK[]<0.%d>", Store.FETCH_BODY_SANE_SUGGESTED_SIZE);
- public static final String FETCH_FIELD_HEADERS =
- "BODY.PEEK[HEADER.FIELDS (date subject from content-type to cc message-id)]";
-
- public static final String ALERT = "ALERT";
- public static final String APPEND = "APPEND";
- public static final String BAD = "BAD";
- public static final String BADCHARSET = "BADCHARSET";
- public static final String BODY = "BODY";
- public static final String BODY_BRACKET_HEADER = "BODY[HEADER";
- public static final String BODYSTRUCTURE = "BODYSTRUCTURE";
- public static final String BYE = "BYE";
- public static final String CAPABILITY = "CAPABILITY";
- public static final String CHECK = "CHECK";
- public static final String CLOSE = "CLOSE";
- public static final String COPY = "COPY";
- public static final String COPYUID = "COPYUID";
- public static final String CREATE = "CREATE";
- public static final String DELETE = "DELETE";
- public static final String EXAMINE = "EXAMINE";
- public static final String EXISTS = "EXISTS";
- public static final String EXPUNGE = "EXPUNGE";
- public static final String FETCH = "FETCH";
- public static final String FLAG_ANSWERED = "\\ANSWERED";
- public static final String FLAG_DELETED = "\\DELETED";
- public static final String FLAG_FLAGGED = "\\FLAGGED";
- public static final String FLAG_NO_SELECT = "\\NOSELECT";
- public static final String FLAG_SEEN = "\\SEEN";
- public static final String FLAGS = "FLAGS";
- public static final String FLAGS_SILENT = "FLAGS.SILENT";
- public static final String ID = "ID";
- public static final String INBOX = "INBOX";
- public static final String INTERNALDATE = "INTERNALDATE";
- public static final String LIST = "LIST";
- public static final String LOGIN = "LOGIN";
- public static final String LOGOUT = "LOGOUT";
- public static final String LSUB = "LSUB";
- public static final String NAMESPACE = "NAMESPACE";
- public static final String NO = "NO";
- public static final String NOOP = "NOOP";
- public static final String OK = "OK";
- public static final String PARSE = "PARSE";
- public static final String PERMANENTFLAGS = "PERMANENTFLAGS";
- public static final String PREAUTH = "PREAUTH";
- public static final String READ_ONLY = "READ-ONLY";
- public static final String READ_WRITE = "READ-WRITE";
- public static final String RENAME = "RENAME";
- public static final String RFC822_SIZE = "RFC822.SIZE";
- public static final String SEARCH = "SEARCH";
- public static final String SELECT = "SELECT";
- public static final String STARTTLS = "STARTTLS";
- public static final String STATUS = "STATUS";
- public static final String STORE = "STORE";
- public static final String SUBSCRIBE = "SUBSCRIBE";
- public static final String TEXT = "TEXT";
- public static final String TRYCREATE = "TRYCREATE";
- public static final String UID = "UID";
- public static final String UID_COPY = "UID COPY";
- public static final String UID_FETCH = "UID FETCH";
- public static final String UID_SEARCH = "UID SEARCH";
- public static final String UID_STORE = "UID STORE";
- public static final String UIDNEXT = "UIDNEXT";
- public static final String UIDPLUS = "UIDPLUS";
- public static final String UIDVALIDITY = "UIDVALIDITY";
- public static final String UNSEEN = "UNSEEN";
- public static final String UNSUBSCRIBE = "UNSUBSCRIBE";
- public static final String APPENDUID = "APPENDUID";
- public static final String NIL = "NIL";
-}
diff --git a/email2/src/com/android/email/mail/store/imap/ImapElement.java b/email2/src/com/android/email/mail/store/imap/ImapElement.java
deleted file mode 100644
index 80bb6cd99..000000000
--- a/email2/src/com/android/email/mail/store/imap/ImapElement.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store.imap;
-
-/**
- * Class representing "element"s in IMAP responses.
- *
- * <p>Class hierarchy:
- * <pre>
- * ImapElement
- * |
- * |-- ImapElement.NONE (for 'index out of range')
- * |
- * |-- ImapList (isList() == true)
- * | |
- * | |-- ImapList.EMPTY
- * | |
- * | --- ImapResponse
- * |
- * --- ImapString (isString() == true)
- * |
- * |-- ImapString.EMPTY
- * |
- * |-- ImapSimpleString
- * |
- * |-- ImapMemoryLiteral
- * |
- * --- ImapTempFileLiteral
- * </pre>
- */
-public abstract class ImapElement {
- /**
- * An element that is returned by {@link ImapList#getElementOrNone} to indicate an index
- * is out of range.
- */
- public static final ImapElement NONE = new ImapElement() {
- @Override public void destroy() {
- // Don't call super.destroy().
- // It's a shared object. We don't want the mDestroyed to be set on this.
- }
-
- @Override public boolean isList() {
- return false;
- }
-
- @Override public boolean isString() {
- return false;
- }
-
- @Override public String toString() {
- return "[NO ELEMENT]";
- }
-
- @Override
- public boolean equalsForTest(ImapElement that) {
- return super.equalsForTest(that);
- }
- };
-
- private boolean mDestroyed = false;
-
- public abstract boolean isList();
-
- public abstract boolean isString();
-
- protected boolean isDestroyed() {
- return mDestroyed;
- }
-
- /**
- * Clean up the resources used by the instance.
- * It's for removing a temp file used by {@link ImapTempFileLiteral}.
- */
- public void destroy() {
- mDestroyed = true;
- }
-
- /**
- * Throws {@link RuntimeException} if it's already destroyed.
- */
- protected final void checkNotDestroyed() {
- if (mDestroyed) {
- throw new RuntimeException("Already destroyed");
- }
- }
-
- /**
- * Return a string that represents this object; it's purely for the debug purpose. Don't
- * mistake it for {@link ImapString#getString}.
- *
- * Abstract to force subclasses to implement it.
- */
- @Override
- public abstract String toString();
-
- /**
- * The equals implementation that is intended to be used only for unit testing.
- * (Because it may be heavy and has a special sense of "equal" for testing.)
- */
- public boolean equalsForTest(ImapElement that) {
- if (that == null) {
- return false;
- }
- return this.getClass() == that.getClass(); // Has to be the same class.
- }
-}
diff --git a/email2/src/com/android/email/mail/store/imap/ImapList.java b/email2/src/com/android/email/mail/store/imap/ImapList.java
deleted file mode 100644
index e28355989..000000000
--- a/email2/src/com/android/email/mail/store/imap/ImapList.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store.imap;
-
-import java.util.ArrayList;
-
-/**
- * Class represents an IMAP list.
- */
-public class ImapList extends ImapElement {
- /**
- * {@link ImapList} representing an empty list.
- */
- public static final ImapList EMPTY = new ImapList() {
- @Override public void destroy() {
- // Don't call super.destroy().
- // It's a shared object. We don't want the mDestroyed to be set on this.
- }
-
- @Override void add(ImapElement e) {
- throw new RuntimeException();
- }
- };
-
- private ArrayList<ImapElement> mList = new ArrayList<ImapElement>();
-
- /* package */ void add(ImapElement e) {
- if (e == null) {
- throw new RuntimeException("Can't add null");
- }
- mList.add(e);
- }
-
- @Override
- public final boolean isString() {
- return false;
- }
-
- @Override
- public final boolean isList() {
- return true;
- }
-
- public final int size() {
- return mList.size();
- }
-
- public final boolean isEmpty() {
- return size() == 0;
- }
-
- /**
- * Return true if the element at {@code index} exists, is string, and equals to {@code s}.
- * (case insensitive)
- */
- public final boolean is(int index, String s) {
- return is(index, s, false);
- }
-
- /**
- * Same as {@link #is(int, String)}, but does the prefix match if {@code prefixMatch}.
- */
- public final boolean is(int index, String s, boolean prefixMatch) {
- if (!prefixMatch) {
- return getStringOrEmpty(index).is(s);
- } else {
- return getStringOrEmpty(index).startsWith(s);
- }
- }
-
- /**
- * Return the element at {@code index}.
- * If {@code index} is out of range, returns {@link ImapElement#NONE}.
- */
- public final ImapElement getElementOrNone(int index) {
- return (index >= mList.size()) ? ImapElement.NONE : mList.get(index);
- }
-
- /**
- * Return the element at {@code index} if it's a list.
- * If {@code index} is out of range or not a list, returns {@link ImapList#EMPTY}.
- */
- public final ImapList getListOrEmpty(int index) {
- ImapElement el = getElementOrNone(index);
- return el.isList() ? (ImapList) el : EMPTY;
- }
-
- /**
- * Return the element at {@code index} if it's a string.
- * If {@code index} is out of range or not a string, returns {@link ImapString#EMPTY}.
- */
- public final ImapString getStringOrEmpty(int index) {
- ImapElement el = getElementOrNone(index);
- return el.isString() ? (ImapString) el : ImapString.EMPTY;
- }
-
- /**
- * Return an element keyed by {@code key}. Return null if not found. {@code key} has to be
- * at an even index.
- */
- /* package */ final ImapElement getKeyedElementOrNull(String key, boolean prefixMatch) {
- for (int i = 1; i < size(); i += 2) {
- if (is(i-1, key, prefixMatch)) {
- return mList.get(i);
- }
- }
- return null;
- }
-
- /**
- * Return an {@link ImapList} keyed by {@code key}.
- * Return {@link ImapList#EMPTY} if not found.
- */
- public final ImapList getKeyedListOrEmpty(String key) {
- return getKeyedListOrEmpty(key, false);
- }
-
- /**
- * Return an {@link ImapList} keyed by {@code key}.
- * Return {@link ImapList#EMPTY} if not found.
- */
- public final ImapList getKeyedListOrEmpty(String key, boolean prefixMatch) {
- ImapElement e = getKeyedElementOrNull(key, prefixMatch);
- return (e != null) ? ((ImapList) e) : ImapList.EMPTY;
- }
-
- /**
- * Return an {@link ImapString} keyed by {@code key}.
- * Return {@link ImapString#EMPTY} if not found.
- */
- public final ImapString getKeyedStringOrEmpty(String key) {
- return getKeyedStringOrEmpty(key, false);
- }
-
- /**
- * Return an {@link ImapString} keyed by {@code key}.
- * Return {@link ImapString#EMPTY} if not found.
- */
- public final ImapString getKeyedStringOrEmpty(String key, boolean prefixMatch) {
- ImapElement e = getKeyedElementOrNull(key, prefixMatch);
- return (e != null) ? ((ImapString) e) : ImapString.EMPTY;
- }
-
- /**
- * Return true if it contains {@code s}.
- */
- public final boolean contains(String s) {
- for (int i = 0; i < size(); i++) {
- if (getStringOrEmpty(i).is(s)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void destroy() {
- if (mList != null) {
- for (ImapElement e : mList) {
- e.destroy();
- }
- mList = null;
- }
- super.destroy();
- }
-
- @Override
- public String toString() {
- return mList.toString();
- }
-
- /**
- * Return the text representations of the contents concatenated with ",".
- */
- public final String flatten() {
- return flatten(new StringBuilder()).toString();
- }
-
- /**
- * Returns text representations (i.e. getString()) of contents joined together with
- * "," as the separator.
- *
- * Only used for building the capability string passed to vendor policies.
- *
- * We can't use toString(), because it's for debugging (meaning the format may change any time),
- * and it won't expand literals.
- */
- private final StringBuilder flatten(StringBuilder sb) {
- sb.append('[');
- for (int i = 0; i < mList.size(); i++) {
- if (i > 0) {
- sb.append(',');
- }
- final ImapElement e = getElementOrNone(i);
- if (e.isList()) {
- getListOrEmpty(i).flatten(sb);
- } else if (e.isString()) {
- sb.append(getStringOrEmpty(i).getString());
- }
- }
- sb.append(']');
- return sb;
- }
-
- @Override
- public boolean equalsForTest(ImapElement that) {
- if (!super.equalsForTest(that)) {
- return false;
- }
- ImapList thatList = (ImapList) that;
- if (size() != thatList.size()) {
- return false;
- }
- for (int i = 0; i < size(); i++) {
- if (!mList.get(i).equalsForTest(thatList.getElementOrNone(i))) {
- return false;
- }
- }
- return true;
- }
-}
diff --git a/email2/src/com/android/email/mail/store/imap/ImapMemoryLiteral.java b/email2/src/com/android/email/mail/store/imap/ImapMemoryLiteral.java
deleted file mode 100644
index ea62d52d1..000000000
--- a/email2/src/com/android/email/mail/store/imap/ImapMemoryLiteral.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store.imap;
-
-import com.android.email.FixedLengthInputStream;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.utility.Utility;
-
-import android.util.Log;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Subclass of {@link ImapString} used for literals backed by an in-memory byte array.
- */
-public class ImapMemoryLiteral extends ImapString {
- private byte[] mData;
-
- /* package */ ImapMemoryLiteral(FixedLengthInputStream in) throws IOException {
- // We could use ByteArrayOutputStream and IOUtils.copy, but it'd perform an unnecessary
- // copy....
- mData = new byte[in.getLength()];
- int pos = 0;
- while (pos < mData.length) {
- int read = in.read(mData, pos, mData.length - pos);
- if (read < 0) {
- break;
- }
- pos += read;
- }
- if (pos != mData.length) {
- Log.w(Logging.LOG_TAG, "");
- }
- }
-
- @Override
- public void destroy() {
- mData = null;
- super.destroy();
- }
-
- @Override
- public String getString() {
- return Utility.fromAscii(mData);
- }
-
- @Override
- public InputStream getAsStream() {
- return new ByteArrayInputStream(mData);
- }
-
- @Override
- public String toString() {
- return String.format("{%d byte literal(memory)}", mData.length);
- }
-}
diff --git a/email2/src/com/android/email/mail/store/imap/ImapResponse.java b/email2/src/com/android/email/mail/store/imap/ImapResponse.java
deleted file mode 100644
index 05bf594e6..000000000
--- a/email2/src/com/android/email/mail/store/imap/ImapResponse.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store.imap;
-
-
-/**
- * Class represents an IMAP response.
- */
-public class ImapResponse extends ImapList {
- private final String mTag;
- private final boolean mIsContinuationRequest;
-
- /* package */ ImapResponse(String tag, boolean isContinuationRequest) {
- mTag = tag;
- mIsContinuationRequest = isContinuationRequest;
- }
-
- /* package */ static boolean isStatusResponse(String symbol) {
- return ImapConstants.OK.equalsIgnoreCase(symbol)
- || ImapConstants.NO.equalsIgnoreCase(symbol)
- || ImapConstants.BAD.equalsIgnoreCase(symbol)
- || ImapConstants.PREAUTH.equalsIgnoreCase(symbol)
- || ImapConstants.BYE.equalsIgnoreCase(symbol);
- }
-
- /**
- * @return whether it's a tagged response.
- */
- public boolean isTagged() {
- return mTag != null;
- }
-
- /**
- * @return whether it's a continuation request.
- */
- public boolean isContinuationRequest() {
- return mIsContinuationRequest;
- }
-
- public boolean isStatusResponse() {
- return isStatusResponse(getStringOrEmpty(0).getString());
- }
-
- /**
- * @return whether it's an OK response.
- */
- public boolean isOk() {
- return is(0, ImapConstants.OK);
- }
-
- /**
- * @return whether it's an BAD response.
- */
- public boolean isBad() {
- return is(0, ImapConstants.BAD);
- }
-
- /**
- * @return whether it's an NO response.
- */
- public boolean isNo() {
- return is(0, ImapConstants.NO);
- }
-
- /**
- * @return whether it's an {@code responseType} data response. (i.e. not tagged).
- * @param index where {@code responseType} should appear. e.g. 1 for "FETCH"
- * @param responseType e.g. "FETCH"
- */
- public final boolean isDataResponse(int index, String responseType) {
- return !isTagged() && getStringOrEmpty(index).is(responseType);
- }
-
- /**
- * @return Response code (RFC 3501 7.1) if it's a status response.
- *
- * e.g. "ALERT" for "* OK [ALERT] System shutdown in 10 minutes"
- */
- public ImapString getResponseCodeOrEmpty() {
- if (!isStatusResponse()) {
- return ImapString.EMPTY; // Not a status response.
- }
- return getListOrEmpty(1).getStringOrEmpty(0);
- }
-
- /**
- * @return Alert message it it has ALERT response code.
- *
- * e.g. "System shutdown in 10 minutes" for "* OK [ALERT] System shutdown in 10 minutes"
- */
- public ImapString getAlertTextOrEmpty() {
- if (!getResponseCodeOrEmpty().is(ImapConstants.ALERT)) {
- return ImapString.EMPTY; // Not an ALERT
- }
- // The 3rd element contains all the rest of line.
- return getStringOrEmpty(2);
- }
-
- /**
- * @return Response text in a status response.
- */
- public ImapString getStatusResponseTextOrEmpty() {
- if (!isStatusResponse()) {
- return ImapString.EMPTY;
- }
- return getStringOrEmpty(getElementOrNone(1).isList() ? 2 : 1);
- }
-
- @Override
- public String toString() {
- String tag = mTag;
- if (isContinuationRequest()) {
- tag = "+";
- }
- return "#" + tag + "# " + super.toString();
- }
-
- @Override
- public boolean equalsForTest(ImapElement that) {
- if (!super.equalsForTest(that)) {
- return false;
- }
- final ImapResponse thatResponse = (ImapResponse) that;
- if (mTag == null) {
- if (thatResponse.mTag != null) {
- return false;
- }
- } else {
- if (!mTag.equals(thatResponse.mTag)) {
- return false;
- }
- }
- if (mIsContinuationRequest != thatResponse.mIsContinuationRequest) {
- return false;
- }
- return true;
- }
-}
diff --git a/email2/src/com/android/email/mail/store/imap/ImapResponseParser.java b/email2/src/com/android/email/mail/store/imap/ImapResponseParser.java
deleted file mode 100644
index 078cf9f76..000000000
--- a/email2/src/com/android/email/mail/store/imap/ImapResponseParser.java
+++ /dev/null
@@ -1,450 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store.imap;
-
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.email.FixedLengthInputStream;
-import com.android.email.PeekableInputStream;
-import com.android.email.mail.transport.DiscourseLogger;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.utility.LoggingInputStream;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-
-/**
- * IMAP response parser.
- */
-public class ImapResponseParser {
- private static final boolean DEBUG_LOG_RAW_STREAM = false; // DO NOT RELEASE AS 'TRUE'
-
- /**
- * Literal larger than this will be stored in temp file.
- */
- public static final int LITERAL_KEEP_IN_MEMORY_THRESHOLD = 2 * 1024 * 1024;
-
- /** Input stream */
- private final PeekableInputStream mIn;
-
- /**
- * To log network activities when the parser crashes.
- *
- * <p>We log all bytes received from the server, except for the part sent as literals.
- */
- private final DiscourseLogger mDiscourseLogger;
-
- private final int mLiteralKeepInMemoryThreshold;
-
- /** StringBuilder used by readUntil() */
- private final StringBuilder mBufferReadUntil = new StringBuilder();
-
- /** StringBuilder used by parseBareString() */
- private final StringBuilder mParseBareString = new StringBuilder();
-
- /**
- * We store all {@link ImapResponse} in it. {@link #destroyResponses()} must be called from
- * time to time to destroy them and clear it.
- */
- private final ArrayList<ImapResponse> mResponsesToDestroy = new ArrayList<ImapResponse>();
-
- /**
- * Exception thrown when we receive BYE. It derives from IOException, so it'll be treated
- * in the same way EOF does.
- */
- public static class ByeException extends IOException {
- public static final String MESSAGE = "Received BYE";
- public ByeException() {
- super(MESSAGE);
- }
- }
-
- /**
- * Public constructor for normal use.
- */
- public ImapResponseParser(InputStream in, DiscourseLogger discourseLogger) {
- this(in, discourseLogger, LITERAL_KEEP_IN_MEMORY_THRESHOLD);
- }
-
- /**
- * Constructor for testing to override the literal size threshold.
- */
- /* package for test */ ImapResponseParser(InputStream in, DiscourseLogger discourseLogger,
- int literalKeepInMemoryThreshold) {
- if (DEBUG_LOG_RAW_STREAM && MailActivityEmail.DEBUG) {
- in = new LoggingInputStream(in);
- }
- mIn = new PeekableInputStream(in);
- mDiscourseLogger = discourseLogger;
- mLiteralKeepInMemoryThreshold = literalKeepInMemoryThreshold;
- }
-
- private static IOException newEOSException() {
- final String message = "End of stream reached";
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, message);
- }
- return new IOException(message);
- }
-
- /**
- * Peek next one byte.
- *
- * Throws IOException() if reaches EOF. As long as logical response lines end with \r\n,
- * we shouldn't see EOF during parsing.
- */
- private int peek() throws IOException {
- final int next = mIn.peek();
- if (next == -1) {
- throw newEOSException();
- }
- return next;
- }
-
- /**
- * Read and return one byte from {@link #mIn}, and put it in {@link #mDiscourseLogger}.
- *
- * Throws IOException() if reaches EOF. As long as logical response lines end with \r\n,
- * we shouldn't see EOF during parsing.
- */
- private int readByte() throws IOException {
- int next = mIn.read();
- if (next == -1) {
- throw newEOSException();
- }
- mDiscourseLogger.addReceivedByte(next);
- return next;
- }
-
- /**
- * Destroy all the {@link ImapResponse}s stored in the internal storage and clear it.
- *
- * @see #readResponse()
- */
- public void destroyResponses() {
- for (ImapResponse r : mResponsesToDestroy) {
- r.destroy();
- }
- mResponsesToDestroy.clear();
- }
-
- /**
- * Reads the next response available on the stream and returns an
- * {@link ImapResponse} object that represents it.
- *
- * <p>When this method successfully returns an {@link ImapResponse}, the {@link ImapResponse}
- * is stored in the internal storage. When the {@link ImapResponse} is no longer used
- * {@link #destroyResponses} should be called to destroy all the responses in the array.
- *
- * @return the parsed {@link ImapResponse} object.
- * @exception ByeException when detects BYE.
- */
- public ImapResponse readResponse() throws IOException, MessagingException {
- ImapResponse response = null;
- try {
- response = parseResponse();
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "<<< " + response.toString());
- }
-
- } catch (RuntimeException e) {
- // Parser crash -- log network activities.
- onParseError(e);
- throw e;
- } catch (IOException e) {
- // Network error, or received an unexpected char.
- onParseError(e);
- throw e;
- }
-
- // Handle this outside of try-catch. We don't have to dump protocol log when getting BYE.
- if (response.is(0, ImapConstants.BYE)) {
- Log.w(Logging.LOG_TAG, ByeException.MESSAGE);
- response.destroy();
- throw new ByeException();
- }
- mResponsesToDestroy.add(response);
- return response;
- }
-
- private void onParseError(Exception e) {
- // Read a few more bytes, so that the log will contain some more context, even if the parser
- // crashes in the middle of a response.
- // This also makes sure the byte in question will be logged, no matter where it crashes.
- // e.g. when parseAtom() peeks and finds at an unexpected char, it throws an exception
- // before actually reading it.
- // However, we don't want to read too much, because then it may get into an email message.
- try {
- for (int i = 0; i < 4; i++) {
- int b = readByte();
- if (b == -1 || b == '\n') {
- break;
- }
- }
- } catch (IOException ignore) {
- }
- Log.w(Logging.LOG_TAG, "Exception detected: " + e.getMessage());
- mDiscourseLogger.logLastDiscourse();
- }
-
- /**
- * Read next byte from stream and throw it away. If the byte is different from {@code expected}
- * throw {@link MessagingException}.
- */
- /* package for test */ void expect(char expected) throws IOException {
- final int next = readByte();
- if (expected != next) {
- throw new IOException(String.format("Expected %04x (%c) but got %04x (%c)",
- (int) expected, expected, next, (char) next));
- }
- }
-
- /**
- * Read bytes until we find {@code end}, and return all as string.
- * The {@code end} will be read (rather than peeked) and won't be included in the result.
- */
- /* package for test */ String readUntil(char end) throws IOException {
- mBufferReadUntil.setLength(0);
- for (;;) {
- final int ch = readByte();
- if (ch != end) {
- mBufferReadUntil.append((char) ch);
- } else {
- return mBufferReadUntil.toString();
- }
- }
- }
-
- /**
- * Read all bytes until \r\n.
- */
- /* package */ String readUntilEol() throws IOException {
- String ret = readUntil('\r');
- expect('\n'); // TODO Should this really be error?
- return ret;
- }
-
- /**
- * Parse and return the response line.
- */
- private ImapResponse parseResponse() throws IOException, MessagingException {
- // We need to destroy the response if we get an exception.
- // So, we first store the response that's being built in responseToDestroy, until it's
- // completely built, at which point we copy it into responseToReturn and null out
- // responseToDestroyt.
- // If responseToDestroy is not null in finally, we destroy it because that means
- // we got an exception somewhere.
- ImapResponse responseToDestroy = null;
- final ImapResponse responseToReturn;
-
- try {
- final int ch = peek();
- if (ch == '+') { // Continuation request
- readByte(); // skip +
- expect(' ');
- responseToDestroy = new ImapResponse(null, true);
-
- // If it's continuation request, we don't really care what's in it.
- responseToDestroy.add(new ImapSimpleString(readUntilEol()));
-
- // Response has successfully been built. Let's return it.
- responseToReturn = responseToDestroy;
- responseToDestroy = null;
- } else {
- // Status response or response data
- final String tag;
- if (ch == '*') {
- tag = null;
- readByte(); // skip *
- expect(' ');
- } else {
- tag = readUntil(' ');
- }
- responseToDestroy = new ImapResponse(tag, false);
-
- final ImapString firstString = parseBareString();
- responseToDestroy.add(firstString);
-
- // parseBareString won't eat a space after the string, so we need to skip it,
- // if exists.
- // If the next char is not ' ', it should be EOL.
- if (peek() == ' ') {
- readByte(); // skip ' '
-
- if (responseToDestroy.isStatusResponse()) { // It's a status response
-
- // Is there a response code?
- final int next = peek();
- if (next == '[') {
- responseToDestroy.add(parseList('[', ']'));
- if (peek() == ' ') { // Skip following space
- readByte();
- }
- }
-
- String rest = readUntilEol();
- if (!TextUtils.isEmpty(rest)) {
- // The rest is free-form text.
- responseToDestroy.add(new ImapSimpleString(rest));
- }
- } else { // It's a response data.
- parseElements(responseToDestroy, '\0');
- }
- } else {
- expect('\r');
- expect('\n');
- }
-
- // Response has successfully been built. Let's return it.
- responseToReturn = responseToDestroy;
- responseToDestroy = null;
- }
- } finally {
- if (responseToDestroy != null) {
- // We get an exception.
- responseToDestroy.destroy();
- }
- }
-
- return responseToReturn;
- }
-
- private ImapElement parseElement() throws IOException, MessagingException {
- final int next = peek();
- switch (next) {
- case '(':
- return parseList('(', ')');
- case '[':
- return parseList('[', ']');
- case '"':
- readByte(); // Skip "
- return new ImapSimpleString(readUntil('"'));
- case '{':
- return parseLiteral();
- case '\r': // CR
- readByte(); // Consume \r
- expect('\n'); // Should be followed by LF.
- return null;
- case '\n': // LF // There shouldn't be a bare LF, but just in case.
- readByte(); // Consume \n
- return null;
- default:
- return parseBareString();
- }
- }
-
- /**
- * Parses an atom.
- *
- * Special case: If an atom contains '[', everything until the next ']' will be considered
- * a part of the atom.
- * (e.g. "BODY[HEADER.FIELDS ("DATE" ...)]" will become a single ImapString)
- *
- * If the value is "NIL", returns an empty string.
- */
- private ImapString parseBareString() throws IOException, MessagingException {
- mParseBareString.setLength(0);
- for (;;) {
- final int ch = peek();
-
- // TODO Can we clean this up? (This condition is from the old parser.)
- if (ch == '(' || ch == ')' || ch == '{' || ch == ' ' ||
- // ']' is not part of atom (it's in resp-specials)
- ch == ']' ||
- // docs claim that flags are \ atom but atom isn't supposed to
- // contain
- // * and some flags contain *
- // ch == '%' || ch == '*' ||
- ch == '%' ||
- // TODO probably should not allow \ and should recognize
- // it as a flag instead
- // ch == '"' || ch == '\' ||
- ch == '"' || (0x00 <= ch && ch <= 0x1f) || ch == 0x7f) {
- if (mParseBareString.length() == 0) {
- throw new MessagingException("Expected string, none found.");
- }
- String s = mParseBareString.toString();
-
- // NIL will be always converted into the empty string.
- if (ImapConstants.NIL.equalsIgnoreCase(s)) {
- return ImapString.EMPTY;
- }
- return new ImapSimpleString(s);
- } else if (ch == '[') {
- // Eat all until next ']'
- mParseBareString.append((char) readByte());
- mParseBareString.append(readUntil(']'));
- mParseBareString.append(']'); // readUntil won't include the end char.
- } else {
- mParseBareString.append((char) readByte());
- }
- }
- }
-
- private void parseElements(ImapList list, char end)
- throws IOException, MessagingException {
- for (;;) {
- for (;;) {
- final int next = peek();
- if (next == end) {
- return;
- }
- if (next != ' ') {
- break;
- }
- // Skip space
- readByte();
- }
- final ImapElement el = parseElement();
- if (el == null) { // EOL
- return;
- }
- list.add(el);
- }
- }
-
- private ImapList parseList(char opening, char closing)
- throws IOException, MessagingException {
- expect(opening);
- final ImapList list = new ImapList();
- parseElements(list, closing);
- expect(closing);
- return list;
- }
-
- private ImapString parseLiteral() throws IOException, MessagingException {
- expect('{');
- final int size;
- try {
- size = Integer.parseInt(readUntil('}'));
- } catch (NumberFormatException nfe) {
- throw new MessagingException("Invalid length in literal");
- }
- expect('\r');
- expect('\n');
- FixedLengthInputStream in = new FixedLengthInputStream(mIn, size);
- if (size > mLiteralKeepInMemoryThreshold) {
- return new ImapTempFileLiteral(in);
- } else {
- return new ImapMemoryLiteral(in);
- }
- }
-}
diff --git a/email2/src/com/android/email/mail/store/imap/ImapSimpleString.java b/email2/src/com/android/email/mail/store/imap/ImapSimpleString.java
deleted file mode 100644
index 190c5237f..000000000
--- a/email2/src/com/android/email/mail/store/imap/ImapSimpleString.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store.imap;
-
-import com.android.emailcommon.utility.Utility;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
-/**
- * Subclass of {@link ImapString} used for non literals.
- */
-public class ImapSimpleString extends ImapString {
- private String mString;
-
- /* package */ ImapSimpleString(String string) {
- mString = (string != null) ? string : "";
- }
-
- @Override
- public void destroy() {
- mString = null;
- super.destroy();
- }
-
- @Override
- public String getString() {
- return mString;
- }
-
- @Override
- public InputStream getAsStream() {
- return new ByteArrayInputStream(Utility.toAscii(mString));
- }
-
- @Override
- public String toString() {
- // Purposefully not return just mString, in order to prevent using it instead of getString.
- return "\"" + mString + "\"";
- }
-}
diff --git a/email2/src/com/android/email/mail/store/imap/ImapString.java b/email2/src/com/android/email/mail/store/imap/ImapString.java
deleted file mode 100644
index b0ee99d84..000000000
--- a/email2/src/com/android/email/mail/store/imap/ImapString.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store.imap;
-
-import com.android.emailcommon.Logging;
-
-import android.util.Log;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-
-/**
- * Class represents an IMAP "element" that is not a list.
- *
- * An atom, quoted string, literal, are all represented by this. Values like OK, STATUS are too.
- * Also, this class class may contain more arbitrary value like "BODY[HEADER.FIELDS ("DATE")]".
- * See {@link ImapResponseParser}.
- */
-public abstract class ImapString extends ImapElement {
- private static final byte[] EMPTY_BYTES = new byte[0];
-
- public static final ImapString EMPTY = new ImapString() {
- @Override public void destroy() {
- // Don't call super.destroy().
- // It's a shared object. We don't want the mDestroyed to be set on this.
- }
-
- @Override public String getString() {
- return "";
- }
-
- @Override public InputStream getAsStream() {
- return new ByteArrayInputStream(EMPTY_BYTES);
- }
-
- @Override public String toString() {
- return "";
- }
- };
-
- // This is used only for parsing IMAP's FETCH ENVELOPE command, in which
- // en_US-like date format is used like "01-Jan-2009 11:20:39 -0800", so this should be
- // handled by Locale.US
- private final static SimpleDateFormat DATE_TIME_FORMAT =
- new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss Z", Locale.US);
-
- private boolean mIsInteger;
- private int mParsedInteger;
- private Date mParsedDate;
-
- @Override
- public final boolean isList() {
- return false;
- }
-
- @Override
- public final boolean isString() {
- return true;
- }
-
- /**
- * @return true if and only if the length of the string is larger than 0.
- *
- * Note: IMAP NIL is considered an empty string. See {@link ImapResponseParser
- * #parseBareString}.
- * On the other hand, a quoted/literal string with value NIL (i.e. "NIL" and {3}\r\nNIL) is
- * treated literally.
- */
- public final boolean isEmpty() {
- return getString().length() == 0;
- }
-
- public abstract String getString();
-
- public abstract InputStream getAsStream();
-
- /**
- * @return whether it can be parsed as a number.
- */
- public final boolean isNumber() {
- if (mIsInteger) {
- return true;
- }
- try {
- mParsedInteger = Integer.parseInt(getString());
- mIsInteger = true;
- return true;
- } catch (NumberFormatException e) {
- return false;
- }
- }
-
- /**
- * @return value parsed as a number.
- */
- public final int getNumberOrZero() {
- if (!isNumber()) {
- return 0;
- }
- return mParsedInteger;
- }
-
- /**
- * @return whether it can be parsed as a date using {@link #DATE_TIME_FORMAT}.
- */
- public final boolean isDate() {
- if (mParsedDate != null) {
- return true;
- }
- if (isEmpty()) {
- return false;
- }
- try {
- mParsedDate = DATE_TIME_FORMAT.parse(getString());
- return true;
- } catch (ParseException e) {
- Log.w(Logging.LOG_TAG, getString() + " can't be parsed as a date.");
- return false;
- }
- }
-
- /**
- * @return value it can be parsed as a {@link Date}, or null otherwise.
- */
- public final Date getDateOrNull() {
- if (!isDate()) {
- return null;
- }
- return mParsedDate;
- }
-
- /**
- * @return whether the value case-insensitively equals to {@code s}.
- */
- public final boolean is(String s) {
- if (s == null) {
- return false;
- }
- return getString().equalsIgnoreCase(s);
- }
-
-
- /**
- * @return whether the value case-insensitively starts with {@code s}.
- */
- public final boolean startsWith(String prefix) {
- if (prefix == null) {
- return false;
- }
- final String me = this.getString();
- if (me.length() < prefix.length()) {
- return false;
- }
- return me.substring(0, prefix.length()).equalsIgnoreCase(prefix);
- }
-
- // To force subclasses to implement it.
- @Override
- public abstract String toString();
-
- @Override
- public final boolean equalsForTest(ImapElement that) {
- if (!super.equalsForTest(that)) {
- return false;
- }
- ImapString thatString = (ImapString) that;
- return getString().equals(thatString.getString());
- }
-}
diff --git a/email2/src/com/android/email/mail/store/imap/ImapTempFileLiteral.java b/email2/src/com/android/email/mail/store/imap/ImapTempFileLiteral.java
deleted file mode 100644
index eda1b568e..000000000
--- a/email2/src/com/android/email/mail/store/imap/ImapTempFileLiteral.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store.imap;
-
-import android.util.Log;
-
-import com.android.email.FixedLengthInputStream;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.TempDirectory;
-import com.android.emailcommon.utility.Utility;
-
-import org.apache.commons.io.IOUtils;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Subclass of {@link ImapString} used for literals backed by a temp file.
- */
-public class ImapTempFileLiteral extends ImapString {
- /* package for test */ final File mFile;
-
- /** Size is purely for toString() */
- private final int mSize;
-
- /* package */ ImapTempFileLiteral(FixedLengthInputStream stream) throws IOException {
- mSize = stream.getLength();
- mFile = File.createTempFile("imap", ".tmp", TempDirectory.getTempDirectory());
-
- // Unfortunately, we can't really use deleteOnExit(), because temp filenames are random
- // so it'd simply cause a memory leak.
- // deleteOnExit() simply adds filenames to a static list and the list will never shrink.
- // mFile.deleteOnExit();
- OutputStream out = new FileOutputStream(mFile);
- IOUtils.copy(stream, out);
- out.close();
- }
-
- /**
- * Make sure we delete the temp file.
- *
- * We should always be calling {@link ImapResponse#destroy()}, but it's here as a last resort.
- */
- @Override
- protected void finalize() throws Throwable {
- try {
- destroy();
- } finally {
- super.finalize();
- }
- }
-
- @Override
- public InputStream getAsStream() {
- checkNotDestroyed();
- try {
- return new FileInputStream(mFile);
- } catch (FileNotFoundException e) {
- // It's probably possible if we're low on storage and the system clears the cache dir.
- Log.w(Logging.LOG_TAG, "ImapTempFileLiteral: Temp file not found");
-
- // Return 0 byte stream as a dummy...
- return new ByteArrayInputStream(new byte[0]);
- }
- }
-
- @Override
- public String getString() {
- checkNotDestroyed();
- try {
- byte[] bytes = IOUtils.toByteArray(getAsStream());
- // Prevent crash from OOM; we've seen this, but only rarely and not reproducibly
- if (bytes.length > ImapResponseParser.LITERAL_KEEP_IN_MEMORY_THRESHOLD) {
- throw new IOException();
- }
- return Utility.fromAscii(bytes);
- } catch (IOException e) {
- Log.w(Logging.LOG_TAG, "ImapTempFileLiteral: Error while reading temp file", e);
- return "";
- }
- }
-
- @Override
- public void destroy() {
- try {
- if (!isDestroyed() && mFile.exists()) {
- mFile.delete();
- }
- } catch (RuntimeException re) {
- // Just log and ignore.
- Log.w(Logging.LOG_TAG, "Failed to remove temp file: " + re.getMessage());
- }
- super.destroy();
- }
-
- @Override
- public String toString() {
- return String.format("{%d byte literal(file)}", mSize);
- }
-
- public boolean tempFileExistsForTest() {
- return mFile.exists();
- }
-}
diff --git a/email2/src/com/android/email/mail/store/imap/ImapUtility.java b/email2/src/com/android/email/mail/store/imap/ImapUtility.java
deleted file mode 100644
index dc7e98e96..000000000
--- a/email2/src/com/android/email/mail/store/imap/ImapUtility.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store.imap;
-
-import com.android.emailcommon.Logging;
-
-import android.util.Log;
-
-import java.util.ArrayList;
-
-/**
- * Utility methods for use with IMAP.
- */
-public class ImapUtility {
- /**
- * Apply quoting rules per IMAP RFC,
- * quoted = DQUOTE *QUOTED-CHAR DQUOTE
- * QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> / "\" quoted-specials
- * quoted-specials = DQUOTE / "\"
- *
- * This is used primarily for IMAP login, but might be useful elsewhere.
- *
- * NOTE: Not very efficient - you may wish to preflight this, or perhaps it should check
- * for trouble chars before calling the replace functions.
- *
- * @param s The string to be quoted.
- * @return A copy of the string, having undergone quoting as described above
- */
- public static String imapQuoted(String s) {
-
- // First, quote any backslashes by replacing \ with \\
- // regex Pattern: \\ (Java string const = \\\\)
- // Substitute: \\\\ (Java string const = \\\\\\\\)
- String result = s.replaceAll("\\\\", "\\\\\\\\");
-
- // Then, quote any double-quotes by replacing " with \"
- // regex Pattern: " (Java string const = \")
- // Substitute: \\" (Java string const = \\\\\")
- result = result.replaceAll("\"", "\\\\\"");
-
- // return string with quotes around it
- return "\"" + result + "\"";
- }
-
- /**
- * Gets all of the values in a sequence set per RFC 3501. Any ranges are expanded into a
- * list of individual numbers. If the set is invalid, an empty array is returned.
- * <pre>
- * sequence-number = nz-number / "*"
- * sequence-range = sequence-number ":" sequence-number
- * sequence-set = (sequence-number / sequence-range) *("," sequence-set)
- * </pre>
- */
- public static String[] getImapSequenceValues(String set) {
- ArrayList<String> list = new ArrayList<String>();
- if (set != null) {
- String[] setItems = set.split(",");
- for (String item : setItems) {
- if (item.indexOf(':') == -1) {
- // simple item
- try {
- Integer.parseInt(item); // Don't need the value; just ensure it's valid
- list.add(item);
- } catch (NumberFormatException e) {
- Log.d(Logging.LOG_TAG, "Invalid UID value", e);
- }
- } else {
- // range
- for (String rangeItem : getImapRangeValues(item)) {
- list.add(rangeItem);
- }
- }
- }
- }
- String[] stringList = new String[list.size()];
- return list.toArray(stringList);
- }
-
- /**
- * Expand the given number range into a list of individual numbers. If the range is not valid,
- * an empty array is returned.
- * <pre>
- * sequence-number = nz-number / "*"
- * sequence-range = sequence-number ":" sequence-number
- * sequence-set = (sequence-number / sequence-range) *("," sequence-set)
- * </pre>
- */
- public static String[] getImapRangeValues(String range) {
- ArrayList<String> list = new ArrayList<String>();
- try {
- if (range != null) {
- int colonPos = range.indexOf(':');
- if (colonPos > 0) {
- int first = Integer.parseInt(range.substring(0, colonPos));
- int second = Integer.parseInt(range.substring(colonPos + 1));
- if (first < second) {
- for (int i = first; i <= second; i++) {
- list.add(Integer.toString(i));
- }
- } else {
- for (int i = first; i >= second; i--) {
- list.add(Integer.toString(i));
- }
- }
- }
- }
- } catch (NumberFormatException e) {
- Log.d(Logging.LOG_TAG, "Invalid range value", e);
- }
- String[] stringList = new String[list.size()];
- return list.toArray(stringList);
- }
-}
diff --git a/email2/src/com/android/email/mail/transport/CountingOutputStream.java b/email2/src/com/android/email/mail/transport/CountingOutputStream.java
deleted file mode 100644
index a5f10b5e4..000000000
--- a/email2/src/com/android/email/mail/transport/CountingOutputStream.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.transport;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * A simple OutputStream that does nothing but count how many bytes are written to it and
- * makes that count available to callers.
- */
-public class CountingOutputStream extends OutputStream {
- private long mCount;
-
- public CountingOutputStream() {
- }
-
- public long getCount() {
- return mCount;
- }
-
- @Override
- public void write(int oneByte) throws IOException {
- mCount++;
- }
-}
diff --git a/email2/src/com/android/email/mail/transport/DiscourseLogger.java b/email2/src/com/android/email/mail/transport/DiscourseLogger.java
deleted file mode 100644
index a8c85dbe4..000000000
--- a/email2/src/com/android/email/mail/transport/DiscourseLogger.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.transport;
-
-import com.android.emailcommon.Logging;
-
-import android.util.Log;
-
-import java.util.ArrayList;
-
-/**
- * A class to keep last N of lines sent to the server and responses received from the server.
- * They are sent to logcat when {@link #logLastDiscourse} is called.
- *
- * <p>This class is used to log the recent network activities when a response parser crashes.
- */
-public class DiscourseLogger {
- private final int mBufferSize;
- private String[] mBuffer;
- private int mPos;
- private final StringBuilder mReceivingLine = new StringBuilder(100);
-
- public DiscourseLogger(int bufferSize) {
- mBufferSize = bufferSize;
- initBuffer();
- }
-
- private void initBuffer() {
- mBuffer = new String[mBufferSize];
- }
-
- /** Add a single line to {@link #mBuffer}. */
- private void addLine(String s) {
- mBuffer[mPos] = s;
- mPos++;
- if (mPos >= mBufferSize) {
- mPos = 0;
- }
- }
-
- private void addReceivingLineToBuffer() {
- if (mReceivingLine.length() > 0) {
- addLine(mReceivingLine.toString());
- mReceivingLine.delete(0, Integer.MAX_VALUE);
- }
- }
-
- /**
- * Store a single byte received from the server in {@link #mReceivingLine}. When LF is
- * received, the content of {@link #mReceivingLine} is added to {@link #mBuffer}.
- */
- public void addReceivedByte(int b) {
- if (0x20 <= b && b <= 0x7e) { // Append only printable ASCII chars.
- mReceivingLine.append((char) b);
- } else if (b == '\n') { // LF
- addReceivingLineToBuffer();
- } else if (b == '\r') { // CR
- } else {
- final String hex = "00" + Integer.toHexString(b);
- mReceivingLine.append("\\x" + hex.substring(hex.length() - 2, hex.length()));
- }
- }
-
- /** Add a line sent to the server to {@link #mBuffer}. */
- public void addSentCommand(String command) {
- addLine(command);
- }
-
- /** @return the contents of {@link #mBuffer} as a String array. */
- /* package for testing */ String[] getLines() {
- addReceivingLineToBuffer();
-
- ArrayList<String> list = new ArrayList<String>();
-
- final int start = mPos;
- int pos = mPos;
- do {
- String s = mBuffer[pos];
- if (s != null) {
- list.add(s);
- }
- pos = (pos + 1) % mBufferSize;
- } while (pos != start);
-
- String[] ret = new String[list.size()];
- list.toArray(ret);
- return ret;
- }
-
- /**
- * Log the contents of the {@link mBuffer}, and clears it out. (So it's okay to call this
- * method successively more than once. There will be no duplicate log.)
- */
- public void logLastDiscourse() {
- String[] lines = getLines();
- if (lines.length == 0) {
- return;
- }
-
- Log.w(Logging.LOG_TAG, "Last network activities:");
- for (String r : getLines()) {
- Log.w(Logging.LOG_TAG, r);
- }
- initBuffer();
- }
-}
diff --git a/email2/src/com/android/email/mail/transport/EOLConvertingOutputStream.java b/email2/src/com/android/email/mail/transport/EOLConvertingOutputStream.java
deleted file mode 100644
index d94ec1345..000000000
--- a/email2/src/com/android/email/mail/transport/EOLConvertingOutputStream.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.transport;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-public class EOLConvertingOutputStream extends FilterOutputStream {
- int lastChar;
-
- public EOLConvertingOutputStream(OutputStream out) {
- super(out);
- }
-
- @Override
- public void write(int oneByte) throws IOException {
- if (oneByte == '\n') {
- if (lastChar != '\r') {
- super.write('\r');
- }
- }
- super.write(oneByte);
- lastChar = oneByte;
- }
-
- @Override
- public void flush() throws IOException {
- if (lastChar == '\r') {
- super.write('\n');
- lastChar = '\n';
- }
- super.flush();
- }
-}
diff --git a/email2/src/com/android/email/mail/transport/ExchangeSender.java b/email2/src/com/android/email/mail/transport/ExchangeSender.java
deleted file mode 100644
index 87ba8124b..000000000
--- a/email2/src/com/android/email/mail/transport/ExchangeSender.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.transport;
-
-import com.android.email.mail.Sender;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-
-import android.content.Context;
-
-/**
- * Our Exchange service does not use the sender/store model. This class exists for exactly one
- * purpose, which is to return "null" for getSettingActivityClass().
- */
-public class ExchangeSender extends Sender {
-
- /**
- * Factory method.
- */
- public static Sender newInstance(Account account, Context context) throws MessagingException {
- return new ExchangeSender(context, account);
- }
-
- private ExchangeSender(Context context, Account account) {
- }
-
- @Override
- public void close() {
- }
-
- @Override
- public void open() {
- }
-
- @Override
- public void sendMessage(long messageId) {
- }
-
- /**
- * Get class of SettingActivity for this Sender class.
- * @return Activity class that has class method actionEditOutgoingSettings(), or null if
- * outgoing settings should not be presented (e.g. they're handled by the incoming settings
- * screen).
- */
- @Override
- public Class<? extends android.app.Activity> getSettingActivityClass() {
- return null;
- }
-
-}
diff --git a/email2/src/com/android/email/mail/transport/MailTransport.java b/email2/src/com/android/email/mail/transport/MailTransport.java
deleted file mode 100644
index 7f59f46f7..000000000
--- a/email2/src/com/android/email/mail/transport/MailTransport.java
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.transport;
-
-import com.android.email.mail.Transport;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.CertificateValidationException;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.utility.SSLUtils;
-
-import android.util.Log;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.net.SocketAddress;
-import java.net.SocketException;
-
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLException;
-import javax.net.ssl.SSLPeerUnverifiedException;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.SSLSocket;
-
-/**
- * This class implements the common aspects of "transport", one layer below the
- * specific wire protocols such as POP3, IMAP, or SMTP.
- */
-public class MailTransport implements Transport {
-
- // TODO protected eventually
- /*protected*/ public static final int SOCKET_CONNECT_TIMEOUT = 10000;
- /*protected*/ public static final int SOCKET_READ_TIMEOUT = 60000;
-
- private static final HostnameVerifier HOSTNAME_VERIFIER =
- HttpsURLConnection.getDefaultHostnameVerifier();
-
- private String mDebugLabel;
-
- private String mHost;
- private int mPort;
- private String[] mUserInfoParts;
-
- /**
- * One of the {@code Transport.CONNECTION_SECURITY_*} values.
- */
- private int mConnectionSecurity;
-
- /**
- * Whether or not to trust all server certificates (i.e. skip host verification) in SSL
- * handshakes
- */
- private boolean mTrustCertificates;
-
- private Socket mSocket;
- private InputStream mIn;
- private OutputStream mOut;
-
- /**
- * Simple constructor for starting from scratch. Call setUri() and setSecurity() to
- * complete the configuration.
- * @param debugLabel Label used for Log.d calls
- */
- public MailTransport(String debugLabel) {
- super();
- mDebugLabel = debugLabel;
- }
-
- /**
- * Returns a new transport, using the current transport as a model. The new transport is
- * configured identically (as if {@link #setSecurity(int, boolean)}, {@link #setPort(int)}
- * and {@link #setHost(String)} were invoked), but not opened or connected in any way.
- */
- @Override
- public Transport clone() {
- MailTransport newObject = new MailTransport(mDebugLabel);
-
- newObject.mDebugLabel = mDebugLabel;
- newObject.mHost = mHost;
- newObject.mPort = mPort;
- if (mUserInfoParts != null) {
- newObject.mUserInfoParts = mUserInfoParts.clone();
- }
- newObject.mConnectionSecurity = mConnectionSecurity;
- newObject.mTrustCertificates = mTrustCertificates;
- return newObject;
- }
-
- @Override
- public void setHost(String host) {
- mHost = host;
- }
-
- @Override
- public void setPort(int port) {
- mPort = port;
- }
-
- @Override
- public String getHost() {
- return mHost;
- }
-
- @Override
- public int getPort() {
- return mPort;
- }
-
- @Override
- public void setSecurity(int connectionSecurity, boolean trustAllCertificates) {
- mConnectionSecurity = connectionSecurity;
- mTrustCertificates = trustAllCertificates;
- }
-
- @Override
- public int getSecurity() {
- return mConnectionSecurity;
- }
-
- @Override
- public boolean canTrySslSecurity() {
- return mConnectionSecurity == Transport.CONNECTION_SECURITY_SSL;
- }
-
- @Override
- public boolean canTryTlsSecurity() {
- return mConnectionSecurity == Transport.CONNECTION_SECURITY_TLS;
- }
-
- @Override
- public boolean canTrustAllCertificates() {
- return mTrustCertificates;
- }
-
- /**
- * Attempts to open a connection using the Uri supplied for connection parameters. Will attempt
- * an SSL connection if indicated.
- */
- @Override
- public void open() throws MessagingException, CertificateValidationException {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "*** " + mDebugLabel + " open " +
- getHost() + ":" + String.valueOf(getPort()));
- }
-
- try {
- SocketAddress socketAddress = new InetSocketAddress(getHost(), getPort());
- if (canTrySslSecurity()) {
- mSocket = SSLUtils.getSSLSocketFactory(canTrustAllCertificates()).createSocket();
- } else {
- mSocket = new Socket();
- }
- mSocket.connect(socketAddress, SOCKET_CONNECT_TIMEOUT);
- // After the socket connects to an SSL server, confirm that the hostname is as expected
- if (canTrySslSecurity() && !canTrustAllCertificates()) {
- verifyHostname(mSocket, getHost());
- }
- mIn = new BufferedInputStream(mSocket.getInputStream(), 1024);
- mOut = new BufferedOutputStream(mSocket.getOutputStream(), 512);
-
- } catch (SSLException e) {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, e.toString());
- }
- throw new CertificateValidationException(e.getMessage(), e);
- } catch (IOException ioe) {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, ioe.toString());
- }
- throw new MessagingException(MessagingException.IOERROR, ioe.toString());
- }
- }
-
- /**
- * Attempts to reopen a TLS connection using the Uri supplied for connection parameters.
- *
- * NOTE: No explicit hostname verification is required here, because it's handled automatically
- * by the call to createSocket().
- *
- * TODO should we explicitly close the old socket? This seems funky to abandon it.
- */
- @Override
- public void reopenTls() throws MessagingException {
- try {
- mSocket = SSLUtils.getSSLSocketFactory(canTrustAllCertificates())
- .createSocket(mSocket, getHost(), getPort(), true);
- mSocket.setSoTimeout(SOCKET_READ_TIMEOUT);
- mIn = new BufferedInputStream(mSocket.getInputStream(), 1024);
- mOut = new BufferedOutputStream(mSocket.getOutputStream(), 512);
-
- } catch (SSLException e) {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, e.toString());
- }
- throw new CertificateValidationException(e.getMessage(), e);
- } catch (IOException ioe) {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, ioe.toString());
- }
- throw new MessagingException(MessagingException.IOERROR, ioe.toString());
- }
- }
-
- /**
- * Lightweight version of SSLCertificateSocketFactory.verifyHostname, which provides this
- * service but is not in the public API.
- *
- * Verify the hostname of the certificate used by the other end of a
- * connected socket. You MUST call this if you did not supply a hostname
- * to SSLCertificateSocketFactory.createSocket(). It is harmless to call this method
- * redundantly if the hostname has already been verified.
- *
- * <p>Wildcard certificates are allowed to verify any matching hostname,
- * so "foo.bar.example.com" is verified if the peer has a certificate
- * for "*.example.com".
- *
- * @param socket An SSL socket which has been connected to a server
- * @param hostname The expected hostname of the remote server
- * @throws IOException if something goes wrong handshaking with the server
- * @throws SSLPeerUnverifiedException if the server cannot prove its identity
- */
- private void verifyHostname(Socket socket, String hostname) throws IOException {
- // The code at the start of OpenSSLSocketImpl.startHandshake()
- // ensures that the call is idempotent, so we can safely call it.
- SSLSocket ssl = (SSLSocket) socket;
- ssl.startHandshake();
-
- SSLSession session = ssl.getSession();
- if (session == null) {
- throw new SSLException("Cannot verify SSL socket without session");
- }
- // TODO: Instead of reporting the name of the server we think we're connecting to,
- // we should be reporting the bad name in the certificate. Unfortunately this is buried
- // in the verifier code and is not available in the verifier API, and extracting the
- // CN & alts is beyond the scope of this patch.
- if (!HOSTNAME_VERIFIER.verify(hostname, session)) {
- throw new SSLPeerUnverifiedException(
- "Certificate hostname not useable for server: " + hostname);
- }
- }
-
- /**
- * Set the socket timeout.
- * @param timeoutMilliseconds the read timeout value if greater than {@code 0}, or
- * {@code 0} for an infinite timeout.
- */
- @Override
- public void setSoTimeout(int timeoutMilliseconds) throws SocketException {
- mSocket.setSoTimeout(timeoutMilliseconds);
- }
-
- @Override
- public boolean isOpen() {
- return (mIn != null && mOut != null &&
- mSocket != null && mSocket.isConnected() && !mSocket.isClosed());
- }
-
- /**
- * Close the connection. MUST NOT return any exceptions - must be "best effort" and safe.
- */
- @Override
- public void close() {
- try {
- mIn.close();
- } catch (Exception e) {
- // May fail if the connection is already closed.
- }
- try {
- mOut.close();
- } catch (Exception e) {
- // May fail if the connection is already closed.
- }
- try {
- mSocket.close();
- } catch (Exception e) {
- // May fail if the connection is already closed.
- }
- mIn = null;
- mOut = null;
- mSocket = null;
- }
-
- @Override
- public InputStream getInputStream() {
- return mIn;
- }
-
- @Override
- public OutputStream getOutputStream() {
- return mOut;
- }
-
- /**
- * Writes a single line to the server using \r\n termination.
- */
- @Override
- public void writeLine(String s, String sensitiveReplacement) throws IOException {
- if (MailActivityEmail.DEBUG) {
- if (sensitiveReplacement != null && !Logging.DEBUG_SENSITIVE) {
- Log.d(Logging.LOG_TAG, ">>> " + sensitiveReplacement);
- } else {
- Log.d(Logging.LOG_TAG, ">>> " + s);
- }
- }
-
- OutputStream out = getOutputStream();
- out.write(s.getBytes());
- out.write('\r');
- out.write('\n');
- out.flush();
- }
-
- /**
- * Reads a single line from the server, using either \r\n or \n as the delimiter. The
- * delimiter char(s) are not included in the result.
- */
- @Override
- public String readLine() throws IOException {
- StringBuffer sb = new StringBuffer();
- InputStream in = getInputStream();
- int d;
- while ((d = in.read()) != -1) {
- if (((char)d) == '\r') {
- continue;
- } else if (((char)d) == '\n') {
- break;
- } else {
- sb.append((char)d);
- }
- }
- if (d == -1 && MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "End of stream reached while trying to read line.");
- }
- String ret = sb.toString();
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "<<< " + ret);
- }
- return ret;
- }
-
- @Override
- public InetAddress getLocalAddress() {
- if (isOpen()) {
- return mSocket.getLocalAddress();
- } else {
- return null;
- }
- }
-}
diff --git a/email2/src/com/android/email/mail/transport/SmtpSender.java b/email2/src/com/android/email/mail/transport/SmtpSender.java
deleted file mode 100644
index 3ceb3307b..000000000
--- a/email2/src/com/android/email/mail/transport/SmtpSender.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.transport;
-
-import android.content.Context;
-import android.util.Base64;
-import android.util.Log;
-
-import com.android.email.mail.Sender;
-import com.android.email.mail.Transport;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.internet.Rfc822Output;
-import com.android.emailcommon.mail.Address;
-import com.android.emailcommon.mail.AuthenticationFailedException;
-import com.android.emailcommon.mail.CertificateValidationException;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.HostAuth;
-
-import java.io.IOException;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-
-import javax.net.ssl.SSLException;
-
-/**
- * This class handles all of the protocol-level aspects of sending messages via SMTP.
- * TODO Remove dependence upon URI; there's no reason why we need it here
- */
-public class SmtpSender extends Sender {
-
- private final Context mContext;
- private Transport mTransport;
- private String mUsername;
- private String mPassword;
-
- /**
- * Static named constructor.
- */
- public static Sender newInstance(Account account, Context context) throws MessagingException {
- return new SmtpSender(context, account);
- }
-
- /**
- * Creates a new sender for the given account.
- */
- private SmtpSender(Context context, Account account) throws MessagingException {
- mContext = context;
- HostAuth sendAuth = account.getOrCreateHostAuthSend(context);
- if (sendAuth == null || !"smtp".equalsIgnoreCase(sendAuth.mProtocol)) {
- throw new MessagingException("Unsupported protocol");
- }
- // defaults, which can be changed by security modifiers
- int connectionSecurity = Transport.CONNECTION_SECURITY_NONE;
- int defaultPort = 587;
-
- // check for security flags and apply changes
- if ((sendAuth.mFlags & HostAuth.FLAG_SSL) != 0) {
- connectionSecurity = Transport.CONNECTION_SECURITY_SSL;
- defaultPort = 465;
- } else if ((sendAuth.mFlags & HostAuth.FLAG_TLS) != 0) {
- connectionSecurity = Transport.CONNECTION_SECURITY_TLS;
- }
- boolean trustCertificates = ((sendAuth.mFlags & HostAuth.FLAG_TRUST_ALL) != 0);
- int port = defaultPort;
- if (sendAuth.mPort != HostAuth.PORT_UNKNOWN) {
- port = sendAuth.mPort;
- }
- mTransport = new MailTransport("IMAP");
- mTransport.setHost(sendAuth.mAddress);
- mTransport.setPort(port);
- mTransport.setSecurity(connectionSecurity, trustCertificates);
-
- String[] userInfoParts = sendAuth.getLogin();
- if (userInfoParts != null) {
- mUsername = userInfoParts[0];
- mPassword = userInfoParts[1];
- }
- }
-
- /**
- * For testing only. Injects a different transport. The transport should already be set
- * up and ready to use. Do not use for real code.
- * @param testTransport The Transport to inject and use for all future communication.
- */
- /* package */ void setTransport(Transport testTransport) {
- mTransport = testTransport;
- }
-
- @Override
- public void open() throws MessagingException {
- try {
- mTransport.open();
-
- // Eat the banner
- executeSimpleCommand(null);
-
- String localHost = "localhost";
- // Try to get local address in the proper format.
- InetAddress localAddress = mTransport.getLocalAddress();
- if (localAddress != null) {
- // Address Literal formatted in accordance to RFC2821 Sec. 4.1.3
- StringBuilder sb = new StringBuilder();
- sb.append('[');
- if (localAddress instanceof Inet6Address) {
- sb.append("IPv6:");
- }
- sb.append(localAddress.getHostAddress());
- sb.append(']');
- localHost = sb.toString();
- }
- String result = executeSimpleCommand("EHLO " + localHost);
-
- /*
- * TODO may need to add code to fall back to HELO I switched it from
- * using HELO on non STARTTLS connections because of AOL's mail
- * server. It won't let you use AUTH without EHLO.
- * We should really be paying more attention to the capabilities
- * and only attempting auth if it's available, and warning the user
- * if not.
- */
- if (mTransport.canTryTlsSecurity()) {
- if (result.contains("STARTTLS")) {
- executeSimpleCommand("STARTTLS");
- mTransport.reopenTls();
- /*
- * Now resend the EHLO. Required by RFC2487 Sec. 5.2, and more specifically,
- * Exim.
- */
- result = executeSimpleCommand("EHLO " + localHost);
- } else {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "TLS not supported but required");
- }
- throw new MessagingException(MessagingException.TLS_REQUIRED);
- }
- }
-
- /*
- * result contains the results of the EHLO in concatenated form
- */
- boolean authLoginSupported = result.matches(".*AUTH.*LOGIN.*$");
- boolean authPlainSupported = result.matches(".*AUTH.*PLAIN.*$");
-
- if (mUsername != null && mUsername.length() > 0 && mPassword != null
- && mPassword.length() > 0) {
- if (authPlainSupported) {
- saslAuthPlain(mUsername, mPassword);
- }
- else if (authLoginSupported) {
- saslAuthLogin(mUsername, mPassword);
- }
- else {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "No valid authentication mechanism found.");
- }
- throw new MessagingException(MessagingException.AUTH_REQUIRED);
- }
- }
- } catch (SSLException e) {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, e.toString());
- }
- throw new CertificateValidationException(e.getMessage(), e);
- } catch (IOException ioe) {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, ioe.toString());
- }
- throw new MessagingException(MessagingException.IOERROR, ioe.toString());
- }
- }
-
- @Override
- public void sendMessage(long messageId) throws MessagingException {
- close();
- open();
-
- Message message = Message.restoreMessageWithId(mContext, messageId);
- if (message == null) {
- throw new MessagingException("Trying to send non-existent message id="
- + Long.toString(messageId));
- }
- Address from = Address.unpackFirst(message.mFrom);
- Address[] to = Address.unpack(message.mTo);
- Address[] cc = Address.unpack(message.mCc);
- Address[] bcc = Address.unpack(message.mBcc);
-
- try {
- executeSimpleCommand("MAIL FROM: " + "<" + from.getAddress() + ">");
- for (Address address : to) {
- executeSimpleCommand("RCPT TO: " + "<" + address.getAddress() + ">");
- }
- for (Address address : cc) {
- executeSimpleCommand("RCPT TO: " + "<" + address.getAddress() + ">");
- }
- for (Address address : bcc) {
- executeSimpleCommand("RCPT TO: " + "<" + address.getAddress() + ">");
- }
- executeSimpleCommand("DATA");
- // TODO byte stuffing
- Rfc822Output.writeTo(mContext, messageId,
- new EOLConvertingOutputStream(mTransport.getOutputStream()),
- false /* do not use smart reply */,
- false /* do not send BCC */);
- executeSimpleCommand("\r\n.");
- } catch (IOException ioe) {
- throw new MessagingException("Unable to send message", ioe);
- }
- }
-
- /**
- * Close the protocol (and the transport below it).
- *
- * MUST NOT return any exceptions.
- */
- @Override
- public void close() {
- mTransport.close();
- }
-
- /**
- * Send a single command and wait for a single response. Handles responses that continue
- * onto multiple lines. Throws MessagingException if response code is 4xx or 5xx. All traffic
- * is logged (if debug logging is enabled) so do not use this function for user ID or password.
- *
- * @param command The command string to send to the server.
- * @return Returns the response string from the server.
- */
- private String executeSimpleCommand(String command) throws IOException, MessagingException {
- return executeSensitiveCommand(command, null);
- }
-
- /**
- * Send a single command and wait for a single response. Handles responses that continue
- * onto multiple lines. Throws MessagingException if response code is 4xx or 5xx.
- *
- * @param command The command string to send to the server.
- * @param sensitiveReplacement If the command includes sensitive data (e.g. authentication)
- * please pass a replacement string here (for logging).
- * @return Returns the response string from the server.
- */
- private String executeSensitiveCommand(String command, String sensitiveReplacement)
- throws IOException, MessagingException {
- if (command != null) {
- mTransport.writeLine(command, sensitiveReplacement);
- }
-
- String line = mTransport.readLine();
-
- String result = line;
-
- while (line.length() >= 4 && line.charAt(3) == '-') {
- line = mTransport.readLine();
- result += line.substring(3);
- }
-
- if (result.length() > 0) {
- char c = result.charAt(0);
- if ((c == '4') || (c == '5')) {
- throw new MessagingException(result);
- }
- }
-
- return result;
- }
-
-
-// C: AUTH LOGIN
-// S: 334 VXNlcm5hbWU6
-// C: d2VsZG9u
-// S: 334 UGFzc3dvcmQ6
-// C: dzNsZDBu
-// S: 235 2.0.0 OK Authenticated
-//
-// Lines 2-5 of the conversation contain base64-encoded information. The same conversation, with base64 strings decoded, reads:
-//
-//
-// C: AUTH LOGIN
-// S: 334 Username:
-// C: weldon
-// S: 334 Password:
-// C: w3ld0n
-// S: 235 2.0.0 OK Authenticated
-
- private void saslAuthLogin(String username, String password) throws MessagingException,
- AuthenticationFailedException, IOException {
- try {
- executeSimpleCommand("AUTH LOGIN");
- executeSensitiveCommand(
- Base64.encodeToString(username.getBytes(), Base64.NO_WRAP),
- "/username redacted/");
- executeSensitiveCommand(
- Base64.encodeToString(password.getBytes(), Base64.NO_WRAP),
- "/password redacted/");
- }
- catch (MessagingException me) {
- if (me.getMessage().length() > 1 && me.getMessage().charAt(1) == '3') {
- throw new AuthenticationFailedException(me.getMessage());
- }
- throw me;
- }
- }
-
- private void saslAuthPlain(String username, String password) throws MessagingException,
- AuthenticationFailedException, IOException {
- byte[] data = ("\000" + username + "\000" + password).getBytes();
- data = Base64.encode(data, Base64.NO_WRAP);
- try {
- executeSensitiveCommand("AUTH PLAIN " + new String(data), "AUTH PLAIN /redacted/");
- }
- catch (MessagingException me) {
- if (me.getMessage().length() > 1 && me.getMessage().charAt(1) == '3') {
- throw new AuthenticationFailedException(me.getMessage());
- }
- throw me;
- }
- }
-}
diff --git a/email2/src/com/android/email/mail/transport/StatusOutputStream.java b/email2/src/com/android/email/mail/transport/StatusOutputStream.java
deleted file mode 100644
index 3ffcdc7e6..000000000
--- a/email2/src/com/android/email/mail/transport/StatusOutputStream.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.transport;
-
-import com.android.emailcommon.Logging;
-
-import android.util.Log;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-public class StatusOutputStream extends FilterOutputStream {
- private long mCount = 0;
-
- public StatusOutputStream(OutputStream out) {
- super(out);
- }
-
- @Override
- public void write(int oneByte) throws IOException {
- super.write(oneByte);
- mCount++;
- if (Logging.LOGD) {
- if (mCount % 1024 == 0) {
- Log.v(Logging.LOG_TAG, "# " + mCount);
- }
- }
- }
-}
diff --git a/email2/src/com/android/email/provider/AccountBackupRestore.java b/email2/src/com/android/email/provider/AccountBackupRestore.java
deleted file mode 100644
index cb615618a..000000000
--- a/email2/src/com/android/email/provider/AccountBackupRestore.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.provider;
-
-import android.content.ContentResolver;
-import android.content.Context;
-
-/**
- * Helper class to facilitate EmailProvider's account backup/restore facility.
- *
- * Account backup/restore was implemented entirely for the purpose of recovering from database
- * corruption errors that were/are sporadic and of undetermined cause (though the prevailing wisdom
- * is that this is due to some kind of memory issue). Rather than have the offending database get
- * deleted by SQLiteDatabase and forcing the user to recreate his accounts from scratch, it was
- * decided to backup accounts when created/modified and then restore them if 1) there are no
- * accounts in the database and 2) there are backup accounts. This, at least, would cause user's
- * email data for IMAP/EAS to be re-synced and prevent the worst outcomes from occurring.
- *
- * To accomplish backup/restore, we use the facility now built in to EmailProvider to store a
- * backup version of the Account and HostAuth tables in a second database (EmailProviderBackup.db)
- *
- * TODO: We might look into having our own DatabaseErrorHandler that tries to be clever about
- * determining whether or not a "corrupt" database is truly corrupt; the problem here is that it
- * has proven impossible to reproduce the bug, and therefore any "solution" of this kind of utterly
- * impossible to test in the wild.
- */
-public class AccountBackupRestore {
- /**
- * Backup user Account and HostAuth data into our backup database
- *
- * TODO Make EmailProvider do this automatically.
- */
- public static void backup(Context context) {
- ContentResolver resolver = context.getContentResolver();
- resolver.update(EmailProvider.ACCOUNT_BACKUP_URI, null, null, null);
- }
-}
diff --git a/email2/src/com/android/email/provider/AccountReconciler.java b/email2/src/com/android/email/provider/AccountReconciler.java
deleted file mode 100644
index d564c6623..000000000
--- a/email2/src/com/android/email/provider/AccountReconciler.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.provider;
-
-import android.accounts.AccountManager;
-import android.accounts.AccountManagerFuture;
-import android.accounts.AuthenticatorException;
-import android.accounts.OperationCanceledException;
-import android.content.Context;
-import android.net.Uri;
-import android.util.Log;
-
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.io.IOException;
-import java.util.List;
-
-public class AccountReconciler {
- // AccountManager accounts with a name beginning with this constant are ignored for purposes
- // of reconcilation. This is for unit test purposes only; the caller may NOT be in the same
- // package as this class, so we make the constant public.
- @VisibleForTesting
- static final String ACCOUNT_MANAGER_ACCOUNT_TEST_PREFIX = " _";
-
- /**
- * Checks two account lists to see if there is any reconciling to be done. Can be done on the
- * UI thread.
- * @param context the app context
- * @param emailProviderAccounts accounts as reported in the Email provider
- * @param accountManagerAccounts accounts as reported by the system account manager, for the
- * particular protocol types that match emailProviderAccounts
- */
- public static boolean accountsNeedReconciling(
- final Context context,
- List<Account> emailProviderAccounts,
- android.accounts.Account[] accountManagerAccounts) {
-
- return reconcileAccountsInternal(
- context, emailProviderAccounts, accountManagerAccounts,
- context, false /* performReconciliation */);
- }
-
- /**
- * Compare our account list (obtained from EmailProvider) with the account list owned by
- * AccountManager. If there are any orphans (an account in one list without a corresponding
- * account in the other list), delete the orphan, as these must remain in sync.
- *
- * Note that the duplication of account information is caused by the Email application's
- * incomplete integration with AccountManager.
- *
- * This function may not be called from the main/UI thread, because it makes blocking calls
- * into the account manager.
- *
- * @param context The context in which to operate
- * @param emailProviderAccounts the exchange provider accounts to work from
- * @param accountManagerAccounts The account manager accounts to work from
- * @param providerContext application provider context
- */
- public static void reconcileAccounts(
- Context context,
- List<Account> emailProviderAccounts,
- android.accounts.Account[] accountManagerAccounts,
- Context providerContext) {
- reconcileAccountsInternal(
- context, emailProviderAccounts, accountManagerAccounts,
- providerContext, true /* performReconciliation */);
- }
-
- /**
- * Internal method to actually perform reconciliation, or simply check that it needs to be done
- * and avoid doing any heavy work, depending on the value of the passed in
- * {@code performReconciliation}.
- */
- private static boolean reconcileAccountsInternal(
- Context context,
- List<Account> emailProviderAccounts,
- android.accounts.Account[] accountManagerAccounts,
- Context providerContext,
- boolean performReconciliation) {
- boolean needsReconciling = false;
-
- // First, look through our EmailProvider accounts to make sure there's a corresponding
- // AccountManager account
- for (Account providerAccount: emailProviderAccounts) {
- String providerAccountName = providerAccount.mEmailAddress;
- boolean found = false;
- for (android.accounts.Account accountManagerAccount: accountManagerAccounts) {
- if (accountManagerAccount.name.equalsIgnoreCase(providerAccountName)) {
- found = true;
- break;
- }
- }
- if (!found) {
- if ((providerAccount.mFlags & Account.FLAGS_INCOMPLETE) != 0) {
- Log.w(Logging.LOG_TAG,
- "Account reconciler noticed incomplete account; ignoring");
- continue;
- }
-
- needsReconciling = true;
- if (performReconciliation) {
- // This account has been deleted in the AccountManager!
- Log.d(Logging.LOG_TAG,
- "Account deleted in AccountManager; deleting from provider: " +
- providerAccountName);
- Uri uri = EmailProvider.uiUri("uiaccount", providerAccount.mId);
- context.getContentResolver().delete(uri, null, null);
- }
- }
- }
- // Now, look through AccountManager accounts to make sure we have a corresponding cached EAS
- // account from EmailProvider
- for (android.accounts.Account accountManagerAccount: accountManagerAccounts) {
- String accountManagerAccountName = accountManagerAccount.name;
- boolean found = false;
- for (Account cachedEasAccount: emailProviderAccounts) {
- if (cachedEasAccount.mEmailAddress.equalsIgnoreCase(accountManagerAccountName)) {
- found = true;
- }
- }
- if (accountManagerAccountName.startsWith(ACCOUNT_MANAGER_ACCOUNT_TEST_PREFIX)) {
- found = true;
- }
- if (!found) {
- // This account has been deleted from the EmailProvider database
- needsReconciling = true;
-
- if (performReconciliation) {
- Log.d(Logging.LOG_TAG,
- "Account deleted from provider; deleting from AccountManager: " +
- accountManagerAccountName);
- // Delete the account
- AccountManagerFuture<Boolean> blockingResult = AccountManager.get(context)
- .removeAccount(accountManagerAccount, null, null);
- try {
- // Note: All of the potential errors from removeAccount() are simply logged
- // here, as there is nothing to actually do about them.
- blockingResult.getResult();
- } catch (OperationCanceledException e) {
- Log.w(Logging.LOG_TAG, e.toString());
- } catch (AuthenticatorException e) {
- Log.w(Logging.LOG_TAG, e.toString());
- } catch (IOException e) {
- Log.w(Logging.LOG_TAG, e.toString());
- }
- }
- }
- }
-
- return needsReconciling;
- }
-}
diff --git a/email2/src/com/android/email/provider/AttachmentProvider.java b/email2/src/com/android/email/provider/AttachmentProvider.java
deleted file mode 100644
index 71955851e..000000000
--- a/email2/src/com/android/email/provider/AttachmentProvider.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.provider;
-
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.internet.MimeUtility;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
-import com.android.emailcommon.utility.AttachmentUtilities;
-import com.android.emailcommon.utility.AttachmentUtilities.Columns;
-
-import android.content.ContentProvider;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.net.Uri;
-import android.os.Binder;
-import android.os.ParcelFileDescriptor;
-import android.util.Log;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-/*
- * A simple ContentProvider that allows file access to Email's attachments.
- *
- * The URI scheme is as follows. For raw file access:
- * content://com.android.email.attachmentprovider/acct#/attach#/RAW
- *
- * And for access to thumbnails:
- * content://com.android.email.attachmentprovider/acct#/attach#/THUMBNAIL/width#/height#
- *
- * The on-disk (storage) schema is as follows.
- *
- * Attachments are stored at: <database-path>/account#.db_att/item#
- * Thumbnails are stored at: <cache-path>/thmb_account#_item#
- *
- * Using the standard application context, account #10 and attachment # 20, this would be:
- * /data/data/com.android.email/databases/10.db_att/20
- * /data/data/com.android.email/cache/thmb_10_20
- */
-public class AttachmentProvider extends ContentProvider {
-
- private static final String[] MIME_TYPE_PROJECTION = new String[] {
- AttachmentColumns.MIME_TYPE, AttachmentColumns.FILENAME };
- private static final int MIME_TYPE_COLUMN_MIME_TYPE = 0;
- private static final int MIME_TYPE_COLUMN_FILENAME = 1;
-
- private static final String[] PROJECTION_QUERY = new String[] { AttachmentColumns.FILENAME,
- AttachmentColumns.SIZE, AttachmentColumns.CONTENT_URI };
-
- @Override
- public boolean onCreate() {
- /*
- * We use the cache dir as a temporary directory (since Android doesn't give us one) so
- * on startup we'll clean up any .tmp files from the last run.
- */
- File[] files = getContext().getCacheDir().listFiles();
- for (File file : files) {
- String filename = file.getName();
- if (filename.endsWith(".tmp") || filename.startsWith("thmb_")) {
- file.delete();
- }
- }
- return true;
- }
-
- /**
- * Returns the mime type for a given attachment. There are three possible results:
- * - If thumbnail Uri, always returns "image/png" (even if there's no attachment)
- * - If the attachment does not exist, returns null
- * - Returns the mime type of the attachment
- */
- @Override
- public String getType(Uri uri) {
- long callingId = Binder.clearCallingIdentity();
- try {
- List<String> segments = uri.getPathSegments();
- String id = segments.get(1);
- String format = segments.get(2);
- if (AttachmentUtilities.FORMAT_THUMBNAIL.equals(format)) {
- return "image/png";
- } else {
- uri = ContentUris.withAppendedId(Attachment.CONTENT_URI, Long.parseLong(id));
- Cursor c = getContext().getContentResolver().query(uri, MIME_TYPE_PROJECTION, null,
- null, null);
- try {
- if (c.moveToFirst()) {
- String mimeType = c.getString(MIME_TYPE_COLUMN_MIME_TYPE);
- String fileName = c.getString(MIME_TYPE_COLUMN_FILENAME);
- mimeType = AttachmentUtilities.inferMimeType(fileName, mimeType);
- return mimeType;
- }
- } finally {
- c.close();
- }
- return null;
- }
- } finally {
- Binder.restoreCallingIdentity(callingId);
- }
- }
-
- /**
- * Open an attachment file. There are two "formats" - "raw", which returns an actual file,
- * and "thumbnail", which attempts to generate a thumbnail image.
- *
- * Thumbnails are cached for easy space recovery and cleanup.
- *
- * TODO: The thumbnail format returns null for its failure cases, instead of throwing
- * FileNotFoundException, and should be fixed for consistency.
- *
- * @throws FileNotFoundException
- */
- @Override
- public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
- // If this is a write, the caller must have the EmailProvider permission, which is
- // based on signature only
- if (mode.equals("w")) {
- Context context = getContext();
- if (context.checkCallingOrSelfPermission(EmailContent.PROVIDER_PERMISSION)
- != PackageManager.PERMISSION_GRANTED) {
- throw new FileNotFoundException();
- }
- List<String> segments = uri.getPathSegments();
- String accountId = segments.get(0);
- String id = segments.get(1);
- File saveIn =
- AttachmentUtilities.getAttachmentDirectory(context, Long.parseLong(accountId));
- if (!saveIn.exists()) {
- saveIn.mkdirs();
- }
- File newFile = new File(saveIn, id);
- return ParcelFileDescriptor.open(
- newFile, ParcelFileDescriptor.MODE_READ_WRITE |
- ParcelFileDescriptor.MODE_CREATE | ParcelFileDescriptor.MODE_TRUNCATE);
- }
- long callingId = Binder.clearCallingIdentity();
- try {
- List<String> segments = uri.getPathSegments();
- String accountId = segments.get(0);
- String id = segments.get(1);
- String format = segments.get(2);
- if (AttachmentUtilities.FORMAT_THUMBNAIL.equals(format)) {
- int width = Integer.parseInt(segments.get(3));
- int height = Integer.parseInt(segments.get(4));
- String filename = "thmb_" + accountId + "_" + id;
- File dir = getContext().getCacheDir();
- File file = new File(dir, filename);
- if (!file.exists()) {
- Uri attachmentUri = AttachmentUtilities.
- getAttachmentUri(Long.parseLong(accountId), Long.parseLong(id));
- Cursor c = query(attachmentUri,
- new String[] { Columns.DATA }, null, null, null);
- if (c != null) {
- try {
- if (c.moveToFirst()) {
- attachmentUri = Uri.parse(c.getString(0));
- } else {
- return null;
- }
- } finally {
- c.close();
- }
- }
- String type = getContext().getContentResolver().getType(attachmentUri);
- try {
- InputStream in =
- getContext().getContentResolver().openInputStream(attachmentUri);
- Bitmap thumbnail = createThumbnail(type, in);
- if (thumbnail == null) {
- return null;
- }
- thumbnail = Bitmap.createScaledBitmap(thumbnail, width, height, true);
- FileOutputStream out = new FileOutputStream(file);
- thumbnail.compress(Bitmap.CompressFormat.PNG, 100, out);
- out.close();
- in.close();
- } catch (IOException ioe) {
- Log.d(Logging.LOG_TAG, "openFile/thumbnail failed with " +
- ioe.getMessage());
- return null;
- } catch (OutOfMemoryError oome) {
- Log.d(Logging.LOG_TAG, "openFile/thumbnail failed with " +
- oome.getMessage());
- return null;
- }
- }
- return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
- }
- else {
- return ParcelFileDescriptor.open(
- new File(getContext().getDatabasePath(accountId + ".db_att"), id),
- ParcelFileDescriptor.MODE_READ_ONLY);
- }
- } finally {
- Binder.restoreCallingIdentity(callingId);
- }
- }
-
- @Override
- public int delete(Uri uri, String arg1, String[] arg2) {
- return 0;
- }
-
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- return null;
- }
-
- /**
- * Returns a cursor based on the data in the attachments table, or null if the attachment
- * is not recorded in the table.
- *
- * Supports REST Uri only, for a single row - selection, selection args, and sortOrder are
- * ignored (non-null values should probably throw an exception....)
- */
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- long callingId = Binder.clearCallingIdentity();
- try {
- if (projection == null) {
- projection =
- new String[] {
- Columns._ID,
- Columns.DATA,
- };
- }
-
- List<String> segments = uri.getPathSegments();
- String accountId = segments.get(0);
- String id = segments.get(1);
- String format = segments.get(2);
- String name = null;
- int size = -1;
- String contentUri = null;
-
- uri = ContentUris.withAppendedId(Attachment.CONTENT_URI, Long.parseLong(id));
- Cursor c = getContext().getContentResolver().query(uri, PROJECTION_QUERY,
- null, null, null);
- try {
- if (c.moveToFirst()) {
- name = c.getString(0);
- size = c.getInt(1);
- contentUri = c.getString(2);
- } else {
- return null;
- }
- } finally {
- c.close();
- }
-
- MatrixCursor ret = new MatrixCursor(projection);
- Object[] values = new Object[projection.length];
- for (int i = 0, count = projection.length; i < count; i++) {
- String column = projection[i];
- if (Columns._ID.equals(column)) {
- values[i] = id;
- }
- else if (Columns.DATA.equals(column)) {
- values[i] = contentUri;
- }
- else if (Columns.DISPLAY_NAME.equals(column)) {
- values[i] = name;
- }
- else if (Columns.SIZE.equals(column)) {
- values[i] = size;
- }
- }
- ret.addRow(values);
- return ret;
- } finally {
- Binder.restoreCallingIdentity(callingId);
- }
- }
-
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- return 0;
- }
-
- private Bitmap createThumbnail(String type, InputStream data) {
- if(MimeUtility.mimeTypeMatches(type, "image/*")) {
- return createImageThumbnail(data);
- }
- return null;
- }
-
- private Bitmap createImageThumbnail(InputStream data) {
- try {
- Bitmap bitmap = BitmapFactory.decodeStream(data);
- return bitmap;
- } catch (OutOfMemoryError oome) {
- Log.d(Logging.LOG_TAG, "createImageThumbnail failed with " + oome.getMessage());
- return null;
- } catch (Exception e) {
- Log.d(Logging.LOG_TAG, "createImageThumbnail failed with " + e.getMessage());
- return null;
- }
- }
-
- /**
- * Need this to suppress warning in unit tests.
- */
- @Override
- public void shutdown() {
- // Don't call super.shutdown(), which emits a warning...
- }
-}
diff --git a/email2/src/com/android/email/provider/ContentCache.java b/email2/src/com/android/email/provider/ContentCache.java
deleted file mode 100644
index 0968fd21a..000000000
--- a/email2/src/com/android/email/provider/ContentCache.java
+++ /dev/null
@@ -1,850 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.provider;
-
-import android.content.ContentValues;
-import android.database.CrossProcessCursor;
-import android.database.Cursor;
-import android.database.CursorWindow;
-import android.database.CursorWrapper;
-import android.database.MatrixCursor;
-import android.net.Uri;
-import android.util.Log;
-import android.util.LruCache;
-
-import com.android.email2.ui.MailActivityEmail;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * An LRU cache for EmailContent (Account, HostAuth, Mailbox, and Message, thus far). The intended
- * user of this cache is EmailProvider itself; caching is entirely transparent to users of the
- * provider.
- *
- * Usage examples; id is a String representation of a row id (_id), as it might be retrieved from
- * a uri via getPathSegment
- *
- * To create a cache:
- * ContentCache cache = new ContentCache(name, projection, max);
- *
- * To (try to) get a cursor from a cache:
- * Cursor cursor = cache.getCursor(id, projection);
- *
- * To read from a table and cache the resulting cursor:
- * 1. Get a CacheToken: CacheToken token = cache.getToken(id);
- * 2. Get a cursor from the database: Cursor cursor = db.query(....);
- * 3. Put the cursor in the cache: cache.putCursor(cursor, id, token);
- * Only cursors with the projection given in the definition of the cache can be cached
- *
- * To delete one or more rows or update multiple rows from a table that uses cached data:
- * 1. Lock the row in the cache: cache.lock(id);
- * 2. Delete/update the row(s): db.delete(...);
- * 3. Invalidate any other caches that might be affected by the delete/update:
- * The entire cache: affectedCache.invalidate()*
- * A specific row in a cache: affectedCache.invalidate(rowId)
- * 4. Unlock the row in the cache: cache.unlock(id);
- *
- * To update a single row from a table that uses cached data:
- * 1. Lock the row in the cache: cache.lock(id);
- * 2. Update the row: db.update(...);
- * 3. Unlock the row in the cache, passing in the new values: cache.unlock(id, values);
- *
- * Synchronization note: All of the public methods in ContentCache are synchronized (i.e. on the
- * cache itself) except for methods that are solely used for debugging and do not modify the cache.
- * All references to ContentCache that are external to the ContentCache class MUST synchronize on
- * the ContentCache instance (e.g. CachedCursor.close())
- */
-public final class ContentCache {
- private static final boolean DEBUG_CACHE = false; // DO NOT CHECK IN TRUE
- private static final boolean DEBUG_TOKENS = false; // DO NOT CHECK IN TRUE
- private static final boolean DEBUG_NOT_CACHEABLE = false; // DO NOT CHECK IN TRUE
- private static final boolean DEBUG_STATISTICS = false; // DO NOT CHECK THIS IN TRUE
-
- // If false, reads will not use the cache; this is intended for debugging only
- private static final boolean READ_CACHE_ENABLED = true; // DO NOT CHECK IN FALSE
-
- // Count of non-cacheable queries (debug only)
- private static int sNotCacheable = 0;
- // A map of queries that aren't cacheable (debug only)
- private static final CounterMap<String> sNotCacheableMap = new CounterMap<String>();
-
- private final LruCache<String, Cursor> mLruCache;
-
- // All defined caches
- private static final ArrayList<ContentCache> sContentCaches = new ArrayList<ContentCache>();
- // A set of all unclosed, cached cursors; this will typically be a very small set, as cursors
- // tend to be closed quickly after use. The value, for each cursor, is its reference count
- /*package*/ static final CounterMap<Cursor> sActiveCursors = new CounterMap<Cursor>(24);
-
- // A set of locked content id's
- private final CounterMap<String> mLockMap = new CounterMap<String>(4);
- // A set of active tokens
- /*package*/ TokenList mTokenList;
-
- // The name of the cache (used for logging)
- private final String mName;
- // The base projection (only queries in which all columns exist in this projection will be
- // able to avoid a cache miss)
- private final String[] mBaseProjection;
- // The tag used for logging
- private final String mLogTag;
- // Cache statistics
- private final Statistics mStats;
- /** If {@code true}, lock the cache for all writes */
- private static boolean sLockCache;
-
- /**
- * A synchronized reference counter for arbitrary objects
- */
- /*package*/ static class CounterMap<T> {
- private HashMap<T, Integer> mMap;
-
- /*package*/ CounterMap(int maxSize) {
- mMap = new HashMap<T, Integer>(maxSize);
- }
-
- /*package*/ CounterMap() {
- mMap = new HashMap<T, Integer>();
- }
-
- /*package*/ synchronized int subtract(T object) {
- Integer refCount = mMap.get(object);
- int newCount;
- if (refCount == null || refCount.intValue() == 0) {
- throw new IllegalStateException();
- }
- if (refCount > 1) {
- newCount = refCount - 1;
- mMap.put(object, newCount);
- } else {
- newCount = 0;
- mMap.remove(object);
- }
- return newCount;
- }
-
- /*package*/ synchronized void add(T object) {
- Integer refCount = mMap.get(object);
- if (refCount == null) {
- mMap.put(object, 1);
- } else {
- mMap.put(object, refCount + 1);
- }
- }
-
- /*package*/ synchronized boolean contains(T object) {
- return mMap.containsKey(object);
- }
-
- /*package*/ synchronized int getCount(T object) {
- Integer refCount = mMap.get(object);
- return (refCount == null) ? 0 : refCount.intValue();
- }
-
- synchronized int size() {
- return mMap.size();
- }
-
- /**
- * For Debugging Only - not efficient
- */
- synchronized Set<Map.Entry<T, Integer>> entrySet() {
- return mMap.entrySet();
- }
- }
-
- /**
- * A list of tokens that are in use at any moment; there can be more than one token for an id
- */
- /*package*/ static class TokenList extends ArrayList<CacheToken> {
- private static final long serialVersionUID = 1L;
- private final String mLogTag;
-
- /*package*/ TokenList(String name) {
- mLogTag = "TokenList-" + name;
- }
-
- /*package*/ int invalidateTokens(String id) {
- if (MailActivityEmail.DEBUG && DEBUG_TOKENS) {
- Log.d(mLogTag, "============ Invalidate tokens for: " + id);
- }
- ArrayList<CacheToken> removeList = new ArrayList<CacheToken>();
- int count = 0;
- for (CacheToken token: this) {
- if (token.getId().equals(id)) {
- token.invalidate();
- removeList.add(token);
- count++;
- }
- }
- for (CacheToken token: removeList) {
- remove(token);
- }
- return count;
- }
-
- /*package*/ void invalidate() {
- if (MailActivityEmail.DEBUG && DEBUG_TOKENS) {
- Log.d(mLogTag, "============ List invalidated");
- }
- for (CacheToken token: this) {
- token.invalidate();
- }
- clear();
- }
-
- /*package*/ boolean remove(CacheToken token) {
- boolean result = super.remove(token);
- if (MailActivityEmail.DEBUG && DEBUG_TOKENS) {
- if (result) {
- Log.d(mLogTag, "============ Removing token for: " + token.mId);
- } else {
- Log.d(mLogTag, "============ No token found for: " + token.mId);
- }
- }
- return result;
- }
-
- public CacheToken add(String id) {
- CacheToken token = new CacheToken(id);
- super.add(token);
- if (MailActivityEmail.DEBUG && DEBUG_TOKENS) {
- Log.d(mLogTag, "============ Taking token for: " + token.mId);
- }
- return token;
- }
- }
-
- /**
- * A CacheToken is an opaque object that must be passed into putCursor in order to attempt to
- * write into the cache. The token becomes invalidated by any intervening write to the cached
- * record.
- */
- public static final class CacheToken {
- private final String mId;
- private boolean mIsValid = READ_CACHE_ENABLED;
-
- /*package*/ CacheToken(String id) {
- mId = id;
- }
-
- /*package*/ String getId() {
- return mId;
- }
-
- /*package*/ boolean isValid() {
- return mIsValid;
- }
-
- /*package*/ void invalidate() {
- mIsValid = false;
- }
-
- @Override
- public boolean equals(Object token) {
- return ((token instanceof CacheToken) && ((CacheToken)token).mId.equals(mId));
- }
-
- @Override
- public int hashCode() {
- return mId.hashCode();
- }
- }
-
- /**
- * The cached cursor is simply a CursorWrapper whose underlying cursor contains zero or one
- * rows. We handle simple movement (moveToFirst(), moveToNext(), etc.), and override close()
- * to keep the underlying cursor alive (unless it's no longer cached due to an invalidation).
- * Multiple CachedCursor's can use the same underlying cursor, so we override the various
- * moveX methods such that each CachedCursor can have its own position information
- */
- public static final class CachedCursor extends CursorWrapper implements CrossProcessCursor {
- // The cursor we're wrapping
- private final Cursor mCursor;
- // The cache which generated this cursor
- private final ContentCache mCache;
- private final String mId;
- // The current position of the cursor (can only be 0 or 1)
- private int mPosition = -1;
- // The number of rows in this cursor (-1 = not determined)
- private int mCount = -1;
- private boolean isClosed = false;
-
- public CachedCursor(Cursor cursor, ContentCache cache, String id) {
- super(cursor);
- mCursor = cursor;
- mCache = cache;
- mId = id;
- // Add this to our set of active cursors
- sActiveCursors.add(cursor);
- }
-
- /**
- * Close this cursor; if the cursor's cache no longer contains the underlying cursor, and
- * there are no other users of that cursor, we'll close it here. In any event,
- * we'll remove the cursor from our set of active cursors.
- */
- @Override
- public void close() {
- synchronized(mCache) {
- int count = sActiveCursors.subtract(mCursor);
- if ((count == 0) && mCache.mLruCache.get(mId) != (mCursor)) {
- super.close();
- }
- }
- isClosed = true;
- }
-
- @Override
- public boolean isClosed() {
- return isClosed;
- }
-
- @Override
- public int getCount() {
- if (mCount < 0) {
- mCount = super.getCount();
- }
- return mCount;
- }
-
- /**
- * We'll be happy to move to position 0 or -1
- */
- @Override
- public boolean moveToPosition(int pos) {
- if (pos >= getCount() || pos < -1) {
- return false;
- }
- mPosition = pos;
- return true;
- }
-
- @Override
- public boolean moveToFirst() {
- return moveToPosition(0);
- }
-
- @Override
- public boolean moveToNext() {
- return moveToPosition(mPosition + 1);
- }
-
- @Override
- public boolean moveToPrevious() {
- return moveToPosition(mPosition - 1);
- }
-
- @Override
- public int getPosition() {
- return mPosition;
- }
-
- @Override
- public final boolean move(int offset) {
- return moveToPosition(mPosition + offset);
- }
-
- @Override
- public final boolean moveToLast() {
- return moveToPosition(getCount() - 1);
- }
-
- @Override
- public final boolean isLast() {
- return mPosition == (getCount() - 1);
- }
-
- @Override
- public final boolean isBeforeFirst() {
- return mPosition == -1;
- }
-
- @Override
- public final boolean isAfterLast() {
- return mPosition == 1;
- }
-
- @Override
- public CursorWindow getWindow() {
- return ((CrossProcessCursor)mCursor).getWindow();
- }
-
- @Override
- public void fillWindow(int pos, CursorWindow window) {
- ((CrossProcessCursor)mCursor).fillWindow(pos, window);
- }
-
- @Override
- public boolean onMove(int oldPosition, int newPosition) {
- return true;
- }
- }
-
- /**
- * Public constructor
- * @param name the name of the cache (used for logging)
- * @param baseProjection the projection used for cached cursors; queries whose columns are not
- * included in baseProjection will always generate a cache miss
- * @param maxSize the maximum number of content cursors to cache
- */
- public ContentCache(String name, String[] baseProjection, int maxSize) {
- mName = name;
- mLruCache = new LruCache<String, Cursor>(maxSize) {
- @Override
- protected void entryRemoved(
- boolean evicted, String key, Cursor oldValue, Cursor newValue) {
- // Close this cursor if it's no longer being used
- if (evicted && !sActiveCursors.contains(oldValue)) {
- oldValue.close();
- }
- }
- };
- mBaseProjection = baseProjection;
- mLogTag = "ContentCache-" + name;
- sContentCaches.add(this);
- mTokenList = new TokenList(mName);
- mStats = new Statistics(this);
- }
-
- /**
- * Return the base projection for cached rows
- * Get the projection used for cached rows (typically, the largest possible projection)
- * @return
- */
- public String[] getProjection() {
- return mBaseProjection;
- }
-
-
- /**
- * Get a CacheToken for a row as specified by its id (_id column)
- * @param id the id of the record
- * @return a CacheToken needed in order to write data for the record back to the cache
- */
- public synchronized CacheToken getCacheToken(String id) {
- // If another thread is already writing the data, return an invalid token
- CacheToken token = mTokenList.add(id);
- if (mLockMap.contains(id)) {
- token.invalidate();
- }
- return token;
- }
-
- public int size() {
- return mLruCache.size();
- }
-
- @VisibleForTesting
- Cursor get(String id) {
- return mLruCache.get(id);
- }
-
- protected Map<String, Cursor> getSnapshot() {
- return mLruCache.snapshot();
- }
- /**
- * Try to cache a cursor for the given id and projection; returns a valid cursor, either a
- * cached cursor (if caching was successful) or the original cursor
- *
- * @param c the cursor to be cached
- * @param id the record id (_id) of the content
- * @param projection the projection represented by the cursor
- * @return whether or not the cursor was cached
- */
- public Cursor putCursor(Cursor c, String id, String[] projection, CacheToken token) {
- // Make sure the underlying cursor is at the first row, and do this without synchronizing,
- // to prevent deadlock with a writing thread (which might, for example, be calling into
- // CachedCursor.invalidate)
- c.moveToPosition(0);
- return putCursorImpl(c, id, projection, token);
- }
- public synchronized Cursor putCursorImpl(Cursor c, String id, String[] projection,
- CacheToken token) {
- try {
- if (!token.isValid()) {
- if (MailActivityEmail.DEBUG && DEBUG_CACHE) {
- Log.d(mLogTag, "============ Stale token for " + id);
- }
- mStats.mStaleCount++;
- return c;
- }
- if (c != null && Arrays.equals(projection, mBaseProjection) && !sLockCache) {
- if (MailActivityEmail.DEBUG && DEBUG_CACHE) {
- Log.d(mLogTag, "============ Caching cursor for: " + id);
- }
- // If we've already cached this cursor, invalidate the older one
- Cursor existingCursor = get(id);
- if (existingCursor != null) {
- unlockImpl(id, null, false);
- }
- mLruCache.put(id, c);
- return new CachedCursor(c, this, id);
- }
- return c;
- } finally {
- mTokenList.remove(token);
- }
- }
-
- /**
- * Find and, if found, return a cursor, based on cached values, for the supplied id
- * @param id the _id column of the desired row
- * @param projection the requested projection for a query
- * @return a cursor based on cached values, or null if the row is not cached
- */
- public synchronized Cursor getCachedCursor(String id, String[] projection) {
- if (MailActivityEmail.DEBUG && DEBUG_STATISTICS) {
- // Every 200 calls to getCursor, report cache statistics
- dumpOnCount(200);
- }
- if (projection == mBaseProjection) {
- return getCachedCursorImpl(id);
- } else {
- return getMatrixCursor(id, projection);
- }
- }
-
- private CachedCursor getCachedCursorImpl(String id) {
- Cursor c = get(id);
- if (c != null) {
- mStats.mHitCount++;
- return new CachedCursor(c, this, id);
- }
- mStats.mMissCount++;
- return null;
- }
-
- private MatrixCursor getMatrixCursor(String id, String[] projection) {
- return getMatrixCursor(id, projection, null);
- }
-
- private MatrixCursor getMatrixCursor(String id, String[] projection,
- ContentValues values) {
- Cursor c = get(id);
- if (c != null) {
- // Make a new MatrixCursor with the requested columns
- MatrixCursor mc = new MatrixCursor(projection, 1);
- if (c.getCount() == 0) {
- return mc;
- }
- Object[] row = new Object[projection.length];
- if (values != null) {
- // Make a copy; we don't want to change the original
- values = new ContentValues(values);
- }
- int i = 0;
- for (String column: projection) {
- int columnIndex = c.getColumnIndex(column);
- if (columnIndex < 0) {
- mStats.mProjectionMissCount++;
- return null;
- } else {
- String value;
- if (values != null && values.containsKey(column)) {
- Object val = values.get(column);
- if (val instanceof Boolean) {
- value = (val == Boolean.TRUE) ? "1" : "0";
- } else {
- value = values.getAsString(column);
- }
- values.remove(column);
- } else {
- value = c.getString(columnIndex);
- }
- row[i++] = value;
- }
- }
- if (values != null && values.size() != 0) {
- return null;
- }
- mc.addRow(row);
- mStats.mHitCount++;
- return mc;
- }
- mStats.mMissCount++;
- return null;
- }
-
- /**
- * Lock a given row, such that no new valid CacheTokens can be created for the passed-in id.
- * @param id the id of the row to lock
- */
- public synchronized void lock(String id) {
- // Prevent new valid tokens from being created
- mLockMap.add(id);
- // Invalidate current tokens
- int count = mTokenList.invalidateTokens(id);
- if (MailActivityEmail.DEBUG && DEBUG_TOKENS) {
- Log.d(mTokenList.mLogTag, "============ Lock invalidated " + count +
- " tokens for: " + id);
- }
- }
-
- /**
- * Unlock a given row, allowing new valid CacheTokens to be created for the passed-in id.
- * @param id the id of the item whose cursor is cached
- */
- public synchronized void unlock(String id) {
- unlockImpl(id, null, true);
- }
-
- /**
- * If the row with id is currently cached, replaces the cached values with the supplied
- * ContentValues. Then, unlock the row, so that new valid CacheTokens can be created.
- *
- * @param id the id of the item whose cursor is cached
- * @param values updated values for this row
- */
- public synchronized void unlock(String id, ContentValues values) {
- unlockImpl(id, values, true);
- }
-
- /**
- * If values are passed in, replaces any cached cursor with one containing new values, and
- * then closes the previously cached one (if any, and if not in use)
- * If values are not passed in, removes the row from cache
- * If the row was locked, unlock it
- * @param id the id of the row
- * @param values new ContentValues for the row (or null if row should simply be removed)
- * @param wasLocked whether or not the row was locked; if so, the lock will be removed
- */
- private void unlockImpl(String id, ContentValues values, boolean wasLocked) {
- Cursor c = get(id);
- if (c != null) {
- if (MailActivityEmail.DEBUG && DEBUG_CACHE) {
- Log.d(mLogTag, "=========== Unlocking cache for: " + id);
- }
- if (values != null && !sLockCache) {
- MatrixCursor cursor = getMatrixCursor(id, mBaseProjection, values);
- if (cursor != null) {
- if (MailActivityEmail.DEBUG && DEBUG_CACHE) {
- Log.d(mLogTag, "=========== Recaching with new values: " + id);
- }
- cursor.moveToFirst();
- mLruCache.put(id, cursor);
- } else {
- mLruCache.remove(id);
- }
- } else {
- mLruCache.remove(id);
- }
- // If there are no cursors using the old cached cursor, close it
- if (!sActiveCursors.contains(c)) {
- c.close();
- }
- }
- if (wasLocked) {
- mLockMap.subtract(id);
- }
- }
-
- /**
- * Invalidate the entire cache, without logging
- */
- public synchronized void invalidate() {
- invalidate(null, null, null);
- }
-
- /**
- * Invalidate the entire cache; the arguments are used for logging only, and indicate the
- * write operation that caused the invalidation
- *
- * @param operation a string describing the operation causing the invalidate (or null)
- * @param uri the uri causing the invalidate (or null)
- * @param selection the selection used with the uri (or null)
- */
- public synchronized void invalidate(String operation, Uri uri, String selection) {
- if (DEBUG_CACHE && (operation != null)) {
- Log.d(mLogTag, "============ INVALIDATED BY " + operation + ": " + uri +
- ", SELECTION: " + selection);
- }
- mStats.mInvalidateCount++;
- // Close all cached cursors that are no longer in use
- mLruCache.evictAll();
- // Invalidate all current tokens
- mTokenList.invalidate();
- }
-
- // Debugging code below
-
- private void dumpOnCount(int num) {
- mStats.mOpCount++;
- if ((mStats.mOpCount % num) == 0) {
- dumpStats();
- }
- }
-
- /*package*/ void recordQueryTime(Cursor c, long nanoTime) {
- if (c instanceof CachedCursor) {
- mStats.hitTimes += nanoTime;
- mStats.hits++;
- } else {
- if (c.getCount() == 1) {
- mStats.missTimes += nanoTime;
- mStats.miss++;
- }
- }
- }
-
- public static synchronized void notCacheable(Uri uri, String selection) {
- if (DEBUG_NOT_CACHEABLE) {
- sNotCacheable++;
- String str = uri.toString() + "$" + selection;
- sNotCacheableMap.add(str);
- }
- }
-
- private static class CacheCounter implements Comparable<CacheCounter> {
- String uri;
- Integer count;
-
- CacheCounter(String _uri, Integer _count) {
- uri = _uri;
- count = _count;
- }
-
- @Override
- public int compareTo(CacheCounter another) {
- return another.count > count ? 1 : another.count == count ? 0 : -1;
- }
- }
-
- private static void dumpNotCacheableQueries() {
- int size = sNotCacheableMap.size();
- CacheCounter[] array = new CacheCounter[size];
-
- int i = 0;
- for (Map.Entry<String, Integer> entry: sNotCacheableMap.entrySet()) {
- array[i++] = new CacheCounter(entry.getKey(), entry.getValue());
- }
- Arrays.sort(array);
- for (CacheCounter cc: array) {
- Log.d("NotCacheable", cc.count + ": " + cc.uri);
- }
- }
-
- // For use with unit tests
- public static void invalidateAllCaches() {
- for (ContentCache cache: sContentCaches) {
- cache.invalidate();
- }
- }
-
- /** Sets the cache lock. If the lock is {@code true}, also invalidates all cached items. */
- public static void setLockCacheForTest(boolean lock) {
- sLockCache = lock;
- if (sLockCache) {
- invalidateAllCaches();
- }
- }
-
- static class Statistics {
- private final ContentCache mCache;
- private final String mName;
-
- // Cache statistics
- // The item is in the cache AND is used to create a cursor
- private int mHitCount = 0;
- // Basic cache miss (the item is not cached)
- private int mMissCount = 0;
- // Incremented when a cachePut is invalid due to an intervening write
- private int mStaleCount = 0;
- // A projection miss occurs when the item is cached, but not all requested columns are
- // available in the base projection
- private int mProjectionMissCount = 0;
- // Incremented whenever the entire cache is invalidated
- private int mInvalidateCount = 0;
- // Count of operations put/get
- private int mOpCount = 0;
- // The following are for timing statistics
- private long hits = 0;
- private long hitTimes = 0;
- private long miss = 0;
- private long missTimes = 0;
-
- // Used in toString() and addCacheStatistics()
- private int mCursorCount = 0;
- private int mTokenCount = 0;
-
- Statistics(ContentCache cache) {
- mCache = cache;
- mName = mCache.mName;
- }
-
- Statistics(String name) {
- mCache = null;
- mName = name;
- }
-
- private void addCacheStatistics(ContentCache cache) {
- if (cache != null) {
- mHitCount += cache.mStats.mHitCount;
- mMissCount += cache.mStats.mMissCount;
- mProjectionMissCount += cache.mStats.mProjectionMissCount;
- mStaleCount += cache.mStats.mStaleCount;
- hitTimes += cache.mStats.hitTimes;
- missTimes += cache.mStats.missTimes;
- hits += cache.mStats.hits;
- miss += cache.mStats.miss;
- mCursorCount += cache.size();
- mTokenCount += cache.mTokenList.size();
- }
- }
-
- private void append(StringBuilder sb, String name, Object value) {
- sb.append(", ");
- sb.append(name);
- sb.append(": ");
- sb.append(value);
- }
-
- @Override
- public String toString() {
- if (mHitCount + mMissCount == 0) return "No cache";
- int totalTries = mMissCount + mProjectionMissCount + mHitCount;
- StringBuilder sb = new StringBuilder();
- sb.append("Cache " + mName);
- append(sb, "Cursors", mCache == null ? mCursorCount : mCache.size());
- append(sb, "Hits", mHitCount);
- append(sb, "Misses", mMissCount + mProjectionMissCount);
- append(sb, "Inval", mInvalidateCount);
- append(sb, "Tokens", mCache == null ? mTokenCount : mCache.mTokenList.size());
- append(sb, "Hit%", mHitCount * 100 / totalTries);
- append(sb, "\nHit time", hitTimes / 1000000.0 / hits);
- append(sb, "Miss time", missTimes / 1000000.0 / miss);
- return sb.toString();
- }
- }
-
- public static void dumpStats() {
- Statistics totals = new Statistics("Totals");
-
- for (ContentCache cache: sContentCaches) {
- if (cache != null) {
- Log.d(cache.mName, cache.mStats.toString());
- totals.addCacheStatistics(cache);
- }
- }
- Log.d(totals.mName, totals.toString());
- }
-}
diff --git a/email2/src/com/android/email/provider/DBHelper.java b/email2/src/com/android/email/provider/DBHelper.java
deleted file mode 100644
index 8df131ea6..000000000
--- a/email2/src/com/android/email/provider/DBHelper.java
+++ /dev/null
@@ -1,1292 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.provider;
-
-import android.accounts.AccountManager;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.SQLException;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.provider.CalendarContract;
-import android.provider.ContactsContract;
-import android.util.Log;
-
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.AccountManagerTypes;
-import com.android.emailcommon.mail.Address;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
-import com.android.emailcommon.provider.EmailContent.Body;
-import com.android.emailcommon.provider.EmailContent.BodyColumns;
-import com.android.emailcommon.provider.EmailContent.HostAuthColumns;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.emailcommon.provider.EmailContent.PolicyColumns;
-import com.android.emailcommon.provider.EmailContent.QuickResponseColumns;
-import com.android.emailcommon.provider.EmailContent.SyncColumns;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.provider.Policy;
-import com.android.emailcommon.provider.QuickResponse;
-import com.android.emailcommon.service.LegacyPolicySet;
-import com.android.mail.providers.UIProvider;
-import com.google.common.annotations.VisibleForTesting;
-
-public final class DBHelper {
- private static final String TAG = "EmailProvider";
-
- private static final String WHERE_ID = EmailContent.RECORD_ID + "=?";
-
- private static final String TRIGGER_MAILBOX_DELETE =
- "create trigger mailbox_delete before delete on " + Mailbox.TABLE_NAME +
- " begin" +
- " delete from " + Message.TABLE_NAME +
- " where " + MessageColumns.MAILBOX_KEY + "=old." + EmailContent.RECORD_ID +
- "; delete from " + Message.UPDATED_TABLE_NAME +
- " where " + MessageColumns.MAILBOX_KEY + "=old." + EmailContent.RECORD_ID +
- "; delete from " + Message.DELETED_TABLE_NAME +
- " where " + MessageColumns.MAILBOX_KEY + "=old." + EmailContent.RECORD_ID +
- "; end";
-
- private static final String TRIGGER_ACCOUNT_DELETE =
- "create trigger account_delete before delete on " + Account.TABLE_NAME +
- " begin delete from " + Mailbox.TABLE_NAME +
- " where " + MailboxColumns.ACCOUNT_KEY + "=old." + EmailContent.RECORD_ID +
- "; delete from " + HostAuth.TABLE_NAME +
- " where " + EmailContent.RECORD_ID + "=old." + AccountColumns.HOST_AUTH_KEY_RECV +
- "; delete from " + HostAuth.TABLE_NAME +
- " where " + EmailContent.RECORD_ID + "=old." + AccountColumns.HOST_AUTH_KEY_SEND +
- "; delete from " + Policy.TABLE_NAME +
- " where " + EmailContent.RECORD_ID + "=old." + AccountColumns.POLICY_KEY +
- "; end";
-
- // Any changes to the database format *must* include update-in-place code.
- // Original version: 3
- // Version 4: Database wipe required; changing AccountManager interface w/Exchange
- // Version 5: Database wipe required; changing AccountManager interface w/Exchange
- // Version 6: Adding Message.mServerTimeStamp column
- // Version 7: Replace the mailbox_delete trigger with a version that removes orphaned messages
- // from the Message_Deletes and Message_Updates tables
- // Version 8: Add security flags column to accounts table
- // Version 9: Add security sync key and signature to accounts table
- // Version 10: Add meeting info to message table
- // Version 11: Add content and flags to attachment table
- // Version 12: Add content_bytes to attachment table. content is deprecated.
- // Version 13: Add messageCount to Mailbox table.
- // Version 14: Add snippet to Message table
- // Version 15: Fix upgrade problem in version 14.
- // Version 16: Add accountKey to Attachment table
- // Version 17: Add parentKey to Mailbox table
- // Version 18: Copy Mailbox.displayName to Mailbox.serverId for all IMAP & POP3 mailboxes.
- // Column Mailbox.serverId is used for the server-side pathname of a mailbox.
- // Version 19: Add Policy table; add policyKey to Account table and trigger to delete an
- // Account's policy when the Account is deleted
- // Version 20: Add new policies to Policy table
- // Version 21: Add lastSeenMessageKey column to Mailbox table
- // Version 22: Upgrade path for IMAP/POP accounts to integrate with AccountManager
- // Version 23: Add column to mailbox table for time of last access
- // Version 24: Add column to hostauth table for client cert alias
- // Version 25: Added QuickResponse table
- // Version 26: Update IMAP accounts to add FLAG_SUPPORTS_SEARCH flag
- // Version 27: Add protocolSearchInfo to Message table
- // Version 28: Add notifiedMessageId and notifiedMessageCount to Account
- // Version 29: Add protocolPoliciesEnforced and protocolPoliciesUnsupported to Policy
- // Version 30: Use CSV of RFC822 addresses instead of "packed" values
- // Version 31: Add columns to mailbox for ui status/last result
- // Version 32: Add columns to mailbox for last notified message key/count; insure not null
- // for "notified" columns
- // Version 33: Add columns to attachment for ui provider columns
- // Version 34: Add total count to mailbox
- // Version 35: Set up defaults for lastTouchedCount for drafts and sent
- // Version 36: mblank intentionally left this space
- // Version 37: Add flag for settings support in folders
- // Version 38&39: Add threadTopic to message (for future support)
- // Version 39 is last Email1 version
- // Version 100 is first Email2 version
- // Version 101 SHOULD NOT BE USED
- // Version 102&103: Add hierarchicalName to Mailbox
-
- public static final int DATABASE_VERSION = 103;
-
- // Any changes to the database format *must* include update-in-place code.
- // Original version: 2
- // Version 3: Add "sourceKey" column
- // Version 4: Database wipe required; changing AccountManager interface w/Exchange
- // Version 5: Database wipe required; changing AccountManager interface w/Exchange
- // Version 6: Adding Body.mIntroText column
- // Version 7/8: Adding quoted text start pos
- // Version 8 is last Email1 version
- public static final int BODY_DATABASE_VERSION = 100;
-
- /*
- * Internal helper method for index creation.
- * Example:
- * "create index message_" + MessageColumns.FLAG_READ
- * + " on " + Message.TABLE_NAME + " (" + MessageColumns.FLAG_READ + ");"
- */
- /* package */
- static String createIndex(String tableName, String columnName) {
- return "create index " + tableName.toLowerCase() + '_' + columnName
- + " on " + tableName + " (" + columnName + ");";
- }
-
- static void createMessageTable(SQLiteDatabase db) {
- String messageColumns = MessageColumns.DISPLAY_NAME + " text, "
- + MessageColumns.TIMESTAMP + " integer, "
- + MessageColumns.SUBJECT + " text, "
- + MessageColumns.FLAG_READ + " integer, "
- + MessageColumns.FLAG_LOADED + " integer, "
- + MessageColumns.FLAG_FAVORITE + " integer, "
- + MessageColumns.FLAG_ATTACHMENT + " integer, "
- + MessageColumns.FLAGS + " integer, "
- + MessageColumns.DRAFT_INFO + " integer, "
- + MessageColumns.MESSAGE_ID + " text, "
- + MessageColumns.MAILBOX_KEY + " integer, "
- + MessageColumns.ACCOUNT_KEY + " integer, "
- + MessageColumns.FROM_LIST + " text, "
- + MessageColumns.TO_LIST + " text, "
- + MessageColumns.CC_LIST + " text, "
- + MessageColumns.BCC_LIST + " text, "
- + MessageColumns.REPLY_TO_LIST + " text, "
- + MessageColumns.MEETING_INFO + " text, "
- + MessageColumns.SNIPPET + " text, "
- + MessageColumns.PROTOCOL_SEARCH_INFO + " text, "
- + MessageColumns.THREAD_TOPIC + " text"
- + ");";
-
- // This String and the following String MUST have the same columns, except for the type
- // of those columns!
- String createString = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + SyncColumns.SERVER_ID + " text, "
- + SyncColumns.SERVER_TIMESTAMP + " integer, "
- + messageColumns;
-
- // For the updated and deleted tables, the id is assigned, but we do want to keep track
- // of the ORDER of updates using an autoincrement primary key. We use the DATA column
- // at this point; it has no other function
- String altCreateString = " (" + EmailContent.RECORD_ID + " integer unique, "
- + SyncColumns.SERVER_ID + " text, "
- + SyncColumns.SERVER_TIMESTAMP + " integer, "
- + messageColumns;
-
- // The three tables have the same schema
- db.execSQL("create table " + Message.TABLE_NAME + createString);
- db.execSQL("create table " + Message.UPDATED_TABLE_NAME + altCreateString);
- db.execSQL("create table " + Message.DELETED_TABLE_NAME + altCreateString);
-
- String indexColumns[] = {
- MessageColumns.TIMESTAMP,
- MessageColumns.FLAG_READ,
- MessageColumns.FLAG_LOADED,
- MessageColumns.MAILBOX_KEY,
- SyncColumns.SERVER_ID
- };
-
- for (String columnName : indexColumns) {
- db.execSQL(createIndex(Message.TABLE_NAME, columnName));
- }
-
- // Deleting a Message deletes all associated Attachments
- // Deleting the associated Body cannot be done in a trigger, because the Body is stored
- // in a separate database, and trigger cannot operate on attached databases.
- db.execSQL("create trigger message_delete before delete on " + Message.TABLE_NAME +
- " begin delete from " + Attachment.TABLE_NAME +
- " where " + AttachmentColumns.MESSAGE_KEY + "=old." + EmailContent.RECORD_ID +
- "; end");
-
- // Add triggers to keep unread count accurate per mailbox
-
- // NOTE: SQLite's before triggers are not safe when recursive triggers are involved.
- // Use caution when changing them.
-
- // Insert a message; if flagRead is zero, add to the unread count of the message's mailbox
- db.execSQL("create trigger unread_message_insert before insert on " + Message.TABLE_NAME +
- " when NEW." + MessageColumns.FLAG_READ + "=0" +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT +
- '=' + MailboxColumns.UNREAD_COUNT + "+1" +
- " where " + EmailContent.RECORD_ID + "=NEW." + MessageColumns.MAILBOX_KEY +
- "; end");
-
- // Delete a message; if flagRead is zero, decrement the unread count of the msg's mailbox
- db.execSQL("create trigger unread_message_delete before delete on " + Message.TABLE_NAME +
- " when OLD." + MessageColumns.FLAG_READ + "=0" +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT +
- '=' + MailboxColumns.UNREAD_COUNT + "-1" +
- " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY +
- "; end");
-
- // Change a message's mailbox
- db.execSQL("create trigger unread_message_move before update of " +
- MessageColumns.MAILBOX_KEY + " on " + Message.TABLE_NAME +
- " when OLD." + MessageColumns.FLAG_READ + "=0" +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT +
- '=' + MailboxColumns.UNREAD_COUNT + "-1" +
- " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY +
- "; update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT +
- '=' + MailboxColumns.UNREAD_COUNT + "+1" +
- " where " + EmailContent.RECORD_ID + "=NEW." + MessageColumns.MAILBOX_KEY +
- "; end");
-
- // Change a message's read state
- db.execSQL("create trigger unread_message_read before update of " +
- MessageColumns.FLAG_READ + " on " + Message.TABLE_NAME +
- " when OLD." + MessageColumns.FLAG_READ + "!=NEW." + MessageColumns.FLAG_READ +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT +
- '=' + MailboxColumns.UNREAD_COUNT + "+ case OLD." + MessageColumns.FLAG_READ +
- " when 0 then -1 else 1 end" +
- " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY +
- "; end");
-
- // Add triggers to update message count per mailbox
-
- // Insert a message.
- db.execSQL("create trigger message_count_message_insert after insert on " +
- Message.TABLE_NAME +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT +
- '=' + MailboxColumns.MESSAGE_COUNT + "+1" +
- " where " + EmailContent.RECORD_ID + "=NEW." + MessageColumns.MAILBOX_KEY +
- "; end");
-
- // Delete a message; if flagRead is zero, decrement the unread count of the msg's mailbox
- db.execSQL("create trigger message_count_message_delete after delete on " +
- Message.TABLE_NAME +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT +
- '=' + MailboxColumns.MESSAGE_COUNT + "-1" +
- " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY +
- "; end");
-
- // Change a message's mailbox
- db.execSQL("create trigger message_count_message_move after update of " +
- MessageColumns.MAILBOX_KEY + " on " + Message.TABLE_NAME +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT +
- '=' + MailboxColumns.MESSAGE_COUNT + "-1" +
- " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY +
- "; update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT +
- '=' + MailboxColumns.MESSAGE_COUNT + "+1" +
- " where " + EmailContent.RECORD_ID + "=NEW." + MessageColumns.MAILBOX_KEY +
- "; end");
- }
-
- static void resetMessageTable(SQLiteDatabase db, int oldVersion, int newVersion) {
- try {
- db.execSQL("drop table " + Message.TABLE_NAME);
- db.execSQL("drop table " + Message.UPDATED_TABLE_NAME);
- db.execSQL("drop table " + Message.DELETED_TABLE_NAME);
- } catch (SQLException e) {
- }
- createMessageTable(db);
- }
-
- @SuppressWarnings("deprecation")
- static void createAccountTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + AccountColumns.DISPLAY_NAME + " text, "
- + AccountColumns.EMAIL_ADDRESS + " text, "
- + AccountColumns.SYNC_KEY + " text, "
- + AccountColumns.SYNC_LOOKBACK + " integer, "
- + AccountColumns.SYNC_INTERVAL + " text, "
- + AccountColumns.HOST_AUTH_KEY_RECV + " integer, "
- + AccountColumns.HOST_AUTH_KEY_SEND + " integer, "
- + AccountColumns.FLAGS + " integer, "
- + AccountColumns.IS_DEFAULT + " integer, "
- + AccountColumns.COMPATIBILITY_UUID + " text, "
- + AccountColumns.SENDER_NAME + " text, "
- + AccountColumns.RINGTONE_URI + " text, "
- + AccountColumns.PROTOCOL_VERSION + " text, "
- + AccountColumns.NEW_MESSAGE_COUNT + " integer, "
- + AccountColumns.SECURITY_FLAGS + " integer, "
- + AccountColumns.SECURITY_SYNC_KEY + " text, "
- + AccountColumns.SIGNATURE + " text, "
- + AccountColumns.POLICY_KEY + " integer"
- + ");";
- db.execSQL("create table " + Account.TABLE_NAME + s);
- // Deleting an account deletes associated Mailboxes and HostAuth's
- db.execSQL(TRIGGER_ACCOUNT_DELETE);
- }
-
- static void resetAccountTable(SQLiteDatabase db, int oldVersion, int newVersion) {
- try {
- db.execSQL("drop table " + Account.TABLE_NAME);
- } catch (SQLException e) {
- }
- createAccountTable(db);
- }
-
- static void createPolicyTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + PolicyColumns.PASSWORD_MODE + " integer, "
- + PolicyColumns.PASSWORD_MIN_LENGTH + " integer, "
- + PolicyColumns.PASSWORD_EXPIRATION_DAYS + " integer, "
- + PolicyColumns.PASSWORD_HISTORY + " integer, "
- + PolicyColumns.PASSWORD_COMPLEX_CHARS + " integer, "
- + PolicyColumns.PASSWORD_MAX_FAILS + " integer, "
- + PolicyColumns.MAX_SCREEN_LOCK_TIME + " integer, "
- + PolicyColumns.REQUIRE_REMOTE_WIPE + " integer, "
- + PolicyColumns.REQUIRE_ENCRYPTION + " integer, "
- + PolicyColumns.REQUIRE_ENCRYPTION_EXTERNAL + " integer, "
- + PolicyColumns.REQUIRE_MANUAL_SYNC_WHEN_ROAMING + " integer, "
- + PolicyColumns.DONT_ALLOW_CAMERA + " integer, "
- + PolicyColumns.DONT_ALLOW_ATTACHMENTS + " integer, "
- + PolicyColumns.DONT_ALLOW_HTML + " integer, "
- + PolicyColumns.MAX_ATTACHMENT_SIZE + " integer, "
- + PolicyColumns.MAX_TEXT_TRUNCATION_SIZE + " integer, "
- + PolicyColumns.MAX_HTML_TRUNCATION_SIZE + " integer, "
- + PolicyColumns.MAX_EMAIL_LOOKBACK + " integer, "
- + PolicyColumns.MAX_CALENDAR_LOOKBACK + " integer, "
- + PolicyColumns.PASSWORD_RECOVERY_ENABLED + " integer, "
- + PolicyColumns.PROTOCOL_POLICIES_ENFORCED + " text, "
- + PolicyColumns.PROTOCOL_POLICIES_UNSUPPORTED + " text"
- + ");";
- db.execSQL("create table " + Policy.TABLE_NAME + s);
- }
-
- static void createHostAuthTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + HostAuthColumns.PROTOCOL + " text, "
- + HostAuthColumns.ADDRESS + " text, "
- + HostAuthColumns.PORT + " integer, "
- + HostAuthColumns.FLAGS + " integer, "
- + HostAuthColumns.LOGIN + " text, "
- + HostAuthColumns.PASSWORD + " text, "
- + HostAuthColumns.DOMAIN + " text, "
- + HostAuthColumns.ACCOUNT_KEY + " integer,"
- + HostAuthColumns.CLIENT_CERT_ALIAS + " text"
- + ");";
- db.execSQL("create table " + HostAuth.TABLE_NAME + s);
- }
-
- static void resetHostAuthTable(SQLiteDatabase db, int oldVersion, int newVersion) {
- try {
- db.execSQL("drop table " + HostAuth.TABLE_NAME);
- } catch (SQLException e) {
- }
- createHostAuthTable(db);
- }
-
- static void createMailboxTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + MailboxColumns.DISPLAY_NAME + " text, "
- + MailboxColumns.SERVER_ID + " text, "
- + MailboxColumns.PARENT_SERVER_ID + " text, "
- + MailboxColumns.PARENT_KEY + " integer, "
- + MailboxColumns.ACCOUNT_KEY + " integer, "
- + MailboxColumns.TYPE + " integer, "
- + MailboxColumns.DELIMITER + " integer, "
- + MailboxColumns.SYNC_KEY + " text, "
- + MailboxColumns.SYNC_LOOKBACK + " integer, "
- + MailboxColumns.SYNC_INTERVAL + " integer, "
- + MailboxColumns.SYNC_TIME + " integer, "
- + MailboxColumns.UNREAD_COUNT + " integer, "
- + MailboxColumns.FLAG_VISIBLE + " integer, "
- + MailboxColumns.FLAGS + " integer, "
- + MailboxColumns.VISIBLE_LIMIT + " integer, "
- + MailboxColumns.SYNC_STATUS + " text, "
- + MailboxColumns.MESSAGE_COUNT + " integer not null default 0, "
- + MailboxColumns.LAST_TOUCHED_TIME + " integer default 0, "
- + MailboxColumns.UI_SYNC_STATUS + " integer default 0, "
- + MailboxColumns.UI_LAST_SYNC_RESULT + " integer default 0, "
- + MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY + " integer not null default 0, "
- + MailboxColumns.LAST_NOTIFIED_MESSAGE_COUNT + " integer not null default 0, "
- + MailboxColumns.TOTAL_COUNT + " integer, "
- + MailboxColumns.HIERARCHICAL_NAME + " text"
- + ");";
- db.execSQL("create table " + Mailbox.TABLE_NAME + s);
- db.execSQL("create index mailbox_" + MailboxColumns.SERVER_ID
- + " on " + Mailbox.TABLE_NAME + " (" + MailboxColumns.SERVER_ID + ")");
- db.execSQL("create index mailbox_" + MailboxColumns.ACCOUNT_KEY
- + " on " + Mailbox.TABLE_NAME + " (" + MailboxColumns.ACCOUNT_KEY + ")");
- // Deleting a Mailbox deletes associated Messages in all three tables
- db.execSQL(TRIGGER_MAILBOX_DELETE);
- }
-
- static void resetMailboxTable(SQLiteDatabase db, int oldVersion, int newVersion) {
- try {
- db.execSQL("drop table " + Mailbox.TABLE_NAME);
- } catch (SQLException e) {
- }
- createMailboxTable(db);
- }
-
- static void createAttachmentTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + AttachmentColumns.FILENAME + " text, "
- + AttachmentColumns.MIME_TYPE + " text, "
- + AttachmentColumns.SIZE + " integer, "
- + AttachmentColumns.CONTENT_ID + " text, "
- + AttachmentColumns.CONTENT_URI + " text, "
- + AttachmentColumns.MESSAGE_KEY + " integer, "
- + AttachmentColumns.LOCATION + " text, "
- + AttachmentColumns.ENCODING + " text, "
- + AttachmentColumns.CONTENT + " text, "
- + AttachmentColumns.FLAGS + " integer, "
- + AttachmentColumns.CONTENT_BYTES + " blob, "
- + AttachmentColumns.ACCOUNT_KEY + " integer, "
- + AttachmentColumns.UI_STATE + " integer, "
- + AttachmentColumns.UI_DESTINATION + " integer, "
- + AttachmentColumns.UI_DOWNLOADED_SIZE + " integer"
- + ");";
- db.execSQL("create table " + Attachment.TABLE_NAME + s);
- db.execSQL(createIndex(Attachment.TABLE_NAME, AttachmentColumns.MESSAGE_KEY));
- }
-
- static void resetAttachmentTable(SQLiteDatabase db, int oldVersion, int newVersion) {
- try {
- db.execSQL("drop table " + Attachment.TABLE_NAME);
- } catch (SQLException e) {
- }
- createAttachmentTable(db);
- }
-
- static void createQuickResponseTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + QuickResponseColumns.TEXT + " text, "
- + QuickResponseColumns.ACCOUNT_KEY + " integer"
- + ");";
- db.execSQL("create table " + QuickResponse.TABLE_NAME + s);
- }
-
- static void createBodyTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + BodyColumns.MESSAGE_KEY + " integer, "
- + BodyColumns.HTML_CONTENT + " text, "
- + BodyColumns.TEXT_CONTENT + " text, "
- + BodyColumns.HTML_REPLY + " text, "
- + BodyColumns.TEXT_REPLY + " text, "
- + BodyColumns.SOURCE_MESSAGE_KEY + " text, "
- + BodyColumns.INTRO_TEXT + " text, "
- + BodyColumns.QUOTED_TEXT_START_POS + " integer"
- + ");";
- db.execSQL("create table " + Body.TABLE_NAME + s);
- db.execSQL(createIndex(Body.TABLE_NAME, BodyColumns.MESSAGE_KEY));
- }
-
- static void upgradeBodyTable(SQLiteDatabase db, int oldVersion, int newVersion) {
- if (oldVersion < 5) {
- try {
- db.execSQL("drop table " + Body.TABLE_NAME);
- createBodyTable(db);
- oldVersion = 5;
- } catch (SQLException e) {
- }
- }
- if (oldVersion == 5) {
- try {
- db.execSQL("alter table " + Body.TABLE_NAME
- + " add " + BodyColumns.INTRO_TEXT + " text");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProviderBody.db from v5 to v6", e);
- }
- oldVersion = 6;
- }
- if (oldVersion == 6 || oldVersion == 7) {
- try {
- db.execSQL("alter table " + Body.TABLE_NAME
- + " add " + BodyColumns.QUOTED_TEXT_START_POS + " integer");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProviderBody.db from v6 to v8", e);
- }
- oldVersion = 8;
- }
- if (oldVersion == 8) {
- // Move to Email2 version
- oldVersion = 100;
- }
- }
-
- protected static class BodyDatabaseHelper extends SQLiteOpenHelper {
- BodyDatabaseHelper(Context context, String name) {
- super(context, name, null, BODY_DATABASE_VERSION);
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
- Log.d(TAG, "Creating EmailProviderBody database");
- createBodyTable(db);
- }
-
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- upgradeBodyTable(db, oldVersion, newVersion);
- }
-
- @Override
- public void onOpen(SQLiteDatabase db) {
- }
- }
-
- /** Counts the number of messages in each mailbox, and updates the message count column. */
- @VisibleForTesting
- static void recalculateMessageCount(SQLiteDatabase db) {
- db.execSQL("update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT +
- "= (select count(*) from " + Message.TABLE_NAME +
- " where " + Message.MAILBOX_KEY + " = " +
- Mailbox.TABLE_NAME + "." + EmailContent.RECORD_ID + ")");
- }
-
- protected static class DatabaseHelper extends SQLiteOpenHelper {
- Context mContext;
-
- DatabaseHelper(Context context, String name) {
- super(context, name, null, DATABASE_VERSION);
- mContext = context;
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
- Log.d(TAG, "Creating EmailProvider database");
- // Create all tables here; each class has its own method
- createMessageTable(db);
- createAttachmentTable(db);
- createMailboxTable(db);
- createHostAuthTable(db);
- createAccountTable(db);
- createPolicyTable(db);
- createQuickResponseTable(db);
- }
-
- public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- if (oldVersion == 101 && newVersion == 100) {
- Log.d(TAG, "Downgrade from v101 to v100");
- } else {
- super.onDowngrade(db, oldVersion, newVersion);
- }
- }
-
- @Override
- @SuppressWarnings("deprecation")
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- // For versions prior to 5, delete all data
- // Versions >= 5 require that data be preserved!
- if (oldVersion < 5) {
- android.accounts.Account[] accounts = AccountManager.get(mContext)
- .getAccountsByType(AccountManagerTypes.TYPE_EXCHANGE);
- for (android.accounts.Account account: accounts) {
- AccountManager.get(mContext).removeAccount(account, null, null);
- }
- resetMessageTable(db, oldVersion, newVersion);
- resetAttachmentTable(db, oldVersion, newVersion);
- resetMailboxTable(db, oldVersion, newVersion);
- resetHostAuthTable(db, oldVersion, newVersion);
- resetAccountTable(db, oldVersion, newVersion);
- return;
- }
- if (oldVersion == 5) {
- // Message Tables: Add SyncColumns.SERVER_TIMESTAMP
- try {
- db.execSQL("alter table " + Message.TABLE_NAME
- + " add column " + SyncColumns.SERVER_TIMESTAMP + " integer" + ";");
- db.execSQL("alter table " + Message.UPDATED_TABLE_NAME
- + " add column " + SyncColumns.SERVER_TIMESTAMP + " integer" + ";");
- db.execSQL("alter table " + Message.DELETED_TABLE_NAME
- + " add column " + SyncColumns.SERVER_TIMESTAMP + " integer" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from v5 to v6", e);
- }
- oldVersion = 6;
- }
- if (oldVersion == 6) {
- // Use the newer mailbox_delete trigger
- db.execSQL("drop trigger mailbox_delete;");
- db.execSQL(TRIGGER_MAILBOX_DELETE);
- oldVersion = 7;
- }
- if (oldVersion == 7) {
- // add the security (provisioning) column
- try {
- db.execSQL("alter table " + Account.TABLE_NAME
- + " add column " + AccountColumns.SECURITY_FLAGS + " integer" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 7 to 8 " + e);
- }
- oldVersion = 8;
- }
- if (oldVersion == 8) {
- // accounts: add security sync key & user signature columns
- try {
- db.execSQL("alter table " + Account.TABLE_NAME
- + " add column " + AccountColumns.SECURITY_SYNC_KEY + " text" + ";");
- db.execSQL("alter table " + Account.TABLE_NAME
- + " add column " + AccountColumns.SIGNATURE + " text" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 8 to 9 " + e);
- }
- oldVersion = 9;
- }
- if (oldVersion == 9) {
- // Message: add meeting info column into Message tables
- try {
- db.execSQL("alter table " + Message.TABLE_NAME
- + " add column " + MessageColumns.MEETING_INFO + " text" + ";");
- db.execSQL("alter table " + Message.UPDATED_TABLE_NAME
- + " add column " + MessageColumns.MEETING_INFO + " text" + ";");
- db.execSQL("alter table " + Message.DELETED_TABLE_NAME
- + " add column " + MessageColumns.MEETING_INFO + " text" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 9 to 10 " + e);
- }
- oldVersion = 10;
- }
- if (oldVersion == 10) {
- // Attachment: add content and flags columns
- try {
- db.execSQL("alter table " + Attachment.TABLE_NAME
- + " add column " + AttachmentColumns.CONTENT + " text" + ";");
- db.execSQL("alter table " + Attachment.TABLE_NAME
- + " add column " + AttachmentColumns.FLAGS + " integer" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 10 to 11 " + e);
- }
- oldVersion = 11;
- }
- if (oldVersion == 11) {
- // Attachment: add content_bytes
- try {
- db.execSQL("alter table " + Attachment.TABLE_NAME
- + " add column " + AttachmentColumns.CONTENT_BYTES + " blob" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 11 to 12 " + e);
- }
- oldVersion = 12;
- }
- if (oldVersion == 12) {
- try {
- db.execSQL("alter table " + Mailbox.TABLE_NAME
- + " add column " + Mailbox.MESSAGE_COUNT
- +" integer not null default 0" + ";");
- recalculateMessageCount(db);
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 12 to 13 " + e);
- }
- oldVersion = 13;
- }
- if (oldVersion == 13) {
- try {
- db.execSQL("alter table " + Message.TABLE_NAME
- + " add column " + Message.SNIPPET
- +" text" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 13 to 14 " + e);
- }
- oldVersion = 14;
- }
- if (oldVersion == 14) {
- try {
- db.execSQL("alter table " + Message.DELETED_TABLE_NAME
- + " add column " + Message.SNIPPET +" text" + ";");
- db.execSQL("alter table " + Message.UPDATED_TABLE_NAME
- + " add column " + Message.SNIPPET +" text" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 14 to 15 " + e);
- }
- oldVersion = 15;
- }
- if (oldVersion == 15) {
- try {
- db.execSQL("alter table " + Attachment.TABLE_NAME
- + " add column " + Attachment.ACCOUNT_KEY +" integer" + ";");
- // Update all existing attachments to add the accountKey data
- db.execSQL("update " + Attachment.TABLE_NAME + " set " +
- Attachment.ACCOUNT_KEY + "= (SELECT " + Message.TABLE_NAME + "." +
- Message.ACCOUNT_KEY + " from " + Message.TABLE_NAME + " where " +
- Message.TABLE_NAME + "." + Message.RECORD_ID + " = " +
- Attachment.TABLE_NAME + "." + Attachment.MESSAGE_KEY + ")");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 15 to 16 " + e);
- }
- oldVersion = 16;
- }
- if (oldVersion == 16) {
- try {
- db.execSQL("alter table " + Mailbox.TABLE_NAME
- + " add column " + Mailbox.PARENT_KEY + " integer;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 16 to 17 " + e);
- }
- oldVersion = 17;
- }
- if (oldVersion == 17) {
- upgradeFromVersion17ToVersion18(db);
- oldVersion = 18;
- }
- if (oldVersion == 18) {
- try {
- db.execSQL("alter table " + Account.TABLE_NAME
- + " add column " + Account.POLICY_KEY + " integer;");
- db.execSQL("drop trigger account_delete;");
- db.execSQL(TRIGGER_ACCOUNT_DELETE);
- createPolicyTable(db);
- convertPolicyFlagsToPolicyTable(db);
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 18 to 19 " + e);
- }
- oldVersion = 19;
- }
- if (oldVersion == 19) {
- try {
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.REQUIRE_MANUAL_SYNC_WHEN_ROAMING +
- " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.DONT_ALLOW_CAMERA + " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.DONT_ALLOW_ATTACHMENTS + " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.DONT_ALLOW_HTML + " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.MAX_ATTACHMENT_SIZE + " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.MAX_TEXT_TRUNCATION_SIZE +
- " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.MAX_HTML_TRUNCATION_SIZE +
- " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.MAX_EMAIL_LOOKBACK + " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.MAX_CALENDAR_LOOKBACK + " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.PASSWORD_RECOVERY_ENABLED +
- " integer;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 19 to 20 " + e);
- }
- oldVersion = 20;
- }
- if (oldVersion == 20) {
- oldVersion = 21;
- }
- if (oldVersion == 21) {
- upgradeFromVersion21ToVersion22(db, mContext);
- oldVersion = 22;
- }
- if (oldVersion == 22) {
- upgradeFromVersion22ToVersion23(db);
- oldVersion = 23;
- }
- if (oldVersion == 23) {
- upgradeFromVersion23ToVersion24(db);
- oldVersion = 24;
- }
- if (oldVersion == 24) {
- upgradeFromVersion24ToVersion25(db);
- oldVersion = 25;
- }
- if (oldVersion == 25) {
- upgradeFromVersion25ToVersion26(db);
- oldVersion = 26;
- }
- if (oldVersion == 26) {
- try {
- db.execSQL("alter table " + Message.TABLE_NAME
- + " add column " + Message.PROTOCOL_SEARCH_INFO + " text;");
- db.execSQL("alter table " + Message.DELETED_TABLE_NAME
- + " add column " + Message.PROTOCOL_SEARCH_INFO +" text" + ";");
- db.execSQL("alter table " + Message.UPDATED_TABLE_NAME
- + " add column " + Message.PROTOCOL_SEARCH_INFO +" text" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 26 to 27 " + e);
- }
- oldVersion = 27;
- }
- if (oldVersion == 27) {
- oldVersion = 28;
- }
- if (oldVersion == 28) {
- try {
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + Policy.PROTOCOL_POLICIES_ENFORCED + " text;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + Policy.PROTOCOL_POLICIES_UNSUPPORTED + " text;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 28 to 29 " + e);
- }
- oldVersion = 29;
- }
- if (oldVersion == 29) {
- upgradeFromVersion29ToVersion30(db);
- oldVersion = 30;
- }
- if (oldVersion == 30) {
- try {
- db.execSQL("alter table " + Mailbox.TABLE_NAME
- + " add column " + Mailbox.UI_SYNC_STATUS + " integer;");
- db.execSQL("alter table " + Mailbox.TABLE_NAME
- + " add column " + Mailbox.UI_LAST_SYNC_RESULT + " integer;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 30 to 31 " + e);
- }
- oldVersion = 31;
- }
- if (oldVersion == 31) {
- try {
- db.execSQL("alter table " + Mailbox.TABLE_NAME
- + " add column " + Mailbox.LAST_NOTIFIED_MESSAGE_KEY + " integer;");
- db.execSQL("alter table " + Mailbox.TABLE_NAME
- + " add column " + Mailbox.LAST_NOTIFIED_MESSAGE_COUNT + " integer;");
- db.execSQL("update Mailbox set " + Mailbox.LAST_NOTIFIED_MESSAGE_KEY +
- "=0 where " + Mailbox.LAST_NOTIFIED_MESSAGE_KEY + " IS NULL");
- db.execSQL("update Mailbox set " + Mailbox.LAST_NOTIFIED_MESSAGE_COUNT +
- "=0 where " + Mailbox.LAST_NOTIFIED_MESSAGE_COUNT + " IS NULL");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 31 to 32 " + e);
- }
- oldVersion = 32;
- }
- if (oldVersion == 32) {
- try {
- db.execSQL("alter table " + Attachment.TABLE_NAME
- + " add column " + Attachment.UI_STATE + " integer;");
- db.execSQL("alter table " + Attachment.TABLE_NAME
- + " add column " + Attachment.UI_DESTINATION + " integer;");
- db.execSQL("alter table " + Attachment.TABLE_NAME
- + " add column " + Attachment.UI_DOWNLOADED_SIZE + " integer;");
- // If we have a contentUri then the attachment is saved
- // uiDestination of 0 = "cache", so we don't have to set this
- db.execSQL("update " + Attachment.TABLE_NAME + " set " + Attachment.UI_STATE +
- "=" + UIProvider.AttachmentState.SAVED + " where " +
- AttachmentColumns.CONTENT_URI + " is not null;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 32 to 33 " + e);
- }
- oldVersion = 33;
- }
- if (oldVersion == 33) {
- try {
- db.execSQL("alter table " + Mailbox.TABLE_NAME
- + " add column " + MailboxColumns.TOTAL_COUNT + " integer;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 33 to 34 " + e);
- }
- oldVersion = 34;
- }
- if (oldVersion == 34) {
- try {
- db.execSQL("update " + Mailbox.TABLE_NAME + " set " +
- MailboxColumns.LAST_TOUCHED_TIME + " = " +
- Mailbox.DRAFTS_DEFAULT_TOUCH_TIME + " WHERE " + MailboxColumns.TYPE +
- " = " + Mailbox.TYPE_DRAFTS);
- db.execSQL("update " + Mailbox.TABLE_NAME + " set " +
- MailboxColumns.LAST_TOUCHED_TIME + " = " +
- Mailbox.SENT_DEFAULT_TOUCH_TIME + " WHERE " + MailboxColumns.TYPE +
- " = " + Mailbox.TYPE_SENT);
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 34 to 35 " + e);
- }
- oldVersion = 35;
- }
- if (oldVersion == 35 || oldVersion == 36) {
- try {
- // Set "supports settings" for EAS mailboxes
- db.execSQL("update " + Mailbox.TABLE_NAME + " set " +
- MailboxColumns.FLAGS + "=" + MailboxColumns.FLAGS + "|" +
- Mailbox.FLAG_SUPPORTS_SETTINGS + " where (" +
- MailboxColumns.FLAGS + "&" + Mailbox.FLAG_HOLDS_MAIL + ")!=0 and " +
- MailboxColumns.ACCOUNT_KEY + " IN (SELECT " + Account.TABLE_NAME +
- "." + AccountColumns.ID + " from " + Account.TABLE_NAME + "," +
- HostAuth.TABLE_NAME + " where " + Account.TABLE_NAME + "." +
- AccountColumns.HOST_AUTH_KEY_RECV + "=" + HostAuth.TABLE_NAME + "." +
- HostAuthColumns.ID + " and " + HostAuthColumns.PROTOCOL + "='" +
- HostAuth.LEGACY_SCHEME_EAS + "')");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 35 to 36 " + e);
- }
- oldVersion = 37;
- }
- if (oldVersion == 37) {
- try {
- db.execSQL("alter table " + Message.TABLE_NAME
- + " add column " + MessageColumns.THREAD_TOPIC + " text;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 37 to 38 " + e);
- }
- oldVersion = 38;
- }
- if (oldVersion == 38) {
- try {
- db.execSQL("alter table " + Message.DELETED_TABLE_NAME
- + " add column " + MessageColumns.THREAD_TOPIC + " text;");
- db.execSQL("alter table " + Message.UPDATED_TABLE_NAME
- + " add column " + MessageColumns.THREAD_TOPIC + " text;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 38 to 39 " + e);
- }
- oldVersion = 39;
- }
- if (oldVersion == 39) {
- upgradeToEmail2(db);
- oldVersion = 100;
- }
- if (oldVersion >= 100 && oldVersion < 103) {
- try {
- db.execSQL("alter table " + Mailbox.TABLE_NAME
- + " add " + MailboxColumns.HIERARCHICAL_NAME + " text");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProviderBody.db from v6 to v8", e);
- }
- oldVersion = 103;
- }
- }
-
- @Override
- public void onOpen(SQLiteDatabase db) {
- }
- }
-
- @VisibleForTesting
- @SuppressWarnings("deprecation")
- static void convertPolicyFlagsToPolicyTable(SQLiteDatabase db) {
- Cursor c = db.query(Account.TABLE_NAME,
- new String[] {EmailContent.RECORD_ID /*0*/, AccountColumns.SECURITY_FLAGS /*1*/},
- AccountColumns.SECURITY_FLAGS + ">0", null, null, null, null);
- ContentValues cv = new ContentValues();
- String[] args = new String[1];
- while (c.moveToNext()) {
- long securityFlags = c.getLong(1 /*SECURITY_FLAGS*/);
- Policy policy = LegacyPolicySet.flagsToPolicy(securityFlags);
- long policyId = db.insert(Policy.TABLE_NAME, null, policy.toContentValues());
- cv.put(AccountColumns.POLICY_KEY, policyId);
- cv.putNull(AccountColumns.SECURITY_FLAGS);
- args[0] = Long.toString(c.getLong(0 /*RECORD_ID*/));
- db.update(Account.TABLE_NAME, cv, EmailContent.RECORD_ID + "=?", args);
- }
- }
-
- /** Upgrades the database from v17 to v18 */
- @VisibleForTesting
- static void upgradeFromVersion17ToVersion18(SQLiteDatabase db) {
- // Copy the displayName column to the serverId column. In v18 of the database,
- // we use the serverId for IMAP/POP3 mailboxes instead of overloading the
- // display name.
- //
- // For posterity; this is the command we're executing:
- //sqlite> UPDATE mailbox SET serverid=displayname WHERE mailbox._id in (
- // ...> SELECT mailbox._id FROM mailbox,account,hostauth WHERE
- // ...> (mailbox.parentkey isnull OR mailbox.parentkey=0) AND
- // ...> mailbox.accountkey=account._id AND
- // ...> account.hostauthkeyrecv=hostauth._id AND
- // ...> (hostauth.protocol='imap' OR hostauth.protocol='pop3'));
- try {
- db.execSQL(
- "UPDATE " + Mailbox.TABLE_NAME + " SET "
- + MailboxColumns.SERVER_ID + "=" + MailboxColumns.DISPLAY_NAME
- + " WHERE "
- + Mailbox.TABLE_NAME + "." + MailboxColumns.ID + " IN ( SELECT "
- + Mailbox.TABLE_NAME + "." + MailboxColumns.ID + " FROM "
- + Mailbox.TABLE_NAME + "," + Account.TABLE_NAME + ","
- + HostAuth.TABLE_NAME + " WHERE "
- + "("
- + Mailbox.TABLE_NAME + "." + MailboxColumns.PARENT_KEY + " isnull OR "
- + Mailbox.TABLE_NAME + "." + MailboxColumns.PARENT_KEY + "=0 "
- + ") AND "
- + Mailbox.TABLE_NAME + "." + MailboxColumns.ACCOUNT_KEY + "="
- + Account.TABLE_NAME + "." + AccountColumns.ID + " AND "
- + Account.TABLE_NAME + "." + AccountColumns.HOST_AUTH_KEY_RECV + "="
- + HostAuth.TABLE_NAME + "." + HostAuthColumns.ID + " AND ( "
- + HostAuth.TABLE_NAME + "." + HostAuthColumns.PROTOCOL + "='imap' OR "
- + HostAuth.TABLE_NAME + "." + HostAuthColumns.PROTOCOL + "='pop3' ) )");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 17 to 18 " + e);
- }
- ContentCache.invalidateAllCaches();
- }
-
- /**
- * Upgrade the database from v21 to v22
- * This entails creating AccountManager accounts for all pop3 and imap accounts
- */
-
- private static final String[] V21_ACCOUNT_PROJECTION =
- new String[] {AccountColumns.HOST_AUTH_KEY_RECV, AccountColumns.EMAIL_ADDRESS};
- private static final int V21_ACCOUNT_RECV = 0;
- private static final int V21_ACCOUNT_EMAIL = 1;
-
- private static final String[] V21_HOSTAUTH_PROJECTION =
- new String[] {HostAuthColumns.PROTOCOL, HostAuthColumns.PASSWORD};
- private static final int V21_HOSTAUTH_PROTOCOL = 0;
- private static final int V21_HOSTAUTH_PASSWORD = 1;
-
- static private void createAccountManagerAccount(Context context, String login,
- String password) {
- AccountManager accountManager = AccountManager.get(context);
- android.accounts.Account amAccount =
- new android.accounts.Account(login, AccountManagerTypes.TYPE_POP_IMAP);
- accountManager.addAccountExplicitly(amAccount, password, null);
- ContentResolver.setIsSyncable(amAccount, EmailContent.AUTHORITY, 1);
- ContentResolver.setSyncAutomatically(amAccount, EmailContent.AUTHORITY, true);
- ContentResolver.setIsSyncable(amAccount, ContactsContract.AUTHORITY, 0);
- ContentResolver.setIsSyncable(amAccount, CalendarContract.AUTHORITY, 0);
- }
-
- @VisibleForTesting
- static void upgradeFromVersion21ToVersion22(SQLiteDatabase db, Context accountManagerContext) {
- try {
- // Loop through accounts, looking for pop/imap accounts
- Cursor accountCursor = db.query(Account.TABLE_NAME, V21_ACCOUNT_PROJECTION, null,
- null, null, null, null);
- try {
- String[] hostAuthArgs = new String[1];
- while (accountCursor.moveToNext()) {
- hostAuthArgs[0] = accountCursor.getString(V21_ACCOUNT_RECV);
- // Get the "receive" HostAuth for this account
- Cursor hostAuthCursor = db.query(HostAuth.TABLE_NAME,
- V21_HOSTAUTH_PROJECTION, HostAuth.RECORD_ID + "=?", hostAuthArgs,
- null, null, null);
- try {
- if (hostAuthCursor.moveToFirst()) {
- String protocol = hostAuthCursor.getString(V21_HOSTAUTH_PROTOCOL);
- // If this is a pop3 or imap account, create the account manager account
- if (HostAuth.LEGACY_SCHEME_IMAP.equals(protocol) ||
- HostAuth.LEGACY_SCHEME_POP3.equals(protocol)) {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "Create AccountManager account for " + protocol +
- "account: " +
- accountCursor.getString(V21_ACCOUNT_EMAIL));
- }
- createAccountManagerAccount(accountManagerContext,
- accountCursor.getString(V21_ACCOUNT_EMAIL),
- hostAuthCursor.getString(V21_HOSTAUTH_PASSWORD));
- // If an EAS account, make Email sync automatically (equivalent of
- // checking the "Sync Email" box in settings
- } else if (HostAuth.LEGACY_SCHEME_EAS.equals(protocol)) {
- android.accounts.Account amAccount =
- new android.accounts.Account(
- accountCursor.getString(V21_ACCOUNT_EMAIL),
- AccountManagerTypes.TYPE_EXCHANGE);
- ContentResolver.setIsSyncable(amAccount, EmailContent.AUTHORITY, 1);
- ContentResolver.setSyncAutomatically(amAccount,
- EmailContent.AUTHORITY, true);
-
- }
- }
- } finally {
- hostAuthCursor.close();
- }
- }
- } finally {
- accountCursor.close();
- }
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 20 to 21 " + e);
- }
- }
-
- /** Upgrades the database from v22 to v23 */
- private static void upgradeFromVersion22ToVersion23(SQLiteDatabase db) {
- try {
- db.execSQL("alter table " + Mailbox.TABLE_NAME
- + " add column " + Mailbox.LAST_TOUCHED_TIME + " integer default 0;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 22 to 23 " + e);
- }
- }
-
- /** Adds in a column for information about a client certificate to use. */
- private static void upgradeFromVersion23ToVersion24(SQLiteDatabase db) {
- try {
- db.execSQL("alter table " + HostAuth.TABLE_NAME
- + " add column " + HostAuth.CLIENT_CERT_ALIAS + " text;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 23 to 24 " + e);
- }
- }
-
- /** Upgrades the database from v24 to v25 by creating table for quick responses */
- private static void upgradeFromVersion24ToVersion25(SQLiteDatabase db) {
- try {
- createQuickResponseTable(db);
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 24 to 25 " + e);
- }
- }
-
- private static final String[] V25_ACCOUNT_PROJECTION =
- new String[] {AccountColumns.ID, AccountColumns.FLAGS, AccountColumns.HOST_AUTH_KEY_RECV};
- private static final int V25_ACCOUNT_ID = 0;
- private static final int V25_ACCOUNT_FLAGS = 1;
- private static final int V25_ACCOUNT_RECV = 2;
-
- private static final String[] V25_HOSTAUTH_PROJECTION = new String[] {HostAuthColumns.PROTOCOL};
- private static final int V25_HOSTAUTH_PROTOCOL = 0;
-
- /** Upgrades the database from v25 to v26 by adding FLAG_SUPPORTS_SEARCH to IMAP accounts */
- private static void upgradeFromVersion25ToVersion26(SQLiteDatabase db) {
- try {
- // Loop through accounts, looking for imap accounts
- Cursor accountCursor = db.query(Account.TABLE_NAME, V25_ACCOUNT_PROJECTION, null,
- null, null, null, null);
- ContentValues cv = new ContentValues();
- try {
- String[] hostAuthArgs = new String[1];
- while (accountCursor.moveToNext()) {
- hostAuthArgs[0] = accountCursor.getString(V25_ACCOUNT_RECV);
- // Get the "receive" HostAuth for this account
- Cursor hostAuthCursor = db.query(HostAuth.TABLE_NAME,
- V25_HOSTAUTH_PROJECTION, HostAuth.RECORD_ID + "=?", hostAuthArgs,
- null, null, null);
- try {
- if (hostAuthCursor.moveToFirst()) {
- String protocol = hostAuthCursor.getString(V25_HOSTAUTH_PROTOCOL);
- // If this is an imap account, add the search flag
- if (HostAuth.LEGACY_SCHEME_IMAP.equals(protocol)) {
- String id = accountCursor.getString(V25_ACCOUNT_ID);
- int flags = accountCursor.getInt(V25_ACCOUNT_FLAGS);
- cv.put(AccountColumns.FLAGS, flags | Account.FLAGS_SUPPORTS_SEARCH);
- db.update(Account.TABLE_NAME, cv, Account.RECORD_ID + "=?",
- new String[] {id});
- }
- }
- } finally {
- hostAuthCursor.close();
- }
- }
- } finally {
- accountCursor.close();
- }
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 25 to 26 " + e);
- }
- }
-
- /** Upgrades the database from v29 to v30 by updating all address fields in Message */
- private static final int[] ADDRESS_COLUMN_INDICES = new int[] {
- Message.CONTENT_BCC_LIST_COLUMN, Message.CONTENT_CC_LIST_COLUMN,
- Message.CONTENT_FROM_LIST_COLUMN, Message.CONTENT_REPLY_TO_COLUMN,
- Message.CONTENT_TO_LIST_COLUMN
- };
- private static final String[] ADDRESS_COLUMN_NAMES = new String[] {
- Message.BCC_LIST, Message.CC_LIST, Message.FROM_LIST, Message.REPLY_TO_LIST, Message.TO_LIST
- };
-
- private static void upgradeFromVersion29ToVersion30(SQLiteDatabase db) {
- try {
- // Loop through all messages, updating address columns to new format (CSV, RFC822)
- Cursor messageCursor = db.query(Message.TABLE_NAME, Message.CONTENT_PROJECTION, null,
- null, null, null, null);
- ContentValues cv = new ContentValues();
- String[] whereArgs = new String[1];
- try {
- while (messageCursor.moveToNext()) {
- for (int i = 0; i < ADDRESS_COLUMN_INDICES.length; i++) {
- Address[] addrs =
- Address.unpack(messageCursor.getString(ADDRESS_COLUMN_INDICES[i]));
- cv.put(ADDRESS_COLUMN_NAMES[i], Address.pack(addrs));
- }
- whereArgs[0] = messageCursor.getString(Message.CONTENT_ID_COLUMN);
- db.update(Message.TABLE_NAME, cv, WHERE_ID, whereArgs);
- }
- } finally {
- messageCursor.close();
- }
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 29 to 30 " + e);
- }
- }
-
- private static void upgradeToEmail2(SQLiteDatabase db) {
- // Perform cleanup operations from Email1 to Email2; Email1 will have added new
- // data that won't conform to what's expected in Email2
-
- // From 31->32 upgrade
- try {
- db.execSQL("update Mailbox set " + Mailbox.LAST_NOTIFIED_MESSAGE_KEY +
- "=0 where " + Mailbox.LAST_NOTIFIED_MESSAGE_KEY + " IS NULL");
- db.execSQL("update Mailbox set " + Mailbox.LAST_NOTIFIED_MESSAGE_COUNT +
- "=0 where " + Mailbox.LAST_NOTIFIED_MESSAGE_COUNT + " IS NULL");
- } catch (SQLException e) {
- Log.w(TAG, "Exception upgrading EmailProvider.db from 31 to 32/100 " + e);
- }
-
- // From 32->33 upgrade
- try {
- db.execSQL("update " + Attachment.TABLE_NAME + " set " + Attachment.UI_STATE +
- "=" + UIProvider.AttachmentState.SAVED + " where " +
- AttachmentColumns.CONTENT_URI + " is not null;");
- } catch (SQLException e) {
- Log.w(TAG, "Exception upgrading EmailProvider.db from 32 to 33/100 " + e);
- }
-
- // From 34->35 upgrade
- try {
- db.execSQL("update " + Mailbox.TABLE_NAME + " set " +
- MailboxColumns.LAST_TOUCHED_TIME + " = " +
- Mailbox.DRAFTS_DEFAULT_TOUCH_TIME + " WHERE " + MailboxColumns.TYPE +
- " = " + Mailbox.TYPE_DRAFTS);
- db.execSQL("update " + Mailbox.TABLE_NAME + " set " +
- MailboxColumns.LAST_TOUCHED_TIME + " = " +
- Mailbox.SENT_DEFAULT_TOUCH_TIME + " WHERE " + MailboxColumns.TYPE +
- " = " + Mailbox.TYPE_SENT);
- } catch (SQLException e) {
- Log.w(TAG, "Exception upgrading EmailProvider.db from 34 to 35/100 " + e);
- }
-
- // From 35/36->37
- try {
- db.execSQL("update " + Mailbox.TABLE_NAME + " set " +
- MailboxColumns.FLAGS + "=" + MailboxColumns.FLAGS + "|" +
- Mailbox.FLAG_SUPPORTS_SETTINGS + " where (" +
- MailboxColumns.FLAGS + "&" + Mailbox.FLAG_HOLDS_MAIL + ")!=0 and " +
- MailboxColumns.ACCOUNT_KEY + " IN (SELECT " + Account.TABLE_NAME +
- "." + AccountColumns.ID + " from " + Account.TABLE_NAME + "," +
- HostAuth.TABLE_NAME + " where " + Account.TABLE_NAME + "." +
- AccountColumns.HOST_AUTH_KEY_RECV + "=" + HostAuth.TABLE_NAME + "." +
- HostAuthColumns.ID + " and " + HostAuthColumns.PROTOCOL + "='" +
- HostAuth.LEGACY_SCHEME_EAS + "')");
- } catch (SQLException e) {
- Log.w(TAG, "Exception upgrading EmailProvider.db from 35/36 to 37/100 " + e);
- }
- }
-}
diff --git a/email2/src/com/android/email/provider/EmailProvider.java b/email2/src/com/android/email/provider/EmailProvider.java
deleted file mode 100644
index 5a8c6c2af..000000000
--- a/email2/src/com/android/email/provider/EmailProvider.java
+++ /dev/null
@@ -1,4067 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.provider;
-
-import android.appwidget.AppWidgetManager;
-import android.content.ComponentName;
-import android.content.ContentProvider;
-import android.content.ContentProviderOperation;
-import android.content.ContentProviderResult;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.OperationApplicationException;
-import android.content.UriMatcher;
-import android.database.ContentObserver;
-import android.database.Cursor;
-import android.database.CursorWrapper;
-import android.database.MatrixCursor;
-import android.database.MergeCursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteException;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.RemoteException;
-import android.provider.BaseColumns;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.common.content.ProjectionMap;
-import com.android.email.NotificationController;
-import com.android.email.Preferences;
-import com.android.email.R;
-import com.android.email.SecurityPolicy;
-import com.android.email.provider.ContentCache.CacheToken;
-import com.android.email.service.AttachmentDownloadService;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.Address;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
-import com.android.emailcommon.provider.EmailContent.Body;
-import com.android.emailcommon.provider.EmailContent.BodyColumns;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.emailcommon.provider.EmailContent.PolicyColumns;
-import com.android.emailcommon.provider.EmailContent.SyncColumns;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.provider.Policy;
-import com.android.emailcommon.provider.QuickResponse;
-import com.android.emailcommon.service.EmailServiceProxy;
-import com.android.emailcommon.service.IEmailService;
-import com.android.emailcommon.service.IEmailServiceCallback;
-import com.android.emailcommon.service.SearchParams;
-import com.android.emailcommon.utility.AttachmentUtilities;
-import com.android.emailcommon.utility.Utility;
-import com.android.mail.providers.UIProvider;
-import com.android.mail.providers.UIProvider.AccountCapabilities;
-import com.android.mail.providers.UIProvider.AccountCursorExtraKeys;
-import com.android.mail.providers.UIProvider.ConversationPriority;
-import com.android.mail.providers.UIProvider.ConversationSendingState;
-import com.android.mail.providers.UIProvider.DraftType;
-import com.android.mail.utils.LogUtils;
-import com.android.mail.utils.MatrixCursorWithExtra;
-import com.android.mail.utils.Utils;
-import com.android.mail.widget.BaseWidgetProvider;
-import com.android.mail.widget.WidgetProvider;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-/**
- * @author mblank
- *
- */
-public class EmailProvider extends ContentProvider {
-
- private static final String TAG = "EmailProvider";
-
- public static final String EMAIL_APP_MIME_TYPE = "application/email-ls";
-
- protected static final String DATABASE_NAME = "EmailProvider.db";
- protected static final String BODY_DATABASE_NAME = "EmailProviderBody.db";
- protected static final String BACKUP_DATABASE_NAME = "EmailProviderBackup.db";
-
- public static final String ACTION_ATTACHMENT_UPDATED = "com.android.email.ATTACHMENT_UPDATED";
- public static final String ATTACHMENT_UPDATED_EXTRA_FLAGS =
- "com.android.email.ATTACHMENT_UPDATED_FLAGS";
-
- /**
- * Notifies that changes happened. Certain UI components, e.g., widgets, can register for this
- * {@link android.content.Intent} and update accordingly. However, this can be very broad and
- * is NOT the preferred way of getting notification.
- */
- public static final String ACTION_NOTIFY_MESSAGE_LIST_DATASET_CHANGED =
- "com.android.email.MESSAGE_LIST_DATASET_CHANGED";
-
- public static final String EMAIL_MESSAGE_MIME_TYPE =
- "vnd.android.cursor.item/email-message";
- public static final String EMAIL_ATTACHMENT_MIME_TYPE =
- "vnd.android.cursor.item/email-attachment";
-
- public static final Uri INTEGRITY_CHECK_URI =
- Uri.parse("content://" + EmailContent.AUTHORITY + "/integrityCheck");
- public static final Uri ACCOUNT_BACKUP_URI =
- Uri.parse("content://" + EmailContent.AUTHORITY + "/accountBackup");
- public static final Uri FOLDER_STATUS_URI =
- Uri.parse("content://" + EmailContent.AUTHORITY + "/status");
- public static final Uri FOLDER_REFRESH_URI =
- Uri.parse("content://" + EmailContent.AUTHORITY + "/refresh");
-
- /** Appended to the notification URI for delete operations */
- public static final String NOTIFICATION_OP_DELETE = "delete";
- /** Appended to the notification URI for insert operations */
- public static final String NOTIFICATION_OP_INSERT = "insert";
- /** Appended to the notification URI for update operations */
- public static final String NOTIFICATION_OP_UPDATE = "update";
-
- // Definitions for our queries looking for orphaned messages
- private static final String[] ORPHANS_PROJECTION
- = new String[] {MessageColumns.ID, MessageColumns.MAILBOX_KEY};
- private static final int ORPHANS_ID = 0;
- private static final int ORPHANS_MAILBOX_KEY = 1;
-
- private static final String WHERE_ID = EmailContent.RECORD_ID + "=?";
-
- // This is not a hard limit on accounts, per se, but beyond this, we can't guarantee that all
- // critical mailboxes, host auth's, accounts, and policies are cached
- private static final int MAX_CACHED_ACCOUNTS = 16;
- // Inbox, Drafts, Sent, Outbox, Trash, and Search (these boxes are cached when possible)
- private static final int NUM_ALWAYS_CACHED_MAILBOXES = 6;
-
- // We'll cache the following four tables; sizes are best estimates of effective values
- private final ContentCache mCacheAccount =
- new ContentCache("Account", Account.CONTENT_PROJECTION, MAX_CACHED_ACCOUNTS);
- private final ContentCache mCacheHostAuth =
- new ContentCache("HostAuth", HostAuth.CONTENT_PROJECTION, MAX_CACHED_ACCOUNTS * 2);
- /*package*/ final ContentCache mCacheMailbox =
- new ContentCache("Mailbox", Mailbox.CONTENT_PROJECTION,
- MAX_CACHED_ACCOUNTS * (NUM_ALWAYS_CACHED_MAILBOXES + 2));
- private final ContentCache mCacheMessage =
- new ContentCache("Message", Message.CONTENT_PROJECTION, 8);
- private final ContentCache mCachePolicy =
- new ContentCache("Policy", Policy.CONTENT_PROJECTION, MAX_CACHED_ACCOUNTS);
-
- private static final int ACCOUNT_BASE = 0;
- private static final int ACCOUNT = ACCOUNT_BASE;
- private static final int ACCOUNT_ID = ACCOUNT_BASE + 1;
- private static final int ACCOUNT_ID_ADD_TO_FIELD = ACCOUNT_BASE + 2;
- private static final int ACCOUNT_RESET_NEW_COUNT = ACCOUNT_BASE + 3;
- private static final int ACCOUNT_RESET_NEW_COUNT_ID = ACCOUNT_BASE + 4;
- private static final int ACCOUNT_DEFAULT_ID = ACCOUNT_BASE + 5;
- private static final int ACCOUNT_CHECK = ACCOUNT_BASE + 6;
-
- private static final int MAILBOX_BASE = 0x1000;
- private static final int MAILBOX = MAILBOX_BASE;
- private static final int MAILBOX_ID = MAILBOX_BASE + 1;
- private static final int MAILBOX_ID_FROM_ACCOUNT_AND_TYPE = MAILBOX_BASE + 2;
- private static final int MAILBOX_ID_ADD_TO_FIELD = MAILBOX_BASE + 3;
- private static final int MAILBOX_NOTIFICATION = MAILBOX_BASE + 4;
- private static final int MAILBOX_MOST_RECENT_MESSAGE = MAILBOX_BASE + 5;
-
- private static final int MESSAGE_BASE = 0x2000;
- private static final int MESSAGE = MESSAGE_BASE;
- private static final int MESSAGE_ID = MESSAGE_BASE + 1;
- private static final int SYNCED_MESSAGE_ID = MESSAGE_BASE + 2;
-
- private static final int ATTACHMENT_BASE = 0x3000;
- private static final int ATTACHMENT = ATTACHMENT_BASE;
- private static final int ATTACHMENT_ID = ATTACHMENT_BASE + 1;
- private static final int ATTACHMENTS_MESSAGE_ID = ATTACHMENT_BASE + 2;
-
- private static final int HOSTAUTH_BASE = 0x4000;
- private static final int HOSTAUTH = HOSTAUTH_BASE;
- private static final int HOSTAUTH_ID = HOSTAUTH_BASE + 1;
-
- private static final int UPDATED_MESSAGE_BASE = 0x5000;
- private static final int UPDATED_MESSAGE = UPDATED_MESSAGE_BASE;
- private static final int UPDATED_MESSAGE_ID = UPDATED_MESSAGE_BASE + 1;
-
- private static final int DELETED_MESSAGE_BASE = 0x6000;
- private static final int DELETED_MESSAGE = DELETED_MESSAGE_BASE;
- private static final int DELETED_MESSAGE_ID = DELETED_MESSAGE_BASE + 1;
-
- private static final int POLICY_BASE = 0x7000;
- private static final int POLICY = POLICY_BASE;
- private static final int POLICY_ID = POLICY_BASE + 1;
-
- private static final int QUICK_RESPONSE_BASE = 0x8000;
- private static final int QUICK_RESPONSE = QUICK_RESPONSE_BASE;
- private static final int QUICK_RESPONSE_ID = QUICK_RESPONSE_BASE + 1;
- private static final int QUICK_RESPONSE_ACCOUNT_ID = QUICK_RESPONSE_BASE + 2;
-
- private static final int UI_BASE = 0x9000;
- private static final int UI_FOLDERS = UI_BASE;
- private static final int UI_SUBFOLDERS = UI_BASE + 1;
- private static final int UI_MESSAGES = UI_BASE + 2;
- private static final int UI_MESSAGE = UI_BASE + 3;
- private static final int UI_SENDMAIL = UI_BASE + 4;
- private static final int UI_UNDO = UI_BASE + 5;
- private static final int UI_SAVEDRAFT = UI_BASE + 6;
- private static final int UI_UPDATEDRAFT = UI_BASE + 7;
- private static final int UI_SENDDRAFT = UI_BASE + 8;
- private static final int UI_FOLDER_REFRESH = UI_BASE + 9;
- private static final int UI_FOLDER = UI_BASE + 10;
- private static final int UI_ACCOUNT = UI_BASE + 11;
- private static final int UI_ACCTS = UI_BASE + 12;
- private static final int UI_ATTACHMENTS = UI_BASE + 13;
- private static final int UI_ATTACHMENT = UI_BASE + 14;
- private static final int UI_SEARCH = UI_BASE + 15;
- private static final int UI_ACCOUNT_DATA = UI_BASE + 16;
- private static final int UI_FOLDER_LOAD_MORE = UI_BASE + 17;
- private static final int UI_CONVERSATION = UI_BASE + 18;
- private static final int UI_RECENT_FOLDERS = UI_BASE + 19;
- private static final int UI_DEFAULT_RECENT_FOLDERS = UI_BASE + 20;
- private static final int UI_ALL_FOLDERS = UI_BASE + 21;
-
- // MUST ALWAYS EQUAL THE LAST OF THE PREVIOUS BASE CONSTANTS
- private static final int LAST_EMAIL_PROVIDER_DB_BASE = UI_BASE;
-
- // DO NOT CHANGE BODY_BASE!!
- private static final int BODY_BASE = LAST_EMAIL_PROVIDER_DB_BASE + 0x1000;
- private static final int BODY = BODY_BASE;
- private static final int BODY_ID = BODY_BASE + 1;
-
- private static final int BASE_SHIFT = 12; // 12 bits to the base type: 0, 0x1000, 0x2000, etc.
-
- // TABLE_NAMES MUST remain in the order of the BASE constants above (e.g. ACCOUNT_BASE = 0x0000,
- // MESSAGE_BASE = 0x1000, etc.)
- private static final String[] TABLE_NAMES = {
- Account.TABLE_NAME,
- Mailbox.TABLE_NAME,
- Message.TABLE_NAME,
- Attachment.TABLE_NAME,
- HostAuth.TABLE_NAME,
- Message.UPDATED_TABLE_NAME,
- Message.DELETED_TABLE_NAME,
- Policy.TABLE_NAME,
- QuickResponse.TABLE_NAME,
- null, // UI
- Body.TABLE_NAME,
- };
-
- // CONTENT_CACHES MUST remain in the order of the BASE constants above
- private final ContentCache[] mContentCaches = {
- mCacheAccount,
- mCacheMailbox,
- mCacheMessage,
- null, // Attachment
- mCacheHostAuth,
- null, // Updated message
- null, // Deleted message
- mCachePolicy,
- null, // Quick response
- null, // Body
- null // UI
- };
-
- // CACHE_PROJECTIONS MUST remain in the order of the BASE constants above
- private static final String[][] CACHE_PROJECTIONS = {
- Account.CONTENT_PROJECTION,
- Mailbox.CONTENT_PROJECTION,
- Message.CONTENT_PROJECTION,
- null, // Attachment
- HostAuth.CONTENT_PROJECTION,
- null, // Updated message
- null, // Deleted message
- Policy.CONTENT_PROJECTION,
- null, // Quick response
- null, // Body
- null // UI
- };
-
- private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
-
- private static final String MAILBOX_PRE_CACHE_SELECTION = MailboxColumns.TYPE + " IN (" +
- Mailbox.TYPE_INBOX + "," + Mailbox.TYPE_DRAFTS + "," + Mailbox.TYPE_TRASH + "," +
- Mailbox.TYPE_SENT + "," + Mailbox.TYPE_SEARCH + "," + Mailbox.TYPE_OUTBOX + ")";
-
- /**
- * Let's only generate these SQL strings once, as they are used frequently
- * Note that this isn't relevant for table creation strings, since they are used only once
- */
- private static final String UPDATED_MESSAGE_INSERT = "insert or ignore into " +
- Message.UPDATED_TABLE_NAME + " select * from " + Message.TABLE_NAME + " where " +
- EmailContent.RECORD_ID + '=';
-
- private static final String UPDATED_MESSAGE_DELETE = "delete from " +
- Message.UPDATED_TABLE_NAME + " where " + EmailContent.RECORD_ID + '=';
-
- private static final String DELETED_MESSAGE_INSERT = "insert or replace into " +
- Message.DELETED_TABLE_NAME + " select * from " + Message.TABLE_NAME + " where " +
- EmailContent.RECORD_ID + '=';
-
- private static final String DELETE_ORPHAN_BODIES = "delete from " + Body.TABLE_NAME +
- " where " + BodyColumns.MESSAGE_KEY + " in " + "(select " + BodyColumns.MESSAGE_KEY +
- " from " + Body.TABLE_NAME + " except select " + EmailContent.RECORD_ID + " from " +
- Message.TABLE_NAME + ')';
-
- private static final String DELETE_BODY = "delete from " + Body.TABLE_NAME +
- " where " + BodyColumns.MESSAGE_KEY + '=';
-
- private static final String ID_EQUALS = EmailContent.RECORD_ID + "=?";
-
- private static final ContentValues CONTENT_VALUES_RESET_NEW_MESSAGE_COUNT;
- private static final ContentValues EMPTY_CONTENT_VALUES = new ContentValues();
-
- public static final String MESSAGE_URI_PARAMETER_MAILBOX_ID = "mailboxId";
-
- // For undo handling
- private int mLastSequence = -1;
- private ArrayList<ContentProviderOperation> mLastSequenceOps =
- new ArrayList<ContentProviderOperation>();
-
- // Query parameter indicating the command came from UIProvider
- private static final String IS_UIPROVIDER = "is_uiprovider";
-
- static {
- // Email URI matching table
- UriMatcher matcher = sURIMatcher;
-
- // All accounts
- matcher.addURI(EmailContent.AUTHORITY, "account", ACCOUNT);
- // A specific account
- // insert into this URI causes a mailbox to be added to the account
- matcher.addURI(EmailContent.AUTHORITY, "account/#", ACCOUNT_ID);
- matcher.addURI(EmailContent.AUTHORITY, "account/default", ACCOUNT_DEFAULT_ID);
- matcher.addURI(EmailContent.AUTHORITY, "accountCheck/#", ACCOUNT_CHECK);
-
- // Special URI to reset the new message count. Only update works, and content values
- // will be ignored.
- matcher.addURI(EmailContent.AUTHORITY, "resetNewMessageCount",
- ACCOUNT_RESET_NEW_COUNT);
- matcher.addURI(EmailContent.AUTHORITY, "resetNewMessageCount/#",
- ACCOUNT_RESET_NEW_COUNT_ID);
-
- // All mailboxes
- matcher.addURI(EmailContent.AUTHORITY, "mailbox", MAILBOX);
- // A specific mailbox
- // insert into this URI causes a message to be added to the mailbox
- // ** NOTE For now, the accountKey must be set manually in the values!
- matcher.addURI(EmailContent.AUTHORITY, "mailbox/#", MAILBOX_ID);
- matcher.addURI(EmailContent.AUTHORITY, "mailboxIdFromAccountAndType/#/#",
- MAILBOX_ID_FROM_ACCOUNT_AND_TYPE);
- matcher.addURI(EmailContent.AUTHORITY, "mailboxNotification/#", MAILBOX_NOTIFICATION);
- matcher.addURI(EmailContent.AUTHORITY, "mailboxMostRecentMessage/#",
- MAILBOX_MOST_RECENT_MESSAGE);
-
- // All messages
- matcher.addURI(EmailContent.AUTHORITY, "message", MESSAGE);
- // A specific message
- // insert into this URI causes an attachment to be added to the message
- matcher.addURI(EmailContent.AUTHORITY, "message/#", MESSAGE_ID);
-
- // A specific attachment
- matcher.addURI(EmailContent.AUTHORITY, "attachment", ATTACHMENT);
- // A specific attachment (the header information)
- matcher.addURI(EmailContent.AUTHORITY, "attachment/#", ATTACHMENT_ID);
- // The attachments of a specific message (query only) (insert & delete TBD)
- matcher.addURI(EmailContent.AUTHORITY, "attachment/message/#",
- ATTACHMENTS_MESSAGE_ID);
-
- // All mail bodies
- matcher.addURI(EmailContent.AUTHORITY, "body", BODY);
- // A specific mail body
- matcher.addURI(EmailContent.AUTHORITY, "body/#", BODY_ID);
-
- // All hostauth records
- matcher.addURI(EmailContent.AUTHORITY, "hostauth", HOSTAUTH);
- // A specific hostauth
- matcher.addURI(EmailContent.AUTHORITY, "hostauth/#", HOSTAUTH_ID);
-
- // Atomically a constant value to a particular field of a mailbox/account
- matcher.addURI(EmailContent.AUTHORITY, "mailboxIdAddToField/#",
- MAILBOX_ID_ADD_TO_FIELD);
- matcher.addURI(EmailContent.AUTHORITY, "accountIdAddToField/#",
- ACCOUNT_ID_ADD_TO_FIELD);
-
- /**
- * THIS URI HAS SPECIAL SEMANTICS
- * ITS USE IS INTENDED FOR THE UI APPLICATION TO MARK CHANGES THAT NEED TO BE SYNCED BACK
- * TO A SERVER VIA A SYNC ADAPTER
- */
- matcher.addURI(EmailContent.AUTHORITY, "syncedMessage/#", SYNCED_MESSAGE_ID);
-
- /**
- * THE URIs BELOW THIS POINT ARE INTENDED TO BE USED BY SYNC ADAPTERS ONLY
- * THEY REFER TO DATA CREATED AND MAINTAINED BY CALLS TO THE SYNCED_MESSAGE_ID URI
- * BY THE UI APPLICATION
- */
- // All deleted messages
- matcher.addURI(EmailContent.AUTHORITY, "deletedMessage", DELETED_MESSAGE);
- // A specific deleted message
- matcher.addURI(EmailContent.AUTHORITY, "deletedMessage/#", DELETED_MESSAGE_ID);
-
- // All updated messages
- matcher.addURI(EmailContent.AUTHORITY, "updatedMessage", UPDATED_MESSAGE);
- // A specific updated message
- matcher.addURI(EmailContent.AUTHORITY, "updatedMessage/#", UPDATED_MESSAGE_ID);
-
- CONTENT_VALUES_RESET_NEW_MESSAGE_COUNT = new ContentValues();
- CONTENT_VALUES_RESET_NEW_MESSAGE_COUNT.put(Account.NEW_MESSAGE_COUNT, 0);
-
- matcher.addURI(EmailContent.AUTHORITY, "policy", POLICY);
- matcher.addURI(EmailContent.AUTHORITY, "policy/#", POLICY_ID);
-
- // All quick responses
- matcher.addURI(EmailContent.AUTHORITY, "quickresponse", QUICK_RESPONSE);
- // A specific quick response
- matcher.addURI(EmailContent.AUTHORITY, "quickresponse/#", QUICK_RESPONSE_ID);
- // All quick responses associated with a particular account id
- matcher.addURI(EmailContent.AUTHORITY, "quickresponse/account/#",
- QUICK_RESPONSE_ACCOUNT_ID);
-
- matcher.addURI(EmailContent.AUTHORITY, "uifolders/#", UI_FOLDERS);
- matcher.addURI(EmailContent.AUTHORITY, "uiallfolders/#", UI_ALL_FOLDERS);
- matcher.addURI(EmailContent.AUTHORITY, "uisubfolders/#", UI_SUBFOLDERS);
- matcher.addURI(EmailContent.AUTHORITY, "uimessages/#", UI_MESSAGES);
- matcher.addURI(EmailContent.AUTHORITY, "uimessage/#", UI_MESSAGE);
- matcher.addURI(EmailContent.AUTHORITY, "uisendmail/#", UI_SENDMAIL);
- matcher.addURI(EmailContent.AUTHORITY, "uiundo", UI_UNDO);
- matcher.addURI(EmailContent.AUTHORITY, "uisavedraft/#", UI_SAVEDRAFT);
- matcher.addURI(EmailContent.AUTHORITY, "uiupdatedraft/#", UI_UPDATEDRAFT);
- matcher.addURI(EmailContent.AUTHORITY, "uisenddraft/#", UI_SENDDRAFT);
- matcher.addURI(EmailContent.AUTHORITY, "uirefresh/#", UI_FOLDER_REFRESH);
- matcher.addURI(EmailContent.AUTHORITY, "uifolder/#", UI_FOLDER);
- matcher.addURI(EmailContent.AUTHORITY, "uiaccount/#", UI_ACCOUNT);
- matcher.addURI(EmailContent.AUTHORITY, "uiaccts", UI_ACCTS);
- matcher.addURI(EmailContent.AUTHORITY, "uiattachments/#", UI_ATTACHMENTS);
- matcher.addURI(EmailContent.AUTHORITY, "uiattachment/#", UI_ATTACHMENT);
- matcher.addURI(EmailContent.AUTHORITY, "uisearch/#", UI_SEARCH);
- matcher.addURI(EmailContent.AUTHORITY, "uiaccountdata/#", UI_ACCOUNT_DATA);
- matcher.addURI(EmailContent.AUTHORITY, "uiloadmore/#", UI_FOLDER_LOAD_MORE);
- matcher.addURI(EmailContent.AUTHORITY, "uiconversation/#", UI_CONVERSATION);
- matcher.addURI(EmailContent.AUTHORITY, "uirecentfolders/#", UI_RECENT_FOLDERS);
- matcher.addURI(EmailContent.AUTHORITY, "uidefaultrecentfolders/#",
- UI_DEFAULT_RECENT_FOLDERS);
- }
-
- /**
- * Wrap the UriMatcher call so we can throw a runtime exception if an unknown Uri is passed in
- * @param uri the Uri to match
- * @return the match value
- */
- private static int findMatch(Uri uri, String methodName) {
- int match = sURIMatcher.match(uri);
- if (match < 0) {
- throw new IllegalArgumentException("Unknown uri: " + uri);
- } else if (Logging.LOGD) {
- Log.v(TAG, methodName + ": uri=" + uri + ", match is " + match);
- }
- return match;
- }
-
- private SQLiteDatabase mDatabase;
- private SQLiteDatabase mBodyDatabase;
-
- public static Uri uiUri(String type, long id) {
- return Uri.parse(uiUriString(type, id));
- }
-
- /**
- * Creates a URI string from a database ID (guaranteed to be unique).
- * @param type of the resource: uifolder, message, etc.
- * @param id the id of the resource.
- * @return
- */
- public static String uiUriString(String type, long id) {
- return "content://" + EmailContent.AUTHORITY + "/" + type + ((id == -1) ? "" : ("/" + id));
- }
-
- /**
- * Orphan record deletion utility. Generates a sqlite statement like:
- * delete from <table> where <column> not in (select <foreignColumn> from <foreignTable>)
- * @param db the EmailProvider database
- * @param table the table whose orphans are to be removed
- * @param column the column deletion will be based on
- * @param foreignColumn the column in the foreign table whose absence will trigger the deletion
- * @param foreignTable the foreign table
- */
- @VisibleForTesting
- void deleteUnlinked(SQLiteDatabase db, String table, String column, String foreignColumn,
- String foreignTable) {
- int count = db.delete(table, column + " not in (select " + foreignColumn + " from " +
- foreignTable + ")", null);
- if (count > 0) {
- Log.w(TAG, "Found " + count + " orphaned row(s) in " + table);
- }
- }
-
- @VisibleForTesting
- synchronized SQLiteDatabase getDatabase(Context context) {
- // Always return the cached database, if we've got one
- if (mDatabase != null) {
- return mDatabase;
- }
-
- // Whenever we create or re-cache the databases, make sure that we haven't lost one
- // to corruption
- checkDatabases();
-
- DBHelper.DatabaseHelper helper = new DBHelper.DatabaseHelper(context, DATABASE_NAME);
- mDatabase = helper.getWritableDatabase();
- DBHelper.BodyDatabaseHelper bodyHelper =
- new DBHelper.BodyDatabaseHelper(context, BODY_DATABASE_NAME);
- mBodyDatabase = bodyHelper.getWritableDatabase();
- if (mBodyDatabase != null) {
- String bodyFileName = mBodyDatabase.getPath();
- mDatabase.execSQL("attach \"" + bodyFileName + "\" as BodyDatabase");
- }
-
- // Restore accounts if the database is corrupted...
- restoreIfNeeded(context, mDatabase);
- // Check for any orphaned Messages in the updated/deleted tables
- deleteMessageOrphans(mDatabase, Message.UPDATED_TABLE_NAME);
- deleteMessageOrphans(mDatabase, Message.DELETED_TABLE_NAME);
- // Delete orphaned mailboxes/messages/policies (account no longer exists)
- deleteUnlinked(mDatabase, Mailbox.TABLE_NAME, MailboxColumns.ACCOUNT_KEY, AccountColumns.ID,
- Account.TABLE_NAME);
- deleteUnlinked(mDatabase, Message.TABLE_NAME, MessageColumns.ACCOUNT_KEY, AccountColumns.ID,
- Account.TABLE_NAME);
- deleteUnlinked(mDatabase, Policy.TABLE_NAME, PolicyColumns.ID, AccountColumns.POLICY_KEY,
- Account.TABLE_NAME);
- initUiProvider();
- preCacheData();
- return mDatabase;
- }
-
- /**
- * Perform startup actions related to UI
- */
- private void initUiProvider() {
- // Clear mailbox sync status
- mDatabase.execSQL("update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UI_SYNC_STATUS +
- "=" + UIProvider.SyncStatus.NO_SYNC);
- }
-
- /**
- * Pre-cache all of the items in a given table meeting the selection criteria
- * @param tableUri the table uri
- * @param baseProjection the base projection of that table
- * @param selection the selection criteria
- */
- private void preCacheTable(Uri tableUri, String[] baseProjection, String selection) {
- Cursor c = query(tableUri, EmailContent.ID_PROJECTION, selection, null, null);
- try {
- while (c.moveToNext()) {
- long id = c.getLong(EmailContent.ID_PROJECTION_COLUMN);
- Cursor cachedCursor = query(ContentUris.withAppendedId(
- tableUri, id), baseProjection, null, null, null);
- if (cachedCursor != null) {
- // For accounts, create a mailbox type map entry (if necessary)
- if (tableUri == Account.CONTENT_URI) {
- getOrCreateAccountMailboxTypeMap(id);
- }
- cachedCursor.close();
- }
- }
- } finally {
- c.close();
- }
- }
-
- private final HashMap<Long, HashMap<Integer, Long>> mMailboxTypeMap =
- new HashMap<Long, HashMap<Integer, Long>>();
-
- private HashMap<Integer, Long> getOrCreateAccountMailboxTypeMap(long accountId) {
- synchronized(mMailboxTypeMap) {
- HashMap<Integer, Long> accountMailboxTypeMap = mMailboxTypeMap.get(accountId);
- if (accountMailboxTypeMap == null) {
- accountMailboxTypeMap = new HashMap<Integer, Long>();
- mMailboxTypeMap.put(accountId, accountMailboxTypeMap);
- }
- return accountMailboxTypeMap;
- }
- }
-
- private void addToMailboxTypeMap(Cursor c) {
- long accountId = c.getLong(Mailbox.CONTENT_ACCOUNT_KEY_COLUMN);
- int type = c.getInt(Mailbox.CONTENT_TYPE_COLUMN);
- synchronized(mMailboxTypeMap) {
- HashMap<Integer, Long> accountMailboxTypeMap =
- getOrCreateAccountMailboxTypeMap(accountId);
- accountMailboxTypeMap.put(type, c.getLong(Mailbox.CONTENT_ID_COLUMN));
- }
- }
-
- private long getMailboxIdFromMailboxTypeMap(long accountId, int type) {
- synchronized(mMailboxTypeMap) {
- HashMap<Integer, Long> accountMap = mMailboxTypeMap.get(accountId);
- Long mailboxId = null;
- if (accountMap != null) {
- mailboxId = accountMap.get(type);
- }
- if (mailboxId == null) return Mailbox.NO_MAILBOX;
- return mailboxId;
- }
- }
-
- private void preCacheData() {
- synchronized(mMailboxTypeMap) {
- mMailboxTypeMap.clear();
-
- // Pre-cache accounts, host auth's, policies, and special mailboxes
- preCacheTable(Account.CONTENT_URI, Account.CONTENT_PROJECTION, null);
- preCacheTable(HostAuth.CONTENT_URI, HostAuth.CONTENT_PROJECTION, null);
- preCacheTable(Policy.CONTENT_URI, Policy.CONTENT_PROJECTION, null);
- preCacheTable(Mailbox.CONTENT_URI, Mailbox.CONTENT_PROJECTION,
- MAILBOX_PRE_CACHE_SELECTION);
-
- // Create a map from account,type to a mailbox
- Map<String, Cursor> snapshot = mCacheMailbox.getSnapshot();
- Collection<Cursor> values = snapshot.values();
- if (values != null) {
- for (Cursor c: values) {
- if (c.moveToFirst()) {
- addToMailboxTypeMap(c);
- }
- }
- }
- }
- }
-
- /*package*/ static SQLiteDatabase getReadableDatabase(Context context) {
- DBHelper.DatabaseHelper helper = new DBHelper.DatabaseHelper(context, DATABASE_NAME);
- return helper.getReadableDatabase();
- }
-
- /**
- * Restore user Account and HostAuth data from our backup database
- */
- public static void restoreIfNeeded(Context context, SQLiteDatabase mainDatabase) {
- if (MailActivityEmail.DEBUG) {
- Log.w(TAG, "restoreIfNeeded...");
- }
- // Check for legacy backup
- String legacyBackup = Preferences.getLegacyBackupPreference(context);
- // If there's a legacy backup, create a new-style backup and delete the legacy backup
- // In the 1:1000000000 chance that the user gets an app update just as his database becomes
- // corrupt, oh well...
- if (!TextUtils.isEmpty(legacyBackup)) {
- backupAccounts(context, mainDatabase);
- Preferences.clearLegacyBackupPreference(context);
- Log.w(TAG, "Created new EmailProvider backup database");
- return;
- }
-
- // If we have accounts, we're done
- Cursor c = mainDatabase.query(Account.TABLE_NAME, EmailContent.ID_PROJECTION, null, null,
- null, null, null);
- try {
- if (c.moveToFirst()) {
- if (MailActivityEmail.DEBUG) {
- Log.w(TAG, "restoreIfNeeded: Account exists.");
- }
- return; // At least one account exists.
- }
- } finally {
- c.close();
- }
-
- restoreAccounts(context, mainDatabase);
- }
-
- /** {@inheritDoc} */
- @Override
- public void shutdown() {
- if (mDatabase != null) {
- mDatabase.close();
- mDatabase = null;
- }
- if (mBodyDatabase != null) {
- mBodyDatabase.close();
- mBodyDatabase = null;
- }
- }
-
- /*package*/ static void deleteMessageOrphans(SQLiteDatabase database, String tableName) {
- if (database != null) {
- // We'll look at all of the items in the table; there won't be many typically
- Cursor c = database.query(tableName, ORPHANS_PROJECTION, null, null, null, null, null);
- // Usually, there will be nothing in these tables, so make a quick check
- try {
- if (c.getCount() == 0) return;
- ArrayList<Long> foundMailboxes = new ArrayList<Long>();
- ArrayList<Long> notFoundMailboxes = new ArrayList<Long>();
- ArrayList<Long> deleteList = new ArrayList<Long>();
- String[] bindArray = new String[1];
- while (c.moveToNext()) {
- // Get the mailbox key and see if we've already found this mailbox
- // If so, we're fine
- long mailboxId = c.getLong(ORPHANS_MAILBOX_KEY);
- // If we already know this mailbox doesn't exist, mark the message for deletion
- if (notFoundMailboxes.contains(mailboxId)) {
- deleteList.add(c.getLong(ORPHANS_ID));
- // If we don't know about this mailbox, we'll try to find it
- } else if (!foundMailboxes.contains(mailboxId)) {
- bindArray[0] = Long.toString(mailboxId);
- Cursor boxCursor = database.query(Mailbox.TABLE_NAME,
- Mailbox.ID_PROJECTION, WHERE_ID, bindArray, null, null, null);
- try {
- // If it exists, we'll add it to the "found" mailboxes
- if (boxCursor.moveToFirst()) {
- foundMailboxes.add(mailboxId);
- // Otherwise, we'll add to "not found" and mark the message for deletion
- } else {
- notFoundMailboxes.add(mailboxId);
- deleteList.add(c.getLong(ORPHANS_ID));
- }
- } finally {
- boxCursor.close();
- }
- }
- }
- // Now, delete the orphan messages
- for (long messageId: deleteList) {
- bindArray[0] = Long.toString(messageId);
- database.delete(tableName, WHERE_ID, bindArray);
- }
- } finally {
- c.close();
- }
- }
- }
-
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- final int match = findMatch(uri, "delete");
- Context context = getContext();
- // Pick the correct database for this operation
- // If we're in a transaction already (which would happen during applyBatch), then the
- // body database is already attached to the email database and any attempt to use the
- // body database directly will result in a SQLiteException (the database is locked)
- SQLiteDatabase db = getDatabase(context);
- int table = match >> BASE_SHIFT;
- String id = "0";
- boolean messageDeletion = false;
- ContentResolver resolver = context.getContentResolver();
-
- ContentCache cache = mContentCaches[table];
- String tableName = TABLE_NAMES[table];
- int result = -1;
-
- try {
- if (match == MESSAGE_ID || match == SYNCED_MESSAGE_ID) {
- if (!uri.getBooleanQueryParameter(IS_UIPROVIDER, false)) {
- notifyUIConversation(uri);
- }
- }
- switch (match) {
- case UI_MESSAGE:
- return uiDeleteMessage(uri);
- case UI_ACCOUNT_DATA:
- return uiDeleteAccountData(uri);
- case UI_ACCOUNT:
- return uiDeleteAccount(uri);
- // These are cases in which one or more Messages might get deleted, either by
- // cascade or explicitly
- case MAILBOX_ID:
- case MAILBOX:
- case ACCOUNT_ID:
- case ACCOUNT:
- case MESSAGE:
- case SYNCED_MESSAGE_ID:
- case MESSAGE_ID:
- // Handle lost Body records here, since this cannot be done in a trigger
- // The process is:
- // 1) Begin a transaction, ensuring that both databases are affected atomically
- // 2) Do the requested deletion, with cascading deletions handled in triggers
- // 3) End the transaction, committing all changes atomically
- //
- // Bodies are auto-deleted here; Attachments are auto-deleted via trigger
- messageDeletion = true;
- db.beginTransaction();
- break;
- }
- switch (match) {
- case BODY_ID:
- case DELETED_MESSAGE_ID:
- case SYNCED_MESSAGE_ID:
- case MESSAGE_ID:
- case UPDATED_MESSAGE_ID:
- case ATTACHMENT_ID:
- case MAILBOX_ID:
- case ACCOUNT_ID:
- case HOSTAUTH_ID:
- case POLICY_ID:
- case QUICK_RESPONSE_ID:
- id = uri.getPathSegments().get(1);
- if (match == SYNCED_MESSAGE_ID) {
- // For synced messages, first copy the old message to the deleted table and
- // delete it from the updated table (in case it was updated first)
- // Note that this is all within a transaction, for atomicity
- db.execSQL(DELETED_MESSAGE_INSERT + id);
- db.execSQL(UPDATED_MESSAGE_DELETE + id);
- }
- if (cache != null) {
- cache.lock(id);
- }
- try {
- result = db.delete(tableName, whereWithId(id, selection), selectionArgs);
- if (cache != null) {
- switch(match) {
- case ACCOUNT_ID:
- // Account deletion will clear all of the caches, as HostAuth's,
- // Mailboxes, and Messages will be deleted in the process
- mCacheMailbox.invalidate("Delete", uri, selection);
- mCacheHostAuth.invalidate("Delete", uri, selection);
- mCachePolicy.invalidate("Delete", uri, selection);
- //$FALL-THROUGH$
- case MAILBOX_ID:
- // Mailbox deletion will clear the Message cache
- mCacheMessage.invalidate("Delete", uri, selection);
- //$FALL-THROUGH$
- case SYNCED_MESSAGE_ID:
- case MESSAGE_ID:
- case HOSTAUTH_ID:
- case POLICY_ID:
- cache.invalidate("Delete", uri, selection);
- // Make sure all data is properly cached
- if (match != MESSAGE_ID) {
- preCacheData();
- }
- break;
- }
- }
- } finally {
- if (cache != null) {
- cache.unlock(id);
- }
- }
- if (match == ACCOUNT_ID) {
- notifyUI(UIPROVIDER_ACCOUNT_NOTIFIER, id);
- resolver.notifyChange(UIPROVIDER_ACCOUNTS_NOTIFIER, null);
- } else if (match == MAILBOX_ID) {
- notifyUI(UIPROVIDER_FOLDER_NOTIFIER, id);
- }
- break;
- case ATTACHMENTS_MESSAGE_ID:
- // All attachments for the given message
- id = uri.getPathSegments().get(2);
- result = db.delete(tableName,
- whereWith(Attachment.MESSAGE_KEY + "=" + id, selection), selectionArgs);
- break;
-
- case BODY:
- case MESSAGE:
- case DELETED_MESSAGE:
- case UPDATED_MESSAGE:
- case ATTACHMENT:
- case MAILBOX:
- case ACCOUNT:
- case HOSTAUTH:
- case POLICY:
- switch(match) {
- // See the comments above for deletion of ACCOUNT_ID, etc
- case ACCOUNT:
- mCacheMailbox.invalidate("Delete", uri, selection);
- mCacheHostAuth.invalidate("Delete", uri, selection);
- mCachePolicy.invalidate("Delete", uri, selection);
- //$FALL-THROUGH$
- case MAILBOX:
- mCacheMessage.invalidate("Delete", uri, selection);
- //$FALL-THROUGH$
- case MESSAGE:
- case HOSTAUTH:
- case POLICY:
- cache.invalidate("Delete", uri, selection);
- break;
- }
- result = db.delete(tableName, selection, selectionArgs);
- switch(match) {
- case ACCOUNT:
- case MAILBOX:
- case HOSTAUTH:
- case POLICY:
- // Make sure all data is properly cached
- preCacheData();
- break;
- }
- break;
-
- default:
- throw new IllegalArgumentException("Unknown URI " + uri);
- }
- if (messageDeletion) {
- if (match == MESSAGE_ID) {
- // Delete the Body record associated with the deleted message
- db.execSQL(DELETE_BODY + id);
- } else {
- // Delete any orphaned Body records
- db.execSQL(DELETE_ORPHAN_BODIES);
- }
- db.setTransactionSuccessful();
- }
- } catch (SQLiteException e) {
- checkDatabases();
- throw e;
- } finally {
- if (messageDeletion) {
- db.endTransaction();
- }
- }
-
- // Notify all notifier cursors
- sendNotifierChange(getBaseNotificationUri(match), NOTIFICATION_OP_DELETE, id);
-
- // Notify all email content cursors
- resolver.notifyChange(EmailContent.CONTENT_URI, null);
- return result;
- }
-
- @Override
- // Use the email- prefix because message, mailbox, and account are so generic (e.g. SMS, IM)
- public String getType(Uri uri) {
- int match = findMatch(uri, "getType");
- switch (match) {
- case BODY_ID:
- return "vnd.android.cursor.item/email-body";
- case BODY:
- return "vnd.android.cursor.dir/email-body";
- case UPDATED_MESSAGE_ID:
- case MESSAGE_ID:
- // NOTE: According to the framework folks, we're supposed to invent mime types as
- // a way of passing information to drag & drop recipients.
- // If there's a mailboxId parameter in the url, we respond with a mime type that
- // has -n appended, where n is the mailboxId of the message. The drag & drop code
- // uses this information to know not to allow dragging the item to its own mailbox
- String mimeType = EMAIL_MESSAGE_MIME_TYPE;
- String mailboxId = uri.getQueryParameter(MESSAGE_URI_PARAMETER_MAILBOX_ID);
- if (mailboxId != null) {
- mimeType += "-" + mailboxId;
- }
- return mimeType;
- case UPDATED_MESSAGE:
- case MESSAGE:
- return "vnd.android.cursor.dir/email-message";
- case MAILBOX:
- return "vnd.android.cursor.dir/email-mailbox";
- case MAILBOX_ID:
- return "vnd.android.cursor.item/email-mailbox";
- case ACCOUNT:
- return "vnd.android.cursor.dir/email-account";
- case ACCOUNT_ID:
- return "vnd.android.cursor.item/email-account";
- case ATTACHMENTS_MESSAGE_ID:
- case ATTACHMENT:
- return "vnd.android.cursor.dir/email-attachment";
- case ATTACHMENT_ID:
- return EMAIL_ATTACHMENT_MIME_TYPE;
- case HOSTAUTH:
- return "vnd.android.cursor.dir/email-hostauth";
- case HOSTAUTH_ID:
- return "vnd.android.cursor.item/email-hostauth";
- default:
- throw new IllegalArgumentException("Unknown URI " + uri);
- }
- }
-
- private static final Uri UIPROVIDER_CONVERSATION_NOTIFIER =
- Uri.parse("content://" + UIProvider.AUTHORITY + "/uimessages");
- private static final Uri UIPROVIDER_FOLDER_NOTIFIER =
- Uri.parse("content://" + UIProvider.AUTHORITY + "/uifolder");
- private static final Uri UIPROVIDER_ACCOUNT_NOTIFIER =
- Uri.parse("content://" + UIProvider.AUTHORITY + "/uiaccount");
- public static final Uri UIPROVIDER_SETTINGS_NOTIFIER =
- Uri.parse("content://" + UIProvider.AUTHORITY + "/uisettings");
- private static final Uri UIPROVIDER_ATTACHMENT_NOTIFIER =
- Uri.parse("content://" + UIProvider.AUTHORITY + "/uiattachment");
- private static final Uri UIPROVIDER_ATTACHMENTS_NOTIFIER =
- Uri.parse("content://" + UIProvider.AUTHORITY + "/uiattachments");
- private static final Uri UIPROVIDER_ACCOUNTS_NOTIFIER =
- Uri.parse("content://" + UIProvider.AUTHORITY + "/uiaccts");
- private static final Uri UIPROVIDER_MESSAGE_NOTIFIER =
- Uri.parse("content://" + UIProvider.AUTHORITY + "/uimessage");
- private static final Uri UIPROVIDER_RECENT_FOLDERS_NOTIFIER =
- Uri.parse("content://" + UIProvider.AUTHORITY + "/uirecentfolders");
-
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- int match = findMatch(uri, "insert");
- Context context = getContext();
- ContentResolver resolver = context.getContentResolver();
-
- // See the comment at delete(), above
- SQLiteDatabase db = getDatabase(context);
- int table = match >> BASE_SHIFT;
- String id = "0";
- long longId;
-
- // We do NOT allow setting of unreadCount/messageCount via the provider
- // These columns are maintained via triggers
- if (match == MAILBOX_ID || match == MAILBOX) {
- values.put(MailboxColumns.UNREAD_COUNT, 0);
- values.put(MailboxColumns.MESSAGE_COUNT, 0);
- }
-
- Uri resultUri = null;
-
- try {
- switch (match) {
- case UI_SAVEDRAFT:
- return uiSaveDraft(uri, values);
- case UI_SENDMAIL:
- return uiSendMail(uri, values);
- // NOTE: It is NOT legal for production code to insert directly into UPDATED_MESSAGE
- // or DELETED_MESSAGE; see the comment below for details
- case UPDATED_MESSAGE:
- case DELETED_MESSAGE:
- case MESSAGE:
- case BODY:
- case ATTACHMENT:
- case MAILBOX:
- case ACCOUNT:
- case HOSTAUTH:
- case POLICY:
- case QUICK_RESPONSE:
- longId = db.insert(TABLE_NAMES[table], "foo", values);
- resultUri = ContentUris.withAppendedId(uri, longId);
- switch(match) {
- case MESSAGE:
- if (!uri.getBooleanQueryParameter(IS_UIPROVIDER, false)) {
- notifyUIConversationMailbox(values.getAsLong(Message.MAILBOX_KEY));
- }
- break;
- case MAILBOX:
- if (values.containsKey(MailboxColumns.TYPE)) {
- // Only cache special mailbox types
- int type = values.getAsInteger(MailboxColumns.TYPE);
- if (type != Mailbox.TYPE_INBOX && type != Mailbox.TYPE_OUTBOX &&
- type != Mailbox.TYPE_DRAFTS && type != Mailbox.TYPE_SENT &&
- type != Mailbox.TYPE_TRASH && type != Mailbox.TYPE_SEARCH) {
- break;
- }
- }
- // Notify the account when a new mailbox is added
- Long accountId = values.getAsLong(MailboxColumns.ACCOUNT_KEY);
- if (accountId != null && accountId.longValue() > 0) {
- notifyUI(UIPROVIDER_ACCOUNT_NOTIFIER, accountId);
- }
- //$FALL-THROUGH$
- case ACCOUNT:
- case HOSTAUTH:
- case POLICY:
- // Cache new account, host auth, policy, and some mailbox rows
- Cursor c = query(resultUri, CACHE_PROJECTIONS[table], null, null, null);
- if (c != null) {
- if (match == MAILBOX) {
- addToMailboxTypeMap(c);
- } else if (match == ACCOUNT) {
- getOrCreateAccountMailboxTypeMap(longId);
- }
- c.close();
- }
- break;
- }
- // Clients shouldn't normally be adding rows to these tables, as they are
- // maintained by triggers. However, we need to be able to do this for unit
- // testing, so we allow the insert and then throw the same exception that we
- // would if this weren't allowed.
- if (match == UPDATED_MESSAGE || match == DELETED_MESSAGE) {
- throw new IllegalArgumentException("Unknown URL " + uri);
- } else if (match == ATTACHMENT) {
- int flags = 0;
- if (values.containsKey(Attachment.FLAGS)) {
- flags = values.getAsInteger(Attachment.FLAGS);
- }
- // Report all new attachments to the download service
- mAttachmentService.attachmentChanged(getContext(), longId, flags);
- } else if (match == ACCOUNT) {
- resolver.notifyChange(UIPROVIDER_ACCOUNTS_NOTIFIER, null);
- }
- break;
- case MAILBOX_ID:
- // This implies adding a message to a mailbox
- // Hmm, a problem here is that we can't link the account as well, so it must be
- // already in the values...
- longId = Long.parseLong(uri.getPathSegments().get(1));
- values.put(MessageColumns.MAILBOX_KEY, longId);
- return insert(Message.CONTENT_URI, values); // Recurse
- case MESSAGE_ID:
- // This implies adding an attachment to a message.
- id = uri.getPathSegments().get(1);
- longId = Long.parseLong(id);
- values.put(AttachmentColumns.MESSAGE_KEY, longId);
- return insert(Attachment.CONTENT_URI, values); // Recurse
- case ACCOUNT_ID:
- // This implies adding a mailbox to an account.
- longId = Long.parseLong(uri.getPathSegments().get(1));
- values.put(MailboxColumns.ACCOUNT_KEY, longId);
- return insert(Mailbox.CONTENT_URI, values); // Recurse
- case ATTACHMENTS_MESSAGE_ID:
- longId = db.insert(TABLE_NAMES[table], "foo", values);
- resultUri = ContentUris.withAppendedId(Attachment.CONTENT_URI, longId);
- break;
- default:
- throw new IllegalArgumentException("Unknown URL " + uri);
- }
- } catch (SQLiteException e) {
- checkDatabases();
- throw e;
- }
-
- // Notify all notifier cursors
- sendNotifierChange(getBaseNotificationUri(match), NOTIFICATION_OP_INSERT, id);
-
- // Notify all existing cursors.
- resolver.notifyChange(EmailContent.CONTENT_URI, null);
- return resultUri;
- }
-
- @Override
- public boolean onCreate() {
- MailActivityEmail.setServicesEnabledAsync(getContext());
- checkDatabases();
- return false;
- }
-
- /**
- * The idea here is that the two databases (EmailProvider.db and EmailProviderBody.db must
- * always be in sync (i.e. there are two database or NO databases). This code will delete
- * any "orphan" database, so that both will be created together. Note that an "orphan" database
- * will exist after either of the individual databases is deleted due to data corruption.
- */
- public void checkDatabases() {
- // Uncache the databases
- if (mDatabase != null) {
- mDatabase = null;
- }
- if (mBodyDatabase != null) {
- mBodyDatabase = null;
- }
- // Look for orphans, and delete as necessary; these must always be in sync
- File databaseFile = getContext().getDatabasePath(DATABASE_NAME);
- File bodyFile = getContext().getDatabasePath(BODY_DATABASE_NAME);
-
- // TODO Make sure attachments are deleted
- if (databaseFile.exists() && !bodyFile.exists()) {
- Log.w(TAG, "Deleting orphaned EmailProvider database...");
- databaseFile.delete();
- } else if (bodyFile.exists() && !databaseFile.exists()) {
- Log.w(TAG, "Deleting orphaned EmailProviderBody database...");
- bodyFile.delete();
- }
- }
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- long time = 0L;
- if (MailActivityEmail.DEBUG) {
- time = System.nanoTime();
- }
- Cursor c = null;
- int match;
- try {
- match = findMatch(uri, "query");
- } catch (IllegalArgumentException e) {
- String uriString = uri.toString();
- // If we were passed an illegal uri, see if it ends in /-1
- // if so, and if substituting 0 for -1 results in a valid uri, return an empty cursor
- if (uriString != null && uriString.endsWith("/-1")) {
- uri = Uri.parse(uriString.substring(0, uriString.length() - 2) + "0");
- match = findMatch(uri, "query");
- switch (match) {
- case BODY_ID:
- case MESSAGE_ID:
- case DELETED_MESSAGE_ID:
- case UPDATED_MESSAGE_ID:
- case ATTACHMENT_ID:
- case MAILBOX_ID:
- case ACCOUNT_ID:
- case HOSTAUTH_ID:
- case POLICY_ID:
- return new MatrixCursor(projection, 0);
- }
- }
- throw e;
- }
- Context context = getContext();
- // See the comment at delete(), above
- SQLiteDatabase db = getDatabase(context);
- int table = match >> BASE_SHIFT;
- String limit = uri.getQueryParameter(EmailContent.PARAMETER_LIMIT);
- String id;
-
- // Find the cache for this query's table (if any)
- ContentCache cache = null;
- String tableName = TABLE_NAMES[table];
- // We can only use the cache if there's no selection
- if (selection == null) {
- cache = mContentCaches[table];
- }
- if (cache == null) {
- ContentCache.notCacheable(uri, selection);
- }
-
- try {
- switch (match) {
- // First, dispatch queries from UnfiedEmail
- case UI_SEARCH:
- return uiSearch(uri, projection);
- case UI_ACCTS:
- c = uiAccounts(projection);
- return c;
- case UI_UNDO:
- return uiUndo(projection);
- case UI_SUBFOLDERS:
- case UI_MESSAGES:
- case UI_MESSAGE:
- case UI_FOLDER:
- case UI_ACCOUNT:
- case UI_ATTACHMENT:
- case UI_ATTACHMENTS:
- case UI_CONVERSATION:
- case UI_RECENT_FOLDERS:
- case UI_ALL_FOLDERS:
- // For now, we don't allow selection criteria within these queries
- if (selection != null || selectionArgs != null) {
- throw new IllegalArgumentException("UI queries can't have selection/args");
- }
- c = uiQuery(match, uri, projection);
- return c;
- case UI_FOLDERS:
- c = uiFolders(uri, projection);
- return c;
- case UI_FOLDER_LOAD_MORE:
- c = uiFolderLoadMore(uri);
- return c;
- case UI_FOLDER_REFRESH:
- c = uiFolderRefresh(uri);
- return c;
- case MAILBOX_NOTIFICATION:
- c = notificationQuery(uri);
- return c;
- case MAILBOX_MOST_RECENT_MESSAGE:
- c = mostRecentMessageQuery(uri);
- return c;
- case ACCOUNT_DEFAULT_ID:
- // Start with a snapshot of the cache
- Map<String, Cursor> accountCache = mCacheAccount.getSnapshot();
- long accountId = Account.NO_ACCOUNT;
- // Find the account with "isDefault" set, or the lowest account ID otherwise.
- // Note that the snapshot from the cached isn't guaranteed to be sorted in any
- // way.
- Collection<Cursor> accounts = accountCache.values();
- for (Cursor accountCursor: accounts) {
- // For now, at least, we can have zero count cursors (e.g. if someone looks
- // up a non-existent id); we need to skip these
- if (accountCursor.moveToFirst()) {
- boolean isDefault =
- accountCursor.getInt(Account.CONTENT_IS_DEFAULT_COLUMN) == 1;
- long iterId = accountCursor.getLong(Account.CONTENT_ID_COLUMN);
- // We'll remember this one if it's the default or the first one we see
- if (isDefault) {
- accountId = iterId;
- break;
- } else if ((accountId == Account.NO_ACCOUNT) || (iterId < accountId)) {
- accountId = iterId;
- }
- }
- }
- // Return a cursor with an id projection
- MatrixCursor mc = new MatrixCursor(EmailContent.ID_PROJECTION);
- mc.addRow(new Object[] {accountId});
- c = mc;
- break;
- case MAILBOX_ID_FROM_ACCOUNT_AND_TYPE:
- // Get accountId and type and find the mailbox in our map
- List<String> pathSegments = uri.getPathSegments();
- accountId = Long.parseLong(pathSegments.get(1));
- int type = Integer.parseInt(pathSegments.get(2));
- long mailboxId = getMailboxIdFromMailboxTypeMap(accountId, type);
- // Return a cursor with an id projection
- mc = new MatrixCursor(EmailContent.ID_PROJECTION);
- mc.addRow(new Object[] {mailboxId});
- c = mc;
- break;
- case BODY:
- case MESSAGE:
- case UPDATED_MESSAGE:
- case DELETED_MESSAGE:
- case ATTACHMENT:
- case MAILBOX:
- case ACCOUNT:
- case HOSTAUTH:
- case POLICY:
- case QUICK_RESPONSE:
- // Special-case "count of accounts"; it's common and we always know it
- if (match == ACCOUNT && Arrays.equals(projection, EmailContent.COUNT_COLUMNS) &&
- selection == null && limit.equals("1")) {
- int accountCount = mMailboxTypeMap.size();
- // In the rare case there are MAX_CACHED_ACCOUNTS or more, we can't do this
- if (accountCount < MAX_CACHED_ACCOUNTS) {
- mc = new MatrixCursor(projection, 1);
- mc.addRow(new Object[] {accountCount});
- c = mc;
- break;
- }
- }
- c = db.query(tableName, projection,
- selection, selectionArgs, null, null, sortOrder, limit);
- break;
- case BODY_ID:
- case MESSAGE_ID:
- case DELETED_MESSAGE_ID:
- case UPDATED_MESSAGE_ID:
- case ATTACHMENT_ID:
- case MAILBOX_ID:
- case ACCOUNT_ID:
- case HOSTAUTH_ID:
- case POLICY_ID:
- case QUICK_RESPONSE_ID:
- id = uri.getPathSegments().get(1);
- if (cache != null) {
- c = cache.getCachedCursor(id, projection);
- }
- if (c == null) {
- CacheToken token = null;
- if (cache != null) {
- token = cache.getCacheToken(id);
- }
- c = db.query(tableName, projection, whereWithId(id, selection),
- selectionArgs, null, null, sortOrder, limit);
- if (cache != null) {
- c = cache.putCursor(c, id, projection, token);
- }
- }
- break;
- case ATTACHMENTS_MESSAGE_ID:
- // All attachments for the given message
- id = uri.getPathSegments().get(2);
- c = db.query(Attachment.TABLE_NAME, projection,
- whereWith(Attachment.MESSAGE_KEY + "=" + id, selection),
- selectionArgs, null, null, sortOrder, limit);
- break;
- case QUICK_RESPONSE_ACCOUNT_ID:
- // All quick responses for the given account
- id = uri.getPathSegments().get(2);
- c = db.query(QuickResponse.TABLE_NAME, projection,
- whereWith(QuickResponse.ACCOUNT_KEY + "=" + id, selection),
- selectionArgs, null, null, sortOrder);
- break;
- default:
- throw new IllegalArgumentException("Unknown URI " + uri);
- }
- } catch (SQLiteException e) {
- checkDatabases();
- throw e;
- } catch (RuntimeException e) {
- checkDatabases();
- e.printStackTrace();
- throw e;
- } finally {
- if (cache != null && c != null && MailActivityEmail.DEBUG) {
- cache.recordQueryTime(c, System.nanoTime() - time);
- }
- if (c == null) {
- // This should never happen, but let's be sure to log it...
- Log.e(TAG, "Query returning null for uri: " + uri + ", selection: " + selection);
- }
- }
-
- if ((c != null) && !isTemporary()) {
- c.setNotificationUri(getContext().getContentResolver(), uri);
- }
- return c;
- }
-
- private String whereWithId(String id, String selection) {
- StringBuilder sb = new StringBuilder(256);
- sb.append("_id=");
- sb.append(id);
- if (selection != null) {
- sb.append(" AND (");
- sb.append(selection);
- sb.append(')');
- }
- return sb.toString();
- }
-
- /**
- * Combine a locally-generated selection with a user-provided selection
- *
- * This introduces risk that the local selection might insert incorrect chars
- * into the SQL, so use caution.
- *
- * @param where locally-generated selection, must not be null
- * @param selection user-provided selection, may be null
- * @return a single selection string
- */
- private String whereWith(String where, String selection) {
- if (selection == null) {
- return where;
- }
- StringBuilder sb = new StringBuilder(where);
- sb.append(" AND (");
- sb.append(selection);
- sb.append(')');
-
- return sb.toString();
- }
-
- /**
- * Restore a HostAuth from a database, given its unique id
- * @param db the database
- * @param id the unique id (_id) of the row
- * @return a fully populated HostAuth or null if the row does not exist
- */
- private static HostAuth restoreHostAuth(SQLiteDatabase db, long id) {
- Cursor c = db.query(HostAuth.TABLE_NAME, HostAuth.CONTENT_PROJECTION,
- HostAuth.RECORD_ID + "=?", new String[] {Long.toString(id)}, null, null, null);
- try {
- if (c.moveToFirst()) {
- HostAuth hostAuth = new HostAuth();
- hostAuth.restore(c);
- return hostAuth;
- }
- return null;
- } finally {
- c.close();
- }
- }
-
- /**
- * Copy the Account and HostAuth tables from one database to another
- * @param fromDatabase the source database
- * @param toDatabase the destination database
- * @return the number of accounts copied, or -1 if an error occurred
- */
- private static int copyAccountTables(SQLiteDatabase fromDatabase, SQLiteDatabase toDatabase) {
- if (fromDatabase == null || toDatabase == null) return -1;
-
- // Lock both databases; for the "from" database, we don't want anyone changing it from
- // under us; for the "to" database, we want to make the operation atomic
- int copyCount = 0;
- fromDatabase.beginTransaction();
- try {
- toDatabase.beginTransaction();
- try {
- // Delete anything hanging around here
- toDatabase.delete(Account.TABLE_NAME, null, null);
- toDatabase.delete(HostAuth.TABLE_NAME, null, null);
-
- // Get our account cursor
- Cursor c = fromDatabase.query(Account.TABLE_NAME, Account.CONTENT_PROJECTION,
- null, null, null, null, null);
- if (c == null) return 0;
- Log.d(TAG, "fromDatabase accounts: " + c.getCount());
- try {
- // Loop through accounts, copying them and associated host auth's
- while (c.moveToNext()) {
- Account account = new Account();
- account.restore(c);
-
- // Clear security sync key and sync key, as these were specific to the
- // state of the account, and we've reset that...
- // Clear policy key so that we can re-establish policies from the server
- // TODO This is pretty EAS specific, but there's a lot of that around
- account.mSecuritySyncKey = null;
- account.mSyncKey = null;
- account.mPolicyKey = 0;
-
- // Copy host auth's and update foreign keys
- HostAuth hostAuth = restoreHostAuth(fromDatabase,
- account.mHostAuthKeyRecv);
-
- // The account might have gone away, though very unlikely
- if (hostAuth == null) continue;
- account.mHostAuthKeyRecv = toDatabase.insert(HostAuth.TABLE_NAME, null,
- hostAuth.toContentValues());
-
- // EAS accounts have no send HostAuth
- if (account.mHostAuthKeySend > 0) {
- hostAuth = restoreHostAuth(fromDatabase, account.mHostAuthKeySend);
- // Belt and suspenders; I can't imagine that this is possible,
- // since we checked the validity of the account above, and the
- // database is now locked
- if (hostAuth == null) continue;
- account.mHostAuthKeySend = toDatabase.insert(
- HostAuth.TABLE_NAME, null, hostAuth.toContentValues());
- }
-
- // Now, create the account in the "to" database
- toDatabase.insert(Account.TABLE_NAME, null, account.toContentValues());
- copyCount++;
- }
- } finally {
- c.close();
- }
-
- // Say it's ok to commit
- toDatabase.setTransactionSuccessful();
- } finally {
- // STOPSHIP: Remove logging here and in at endTransaction() below
- Log.d(TAG, "ending toDatabase transaction; copyCount = " + copyCount);
- toDatabase.endTransaction();
- }
- } catch (SQLiteException ex) {
- Log.w(TAG, "Exception while copying account tables", ex);
- copyCount = -1;
- } finally {
- Log.d(TAG, "ending fromDatabase transaction; copyCount = " + copyCount);
- fromDatabase.endTransaction();
- }
- return copyCount;
- }
-
- private static SQLiteDatabase getBackupDatabase(Context context) {
- DBHelper.DatabaseHelper helper = new DBHelper.DatabaseHelper(context, BACKUP_DATABASE_NAME);
- return helper.getWritableDatabase();
- }
-
- /**
- * Backup account data, returning the number of accounts backed up
- */
- private static int backupAccounts(Context context, SQLiteDatabase mainDatabase) {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "backupAccounts...");
- }
- SQLiteDatabase backupDatabase = getBackupDatabase(context);
- try {
- int numBackedUp = copyAccountTables(mainDatabase, backupDatabase);
- if (numBackedUp < 0) {
- Log.e(TAG, "Account backup failed!");
- } else if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "Backed up " + numBackedUp + " accounts...");
- }
- return numBackedUp;
- } finally {
- if (backupDatabase != null) {
- backupDatabase.close();
- }
- }
- }
-
- /**
- * Restore account data, returning the number of accounts restored
- */
- private static int restoreAccounts(Context context, SQLiteDatabase mainDatabase) {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "restoreAccounts...");
- }
- SQLiteDatabase backupDatabase = getBackupDatabase(context);
- try {
- int numRecovered = copyAccountTables(backupDatabase, mainDatabase);
- if (numRecovered > 0) {
- Log.e(TAG, "Recovered " + numRecovered + " accounts!");
- } else if (numRecovered < 0) {
- Log.e(TAG, "Account recovery failed?");
- } else if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "No accounts to restore...");
- }
- return numRecovered;
- } finally {
- if (backupDatabase != null) {
- backupDatabase.close();
- }
- }
- }
-
- // select count(*) from (select count(*) as dupes from Mailbox where accountKey=?
- // group by serverId) where dupes > 1;
- private static final String ACCOUNT_INTEGRITY_SQL =
- "select count(*) from (select count(*) as dupes from " + Mailbox.TABLE_NAME +
- " where accountKey=? group by " + MailboxColumns.SERVER_ID + ") where dupes > 1";
-
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- // Handle this special case the fastest possible way
- if (uri == INTEGRITY_CHECK_URI) {
- checkDatabases();
- return 0;
- } else if (uri == ACCOUNT_BACKUP_URI) {
- return backupAccounts(getContext(), getDatabase(getContext()));
- }
-
- // Notify all existing cursors, except for ACCOUNT_RESET_NEW_COUNT(_ID)
- Uri notificationUri = EmailContent.CONTENT_URI;
-
- int match = findMatch(uri, "update");
- Context context = getContext();
- ContentResolver resolver = context.getContentResolver();
- // See the comment at delete(), above
- SQLiteDatabase db = getDatabase(context);
- int table = match >> BASE_SHIFT;
- int result;
-
- // We do NOT allow setting of unreadCount/messageCount via the provider
- // These columns are maintained via triggers
- if (match == MAILBOX_ID || match == MAILBOX) {
- values.remove(MailboxColumns.UNREAD_COUNT);
- values.remove(MailboxColumns.MESSAGE_COUNT);
- }
-
- ContentCache cache = mContentCaches[table];
- String tableName = TABLE_NAMES[table];
- String id = "0";
-
- try {
- if (match == MESSAGE_ID || match == SYNCED_MESSAGE_ID) {
- if (!uri.getBooleanQueryParameter(IS_UIPROVIDER, false)) {
- notifyUIConversation(uri);
- }
- }
-outer:
- switch (match) {
- case UI_FOLDER:
- return uiUpdateFolder(uri, values);
- case UI_RECENT_FOLDERS:
- return uiUpdateRecentFolders(uri, values);
- case UI_DEFAULT_RECENT_FOLDERS:
- return uiPopulateRecentFolders(uri);
- case UI_ATTACHMENT:
- return uiUpdateAttachment(uri, values);
- case UI_UPDATEDRAFT:
- return uiUpdateDraft(uri, values);
- case UI_SENDDRAFT:
- return uiSendDraft(uri, values);
- case UI_MESSAGE:
- return uiUpdateMessage(uri, values);
- case ACCOUNT_CHECK:
- id = uri.getLastPathSegment();
- // With any error, return 1 (a failure)
- int res = 1;
- Cursor ic = null;
- try {
- ic = db.rawQuery(ACCOUNT_INTEGRITY_SQL, new String[] {id});
- if (ic.moveToFirst()) {
- res = ic.getInt(0);
- }
- } finally {
- if (ic != null) {
- ic.close();
- }
- }
- // Count of duplicated mailboxes
- return res;
- case MAILBOX_ID_ADD_TO_FIELD:
- case ACCOUNT_ID_ADD_TO_FIELD:
- id = uri.getPathSegments().get(1);
- String field = values.getAsString(EmailContent.FIELD_COLUMN_NAME);
- Long add = values.getAsLong(EmailContent.ADD_COLUMN_NAME);
- if (field == null || add == null) {
- throw new IllegalArgumentException("No field/add specified " + uri);
- }
- ContentValues actualValues = new ContentValues();
- if (cache != null) {
- cache.lock(id);
- }
- try {
- db.beginTransaction();
- try {
- Cursor c = db.query(tableName,
- new String[] {EmailContent.RECORD_ID, field},
- whereWithId(id, selection),
- selectionArgs, null, null, null);
- try {
- result = 0;
- String[] bind = new String[1];
- if (c.moveToNext()) {
- bind[0] = c.getString(0); // _id
- long value = c.getLong(1) + add;
- actualValues.put(field, value);
- result = db.update(tableName, actualValues, ID_EQUALS, bind);
- }
- db.setTransactionSuccessful();
- } finally {
- c.close();
- }
- } finally {
- db.endTransaction();
- }
- } finally {
- if (cache != null) {
- cache.unlock(id, actualValues);
- }
- }
- break;
- case SYNCED_MESSAGE_ID:
- case UPDATED_MESSAGE_ID:
- case MESSAGE_ID:
- case BODY_ID:
- case ATTACHMENT_ID:
- case MAILBOX_ID:
- case ACCOUNT_ID:
- case HOSTAUTH_ID:
- case QUICK_RESPONSE_ID:
- case POLICY_ID:
- id = uri.getPathSegments().get(1);
- if (cache != null) {
- cache.lock(id);
- }
- try {
- if (match == SYNCED_MESSAGE_ID) {
- // For synced messages, first copy the old message to the updated table
- // Note the insert or ignore semantics, guaranteeing that only the first
- // update will be reflected in the updated message table; therefore this
- // row will always have the "original" data
- db.execSQL(UPDATED_MESSAGE_INSERT + id);
- } else if (match == MESSAGE_ID) {
- db.execSQL(UPDATED_MESSAGE_DELETE + id);
- }
- result = db.update(tableName, values, whereWithId(id, selection),
- selectionArgs);
- } catch (SQLiteException e) {
- // Null out values (so they aren't cached) and re-throw
- values = null;
- throw e;
- } finally {
- if (cache != null) {
- cache.unlock(id, values);
- }
- }
- if (match == ATTACHMENT_ID) {
- long attId = Integer.parseInt(id);
- if (values.containsKey(Attachment.FLAGS)) {
- int flags = values.getAsInteger(Attachment.FLAGS);
- mAttachmentService.attachmentChanged(context, attId, flags);
- }
- // Notify UI if necessary; there are only two columns we can change that
- // would be worth a notification
- if (values.containsKey(AttachmentColumns.UI_STATE) ||
- values.containsKey(AttachmentColumns.UI_DOWNLOADED_SIZE)) {
- // Notify on individual attachment
- notifyUI(UIPROVIDER_ATTACHMENT_NOTIFIER, id);
- Attachment att = Attachment.restoreAttachmentWithId(context, attId);
- if (att != null) {
- // And on owning Message
- notifyUI(UIPROVIDER_ATTACHMENTS_NOTIFIER, att.mMessageKey);
- }
- }
- } else if (match == MAILBOX_ID && values.containsKey(Mailbox.UI_SYNC_STATUS)) {
- notifyUI(UIPROVIDER_FOLDER_NOTIFIER, id);
- } else if (match == ACCOUNT_ID) {
- notifyUI(UIPROVIDER_ACCOUNT_NOTIFIER, id);
- }
- break;
- case BODY:
- case MESSAGE:
- case UPDATED_MESSAGE:
- case ATTACHMENT:
- case MAILBOX:
- case ACCOUNT:
- case HOSTAUTH:
- case POLICY:
- switch(match) {
- // To avoid invalidating the cache on updates, we execute them one at a
- // time using the XXX_ID uri; these are all executed atomically
- case ACCOUNT:
- case MAILBOX:
- case HOSTAUTH:
- case POLICY:
- Cursor c = db.query(tableName, EmailContent.ID_PROJECTION,
- selection, selectionArgs, null, null, null);
- db.beginTransaction();
- result = 0;
- try {
- while (c.moveToNext()) {
- update(ContentUris.withAppendedId(
- uri, c.getLong(EmailContent.ID_PROJECTION_COLUMN)),
- values, null, null);
- result++;
- }
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- c.close();
- }
- break outer;
- // Any cached table other than those above should be invalidated here
- case MESSAGE:
- // If we're doing some generic update, the whole cache needs to be
- // invalidated. This case should be quite rare
- cache.invalidate("Update", uri, selection);
- //$FALL-THROUGH$
- default:
- result = db.update(tableName, values, selection, selectionArgs);
- break outer;
- }
- case ACCOUNT_RESET_NEW_COUNT_ID:
- id = uri.getPathSegments().get(1);
- if (cache != null) {
- cache.lock(id);
- }
- ContentValues newMessageCount = CONTENT_VALUES_RESET_NEW_MESSAGE_COUNT;
- if (values != null) {
- Long set = values.getAsLong(EmailContent.SET_COLUMN_NAME);
- if (set != null) {
- newMessageCount = new ContentValues();
- newMessageCount.put(Account.NEW_MESSAGE_COUNT, set);
- }
- }
- try {
- result = db.update(tableName, newMessageCount,
- whereWithId(id, selection), selectionArgs);
- } finally {
- if (cache != null) {
- cache.unlock(id, values);
- }
- }
- notificationUri = Account.CONTENT_URI; // Only notify account cursors.
- break;
- case ACCOUNT_RESET_NEW_COUNT:
- result = db.update(tableName, CONTENT_VALUES_RESET_NEW_MESSAGE_COUNT,
- selection, selectionArgs);
- // Affects all accounts. Just invalidate all account cache.
- cache.invalidate("Reset all new counts", null, null);
- notificationUri = Account.CONTENT_URI; // Only notify account cursors.
- break;
- default:
- throw new IllegalArgumentException("Unknown URI " + uri);
- }
- } catch (SQLiteException e) {
- checkDatabases();
- throw e;
- }
-
- // Notify all notifier cursors
- sendNotifierChange(getBaseNotificationUri(match), NOTIFICATION_OP_UPDATE, id);
-
- resolver.notifyChange(notificationUri, null);
- return result;
- }
-
- /**
- * Returns the base notification URI for the given content type.
- *
- * @param match The type of content that was modified.
- */
- private Uri getBaseNotificationUri(int match) {
- Uri baseUri = null;
- switch (match) {
- case MESSAGE:
- case MESSAGE_ID:
- case SYNCED_MESSAGE_ID:
- baseUri = Message.NOTIFIER_URI;
- break;
- case ACCOUNT:
- case ACCOUNT_ID:
- baseUri = Account.NOTIFIER_URI;
- break;
- }
- return baseUri;
- }
-
- /**
- * Sends a change notification to any cursors observers of the given base URI. The final
- * notification URI is dynamically built to contain the specified information. It will be
- * of the format <<baseURI>>/<<op>>/<<id>>; where <<op>> and <<id>> are optional depending
- * upon the given values.
- * NOTE: If <<op>> is specified, notifications for <<baseURI>>/<<id>> will NOT be invoked.
- * If this is necessary, it can be added. However, due to the implementation of
- * {@link ContentObserver}, observers of <<baseURI>> will receive multiple notifications.
- *
- * @param baseUri The base URI to send notifications to. Must be able to take appended IDs.
- * @param op Optional operation to be appended to the URI.
- * @param id If a positive value, the ID to append to the base URI. Otherwise, no ID will be
- * appended to the base URI.
- */
- private void sendNotifierChange(Uri baseUri, String op, String id) {
- if (baseUri == null) return;
-
- final ContentResolver resolver = getContext().getContentResolver();
-
- // Append the operation, if specified
- if (op != null) {
- baseUri = baseUri.buildUpon().appendEncodedPath(op).build();
- }
-
- long longId = 0L;
- try {
- longId = Long.valueOf(id);
- } catch (NumberFormatException ignore) {}
- if (longId > 0) {
- resolver.notifyChange(ContentUris.withAppendedId(baseUri, longId), null);
- } else {
- resolver.notifyChange(baseUri, null);
- }
-
- // We want to send the message list changed notification if baseUri is Message.NOTIFIER_URI.
- if (baseUri.equals(Message.NOTIFIER_URI)) {
- sendMessageListDataChangedNotification();
- }
- }
-
- private void sendMessageListDataChangedNotification() {
- final Context context = getContext();
- final Intent intent = new Intent(ACTION_NOTIFY_MESSAGE_LIST_DATASET_CHANGED);
- // Ideally this intent would contain information about which account changed, to limit the
- // updates to that particular account. Unfortunately, that information is not available in
- // sendNotifierChange().
- context.sendBroadcast(intent);
- }
-
- @Override
- public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
- throws OperationApplicationException {
- Context context = getContext();
- SQLiteDatabase db = getDatabase(context);
- db.beginTransaction();
- try {
- ContentProviderResult[] results = super.applyBatch(operations);
- db.setTransactionSuccessful();
- return results;
- } finally {
- db.endTransaction();
- }
- }
-
- /**
- * For testing purposes, check whether a given row is cached
- * @param baseUri the base uri of the EmailContent
- * @param id the row id of the EmailContent
- * @return whether or not the row is currently cached
- */
- @VisibleForTesting
- protected boolean isCached(Uri baseUri, long id) {
- int match = findMatch(baseUri, "isCached");
- int table = match >> BASE_SHIFT;
- ContentCache cache = mContentCaches[table];
- if (cache == null) return false;
- Cursor cc = cache.get(Long.toString(id));
- return (cc != null);
- }
-
- public static interface AttachmentService {
- /**
- * Notify the service that an attachment has changed.
- */
- void attachmentChanged(Context context, long id, int flags);
- }
-
- private final AttachmentService DEFAULT_ATTACHMENT_SERVICE = new AttachmentService() {
- @Override
- public void attachmentChanged(Context context, long id, int flags) {
- // The default implementation delegates to the real service.
- AttachmentDownloadService.attachmentChanged(context, id, flags);
- }
- };
- private AttachmentService mAttachmentService = DEFAULT_ATTACHMENT_SERVICE;
-
- /**
- * Injects a custom attachment service handler. If null is specified, will reset to the
- * default service.
- */
- public void injectAttachmentService(AttachmentService as) {
- mAttachmentService = (as == null) ? DEFAULT_ATTACHMENT_SERVICE : as;
- }
-
- // SELECT DISTINCT Boxes._id, Boxes.unreadCount count(Message._id) from Message,
- // (SELECT _id, unreadCount, messageCount, lastNotifiedMessageCount, lastNotifiedMessageKey
- // FROM Mailbox WHERE accountKey=6 AND ((type = 0) OR (syncInterval!=0 AND syncInterval!=-1)))
- // AS Boxes
- // WHERE Boxes.messageCount!=Boxes.lastNotifiedMessageCount
- // OR (Boxes._id=Message.mailboxKey AND Message._id>Boxes.lastNotifiedMessageKey)
- // TODO: This query can be simplified a bit
- private static final String NOTIFICATION_QUERY =
- "SELECT DISTINCT Boxes." + MailboxColumns.ID + ", Boxes." + MailboxColumns.UNREAD_COUNT +
- ", count(" + Message.TABLE_NAME + "." + MessageColumns.ID + ")" +
- " FROM " +
- Message.TABLE_NAME + "," +
- "(SELECT " + MailboxColumns.ID + "," + MailboxColumns.UNREAD_COUNT + "," +
- MailboxColumns.MESSAGE_COUNT + "," + MailboxColumns.LAST_NOTIFIED_MESSAGE_COUNT +
- "," + MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY + " FROM " + Mailbox.TABLE_NAME +
- " WHERE " + MailboxColumns.ACCOUNT_KEY + "=?" +
- " AND (" + MailboxColumns.TYPE + "=" + Mailbox.TYPE_INBOX + " OR ("
- + MailboxColumns.SYNC_INTERVAL + "!=0 AND " +
- MailboxColumns.SYNC_INTERVAL + "!=-1))) AS Boxes " +
- "WHERE Boxes." + MailboxColumns.ID + '=' + Message.TABLE_NAME + "." +
- MessageColumns.MAILBOX_KEY + " AND " + Message.TABLE_NAME + "." +
- MessageColumns.ID + ">Boxes." + MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY +
- " AND " + MessageColumns.FLAG_READ + "=0 AND " + MessageColumns.TIMESTAMP + "!=0";
-
- public Cursor notificationQuery(Uri uri) {
- SQLiteDatabase db = getDatabase(getContext());
- String accountId = uri.getLastPathSegment();
- return db.rawQuery(NOTIFICATION_QUERY, new String[] {accountId});
- }
-
- public Cursor mostRecentMessageQuery(Uri uri) {
- SQLiteDatabase db = getDatabase(getContext());
- String mailboxId = uri.getLastPathSegment();
- return db.rawQuery("select max(_id) from Message where mailboxKey=?",
- new String[] {mailboxId});
- }
-
- /**
- * Support for UnifiedEmail below
- */
-
- private static final String NOT_A_DRAFT_STRING =
- Integer.toString(UIProvider.DraftType.NOT_A_DRAFT);
-
- private static final String CONVERSATION_FLAGS =
- "CASE WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_INCOMING_MEETING_INVITE +
- ") !=0 THEN " + UIProvider.ConversationFlags.CALENDAR_INVITE +
- " ELSE 0 END + " +
- "CASE WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_FORWARDED +
- ") !=0 THEN " + UIProvider.ConversationFlags.FORWARDED +
- " ELSE 0 END + " +
- "CASE WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_REPLIED_TO +
- ") !=0 THEN " + UIProvider.ConversationFlags.REPLIED +
- " ELSE 0 END";
-
- /**
- * Array of pre-defined account colors (legacy colors from old email app)
- */
- private static final int[] ACCOUNT_COLORS = new int[] {
- 0xff71aea7, 0xff621919, 0xff18462f, 0xffbf8e52, 0xff001f79,
- 0xffa8afc2, 0xff6b64c4, 0xff738359, 0xff9d50a4
- };
-
- private static final String CONVERSATION_COLOR =
- "@CASE (" + MessageColumns.ACCOUNT_KEY + " - 1) % " + ACCOUNT_COLORS.length +
- " WHEN 0 THEN " + ACCOUNT_COLORS[0] +
- " WHEN 1 THEN " + ACCOUNT_COLORS[1] +
- " WHEN 2 THEN " + ACCOUNT_COLORS[2] +
- " WHEN 3 THEN " + ACCOUNT_COLORS[3] +
- " WHEN 4 THEN " + ACCOUNT_COLORS[4] +
- " WHEN 5 THEN " + ACCOUNT_COLORS[5] +
- " WHEN 6 THEN " + ACCOUNT_COLORS[6] +
- " WHEN 7 THEN " + ACCOUNT_COLORS[7] +
- " WHEN 8 THEN " + ACCOUNT_COLORS[8] +
- " END";
-
- private static final String ACCOUNT_COLOR =
- "@CASE (" + AccountColumns.ID + " - 1) % " + ACCOUNT_COLORS.length +
- " WHEN 0 THEN " + ACCOUNT_COLORS[0] +
- " WHEN 1 THEN " + ACCOUNT_COLORS[1] +
- " WHEN 2 THEN " + ACCOUNT_COLORS[2] +
- " WHEN 3 THEN " + ACCOUNT_COLORS[3] +
- " WHEN 4 THEN " + ACCOUNT_COLORS[4] +
- " WHEN 5 THEN " + ACCOUNT_COLORS[5] +
- " WHEN 6 THEN " + ACCOUNT_COLORS[6] +
- " WHEN 7 THEN " + ACCOUNT_COLORS[7] +
- " WHEN 8 THEN " + ACCOUNT_COLORS[8] +
- " END";
- /**
- * Mapping of UIProvider columns to EmailProvider columns for the message list (called the
- * conversation list in UnifiedEmail)
- */
- private static final ProjectionMap sMessageListMap = ProjectionMap.builder()
- .add(BaseColumns._ID, MessageColumns.ID)
- .add(UIProvider.ConversationColumns.URI, uriWithId("uimessage"))
- .add(UIProvider.ConversationColumns.MESSAGE_LIST_URI, uriWithId("uimessage"))
- .add(UIProvider.ConversationColumns.SUBJECT, MessageColumns.SUBJECT)
- .add(UIProvider.ConversationColumns.SNIPPET, MessageColumns.SNIPPET)
- .add(UIProvider.ConversationColumns.SENDER_INFO, MessageColumns.FROM_LIST)
- .add(UIProvider.ConversationColumns.DATE_RECEIVED_MS, MessageColumns.TIMESTAMP)
- .add(UIProvider.ConversationColumns.HAS_ATTACHMENTS, MessageColumns.FLAG_ATTACHMENT)
- .add(UIProvider.ConversationColumns.NUM_MESSAGES, "1")
- .add(UIProvider.ConversationColumns.NUM_DRAFTS, "0")
- .add(UIProvider.ConversationColumns.SENDING_STATE,
- Integer.toString(ConversationSendingState.OTHER))
- .add(UIProvider.ConversationColumns.PRIORITY, Integer.toString(ConversationPriority.LOW))
- .add(UIProvider.ConversationColumns.READ, MessageColumns.FLAG_READ)
- .add(UIProvider.ConversationColumns.STARRED, MessageColumns.FLAG_FAVORITE)
- .add(UIProvider.ConversationColumns.FOLDER_LIST,
- "'content://" + EmailContent.AUTHORITY + "/uifolder/' || "
- + MessageColumns.MAILBOX_KEY)
- .add(UIProvider.ConversationColumns.FLAGS, CONVERSATION_FLAGS)
- .add(UIProvider.ConversationColumns.ACCOUNT_URI,
- "'content://" + EmailContent.AUTHORITY + "/uiaccount/' || "
- + MessageColumns.ACCOUNT_KEY)
- .build();
-
- /**
- * Generate UIProvider draft type; note the test for "reply all" must come before "reply"
- */
- private static final String MESSAGE_DRAFT_TYPE =
- "CASE WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_TYPE_ORIGINAL +
- ") !=0 THEN " + UIProvider.DraftType.COMPOSE +
- " WHEN (" + MessageColumns.FLAGS + "&" + (1<<20) +
- ") !=0 THEN " + UIProvider.DraftType.REPLY_ALL +
- " WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_TYPE_REPLY +
- ") !=0 THEN " + UIProvider.DraftType.REPLY +
- " WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_TYPE_FORWARD +
- ") !=0 THEN " + UIProvider.DraftType.FORWARD +
- " ELSE " + UIProvider.DraftType.NOT_A_DRAFT + " END";
-
- private static final String MESSAGE_FLAGS =
- "CASE WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_INCOMING_MEETING_INVITE +
- ") !=0 THEN " + UIProvider.MessageFlags.CALENDAR_INVITE +
- " ELSE 0 END";
-
- /**
- * Mapping of UIProvider columns to EmailProvider columns for a detailed message view in
- * UnifiedEmail
- */
- private static final ProjectionMap sMessageViewMap = ProjectionMap.builder()
- .add(BaseColumns._ID, Message.TABLE_NAME + "." + EmailContent.MessageColumns.ID)
- .add(UIProvider.MessageColumns.SERVER_ID, SyncColumns.SERVER_ID)
- .add(UIProvider.MessageColumns.URI, uriWithFQId("uimessage", Message.TABLE_NAME))
- .add(UIProvider.MessageColumns.CONVERSATION_ID,
- uriWithFQId("uimessage", Message.TABLE_NAME))
- .add(UIProvider.MessageColumns.SUBJECT, EmailContent.MessageColumns.SUBJECT)
- .add(UIProvider.MessageColumns.SNIPPET, EmailContent.MessageColumns.SNIPPET)
- .add(UIProvider.MessageColumns.FROM, EmailContent.MessageColumns.FROM_LIST)
- .add(UIProvider.MessageColumns.TO, EmailContent.MessageColumns.TO_LIST)
- .add(UIProvider.MessageColumns.CC, EmailContent.MessageColumns.CC_LIST)
- .add(UIProvider.MessageColumns.BCC, EmailContent.MessageColumns.BCC_LIST)
- .add(UIProvider.MessageColumns.REPLY_TO, EmailContent.MessageColumns.REPLY_TO_LIST)
- .add(UIProvider.MessageColumns.DATE_RECEIVED_MS, EmailContent.MessageColumns.TIMESTAMP)
- .add(UIProvider.MessageColumns.BODY_HTML, Body.HTML_CONTENT)
- .add(UIProvider.MessageColumns.BODY_TEXT, Body.TEXT_CONTENT)
- .add(UIProvider.MessageColumns.REF_MESSAGE_ID, "0")
- .add(UIProvider.MessageColumns.DRAFT_TYPE, NOT_A_DRAFT_STRING)
- .add(UIProvider.MessageColumns.APPEND_REF_MESSAGE_CONTENT, "0")
- .add(UIProvider.MessageColumns.HAS_ATTACHMENTS, EmailContent.MessageColumns.FLAG_ATTACHMENT)
- .add(UIProvider.MessageColumns.ATTACHMENT_LIST_URI,
- uriWithFQId("uiattachments", Message.TABLE_NAME))
- .add(UIProvider.MessageColumns.MESSAGE_FLAGS, MESSAGE_FLAGS)
- .add(UIProvider.MessageColumns.SAVE_MESSAGE_URI,
- uriWithFQId("uiupdatedraft", Message.TABLE_NAME))
- .add(UIProvider.MessageColumns.SEND_MESSAGE_URI,
- uriWithFQId("uisenddraft", Message.TABLE_NAME))
- .add(UIProvider.MessageColumns.DRAFT_TYPE, MESSAGE_DRAFT_TYPE)
- .add(UIProvider.MessageColumns.MESSAGE_ACCOUNT_URI,
- uriWithColumn("account", MessageColumns.ACCOUNT_KEY))
- .add(UIProvider.MessageColumns.STARRED, EmailContent.MessageColumns.FLAG_FAVORITE)
- .add(UIProvider.MessageColumns.READ, EmailContent.MessageColumns.FLAG_READ)
- .build();
-
- /**
- * Generate UIProvider folder capabilities from mailbox flags
- */
- private static final String FOLDER_CAPABILITIES =
- "CASE WHEN (" + MailboxColumns.FLAGS + "&" + Mailbox.FLAG_ACCEPTS_MOVED_MAIL +
- ") !=0 THEN " + UIProvider.FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES +
- " ELSE 0 END";
-
- /**
- * Convert EmailProvider type to UIProvider type
- */
- private static final String FOLDER_TYPE = "CASE " + MailboxColumns.TYPE
- + " WHEN " + Mailbox.TYPE_INBOX + " THEN " + UIProvider.FolderType.INBOX
- + " WHEN " + Mailbox.TYPE_DRAFTS + " THEN " + UIProvider.FolderType.DRAFT
- + " WHEN " + Mailbox.TYPE_OUTBOX + " THEN " + UIProvider.FolderType.OUTBOX
- + " WHEN " + Mailbox.TYPE_SENT + " THEN " + UIProvider.FolderType.SENT
- + " WHEN " + Mailbox.TYPE_TRASH + " THEN " + UIProvider.FolderType.TRASH
- + " WHEN " + Mailbox.TYPE_JUNK + " THEN " + UIProvider.FolderType.SPAM
- + " WHEN " + Mailbox.TYPE_STARRED + " THEN " + UIProvider.FolderType.STARRED
- + " ELSE " + UIProvider.FolderType.DEFAULT + " END";
-
- private static final String FOLDER_ICON = "CASE " + MailboxColumns.TYPE
- + " WHEN " + Mailbox.TYPE_INBOX + " THEN " + R.drawable.ic_folder_inbox_holo_light
- + " WHEN " + Mailbox.TYPE_DRAFTS + " THEN " + R.drawable.ic_folder_drafts_holo_light
- + " WHEN " + Mailbox.TYPE_OUTBOX + " THEN " + R.drawable.ic_folder_outbox_holo_light
- + " WHEN " + Mailbox.TYPE_SENT + " THEN " + R.drawable.ic_folder_sent_holo_light
- + " WHEN " + Mailbox.TYPE_STARRED + " THEN " + R.drawable.ic_menu_star_holo_light
- + " ELSE -1 END";
-
- private static final ProjectionMap sFolderListMap = ProjectionMap.builder()
- .add(BaseColumns._ID, MailboxColumns.ID)
- .add(UIProvider.FolderColumns.URI, uriWithId("uifolder"))
- .add(UIProvider.FolderColumns.NAME, "displayName")
- .add(UIProvider.FolderColumns.HAS_CHILDREN,
- MailboxColumns.FLAGS + "&" + Mailbox.FLAG_HAS_CHILDREN)
- .add(UIProvider.FolderColumns.CAPABILITIES, FOLDER_CAPABILITIES)
- .add(UIProvider.FolderColumns.SYNC_WINDOW, "3")
- .add(UIProvider.FolderColumns.CONVERSATION_LIST_URI, uriWithId("uimessages"))
- .add(UIProvider.FolderColumns.CHILD_FOLDERS_LIST_URI, uriWithId("uisubfolders"))
- .add(UIProvider.FolderColumns.UNREAD_COUNT, MailboxColumns.UNREAD_COUNT)
- .add(UIProvider.FolderColumns.TOTAL_COUNT, MailboxColumns.MESSAGE_COUNT)
- .add(UIProvider.FolderColumns.REFRESH_URI, uriWithId("uirefresh"))
- .add(UIProvider.FolderColumns.SYNC_STATUS, MailboxColumns.UI_SYNC_STATUS)
- .add(UIProvider.FolderColumns.LAST_SYNC_RESULT, MailboxColumns.UI_LAST_SYNC_RESULT)
- .add(UIProvider.FolderColumns.TYPE, FOLDER_TYPE)
- .add(UIProvider.FolderColumns.ICON_RES_ID, FOLDER_ICON)
- .add(UIProvider.FolderColumns.HIERARCHICAL_DESC, MailboxColumns.HIERARCHICAL_NAME)
- .build();
-
- private static final ProjectionMap sAccountListMap = ProjectionMap.builder()
- .add(BaseColumns._ID, AccountColumns.ID)
- .add(UIProvider.AccountColumns.FOLDER_LIST_URI, uriWithId("uifolders"))
- .add(UIProvider.AccountColumns.FULL_FOLDER_LIST_URI, uriWithId("uiallfolders"))
- .add(UIProvider.AccountColumns.NAME, AccountColumns.DISPLAY_NAME)
- .add(UIProvider.AccountColumns.SAVE_DRAFT_URI, uriWithId("uisavedraft"))
- .add(UIProvider.AccountColumns.SEND_MAIL_URI, uriWithId("uisendmail"))
- .add(UIProvider.AccountColumns.UNDO_URI,
- ("'content://" + UIProvider.AUTHORITY + "/uiundo'"))
- .add(UIProvider.AccountColumns.URI, uriWithId("uiaccount"))
- .add(UIProvider.AccountColumns.SEARCH_URI, uriWithId("uisearch"))
- // TODO: Is provider version used?
- .add(UIProvider.AccountColumns.PROVIDER_VERSION, "1")
- .add(UIProvider.AccountColumns.SYNC_STATUS, "0")
- .add(UIProvider.AccountColumns.RECENT_FOLDER_LIST_URI, uriWithId("uirecentfolders"))
- .add(UIProvider.AccountColumns.DEFAULT_RECENT_FOLDER_LIST_URI,
- uriWithId("uidefaultrecentfolders"))
- .add(UIProvider.AccountColumns.SettingsColumns.SIGNATURE, AccountColumns.SIGNATURE)
- .add(UIProvider.AccountColumns.SettingsColumns.SNAP_HEADERS,
- Integer.toString(UIProvider.SnapHeaderValue.ALWAYS))
- .add(UIProvider.AccountColumns.SettingsColumns.REPLY_BEHAVIOR,
- Integer.toString(UIProvider.DefaultReplyBehavior.REPLY))
- .add(UIProvider.AccountColumns.SettingsColumns.CONFIRM_ARCHIVE, "0")
- .build();
-
- /**
- * The "ORDER BY" clause for top level folders
- */
- private static final String MAILBOX_ORDER_BY = "CASE " + MailboxColumns.TYPE
- + " WHEN " + Mailbox.TYPE_INBOX + " THEN 0"
- + " WHEN " + Mailbox.TYPE_DRAFTS + " THEN 1"
- + " WHEN " + Mailbox.TYPE_OUTBOX + " THEN 2"
- + " WHEN " + Mailbox.TYPE_SENT + " THEN 3"
- + " WHEN " + Mailbox.TYPE_TRASH + " THEN 4"
- + " WHEN " + Mailbox.TYPE_JUNK + " THEN 5"
- // Other mailboxes (i.e. of Mailbox.TYPE_MAIL) are shown in alphabetical order.
- + " ELSE 10 END"
- + " ," + MailboxColumns.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
-
- /**
- * Mapping of UIProvider columns to EmailProvider columns for a message's attachments
- */
- private static final ProjectionMap sAttachmentMap = ProjectionMap.builder()
- .add(UIProvider.AttachmentColumns.NAME, AttachmentColumns.FILENAME)
- .add(UIProvider.AttachmentColumns.SIZE, AttachmentColumns.SIZE)
- .add(UIProvider.AttachmentColumns.URI, uriWithId("uiattachment"))
- .add(UIProvider.AttachmentColumns.CONTENT_TYPE, AttachmentColumns.MIME_TYPE)
- .add(UIProvider.AttachmentColumns.STATE, AttachmentColumns.UI_STATE)
- .add(UIProvider.AttachmentColumns.DESTINATION, AttachmentColumns.UI_DESTINATION)
- .add(UIProvider.AttachmentColumns.DOWNLOADED_SIZE, AttachmentColumns.UI_DOWNLOADED_SIZE)
- .add(UIProvider.AttachmentColumns.CONTENT_URI, AttachmentColumns.CONTENT_URI)
- .build();
-
- /**
- * Generate the SELECT clause using a specified mapping and the original UI projection
- * @param map the ProjectionMap to use for this projection
- * @param projection the projection as sent by UnifiedEmail
- * @param values ContentValues to be used if the ProjectionMap entry is null
- * @return a StringBuilder containing the SELECT expression for a SQLite query
- */
- private StringBuilder genSelect(ProjectionMap map, String[] projection) {
- return genSelect(map, projection, EMPTY_CONTENT_VALUES);
- }
-
- private StringBuilder genSelect(ProjectionMap map, String[] projection, ContentValues values) {
- StringBuilder sb = new StringBuilder("SELECT ");
- boolean first = true;
- for (String column: projection) {
- if (first) {
- first = false;
- } else {
- sb.append(',');
- }
- String val = null;
- // First look at values; this is an override of default behavior
- if (values.containsKey(column)) {
- String value = values.getAsString(column);
- if (value.startsWith("@")) {
- val = value.substring(1) + " AS " + column;
- } else {
- val = "'" + values.getAsString(column) + "' AS " + column;
- }
- } else {
- // Now, get the standard value for the column from our projection map
- val = map.get(column);
- // If we don't have the column, return "NULL AS <column>", and warn
- if (val == null) {
- val = "NULL AS " + column;
- }
- }
- sb.append(val);
- }
- return sb;
- }
-
- /**
- * Convenience method to create a Uri string given the "type" of query; we append the type
- * of the query and the id column name (_id)
- *
- * @param type the "type" of the query, as defined by our UriMatcher definitions
- * @return a Uri string
- */
- private static String uriWithId(String type) {
- return uriWithColumn(type, EmailContent.RECORD_ID);
- }
-
- /**
- * Convenience method to create a Uri string given the "type" of query; we append the type
- * of the query and the passed in column name
- *
- * @param type the "type" of the query, as defined by our UriMatcher definitions
- * @param columnName the column in the table being queried
- * @return a Uri string
- */
- private static String uriWithColumn(String type, String columnName) {
- return "'content://" + EmailContent.AUTHORITY + "/" + type + "/' || " + columnName;
- }
-
- /**
- * Convenience method to create a Uri string given the "type" of query and the table name to
- * which it applies; we append the type of the query and the fully qualified (FQ) id column
- * (i.e. including the table name); we need this for join queries where _id would otherwise
- * be ambiguous
- *
- * @param type the "type" of the query, as defined by our UriMatcher definitions
- * @param tableName the name of the table whose _id is referred to
- * @return a Uri string
- */
- private static String uriWithFQId(String type, String tableName) {
- return "'content://" + EmailContent.AUTHORITY + "/" + type + "/' || " + tableName + "._id";
- }
-
- // Regex that matches start of img tag. '<(?i)img\s+'.
- private static final Pattern IMG_TAG_START_REGEX = Pattern.compile("<(?i)img\\s+");
-
- /**
- * Generate the "view message" SQLite query, given a projection from UnifiedEmail
- *
- * @param uiProjection as passed from UnifiedEmail
- * @return the SQLite query to be executed on the EmailProvider database
- */
- private String genQueryViewMessage(String[] uiProjection, String id) {
- Context context = getContext();
- long messageId = Long.parseLong(id);
- Message msg = Message.restoreMessageWithId(context, messageId);
- ContentValues values = new ContentValues();
- if (msg != null) {
- if (msg.mFlagLoaded == Message.FLAG_LOADED_PARTIAL) {
- EmailServiceProxy service =
- EmailServiceUtils.getServiceForAccount(context, null, msg.mAccountKey);
- try {
- service.loadMore(messageId);
- } catch (RemoteException e) {
- // Nothing to do
- }
- }
- Body body = Body.restoreBodyWithMessageId(context, messageId);
- if (body != null) {
- if (body.mHtmlContent != null) {
- if (IMG_TAG_START_REGEX.matcher(body.mHtmlContent).find()) {
- values.put(UIProvider.MessageColumns.EMBEDS_EXTERNAL_RESOURCES, 1);
- }
- }
- }
- Address[] fromList = Address.unpack(msg.mFrom);
- int autoShowImages = 0;
- Preferences prefs = Preferences.getPreferences(context);
- for (Address sender : fromList) {
- String email = sender.getAddress();
- if (prefs.shouldShowImagesFor(email)) {
- autoShowImages = 1;
- break;
- }
- }
- values.put(UIProvider.MessageColumns.ALWAYS_SHOW_IMAGES, autoShowImages);
- // Add attachments...
- Attachment[] atts = Attachment.restoreAttachmentsWithMessageId(context, messageId);
- if (atts.length > 0) {
- ArrayList<com.android.mail.providers.Attachment> uiAtts =
- new ArrayList<com.android.mail.providers.Attachment>();
- for (Attachment att : atts) {
- if (att.mContentId != null && att.mContentUri != null) {
- continue;
- }
- com.android.mail.providers.Attachment uiAtt =
- new com.android.mail.providers.Attachment();
- uiAtt.name = att.mFileName;
- uiAtt.contentType = att.mMimeType;
- uiAtt.size = (int) att.mSize;
- uiAtt.uri = uiUri("uiattachment", att.mId);
- uiAtts.add(uiAtt);
- }
- values.put(UIProvider.MessageColumns.ATTACHMENTS,
- com.android.mail.providers.Attachment.toJSONArray(uiAtts));
- }
- if (msg.mDraftInfo != 0) {
- values.put(UIProvider.MessageColumns.APPEND_REF_MESSAGE_CONTENT,
- (msg.mDraftInfo & Message.DRAFT_INFO_APPEND_REF_MESSAGE) != 0 ? 1 : 0);
- values.put(UIProvider.MessageColumns.QUOTE_START_POS,
- msg.mDraftInfo & Message.DRAFT_INFO_QUOTE_POS_MASK);
- }
- }
- if ((msg.mFlags & Message.FLAG_INCOMING_MEETING_INVITE) != 0) {
- values.put(UIProvider.MessageColumns.EVENT_INTENT_URI,
- "content://ui.email2.android.com/event/" + msg.mId);
- }
- StringBuilder sb = genSelect(sMessageViewMap, uiProjection, values);
- sb.append(" FROM " + Message.TABLE_NAME + "," + Body.TABLE_NAME + " WHERE " +
- Body.MESSAGE_KEY + "=" + Message.TABLE_NAME + "." + Message.RECORD_ID + " AND " +
- Message.TABLE_NAME + "." + Message.RECORD_ID + "=?");
- return sb.toString();
- }
-
- /**
- * Generate the "message list" SQLite query, given a projection from UnifiedEmail
- *
- * @param uiProjection as passed from UnifiedEmail
- * @return the SQLite query to be executed on the EmailProvider database
- */
- private String genQueryMailboxMessages(String[] uiProjection) {
- StringBuilder sb = genSelect(sMessageListMap, uiProjection);
- sb.append(" FROM " + Message.TABLE_NAME + " WHERE " + Message.MAILBOX_KEY + "=? ORDER BY " +
- MessageColumns.TIMESTAMP + " DESC");
- return sb.toString();
- }
-
- /**
- * Generate various virtual mailbox SQLite queries, given a projection from UnifiedEmail
- *
- * @param uiProjection as passed from UnifiedEmail
- * @param id the id of the virtual mailbox
- * @return the SQLite query to be executed on the EmailProvider database
- */
- private Cursor getVirtualMailboxMessagesCursor(SQLiteDatabase db, String[] uiProjection,
- long mailboxId) {
- ContentValues values = new ContentValues();
- values.put(UIProvider.ConversationColumns.COLOR, CONVERSATION_COLOR);
- StringBuilder sb = genSelect(sMessageListMap, uiProjection, values);
- if (isCombinedMailbox(mailboxId)) {
- switch (getVirtualMailboxType(mailboxId)) {
- case Mailbox.TYPE_INBOX:
- sb.append(" FROM " + Message.TABLE_NAME + " WHERE " +
- MessageColumns.MAILBOX_KEY + " IN (SELECT " + MailboxColumns.ID +
- " FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.TYPE +
- "=" + Mailbox.TYPE_INBOX + ") ORDER BY " + MessageColumns.TIMESTAMP +
- " DESC");
- break;
- case Mailbox.TYPE_STARRED:
- sb.append(" FROM " + Message.TABLE_NAME + " WHERE " +
- MessageColumns.FLAG_FAVORITE + "=1 ORDER BY " +
- MessageColumns.TIMESTAMP + " DESC");
- break;
- default:
- throw new IllegalArgumentException("No virtual mailbox for: " + mailboxId);
- }
- return db.rawQuery(sb.toString(), null);
- } else {
- switch (getVirtualMailboxType(mailboxId)) {
- case Mailbox.TYPE_STARRED:
- sb.append(" FROM " + Message.TABLE_NAME + " WHERE " +
- MessageColumns.ACCOUNT_KEY + "=? AND " +
- MessageColumns.FLAG_FAVORITE + "=1 ORDER BY " +
- MessageColumns.TIMESTAMP + " DESC");
- break;
- default:
- throw new IllegalArgumentException("No virtual mailbox for: " + mailboxId);
- }
- return db.rawQuery(sb.toString(),
- new String[] {getVirtualMailboxAccountIdString(mailboxId)});
- }
- }
-
- /**
- * Generate the "message list" SQLite query, given a projection from UnifiedEmail
- *
- * @param uiProjection as passed from UnifiedEmail
- * @return the SQLite query to be executed on the EmailProvider database
- */
- private String genQueryConversation(String[] uiProjection) {
- StringBuilder sb = genSelect(sMessageListMap, uiProjection);
- sb.append(" FROM " + Message.TABLE_NAME + " WHERE " + Message.RECORD_ID + "=?");
- return sb.toString();
- }
-
- /**
- * Generate the "top level folder list" SQLite query, given a projection from UnifiedEmail
- *
- * @param uiProjection as passed from UnifiedEmail
- * @return the SQLite query to be executed on the EmailProvider database
- */
- private String genQueryAccountMailboxes(String[] uiProjection) {
- StringBuilder sb = genSelect(sFolderListMap, uiProjection);
- sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.ACCOUNT_KEY +
- "=? AND " + MailboxColumns.TYPE + " < " + Mailbox.TYPE_NOT_EMAIL +
- " AND " + MailboxColumns.PARENT_KEY + " < 0 ORDER BY ");
- sb.append(MAILBOX_ORDER_BY);
- return sb.toString();
- }
-
- /**
- * Generate the "all folders" SQLite query, given a projection from UnifiedEmail. The list is
- * sorted by the name as it appears in a hierarchical listing
- *
- * @param uiProjection as passed from UnifiedEmail
- * @return the SQLite query to be executed on the EmailProvider database
- */
- private String genQueryAccountAllMailboxes(String[] uiProjection) {
- StringBuilder sb = genSelect(sFolderListMap, uiProjection);
- // Use a derived column to choose either hierarchicalName or displayName
- sb.append(", case when " + MailboxColumns.HIERARCHICAL_NAME + " is null then " +
- MailboxColumns.DISPLAY_NAME + " else " + MailboxColumns.HIERARCHICAL_NAME +
- " end as h_name");
- // Order by the derived column
- sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.ACCOUNT_KEY +
- "=? AND " + MailboxColumns.TYPE + " < " + Mailbox.TYPE_NOT_EMAIL +
- " ORDER BY h_name");
- return sb.toString();
- }
-
- /**
- * Generate the "recent folder list" SQLite query, given a projection from UnifiedEmail
- *
- * @param uiProjection as passed from UnifiedEmail
- * @return the SQLite query to be executed on the EmailProvider database
- */
- private String genQueryRecentMailboxes(String[] uiProjection) {
- StringBuilder sb = genSelect(sFolderListMap, uiProjection);
- sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.ACCOUNT_KEY +
- "=? AND " + MailboxColumns.TYPE + " < " + Mailbox.TYPE_NOT_EMAIL +
- " AND " + MailboxColumns.PARENT_KEY + " < 0 AND " +
- MailboxColumns.LAST_TOUCHED_TIME + " > 0 ORDER BY " +
- MailboxColumns.LAST_TOUCHED_TIME + " DESC");
- return sb.toString();
- }
-
- /**
- * Generate a "single mailbox" SQLite query, given a projection from UnifiedEmail
- *
- * @param uiProjection as passed from UnifiedEmail
- * @return the SQLite query to be executed on the EmailProvider database
- */
- private String genQueryMailbox(String[] uiProjection, String id) {
- long mailboxId = Long.parseLong(id);
- ContentValues values = new ContentValues();
- if (mSearchParams != null && mailboxId == mSearchParams.mSearchMailboxId) {
- // This is the current search mailbox; use the total count
- values = new ContentValues();
- values.put(UIProvider.FolderColumns.TOTAL_COUNT, mSearchParams.mTotalCount);
- // "load more" is valid for search results
- values.put(UIProvider.FolderColumns.LOAD_MORE_URI,
- uiUriString("uiloadmore", mailboxId));
- } else {
- Context context = getContext();
- Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
- // Make sure we can't get NPE if mailbox has disappeared (the result will end up moot)
- if (mailbox != null) {
- String protocol = Account.getProtocol(context, mailbox.mAccountKey);
- EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, protocol);
- // "load more" is valid for protocols not supporting "lookback"
- if (info != null && !info.offerLookback) {
- values.put(UIProvider.FolderColumns.LOAD_MORE_URI,
- uiUriString("uiloadmore", mailboxId));
- } else {
- int caps = UIProvider.FolderCapabilities.SUPPORTS_SETTINGS;
- if ((mailbox.mFlags & Mailbox.FLAG_ACCEPTS_MOVED_MAIL) != 0) {
- caps |= UIProvider.FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES;
- }
- values.put(UIProvider.FolderColumns.CAPABILITIES, caps);
- }
- // For trash, we don't allow undo
- if (mailbox.mType == Mailbox.TYPE_TRASH) {
- values.put(UIProvider.FolderColumns.CAPABILITIES,
- UIProvider.FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES |
- UIProvider.FolderCapabilities.CAN_HOLD_MAIL |
- UIProvider.FolderCapabilities.DELETE_ACTION_FINAL);
- }
- if (isVirtualMailbox(mailboxId)) {
- int capa = values.getAsInteger(UIProvider.FolderColumns.CAPABILITIES);
- values.put(UIProvider.FolderColumns.CAPABILITIES,
- capa | UIProvider.FolderCapabilities.IS_VIRTUAL);
- }
- }
- }
- StringBuilder sb = genSelect(sFolderListMap, uiProjection, values);
- sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.ID + "=?");
- return sb.toString();
- }
-
- private static final Uri BASE_EXTERNAL_URI = Uri.parse("content://ui.email.android.com");
-
- private static final Uri BASE_EXTERAL_URI2 = Uri.parse("content://ui.email2.android.com");
-
- private static String getExternalUriString(String segment, String account) {
- return BASE_EXTERNAL_URI.buildUpon().appendPath(segment)
- .appendQueryParameter("account", account).build().toString();
- }
-
- private static String getExternalUriStringEmail2(String segment, String account) {
- return BASE_EXTERAL_URI2.buildUpon().appendPath(segment)
- .appendQueryParameter("account", account).build().toString();
- }
-
- /**
- * Generate a "single account" SQLite query, given a projection from UnifiedEmail
- *
- * @param uiProjection as passed from UnifiedEmail
- * @return the SQLite query to be executed on the EmailProvider database
- */
- private String genQueryAccount(String[] uiProjection, String id) {
- ContentValues values = new ContentValues();
- long accountId = Long.parseLong(id);
-
- // Get account capabilities from the service
- EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(getContext(),
- mServiceCallback, accountId);
- int capabilities = 0;
- try {
- capabilities = service.getCapabilities(accountId);
- } catch (RemoteException e) {
- }
- values.put(UIProvider.AccountColumns.CAPABILITIES, capabilities);
-
- values.put(UIProvider.AccountColumns.SETTINGS_INTENT_URI,
- getExternalUriString("settings", id));
- values.put(UIProvider.AccountColumns.COMPOSE_URI,
- getExternalUriStringEmail2("compose", id));
- values.put(UIProvider.AccountColumns.MIME_TYPE, EMAIL_APP_MIME_TYPE);
- values.put(UIProvider.AccountColumns.COLOR, ACCOUNT_COLOR);
-
- Preferences prefs = Preferences.getPreferences(getContext());
- values.put(UIProvider.AccountColumns.SettingsColumns.CONFIRM_DELETE,
- prefs.getConfirmDelete() ? "1" : "0");
- values.put(UIProvider.AccountColumns.SettingsColumns.CONFIRM_SEND,
- prefs.getConfirmSend() ? "1" : "0");
- values.put(UIProvider.AccountColumns.SettingsColumns.HIDE_CHECKBOXES,
- prefs.getHideCheckboxes() ? "1" : "0");
- int autoAdvance = prefs.getAutoAdvanceDirection();
- values.put(UIProvider.AccountColumns.SettingsColumns.AUTO_ADVANCE,
- autoAdvanceToUiValue(autoAdvance));
- int textZoom = prefs.getTextZoom();
- values.put(UIProvider.AccountColumns.SettingsColumns.MESSAGE_TEXT_SIZE,
- textZoomToUiValue(textZoom));
- // Set default inbox, if we've got an inbox; otherwise, say initial sync needed
- long mailboxId = Mailbox.findMailboxOfType(getContext(), accountId, Mailbox.TYPE_INBOX);
- if (mailboxId != Mailbox.NO_MAILBOX) {
- values.put(UIProvider.AccountColumns.SettingsColumns.DEFAULT_INBOX,
- uiUriString("uifolder", mailboxId));
- values.put(UIProvider.AccountColumns.SYNC_STATUS, UIProvider.SyncStatus.NO_SYNC);
- } else {
- values.put(UIProvider.AccountColumns.SYNC_STATUS,
- UIProvider.SyncStatus.INITIAL_SYNC_NEEDED);
- }
-
- StringBuilder sb = genSelect(sAccountListMap, uiProjection, values);
- sb.append(" FROM " + Account.TABLE_NAME + " WHERE " + AccountColumns.ID + "=?");
- return sb.toString();
- }
-
- private int autoAdvanceToUiValue(int autoAdvance) {
- switch(autoAdvance) {
- case Preferences.AUTO_ADVANCE_OLDER:
- return UIProvider.AutoAdvance.OLDER;
- case Preferences.AUTO_ADVANCE_NEWER:
- return UIProvider.AutoAdvance.NEWER;
- case Preferences.AUTO_ADVANCE_MESSAGE_LIST:
- default:
- return UIProvider.AutoAdvance.LIST;
- }
- }
-
- private int textZoomToUiValue(int textZoom) {
- switch(textZoom) {
- case Preferences.TEXT_ZOOM_HUGE:
- return UIProvider.MessageTextSize.HUGE;
- case Preferences.TEXT_ZOOM_LARGE:
- return UIProvider.MessageTextSize.LARGE;
- case Preferences.TEXT_ZOOM_NORMAL:
- return UIProvider.MessageTextSize.NORMAL;
- case Preferences.TEXT_ZOOM_SMALL:
- return UIProvider.MessageTextSize.SMALL;
- case Preferences.TEXT_ZOOM_TINY:
- return UIProvider.MessageTextSize.TINY;
- default:
- return UIProvider.MessageTextSize.NORMAL;
- }
- }
-
- /**
- * Generate a Uri string for a combined mailbox uri
- * @param type the uri command type (e.g. "uimessages")
- * @param id the id of the item (e.g. an account, mailbox, or message id)
- * @return a Uri string
- */
- private static String combinedUriString(String type, String id) {
- return "content://" + EmailContent.AUTHORITY + "/" + type + "/" + id;
- }
-
- private static final long COMBINED_ACCOUNT_ID = 0x10000000;
-
- /**
- * Generate an id for a combined mailbox of a given type
- * @param type the mailbox type for the combined mailbox
- * @return the id, as a String
- */
- private static String combinedMailboxId(int type) {
- return Long.toString(Account.ACCOUNT_ID_COMBINED_VIEW + type);
- }
-
- private static String getVirtualMailboxIdString(long accountId, int type) {
- return Long.toString(getVirtualMailboxId(accountId, type));
- }
-
- private static long getVirtualMailboxId(long accountId, int type) {
- return (accountId << 32) + type;
- }
-
- private static boolean isVirtualMailbox(long mailboxId) {
- return mailboxId >= 0x100000000L;
- }
-
- private static boolean isCombinedMailbox(long mailboxId) {
- return (mailboxId >> 32) == COMBINED_ACCOUNT_ID;
- }
-
- private static long getVirtualMailboxAccountId(long mailboxId) {
- return mailboxId >> 32;
- }
-
- private static String getVirtualMailboxAccountIdString(long mailboxId) {
- return Long.toString(mailboxId >> 32);
- }
-
- private static int getVirtualMailboxType(long mailboxId) {
- return (int)(mailboxId & 0xF);
- }
-
- private void addCombinedAccountRow(MatrixCursor mc) {
- long id = Account.getDefaultAccountId(getContext());
- if (id == Account.NO_ACCOUNT) return;
- String idString = Long.toString(id);
- Object[] values = new Object[UIProvider.ACCOUNTS_PROJECTION.length];
- values[UIProvider.ACCOUNT_ID_COLUMN] = 0;
- values[UIProvider.ACCOUNT_CAPABILITIES_COLUMN] =
- AccountCapabilities.UNDO | AccountCapabilities.SENDING_UNAVAILABLE;
- values[UIProvider.ACCOUNT_FOLDER_LIST_URI_COLUMN] =
- combinedUriString("uifolders", COMBINED_ACCOUNT_ID_STRING);
- values[UIProvider.ACCOUNT_NAME_COLUMN] = getContext().getString(
- R.string.mailbox_list_account_selector_combined_view);
- values[UIProvider.ACCOUNT_SAVE_DRAFT_URI_COLUMN] =
- combinedUriString("uisavedraft", idString);
- values[UIProvider.ACCOUNT_SEND_MESSAGE_URI_COLUMN] =
- combinedUriString("uisendmail", idString);
- values[UIProvider.ACCOUNT_UNDO_URI_COLUMN] =
- "'content://" + UIProvider.AUTHORITY + "/uiundo'";
- values[UIProvider.ACCOUNT_URI_COLUMN] =
- combinedUriString("uiaccount", COMBINED_ACCOUNT_ID_STRING);
- values[UIProvider.ACCOUNT_MIME_TYPE_COLUMN] = EMAIL_APP_MIME_TYPE;
- values[UIProvider.ACCOUNT_SETTINGS_INTENT_URI_COLUMN] =
- getExternalUriString("settings", COMBINED_ACCOUNT_ID_STRING);
- values[UIProvider.ACCOUNT_COMPOSE_INTENT_URI_COLUMN] =
- getExternalUriStringEmail2("compose", Long.toString(id));
-
- // TODO: Get these from default account?
- Preferences prefs = Preferences.getPreferences(getContext());
- values[UIProvider.ACCOUNT_SETTINGS_AUTO_ADVANCE_COLUMN] =
- Integer.toString(UIProvider.AutoAdvance.NEWER);
- values[UIProvider.ACCOUNT_SETTINGS_MESSAGE_TEXT_SIZE_COLUMN] =
- Integer.toString(UIProvider.MessageTextSize.NORMAL);
- values[UIProvider.ACCOUNT_SETTINGS_SNAP_HEADERS_COLUMN] =
- Integer.toString(UIProvider.SnapHeaderValue.ALWAYS);
- //.add(UIProvider.SettingsColumns.SIGNATURE, AccountColumns.SIGNATURE)
- values[UIProvider.ACCOUNT_SETTINGS_REPLY_BEHAVIOR_COLUMN] =
- Integer.toString(UIProvider.DefaultReplyBehavior.REPLY);
- values[UIProvider.ACCOUNT_SETTINGS_HIDE_CHECKBOXES_COLUMN] = 0;
- values[UIProvider.ACCOUNT_SETTINGS_CONFIRM_DELETE_COLUMN] =
- prefs.getConfirmDelete() ? 1 : 0;
- values[UIProvider.ACCOUNT_SETTINGS_CONFIRM_ARCHIVE_COLUMN] = 0;
- values[UIProvider.ACCOUNT_SETTINGS_CONFIRM_SEND_COLUMN] = prefs.getConfirmSend() ? 1 : 0;
- values[UIProvider.ACCOUNT_SETTINGS_HIDE_CHECKBOXES_COLUMN] =
- prefs.getHideCheckboxes() ? 1 : 0;
- values[UIProvider.ACCOUNT_SETTINGS_DEFAULT_INBOX_COLUMN] = combinedUriString("uifolder",
- combinedMailboxId(Mailbox.TYPE_INBOX));
-
- mc.addRow(values);
- }
-
- private Cursor getVirtualMailboxCursor(long mailboxId) {
- MatrixCursor mc = new MatrixCursor(UIProvider.FOLDERS_PROJECTION, 1);
- mc.addRow(getVirtualMailboxRow(getVirtualMailboxAccountId(mailboxId),
- getVirtualMailboxType(mailboxId)));
- return mc;
- }
-
- private Object[] getVirtualMailboxRow(long accountId, int mailboxType) {
- String idString = getVirtualMailboxIdString(accountId, mailboxType);
- Object[] values = new Object[UIProvider.FOLDERS_PROJECTION.length];
- values[UIProvider.FOLDER_ID_COLUMN] = 0;
- values[UIProvider.FOLDER_URI_COLUMN] = combinedUriString("uifolder", idString);
- values[UIProvider.FOLDER_NAME_COLUMN] = getMailboxNameForType(mailboxType);
- values[UIProvider.FOLDER_HAS_CHILDREN_COLUMN] = 0;
- values[UIProvider.FOLDER_CAPABILITIES_COLUMN] = UIProvider.FolderCapabilities.IS_VIRTUAL;
- values[UIProvider.FOLDER_CONVERSATION_LIST_URI_COLUMN] = combinedUriString("uimessages",
- idString);
- values[UIProvider.FOLDER_ID_COLUMN] = 0;
- return values;
- }
-
- private Cursor uiAccounts(String[] uiProjection) {
- Context context = getContext();
- SQLiteDatabase db = getDatabase(context);
- Cursor accountIdCursor =
- db.rawQuery("select _id from " + Account.TABLE_NAME, new String[0]);
- int numAccounts = accountIdCursor.getCount();
- boolean combinedAccount = false;
- if (numAccounts > 1) {
- combinedAccount = true;
- numAccounts++;
- }
- final Bundle extras = new Bundle();
- // Email always returns the accurate number of accounts
- extras.putInt(AccountCursorExtraKeys.ACCOUNTS_LOADED, 1);
- final MatrixCursor mc =
- new MatrixCursorWithExtra(uiProjection, accountIdCursor.getCount(), extras);
- Object[] values = new Object[uiProjection.length];
- try {
- if (combinedAccount) {
- addCombinedAccountRow(mc);
- }
- while (accountIdCursor.moveToNext()) {
- String id = accountIdCursor.getString(0);
- Cursor accountCursor =
- db.rawQuery(genQueryAccount(uiProjection, id), new String[] {id});
- if (accountCursor.moveToNext()) {
- for (int i = 0; i < uiProjection.length; i++) {
- values[i] = accountCursor.getString(i);
- }
- mc.addRow(values);
- }
- accountCursor.close();
- }
- } finally {
- accountIdCursor.close();
- }
- mc.setNotificationUri(context.getContentResolver(), UIPROVIDER_ACCOUNTS_NOTIFIER);
- return mc;
- }
-
- /**
- * Generate the "attachment list" SQLite query, given a projection from UnifiedEmail
- *
- * @param uiProjection as passed from UnifiedEmail
- * @return the SQLite query to be executed on the EmailProvider database
- */
- private String genQueryAttachments(String[] uiProjection) {
- StringBuilder sb = genSelect(sAttachmentMap, uiProjection);
- sb.append(" FROM " + Attachment.TABLE_NAME + " WHERE " + AttachmentColumns.MESSAGE_KEY +
- " =? ");
- return sb.toString();
- }
-
- /**
- * Generate the "single attachment" SQLite query, given a projection from UnifiedEmail
- *
- * @param uiProjection as passed from UnifiedEmail
- * @return the SQLite query to be executed on the EmailProvider database
- */
- private String genQueryAttachment(String[] uiProjection) {
- StringBuilder sb = genSelect(sAttachmentMap, uiProjection);
- sb.append(" FROM " + Attachment.TABLE_NAME + " WHERE " + AttachmentColumns.ID + " =? ");
- return sb.toString();
- }
-
- /**
- * Generate the "subfolder list" SQLite query, given a projection from UnifiedEmail
- *
- * @param uiProjection as passed from UnifiedEmail
- * @return the SQLite query to be executed on the EmailProvider database
- */
- private String genQuerySubfolders(String[] uiProjection) {
- StringBuilder sb = genSelect(sFolderListMap, uiProjection);
- sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.PARENT_KEY +
- " =? ORDER BY ");
- sb.append(MAILBOX_ORDER_BY);
- return sb.toString();
- }
-
- private static final String COMBINED_ACCOUNT_ID_STRING = Long.toString(COMBINED_ACCOUNT_ID);
-
- /**
- * Returns a cursor over all the folders for a specific URI which corresponds to a single
- * account.
- * @param uri
- * @param uiProjection
- * @return
- */
- private Cursor uiFolders(Uri uri, String[] uiProjection) {
- Context context = getContext();
- SQLiteDatabase db = getDatabase(context);
- String id = uri.getPathSegments().get(1);
- if (id.equals(COMBINED_ACCOUNT_ID_STRING)) {
- MatrixCursor mc = new MatrixCursor(UIProvider.FOLDERS_PROJECTION, 2);
- Object[] row = getVirtualMailboxRow(COMBINED_ACCOUNT_ID, Mailbox.TYPE_INBOX);
- int numUnread = EmailContent.count(context, Message.CONTENT_URI,
- MessageColumns.MAILBOX_KEY + " IN (SELECT " + MailboxColumns.ID +
- " FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.TYPE +
- "=" + Mailbox.TYPE_INBOX + ") AND " + MessageColumns.FLAG_READ + "=0", null);
- row[UIProvider.FOLDER_UNREAD_COUNT_COLUMN] = numUnread;
- mc.addRow(row);
- int numStarred = EmailContent.count(context, Message.CONTENT_URI,
- MessageColumns.FLAG_FAVORITE + "=1", null);
- if (numStarred > 0) {
- row = getVirtualMailboxRow(COMBINED_ACCOUNT_ID, Mailbox.TYPE_STARRED);
- row[UIProvider.FOLDER_UNREAD_COUNT_COLUMN] = numStarred;
- mc.addRow(row);
- }
- return mc;
- } else {
- Cursor c = db.rawQuery(genQueryAccountMailboxes(uiProjection), new String[] {id});
- int numStarred = EmailContent.count(context, Message.CONTENT_URI,
- MessageColumns.ACCOUNT_KEY + "=? AND " + MessageColumns.FLAG_FAVORITE + "=1",
- new String[] {id});
- if (numStarred == 0) {
- return c;
- } else {
- // Add starred virtual folder to the cursor
- // Show number of messages as unread count (for backward compatibility)
- MatrixCursor starCursor = new MatrixCursor(uiProjection, 1);
- Object[] row = getVirtualMailboxRow(Long.parseLong(id), Mailbox.TYPE_STARRED);
- row[UIProvider.FOLDER_UNREAD_COUNT_COLUMN] = numStarred;
- row[UIProvider.FOLDER_ICON_RES_ID_COLUMN] = R.drawable.ic_menu_star_holo_light;
- starCursor.addRow(row);
- Cursor[] cursors = new Cursor[] {starCursor, c};
- return new MergeCursor(cursors);
- }
- }
- }
-
- /**
- * Returns an array of the default recent folders for a given URI which is unique for an
- * account. Some accounts might not have default recent folders, in which case an empty array
- * is returned.
- * @param id
- * @return
- */
- private Uri[] defaultRecentFolders(final String id) {
- final SQLiteDatabase db = getDatabase(getContext());
- if (id.equals(COMBINED_ACCOUNT_ID_STRING)) {
- // We don't have default recents for the combined view.
- return new Uri[0];
- }
- // We search for the types we want, and find corresponding IDs.
- final String[] idAndType = { BaseColumns._ID, UIProvider.FolderColumns.TYPE };
-
- // Sent, Drafts, and Starred are the default recents.
- final StringBuilder sb = genSelect(sFolderListMap, idAndType);
- sb.append(" FROM " + Mailbox.TABLE_NAME
- + " WHERE " + MailboxColumns.ACCOUNT_KEY + " = " + id
- + " AND "
- + MailboxColumns.TYPE + " IN (" + Mailbox.TYPE_SENT +
- ", " + Mailbox.TYPE_DRAFTS +
- ", " + Mailbox.TYPE_STARRED
- + ")");
- LogUtils.d(TAG, "defaultRecentFolders: Query is %s", sb);
- final Cursor c = db.rawQuery(sb.toString(), null);
- if (c == null || c.getCount() <= 0 || !c.moveToFirst()) {
- return new Uri[0];
- }
- // Read all the IDs of the mailboxes, and turn them into URIs.
- final Uri[] recentFolders = new Uri[c.getCount()];
- int i = 0;
- do {
- final long folderId = c.getLong(0);
- recentFolders[i] = uiUri("uifolder", folderId);
- LogUtils.d(TAG, "Default recent folder: %d, with uri %s", folderId, recentFolders[i]);
- ++i;
- } while (c.moveToNext());
- return recentFolders;
- }
-
- /**
- * Wrapper that handles the visibility feature (i.e. the conversation list is visible, so
- * any pending notifications for the corresponding mailbox should be canceled)
- */
- static class VisibilityCursor extends CursorWrapper {
- private final long mMailboxId;
- private final Context mContext;
-
- public VisibilityCursor(Context context, Cursor cursor, long mailboxId) {
- super(cursor);
- mMailboxId = mailboxId;
- mContext = context;
- }
-
- @Override
- public Bundle respond(Bundle params) {
- final String setVisibilityKey =
- UIProvider.ConversationCursorCommand.COMMAND_KEY_SET_VISIBILITY;
- if (params.containsKey(setVisibilityKey)) {
- final boolean visible = params.getBoolean(setVisibilityKey);
- if (visible) {
- NotificationController.getInstance(mContext).cancelNewMessageNotification(
- mMailboxId);
- }
- }
- // Return success
- Bundle response = new Bundle();
- response.putString(setVisibilityKey,
- UIProvider.ConversationCursorCommand.COMMAND_RESPONSE_OK);
- return response;
- }
- }
-
- /**
- * Handle UnifiedEmail queries here (dispatched from query())
- *
- * @param match the UriMatcher match for the original uri passed in from UnifiedEmail
- * @param uri the original uri passed in from UnifiedEmail
- * @param uiProjection the projection passed in from UnifiedEmail
- * @return the result Cursor
- */
- private Cursor uiQuery(int match, Uri uri, String[] uiProjection) {
- Context context = getContext();
- ContentResolver resolver = context.getContentResolver();
- SQLiteDatabase db = getDatabase(context);
- // Should we ever return null, or throw an exception??
- Cursor c = null;
- String id = uri.getPathSegments().get(1);
- Uri notifyUri = null;
- switch(match) {
- case UI_ALL_FOLDERS:
- c = db.rawQuery(genQueryAccountAllMailboxes(uiProjection), new String[] {id});
- break;
- case UI_RECENT_FOLDERS:
- c = db.rawQuery(genQueryRecentMailboxes(uiProjection), new String[] {id});
- notifyUri = UIPROVIDER_RECENT_FOLDERS_NOTIFIER.buildUpon().appendPath(id).build();
- break;
- case UI_SUBFOLDERS:
- c = db.rawQuery(genQuerySubfolders(uiProjection), new String[] {id});
- break;
- case UI_MESSAGES:
- long mailboxId = Long.parseLong(id);
- if (isVirtualMailbox(mailboxId)) {
- c = getVirtualMailboxMessagesCursor(db, uiProjection, mailboxId);
- } else {
- c = db.rawQuery(genQueryMailboxMessages(uiProjection), new String[] {id});
- }
- notifyUri = UIPROVIDER_CONVERSATION_NOTIFIER.buildUpon().appendPath(id).build();
- c = new VisibilityCursor(context, c, mailboxId);
- break;
- case UI_MESSAGE:
- c = db.rawQuery(genQueryViewMessage(uiProjection, id), new String[] {id});
- break;
- case UI_ATTACHMENTS:
- c = db.rawQuery(genQueryAttachments(uiProjection), new String[] {id});
- notifyUri = UIPROVIDER_ATTACHMENTS_NOTIFIER.buildUpon().appendPath(id).build();
- break;
- case UI_ATTACHMENT:
- c = db.rawQuery(genQueryAttachment(uiProjection), new String[] {id});
- notifyUri = UIPROVIDER_ATTACHMENT_NOTIFIER.buildUpon().appendPath(id).build();
- break;
- case UI_FOLDER:
- mailboxId = Long.parseLong(id);
- if (isVirtualMailbox(mailboxId)) {
- c = getVirtualMailboxCursor(mailboxId);
- } else {
- c = db.rawQuery(genQueryMailbox(uiProjection, id), new String[] {id});
- notifyUri = UIPROVIDER_FOLDER_NOTIFIER.buildUpon().appendPath(id).build();
- }
- break;
- case UI_ACCOUNT:
- if (id.equals(COMBINED_ACCOUNT_ID_STRING)) {
- MatrixCursor mc = new MatrixCursor(UIProvider.ACCOUNTS_PROJECTION, 1);
- addCombinedAccountRow(mc);
- c = mc;
- } else {
- c = db.rawQuery(genQueryAccount(uiProjection, id), new String[] {id});
- }
- notifyUri = UIPROVIDER_ACCOUNT_NOTIFIER.buildUpon().appendPath(id).build();
- break;
- case UI_CONVERSATION:
- c = db.rawQuery(genQueryConversation(uiProjection), new String[] {id});
- break;
- }
- if (notifyUri != null) {
- c.setNotificationUri(resolver, notifyUri);
- }
- return c;
- }
-
- /**
- * Convert a UIProvider attachment to an EmailProvider attachment (for sending); we only need
- * a few of the fields
- * @param uiAtt the UIProvider attachment to convert
- * @return the EmailProvider attachment
- */
- private Attachment convertUiAttachmentToAttachment(
- com.android.mail.providers.Attachment uiAtt) {
- Attachment att = new Attachment();
- att.mContentUri = uiAtt.contentUri.toString();
- att.mFileName = uiAtt.name;
- att.mMimeType = uiAtt.contentType;
- att.mSize = uiAtt.size;
- return att;
- }
-
- private String getMailboxNameForType(int mailboxType) {
- Context context = getContext();
- int resId;
- switch (mailboxType) {
- case Mailbox.TYPE_INBOX:
- resId = R.string.mailbox_name_server_inbox;
- break;
- case Mailbox.TYPE_OUTBOX:
- resId = R.string.mailbox_name_server_outbox;
- break;
- case Mailbox.TYPE_DRAFTS:
- resId = R.string.mailbox_name_server_drafts;
- break;
- case Mailbox.TYPE_TRASH:
- resId = R.string.mailbox_name_server_trash;
- break;
- case Mailbox.TYPE_SENT:
- resId = R.string.mailbox_name_server_sent;
- break;
- case Mailbox.TYPE_JUNK:
- resId = R.string.mailbox_name_server_junk;
- break;
- case Mailbox.TYPE_STARRED:
- resId = R.string.widget_starred;
- break;
- default:
- throw new IllegalArgumentException("Illegal mailbox type");
- }
- return context.getString(resId);
- }
-
- /**
- * Create a mailbox given the account and mailboxType.
- */
- private Mailbox createMailbox(long accountId, int mailboxType) {
- Context context = getContext();
- Mailbox box = Mailbox.newSystemMailbox(accountId, mailboxType,
- getMailboxNameForType(mailboxType));
- // Make sure drafts and save will show up in recents...
- // If these already exist (from old Email app), they will have touch times
- switch (mailboxType) {
- case Mailbox.TYPE_DRAFTS:
- box.mLastTouchedTime = Mailbox.DRAFTS_DEFAULT_TOUCH_TIME;
- break;
- case Mailbox.TYPE_SENT:
- box.mLastTouchedTime = Mailbox.SENT_DEFAULT_TOUCH_TIME;
- break;
- }
- box.save(context);
- return box;
- }
-
- /**
- * Given an account name and a mailbox type, return that mailbox, creating it if necessary
- * @param accountName the account name to use
- * @param mailboxType the type of mailbox we're trying to find
- * @return the mailbox of the given type for the account in the uri, or null if not found
- */
- private Mailbox getMailboxByAccountIdAndType(String accountId, int mailboxType) {
- long id = Long.parseLong(accountId);
- Mailbox mailbox = Mailbox.restoreMailboxOfType(getContext(), id, mailboxType);
- if (mailbox == null) {
- mailbox = createMailbox(id, mailboxType);
- }
- return mailbox;
- }
-
- private Message getMessageFromPathSegments(List<String> pathSegments) {
- Message msg = null;
- if (pathSegments.size() > 2) {
- msg = Message.restoreMessageWithId(getContext(), Long.parseLong(pathSegments.get(2)));
- }
- if (msg == null) {
- msg = new Message();
- }
- return msg;
- }
- /**
- * Given a mailbox and the content values for a message, create/save the message in the mailbox
- * @param mailbox the mailbox to use
- * @param values the content values that represent message fields
- * @return the uri of the newly created message
- */
- private Uri uiSaveMessage(Message msg, Mailbox mailbox, ContentValues values) {
- Context context = getContext();
- // Fill in the message
- Account account = Account.restoreAccountWithId(context, mailbox.mAccountKey);
- if (account == null) return null;
- msg.mFrom = account.mEmailAddress;
- msg.mTimeStamp = System.currentTimeMillis();
- msg.mTo = values.getAsString(UIProvider.MessageColumns.TO);
- msg.mCc = values.getAsString(UIProvider.MessageColumns.CC);
- msg.mBcc = values.getAsString(UIProvider.MessageColumns.BCC);
- msg.mSubject = values.getAsString(UIProvider.MessageColumns.SUBJECT);
- msg.mText = values.getAsString(UIProvider.MessageColumns.BODY_TEXT);
- msg.mHtml = values.getAsString(UIProvider.MessageColumns.BODY_HTML);
- msg.mMailboxKey = mailbox.mId;
- msg.mAccountKey = mailbox.mAccountKey;
- msg.mDisplayName = msg.mTo;
- msg.mFlagLoaded = Message.FLAG_LOADED_COMPLETE;
- msg.mFlagRead = true;
- Integer quoteStartPos = values.getAsInteger(UIProvider.MessageColumns.QUOTE_START_POS);
- msg.mQuotedTextStartPos = quoteStartPos == null ? 0 : quoteStartPos;
- int flags = 0;
- int draftType = values.getAsInteger(UIProvider.MessageColumns.DRAFT_TYPE);
- switch(draftType) {
- case DraftType.FORWARD:
- flags |= Message.FLAG_TYPE_FORWARD;
- break;
- case DraftType.REPLY_ALL:
- flags |= Message.FLAG_TYPE_REPLY_ALL;
- // Fall through
- case DraftType.REPLY:
- flags |= Message.FLAG_TYPE_REPLY;
- break;
- case DraftType.COMPOSE:
- flags |= Message.FLAG_TYPE_ORIGINAL;
- break;
- }
- msg.mFlags = flags;
- int draftInfo = 0;
- if (values.containsKey(UIProvider.MessageColumns.QUOTE_START_POS)) {
- draftInfo = values.getAsInteger(UIProvider.MessageColumns.QUOTE_START_POS);
- if (values.getAsInteger(UIProvider.MessageColumns.APPEND_REF_MESSAGE_CONTENT) != 0) {
- draftInfo |= Message.DRAFT_INFO_APPEND_REF_MESSAGE;
- }
- }
- msg.mDraftInfo = draftInfo;
- String ref = values.getAsString(UIProvider.MessageColumns.REF_MESSAGE_ID);
- if (ref != null && msg.mQuotedTextStartPos > 0) {
- String refId = Uri.parse(ref).getLastPathSegment();
- try {
- long sourceKey = Long.parseLong(refId);
- msg.mSourceKey = sourceKey;
- } catch (NumberFormatException e) {
- // This will be zero; the default
- }
- }
-
- // Get attachments from the ContentValues
- List<com.android.mail.providers.Attachment> uiAtts =
- com.android.mail.providers.Attachment.fromJSONArray(
- values.getAsString(UIProvider.MessageColumns.JOINED_ATTACHMENT_INFOS));
- ArrayList<Attachment> atts = new ArrayList<Attachment>();
- boolean hasUnloadedAttachments = false;
- for (com.android.mail.providers.Attachment uiAtt: uiAtts) {
- Uri attUri = uiAtt.uri;
- if (attUri != null && attUri.getAuthority().equals(EmailContent.AUTHORITY)) {
- // If it's one of ours, retrieve the attachment and add it to the list
- long attId = Long.parseLong(attUri.getLastPathSegment());
- Attachment att = Attachment.restoreAttachmentWithId(context, attId);
- if (att != null) {
- // We must clone the attachment into a new one for this message; easiest to
- // use a parcel here
- Parcel p = Parcel.obtain();
- att.writeToParcel(p, 0);
- p.setDataPosition(0);
- Attachment attClone = new Attachment(p);
- p.recycle();
- // Clear the messageKey (this is going to be a new attachment)
- attClone.mMessageKey = 0;
- // If we're sending this, it's not loaded, and we're not smart forwarding
- // add the download flag, so that ADS will start up
- if (mailbox.mType == Mailbox.TYPE_OUTBOX && att.mContentUri == null &&
- ((account.mFlags & Account.FLAGS_SUPPORTS_SMART_FORWARD) == 0)) {
- attClone.mFlags |= Attachment.FLAG_DOWNLOAD_FORWARD;
- hasUnloadedAttachments = true;
- }
- atts.add(attClone);
- }
- } else {
- // Convert external attachment to one of ours and add to the list
- atts.add(convertUiAttachmentToAttachment(uiAtt));
- }
- }
- if (!atts.isEmpty()) {
- msg.mAttachments = atts;
- msg.mFlagAttachment = true;
- if (hasUnloadedAttachments) {
- Utility.showToast(context, R.string.message_view_attachment_background_load);
- }
- }
- // Save it or update it...
- if (!msg.isSaved()) {
- msg.save(context);
- } else {
- // This is tricky due to how messages/attachments are saved; rather than putz with
- // what's changed, we'll delete/re-add them
- ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
- // Delete all existing attachments
- ops.add(ContentProviderOperation.newDelete(
- ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, msg.mId))
- .build());
- // Delete the body
- ops.add(ContentProviderOperation.newDelete(Body.CONTENT_URI)
- .withSelection(Body.MESSAGE_KEY + "=?", new String[] {Long.toString(msg.mId)})
- .build());
- // Add the ops for the message, atts, and body
- msg.addSaveOps(ops);
- // Do it!
- try {
- applyBatch(ops);
- } catch (OperationApplicationException e) {
- }
- }
- if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
- EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(context,
- mServiceCallback, mailbox.mAccountKey);
- try {
- service.startSync(mailbox.mId, true);
- } catch (RemoteException e) {
- }
- long originalMsgId = msg.mSourceKey;
- if (originalMsgId != 0) {
- Message originalMsg = Message.restoreMessageWithId(context, originalMsgId);
- // If the original message exists, set its forwarded/replied to flags
- if (originalMsg != null) {
- ContentValues cv = new ContentValues();
- flags = originalMsg.mFlags;
- switch(draftType) {
- case DraftType.FORWARD:
- flags |= Message.FLAG_FORWARDED;
- break;
- case DraftType.REPLY_ALL:
- case DraftType.REPLY:
- flags |= Message.FLAG_REPLIED_TO;
- break;
- }
- cv.put(Message.FLAGS, flags);
- context.getContentResolver().update(ContentUris.withAppendedId(
- Message.CONTENT_URI, originalMsgId), cv, null, null);
- }
- }
- }
- return uiUri("uimessage", msg.mId);
- }
-
- /**
- * Create and send the message via the account indicated in the uri
- * @param uri the incoming uri
- * @param values the content values that represent message fields
- * @return the uri of the created message
- */
- private Uri uiSendMail(Uri uri, ContentValues values) {
- List<String> pathSegments = uri.getPathSegments();
- Mailbox mailbox = getMailboxByAccountIdAndType(pathSegments.get(1), Mailbox.TYPE_OUTBOX);
- if (mailbox == null) return null;
- Message msg = getMessageFromPathSegments(pathSegments);
- try {
- return uiSaveMessage(msg, mailbox, values);
- } finally {
- // Kick observers
- getContext().getContentResolver().notifyChange(Mailbox.CONTENT_URI, null);
- }
- }
-
- /**
- * Create a message and save it to the drafts folder of the account indicated in the uri
- * @param uri the incoming uri
- * @param values the content values that represent message fields
- * @return the uri of the created message
- */
- private Uri uiSaveDraft(Uri uri, ContentValues values) {
- List<String> pathSegments = uri.getPathSegments();
- Mailbox mailbox = getMailboxByAccountIdAndType(pathSegments.get(1), Mailbox.TYPE_DRAFTS);
- if (mailbox == null) return null;
- Message msg = getMessageFromPathSegments(pathSegments);
- return uiSaveMessage(msg, mailbox, values);
- }
-
- private int uiUpdateDraft(Uri uri, ContentValues values) {
- Context context = getContext();
- Message msg = Message.restoreMessageWithId(context,
- Long.parseLong(uri.getPathSegments().get(1)));
- if (msg == null) return 0;
- Mailbox mailbox = Mailbox.restoreMailboxWithId(context, msg.mMailboxKey);
- if (mailbox == null) return 0;
- uiSaveMessage(msg, mailbox, values);
- return 1;
- }
-
- private int uiSendDraft(Uri uri, ContentValues values) {
- Context context = getContext();
- Message msg = Message.restoreMessageWithId(context,
- Long.parseLong(uri.getPathSegments().get(1)));
- if (msg == null) return 0;
- long mailboxId = Mailbox.findMailboxOfType(context, msg.mAccountKey, Mailbox.TYPE_OUTBOX);
- if (mailboxId == Mailbox.NO_MAILBOX) return 0;
- Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
- if (mailbox == null) return 0;
- uiSaveMessage(msg, mailbox, values);
- // Kick observers
- context.getContentResolver().notifyChange(Mailbox.CONTENT_URI, null);
- return 1;
- }
-
- private void putIntegerLongOrBoolean(ContentValues values, String columnName, Object value) {
- if (value instanceof Integer) {
- Integer intValue = (Integer)value;
- values.put(columnName, intValue);
- } else if (value instanceof Boolean) {
- Boolean boolValue = (Boolean)value;
- values.put(columnName, boolValue ? 1 : 0);
- } else if (value instanceof Long) {
- Long longValue = (Long)value;
- values.put(columnName, longValue);
- }
- }
-
- /**
- * Update the timestamps for the folders specified and notifies on the recent folder URI.
- * @param folders
- * @return number of folders updated
- */
- private int updateTimestamp(final Context context, String id, Uri[] folders){
- int updated = 0;
- final long now = System.currentTimeMillis();
- final ContentResolver resolver = context.getContentResolver();
- final ContentValues touchValues = new ContentValues();
- for (int i=0, size=folders.length; i < size; ++i) {
- touchValues.put(MailboxColumns.LAST_TOUCHED_TIME, now);
- LogUtils.d(TAG, "updateStamp: %s updated", folders[i]);
- updated += resolver.update(folders[i], touchValues, null, null);
- }
- final Uri toNotify =
- UIPROVIDER_RECENT_FOLDERS_NOTIFIER.buildUpon().appendPath(id).build();
- LogUtils.d(TAG, "updateTimestamp: Notifying on %s", toNotify);
- resolver.notifyChange(toNotify, null);
- return updated;
- }
-
- /**
- * Updates the recent folders. The values to be updated are specified as ContentValues pairs
- * of (Folder URI, access timestamp). Returns nonzero if successful, always.
- * @param uri
- * @param values
- * @return nonzero value always.
- */
- private int uiUpdateRecentFolders(Uri uri, ContentValues values) {
- final int numFolders = values.size();
- final String id = uri.getPathSegments().get(1);
- final Uri[] folders = new Uri[numFolders];
- final Context context = getContext();
- final NotificationController controller = NotificationController.getInstance(context);
- int i = 0;
- for (final String uriString: values.keySet()) {
- folders[i] = Uri.parse(uriString);
- try {
- final String mailboxIdString = folders[i].getLastPathSegment();
- final long mailboxId = Long.parseLong(mailboxIdString);
- controller.cancelNewMessageNotification(mailboxId);
- } catch (NumberFormatException e) {
- // Keep on going...
- }
- }
- return updateTimestamp(context, id, folders);
- }
-
- /**
- * Populates the recent folders according to the design.
- * @param uri
- * @return the number of recent folders were populated.
- */
- private int uiPopulateRecentFolders(Uri uri) {
- final Context context = getContext();
- final String id = uri.getLastPathSegment();
- final Uri[] recentFolders = defaultRecentFolders(id);
- final int numFolders = recentFolders.length;
- if (numFolders <= 0) {
- return 0;
- }
- final int rowsUpdated = updateTimestamp(context, id, recentFolders);
- LogUtils.d(TAG, "uiPopulateRecentFolders: %d folders changed", rowsUpdated);
- return rowsUpdated;
- }
-
- private int uiUpdateAttachment(Uri uri, ContentValues uiValues) {
- Integer stateValue = uiValues.getAsInteger(UIProvider.AttachmentColumns.STATE);
- if (stateValue != null) {
- // This is a command from UIProvider
- long attachmentId = Long.parseLong(uri.getLastPathSegment());
- Context context = getContext();
- Attachment attachment =
- Attachment.restoreAttachmentWithId(context, attachmentId);
- if (attachment == null) {
- // Went away; ah, well...
- return 0;
- }
- ContentValues values = new ContentValues();
- switch (stateValue.intValue()) {
- case UIProvider.AttachmentState.NOT_SAVED:
- // Set state, try to cancel request
- values.put(AttachmentColumns.UI_STATE, stateValue);
- values.put(AttachmentColumns.FLAGS,
- attachment.mFlags &= ~Attachment.FLAG_DOWNLOAD_USER_REQUEST);
- attachment.update(context, values);
- return 1;
- case UIProvider.AttachmentState.DOWNLOADING:
- // Set state and destination; request download
- values.put(AttachmentColumns.UI_STATE, stateValue);
- Integer destinationValue =
- uiValues.getAsInteger(UIProvider.AttachmentColumns.DESTINATION);
- values.put(AttachmentColumns.UI_DESTINATION,
- destinationValue == null ? 0 : destinationValue);
- values.put(AttachmentColumns.FLAGS,
- attachment.mFlags | Attachment.FLAG_DOWNLOAD_USER_REQUEST);
- attachment.update(context, values);
- return 1;
- case UIProvider.AttachmentState.SAVED:
- // If this is an inline attachment, notify message has changed
- if (!TextUtils.isEmpty(attachment.mContentId)) {
- notifyUI(UIPROVIDER_MESSAGE_NOTIFIER, attachment.mMessageKey);
- }
- return 1;
- }
- }
- return 0;
- }
-
- private int uiUpdateFolder(Uri uri, ContentValues uiValues) {
- Uri ourUri = convertToEmailProviderUri(uri, Mailbox.CONTENT_URI, true);
- if (ourUri == null) return 0;
- ContentValues ourValues = new ContentValues();
- // This should only be called via update to "recent folders"
- for (String columnName: uiValues.keySet()) {
- if (columnName.equals(MailboxColumns.LAST_TOUCHED_TIME)) {
- ourValues.put(MailboxColumns.LAST_TOUCHED_TIME, uiValues.getAsLong(columnName));
- }
- }
- return update(ourUri, ourValues, null, null);
- }
-
- private ContentValues convertUiMessageValues(Message message, ContentValues values) {
- ContentValues ourValues = new ContentValues();
- for (String columnName: values.keySet()) {
- Object val = values.get(columnName);
- if (columnName.equals(UIProvider.ConversationColumns.STARRED)) {
- putIntegerLongOrBoolean(ourValues, MessageColumns.FLAG_FAVORITE, val);
- } else if (columnName.equals(UIProvider.ConversationColumns.READ)) {
- putIntegerLongOrBoolean(ourValues, MessageColumns.FLAG_READ, val);
- } else if (columnName.equals(MessageColumns.MAILBOX_KEY)) {
- putIntegerLongOrBoolean(ourValues, MessageColumns.MAILBOX_KEY, val);
- } else if (columnName.equals(UIProvider.ConversationColumns.FOLDER_LIST)) {
- // Convert from folder list uri to mailbox key
- Uri uri = Uri.parse((String)val);
- Long mailboxId = Long.parseLong(uri.getLastPathSegment());
- putIntegerLongOrBoolean(ourValues, MessageColumns.MAILBOX_KEY, mailboxId);
- } else if (columnName.equals(UIProvider.ConversationColumns.RAW_FOLDERS)) {
- // Ignore; this is updated by the FOLDER_LIST update above.
- } else if (columnName.equals(UIProvider.MessageColumns.ALWAYS_SHOW_IMAGES)) {
- Address[] fromList = Address.unpack(message.mFrom);
- Preferences prefs = Preferences.getPreferences(getContext());
- for (Address sender : fromList) {
- String email = sender.getAddress();
- prefs.setSenderAsTrusted(email);
- }
- } else {
- throw new IllegalArgumentException("Can't update " + columnName + " in message");
- }
- }
- return ourValues;
- }
-
- private Uri convertToEmailProviderUri(Uri uri, Uri newBaseUri, boolean asProvider) {
- String idString = uri.getLastPathSegment();
- try {
- long id = Long.parseLong(idString);
- Uri ourUri = ContentUris.withAppendedId(newBaseUri, id);
- if (asProvider) {
- ourUri = ourUri.buildUpon().appendQueryParameter(IS_UIPROVIDER, "true").build();
- }
- return ourUri;
- } catch (NumberFormatException e) {
- return null;
- }
- }
-
- private Message getMessageFromLastSegment(Uri uri) {
- long messageId = Long.parseLong(uri.getLastPathSegment());
- return Message.restoreMessageWithId(getContext(), messageId);
- }
-
- /**
- * Add an undo operation for the current sequence; if the sequence is newer than what we've had,
- * clear out the undo list and start over
- * @param uri the uri we're working on
- * @param op the ContentProviderOperation to perform upon undo
- */
- private void addToSequence(Uri uri, ContentProviderOperation op) {
- String sequenceString = uri.getQueryParameter(UIProvider.SEQUENCE_QUERY_PARAMETER);
- if (sequenceString != null) {
- int sequence = Integer.parseInt(sequenceString);
- if (sequence > mLastSequence) {
- // Reset sequence
- mLastSequenceOps.clear();
- mLastSequence = sequence;
- }
- // TODO: Need something to indicate a change isn't ready (undoable)
- mLastSequenceOps.add(op);
- }
- }
-
- // TODO: This should depend on flags on the mailbox...
- private boolean uploadsToServer(Context context, Mailbox m) {
- if (m.mType == Mailbox.TYPE_DRAFTS || m.mType == Mailbox.TYPE_OUTBOX ||
- m.mType == Mailbox.TYPE_SEARCH) {
- return false;
- }
- String protocol = Account.getProtocol(context, m.mAccountKey);
- EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, protocol);
- return (info != null && info.syncChanges);
- }
-
- private int uiUpdateMessage(Uri uri, ContentValues values) {
- Context context = getContext();
- Message msg = getMessageFromLastSegment(uri);
- if (msg == null) return 0;
- Mailbox mailbox = Mailbox.restoreMailboxWithId(context, msg.mMailboxKey);
- if (mailbox == null) return 0;
- Uri ourBaseUri = uploadsToServer(context, mailbox) ? Message.SYNCED_CONTENT_URI :
- Message.CONTENT_URI;
- Uri ourUri = convertToEmailProviderUri(uri, ourBaseUri, true);
- if (ourUri == null) return 0;
-
- // Special case - meeting response
- if (values.containsKey(UIProvider.MessageOperations.RESPOND_COLUMN)) {
- EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(context,
- mServiceCallback, mailbox.mAccountKey);
- try {
- service.sendMeetingResponse(msg.mId,
- values.getAsInteger(UIProvider.MessageOperations.RESPOND_COLUMN));
- // Delete the message immediately
- uiDeleteMessage(uri);
- Utility.showToast(context, R.string.confirm_response);
- // Notify box has changed so the deletion is reflected in the UI
- notifyUIConversationMailbox(mailbox.mId);
- } catch (RemoteException e) {
- }
- return 1;
- }
-
- ContentValues undoValues = new ContentValues();
- ContentValues ourValues = convertUiMessageValues(msg, values);
- for (String columnName: ourValues.keySet()) {
- if (columnName.equals(MessageColumns.MAILBOX_KEY)) {
- undoValues.put(MessageColumns.MAILBOX_KEY, msg.mMailboxKey);
- } else if (columnName.equals(MessageColumns.FLAG_READ)) {
- undoValues.put(MessageColumns.FLAG_READ, msg.mFlagRead);
- } else if (columnName.equals(MessageColumns.FLAG_FAVORITE)) {
- undoValues.put(MessageColumns.FLAG_FAVORITE, msg.mFlagFavorite);
- }
- }
- if (undoValues == null || undoValues.size() == 0) {
- return -1;
- }
- ContentProviderOperation op =
- ContentProviderOperation.newUpdate(convertToEmailProviderUri(
- uri, ourBaseUri, false))
- .withValues(undoValues)
- .build();
- addToSequence(uri, op);
- return update(ourUri, ourValues, null, null);
- }
-
- private int uiDeleteMessage(Uri uri) {
- Context context = getContext();
- Message msg = getMessageFromLastSegment(uri);
- if (msg == null) return 0;
- Mailbox mailbox = Mailbox.restoreMailboxWithId(context, msg.mMailboxKey);
- if (mailbox == null) return 0;
- if (mailbox.mType == Mailbox.TYPE_TRASH || mailbox.mType == Mailbox.TYPE_DRAFTS) {
- // We actually delete these, including attachments
- AttachmentUtilities.deleteAllAttachmentFiles(context, msg.mAccountKey, msg.mId);
- notifyUI(UIPROVIDER_FOLDER_NOTIFIER, mailbox.mId);
- return context.getContentResolver().delete(
- ContentUris.withAppendedId(Message.CONTENT_URI, msg.mId), null, null);
- }
- Mailbox trashMailbox =
- Mailbox.restoreMailboxOfType(context, msg.mAccountKey, Mailbox.TYPE_TRASH);
- if (trashMailbox == null) return 0;
- ContentValues values = new ContentValues();
- values.put(MessageColumns.MAILBOX_KEY, trashMailbox.mId);
- notifyUI(UIPROVIDER_FOLDER_NOTIFIER, mailbox.mId);
- return uiUpdateMessage(uri, values);
- }
-
- private Cursor uiUndo(String[] projection) {
- // First see if we have any operations saved
- // TODO: Make sure seq matches
- if (!mLastSequenceOps.isEmpty()) {
- try {
- // TODO Always use this projection? Or what's passed in?
- // Not sure if UI wants it, but I'm making a cursor of convo uri's
- MatrixCursor c = new MatrixCursor(
- new String[] {UIProvider.ConversationColumns.URI},
- mLastSequenceOps.size());
- for (ContentProviderOperation op: mLastSequenceOps) {
- c.addRow(new String[] {op.getUri().toString()});
- }
- // Just apply the batch and we're done!
- applyBatch(mLastSequenceOps);
- // But clear the operations
- mLastSequenceOps.clear();
- // Tell the UI there are changes
- ContentResolver resolver = getContext().getContentResolver();
- resolver.notifyChange(UIPROVIDER_CONVERSATION_NOTIFIER, null);
- resolver.notifyChange(UIPROVIDER_FOLDER_NOTIFIER, null);
- return c;
- } catch (OperationApplicationException e) {
- }
- }
- return new MatrixCursor(projection, 0);
- }
-
- private void notifyUIConversation(Uri uri) {
- String id = uri.getLastPathSegment();
- Message msg = Message.restoreMessageWithId(getContext(), Long.parseLong(id));
- if (msg != null) {
- notifyUIConversationMailbox(msg.mMailboxKey);
- }
- }
-
- /**
- * Notify about the Mailbox id passed in
- * @param id the Mailbox id to be notified
- */
- private void notifyUIConversationMailbox(long id) {
- notifyUI(UIPROVIDER_CONVERSATION_NOTIFIER, Long.toString(id));
- Mailbox mailbox = Mailbox.restoreMailboxWithId(getContext(), id);
- // Notify combined inbox...
- if (mailbox.mType == Mailbox.TYPE_INBOX) {
- notifyUI(UIPROVIDER_CONVERSATION_NOTIFIER,
- EmailProvider.combinedMailboxId(Mailbox.TYPE_INBOX));
- }
- notifyWidgets(id);
- }
-
- private void notifyUI(Uri uri, String id) {
- Uri notifyUri = uri.buildUpon().appendPath(id).build();
- getContext().getContentResolver().notifyChange(notifyUri, null);
- }
-
- private void notifyUI(Uri uri, long id) {
- notifyUI(uri, Long.toString(id));
- }
-
- /**
- * Support for services and service notifications
- */
-
- private final IEmailServiceCallback.Stub mServiceCallback =
- new IEmailServiceCallback.Stub() {
-
- @Override
- public void syncMailboxListStatus(long accountId, int statusCode, int progress)
- throws RemoteException {
- }
-
- @Override
- public void syncMailboxStatus(long mailboxId, int statusCode, int progress)
- throws RemoteException {
- // We'll get callbacks here from the services, which we'll pass back to the UI
- Uri uri = ContentUris.withAppendedId(FOLDER_STATUS_URI, mailboxId);
- EmailProvider.this.getContext().getContentResolver().notifyChange(uri, null);
- }
-
- @Override
- public void loadAttachmentStatus(long messageId, long attachmentId, int statusCode,
- int progress) throws RemoteException {
- }
-
- @Override
- public void sendMessageStatus(long messageId, String subject, int statusCode, int progress)
- throws RemoteException {
- }
-
- @Override
- public void loadMessageStatus(long messageId, int statusCode, int progress)
- throws RemoteException {
- }
- };
-
- private Cursor uiFolderRefresh(Uri uri) {
- Context context = getContext();
- String idString = uri.getLastPathSegment();
- long id = Long.parseLong(idString);
- Mailbox mailbox = Mailbox.restoreMailboxWithId(context, id);
- if (mailbox == null) return null;
- EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(context,
- mServiceCallback, mailbox.mAccountKey);
- try {
- service.startSync(id, true);
- } catch (RemoteException e) {
- }
- return null;
- }
-
- //Number of additional messages to load when a user selects "Load more..." in POP/IMAP boxes
- public static final int VISIBLE_LIMIT_INCREMENT = 10;
- //Number of additional messages to load when a user selects "Load more..." in a search
- public static final int SEARCH_MORE_INCREMENT = 10;
-
- private Cursor uiFolderLoadMore(Uri uri) {
- Context context = getContext();
- String idString = uri.getLastPathSegment();
- long id = Long.parseLong(idString);
- Mailbox mailbox = Mailbox.restoreMailboxWithId(context, id);
- if (mailbox == null) return null;
- if (mailbox.mType == Mailbox.TYPE_SEARCH) {
- // Ask for 10 more messages
- mSearchParams.mOffset += SEARCH_MORE_INCREMENT;
- runSearchQuery(context, mailbox.mAccountKey, id);
- } else {
- ContentValues values = new ContentValues();
- values.put(EmailContent.FIELD_COLUMN_NAME, MailboxColumns.VISIBLE_LIMIT);
- values.put(EmailContent.ADD_COLUMN_NAME, VISIBLE_LIMIT_INCREMENT);
- Uri mailboxUri = ContentUris.withAppendedId(Mailbox.ADD_TO_FIELD_URI, id);
- // Increase the limit
- context.getContentResolver().update(mailboxUri, values, null, null);
- // And order a refresh
- uiFolderRefresh(uri);
- }
- return null;
- }
-
- private static final String SEARCH_MAILBOX_SERVER_ID = "__search_mailbox__";
- private SearchParams mSearchParams;
-
- /**
- * Returns the search mailbox for the specified account, creating one if necessary
- * @return the search mailbox for the passed in account
- */
- private Mailbox getSearchMailbox(long accountId) {
- Context context = getContext();
- Mailbox m = Mailbox.restoreMailboxOfType(context, accountId, Mailbox.TYPE_SEARCH);
- if (m == null) {
- m = new Mailbox();
- m.mAccountKey = accountId;
- m.mServerId = SEARCH_MAILBOX_SERVER_ID;
- m.mFlagVisible = false;
- m.mDisplayName = SEARCH_MAILBOX_SERVER_ID;
- m.mSyncInterval = Mailbox.CHECK_INTERVAL_NEVER;
- m.mType = Mailbox.TYPE_SEARCH;
- m.mFlags = Mailbox.FLAG_HOLDS_MAIL;
- m.mParentKey = Mailbox.NO_MAILBOX;
- m.save(context);
- }
- return m;
- }
-
- private void runSearchQuery(final Context context, final long accountId,
- final long searchMailboxId) {
- // Start the search running in the background
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(context,
- mServiceCallback, accountId);
- if (service != null) {
- try {
- // Save away the total count
- mSearchParams.mTotalCount = service.searchMessages(accountId,
- mSearchParams, searchMailboxId);
- //Log.d(TAG, "TotalCount to UI: " + mSearchParams.mTotalCount);
- notifyUI(UIPROVIDER_FOLDER_NOTIFIER, searchMailboxId);
- } catch (RemoteException e) {
- Log.e("searchMessages", "RemoteException", e);
- }
- }
- } finally {
- }
- }}).start();
-
- }
-
- // TODO: Handle searching for more...
- private Cursor uiSearch(Uri uri, String[] projection) {
- final long accountId = Long.parseLong(uri.getLastPathSegment());
-
- // TODO: Check the actual mailbox
- Mailbox inbox = Mailbox.restoreMailboxOfType(getContext(), accountId, Mailbox.TYPE_INBOX);
- if (inbox == null) return null;
-
- String filter = uri.getQueryParameter(UIProvider.SearchQueryParameters.QUERY);
- if (filter == null) {
- throw new IllegalArgumentException("No query parameter in search query");
- }
-
- // Find/create our search mailbox
- Mailbox searchMailbox = getSearchMailbox(accountId);
- final long searchMailboxId = searchMailbox.mId;
-
- mSearchParams = new SearchParams(inbox.mId, filter, searchMailboxId);
-
- final Context context = getContext();
- if (mSearchParams.mOffset == 0) {
- // Delete existing contents of search mailbox
- ContentResolver resolver = context.getContentResolver();
- resolver.delete(Message.CONTENT_URI, Message.MAILBOX_KEY + "=" + searchMailboxId,
- null);
- ContentValues cv = new ContentValues();
- // For now, use the actual query as the name of the mailbox
- cv.put(Mailbox.DISPLAY_NAME, mSearchParams.mFilter);
- resolver.update(ContentUris.withAppendedId(Mailbox.CONTENT_URI, searchMailboxId),
- cv, null, null);
- }
-
- // Start the search running in the background
- runSearchQuery(context, accountId, searchMailboxId);
-
- // This will look just like a "normal" folder
- return uiQuery(UI_FOLDER, ContentUris.withAppendedId(Mailbox.CONTENT_URI,
- searchMailbox.mId), projection);
- }
-
- private static final String MAILBOXES_FOR_ACCOUNT_SELECTION = MailboxColumns.ACCOUNT_KEY + "=?";
- private static final String MAILBOXES_FOR_ACCOUNT_EXCEPT_ACCOUNT_MAILBOX_SELECTION =
- MAILBOXES_FOR_ACCOUNT_SELECTION + " AND " + MailboxColumns.TYPE + "!=" +
- Mailbox.TYPE_EAS_ACCOUNT_MAILBOX;
- private static final String MESSAGES_FOR_ACCOUNT_SELECTION = MessageColumns.ACCOUNT_KEY + "=?";
-
- /**
- * Delete an account and clean it up
- */
- private int uiDeleteAccount(Uri uri) {
- Context context = getContext();
- long accountId = Long.parseLong(uri.getLastPathSegment());
- try {
- // Get the account URI.
- final Account account = Account.restoreAccountWithId(context, accountId);
- if (account == null) {
- return 0; // Already deleted?
- }
-
- deleteAccountData(context, accountId);
-
- // Now delete the account itself
- uri = ContentUris.withAppendedId(Account.CONTENT_URI, accountId);
- context.getContentResolver().delete(uri, null, null);
-
- // Clean up
- AccountBackupRestore.backup(context);
- SecurityPolicy.getInstance(context).reducePolicies();
- MailActivityEmail.setServicesEnabledSync(context);
- return 1;
- } catch (Exception e) {
- Log.w(Logging.LOG_TAG, "Exception while deleting account", e);
- }
- return 0;
- }
-
- private int uiDeleteAccountData(Uri uri) {
- Context context = getContext();
- long accountId = Long.parseLong(uri.getLastPathSegment());
- // Get the account URI.
- final Account account = Account.restoreAccountWithId(context, accountId);
- if (account == null) {
- return 0; // Already deleted?
- }
- deleteAccountData(context, accountId);
- return 1;
- }
-
- private void deleteAccountData(Context context, long accountId) {
- // Delete synced attachments
- AttachmentUtilities.deleteAllAccountAttachmentFiles(context, accountId);
-
- // Delete synced email, leaving only an empty inbox. We do this in two phases:
- // 1. Delete all non-inbox mailboxes (which will delete all of their messages)
- // 2. Delete all remaining messages (which will be the inbox messages)
- ContentResolver resolver = context.getContentResolver();
- String[] accountIdArgs = new String[] { Long.toString(accountId) };
- resolver.delete(Mailbox.CONTENT_URI,
- MAILBOXES_FOR_ACCOUNT_EXCEPT_ACCOUNT_MAILBOX_SELECTION,
- accountIdArgs);
- resolver.delete(Message.CONTENT_URI, MESSAGES_FOR_ACCOUNT_SELECTION, accountIdArgs);
-
- // Delete sync keys on remaining items
- ContentValues cv = new ContentValues();
- cv.putNull(Account.SYNC_KEY);
- resolver.update(Account.CONTENT_URI, cv, Account.ID_SELECTION, accountIdArgs);
- cv.clear();
- cv.putNull(Mailbox.SYNC_KEY);
- resolver.update(Mailbox.CONTENT_URI, cv,
- MAILBOXES_FOR_ACCOUNT_SELECTION, accountIdArgs);
-
- // Delete PIM data (contacts, calendar), stop syncs, etc. if applicable
- IEmailService service = EmailServiceUtils.getServiceForAccount(context, null, accountId);
- if (service != null) {
- try {
- service.deleteAccountPIMData(accountId);
- } catch (RemoteException e) {
- // Can't do anything about this
- }
- }
- }
-
- private int[] mSavedWidgetIds = new int[0];
- private ArrayList<Long> mWidgetNotifyMailboxes = new ArrayList<Long>();
- private AppWidgetManager mAppWidgetManager;
- private ComponentName mEmailComponent;
-
- private void notifyWidgets(long mailboxId) {
- Context context = getContext();
- // Lazily initialize these
- if (mAppWidgetManager == null) {
- mAppWidgetManager = AppWidgetManager.getInstance(context);
- mEmailComponent = new ComponentName(context, WidgetProvider.PROVIDER_NAME);
- }
-
- // See if we have to populate our array of mailboxes used in widgets
- int[] widgetIds = mAppWidgetManager.getAppWidgetIds(mEmailComponent);
- if (!Arrays.equals(widgetIds, mSavedWidgetIds)) {
- mSavedWidgetIds = widgetIds;
- String[][] widgetInfos = BaseWidgetProvider.getWidgetInfo(context, widgetIds);
- // widgetInfo now has pairs of account uri/folder uri
- mWidgetNotifyMailboxes.clear();
- for (String[] widgetInfo: widgetInfos) {
- try {
- if (widgetInfo == null) continue;
- long id = Long.parseLong(Uri.parse(widgetInfo[1]).getLastPathSegment());
- if (!isCombinedMailbox(id)) {
- // For a regular mailbox, just add it to the list
- if (!mWidgetNotifyMailboxes.contains(id)) {
- mWidgetNotifyMailboxes.add(id);
- }
- } else {
- switch (getVirtualMailboxType(id)) {
- // We only handle the combined inbox in widgets
- case Mailbox.TYPE_INBOX:
- Cursor c = query(Mailbox.CONTENT_URI, Mailbox.ID_PROJECTION,
- MailboxColumns.TYPE + "=?",
- new String[] {Integer.toString(Mailbox.TYPE_INBOX)}, null);
- try {
- while (c.moveToNext()) {
- mWidgetNotifyMailboxes.add(
- c.getLong(Mailbox.ID_PROJECTION_COLUMN));
- }
- } finally {
- c.close();
- }
- break;
- }
- }
- } catch (NumberFormatException e) {
- // Move along
- }
- }
- }
-
- // If our mailbox needs to be notified, do so...
- if (mWidgetNotifyMailboxes.contains(mailboxId)) {
- Intent intent = new Intent(Utils.ACTION_NOTIFY_DATASET_CHANGED);
- intent.putExtra(Utils.EXTRA_FOLDER_URI, uiUri("uifolder", mailboxId));
- intent.setType(EMAIL_APP_MIME_TYPE);
- context.sendBroadcast(intent);
- }
- }
-}
diff --git a/email2/src/com/android/email/provider/Utilities.java b/email2/src/com/android/email/provider/Utilities.java
deleted file mode 100644
index ab175f666..000000000
--- a/email2/src/com/android/email/provider/Utilities.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.provider;
-
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.util.Log;
-
-import com.android.email.LegacyConversions;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.internet.MimeUtility;
-import com.android.emailcommon.mail.Message;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.mail.Part;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.emailcommon.provider.EmailContent.SyncColumns;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.ConversionUtilities;
-
-import java.io.IOException;
-import java.util.ArrayList;
-
-public class Utilities {
- /**
- * Copy one downloaded message (which may have partially-loaded sections)
- * into a newly created EmailProvider Message, given the account and mailbox
- *
- * @param message the remote message we've just downloaded
- * @param account the account it will be stored into
- * @param folder the mailbox it will be stored into
- * @param loadStatus when complete, the message will be marked with this status (e.g.
- * EmailContent.Message.LOADED)
- */
- public static void copyOneMessageToProvider(Context context, Message message, Account account,
- Mailbox folder, int loadStatus) {
- EmailContent.Message localMessage = null;
- Cursor c = null;
- try {
- c = context.getContentResolver().query(
- EmailContent.Message.CONTENT_URI,
- EmailContent.Message.CONTENT_PROJECTION,
- EmailContent.MessageColumns.ACCOUNT_KEY + "=?" +
- " AND " + MessageColumns.MAILBOX_KEY + "=?" +
- " AND " + SyncColumns.SERVER_ID + "=?",
- new String[] {
- String.valueOf(account.mId),
- String.valueOf(folder.mId),
- String.valueOf(message.getUid())
- },
- null);
- if (c.moveToNext()) {
- localMessage = EmailContent.getContent(c, EmailContent.Message.class);
- localMessage.mMailboxKey = folder.mId;
- localMessage.mAccountKey = account.mId;
- copyOneMessageToProvider(context, message, localMessage, loadStatus);
- }
- } finally {
- if (c != null) {
- c.close();
- }
- }
- }
-
- /**
- * Copy one downloaded message (which may have partially-loaded sections)
- * into an already-created EmailProvider Message
- *
- * @param message the remote message we've just downloaded
- * @param localMessage the EmailProvider Message, already created
- * @param loadStatus when complete, the message will be marked with this status (e.g.
- * EmailContent.Message.LOADED)
- * @param context the context to be used for EmailProvider
- */
- public static void copyOneMessageToProvider(Context context, Message message,
- EmailContent.Message localMessage, int loadStatus) {
- try {
-
- EmailContent.Body body = EmailContent.Body.restoreBodyWithMessageId(context,
- localMessage.mId);
- if (body == null) {
- body = new EmailContent.Body();
- }
- try {
- // Copy the fields that are available into the message object
- LegacyConversions.updateMessageFields(localMessage, message,
- localMessage.mAccountKey, localMessage.mMailboxKey);
-
- // Now process body parts & attachments
- ArrayList<Part> viewables = new ArrayList<Part>();
- ArrayList<Part> attachments = new ArrayList<Part>();
- MimeUtility.collectParts(message, viewables, attachments);
-
- ConversionUtilities.updateBodyFields(body, localMessage, viewables);
-
- // Commit the message & body to the local store immediately
- saveOrUpdate(localMessage, context);
- saveOrUpdate(body, context);
-
- // process (and save) attachments
- LegacyConversions.updateAttachments(context, localMessage, attachments);
-
- // One last update of message with two updated flags
- localMessage.mFlagLoaded = loadStatus;
-
- ContentValues cv = new ContentValues();
- cv.put(EmailContent.MessageColumns.FLAG_ATTACHMENT, localMessage.mFlagAttachment);
- cv.put(EmailContent.MessageColumns.FLAG_LOADED, localMessage.mFlagLoaded);
- Uri uri = ContentUris.withAppendedId(EmailContent.Message.CONTENT_URI,
- localMessage.mId);
- context.getContentResolver().update(uri, cv, null, null);
-
- } catch (MessagingException me) {
- Log.e(Logging.LOG_TAG, "Error while copying downloaded message." + me);
- }
-
- } catch (RuntimeException rte) {
- Log.e(Logging.LOG_TAG, "Error while storing downloaded message." + rte.toString());
- } catch (IOException ioe) {
- Log.e(Logging.LOG_TAG, "Error while storing attachment." + ioe.toString());
- }
- }
-
- public static void saveOrUpdate(EmailContent content, Context context) {
- if (content.isSaved()) {
- content.update(context, content.toContentValues());
- } else {
- content.save(context);
- }
- }
-
-}
diff --git a/email2/src/com/android/email/service/AccountService.java b/email2/src/com/android/email/service/AccountService.java
deleted file mode 100644
index 9ca434ee2..000000000
--- a/email2/src/com/android/email/service/AccountService.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import android.accounts.AccountManager;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.os.Bundle;
-import android.os.IBinder;
-
-import com.android.email.NotificationController;
-import com.android.email.ResourceHelper;
-import com.android.email.VendorPolicyLoader;
-import com.android.email.provider.AccountReconciler;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Configuration;
-import com.android.emailcommon.Device;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.service.IAccountService;
-import com.android.emailcommon.utility.EmailAsyncTask;
-
-import java.io.IOException;
-import java.util.ArrayList;
-
-public class AccountService extends Service {
-
- // Save context
- private Context mContext;
-
- private final IAccountService.Stub mBinder = new IAccountService.Stub() {
-
- @Override
- public void notifyLoginFailed(long accountId) {
- NotificationController.getInstance(mContext).showLoginFailedNotification(accountId);
- }
-
- @Override
- public void notifyLoginSucceeded(long accountId) {
- NotificationController.getInstance(mContext).cancelLoginFailedNotification(accountId);
- }
-
- private ArrayList<Account> getAccountList(String forProtocol) {
- ArrayList<Account> providerAccounts = new ArrayList<Account>();
- Cursor c = mContext.getContentResolver().query(Account.CONTENT_URI,
- Account.ID_PROJECTION, null, null, null);
- try {
- while (c.moveToNext()) {
- long accountId = c.getLong(Account.CONTENT_ID_COLUMN);
- String protocol = Account.getProtocol(mContext, accountId);
- if ((protocol != null) && forProtocol.equals(protocol)) {
- Account account = Account.restoreAccountWithId(mContext, accountId);
- if (account != null) {
- providerAccounts.add(account);
- }
- }
- }
- } finally {
- c.close();
- }
- return providerAccounts;
- }
-
- @Override
- public void reconcileAccounts(String protocol, String accountManagerType) {
- ArrayList<Account> providerList = getAccountList(protocol);
- android.accounts.Account[] accountMgrList =
- AccountManager.get(mContext).getAccountsByType(accountManagerType);
- AccountReconciler.reconcileAccounts(mContext, providerList, accountMgrList, mContext);
- }
-
- @Override
- public int getAccountColor(long accountId) {
- return ResourceHelper.getInstance(mContext).getAccountColor(accountId);
- }
-
- @Override
- public Bundle getConfigurationData(String accountType) {
- Bundle bundle = new Bundle();
- bundle.putBoolean(Configuration.EXCHANGE_CONFIGURATION_USE_ALTERNATE_STRINGS,
- VendorPolicyLoader.getInstance(mContext).useAlternateExchangeStrings());
- return bundle;
- }
-
- @Override
- public String getDeviceId() {
- try {
- EmailAsyncTask.runAsyncSerial(new Runnable() {
- @Override
- public void run() {
- // Make sure remote services are running (re: lifecycle)
- EmailServiceUtils.startRemoteServices(mContext);
- // Send current logging flags
- MailActivityEmail.updateLoggingFlags(mContext);
- }});
- return Device.getDeviceId(mContext);
- } catch (IOException e) {
- return null;
- }
- }
- };
-
- @Override
- public IBinder onBind(Intent intent) {
- if (mContext == null) {
- mContext = this;
- }
- // Make sure we have a valid deviceId (just retrieves a static String except first time)
- try {
- Device.getDeviceId(this);
- } catch (IOException e) {
- }
- return mBinder;
- }
-} \ No newline at end of file
diff --git a/email2/src/com/android/email/service/AttachmentDownloadService.java b/email2/src/com/android/email/service/AttachmentDownloadService.java
deleted file mode 100644
index e86e03f37..000000000
--- a/email2/src/com/android/email/service/AttachmentDownloadService.java
+++ /dev/null
@@ -1,1008 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import android.accounts.AccountManager;
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.app.Service;
-import android.content.BroadcastReceiver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.ConnectivityManager;
-import android.net.Uri;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.text.format.DateUtils;
-import android.util.Log;
-
-import com.android.email.AttachmentInfo;
-import com.android.email.EmailConnectivityManager;
-import com.android.email.NotificationController;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.service.EmailServiceProxy;
-import com.android.emailcommon.service.EmailServiceStatus;
-import com.android.emailcommon.service.IEmailServiceCallback;
-import com.android.emailcommon.utility.AttachmentUtilities;
-import com.android.emailcommon.utility.Utility;
-
-import java.io.File;
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.TreeSet;
-import java.util.concurrent.ConcurrentHashMap;
-
-public class AttachmentDownloadService extends Service implements Runnable {
- public static final String TAG = "AttachmentService";
-
- // Our idle time, waiting for notifications; this is something of a failsafe
- private static final int PROCESS_QUEUE_WAIT_TIME = 30 * ((int)DateUtils.MINUTE_IN_MILLIS);
- // How often our watchdog checks for callback timeouts
- private static final int WATCHDOG_CHECK_INTERVAL = 20 * ((int)DateUtils.SECOND_IN_MILLIS);
- // How long we'll wait for a callback before canceling a download and retrying
- private static final int CALLBACK_TIMEOUT = 30 * ((int)DateUtils.SECOND_IN_MILLIS);
- // Try to download an attachment in the background this many times before giving up
- private static final int MAX_DOWNLOAD_RETRIES = 5;
- private static final int PRIORITY_NONE = -1;
- @SuppressWarnings("unused")
- // Low priority will be used for opportunistic downloads
- private static final int PRIORITY_BACKGROUND = 0;
- // Normal priority is for forwarded downloads in outgoing mail
- private static final int PRIORITY_SEND_MAIL = 1;
- // High priority is for user requests
- private static final int PRIORITY_FOREGROUND = 2;
-
- // Minimum free storage in order to perform prefetch (25% of total memory)
- private static final float PREFETCH_MINIMUM_STORAGE_AVAILABLE = 0.25F;
- // Maximum prefetch storage (also 25% of total memory)
- private static final float PREFETCH_MAXIMUM_ATTACHMENT_STORAGE = 0.25F;
-
- // We can try various values here; I think 2 is completely reasonable as a first pass
- private static final int MAX_SIMULTANEOUS_DOWNLOADS = 2;
- // Limit on the number of simultaneous downloads per account
- // Note that a limit of 1 is currently enforced by both Services (MailService and Controller)
- private static final int MAX_SIMULTANEOUS_DOWNLOADS_PER_ACCOUNT = 1;
- // Limit on the number of attachments we'll check for background download
- private static final int MAX_ATTACHMENTS_TO_CHECK = 25;
-
- private static final String EXTRA_ATTACHMENT =
- "com.android.email.AttachmentDownloadService.attachment";
-
- // sRunningService is only set in the UI thread; it's visibility elsewhere is guaranteed
- // by the use of "volatile"
- /*package*/ static volatile AttachmentDownloadService sRunningService = null;
-
- /*package*/ Context mContext;
- /*package*/ EmailConnectivityManager mConnectivityManager;
-
- /*package*/ final DownloadSet mDownloadSet = new DownloadSet(new DownloadComparator());
-
- private final HashMap<Long, Intent> mAccountServiceMap = new HashMap<Long, Intent>();
- // A map of attachment storage used per account
- // NOTE: This map is not kept current in terms of deletions (i.e. it stores the last calculated
- // amount plus the size of any new attachments laoded). If and when we reach the per-account
- // limit, we recalculate the actual usage
- /*package*/ final HashMap<Long, Long> mAttachmentStorageMap = new HashMap<Long, Long>();
- // A map of attachment ids to the number of failed attempts to download the attachment
- // NOTE: We do not want to persist this. This allows us to retry background downloading
- // if any transient network errors are fixed & and the app is restarted
- /* package */ final HashMap<Long, Integer> mAttachmentFailureMap = new HashMap<Long, Integer>();
- private final ServiceCallback mServiceCallback = new ServiceCallback();
-
- private final Object mLock = new Object();
- private volatile boolean mStop = false;
-
- /*package*/ AccountManagerStub mAccountManagerStub;
-
- /**
- * We only use the getAccounts() call from AccountManager, so this class wraps that call and
- * allows us to build a mock account manager stub in the unit tests
- */
- /*package*/ static class AccountManagerStub {
- private int mNumberOfAccounts;
- private final AccountManager mAccountManager;
-
- AccountManagerStub(Context context) {
- if (context != null) {
- mAccountManager = AccountManager.get(context);
- } else {
- mAccountManager = null;
- }
- }
-
- /*package*/ int getNumberOfAccounts() {
- if (mAccountManager != null) {
- return mAccountManager.getAccounts().length;
- } else {
- return mNumberOfAccounts;
- }
- }
-
- /*package*/ void setNumberOfAccounts(int numberOfAccounts) {
- mNumberOfAccounts = numberOfAccounts;
- }
- }
-
- /**
- * Watchdog alarm receiver; responsible for making sure that downloads in progress are not
- * stalled, as determined by the timing of the most recent service callback
- */
- public static class Watchdog extends BroadcastReceiver {
- @Override
- public void onReceive(final Context context, Intent intent) {
- new Thread(new Runnable() {
- @Override
- public void run() {
- watchdogAlarm();
- }
- }, "AttachmentDownloadService Watchdog").start();
- }
- }
-
- public static class DownloadRequest {
- final int priority;
- final long time;
- final long attachmentId;
- final long messageId;
- final long accountId;
- boolean inProgress = false;
- int lastStatusCode;
- int lastProgress;
- long lastCallbackTime;
- long startTime;
-
- private DownloadRequest(Context context, Attachment attachment) {
- attachmentId = attachment.mId;
- Message msg = Message.restoreMessageWithId(context, attachment.mMessageKey);
- if (msg != null) {
- accountId = msg.mAccountKey;
- messageId = msg.mId;
- } else {
- accountId = messageId = -1;
- }
- priority = getPriority(attachment);
- time = System.currentTimeMillis();
- }
-
- @Override
- public int hashCode() {
- return (int)attachmentId;
- }
-
- /**
- * Two download requests are equals if their attachment id's are equals
- */
- @Override
- public boolean equals(Object object) {
- if (!(object instanceof DownloadRequest)) return false;
- DownloadRequest req = (DownloadRequest)object;
- return req.attachmentId == attachmentId;
- }
- }
-
- /**
- * Comparator class for the download set; we first compare by priority. Requests with equal
- * priority are compared by the time the request was created (older requests come first)
- */
- /*protected*/ static class DownloadComparator implements Comparator<DownloadRequest> {
- @Override
- public int compare(DownloadRequest req1, DownloadRequest req2) {
- int res;
- if (req1.priority != req2.priority) {
- res = (req1.priority < req2.priority) ? -1 : 1;
- } else {
- if (req1.time == req2.time) {
- res = 0;
- } else {
- res = (req1.time > req2.time) ? -1 : 1;
- }
- }
- return res;
- }
- }
-
- /**
- * The DownloadSet is a TreeSet sorted by priority class (e.g. low, high, etc.) and the
- * time of the request. Higher priority requests
- * are always processed first; among equals, the oldest request is processed first. The
- * priority key represents this ordering. Note: All methods that change the attachment map are
- * synchronized on the map itself
- */
- /*package*/ class DownloadSet extends TreeSet<DownloadRequest> {
- private static final long serialVersionUID = 1L;
- private PendingIntent mWatchdogPendingIntent;
-
- /*package*/ DownloadSet(Comparator<? super DownloadRequest> comparator) {
- super(comparator);
- }
-
- /**
- * Maps attachment id to DownloadRequest
- */
- /*package*/ final ConcurrentHashMap<Long, DownloadRequest> mDownloadsInProgress =
- new ConcurrentHashMap<Long, DownloadRequest>();
-
- /**
- * onChange is called by the AttachmentReceiver upon receipt of a valid notification from
- * EmailProvider that an attachment has been inserted or modified. It's not strictly
- * necessary that we detect a deleted attachment, as the code always checks for the
- * existence of an attachment before acting on it.
- */
- public synchronized void onChange(Context context, Attachment att) {
- DownloadRequest req = findDownloadRequest(att.mId);
- long priority = getPriority(att);
- if (priority == PRIORITY_NONE) {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "== Attachment changed: " + att.mId);
- }
- // In this case, there is no download priority for this attachment
- if (req != null) {
- // If it exists in the map, remove it
- // NOTE: We don't yet support deleting downloads in progress
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "== Attachment " + att.mId + " was in queue, removing");
- }
- remove(req);
- }
- } else {
- // Ignore changes that occur during download
- if (mDownloadsInProgress.containsKey(att.mId)) return;
- // If this is new, add the request to the queue
- if (req == null) {
- req = new DownloadRequest(context, att);
- add(req);
- }
- // If the request already existed, we'll update the priority (so that the time is
- // up-to-date); otherwise, we create a new request
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "== Download queued for attachment " + att.mId + ", class " +
- req.priority + ", priority time " + req.time);
- }
- }
- // Process the queue if we're in a wait
- kick();
- }
-
- /**
- * Find a queued DownloadRequest, given the attachment's id
- * @param id the id of the attachment
- * @return the DownloadRequest for that attachment (or null, if none)
- */
- /*package*/ synchronized DownloadRequest findDownloadRequest(long id) {
- Iterator<DownloadRequest> iterator = iterator();
- while(iterator.hasNext()) {
- DownloadRequest req = iterator.next();
- if (req.attachmentId == id) {
- return req;
- }
- }
- return null;
- }
-
- @Override
- public synchronized boolean isEmpty() {
- return super.isEmpty() && mDownloadsInProgress.isEmpty();
- }
-
- /**
- * Run through the AttachmentMap and find DownloadRequests that can be executed, enforcing
- * the limit on maximum downloads
- */
- /*package*/ synchronized void processQueue() {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "== Checking attachment queue, " + mDownloadSet.size() + " entries");
- }
-
- Iterator<DownloadRequest> iterator = mDownloadSet.descendingIterator();
- // First, start up any required downloads, in priority order
- while (iterator.hasNext() &&
- (mDownloadsInProgress.size() < MAX_SIMULTANEOUS_DOWNLOADS)) {
- DownloadRequest req = iterator.next();
- // Enforce per-account limit here
- if (downloadsForAccount(req.accountId) >= MAX_SIMULTANEOUS_DOWNLOADS_PER_ACCOUNT) {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "== Skip #" + req.attachmentId + "; maxed for acct #" +
- req.accountId);
- }
- continue;
- } else if (Attachment.restoreAttachmentWithId(mContext, req.attachmentId) == null) {
- continue;
- }
- if (!req.inProgress) {
- mDownloadSet.tryStartDownload(req);
- }
- }
-
- // Don't prefetch if background downloading is disallowed
- EmailConnectivityManager ecm = mConnectivityManager;
- if (ecm == null) return;
- if (!ecm.isAutoSyncAllowed()) return;
- // Don't prefetch unless we're on a WiFi network
- if (ecm.getActiveNetworkType() != ConnectivityManager.TYPE_WIFI) {
- return;
- }
- // Then, try opportunistic download of appropriate attachments
- int backgroundDownloads = MAX_SIMULTANEOUS_DOWNLOADS - mDownloadsInProgress.size();
- // Always leave one slot for user requested download
- if (backgroundDownloads > (MAX_SIMULTANEOUS_DOWNLOADS - 1)) {
- // We'll load up the newest 25 attachments that aren't loaded or queued
- Uri lookupUri = EmailContent.uriWithLimit(Attachment.CONTENT_URI,
- MAX_ATTACHMENTS_TO_CHECK);
- Cursor c = mContext.getContentResolver().query(lookupUri,
- Attachment.CONTENT_PROJECTION,
- EmailContent.Attachment.PRECACHE_INBOX_SELECTION,
- null, Attachment.RECORD_ID + " DESC");
- File cacheDir = mContext.getCacheDir();
- try {
- while (c.moveToNext()) {
- Attachment att = new Attachment();
- att.restore(c);
- Account account = Account.restoreAccountWithId(mContext, att.mAccountKey);
- if (account == null) {
- // Clean up this orphaned attachment; there's no point in keeping it
- // around; then try to find another one
- EmailContent.delete(mContext, Attachment.CONTENT_URI, att.mId);
- } else {
- // Check that the attachment meets system requirements for download
- AttachmentInfo info = new AttachmentInfo(mContext, att);
- if (info.isEligibleForDownload()) {
- // Either the account must be able to prefetch or this must be
- // an inline attachment
- if (att.mContentId != null ||
- (canPrefetchForAccount(account, cacheDir))) {
- Integer tryCount;
- tryCount = mAttachmentFailureMap.get(att.mId);
- if (tryCount != null && tryCount > MAX_DOWNLOAD_RETRIES) {
- // move onto the next attachment
- continue;
- }
- // Start this download and we're done
- DownloadRequest req = new DownloadRequest(mContext, att);
- mDownloadSet.tryStartDownload(req);
- break;
- }
- }
- }
- }
- } finally {
- c.close();
- }
- }
- }
-
- /**
- * Count the number of running downloads in progress for this account
- * @param accountId the id of the account
- * @return the count of running downloads
- */
- /*package*/ synchronized int downloadsForAccount(long accountId) {
- int count = 0;
- for (DownloadRequest req: mDownloadsInProgress.values()) {
- if (req.accountId == accountId) {
- count++;
- }
- }
- return count;
- }
-
- /**
- * Watchdog for downloads; we use this in case we are hanging on a download, which might
- * have failed silently (the connection dropped, for example)
- */
- private void onWatchdogAlarm() {
- // If our service instance is gone, just leave
- if (mStop) {
- return;
- }
- long now = System.currentTimeMillis();
- for (DownloadRequest req: mDownloadsInProgress.values()) {
- // Check how long it's been since receiving a callback
- long timeSinceCallback = now - req.lastCallbackTime;
- if (timeSinceCallback > CALLBACK_TIMEOUT) {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "== Download of " + req.attachmentId + " timed out");
- }
- cancelDownload(req);
- }
- }
- // Check whether we can start new downloads...
- if (mConnectivityManager != null && mConnectivityManager.hasConnectivity()) {
- processQueue();
- }
- // If there are downloads in progress, reset alarm
- if (!mDownloadsInProgress.isEmpty()) {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "Reschedule watchdog...");
- }
- setWatchdogAlarm();
- }
- }
-
- /**
- * Attempt to execute the DownloadRequest, enforcing the maximum downloads per account
- * parameter
- * @param req the DownloadRequest
- * @return whether or not the download was started
- */
- /*package*/ synchronized boolean tryStartDownload(DownloadRequest req) {
- EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(
- AttachmentDownloadService.this, mServiceCallback, req.accountId);
-
- // Do not download the same attachment multiple times
- boolean alreadyInProgress = mDownloadsInProgress.get(req.attachmentId) != null;
- if (alreadyInProgress) return false;
-
- try {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, ">> Starting download for attachment #" + req.attachmentId);
- }
- startDownload(service, req);
- } catch (RemoteException e) {
- // TODO: Consider whether we need to do more in this case...
- // For now, fix up our data to reflect the failure
- cancelDownload(req);
- }
- return true;
- }
-
- private synchronized DownloadRequest getDownloadInProgress(long attachmentId) {
- return mDownloadsInProgress.get(attachmentId);
- }
-
- private void setWatchdogAlarm() {
- // Lazily initialize the pending intent
- if (mWatchdogPendingIntent == null) {
- Intent intent = new Intent(mContext, Watchdog.class);
- mWatchdogPendingIntent =
- PendingIntent.getBroadcast(mContext, 0, intent, 0);
- }
- // Set the alarm
- AlarmManager am = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
- am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + WATCHDOG_CHECK_INTERVAL,
- mWatchdogPendingIntent);
- }
-
- /**
- * Do the work of starting an attachment download using the EmailService interface, and
- * set our watchdog alarm
- *
- * @param serviceClass the service handling the download
- * @param req the DownloadRequest
- * @throws RemoteException
- */
- private void startDownload(EmailServiceProxy service, DownloadRequest req)
- throws RemoteException {
- req.startTime = System.currentTimeMillis();
- req.inProgress = true;
- mDownloadsInProgress.put(req.attachmentId, req);
- service.loadAttachment(req.attachmentId, req.priority != PRIORITY_FOREGROUND);
- setWatchdogAlarm();
- }
-
- private void cancelDownload(DownloadRequest req) {
- mDownloadsInProgress.remove(req.attachmentId);
- req.inProgress = false;
- }
-
- /**
- * Called when a download is finished; we get notified of this via our EmailServiceCallback
- * @param attachmentId the id of the attachment whose download is finished
- * @param statusCode the EmailServiceStatus code returned by the Service
- */
- /*package*/ synchronized void endDownload(long attachmentId, int statusCode) {
- // Say we're no longer downloading this
- mDownloadsInProgress.remove(attachmentId);
-
- // TODO: This code is conservative and treats connection issues as failures.
- // Since we have no mechanism to throttle reconnection attempts, it makes
- // sense to be cautious here. Once logic is in place to prevent connecting
- // in a tight loop, we can exclude counting connection issues as "failures".
-
- // Update the attachment failure list if needed
- Integer downloadCount;
- downloadCount = mAttachmentFailureMap.remove(attachmentId);
- if (statusCode != EmailServiceStatus.SUCCESS) {
- if (downloadCount == null) {
- downloadCount = 0;
- }
- downloadCount += 1;
- mAttachmentFailureMap.put(attachmentId, downloadCount);
- }
-
- DownloadRequest req = mDownloadSet.findDownloadRequest(attachmentId);
- if (statusCode == EmailServiceStatus.CONNECTION_ERROR) {
- // If this needs to be retried, just process the queue again
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "== The download for attachment #" + attachmentId +
- " will be retried");
- }
- if (req != null) {
- req.inProgress = false;
- }
- kick();
- return;
- }
-
- // If the request is still in the queue, remove it
- if (req != null) {
- remove(req);
- }
- if (MailActivityEmail.DEBUG) {
- long secs = 0;
- if (req != null) {
- secs = (System.currentTimeMillis() - req.time) / 1000;
- }
- String status = (statusCode == EmailServiceStatus.SUCCESS) ? "Success" :
- "Error " + statusCode;
- Log.d(TAG, "<< Download finished for attachment #" + attachmentId + "; " + secs +
- " seconds from request, status: " + status);
- }
-
- Attachment attachment = Attachment.restoreAttachmentWithId(mContext, attachmentId);
- if (attachment != null) {
- long accountId = attachment.mAccountKey;
- // Update our attachment storage for this account
- Long currentStorage = mAttachmentStorageMap.get(accountId);
- if (currentStorage == null) {
- currentStorage = 0L;
- }
- mAttachmentStorageMap.put(accountId, currentStorage + attachment.mSize);
- boolean deleted = false;
- if ((attachment.mFlags & Attachment.FLAG_DOWNLOAD_FORWARD) != 0) {
- if (statusCode == EmailServiceStatus.ATTACHMENT_NOT_FOUND) {
- // If this is a forwarding download, and the attachment doesn't exist (or
- // can't be downloaded) delete it from the outgoing message, lest that
- // message never get sent
- EmailContent.delete(mContext, Attachment.CONTENT_URI, attachment.mId);
- // TODO: Talk to UX about whether this is even worth doing
- NotificationController nc = NotificationController.getInstance(mContext);
- nc.showDownloadForwardFailedNotification(attachment);
- deleted = true;
- }
- // If we're an attachment on forwarded mail, and if we're not still blocked,
- // try to send pending mail now (as mediated by MailService)
- if ((req != null) &&
- !Utility.hasUnloadedAttachments(mContext, attachment.mMessageKey)) {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "== Downloads finished for outgoing msg #" + req.messageId);
- }
- EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(
- mContext, null, accountId);
- try {
- service.sendMail(accountId);
- } catch (RemoteException e) {
- // We tried
- }
- }
- }
- if (statusCode == EmailServiceStatus.MESSAGE_NOT_FOUND) {
- Message msg = Message.restoreMessageWithId(mContext, attachment.mMessageKey);
- if (msg == null) {
- // If there's no associated message, delete the attachment
- EmailContent.delete(mContext, Attachment.CONTENT_URI, attachment.mId);
- } else {
- // If there really is a message, retry
- kick();
- return;
- }
- } else if (!deleted) {
- // Clear the download flags, since we're done for now. Note that this happens
- // only for non-recoverable errors. When these occur for forwarded mail, we can
- // ignore it and continue; otherwise, it was either 1) a user request, in which
- // case the user can retry manually or 2) an opportunistic download, in which
- // case the download wasn't critical
- ContentValues cv = new ContentValues();
- int flags =
- Attachment.FLAG_DOWNLOAD_FORWARD | Attachment.FLAG_DOWNLOAD_USER_REQUEST;
- cv.put(Attachment.FLAGS, attachment.mFlags &= ~flags);
- attachment.update(mContext, cv);
- }
- }
- // Process the queue
- kick();
- }
- }
-
- /**
- * Calculate the download priority of an Attachment. A priority of zero means that the
- * attachment is not marked for download.
- * @param att the Attachment
- * @return the priority key of the Attachment
- */
- private static int getPriority(Attachment att) {
- int priorityClass = PRIORITY_NONE;
- int flags = att.mFlags;
- if ((flags & Attachment.FLAG_DOWNLOAD_FORWARD) != 0) {
- priorityClass = PRIORITY_SEND_MAIL;
- } else if ((flags & Attachment.FLAG_DOWNLOAD_USER_REQUEST) != 0) {
- priorityClass = PRIORITY_FOREGROUND;
- }
- return priorityClass;
- }
-
- private void kick() {
- synchronized(mLock) {
- mLock.notify();
- }
- }
-
- /**
- * We use an EmailServiceCallback to keep track of the progress of downloads. These callbacks
- * come from either Controller (IMAP) or ExchangeService (EAS). Note that we only implement the
- * single callback that's defined by the EmailServiceCallback interface.
- */
- private class ServiceCallback extends IEmailServiceCallback.Stub {
- @Override
- public void loadAttachmentStatus(long messageId, long attachmentId, int statusCode,
- int progress) {
- // Record status and progress
- DownloadRequest req = mDownloadSet.getDownloadInProgress(attachmentId);
- if (req != null) {
- if (MailActivityEmail.DEBUG) {
- String code;
- switch(statusCode) {
- case EmailServiceStatus.SUCCESS: code = "Success"; break;
- case EmailServiceStatus.IN_PROGRESS: code = "In progress"; break;
- default: code = Integer.toString(statusCode); break;
- }
- if (statusCode != EmailServiceStatus.IN_PROGRESS) {
- Log.d(TAG, ">> Attachment " + attachmentId + ": " + code);
- } else if (progress >= (req.lastProgress + 15)) {
- Log.d(TAG, ">> Attachment " + attachmentId + ": " + progress + "%");
- }
- }
- req.lastStatusCode = statusCode;
- req.lastProgress = progress;
- req.lastCallbackTime = System.currentTimeMillis();
- Attachment attachment = Attachment.restoreAttachmentWithId(mContext, attachmentId);
- if (attachment != null && statusCode == EmailServiceStatus.IN_PROGRESS) {
- ContentValues values = new ContentValues();
- values.put(AttachmentColumns.UI_DOWNLOADED_SIZE,
- attachment.mSize * progress / 100);
- // Update UIProvider with updated download size
- // Individual services will set contentUri and state when finished
- attachment.update(mContext, values);
- }
- }
- switch (statusCode) {
- case EmailServiceStatus.IN_PROGRESS:
- break;
- default:
- mDownloadSet.endDownload(attachmentId, statusCode);
- break;
- }
- }
-
- @Override
- public void syncMailboxListStatus(long accountId, int statusCode, int progress)
- throws RemoteException {
- }
-
- @Override
- public void syncMailboxStatus(long mailboxId, int statusCode, int progress)
- throws RemoteException {
- }
-
- @Override
- public void sendMessageStatus(long messageId, String subject, int statusCode, int progress)
- throws RemoteException {
- }
-
- @Override
- public void loadMessageStatus(long messageId, int statusCode, int progress)
- throws RemoteException {
- }
- }
-
- /*package*/ void addServiceIntentForTest(long accountId, Intent intent) {
- mAccountServiceMap.put(accountId, intent);
- }
-
- /*package*/ void onChange(Attachment att) {
- mDownloadSet.onChange(this, att);
- }
-
- /*package*/ boolean isQueued(long attachmentId) {
- return mDownloadSet.findDownloadRequest(attachmentId) != null;
- }
-
- /*package*/ int getSize() {
- return mDownloadSet.size();
- }
-
- /*package*/ boolean dequeue(long attachmentId) {
- DownloadRequest req = mDownloadSet.findDownloadRequest(attachmentId);
- if (req != null) {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, "Dequeued attachmentId: " + attachmentId);
- }
- mDownloadSet.remove(req);
- return true;
- }
- return false;
- }
-
- /**
- * Ask the service for the number of items in the download queue
- * @return the number of items queued for download
- */
- public static int getQueueSize() {
- AttachmentDownloadService service = sRunningService;
- if (service != null) {
- return service.getSize();
- }
- return 0;
- }
-
- /**
- * Ask the service whether a particular attachment is queued for download
- * @param attachmentId the id of the Attachment (as stored by EmailProvider)
- * @return whether or not the attachment is queued for download
- */
- public static boolean isAttachmentQueued(long attachmentId) {
- AttachmentDownloadService service = sRunningService;
- if (service != null) {
- return service.isQueued(attachmentId);
- }
- return false;
- }
-
- /**
- * Ask the service to remove an attachment from the download queue
- * @param attachmentId the id of the Attachment (as stored by EmailProvider)
- * @return whether or not the attachment was removed from the queue
- */
- public static boolean cancelQueuedAttachment(long attachmentId) {
- AttachmentDownloadService service = sRunningService;
- if (service != null) {
- return service.dequeue(attachmentId);
- }
- return false;
- }
-
- public static void watchdogAlarm() {
- AttachmentDownloadService service = sRunningService;
- if (service != null) {
- service.mDownloadSet.onWatchdogAlarm();
- }
- }
-
- /**
- * Called directly by EmailProvider whenever an attachment is inserted or changed
- * @param context the caller's context
- * @param id the attachment's id
- * @param flags the new flags for the attachment
- */
- public static void attachmentChanged(final Context context, final long id, final int flags) {
- Utility.runAsync(new Runnable() {
- @Override
- public void run() {
- Attachment attachment = Attachment.restoreAttachmentWithId(context, id);
- if (attachment != null) {
- // Store the flags we got from EmailProvider; given that all of this
- // activity is asynchronous, we need to use the newest data from
- // EmailProvider
- attachment.mFlags = flags;
- Intent intent = new Intent(context, AttachmentDownloadService.class);
- intent.putExtra(EXTRA_ATTACHMENT, attachment);
- context.startService(intent);
- }
- }});
- }
-
- /**
- * Determine whether an attachment can be prefetched for the given account
- * @return true if download is allowed, false otherwise
- */
- public boolean canPrefetchForAccount(Account account, File dir) {
- // Check account, just in case
- if (account == null) return false;
- // First, check preference and quickly return if prefetch isn't allowed
- if ((account.mFlags & Account.FLAGS_BACKGROUND_ATTACHMENTS) == 0) return false;
-
- long totalStorage = dir.getTotalSpace();
- long usableStorage = dir.getUsableSpace();
- long minAvailable = (long)(totalStorage * PREFETCH_MINIMUM_STORAGE_AVAILABLE);
-
- // If there's not enough overall storage available, stop now
- if (usableStorage < minAvailable) {
- return false;
- }
-
- int numberOfAccounts = mAccountManagerStub.getNumberOfAccounts();
- long perAccountMaxStorage =
- (long)(totalStorage * PREFETCH_MAXIMUM_ATTACHMENT_STORAGE / numberOfAccounts);
-
- // Retrieve our idea of currently used attachment storage; since we don't track deletions,
- // this number is the "worst case". If the number is greater than what's allowed per
- // account, we walk the directory to determine the actual number
- Long accountStorage = mAttachmentStorageMap.get(account.mId);
- if (accountStorage == null || (accountStorage > perAccountMaxStorage)) {
- // Calculate the exact figure for attachment storage for this account
- accountStorage = 0L;
- File[] files = dir.listFiles();
- if (files != null) {
- for (File file : files) {
- accountStorage += file.length();
- }
- }
- // Cache the value
- mAttachmentStorageMap.put(account.mId, accountStorage);
- }
-
- // Return true if we're using less than the maximum per account
- if (accountStorage < perAccountMaxStorage) {
- return true;
- } else {
- if (MailActivityEmail.DEBUG) {
- Log.d(TAG, ">> Prefetch not allowed for account " + account.mId + "; used " +
- accountStorage + ", limit " + perAccountMaxStorage);
- }
- return false;
- }
- }
-
- @Override
- public void run() {
- // These fields are only used within the service thread
- mContext = this;
- mConnectivityManager = new EmailConnectivityManager(this, TAG);
- mAccountManagerStub = new AccountManagerStub(this);
-
- // Run through all attachments in the database that require download and add them to
- // the queue
- int mask = Attachment.FLAG_DOWNLOAD_FORWARD | Attachment.FLAG_DOWNLOAD_USER_REQUEST;
- Cursor c = getContentResolver().query(Attachment.CONTENT_URI,
- EmailContent.ID_PROJECTION, "(" + Attachment.FLAGS + " & ?) != 0",
- new String[] {Integer.toString(mask)}, null);
- try {
- Log.d(TAG, "Count: " + c.getCount());
- while (c.moveToNext()) {
- Attachment attachment = Attachment.restoreAttachmentWithId(
- this, c.getLong(EmailContent.ID_PROJECTION_COLUMN));
- if (attachment != null) {
- mDownloadSet.onChange(this, attachment);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- finally {
- c.close();
- }
-
- // Loop until stopped, with a 30 minute wait loop
- while (!mStop) {
- // Here's where we run our attachment loading logic...
- mConnectivityManager.waitForConnectivity();
- mDownloadSet.processQueue();
- if (mDownloadSet.isEmpty()) {
- Log.d(TAG, "*** All done; shutting down service");
- stopSelf();
- break;
- }
- synchronized(mLock) {
- try {
- mLock.wait(PROCESS_QUEUE_WAIT_TIME);
- } catch (InterruptedException e) {
- // That's ok; we'll just keep looping
- }
- }
- }
-
- // Unregister now that we're done
- if (mConnectivityManager != null) {
- mConnectivityManager.unregister();
- }
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- if (sRunningService == null) {
- sRunningService = this;
- }
- if (intent != null && intent.hasExtra(EXTRA_ATTACHMENT)) {
- Attachment att = (Attachment)intent.getParcelableExtra(EXTRA_ATTACHMENT);
- onChange(att);
- }
- return Service.START_STICKY;
- }
-
- @Override
- public void onCreate() {
- // Start up our service thread
- new Thread(this, "AttachmentDownloadService").start();
- }
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
-
- @Override
- public void onDestroy() {
- // Mark this instance of the service as stopped
- mStop = true;
- if (sRunningService != null) {
- kick();
- sRunningService = null;
- }
- if (mConnectivityManager != null) {
- mConnectivityManager.unregister();
- mConnectivityManager = null;
- }
- }
-
- @Override
- public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- pw.println("AttachmentDownloadService");
- long time = System.currentTimeMillis();
- synchronized(mDownloadSet) {
- pw.println(" Queue, " + mDownloadSet.size() + " entries");
- Iterator<DownloadRequest> iterator = mDownloadSet.descendingIterator();
- // First, start up any required downloads, in priority order
- while (iterator.hasNext()) {
- DownloadRequest req = iterator.next();
- pw.println(" Account: " + req.accountId + ", Attachment: " + req.attachmentId);
- pw.println(" Priority: " + req.priority + ", Time: " + req.time +
- (req.inProgress ? " [In progress]" : ""));
- Attachment att = Attachment.restoreAttachmentWithId(this, req.attachmentId);
- if (att == null) {
- pw.println(" Attachment not in database?");
- } else if (att.mFileName != null) {
- String fileName = att.mFileName;
- String suffix = "[none]";
- int lastDot = fileName.lastIndexOf('.');
- if (lastDot >= 0) {
- suffix = fileName.substring(lastDot);
- }
- pw.print(" Suffix: " + suffix);
- if (att.mContentUri != null) {
- pw.print(" ContentUri: " + att.mContentUri);
- }
- pw.print(" Mime: ");
- if (att.mMimeType != null) {
- pw.print(att.mMimeType);
- } else {
- pw.print(AttachmentUtilities.inferMimeType(fileName, null));
- pw.print(" [inferred]");
- }
- pw.println(" Size: " + att.mSize);
- }
- if (req.inProgress) {
- pw.println(" Status: " + req.lastStatusCode + ", Progress: " +
- req.lastProgress);
- pw.println(" Started: " + req.startTime + ", Callback: " +
- req.lastCallbackTime);
- pw.println(" Elapsed: " + ((time - req.startTime) / 1000L) + "s");
- if (req.lastCallbackTime > 0) {
- pw.println(" CB: " + ((time - req.lastCallbackTime) / 1000L) + "s");
- }
- }
- }
- }
- }
-}
diff --git a/email2/src/com/android/email/service/AuthenticatorService.java b/email2/src/com/android/email/service/AuthenticatorService.java
deleted file mode 100644
index 2c93c4ba1..000000000
--- a/email2/src/com/android/email/service/AuthenticatorService.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import com.android.email.activity.setup.AccountSetupBasics;
-import com.android.emailcommon.provider.EmailContent;
-
-import android.accounts.AbstractAccountAuthenticator;
-import android.accounts.Account;
-import android.accounts.AccountAuthenticatorResponse;
-import android.accounts.AccountManager;
-import android.accounts.NetworkErrorException;
-import android.app.Service;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.provider.CalendarContract;
-import android.provider.ContactsContract;
-
-/**
- * A very basic authenticator service for EAS. At the moment, it has no UI hooks. When called
- * with addAccount, it simply adds the account to AccountManager directly with a username and
- * password.
- */
-public class AuthenticatorService extends Service {
- public static final String OPTIONS_USERNAME = "username";
- public static final String OPTIONS_PASSWORD = "password";
- public static final String OPTIONS_CONTACTS_SYNC_ENABLED = "contacts";
- public static final String OPTIONS_CALENDAR_SYNC_ENABLED = "calendar";
- public static final String OPTIONS_EMAIL_SYNC_ENABLED = "email";
-
- class Authenticator extends AbstractAccountAuthenticator {
-
- public Authenticator(Context context) {
- super(context);
- }
-
- @Override
- public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
- String authTokenType, String[] requiredFeatures, Bundle options)
- throws NetworkErrorException {
-
- // There are two cases here:
- // 1) We are called with a username/password; this comes from the traditional email
- // app UI; we simply create the account and return the proper bundle
- if (options != null && options.containsKey(OPTIONS_PASSWORD)
- && options.containsKey(OPTIONS_USERNAME)) {
- final Account account = new Account(options.getString(OPTIONS_USERNAME),
- accountType);
- AccountManager.get(AuthenticatorService.this).addAccountExplicitly(
- account, options.getString(OPTIONS_PASSWORD), null);
-
- // Set up contacts syncing, if appropriate
- if (options.containsKey(OPTIONS_CONTACTS_SYNC_ENABLED)) {
- boolean syncContacts = options.getBoolean(OPTIONS_CONTACTS_SYNC_ENABLED);
- ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 1);
- ContentResolver.setSyncAutomatically(account, ContactsContract.AUTHORITY,
- syncContacts);
- }
-
- // Set up calendar syncing, if appropriate
- if (options.containsKey(OPTIONS_CALENDAR_SYNC_ENABLED)) {
- boolean syncCalendar = options.getBoolean(OPTIONS_CALENDAR_SYNC_ENABLED);
- ContentResolver.setIsSyncable(account, CalendarContract.AUTHORITY, 1);
- ContentResolver.setSyncAutomatically(account, CalendarContract.AUTHORITY,
- syncCalendar);
- }
-
- // Set up email syncing (it's always syncable, but we respect the user's choice
- // for whether to enable it now)
- boolean syncEmail = false;
- if (options.containsKey(OPTIONS_EMAIL_SYNC_ENABLED) &&
- options.getBoolean(OPTIONS_EMAIL_SYNC_ENABLED)) {
- syncEmail = true;
- }
- ContentResolver.setIsSyncable(account, EmailContent.AUTHORITY, 1);
- ContentResolver.setSyncAutomatically(account, EmailContent.AUTHORITY,
- syncEmail);
-
- Bundle b = new Bundle();
- b.putString(AccountManager.KEY_ACCOUNT_NAME, options.getString(OPTIONS_USERNAME));
- b.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType);
- return b;
- // 2) The other case is that we're creating a new account from an Account manager
- // activity. In this case, we add an intent that will be used to gather the
- // account information...
- } else {
- Bundle b = new Bundle();
- Intent intent =
- AccountSetupBasics.actionGetCreateAccountIntent(AuthenticatorService.this,
- accountType);
- intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
- b.putParcelable(AccountManager.KEY_INTENT, intent);
- return b;
- }
- }
-
- @Override
- public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account,
- Bundle options) {
- return null;
- }
-
- @Override
- public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
- return null;
- }
-
- @Override
- public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
- String authTokenType, Bundle loginOptions) throws NetworkErrorException {
- return null;
- }
-
- @Override
- public String getAuthTokenLabel(String authTokenType) {
- // null means we don't have compartmentalized authtoken types
- return null;
- }
-
- @Override
- public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account,
- String[] features) throws NetworkErrorException {
- return null;
- }
-
- @Override
- public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account,
- String authTokenType, Bundle loginOptions) {
- return null;
- }
-
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- if (AccountManager.ACTION_AUTHENTICATOR_INTENT.equals(intent.getAction())) {
- return new Authenticator(this).getIBinder();
- } else {
- return null;
- }
- }
-}
diff --git a/email2/src/com/android/email/service/EasAuthenticatorService.java b/email2/src/com/android/email/service/EasAuthenticatorService.java
deleted file mode 100644
index 4dbca7f0c..000000000
--- a/email2/src/com/android/email/service/EasAuthenticatorService.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-/**
- * This service needs to be declared separately from the base service
- */
-public class EasAuthenticatorService extends AuthenticatorService {
-}
diff --git a/email2/src/com/android/email/service/EasAuthenticatorServiceAlternate.java b/email2/src/com/android/email/service/EasAuthenticatorServiceAlternate.java
deleted file mode 100644
index 28d8fb72f..000000000
--- a/email2/src/com/android/email/service/EasAuthenticatorServiceAlternate.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-/**
- * This service needs to be declared separately from the base service
- */
-public class EasAuthenticatorServiceAlternate extends AuthenticatorService {
-}
diff --git a/email2/src/com/android/email/service/EasTestAuthenticatorService.java b/email2/src/com/android/email/service/EasTestAuthenticatorService.java
deleted file mode 100644
index cdb213fac..000000000
--- a/email2/src/com/android/email/service/EasTestAuthenticatorService.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import android.accounts.AbstractAccountAuthenticator;
-import android.accounts.Account;
-import android.accounts.AccountAuthenticatorResponse;
-import android.accounts.AccountManager;
-import android.accounts.NetworkErrorException;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.IBinder;
-
-import com.android.email.activity.setup.AccountSetupBasics;
-
-/**
- * Anauthenticator service for reconciliation tests; it simply adds the account to AccountManager
- * directly with a username and password.
- */
-public class EasTestAuthenticatorService extends Service {
- public static final String OPTIONS_USERNAME = "username";
- public static final String OPTIONS_PASSWORD = "password";
- private static final String TEST_ACCOUNT_TYPE = "com.android.test_exchange";
-
- class EasAuthenticator extends AbstractAccountAuthenticator {
-
- public EasAuthenticator(Context context) {
- super(context);
- }
-
- @Override
- public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
- String authTokenType, String[] requiredFeatures, Bundle options)
- throws NetworkErrorException {
- // There are two cases here:
- // 1) We are called with a username/password; this comes from the traditional email
- // app UI; we simply create the account and return the proper bundle
- if (options != null && options.containsKey(OPTIONS_PASSWORD)
- && options.containsKey(OPTIONS_USERNAME)) {
- final Account account = new Account(options.getString(OPTIONS_USERNAME),
- TEST_ACCOUNT_TYPE);
- AccountManager.get(EasTestAuthenticatorService.this).addAccountExplicitly(
- account, options.getString(OPTIONS_PASSWORD), null);
-
- Bundle b = new Bundle();
- b.putString(AccountManager.KEY_ACCOUNT_NAME, TEST_ACCOUNT_TYPE);
- return b;
- // 2) The other case is that we're creating a new account from an Account manager
- // activity. In this case, we add an intent that will be used to gather the
- // account information...
- } else {
- Bundle b = new Bundle();
- Intent intent =
- AccountSetupBasics.actionGetCreateAccountIntent(
- EasTestAuthenticatorService.this, accountType);
- intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
- b.putParcelable(AccountManager.KEY_INTENT, intent);
- return b;
- }
- }
-
- @Override
- public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account,
- Bundle options) {
- return null;
- }
-
- @Override
- public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
- return null;
- }
-
- @Override
- public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
- String authTokenType, Bundle loginOptions) throws NetworkErrorException {
- return null;
- }
-
- @Override
- public String getAuthTokenLabel(String authTokenType) {
- // null means we don't have compartmentalized authtoken types
- return null;
- }
-
- @Override
- public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account,
- String[] features) throws NetworkErrorException {
- return null;
- }
-
- @Override
- public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account,
- String authTokenType, Bundle loginOptions) {
- return null;
- }
-
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- if (AccountManager.ACTION_AUTHENTICATOR_INTENT.equals(intent.getAction())) {
- return new EasAuthenticator(this).getIBinder();
- } else {
- return null;
- }
- }
-}
diff --git a/email2/src/com/android/email/service/EmailBroadcastProcessorService.java b/email2/src/com/android/email/service/EmailBroadcastProcessorService.java
deleted file mode 100644
index a3d2ec05f..000000000
--- a/email2/src/com/android/email/service/EmailBroadcastProcessorService.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import android.accounts.AccountManager;
-import android.app.IntentService;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.net.Uri;
-import android.util.Log;
-
-import com.android.email.NotificationController;
-import com.android.email.Preferences;
-import com.android.email.SecurityPolicy;
-import com.android.email.VendorPolicyLoader;
-import com.android.email.activity.setup.AccountSettings;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.provider.HostAuth;
-
-/**
- * The service that really handles broadcast intents on a worker thread.
- *
- * We make it a service, because:
- * <ul>
- * <li>So that it's less likely for the process to get killed.
- * <li>Even if it does, the Intent that have started it will be re-delivered by the system,
- * and we can start the process again. (Using {@link #setIntentRedelivery}).
- * </ul>
- *
- * This also handles the DeviceAdminReceiver in SecurityPolicy, because it is also
- * a BroadcastReceiver and requires the same processing semantics.
- */
-public class EmailBroadcastProcessorService extends IntentService {
- // Action used for BroadcastReceiver entry point
- private static final String ACTION_BROADCAST = "broadcast_receiver";
-
- // Dialing "*#*#36245#*#*" to open the debug screen. "36245" = "email"
- private static final String ACTION_SECRET_CODE = "android.provider.Telephony.SECRET_CODE";
- private static final String SECRET_CODE_HOST_DEBUG_SCREEN = "36245";
-
- // This is a helper used to process DeviceAdminReceiver messages
- private static final String ACTION_DEVICE_POLICY_ADMIN = "com.android.email.devicepolicy";
- private static final String EXTRA_DEVICE_POLICY_ADMIN = "message_code";
-
- // Broadcast received to initiate new message notification updates
- public static final String ACTION_NOTIFY_NEW_MAIL =
- "com.android.mail.action.update_notification";
-
- public EmailBroadcastProcessorService() {
- // Class name will be the thread name.
- super(EmailBroadcastProcessorService.class.getName());
-
- // Intent should be redelivered if the process gets killed before completing the job.
- setIntentRedelivery(true);
- }
-
- /**
- * Entry point for {@link EmailBroadcastReceiver}.
- */
- public static void processBroadcastIntent(Context context, Intent broadcastIntent) {
- Intent i = new Intent(context, EmailBroadcastProcessorService.class);
- i.setAction(ACTION_BROADCAST);
- i.putExtra(Intent.EXTRA_INTENT, broadcastIntent);
- context.startService(i);
- }
-
- /**
- * Entry point for {@link com.android.email.SecurityPolicy.PolicyAdmin}. These will
- * simply callback to {@link
- * com.android.email.SecurityPolicy#onDeviceAdminReceiverMessage(Context, int)}.
- */
- public static void processDevicePolicyMessage(Context context, int message) {
- Intent i = new Intent(context, EmailBroadcastProcessorService.class);
- i.setAction(ACTION_DEVICE_POLICY_ADMIN);
- i.putExtra(EXTRA_DEVICE_POLICY_ADMIN, message);
- context.startService(i);
- }
-
- @Override
- protected void onHandleIntent(Intent intent) {
- // This method is called on a worker thread.
-
- // Dispatch from entry point
- final String action = intent.getAction();
- if (ACTION_BROADCAST.equals(action)) {
- final Intent broadcastIntent = intent.getParcelableExtra(Intent.EXTRA_INTENT);
- final String broadcastAction = broadcastIntent.getAction();
-
- if (Intent.ACTION_BOOT_COMPLETED.equals(broadcastAction)) {
- onBootCompleted();
- } else if (ACTION_SECRET_CODE.equals(broadcastAction)
- && SECRET_CODE_HOST_DEBUG_SCREEN.equals(broadcastIntent.getData().getHost())) {
- AccountSettings.actionSettingsWithDebug(this);
- } else if (AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION.equals(broadcastAction)) {
- onSystemAccountChanged();
- } else if (ACTION_NOTIFY_NEW_MAIL.equals(broadcastAction)) {
- NotificationController.notifyNewMail(this, broadcastIntent);
- }
- } else if (ACTION_DEVICE_POLICY_ADMIN.equals(action)) {
- int message = intent.getIntExtra(EXTRA_DEVICE_POLICY_ADMIN, -1);
- SecurityPolicy.onDeviceAdminReceiverMessage(this, message);
- }
- }
-
- /**
- * Handles {@link Intent#ACTION_BOOT_COMPLETED}. Called on a worker thread.
- */
- private void onBootCompleted() {
- performOneTimeInitialization();
-
- // Starts remote services, if any
- EmailServiceUtils.startRemoteServices(this);
- }
-
- private void performOneTimeInitialization() {
- final Preferences pref = Preferences.getPreferences(this);
- int progress = pref.getOneTimeInitializationProgress();
- final int initialProgress = progress;
-
- if (progress < 1) {
- Log.i(Logging.LOG_TAG, "Onetime initialization: 1");
- progress = 1;
- if (VendorPolicyLoader.getInstance(this).useAlternateExchangeStrings()) {
- setComponentEnabled(EasAuthenticatorServiceAlternate.class, true);
- setComponentEnabled(EasAuthenticatorService.class, false);
- }
- }
-
- if (progress < 2) {
- Log.i(Logging.LOG_TAG, "Onetime initialization: 2");
- progress = 2;
- setImapDeletePolicy(this);
- }
-
- // Add your initialization steps here.
- // Use "progress" to skip the initializations that's already done before.
- // Using this preference also makes it safe when a user skips an upgrade. (i.e. upgrading
- // version N to version N+2)
-
- if (progress != initialProgress) {
- pref.setOneTimeInitializationProgress(progress);
- Log.i(Logging.LOG_TAG, "Onetime initialization: completed.");
- }
- }
-
- /**
- * Sets the delete policy to the correct value for all IMAP accounts. This will have no
- * effect on either EAS or POP3 accounts.
- */
- /*package*/ static void setImapDeletePolicy(Context context) {
- ContentResolver resolver = context.getContentResolver();
- Cursor c = resolver.query(Account.CONTENT_URI, Account.CONTENT_PROJECTION,
- null, null, null);
- try {
- while (c.moveToNext()) {
- long recvAuthKey = c.getLong(Account.CONTENT_HOST_AUTH_KEY_RECV_COLUMN);
- HostAuth recvAuth = HostAuth.restoreHostAuthWithId(context, recvAuthKey);
- if (HostAuth.LEGACY_SCHEME_IMAP.equals(recvAuth.mProtocol)) {
- int flags = c.getInt(Account.CONTENT_FLAGS_COLUMN);
- flags &= ~Account.FLAGS_DELETE_POLICY_MASK;
- flags |= Account.DELETE_POLICY_ON_DELETE << Account.FLAGS_DELETE_POLICY_SHIFT;
- ContentValues cv = new ContentValues();
- cv.put(AccountColumns.FLAGS, flags);
- long accountId = c.getLong(Account.CONTENT_ID_COLUMN);
- Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, accountId);
- resolver.update(uri, cv, null, null);
- }
- }
- } finally {
- c.close();
- }
- }
-
- private void setComponentEnabled(Class<?> clazz, boolean enabled) {
- final ComponentName c = new ComponentName(this, clazz.getName());
- getPackageManager().setComponentEnabledSetting(c,
- enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
- : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
- PackageManager.DONT_KILL_APP);
- }
-
- private void onSystemAccountChanged() {
- Log.i(Logging.LOG_TAG, "System accounts updated.");
- MailService.reconcilePopImapAccountsSync(this);
-
- // Start any remote services
- EmailServiceUtils.startRemoteServices(this);
- }
-}
diff --git a/email2/src/com/android/email/service/EmailBroadcastReceiver.java b/email2/src/com/android/email/service/EmailBroadcastReceiver.java
deleted file mode 100644
index ce7221043..000000000
--- a/email2/src/com/android/email/service/EmailBroadcastReceiver.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-/**
- * The broadcast receiver. The actual job is done in EmailBroadcastProcessor on a worker thread.
- */
-public class EmailBroadcastReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- EmailBroadcastProcessorService.processBroadcastIntent(context, intent);
- }
-}
diff --git a/email2/src/com/android/email/service/EmailServiceStub.java b/email2/src/com/android/email/service/EmailServiceStub.java
deleted file mode 100644
index e18e5e1a0..000000000
--- a/email2/src/com/android/email/service/EmailServiceStub.java
+++ /dev/null
@@ -1,561 +0,0 @@
-/* Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.TrafficStats;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.email.NotificationController;
-import com.android.email.mail.Sender;
-import com.android.email.mail.Store;
-import com.android.email.provider.Utilities;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.AccountManagerTypes;
-import com.android.emailcommon.Api;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.TrafficFlags;
-import com.android.emailcommon.internet.MimeBodyPart;
-import com.android.emailcommon.internet.MimeHeader;
-import com.android.emailcommon.internet.MimeMultipart;
-import com.android.emailcommon.mail.AuthenticationFailedException;
-import com.android.emailcommon.mail.FetchProfile;
-import com.android.emailcommon.mail.Folder;
-import com.android.emailcommon.mail.Folder.MessageRetrievalListener;
-import com.android.emailcommon.mail.Folder.OpenMode;
-import com.android.emailcommon.mail.Message;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
-import com.android.emailcommon.provider.EmailContent.Body;
-import com.android.emailcommon.provider.EmailContent.BodyColumns;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.service.EmailServiceStatus;
-import com.android.emailcommon.service.IEmailService;
-import com.android.emailcommon.service.IEmailServiceCallback;
-import com.android.emailcommon.service.SearchParams;
-import com.android.emailcommon.utility.AttachmentUtilities;
-import com.android.emailcommon.utility.Utility;
-import com.android.mail.providers.UIProvider;
-
-import java.util.HashSet;
-
-/**
- * EmailServiceStub is an abstract class representing an EmailService
- *
- * This class provides legacy support for a few methods that are common to both
- * IMAP and POP3, including startSync, loadMore, loadAttachment, and sendMail
- */
-public abstract class EmailServiceStub extends IEmailService.Stub implements IEmailService {
-
- private static final int MAILBOX_COLUMN_ID = 0;
- private static final int MAILBOX_COLUMN_SERVER_ID = 1;
- private static final int MAILBOX_COLUMN_TYPE = 2;
-
- public static final String SYNC_EXTRA_MAILBOX_ID = "__mailboxId__";
-
- /** Small projection for just the columns required for a sync. */
- private static final String[] MAILBOX_PROJECTION = new String[] {
- MailboxColumns.ID,
- MailboxColumns.SERVER_ID,
- MailboxColumns.TYPE,
- };
-
- private Context mContext;
- private IEmailServiceCallback.Stub mCallback;
-
- protected void init(Context context, IEmailServiceCallback.Stub callbackProxy) {
- mContext = context;
- mCallback = callbackProxy;
- }
-
- @Override
- public Bundle validate(HostAuth hostauth) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void startSync(long mailboxId, boolean userRequest) throws RemoteException {
- Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, mailboxId);
- if (mailbox == null) return;
- Account account = Account.restoreAccountWithId(mContext, mailbox.mAccountKey);
- if (account == null) return;
- android.accounts.Account acct = new android.accounts.Account(account.mEmailAddress,
- AccountManagerTypes.TYPE_POP_IMAP);
- Bundle extras = new Bundle();
- extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
- extras.putLong(SYNC_EXTRA_MAILBOX_ID, mailboxId);
- ContentResolver.requestSync(acct, EmailContent.AUTHORITY, extras);
- }
-
- @Override
- public void stopSync(long mailboxId) throws RemoteException {
- // Not required
- }
-
- @Override
- public void loadMore(long messageId) throws RemoteException {
- // Load a message for view...
- try {
- // 1. Resample the message, in case it disappeared or synced while
- // this command was in queue
- EmailContent.Message message =
- EmailContent.Message.restoreMessageWithId(mContext, messageId);
- if (message == null) {
- mCallback.loadMessageStatus(messageId,
- EmailServiceStatus.MESSAGE_NOT_FOUND, 0);
- return;
- }
- if (message.mFlagLoaded == EmailContent.Message.FLAG_LOADED_COMPLETE) {
- // We should NEVER get here
- mCallback.loadMessageStatus(messageId, 0, 100);
- return;
- }
-
- // 2. Open the remote folder.
- // TODO combine with common code in loadAttachment
- Account account = Account.restoreAccountWithId(mContext, message.mAccountKey);
- Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, message.mMailboxKey);
- if (account == null || mailbox == null) {
- //mListeners.loadMessageForViewFailed(messageId, "null account or mailbox");
- return;
- }
- TrafficStats.setThreadStatsTag(TrafficFlags.getSyncFlags(mContext, account));
-
- Store remoteStore = Store.getInstance(account, mContext);
- String remoteServerId = mailbox.mServerId;
- // If this is a search result, use the protocolSearchInfo field to get the
- // correct remote location
- if (!TextUtils.isEmpty(message.mProtocolSearchInfo)) {
- remoteServerId = message.mProtocolSearchInfo;
- }
- Folder remoteFolder = remoteStore.getFolder(remoteServerId);
- remoteFolder.open(OpenMode.READ_WRITE);
-
- // 3. Set up to download the entire message
- Message remoteMessage = remoteFolder.getMessage(message.mServerId);
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.BODY);
- remoteFolder.fetch(new Message[] { remoteMessage }, fp, null);
-
- // 4. Write to provider
- Utilities.copyOneMessageToProvider(mContext, remoteMessage, account, mailbox,
- EmailContent.Message.FLAG_LOADED_COMPLETE);
-
- // 5. Notify UI
- mCallback.loadMessageStatus(messageId, 0, 100);
-
- } catch (MessagingException me) {
- if (Logging.LOGD) Log.v(Logging.LOG_TAG, "", me);
- mCallback.loadMessageStatus(messageId, EmailServiceStatus.REMOTE_EXCEPTION, 0);
- } catch (RuntimeException rte) {
- mCallback.loadMessageStatus(messageId, EmailServiceStatus.REMOTE_EXCEPTION, 0);
- }
- }
-
- private void doProgressCallback(long messageId, long attachmentId, int progress) {
- try {
- mCallback.loadAttachmentStatus(messageId, attachmentId,
- EmailServiceStatus.IN_PROGRESS, progress);
- } catch (RemoteException e) {
- // No danger if the client is no longer around
- }
- }
-
- @Override
- public void loadAttachment(long attachmentId, boolean background) throws RemoteException {
- try {
- //1. Check if the attachment is already here and return early in that case
- Attachment attachment =
- Attachment.restoreAttachmentWithId(mContext, attachmentId);
- if (attachment == null) {
- mCallback.loadAttachmentStatus(0, attachmentId,
- EmailServiceStatus.ATTACHMENT_NOT_FOUND, 0);
- return;
- }
- long messageId = attachment.mMessageKey;
-
- EmailContent.Message message =
- EmailContent.Message.restoreMessageWithId(mContext, attachment.mMessageKey);
- if (message == null) {
- mCallback.loadAttachmentStatus(messageId, attachmentId,
- EmailServiceStatus.MESSAGE_NOT_FOUND, 0);
- }
-
- // If the message is loaded, just report that we're finished
- if (Utility.attachmentExists(mContext, attachment)) {
- mCallback.loadAttachmentStatus(messageId, attachmentId, EmailServiceStatus.SUCCESS,
- 0);
- return;
- }
-
- // Say we're starting...
- doProgressCallback(messageId, attachmentId, 0);
-
- // 2. Open the remote folder.
- Account account = Account.restoreAccountWithId(mContext, message.mAccountKey);
- Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, message.mMailboxKey);
-
- if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
- long sourceId = Utility.getFirstRowLong(mContext, Body.CONTENT_URI,
- new String[] {BodyColumns.SOURCE_MESSAGE_KEY},
- BodyColumns.MESSAGE_KEY + "=?",
- new String[] {Long.toString(messageId)}, null, 0, -1L);
- if (sourceId != -1 ) {
- EmailContent.Message sourceMsg =
- EmailContent.Message.restoreMessageWithId(mContext, sourceId);
- if (sourceMsg != null) {
- mailbox = Mailbox.restoreMailboxWithId(mContext, sourceMsg.mMailboxKey);
- message.mServerId = sourceMsg.mServerId;
- }
- }
- }
-
- if (account == null || mailbox == null) {
- // If the account/mailbox are gone, just report success; the UI handles this
- mCallback.loadAttachmentStatus(messageId, attachmentId,
- EmailServiceStatus.SUCCESS, 0);
- return;
- }
- TrafficStats.setThreadStatsTag(
- TrafficFlags.getAttachmentFlags(mContext, account));
-
- Store remoteStore = Store.getInstance(account, mContext);
- Folder remoteFolder = remoteStore.getFolder(mailbox.mServerId);
- remoteFolder.open(OpenMode.READ_WRITE);
-
- // 3. Generate a shell message in which to retrieve the attachment,
- // and a shell BodyPart for the attachment. Then glue them together.
- Message storeMessage = remoteFolder.createMessage(message.mServerId);
- MimeBodyPart storePart = new MimeBodyPart();
- storePart.setSize((int)attachment.mSize);
- storePart.setHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA,
- attachment.mLocation);
- storePart.setHeader(MimeHeader.HEADER_CONTENT_TYPE,
- String.format("%s;\n name=\"%s\"",
- attachment.mMimeType,
- attachment.mFileName));
- // TODO is this always true for attachments? I think we dropped the
- // true encoding along the way
- storePart.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64");
-
- MimeMultipart multipart = new MimeMultipart();
- multipart.setSubType("mixed");
- multipart.addBodyPart(storePart);
-
- storeMessage.setHeader(MimeHeader.HEADER_CONTENT_TYPE, "multipart/mixed");
- storeMessage.setBody(multipart);
-
- // 4. Now ask for the attachment to be fetched
- FetchProfile fp = new FetchProfile();
- fp.add(storePart);
- remoteFolder.fetch(new Message[] { storeMessage }, fp,
- new MessageRetrievalListenerBridge(messageId, attachmentId));
-
- // If we failed to load the attachment, throw an Exception here, so that
- // AttachmentDownloadService knows that we failed
- if (storePart.getBody() == null) {
- throw new MessagingException("Attachment not loaded.");
- }
-
- // Save the attachment to wherever it's going
- AttachmentUtilities.saveAttachment(mContext, storePart.getBody().getInputStream(),
- attachment);
-
- // 6. Report success
- mCallback.loadAttachmentStatus(messageId, attachmentId, EmailServiceStatus.SUCCESS, 0);
-
- // Close the connection
- remoteFolder.close(false);
- }
- catch (MessagingException me) {
- if (Logging.LOGD) Log.v(Logging.LOG_TAG, "", me);
- // TODO: Fix this up; consider the best approach
-
- ContentValues cv = new ContentValues();
- cv.put(AttachmentColumns.UI_STATE, UIProvider.AttachmentState.FAILED);
- Uri uri = ContentUris.withAppendedId(Attachment.CONTENT_URI, attachmentId);
- mContext.getContentResolver().update(uri, cv, null, null);
-
- mCallback.loadAttachmentStatus(0, attachmentId, EmailServiceStatus.CONNECTION_ERROR, 0);
- }
-
- }
-
- /**
- * Bridge to intercept {@link MessageRetrievalListener#loadAttachmentProgress} and
- * pass down to {@link Result}.
- */
- public class MessageRetrievalListenerBridge implements MessageRetrievalListener {
- private final long mMessageId;
- private final long mAttachmentId;
-
- public MessageRetrievalListenerBridge(long messageId, long attachmentId) {
- mMessageId = messageId;
- mAttachmentId = attachmentId;
- }
-
- @Override
- public void loadAttachmentProgress(int progress) {
- doProgressCallback(mMessageId, mAttachmentId, progress);
- }
-
- @Override
- public void messageRetrieved(com.android.emailcommon.mail.Message message) {
- }
- }
-
- @Override
- public void updateFolderList(long accountId) throws RemoteException {
- Account account = Account.restoreAccountWithId(mContext, accountId);
- if (account == null) return;
- Mailbox inbox = Mailbox.restoreMailboxOfType(mContext, accountId, Mailbox.TYPE_INBOX);
- TrafficStats.setThreadStatsTag(TrafficFlags.getSyncFlags(mContext, account));
- Cursor localFolderCursor = null;
- try {
- // Step 1: Get remote mailboxes
- Store store = Store.getInstance(account, mContext);
- Folder[] remoteFolders = store.updateFolders();
- HashSet<String> remoteFolderNames = new HashSet<String>();
- for (int i = 0, count = remoteFolders.length; i < count; i++) {
- remoteFolderNames.add(remoteFolders[i].getName());
- }
-
- // Step 2: Get local mailboxes
- localFolderCursor = mContext.getContentResolver().query(
- Mailbox.CONTENT_URI,
- MAILBOX_PROJECTION,
- EmailContent.MailboxColumns.ACCOUNT_KEY + "=?",
- new String[] { String.valueOf(account.mId) },
- null);
-
- // Step 3: Remove any local mailbox not on the remote list
- while (localFolderCursor.moveToNext()) {
- String mailboxPath = localFolderCursor.getString(MAILBOX_COLUMN_SERVER_ID);
- // Short circuit if we have a remote mailbox with the same name
- if (remoteFolderNames.contains(mailboxPath)) {
- continue;
- }
-
- int mailboxType = localFolderCursor.getInt(MAILBOX_COLUMN_TYPE);
- long mailboxId = localFolderCursor.getLong(MAILBOX_COLUMN_ID);
- switch (mailboxType) {
- case Mailbox.TYPE_INBOX:
- case Mailbox.TYPE_DRAFTS:
- case Mailbox.TYPE_OUTBOX:
- case Mailbox.TYPE_SENT:
- case Mailbox.TYPE_TRASH:
- case Mailbox.TYPE_SEARCH:
- // Never, ever delete special mailboxes
- break;
- default:
- // Drop all attachment files related to this mailbox
- AttachmentUtilities.deleteAllMailboxAttachmentFiles(
- mContext, accountId, mailboxId);
- // Delete the mailbox; database triggers take care of related
- // Message, Body and Attachment records
- Uri uri = ContentUris.withAppendedId(
- Mailbox.CONTENT_URI, mailboxId);
- mContext.getContentResolver().delete(uri, null, null);
- break;
- }
- }
- } catch (MessagingException e) {
- // We'll hope this is temporary
- } finally {
- if (localFolderCursor != null) {
- localFolderCursor.close();
- }
- // If this is a first sync, find the inbox and sync it
- if (inbox == null) {
- inbox = Mailbox.restoreMailboxOfType(mContext, accountId, Mailbox.TYPE_INBOX);
- if (inbox != null) {
- startSync(inbox.mId, true);
- }
- }
- }
- }
-
- @Override
- public boolean createFolder(long accountId, String name) throws RemoteException {
- // Not required
- return false;
- }
-
- @Override
- public boolean deleteFolder(long accountId, String name) throws RemoteException {
- // Not required
- return false;
- }
-
- @Override
- public boolean renameFolder(long accountId, String oldName, String newName)
- throws RemoteException {
- // Not required
- return false;
- }
-
- @Override
- public void setCallback(IEmailServiceCallback cb) throws RemoteException {
- // Not required
- }
-
- @Override
- public void setLogging(int on) throws RemoteException {
- // Not required
- }
-
- @Override
- public void hostChanged(long accountId) throws RemoteException {
- // Not required
- }
-
- @Override
- public Bundle autoDiscover(String userName, String password) throws RemoteException {
- // Not required
- return null;
- }
-
- @Override
- public void sendMeetingResponse(long messageId, int response) throws RemoteException {
- // Not required
- }
-
- @Override
- public void deleteAccountPIMData(long accountId) throws RemoteException {
- MailService.reconcilePopImapAccountsSync(mContext);
- }
-
- @Override
- public int getApiLevel() throws RemoteException {
- return Api.LEVEL;
- }
-
- @Override
- public int searchMessages(long accountId, SearchParams params, long destMailboxId)
- throws RemoteException {
- // Not required
- return 0;
- }
-
- @Override
- public void sendMail(long accountId) throws RemoteException {
- sendMailImpl(mContext, accountId);
- }
-
- public static void sendMailImpl(Context context, long accountId) {
- Account account = Account.restoreAccountWithId(context, accountId);
- TrafficStats.setThreadStatsTag(TrafficFlags.getSmtpFlags(context, account));
- NotificationController nc = NotificationController.getInstance(context);
- // 1. Loop through all messages in the account's outbox
- long outboxId = Mailbox.findMailboxOfType(context, account.mId, Mailbox.TYPE_OUTBOX);
- if (outboxId == Mailbox.NO_MAILBOX) {
- return;
- }
- ContentResolver resolver = context.getContentResolver();
- Cursor c = resolver.query(EmailContent.Message.CONTENT_URI,
- EmailContent.Message.ID_COLUMN_PROJECTION,
- EmailContent.Message.MAILBOX_KEY + "=?", new String[] { Long.toString(outboxId) },
- null);
- try {
- // 2. exit early
- if (c.getCount() <= 0) {
- return;
- }
- Sender sender = Sender.getInstance(context, account);
- Store remoteStore = Store.getInstance(account, context);
- boolean requireMoveMessageToSentFolder = remoteStore.requireCopyMessageToSentFolder();
- ContentValues moveToSentValues = null;
- if (requireMoveMessageToSentFolder) {
- Mailbox sentFolder =
- Mailbox.restoreMailboxOfType(context, accountId, Mailbox.TYPE_SENT);
- moveToSentValues = new ContentValues();
- moveToSentValues.put(MessageColumns.MAILBOX_KEY, sentFolder.mId);
- }
-
- // 3. loop through the available messages and send them
- while (c.moveToNext()) {
- long messageId = -1;
- moveToSentValues.remove(EmailContent.MessageColumns.FLAGS);
- try {
- messageId = c.getLong(0);
- // Don't send messages with unloaded attachments
- if (Utility.hasUnloadedAttachments(context, messageId)) {
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "Can't send #" + messageId +
- "; unloaded attachments");
- }
- continue;
- }
- sender.sendMessage(messageId);
- } catch (MessagingException me) {
- // report error for this message, but keep trying others
- if (me instanceof AuthenticationFailedException) {
- nc.showLoginFailedNotification(account.mId);
- }
- continue;
- }
- // 4. move to sent, or delete
- Uri syncedUri =
- ContentUris.withAppendedId(EmailContent.Message.SYNCED_CONTENT_URI, messageId);
- if (requireMoveMessageToSentFolder) {
- // If this is a forwarded message and it has attachments, delete them, as they
- // duplicate information found elsewhere (on the server). This saves storage.
- EmailContent.Message msg =
- EmailContent.Message.restoreMessageWithId(context, messageId);
- if (msg != null &&
- ((msg.mFlags & EmailContent.Message.FLAG_TYPE_FORWARD) != 0)) {
- AttachmentUtilities.deleteAllAttachmentFiles(context, account.mId,
- messageId);
- }
- int flags = msg.mFlags & ~(EmailContent.Message.FLAG_TYPE_REPLY |
- EmailContent.Message.FLAG_TYPE_FORWARD);
- moveToSentValues.put(EmailContent.MessageColumns.FLAGS, flags);
- resolver.update(syncedUri, moveToSentValues, null, null);
- } else {
- AttachmentUtilities.deleteAllAttachmentFiles(context, account.mId,
- messageId);
- Uri uri =
- ContentUris.withAppendedId(EmailContent.Message.CONTENT_URI, messageId);
- resolver.delete(uri, null, null);
- resolver.delete(syncedUri, null, null);
- }
- }
- nc.cancelLoginFailedNotification(account.mId);
- } catch (MessagingException me) {
- if (me instanceof AuthenticationFailedException) {
- nc.showLoginFailedNotification(account.mId);
- }
- } finally {
- c.close();
- }
-
- }
-}
diff --git a/email2/src/com/android/email/service/EmailServiceUtils.java b/email2/src/com/android/email/service/EmailServiceUtils.java
deleted file mode 100644
index 6c40cda8c..000000000
--- a/email2/src/com/android/email/service/EmailServiceUtils.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.email.R;
-import com.android.emailcommon.Api;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.service.EmailServiceProxy;
-import com.android.emailcommon.service.IEmailService;
-import com.android.emailcommon.service.IEmailServiceCallback;
-import com.android.emailcommon.service.SearchParams;
-import com.android.emailcommon.service.SyncWindow;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Utility functions for EmailService support.
- */
-public class EmailServiceUtils {
- private static final ArrayList<EmailServiceInfo> sServiceList =
- new ArrayList<EmailServiceInfo>();
-
- /**
- * Starts an EmailService by protocol
- */
- public static void startService(Context context, String protocol) {
- EmailServiceInfo info = getServiceInfo(context, protocol);
- if (info != null && info.intentAction != null) {
- context.startService(new Intent(info.intentAction));
- }
- }
-
- /**
- * Starts all remote services
- */
- public static void startRemoteServices(Context context) {
- for (EmailServiceInfo info: getServiceInfoList(context)) {
- if (info.intentAction != null) {
- context.startService(new Intent(info.intentAction));
- }
- }
- }
-
- /**
- * Returns whether or not remote services are present on device
- */
- public static boolean areRemoteServicesInstalled(Context context) {
- for (EmailServiceInfo info: getServiceInfoList(context)) {
- if (info.intentAction != null) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Starts all remote services
- */
- public static void setRemoteServicesLogging(Context context, int debugBits) {
- for (EmailServiceInfo info: getServiceInfoList(context)) {
- if (info.intentAction != null) {
- EmailServiceProxy service =
- EmailServiceUtils.getService(context, null, info.protocol);
- if (service != null) {
- try {
- service.setLogging(debugBits);
- } catch (RemoteException e) {
- // Move along, nothing to see
- }
- }
- }
- }
- }
-
- /**
- * Determine if the EmailService is available
- */
- public static boolean isServiceAvailable(Context context, String protocol) {
- EmailServiceInfo info = getServiceInfo(context, protocol);
- if (info == null) return false;
- if (info.klass != null) return true;
- return new EmailServiceProxy(context, info.intentAction, null).test();
- }
-
- /**
- * For a given account id, return a service proxy if applicable, or null.
- *
- * @param accountId the message of interest
- * @result service proxy, or null if n/a
- */
- public static EmailServiceProxy getServiceForAccount(Context context,
- IEmailServiceCallback callback, long accountId) {
- return getService(context, callback, Account.getProtocol(context, accountId));
- }
-
- /**
- * Holder of service information (currently just name and class/intent); if there is a class
- * member, this is a (local, i.e. same process) service; otherwise, this is a remote service
- */
- public static class EmailServiceInfo {
- public String protocol;
- public String name;
- public String accountType;
- Class<? extends Service> klass;
- String intentAction;
- public int port;
- public int portSsl;
- public boolean defaultSsl;
- public boolean offerTls;
- public boolean offerCerts;
- public boolean usesSmtp;
- public boolean offerLocalDeletes;
- public int defaultLocalDeletes;
- public boolean offerPrefix;
- public boolean usesAutodiscover;
- public boolean offerLookback;
- public int defaultLookback;
- public boolean syncChanges;
- public boolean syncContacts;
- public boolean syncCalendar;
- public boolean offerAttachmentPreload;
- public CharSequence[] syncIntervalStrings;
- public CharSequence[] syncIntervals;
- public int defaultSyncInterval;
-
- public String toString() {
- StringBuilder sb = new StringBuilder("Protocol: ");
- sb.append(protocol);
- sb.append(", ");
- sb.append(klass != null ? "Local" : "Remote");
- return sb.toString();
- }
- }
-
- public static EmailServiceProxy getService(Context context, IEmailServiceCallback callback,
- String protocol) {
- // Handle the degenerate case here (account might have been deleted)
- if (protocol == null) {
- Log.w(Logging.LOG_TAG, "Returning NullService for " + protocol);
- return new EmailServiceProxy(context, NullService.class, null);
- }
- EmailServiceInfo info = getServiceInfo(context, protocol);
- if (info.klass != null) {
- return new EmailServiceProxy(context, info.klass, callback);
- } else {
- return new EmailServiceProxy(context, info.intentAction, callback);
- }
- }
-
- public static EmailServiceInfo getServiceInfo(Context context, String protocol) {
- if (sServiceList.isEmpty()) {
- findServices(context);
- }
- for (EmailServiceInfo info: sServiceList) {
- if (info.protocol.equals(protocol)) {
- return info;
- }
- }
- return null;
- }
-
- public static List<EmailServiceInfo> getServiceInfoList(Context context) {
- if (sServiceList.isEmpty()) {
- findServices(context);
- }
- return sServiceList;
- }
-
- /**
- * Parse services.xml file to find our available email services
- */
- @SuppressWarnings("unchecked")
- private static void findServices(Context context) {
- try {
- Resources res = context.getResources();
- XmlResourceParser xml = res.getXml(R.xml.services);
- int xmlEventType;
- // walk through senders.xml file.
- while ((xmlEventType = xml.next()) != XmlResourceParser.END_DOCUMENT) {
- if (xmlEventType == XmlResourceParser.START_TAG &&
- "emailservice".equals(xml.getName())) {
- EmailServiceInfo info = new EmailServiceInfo();
- TypedArray ta = res.obtainAttributes(xml, R.styleable.EmailServiceInfo);
- info.protocol = ta.getString(R.styleable.EmailServiceInfo_protocol);
- info.name = ta.getString(R.styleable.EmailServiceInfo_name);
- String klass = ta.getString(R.styleable.EmailServiceInfo_serviceClass);
- info.intentAction = ta.getString(R.styleable.EmailServiceInfo_intent);
- info.accountType = ta.getString(R.styleable.EmailServiceInfo_accountType);
- info.defaultSsl = ta.getBoolean(R.styleable.EmailServiceInfo_defaultSsl, false);
- info.port = ta.getInteger(R.styleable.EmailServiceInfo_port, 0);
- info.portSsl = ta.getInteger(R.styleable.EmailServiceInfo_portSsl, 0);
- info.offerTls = ta.getBoolean(R.styleable.EmailServiceInfo_offerTls, false);
- info.offerCerts = ta.getBoolean(R.styleable.EmailServiceInfo_offerCerts, false);
- info.offerLocalDeletes =
- ta.getBoolean(R.styleable.EmailServiceInfo_offerLocalDeletes, false);
- info.defaultLocalDeletes =
- ta.getInteger(R.styleable.EmailServiceInfo_defaultLocalDeletes,
- Account.DELETE_POLICY_ON_DELETE);
- info.offerPrefix =
- ta.getBoolean(R.styleable.EmailServiceInfo_offerPrefix, false);
- info.usesSmtp = ta.getBoolean(R.styleable.EmailServiceInfo_usesSmtp, false);
- info.usesAutodiscover =
- ta.getBoolean(R.styleable.EmailServiceInfo_usesAutodiscover, false);
- info.offerLookback =
- ta.getBoolean(R.styleable.EmailServiceInfo_offerLookback, false);
- info.defaultLookback =
- ta.getInteger(R.styleable.EmailServiceInfo_defaultLookback,
- SyncWindow.SYNC_WINDOW_3_DAYS);
- info.syncChanges =
- ta.getBoolean(R.styleable.EmailServiceInfo_syncChanges, false);
- info.syncContacts =
- ta.getBoolean(R.styleable.EmailServiceInfo_syncContacts, false);
- info.syncCalendar =
- ta.getBoolean(R.styleable.EmailServiceInfo_syncCalendar, false);
- info.offerAttachmentPreload =
- ta.getBoolean(R.styleable.EmailServiceInfo_offerAttachmentPreload, false);
- info.syncIntervalStrings =
- ta.getTextArray(R.styleable.EmailServiceInfo_syncIntervalStrings);
- info.syncIntervals =
- ta.getTextArray(R.styleable.EmailServiceInfo_syncIntervals);
- info.defaultSyncInterval =
- ta.getInteger(R.styleable.EmailServiceInfo_defaultSyncInterval, 15);
-
- // Must have either "class" (local) or "intent" (remote)
- if (klass != null) {
- try {
- info.klass = (Class<? extends Service>) Class.forName(klass);
- } catch (ClassNotFoundException e) {
- throw new IllegalStateException(
- "Class not found in service descriptor: " + klass);
- }
- }
- if (info.klass == null && info.intentAction == null) {
- throw new IllegalStateException(
- "No class or intent action specified in service descriptor");
- }
- if (info.klass != null && info.intentAction != null) {
- throw new IllegalStateException(
- "Both class and intent action specified in service descriptor");
- }
- sServiceList.add(info);
- }
- }
- } catch (XmlPullParserException e) {
- // ignore
- } catch (IOException e) {
- // ignore
- }
- }
-
- /**
- * A no-op service that can be returned for non-existent/null protocols
- */
- class NullService implements IEmailService {
- @Override
- public IBinder asBinder() {
- return null;
- }
-
- @Override
- public Bundle validate(HostAuth hostauth) throws RemoteException {
- return null;
- }
-
- @Override
- public void startSync(long mailboxId, boolean userRequest) throws RemoteException {
- }
-
- @Override
- public void stopSync(long mailboxId) throws RemoteException {
- }
-
- @Override
- public void loadMore(long messageId) throws RemoteException {
- }
-
- @Override
- public void loadAttachment(long attachmentId, boolean background) throws RemoteException {
- }
-
- @Override
- public void updateFolderList(long accountId) throws RemoteException {
- }
-
- @Override
- public boolean createFolder(long accountId, String name) throws RemoteException {
- return false;
- }
-
- @Override
- public boolean deleteFolder(long accountId, String name) throws RemoteException {
- return false;
- }
-
- @Override
- public boolean renameFolder(long accountId, String oldName, String newName)
- throws RemoteException {
- return false;
- }
-
- @Override
- public void setCallback(IEmailServiceCallback cb) throws RemoteException {
- }
-
- @Override
- public void setLogging(int on) throws RemoteException {
- }
-
- @Override
- public void hostChanged(long accountId) throws RemoteException {
- }
-
- @Override
- public Bundle autoDiscover(String userName, String password) throws RemoteException {
- return null;
- }
-
- @Override
- public void sendMeetingResponse(long messageId, int response) throws RemoteException {
- }
-
- @Override
- public void deleteAccountPIMData(long accountId) throws RemoteException {
- }
-
- @Override
- public int getApiLevel() throws RemoteException {
- return Api.LEVEL;
- }
-
- @Override
- public int searchMessages(long accountId, SearchParams params, long destMailboxId)
- throws RemoteException {
- return 0;
- }
-
- @Override
- public void sendMail(long accountId) throws RemoteException {
- }
-
- @Override
- public int getCapabilities(long accountId) throws RemoteException {
- return 0;
- }
- }
-}
diff --git a/email2/src/com/android/email/service/ImapService.java b/email2/src/com/android/email/service/ImapService.java
deleted file mode 100644
index 693f419b0..000000000
--- a/email2/src/com/android/email/service/ImapService.java
+++ /dev/null
@@ -1,1396 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import android.app.Service;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.TrafficStats;
-import android.net.Uri;
-import android.os.IBinder;
-import android.os.RemoteCallbackList;
-import android.os.RemoteException;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.email.LegacyConversions;
-import com.android.email.NotificationController;
-import com.android.email.mail.Store;
-import com.android.email.provider.Utilities;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.TrafficFlags;
-import com.android.emailcommon.internet.MimeUtility;
-import com.android.emailcommon.mail.AuthenticationFailedException;
-import com.android.emailcommon.mail.FetchProfile;
-import com.android.emailcommon.mail.Flag;
-import com.android.emailcommon.mail.Folder;
-import com.android.emailcommon.mail.Folder.FolderType;
-import com.android.emailcommon.mail.Folder.MessageRetrievalListener;
-import com.android.emailcommon.mail.Folder.MessageUpdateCallbacks;
-import com.android.emailcommon.mail.Folder.OpenMode;
-import com.android.emailcommon.mail.Message;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.mail.Part;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.emailcommon.provider.EmailContent.SyncColumns;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.service.EmailServiceStatus;
-import com.android.emailcommon.service.IEmailServiceCallback;
-import com.android.emailcommon.service.SearchParams;
-import com.android.emailcommon.utility.AttachmentUtilities;
-import com.android.mail.providers.UIProvider.AccountCapabilities;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-
-public class ImapService extends Service {
- private static final String TAG = "ImapService";
- private static final int MAX_SMALL_MESSAGE_SIZE = (25 * 1024);
-
- private static final Flag[] FLAG_LIST_SEEN = new Flag[] { Flag.SEEN };
- private static final Flag[] FLAG_LIST_FLAGGED = new Flag[] { Flag.FLAGGED };
- private static final Flag[] FLAG_LIST_ANSWERED = new Flag[] { Flag.ANSWERED };
-
- /**
- * Simple cache for last search result mailbox by account and serverId, since the most common
- * case will be repeated use of the same mailbox
- */
- private static long mLastSearchAccountKey = Account.NO_ACCOUNT;
- private static String mLastSearchServerId = null;
- private static Mailbox mLastSearchRemoteMailbox = null;
-
- /**
- * Cache search results by account; this allows for "load more" support without having to
- * redo the search (which can be quite slow). SortableMessage is a smallish class, so memory
- * shouldn't be an issue
- */
- private static final HashMap<Long, SortableMessage[]> sSearchResults =
- new HashMap<Long, SortableMessage[]>();
-
- /**
- * We write this into the serverId field of messages that will never be upsynced.
- */
- private static final String LOCAL_SERVERID_PREFIX = "Local-";
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- return Service.START_STICKY;
- }
-
- // Callbacks as set up via setCallback
- private static final RemoteCallbackList<IEmailServiceCallback> mCallbackList =
- new RemoteCallbackList<IEmailServiceCallback>();
-
- private interface ServiceCallbackWrapper {
- public void call(IEmailServiceCallback cb) throws RemoteException;
- }
-
- /**
- * Proxy that can be used by various sync adapters to tie into ExchangeService's callback system
- * Used this way: ExchangeService.callback().callbackMethod(args...);
- * The proxy wraps checking for existence of a ExchangeService instance
- * Failures of these callbacks can be safely ignored.
- */
- static private final IEmailServiceCallback.Stub sCallbackProxy =
- new IEmailServiceCallback.Stub() {
-
- /**
- * Broadcast a callback to the everyone that's registered
- *
- * @param wrapper the ServiceCallbackWrapper used in the broadcast
- */
- private synchronized void broadcastCallback(ServiceCallbackWrapper wrapper) {
- RemoteCallbackList<IEmailServiceCallback> callbackList = mCallbackList;
- if (callbackList != null) {
- // Call everyone on our callback list
- int count = callbackList.beginBroadcast();
- try {
- for (int i = 0; i < count; i++) {
- try {
- wrapper.call(callbackList.getBroadcastItem(i));
- } catch (RemoteException e) {
- // Safe to ignore
- } catch (RuntimeException e) {
- // We don't want an exception in one call to prevent other calls, so
- // we'll just log this and continue
- Log.e(TAG, "Caught RuntimeException in broadcast", e);
- }
- }
- } finally {
- // No matter what, we need to finish the broadcast
- callbackList.finishBroadcast();
- }
- }
- }
-
- @Override
- public void loadAttachmentStatus(final long messageId, final long attachmentId,
- final int status, final int progress) {
- broadcastCallback(new ServiceCallbackWrapper() {
- @Override
- public void call(IEmailServiceCallback cb) throws RemoteException {
- cb.loadAttachmentStatus(messageId, attachmentId, status, progress);
- }
- });
- }
-
- @Override
- public void loadMessageStatus(final long messageId, final int status, final int progress) {
- broadcastCallback(new ServiceCallbackWrapper() {
- @Override
- public void call(IEmailServiceCallback cb) throws RemoteException {
- cb.loadMessageStatus(messageId, status, progress);
- }
- });
- }
-
- @Override
- public void sendMessageStatus(final long messageId, final String subject, final int status,
- final int progress) {
- broadcastCallback(new ServiceCallbackWrapper() {
- @Override
- public void call(IEmailServiceCallback cb) throws RemoteException {
- cb.sendMessageStatus(messageId, subject, status, progress);
- }
- });
- }
-
- @Override
- public void syncMailboxListStatus(final long accountId, final int status,
- final int progress) {
- broadcastCallback(new ServiceCallbackWrapper() {
- @Override
- public void call(IEmailServiceCallback cb) throws RemoteException {
- cb.syncMailboxListStatus(accountId, status, progress);
- }
- });
- }
-
- @Override
- public void syncMailboxStatus(final long mailboxId, final int status,
- final int progress) {
- broadcastCallback(new ServiceCallbackWrapper() {
- @Override
- public void call(IEmailServiceCallback cb) throws RemoteException {
- cb.syncMailboxStatus(mailboxId, status, progress);
- }
- });
- }
- };
-
- /**
- * Create our EmailService implementation here.
- */
- private final EmailServiceStub mBinder = new EmailServiceStub() {
-
- @Override
- public void setCallback(IEmailServiceCallback cb) throws RemoteException {
- mCallbackList.register(cb);
- }
-
- @Override
- public void loadMore(long messageId) throws RemoteException {
- // We don't do "loadMore" for IMAP messages; the sync should handle this
- }
-
- @Override
- public int searchMessages(long accountId, SearchParams searchParams, long destMailboxId) {
- try {
- return searchMailboxImpl(getApplicationContext(), accountId, searchParams,
- destMailboxId);
- } catch (MessagingException e) {
- }
- return 0;
- }
-
- @Override
- public int getCapabilities(long accountId) throws RemoteException {
- return AccountCapabilities.SYNCABLE_FOLDERS |
- AccountCapabilities.FOLDER_SERVER_SEARCH |
- AccountCapabilities.UNDO;
- }
- };
-
- @Override
- public IBinder onBind(Intent intent) {
- mBinder.init(this, sCallbackProxy);
- return mBinder;
- }
-
- private static void sendMailboxStatus(Mailbox mailbox, int status) {
- try {
- sCallbackProxy.syncMailboxStatus(mailbox.mId, status, 0);
- } catch (RemoteException e) {
- }
- }
-
- /**
- * Start foreground synchronization of the specified folder. This is called by
- * synchronizeMailbox or checkMail.
- * TODO this should use ID's instead of fully-restored objects
- * @param account
- * @param folder
- * @throws MessagingException
- */
- public static void synchronizeMailboxSynchronous(Context context, final Account account,
- final Mailbox folder) throws MessagingException {
- sendMailboxStatus(folder, EmailServiceStatus.IN_PROGRESS);
-
- TrafficStats.setThreadStatsTag(TrafficFlags.getSyncFlags(context, account));
- if ((folder.mFlags & Mailbox.FLAG_HOLDS_MAIL) == 0) {
- sendMailboxStatus(folder, EmailServiceStatus.SUCCESS);
- }
- NotificationController nc = NotificationController.getInstance(context);
- try {
- processPendingActionsSynchronous(context, account);
- synchronizeMailboxGeneric(context, account, folder);
- // Clear authentication notification for this account
- nc.cancelLoginFailedNotification(account.mId);
- sendMailboxStatus(folder, EmailServiceStatus.SUCCESS);
- } catch (MessagingException e) {
- if (Logging.LOGD) {
- Log.v(Logging.LOG_TAG, "synchronizeMailbox", e);
- }
- if (e instanceof AuthenticationFailedException) {
- // Generate authentication notification
- nc.showLoginFailedNotification(account.mId);
- }
- sendMailboxStatus(folder, e.getExceptionType());
- throw e;
- }
- }
-
- /**
- * Lightweight record for the first pass of message sync, where I'm just seeing if
- * the local message requires sync. Later (for messages that need syncing) we'll do a full
- * readout from the DB.
- */
- private static class LocalMessageInfo {
- private static final int COLUMN_ID = 0;
- private static final int COLUMN_FLAG_READ = 1;
- private static final int COLUMN_FLAG_FAVORITE = 2;
- private static final int COLUMN_FLAG_LOADED = 3;
- private static final int COLUMN_SERVER_ID = 4;
- private static final int COLUMN_FLAGS = 7;
- private static final String[] PROJECTION = new String[] {
- EmailContent.RECORD_ID,
- MessageColumns.FLAG_READ, MessageColumns.FLAG_FAVORITE, MessageColumns.FLAG_LOADED,
- SyncColumns.SERVER_ID, MessageColumns.MAILBOX_KEY, MessageColumns.ACCOUNT_KEY,
- MessageColumns.FLAGS
- };
-
- final long mId;
- final boolean mFlagRead;
- final boolean mFlagFavorite;
- final int mFlagLoaded;
- final String mServerId;
- final int mFlags;
-
- public LocalMessageInfo(Cursor c) {
- mId = c.getLong(COLUMN_ID);
- mFlagRead = c.getInt(COLUMN_FLAG_READ) != 0;
- mFlagFavorite = c.getInt(COLUMN_FLAG_FAVORITE) != 0;
- mFlagLoaded = c.getInt(COLUMN_FLAG_LOADED);
- mServerId = c.getString(COLUMN_SERVER_ID);
- mFlags = c.getInt(COLUMN_FLAGS);
- // Note: mailbox key and account key not needed - they are projected for the SELECT
- }
- }
-
- /**
- * Load the structure and body of messages not yet synced
- * @param account the account we're syncing
- * @param remoteFolder the (open) Folder we're working on
- * @param unsyncedMessages an array of Message's we've got headers for
- * @param toMailbox the destination mailbox we're syncing
- * @throws MessagingException
- */
- static void loadUnsyncedMessages(final Context context, final Account account,
- Folder remoteFolder, ArrayList<Message> messages, final Mailbox toMailbox)
- throws MessagingException {
-
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.STRUCTURE);
- remoteFolder.fetch(messages.toArray(new Message[messages.size()]), fp, null);
- for (Message message : messages) {
- // Build a list of parts we are interested in. Text parts will be downloaded
- // right now, attachments will be left for later.
- ArrayList<Part> viewables = new ArrayList<Part>();
- ArrayList<Part> attachments = new ArrayList<Part>();
- MimeUtility.collectParts(message, viewables, attachments);
- // Download the viewables immediately
- for (Part part : viewables) {
- fp.clear();
- fp.add(part);
- remoteFolder.fetch(new Message[] { message }, fp, null);
- }
- // Store the updated message locally and mark it fully loaded
- Utilities.copyOneMessageToProvider(context, message, account, toMailbox,
- EmailContent.Message.FLAG_LOADED_COMPLETE);
- }
- }
-
- public static void downloadFlagAndEnvelope(final Context context, final Account account,
- final Mailbox mailbox, Folder remoteFolder, ArrayList<Message> unsyncedMessages,
- HashMap<String, LocalMessageInfo> localMessageMap, final ArrayList<Long> unseenMessages)
- throws MessagingException {
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.FLAGS);
- fp.add(FetchProfile.Item.ENVELOPE);
-
- final HashMap<String, LocalMessageInfo> localMapCopy;
- if (localMessageMap != null)
- localMapCopy = new HashMap<String, LocalMessageInfo>(localMessageMap);
- else {
- localMapCopy = new HashMap<String, LocalMessageInfo>();
- }
-
- remoteFolder.fetch(unsyncedMessages.toArray(new Message[0]), fp,
- new MessageRetrievalListener() {
- @Override
- public void messageRetrieved(Message message) {
- try {
- // Determine if the new message was already known (e.g. partial)
- // And create or reload the full message info
- LocalMessageInfo localMessageInfo =
- localMapCopy.get(message.getUid());
- EmailContent.Message localMessage = null;
- if (localMessageInfo == null) {
- localMessage = new EmailContent.Message();
- } else {
- localMessage = EmailContent.Message.restoreMessageWithId(
- context, localMessageInfo.mId);
- }
-
- if (localMessage != null) {
- try {
- // Copy the fields that are available into the message
- LegacyConversions.updateMessageFields(localMessage,
- message, account.mId, mailbox.mId);
- // Commit the message to the local store
- Utilities.saveOrUpdate(localMessage, context);
- // Track the "new" ness of the downloaded message
- if (!message.isSet(Flag.SEEN) && unseenMessages != null) {
- unseenMessages.add(localMessage.mId);
- }
- } catch (MessagingException me) {
- Log.e(Logging.LOG_TAG,
- "Error while copying downloaded message." + me);
- }
-
- }
- }
- catch (Exception e) {
- Log.e(Logging.LOG_TAG,
- "Error while storing downloaded message." + e.toString());
- }
- }
-
- @Override
- public void loadAttachmentProgress(int progress) {
- }
- });
-
- }
-
- /**
- * Synchronizer for IMAP.
- *
- * TODO Break this method up into smaller chunks.
- *
- * @param account the account to sync
- * @param mailbox the mailbox to sync
- * @return results of the sync pass
- * @throws MessagingException
- */
- private static void synchronizeMailboxGeneric(final Context context,
- final Account account, final Mailbox mailbox) throws MessagingException {
-
- /*
- * A list of IDs for messages that were downloaded and did not have the seen flag set.
- * This serves as the "true" new message count reported to the user via notification.
- */
- final ArrayList<Long> unseenMessages = new ArrayList<Long>();
-
- ContentResolver resolver = context.getContentResolver();
-
- // 0. We do not ever sync DRAFTS or OUTBOX (down or up)
- if (mailbox.mType == Mailbox.TYPE_DRAFTS || mailbox.mType == Mailbox.TYPE_OUTBOX) {
- return;
- }
-
- // 1. Get the message list from the local store and create an index of the uids
-
- Cursor localUidCursor = null;
- HashMap<String, LocalMessageInfo> localMessageMap = new HashMap<String, LocalMessageInfo>();
-
- try {
- localUidCursor = resolver.query(
- EmailContent.Message.CONTENT_URI,
- LocalMessageInfo.PROJECTION,
- EmailContent.MessageColumns.ACCOUNT_KEY + "=?" +
- " AND " + MessageColumns.MAILBOX_KEY + "=?",
- new String[] {
- String.valueOf(account.mId),
- String.valueOf(mailbox.mId)
- },
- null);
- while (localUidCursor.moveToNext()) {
- LocalMessageInfo info = new LocalMessageInfo(localUidCursor);
- localMessageMap.put(info.mServerId, info);
- }
- } finally {
- if (localUidCursor != null) {
- localUidCursor.close();
- }
- }
-
- // 2. Open the remote folder and create the remote folder if necessary
-
- Store remoteStore = Store.getInstance(account, context);
- // The account might have been deleted
- if (remoteStore == null) return;
- Folder remoteFolder = remoteStore.getFolder(mailbox.mServerId);
-
- /*
- * If the folder is a "special" folder we need to see if it exists
- * on the remote server. It if does not exist we'll try to create it. If we
- * can't create we'll abort. This will happen on every single Pop3 folder as
- * designed and on Imap folders during error conditions. This allows us
- * to treat Pop3 and Imap the same in this code.
- */
- if (mailbox.mType == Mailbox.TYPE_TRASH || mailbox.mType == Mailbox.TYPE_SENT
- || mailbox.mType == Mailbox.TYPE_DRAFTS) {
- if (!remoteFolder.exists()) {
- if (!remoteFolder.create(FolderType.HOLDS_MESSAGES)) {
- return;
- }
- }
- }
-
- // 3, Open the remote folder. This pre-loads certain metadata like message count.
- remoteFolder.open(OpenMode.READ_WRITE);
-
- // 4. Trash any remote messages that are marked as trashed locally.
- // TODO - this comment was here, but no code was here.
-
- // 5. Get the remote message count.
- int remoteMessageCount = remoteFolder.getMessageCount();
- ContentValues values = new ContentValues();
- values.put(MailboxColumns.TOTAL_COUNT, remoteMessageCount);
- mailbox.update(context, values);
-
- // 6. Determine the limit # of messages to download
- int visibleLimit = mailbox.mVisibleLimit;
- if (visibleLimit <= 0) {
- visibleLimit = MailActivityEmail.VISIBLE_LIMIT_DEFAULT;
- }
-
- // 7. Create a list of messages to download
- Message[] remoteMessages = new Message[0];
- final ArrayList<Message> unsyncedMessages = new ArrayList<Message>();
- HashMap<String, Message> remoteUidMap = new HashMap<String, Message>();
-
- if (remoteMessageCount > 0) {
- /*
- * Message numbers start at 1.
- */
- int remoteStart = Math.max(0, remoteMessageCount - visibleLimit) + 1;
- int remoteEnd = remoteMessageCount;
- remoteMessages = remoteFolder.getMessages(remoteStart, remoteEnd, null);
- // TODO Why are we running through the list twice? Combine w/ for loop below
- for (Message message : remoteMessages) {
- remoteUidMap.put(message.getUid(), message);
- }
-
- /*
- * Get a list of the messages that are in the remote list but not on the
- * local store, or messages that are in the local store but failed to download
- * on the last sync. These are the new messages that we will download.
- * Note, we also skip syncing messages which are flagged as "deleted message" sentinels,
- * because they are locally deleted and we don't need or want the old message from
- * the server.
- */
- for (Message message : remoteMessages) {
- LocalMessageInfo localMessage = localMessageMap.get(message.getUid());
- // localMessage == null -> message has never been created (not even headers)
- // mFlagLoaded = UNLOADED -> message created, but none of body loaded
- // mFlagLoaded = PARTIAL -> message created, a "sane" amt of body has been loaded
- // mFlagLoaded = COMPLETE -> message body has been completely loaded
- // mFlagLoaded = DELETED -> message has been deleted
- // Only the first two of these are "unsynced", so let's retrieve them
- if (localMessage == null ||
- (localMessage.mFlagLoaded == EmailContent.Message.FLAG_LOADED_UNLOADED) ||
- (localMessage.mFlagLoaded == EmailContent.Message.FLAG_LOADED_PARTIAL)) {
- unsyncedMessages.add(message);
- }
- }
- }
-
- // 8. Download basic info about the new/unloaded messages (if any)
- /*
- * Fetch the flags and envelope only of the new messages. This is intended to get us
- * critical data as fast as possible, and then we'll fill in the details.
- */
- if (unsyncedMessages.size() > 0) {
- downloadFlagAndEnvelope(context, account, mailbox, remoteFolder, unsyncedMessages,
- localMessageMap, unseenMessages);
- }
-
- // 9. Refresh the flags for any messages in the local store that we didn't just download.
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.FLAGS);
- remoteFolder.fetch(remoteMessages, fp, null);
- boolean remoteSupportsSeen = false;
- boolean remoteSupportsFlagged = false;
- boolean remoteSupportsAnswered = false;
- for (Flag flag : remoteFolder.getPermanentFlags()) {
- if (flag == Flag.SEEN) {
- remoteSupportsSeen = true;
- }
- if (flag == Flag.FLAGGED) {
- remoteSupportsFlagged = true;
- }
- if (flag == Flag.ANSWERED) {
- remoteSupportsAnswered = true;
- }
- }
- // Update SEEN/FLAGGED/ANSWERED (star) flags (if supported remotely - e.g. not for POP3)
- if (remoteSupportsSeen || remoteSupportsFlagged || remoteSupportsAnswered) {
- for (Message remoteMessage : remoteMessages) {
- LocalMessageInfo localMessageInfo = localMessageMap.get(remoteMessage.getUid());
- if (localMessageInfo == null) {
- continue;
- }
- boolean localSeen = localMessageInfo.mFlagRead;
- boolean remoteSeen = remoteMessage.isSet(Flag.SEEN);
- boolean newSeen = (remoteSupportsSeen && (remoteSeen != localSeen));
- boolean localFlagged = localMessageInfo.mFlagFavorite;
- boolean remoteFlagged = remoteMessage.isSet(Flag.FLAGGED);
- boolean newFlagged = (remoteSupportsFlagged && (localFlagged != remoteFlagged));
- int localFlags = localMessageInfo.mFlags;
- boolean localAnswered = (localFlags & EmailContent.Message.FLAG_REPLIED_TO) != 0;
- boolean remoteAnswered = remoteMessage.isSet(Flag.ANSWERED);
- boolean newAnswered = (remoteSupportsAnswered && (localAnswered != remoteAnswered));
- if (newSeen || newFlagged || newAnswered) {
- Uri uri = ContentUris.withAppendedId(
- EmailContent.Message.CONTENT_URI, localMessageInfo.mId);
- ContentValues updateValues = new ContentValues();
- updateValues.put(MessageColumns.FLAG_READ, remoteSeen);
- updateValues.put(MessageColumns.FLAG_FAVORITE, remoteFlagged);
- if (remoteAnswered) {
- localFlags |= EmailContent.Message.FLAG_REPLIED_TO;
- } else {
- localFlags &= ~EmailContent.Message.FLAG_REPLIED_TO;
- }
- updateValues.put(MessageColumns.FLAGS, localFlags);
- resolver.update(uri, updateValues, null, null);
- }
- }
- }
-
- // 10. Remove any messages that are in the local store but no longer on the remote store.
- HashSet<String> localUidsToDelete = new HashSet<String>(localMessageMap.keySet());
- localUidsToDelete.removeAll(remoteUidMap.keySet());
- for (String uidToDelete : localUidsToDelete) {
- LocalMessageInfo infoToDelete = localMessageMap.get(uidToDelete);
-
- // Delete associated data (attachment files)
- // Attachment & Body records are auto-deleted when we delete the Message record
- AttachmentUtilities.deleteAllAttachmentFiles(context, account.mId,
- infoToDelete.mId);
-
- // Delete the message itself
- Uri uriToDelete = ContentUris.withAppendedId(
- EmailContent.Message.CONTENT_URI, infoToDelete.mId);
- resolver.delete(uriToDelete, null, null);
-
- // Delete extra rows (e.g. synced or deleted)
- Uri syncRowToDelete = ContentUris.withAppendedId(
- EmailContent.Message.UPDATED_CONTENT_URI, infoToDelete.mId);
- resolver.delete(syncRowToDelete, null, null);
- Uri deletERowToDelete = ContentUris.withAppendedId(
- EmailContent.Message.UPDATED_CONTENT_URI, infoToDelete.mId);
- resolver.delete(deletERowToDelete, null, null);
- }
-
- loadUnsyncedMessages(context, account, remoteFolder, unsyncedMessages, mailbox);
-
- // 14. Clean up and report results
- remoteFolder.close(false);
- }
-
- /**
- * Find messages in the updated table that need to be written back to server.
- *
- * Handles:
- * Read/Unread
- * Flagged
- * Append (upload)
- * Move To Trash
- * Empty trash
- * TODO:
- * Move
- *
- * @param account the account to scan for pending actions
- * @throws MessagingException
- */
- private static void processPendingActionsSynchronous(Context context, Account account)
- throws MessagingException {
- TrafficStats.setThreadStatsTag(TrafficFlags.getSyncFlags(context, account));
- String[] accountIdArgs = new String[] { Long.toString(account.mId) };
-
- // Handle deletes first, it's always better to get rid of things first
- processPendingDeletesSynchronous(context, account, accountIdArgs);
-
- // Handle uploads (currently, only to sent messages)
- processPendingUploadsSynchronous(context, account, accountIdArgs);
-
- // Now handle updates / upsyncs
- processPendingUpdatesSynchronous(context, account, accountIdArgs);
- }
-
- /**
- * Get the mailbox corresponding to the remote location of a message; this will normally be
- * the mailbox whose _id is mailboxKey, except for search results, where we must look it up
- * by serverId
- * @param message the message in question
- * @return the mailbox in which the message resides on the server
- */
- private static Mailbox getRemoteMailboxForMessage(Context context,
- EmailContent.Message message) {
- // If this is a search result, use the protocolSearchInfo field to get the server info
- if (!TextUtils.isEmpty(message.mProtocolSearchInfo)) {
- long accountKey = message.mAccountKey;
- String protocolSearchInfo = message.mProtocolSearchInfo;
- if (accountKey == mLastSearchAccountKey &&
- protocolSearchInfo.equals(mLastSearchServerId)) {
- return mLastSearchRemoteMailbox;
- }
- Cursor c = context.getContentResolver().query(Mailbox.CONTENT_URI,
- Mailbox.CONTENT_PROJECTION, Mailbox.PATH_AND_ACCOUNT_SELECTION,
- new String[] {protocolSearchInfo, Long.toString(accountKey)},
- null);
- try {
- if (c.moveToNext()) {
- Mailbox mailbox = new Mailbox();
- mailbox.restore(c);
- mLastSearchAccountKey = accountKey;
- mLastSearchServerId = protocolSearchInfo;
- mLastSearchRemoteMailbox = mailbox;
- return mailbox;
- } else {
- return null;
- }
- } finally {
- c.close();
- }
- } else {
- return Mailbox.restoreMailboxWithId(context, message.mMailboxKey);
- }
- }
-
- /**
- * Scan for messages that are in the Message_Deletes table, look for differences that
- * we can deal with, and do the work.
- *
- * @param account
- * @param resolver
- * @param accountIdArgs
- */
- private static void processPendingDeletesSynchronous(Context context, Account account,
- String[] accountIdArgs) {
- Cursor deletes = context.getContentResolver().query(
- EmailContent.Message.DELETED_CONTENT_URI,
- EmailContent.Message.CONTENT_PROJECTION,
- EmailContent.MessageColumns.ACCOUNT_KEY + "=?", accountIdArgs,
- EmailContent.MessageColumns.MAILBOX_KEY);
- long lastMessageId = -1;
- try {
- // Defer setting up the store until we know we need to access it
- Store remoteStore = null;
- // loop through messages marked as deleted
- while (deletes.moveToNext()) {
- boolean deleteFromTrash = false;
-
- EmailContent.Message oldMessage =
- EmailContent.getContent(deletes, EmailContent.Message.class);
-
- if (oldMessage != null) {
- lastMessageId = oldMessage.mId;
-
- Mailbox mailbox = getRemoteMailboxForMessage(context, oldMessage);
- if (mailbox == null) {
- continue; // Mailbox removed. Move to the next message.
- }
- deleteFromTrash = mailbox.mType == Mailbox.TYPE_TRASH;
-
- // Load the remote store if it will be needed
- if (remoteStore == null && deleteFromTrash) {
- remoteStore = Store.getInstance(account, context);
- }
-
- // Dispatch here for specific change types
- if (deleteFromTrash) {
- // Move message to trash
- processPendingDeleteFromTrash(context, remoteStore, account, mailbox,
- oldMessage);
- }
- }
-
- // Finally, delete the update
- Uri uri = ContentUris.withAppendedId(EmailContent.Message.DELETED_CONTENT_URI,
- oldMessage.mId);
- context.getContentResolver().delete(uri, null, null);
- }
- } catch (MessagingException me) {
- // Presumably an error here is an account connection failure, so there is
- // no point in continuing through the rest of the pending updates.
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "Unable to process pending delete for id="
- + lastMessageId + ": " + me);
- }
- } finally {
- deletes.close();
- }
- }
-
- /**
- * Scan for messages that are in Sent, and are in need of upload,
- * and send them to the server. "In need of upload" is defined as:
- * serverId == null (no UID has been assigned)
- * or
- * message is in the updated list
- *
- * Note we also look for messages that are moving from drafts->outbox->sent. They never
- * go through "drafts" or "outbox" on the server, so we hang onto these until they can be
- * uploaded directly to the Sent folder.
- *
- * @param account
- * @param resolver
- * @param accountIdArgs
- */
- private static void processPendingUploadsSynchronous(Context context, Account account,
- String[] accountIdArgs) {
- ContentResolver resolver = context.getContentResolver();
- // Find the Sent folder (since that's all we're uploading for now
- Cursor mailboxes = resolver.query(Mailbox.CONTENT_URI, Mailbox.ID_PROJECTION,
- MailboxColumns.ACCOUNT_KEY + "=?"
- + " and " + MailboxColumns.TYPE + "=" + Mailbox.TYPE_SENT,
- accountIdArgs, null);
- long lastMessageId = -1;
- try {
- // Defer setting up the store until we know we need to access it
- Store remoteStore = null;
- while (mailboxes.moveToNext()) {
- long mailboxId = mailboxes.getLong(Mailbox.ID_PROJECTION_COLUMN);
- String[] mailboxKeyArgs = new String[] { Long.toString(mailboxId) };
- // Demand load mailbox
- Mailbox mailbox = null;
-
- // First handle the "new" messages (serverId == null)
- Cursor upsyncs1 = resolver.query(EmailContent.Message.CONTENT_URI,
- EmailContent.Message.ID_PROJECTION,
- EmailContent.Message.MAILBOX_KEY + "=?"
- + " and (" + EmailContent.Message.SERVER_ID + " is null"
- + " or " + EmailContent.Message.SERVER_ID + "=''" + ")",
- mailboxKeyArgs,
- null);
- try {
- while (upsyncs1.moveToNext()) {
- // Load the remote store if it will be needed
- if (remoteStore == null) {
- remoteStore = Store.getInstance(account, context);
- }
- // Load the mailbox if it will be needed
- if (mailbox == null) {
- mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
- if (mailbox == null) {
- continue; // Mailbox removed. Move to the next message.
- }
- }
- // upsync the message
- long id = upsyncs1.getLong(EmailContent.Message.ID_PROJECTION_COLUMN);
- lastMessageId = id;
- processUploadMessage(context, remoteStore, account, mailbox, id);
- }
- } finally {
- if (upsyncs1 != null) {
- upsyncs1.close();
- }
- }
-
- // Next, handle any updates (e.g. edited in place, although this shouldn't happen)
- Cursor upsyncs2 = resolver.query(EmailContent.Message.UPDATED_CONTENT_URI,
- EmailContent.Message.ID_PROJECTION,
- EmailContent.MessageColumns.MAILBOX_KEY + "=?", mailboxKeyArgs,
- null);
- try {
- while (upsyncs2.moveToNext()) {
- // Load the remote store if it will be needed
- if (remoteStore == null) {
- remoteStore = Store.getInstance(account, context);
- }
- // Load the mailbox if it will be needed
- if (mailbox == null) {
- mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
- if (mailbox == null) {
- continue; // Mailbox removed. Move to the next message.
- }
- }
- // upsync the message
- long id = upsyncs2.getLong(EmailContent.Message.ID_PROJECTION_COLUMN);
- lastMessageId = id;
- processUploadMessage(context, remoteStore, account, mailbox, id);
- }
- } finally {
- if (upsyncs2 != null) {
- upsyncs2.close();
- }
- }
- }
- } catch (MessagingException me) {
- // Presumably an error here is an account connection failure, so there is
- // no point in continuing through the rest of the pending updates.
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "Unable to process pending upsync for id="
- + lastMessageId + ": " + me);
- }
- } finally {
- if (mailboxes != null) {
- mailboxes.close();
- }
- }
- }
-
- /**
- * Scan for messages that are in the Message_Updates table, look for differences that
- * we can deal with, and do the work.
- *
- * @param account
- * @param resolver
- * @param accountIdArgs
- */
- private static void processPendingUpdatesSynchronous(Context context, Account account,
- String[] accountIdArgs) {
- ContentResolver resolver = context.getContentResolver();
- Cursor updates = resolver.query(EmailContent.Message.UPDATED_CONTENT_URI,
- EmailContent.Message.CONTENT_PROJECTION,
- EmailContent.MessageColumns.ACCOUNT_KEY + "=?", accountIdArgs,
- EmailContent.MessageColumns.MAILBOX_KEY);
- long lastMessageId = -1;
- try {
- // Defer setting up the store until we know we need to access it
- Store remoteStore = null;
- // Demand load mailbox (note order-by to reduce thrashing here)
- Mailbox mailbox = null;
- // loop through messages marked as needing updates
- while (updates.moveToNext()) {
- boolean changeMoveToTrash = false;
- boolean changeRead = false;
- boolean changeFlagged = false;
- boolean changeMailbox = false;
- boolean changeAnswered = false;
-
- EmailContent.Message oldMessage =
- EmailContent.getContent(updates, EmailContent.Message.class);
- lastMessageId = oldMessage.mId;
- EmailContent.Message newMessage =
- EmailContent.Message.restoreMessageWithId(context, oldMessage.mId);
- if (newMessage != null) {
- mailbox = Mailbox.restoreMailboxWithId(context, newMessage.mMailboxKey);
- if (mailbox == null) {
- continue; // Mailbox removed. Move to the next message.
- }
- if (oldMessage.mMailboxKey != newMessage.mMailboxKey) {
- if (mailbox.mType == Mailbox.TYPE_TRASH) {
- changeMoveToTrash = true;
- } else {
- changeMailbox = true;
- }
- }
- changeRead = oldMessage.mFlagRead != newMessage.mFlagRead;
- changeFlagged = oldMessage.mFlagFavorite != newMessage.mFlagFavorite;
- changeAnswered = (oldMessage.mFlags & EmailContent.Message.FLAG_REPLIED_TO) !=
- (newMessage.mFlags & EmailContent.Message.FLAG_REPLIED_TO);
- }
-
- // Load the remote store if it will be needed
- if (remoteStore == null &&
- (changeMoveToTrash || changeRead || changeFlagged || changeMailbox ||
- changeAnswered)) {
- remoteStore = Store.getInstance(account, context);
- }
-
- // Dispatch here for specific change types
- if (changeMoveToTrash) {
- // Move message to trash
- processPendingMoveToTrash(context, remoteStore, account, mailbox, oldMessage,
- newMessage);
- } else if (changeRead || changeFlagged || changeMailbox || changeAnswered) {
- processPendingDataChange(context, remoteStore, mailbox, changeRead,
- changeFlagged, changeMailbox, changeAnswered, oldMessage, newMessage);
- }
-
- // Finally, delete the update
- Uri uri = ContentUris.withAppendedId(EmailContent.Message.UPDATED_CONTENT_URI,
- oldMessage.mId);
- resolver.delete(uri, null, null);
- }
-
- } catch (MessagingException me) {
- // Presumably an error here is an account connection failure, so there is
- // no point in continuing through the rest of the pending updates.
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG, "Unable to process pending update for id="
- + lastMessageId + ": " + me);
- }
- } finally {
- updates.close();
- }
- }
-
- /**
- * Upsync an entire message. This must also unwind whatever triggered it (either by
- * updating the serverId, or by deleting the update record, or it's going to keep happening
- * over and over again.
- *
- * Note: If the message is being uploaded into an unexpected mailbox, we *do not* upload.
- * This is to avoid unnecessary uploads into the trash. Although the caller attempts to select
- * only the Drafts and Sent folders, this can happen when the update record and the current
- * record mismatch. In this case, we let the update record remain, because the filters
- * in processPendingUpdatesSynchronous() will pick it up as a move and handle it (or drop it)
- * appropriately.
- *
- * @param resolver
- * @param remoteStore
- * @param account
- * @param mailbox the actual mailbox
- * @param messageId
- */
- private static void processUploadMessage(Context context, Store remoteStore,
- Account account, Mailbox mailbox, long messageId)
- throws MessagingException {
- EmailContent.Message newMessage =
- EmailContent.Message.restoreMessageWithId(context, messageId);
- boolean deleteUpdate = false;
- if (newMessage == null) {
- deleteUpdate = true;
- Log.d(Logging.LOG_TAG, "Upsync failed for null message, id=" + messageId);
- } else if (mailbox.mType == Mailbox.TYPE_DRAFTS) {
- deleteUpdate = false;
- Log.d(Logging.LOG_TAG, "Upsync skipped for mailbox=drafts, id=" + messageId);
- } else if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
- deleteUpdate = false;
- Log.d(Logging.LOG_TAG, "Upsync skipped for mailbox=outbox, id=" + messageId);
- } else if (mailbox.mType == Mailbox.TYPE_TRASH) {
- deleteUpdate = false;
- Log.d(Logging.LOG_TAG, "Upsync skipped for mailbox=trash, id=" + messageId);
- } else if (newMessage != null && newMessage.mMailboxKey != mailbox.mId) {
- deleteUpdate = false;
- Log.d(Logging.LOG_TAG, "Upsync skipped; mailbox changed, id=" + messageId);
- } else {
-// Log.d(Logging.LOG_TAG, "Upsyc triggered for message id=" + messageId);
-// deleteUpdate = processPendingAppend(context, remoteStore, account, mailbox,
- //newMessage);
- }
- if (deleteUpdate) {
- // Finally, delete the update (if any)
- Uri uri = ContentUris.withAppendedId(
- EmailContent.Message.UPDATED_CONTENT_URI, messageId);
- context.getContentResolver().delete(uri, null, null);
- }
- }
-
- /**
- * Upsync changes to read, flagged, or mailbox
- *
- * @param remoteStore the remote store for this mailbox
- * @param mailbox the mailbox the message is stored in
- * @param changeRead whether the message's read state has changed
- * @param changeFlagged whether the message's flagged state has changed
- * @param changeMailbox whether the message's mailbox has changed
- * @param oldMessage the message in it's pre-change state
- * @param newMessage the current version of the message
- */
- private static void processPendingDataChange(final Context context, Store remoteStore,
- Mailbox mailbox, boolean changeRead, boolean changeFlagged, boolean changeMailbox,
- boolean changeAnswered, EmailContent.Message oldMessage,
- final EmailContent.Message newMessage) throws MessagingException {
- // New mailbox is the mailbox this message WILL be in (same as the one it WAS in if it isn't
- // being moved
- Mailbox newMailbox = mailbox;
- // Mailbox is the original remote mailbox (the one we're acting on)
- mailbox = getRemoteMailboxForMessage(context, oldMessage);
-
- // 0. No remote update if the message is local-only
- if (newMessage.mServerId == null || newMessage.mServerId.equals("")
- || newMessage.mServerId.startsWith(LOCAL_SERVERID_PREFIX) || (mailbox == null)) {
- return;
- }
-
- // 1. No remote update for DRAFTS or OUTBOX
- if (mailbox.mType == Mailbox.TYPE_DRAFTS || mailbox.mType == Mailbox.TYPE_OUTBOX) {
- return;
- }
-
- // 2. Open the remote store & folder
- Folder remoteFolder = remoteStore.getFolder(mailbox.mServerId);
- if (!remoteFolder.exists()) {
- return;
- }
- remoteFolder.open(OpenMode.READ_WRITE);
- if (remoteFolder.getMode() != OpenMode.READ_WRITE) {
- return;
- }
-
- // 3. Finally, apply the changes to the message
- Message remoteMessage = remoteFolder.getMessage(newMessage.mServerId);
- if (remoteMessage == null) {
- return;
- }
- if (MailActivityEmail.DEBUG) {
- Log.d(Logging.LOG_TAG,
- "Update for msg id=" + newMessage.mId
- + " read=" + newMessage.mFlagRead
- + " flagged=" + newMessage.mFlagFavorite
- + " answered="
- + ((newMessage.mFlags & EmailContent.Message.FLAG_REPLIED_TO) != 0)
- + " new mailbox=" + newMessage.mMailboxKey);
- }
- Message[] messages = new Message[] { remoteMessage };
- if (changeRead) {
- remoteFolder.setFlags(messages, FLAG_LIST_SEEN, newMessage.mFlagRead);
- }
- if (changeFlagged) {
- remoteFolder.setFlags(messages, FLAG_LIST_FLAGGED, newMessage.mFlagFavorite);
- }
- if (changeAnswered) {
- remoteFolder.setFlags(messages, FLAG_LIST_ANSWERED,
- (newMessage.mFlags & EmailContent.Message.FLAG_REPLIED_TO) != 0);
- }
- if (changeMailbox) {
- Folder toFolder = remoteStore.getFolder(newMailbox.mServerId);
- if (!remoteFolder.exists()) {
- return;
- }
- // We may need the message id to search for the message in the destination folder
- remoteMessage.setMessageId(newMessage.mMessageId);
- // Copy the message to its new folder
- remoteFolder.copyMessages(messages, toFolder, new MessageUpdateCallbacks() {
- @Override
- public void onMessageUidChange(Message message, String newUid) {
- ContentValues cv = new ContentValues();
- cv.put(EmailContent.Message.SERVER_ID, newUid);
- // We only have one message, so, any updates _must_ be for it. Otherwise,
- // we'd have to cycle through to find the one with the same server ID.
- context.getContentResolver().update(ContentUris.withAppendedId(
- EmailContent.Message.CONTENT_URI, newMessage.mId), cv, null, null);
- }
- @Override
- public void onMessageNotFound(Message message) {
- }
- });
- // Delete the message from the remote source folder
- remoteMessage.setFlag(Flag.DELETED, true);
- remoteFolder.expunge();
- }
- remoteFolder.close(false);
- }
-
- /**
- * Process a pending trash message command.
- *
- * @param remoteStore the remote store we're working in
- * @param account The account in which we are working
- * @param newMailbox The local trash mailbox
- * @param oldMessage The message copy that was saved in the updates shadow table
- * @param newMessage The message that was moved to the mailbox
- */
- private static void processPendingMoveToTrash(final Context context, Store remoteStore,
- Account account, Mailbox newMailbox, EmailContent.Message oldMessage,
- final EmailContent.Message newMessage) throws MessagingException {
-
- // 0. No remote move if the message is local-only
- if (newMessage.mServerId == null || newMessage.mServerId.equals("")
- || newMessage.mServerId.startsWith(LOCAL_SERVERID_PREFIX)) {
- return;
- }
-
- // 1. Escape early if we can't find the local mailbox
- // TODO smaller projection here
- Mailbox oldMailbox = getRemoteMailboxForMessage(context, oldMessage);
- if (oldMailbox == null) {
- // can't find old mailbox, it may have been deleted. just return.
- return;
- }
- // 2. We don't support delete-from-trash here
- if (oldMailbox.mType == Mailbox.TYPE_TRASH) {
- return;
- }
-
- // The rest of this method handles server-side deletion
-
- // 4. Find the remote mailbox (that we deleted from), and open it
- Folder remoteFolder = remoteStore.getFolder(oldMailbox.mServerId);
- if (!remoteFolder.exists()) {
- return;
- }
-
- remoteFolder.open(OpenMode.READ_WRITE);
- if (remoteFolder.getMode() != OpenMode.READ_WRITE) {
- remoteFolder.close(false);
- return;
- }
-
- // 5. Find the remote original message
- Message remoteMessage = remoteFolder.getMessage(oldMessage.mServerId);
- if (remoteMessage == null) {
- remoteFolder.close(false);
- return;
- }
-
- // 6. Find the remote trash folder, and create it if not found
- Folder remoteTrashFolder = remoteStore.getFolder(newMailbox.mServerId);
- if (!remoteTrashFolder.exists()) {
- /*
- * If the remote trash folder doesn't exist we try to create it.
- */
- remoteTrashFolder.create(FolderType.HOLDS_MESSAGES);
- }
-
- // 7. Try to copy the message into the remote trash folder
- // Note, this entire section will be skipped for POP3 because there's no remote trash
- if (remoteTrashFolder.exists()) {
- /*
- * Because remoteTrashFolder may be new, we need to explicitly open it
- */
- remoteTrashFolder.open(OpenMode.READ_WRITE);
- if (remoteTrashFolder.getMode() != OpenMode.READ_WRITE) {
- remoteFolder.close(false);
- remoteTrashFolder.close(false);
- return;
- }
-
- remoteFolder.copyMessages(new Message[] { remoteMessage }, remoteTrashFolder,
- new Folder.MessageUpdateCallbacks() {
- @Override
- public void onMessageUidChange(Message message, String newUid) {
- // update the UID in the local trash folder, because some stores will
- // have to change it when copying to remoteTrashFolder
- ContentValues cv = new ContentValues();
- cv.put(EmailContent.Message.SERVER_ID, newUid);
- context.getContentResolver().update(newMessage.getUri(), cv, null, null);
- }
-
- /**
- * This will be called if the deleted message doesn't exist and can't be
- * deleted (e.g. it was already deleted from the server.) In this case,
- * attempt to delete the local copy as well.
- */
- @Override
- public void onMessageNotFound(Message message) {
- context.getContentResolver().delete(newMessage.getUri(), null, null);
- }
- });
- remoteTrashFolder.close(false);
- }
-
- // 8. Delete the message from the remote source folder
- remoteMessage.setFlag(Flag.DELETED, true);
- remoteFolder.expunge();
- remoteFolder.close(false);
- }
-
- /**
- * Process a pending trash message command.
- *
- * @param remoteStore the remote store we're working in
- * @param account The account in which we are working
- * @param oldMailbox The local trash mailbox
- * @param oldMessage The message that was deleted from the trash
- */
- private static void processPendingDeleteFromTrash(Context context, Store remoteStore,
- Account account, Mailbox oldMailbox, EmailContent.Message oldMessage)
- throws MessagingException {
-
- // 1. We only support delete-from-trash here
- if (oldMailbox.mType != Mailbox.TYPE_TRASH) {
- return;
- }
-
- // 2. Find the remote trash folder (that we are deleting from), and open it
- Folder remoteTrashFolder = remoteStore.getFolder(oldMailbox.mServerId);
- if (!remoteTrashFolder.exists()) {
- return;
- }
-
- remoteTrashFolder.open(OpenMode.READ_WRITE);
- if (remoteTrashFolder.getMode() != OpenMode.READ_WRITE) {
- remoteTrashFolder.close(false);
- return;
- }
-
- // 3. Find the remote original message
- Message remoteMessage = remoteTrashFolder.getMessage(oldMessage.mServerId);
- if (remoteMessage == null) {
- remoteTrashFolder.close(false);
- return;
- }
-
- // 4. Delete the message from the remote trash folder
- remoteMessage.setFlag(Flag.DELETED, true);
- remoteTrashFolder.expunge();
- remoteTrashFolder.close(false);
- }
-
- /**
- * A message and numeric uid that's easily sortable
- */
- private static class SortableMessage {
- private final Message mMessage;
- private final long mUid;
-
- SortableMessage(Message message, long uid) {
- mMessage = message;
- mUid = uid;
- }
- }
-
- public int searchMailbox(Context context, long accountId, SearchParams searchParams,
- long destMailboxId) throws MessagingException {
- try {
- return searchMailboxImpl(context, accountId, searchParams, destMailboxId);
- } finally {
- // Tell UI
- }
- }
-
- private int searchMailboxImpl(final Context context, long accountId, SearchParams searchParams,
- final long destMailboxId) throws MessagingException {
- final Account account = Account.restoreAccountWithId(context, accountId);
- final Mailbox mailbox = Mailbox.restoreMailboxWithId(context, searchParams.mMailboxId);
- final Mailbox destMailbox = Mailbox.restoreMailboxWithId(context, destMailboxId);
- if (account == null || mailbox == null || destMailbox == null) {
- Log.d(Logging.LOG_TAG, "Attempted search for " + searchParams
- + " but account or mailbox information was missing");
- return 0;
- }
-
- // Tell UI that we're loading messages
-
- Store remoteStore = Store.getInstance(account, context);
- Folder remoteFolder = remoteStore.getFolder(mailbox.mServerId);
- remoteFolder.open(OpenMode.READ_WRITE);
-
- SortableMessage[] sortableMessages = new SortableMessage[0];
- if (searchParams.mOffset == 0) {
- // Get the "bare" messages (basically uid)
- Message[] remoteMessages = remoteFolder.getMessages(searchParams, null);
- int remoteCount = remoteMessages.length;
- if (remoteCount > 0) {
- sortableMessages = new SortableMessage[remoteCount];
- int i = 0;
- for (Message msg : remoteMessages) {
- sortableMessages[i++] = new SortableMessage(msg, Long.parseLong(msg.getUid()));
- }
- // Sort the uid's, most recent first
- // Note: Not all servers will be nice and return results in the order of request;
- // those that do will see messages arrive from newest to oldest
- Arrays.sort(sortableMessages, new Comparator<SortableMessage>() {
- @Override
- public int compare(SortableMessage lhs, SortableMessage rhs) {
- return lhs.mUid > rhs.mUid ? -1 : lhs.mUid < rhs.mUid ? 1 : 0;
- }
- });
- sSearchResults.put(accountId, sortableMessages);
- }
- } else {
- sortableMessages = sSearchResults.get(accountId);
- }
-
- final int numSearchResults = sortableMessages.length;
- final int numToLoad =
- Math.min(numSearchResults - searchParams.mOffset, searchParams.mLimit);
- if (numToLoad <= 0) {
- return 0;
- }
-
- final ArrayList<Message> messageList = new ArrayList<Message>();
- for (int i = searchParams.mOffset; i < numToLoad + searchParams.mOffset; i++) {
- messageList.add(sortableMessages[i].mMessage);
- }
- // Get everything in one pass, rather than two (as in sync); this starts getting us
- // usable results quickly.
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.FLAGS);
- fp.add(FetchProfile.Item.ENVELOPE);
- fp.add(FetchProfile.Item.STRUCTURE);
- fp.add(FetchProfile.Item.BODY_SANE);
- remoteFolder.fetch(messageList.toArray(new Message[0]), fp,
- new MessageRetrievalListener() {
- @Override
- public void messageRetrieved(Message message) {
- try {
- // Determine if the new message was already known (e.g. partial)
- // And create or reload the full message info
- EmailContent.Message localMessage = new EmailContent.Message();
- try {
- // Copy the fields that are available into the message
- LegacyConversions.updateMessageFields(localMessage,
- message, account.mId, mailbox.mId);
- // Commit the message to the local store
- Utilities.saveOrUpdate(localMessage, context);
- localMessage.mMailboxKey = destMailboxId;
- // We load 50k or so; maybe it's complete, maybe not...
- int flag = EmailContent.Message.FLAG_LOADED_COMPLETE;
- // We store the serverId of the source mailbox into protocolSearchInfo
- // This will be used by loadMessageForView, etc. to use the proper remote
- // folder
- localMessage.mProtocolSearchInfo = mailbox.mServerId;
- if (message.getSize() > Store.FETCH_BODY_SANE_SUGGESTED_SIZE) {
- flag = EmailContent.Message.FLAG_LOADED_PARTIAL;
- }
- Utilities.copyOneMessageToProvider(context, message, localMessage, flag);
- } catch (MessagingException me) {
- Log.e(Logging.LOG_TAG,
- "Error while copying downloaded message." + me);
- }
- } catch (Exception e) {
- Log.e(Logging.LOG_TAG,
- "Error while storing downloaded message." + e.toString());
- }
- }
-
- @Override
- public void loadAttachmentProgress(int progress) {
- }
- });
- return numSearchResults;
- }
-} \ No newline at end of file
diff --git a/email2/src/com/android/email/service/ImapTempFileLiteral.java b/email2/src/com/android/email/service/ImapTempFileLiteral.java
deleted file mode 100644
index cc1dd5410..000000000
--- a/email2/src/com/android/email/service/ImapTempFileLiteral.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import android.util.Log;
-
-import com.android.email.FixedLengthInputStream;
-import com.android.email.mail.store.imap.ImapResponse;
-import com.android.email.mail.store.imap.ImapResponseParser;
-import com.android.email.mail.store.imap.ImapString;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.TempDirectory;
-import com.android.emailcommon.utility.Utility;
-
-import org.apache.commons.io.IOUtils;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Subclass of {@link ImapString} used for literals backed by a temp file.
- */
-public class ImapTempFileLiteral extends ImapString {
- /* package for test */ final File mFile;
-
- /** Size is purely for toString() */
- private final int mSize;
-
- /* package */ ImapTempFileLiteral(FixedLengthInputStream stream) throws IOException {
- mSize = stream.getLength();
- mFile = File.createTempFile("imap", ".tmp", TempDirectory.getTempDirectory());
-
- // Unfortunately, we can't really use deleteOnExit(), because temp filenames are random
- // so it'd simply cause a memory leak.
- // deleteOnExit() simply adds filenames to a static list and the list will never shrink.
- // mFile.deleteOnExit();
- OutputStream out = new FileOutputStream(mFile);
- IOUtils.copy(stream, out);
- out.close();
- }
-
- /**
- * Make sure we delete the temp file.
- *
- * We should always be calling {@link ImapResponse#destroy()}, but it's here as a last resort.
- */
- @Override
- protected void finalize() throws Throwable {
- try {
- destroy();
- } finally {
- super.finalize();
- }
- }
-
- @Override
- public InputStream getAsStream() {
- checkNotDestroyed();
- try {
- return new FileInputStream(mFile);
- } catch (FileNotFoundException e) {
- // It's probably possible if we're low on storage and the system clears the cache dir.
- Log.w(Logging.LOG_TAG, "ImapTempFileLiteral: Temp file not found");
-
- // Return 0 byte stream as a dummy...
- return new ByteArrayInputStream(new byte[0]);
- }
- }
-
- @Override
- public String getString() {
- checkNotDestroyed();
- try {
- byte[] bytes = IOUtils.toByteArray(getAsStream());
- // Prevent crash from OOM; we've seen this, but only rarely and not reproducibly
- if (bytes.length > ImapResponseParser.LITERAL_KEEP_IN_MEMORY_THRESHOLD) {
- throw new IOException();
- }
- return Utility.fromAscii(bytes);
- } catch (IOException e) {
- Log.w(Logging.LOG_TAG, "ImapTempFileLiteral: Error while reading temp file", e);
- return "";
- }
- }
-
- @Override
- public void destroy() {
- try {
- if (!isDestroyed() && mFile.exists()) {
- mFile.delete();
- }
- } catch (RuntimeException re) {
- // Just log and ignore.
- Log.w(Logging.LOG_TAG, "Failed to remove temp file: " + re.getMessage());
- }
- super.destroy();
- }
-
- @Override
- public String toString() {
- return String.format("{%d byte literal(file)}", mSize);
- }
-
- public boolean tempFileExistsForTest() {
- return mFile.exists();
- }
-}
diff --git a/email2/src/com/android/email/service/MailService.java b/email2/src/com/android/email/service/MailService.java
deleted file mode 100644
index 48cf9d2aa..000000000
--- a/email2/src/com/android/email/service/MailService.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import android.accounts.AccountManager;
-import android.accounts.AccountManagerCallback;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.os.Bundle;
-import android.os.IBinder;
-
-import com.android.email.SingleRunningTask;
-import com.android.email.provider.AccountReconciler;
-import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.AccountManagerTypes;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Legacy service, now used mainly for account reconciliation
- */
-public class MailService extends Service {
-
- @Override
- public int onStartCommand(final Intent intent, int flags, final int startId) {
- super.onStartCommand(intent, flags, startId);
-
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- reconcilePopImapAccountsSync(MailService.this);
- }
- });
-
- // Make sure our services are running, if necessary
- MailActivityEmail.setServicesEnabledAsync(this);
-
- // Returning START_NOT_STICKY means that if a mail check is killed (e.g. due to memory
- // pressure, there will be no explicit restart. This is OK; Note that we set a watchdog
- // alarm before each mailbox check. If the mailbox check never completes, the watchdog
- // will fire and get things running again.
- return START_NOT_STICKY;
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
-
- public static ArrayList<Account> getPopImapAccountList(Context context) {
- ArrayList<Account> providerAccounts = new ArrayList<Account>();
- Cursor c = context.getContentResolver().query(Account.CONTENT_URI, Account.ID_PROJECTION,
- null, null, null);
- try {
- while (c.moveToNext()) {
- long accountId = c.getLong(Account.CONTENT_ID_COLUMN);
- String protocol = Account.getProtocol(context, accountId);
- EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, protocol);
- if ((info != null) && info.accountType.equals(AccountManagerTypes.TYPE_POP_IMAP)) {
- Account account = Account.restoreAccountWithId(context, accountId);
- if (account != null) {
- providerAccounts.add(account);
- }
- }
- }
- } finally {
- c.close();
- }
- return providerAccounts;
- }
-
- private static final SingleRunningTask<Context> sReconcilePopImapAccountsSyncExecutor =
- new SingleRunningTask<Context>("ReconcilePopImapAccountsSync") {
- @Override
- protected void runInternal(Context context) {
- android.accounts.Account[] accountManagerAccounts = AccountManager.get(context)
- .getAccountsByType(AccountManagerTypes.TYPE_POP_IMAP);
- ArrayList<Account> providerAccounts = getPopImapAccountList(context);
- MailService.reconcileAccountsWithAccountManager(context, providerAccounts,
- accountManagerAccounts, context);
-
- }
- };
-
- /**
- * Reconcile POP/IMAP accounts.
- */
- public static void reconcilePopImapAccountsSync(Context context) {
- sReconcilePopImapAccountsSyncExecutor.run(context);
- }
-
- /**
- * Determines whether or not POP/IMAP accounts need reconciling or not. This is a safe operation
- * to perform on the UI thread.
- */
- public static boolean hasMismatchInPopImapAccounts(Context context) {
- android.accounts.Account[] accountManagerAccounts = AccountManager.get(context)
- .getAccountsByType(AccountManagerTypes.TYPE_POP_IMAP);
- ArrayList<Account> providerAccounts = getPopImapAccountList(context);
- return AccountReconciler.accountsNeedReconciling(
- context, providerAccounts, accountManagerAccounts);
- }
-
- /**
- * See Utility.reconcileAccounts for details
- * @param context The context in which to operate
- * @param emailProviderAccounts the exchange provider accounts to work from
- * @param accountManagerAccounts The account manager accounts to work from
- * @param providerContext the provider's context (in unit tests, this may differ from context)
- */
- @VisibleForTesting
- public static void reconcileAccountsWithAccountManager(Context context,
- List<Account> emailProviderAccounts, android.accounts.Account[] accountManagerAccounts,
- Context providerContext) {
- AccountReconciler.reconcileAccounts(context, emailProviderAccounts, accountManagerAccounts,
- providerContext);
- }
-
- public static void setupAccountManagerAccount(Context context, Account account,
- boolean email, boolean calendar, boolean contacts,
- AccountManagerCallback<Bundle> callback) {
- Bundle options = new Bundle();
- HostAuth hostAuthRecv = HostAuth.restoreHostAuthWithId(context, account.mHostAuthKeyRecv);
- if (hostAuthRecv == null) return;
- // Set up username/password
- options.putString(EasAuthenticatorService.OPTIONS_USERNAME, account.mEmailAddress);
- options.putString(EasAuthenticatorService.OPTIONS_PASSWORD, hostAuthRecv.mPassword);
- options.putBoolean(EasAuthenticatorService.OPTIONS_CONTACTS_SYNC_ENABLED, contacts);
- options.putBoolean(EasAuthenticatorService.OPTIONS_CALENDAR_SYNC_ENABLED, calendar);
- options.putBoolean(EasAuthenticatorService.OPTIONS_EMAIL_SYNC_ENABLED, email);
- EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, hostAuthRecv.mProtocol);
- AccountManager.get(context).addAccount(info.accountType, null, null, options, null,
- callback, null);
- }
-}
diff --git a/email2/src/com/android/email/service/PolicyService.java b/email2/src/com/android/email/service/PolicyService.java
deleted file mode 100644
index 2394eedd7..000000000
--- a/email2/src/com/android/email/service/PolicyService.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.os.IBinder;
-
-import com.android.email.SecurityPolicy;
-import com.android.emailcommon.provider.Policy;
-import com.android.emailcommon.service.IPolicyService;
-
-public class PolicyService extends Service {
-
- private SecurityPolicy mSecurityPolicy;
- private Context mContext;
-
- private final IPolicyService.Stub mBinder = new IPolicyService.Stub() {
- public boolean isActive(Policy policy) {
- return mSecurityPolicy.isActive(policy);
- }
-
- public void setAccountHoldFlag(long accountId, boolean newState) {
- SecurityPolicy.setAccountHoldFlag(mContext, accountId, newState);
- }
-
- public void remoteWipe() {
- mSecurityPolicy.remoteWipe();
- }
-
- public void setAccountPolicy(long accountId, Policy policy, String securityKey) {
- mSecurityPolicy.setAccountPolicy(accountId, policy, securityKey);
- }
- };
-
- @Override
- public IBinder onBind(Intent intent) {
- // When we bind this service, save the context and SecurityPolicy singleton
- mContext = this;
- mSecurityPolicy = SecurityPolicy.getInstance(this);
- return mBinder;
- }
-} \ No newline at end of file
diff --git a/email2/src/com/android/email/service/Pop3Service.java b/email2/src/com/android/email/service/Pop3Service.java
deleted file mode 100644
index 404ef8779..000000000
--- a/email2/src/com/android/email/service/Pop3Service.java
+++ /dev/null
@@ -1,726 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import android.app.Service;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.TrafficStats;
-import android.net.Uri;
-import android.os.IBinder;
-import android.os.RemoteCallbackList;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.email.LegacyConversions;
-import com.android.email.NotificationController;
-import com.android.email.mail.Store;
-import com.android.email.provider.Utilities;
-import com.android.email2.ui.MailActivityEmail;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.TrafficFlags;
-import com.android.emailcommon.internet.MimeUtility;
-import com.android.emailcommon.mail.AuthenticationFailedException;
-import com.android.emailcommon.mail.FetchProfile;
-import com.android.emailcommon.mail.Flag;
-import com.android.emailcommon.mail.Folder;
-import com.android.emailcommon.mail.Folder.FolderType;
-import com.android.emailcommon.mail.Folder.MessageRetrievalListener;
-import com.android.emailcommon.mail.Folder.OpenMode;
-import com.android.emailcommon.mail.Message;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.mail.Part;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.emailcommon.provider.EmailContent.SyncColumns;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.service.EmailServiceStatus;
-import com.android.emailcommon.service.IEmailServiceCallback;
-import com.android.emailcommon.utility.AttachmentUtilities;
-import com.android.mail.providers.UIProvider.AccountCapabilities;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-
-public class Pop3Service extends Service {
- private static final String TAG = "Pop3Service";
- private static final int MAX_SMALL_MESSAGE_SIZE = (25 * 1024);
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- return Service.START_STICKY;
- }
-
- // Callbacks as set up via setCallback
- private static final RemoteCallbackList<IEmailServiceCallback> mCallbackList =
- new RemoteCallbackList<IEmailServiceCallback>();
-
- private interface ServiceCallbackWrapper {
- public void call(IEmailServiceCallback cb) throws RemoteException;
- }
-
- /**
- * Proxy that can be used by various sync adapters to tie into ExchangeService's callback system
- * Used this way: ExchangeService.callback().callbackMethod(args...);
- * The proxy wraps checking for existence of a ExchangeService instance
- * Failures of these callbacks can be safely ignored.
- */
- static private final IEmailServiceCallback.Stub sCallbackProxy =
- new IEmailServiceCallback.Stub() {
-
- /**
- * Broadcast a callback to the everyone that's registered
- *
- * @param wrapper the ServiceCallbackWrapper used in the broadcast
- */
- private synchronized void broadcastCallback(ServiceCallbackWrapper wrapper) {
- RemoteCallbackList<IEmailServiceCallback> callbackList = mCallbackList;
- if (callbackList != null) {
- // Call everyone on our callback list
- int count = callbackList.beginBroadcast();
- try {
- for (int i = 0; i < count; i++) {
- try {
- wrapper.call(callbackList.getBroadcastItem(i));
- } catch (RemoteException e) {
- // Safe to ignore
- } catch (RuntimeException e) {
- // We don't want an exception in one call to prevent other calls, so
- // we'll just log this and continue
- Log.e(TAG, "Caught RuntimeException in broadcast", e);
- }
- }
- } finally {
- // No matter what, we need to finish the broadcast
- callbackList.finishBroadcast();
- }
- }
- }
-
- @Override
- public void loadAttachmentStatus(final long messageId, final long attachmentId,
- final int status, final int progress) {
- broadcastCallback(new ServiceCallbackWrapper() {
- @Override
- public void call(IEmailServiceCallback cb) throws RemoteException {
- cb.loadAttachmentStatus(messageId, attachmentId, status, progress);
- }
- });
- }
-
- @Override
- public void loadMessageStatus(final long messageId, final int status, final int progress) {
- broadcastCallback(new ServiceCallbackWrapper() {
- @Override
- public void call(IEmailServiceCallback cb) throws RemoteException {
- cb.loadMessageStatus(messageId, status, progress);
- }
- });
- }
-
- @Override
- public void sendMessageStatus(final long messageId, final String subject, final int status,
- final int progress) {
- broadcastCallback(new ServiceCallbackWrapper() {
- @Override
- public void call(IEmailServiceCallback cb) throws RemoteException {
- cb.sendMessageStatus(messageId, subject, status, progress);
- }
- });
- }
-
- @Override
- public void syncMailboxListStatus(final long accountId, final int status,
- final int progress) {
- broadcastCallback(new ServiceCallbackWrapper() {
- @Override
- public void call(IEmailServiceCallback cb) throws RemoteException {
- cb.syncMailboxListStatus(accountId, status, progress);
- }
- });
- }
-
- @Override
- public void syncMailboxStatus(final long mailboxId, final int status,
- final int progress) {
- broadcastCallback(new ServiceCallbackWrapper() {
- @Override
- public void call(IEmailServiceCallback cb) throws RemoteException {
- cb.syncMailboxStatus(mailboxId, status, progress);
- }
- });
- }
- };
-
- /**
- * Create our EmailService implementation here.
- */
- private final EmailServiceStub mBinder = new EmailServiceStub() {
-
- @Override
- public void setCallback(IEmailServiceCallback cb) throws RemoteException {
- mCallbackList.register(cb);
- }
-
- @Override
- public int getCapabilities(long accountId) throws RemoteException {
- return AccountCapabilities.UNDO;
- }
- };
-
- @Override
- public IBinder onBind(Intent intent) {
- mBinder.init(this, sCallbackProxy);
- return mBinder;
- }
-
- private static void sendMailboxStatus(Mailbox mailbox, int status) {
- try {
- sCallbackProxy.syncMailboxStatus(mailbox.mId, status, 0);
- } catch (RemoteException e) {
- }
- }
-
- /**
- * Start foreground synchronization of the specified folder. This is called by
- * synchronizeMailbox or checkMail.
- * TODO this should use ID's instead of fully-restored objects
- * @param account
- * @param folder
- * @throws MessagingException
- */
- public static void synchronizeMailboxSynchronous(Context context, final Account account,
- final Mailbox folder) throws MessagingException {
- sendMailboxStatus(folder, EmailServiceStatus.IN_PROGRESS);
-
- TrafficStats.setThreadStatsTag(TrafficFlags.getSyncFlags(context, account));
- if ((folder.mFlags & Mailbox.FLAG_HOLDS_MAIL) == 0) {
- sendMailboxStatus(folder, EmailServiceStatus.SUCCESS);
- }
- NotificationController nc = NotificationController.getInstance(context);
- try {
- processPendingActionsSynchronous(context, account);
- synchronizeMailboxGeneric(context, account, folder);
- // Clear authentication notification for this account
- nc.cancelLoginFailedNotification(account.mId);
- sendMailboxStatus(folder, EmailServiceStatus.SUCCESS);
- } catch (MessagingException e) {
- if (Logging.LOGD) {
- Log.v(Logging.LOG_TAG, "synchronizeMailbox", e);
- }
- if (e instanceof AuthenticationFailedException) {
- // Generate authentication notification
- nc.showLoginFailedNotification(account.mId);
- }
- sendMailboxStatus(folder, e.getExceptionType());
- throw e;
- }
- }
-
- /**
- * Lightweight record for the first pass of message sync, where I'm just seeing if
- * the local message requires sync. Later (for messages that need syncing) we'll do a full
- * readout from the DB.
- */
- private static class LocalMessageInfo {
- private static final int COLUMN_ID = 0;
- private static final int COLUMN_FLAG_READ = 1;
- private static final int COLUMN_FLAG_FAVORITE = 2;
- private static final int COLUMN_FLAG_LOADED = 3;
- private static final int COLUMN_SERVER_ID = 4;
- private static final int COLUMN_FLAGS = 7;
- private static final String[] PROJECTION = new String[] {
- EmailContent.RECORD_ID,
- MessageColumns.FLAG_READ, MessageColumns.FLAG_FAVORITE, MessageColumns.FLAG_LOADED,
- SyncColumns.SERVER_ID, MessageColumns.MAILBOX_KEY, MessageColumns.ACCOUNT_KEY,
- MessageColumns.FLAGS
- };
-
- final long mId;
- final boolean mFlagRead;
- final boolean mFlagFavorite;
- final int mFlagLoaded;
- final String mServerId;
- final int mFlags;
-
- public LocalMessageInfo(Cursor c) {
- mId = c.getLong(COLUMN_ID);
- mFlagRead = c.getInt(COLUMN_FLAG_READ) != 0;
- mFlagFavorite = c.getInt(COLUMN_FLAG_FAVORITE) != 0;
- mFlagLoaded = c.getInt(COLUMN_FLAG_LOADED);
- mServerId = c.getString(COLUMN_SERVER_ID);
- mFlags = c.getInt(COLUMN_FLAGS);
- // Note: mailbox key and account key not needed - they are projected for the SELECT
- }
- }
-
- private static void saveOrUpdate(EmailContent content, Context context) {
- if (content.isSaved()) {
- content.update(context, content.toContentValues());
- } else {
- content.save(context);
- }
- }
-
- /**
- * Load the structure and body of messages not yet synced
- * @param account the account we're syncing
- * @param remoteFolder the (open) Folder we're working on
- * @param unsyncedMessages an array of Message's we've got headers for
- * @param toMailbox the destination mailbox we're syncing
- * @throws MessagingException
- */
- static void loadUnsyncedMessages(final Context context, final Account account,
- Folder remoteFolder, ArrayList<Message> unsyncedMessages, final Mailbox toMailbox)
- throws MessagingException {
-
- // 1. Divide the unsynced messages into small & large (by size)
-
- // TODO doing this work here (synchronously) is problematic because it prevents the UI
- // from affecting the order (e.g. download a message because the user requested it.) Much
- // of this logic should move out to a different sync loop that attempts to update small
- // groups of messages at a time, as a background task. However, we can't just return
- // (yet) because POP messages don't have an envelope yet....
-
- ArrayList<Message> largeMessages = new ArrayList<Message>();
- ArrayList<Message> smallMessages = new ArrayList<Message>();
- for (Message message : unsyncedMessages) {
- if (message.getSize() > (MAX_SMALL_MESSAGE_SIZE)) {
- largeMessages.add(message);
- } else {
- smallMessages.add(message);
- }
- }
-
- // 2. Download small messages
-
- // TODO Problems with this implementation. 1. For IMAP, where we get a real envelope,
- // this is going to be inefficient and duplicate work we've already done. 2. It's going
- // back to the DB for a local message that we already had (and discarded).
-
- // For small messages, we specify "body", which returns everything (incl. attachments)
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.BODY);
- remoteFolder.fetch(smallMessages.toArray(new Message[smallMessages.size()]), fp,
- new MessageRetrievalListener() {
- @Override
- public void messageRetrieved(Message message) {
- // Store the updated message locally and mark it fully loaded
- Utilities.copyOneMessageToProvider(context, message, account, toMailbox,
- EmailContent.Message.FLAG_LOADED_COMPLETE);
- }
-
- @Override
- public void loadAttachmentProgress(int progress) {
- }
- });
-
- // 3. Download large messages. We ask the server to give us the message structure,
- // but not all of the attachments.
- fp.clear();
- fp.add(FetchProfile.Item.STRUCTURE);
- remoteFolder.fetch(largeMessages.toArray(new Message[largeMessages.size()]), fp, null);
- for (Message message : largeMessages) {
- if (message.getBody() == null) {
- // POP doesn't support STRUCTURE mode, so we'll just do a partial download
- // (hopefully enough to see some/all of the body) and mark the message for
- // further download.
- fp.clear();
- fp.add(FetchProfile.Item.BODY_SANE);
- // TODO a good optimization here would be to make sure that all Stores set
- // the proper size after this fetch and compare the before and after size. If
- // they equal we can mark this SYNCHRONIZED instead of PARTIALLY_SYNCHRONIZED
- remoteFolder.fetch(new Message[] { message }, fp, null);
-
- // Store the partially-loaded message and mark it partially loaded
- Utilities.copyOneMessageToProvider(context, message, account, toMailbox,
- EmailContent.Message.FLAG_LOADED_PARTIAL);
- } else {
- // We have a structure to deal with, from which
- // we can pull down the parts we want to actually store.
- // Build a list of parts we are interested in. Text parts will be downloaded
- // right now, attachments will be left for later.
- ArrayList<Part> viewables = new ArrayList<Part>();
- ArrayList<Part> attachments = new ArrayList<Part>();
- MimeUtility.collectParts(message, viewables, attachments);
- // Download the viewables immediately
- for (Part part : viewables) {
- fp.clear();
- fp.add(part);
- // TODO what happens if the network connection dies? We've got partial
- // messages with incorrect status stored.
- remoteFolder.fetch(new Message[] { message }, fp, null);
- }
- // Store the updated message locally and mark it fully loaded
- Utilities.copyOneMessageToProvider(context, message, account, toMailbox,
- EmailContent.Message.FLAG_LOADED_COMPLETE);
- }
- }
-
- }
-
- public static void downloadFlagAndEnvelope(final Context context, final Account account,
- final Mailbox mailbox, Folder remoteFolder, ArrayList<Message> unsyncedMessages,
- HashMap<String, LocalMessageInfo> localMessageMap, final ArrayList<Long> unseenMessages)
- throws MessagingException {
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.FLAGS);
- fp.add(FetchProfile.Item.ENVELOPE);
-
- final HashMap<String, LocalMessageInfo> localMapCopy;
- if (localMessageMap != null)
- localMapCopy = new HashMap<String, LocalMessageInfo>(localMessageMap);
- else {
- localMapCopy = new HashMap<String, LocalMessageInfo>();
- }
-
- remoteFolder.fetch(unsyncedMessages.toArray(new Message[0]), fp,
- new MessageRetrievalListener() {
- @Override
- public void messageRetrieved(Message message) {
- try {
- // Determine if the new message was already known (e.g. partial)
- // And create or reload the full message info
- LocalMessageInfo localMessageInfo =
- localMapCopy.get(message.getUid());
- EmailContent.Message localMessage = null;
- if (localMessageInfo == null) {
- localMessage = new EmailContent.Message();
- } else {
- localMessage = EmailContent.Message.restoreMessageWithId(
- context, localMessageInfo.mId);
- }
-
- if (localMessage != null) {
- try {
- // Copy the fields that are available into the message
- LegacyConversions.updateMessageFields(localMessage,
- message, account.mId, mailbox.mId);
- // Commit the message to the local store
- saveOrUpdate(localMessage, context);
- // Track the "new" ness of the downloaded message
- if (!message.isSet(Flag.SEEN) && unseenMessages != null) {
- unseenMessages.add(localMessage.mId);
- }
- } catch (MessagingException me) {
- Log.e(Logging.LOG_TAG,
- "Error while copying downloaded message." + me);
- }
-
- }
- }
- catch (Exception e) {
- Log.e(Logging.LOG_TAG,
- "Error while storing downloaded message." + e.toString());
- }
- }
-
- @Override
- public void loadAttachmentProgress(int progress) {
- }
- });
-
- }
-
- /**
- * Synchronizer for IMAP.
- *
- * TODO Break this method up into smaller chunks.
- *
- * @param account the account to sync
- * @param mailbox the mailbox to sync
- * @return results of the sync pass
- * @throws MessagingException
- */
- private static void synchronizeMailboxGeneric(final Context context,
- final Account account, final Mailbox mailbox) throws MessagingException {
-
- /*
- * A list of IDs for messages that were downloaded and did not have the seen flag set.
- * This serves as the "true" new message count reported to the user via notification.
- */
- final ArrayList<Long> unseenMessages = new ArrayList<Long>();
-
- ContentResolver resolver = context.getContentResolver();
-
- // 0. We do not ever sync DRAFTS or OUTBOX (down or up)
- if (mailbox.mType == Mailbox.TYPE_DRAFTS || mailbox.mType == Mailbox.TYPE_OUTBOX) {
- return;
- }
-
- // 1. Get the message list from the local store and create an index of the uids
-
- Cursor localUidCursor = null;
- HashMap<String, LocalMessageInfo> localMessageMap = new HashMap<String, LocalMessageInfo>();
-
- try {
- localUidCursor = resolver.query(
- EmailContent.Message.CONTENT_URI,
- LocalMessageInfo.PROJECTION,
- EmailContent.MessageColumns.ACCOUNT_KEY + "=?" +
- " AND " + MessageColumns.MAILBOX_KEY + "=?",
- new String[] {
- String.valueOf(account.mId),
- String.valueOf(mailbox.mId)
- },
- null);
- while (localUidCursor.moveToNext()) {
- LocalMessageInfo info = new LocalMessageInfo(localUidCursor);
- localMessageMap.put(info.mServerId, info);
- }
- } finally {
- if (localUidCursor != null) {
- localUidCursor.close();
- }
- }
-
- // 2. Open the remote folder and create the remote folder if necessary
-
- Store remoteStore = Store.getInstance(account, context);
- // The account might have been deleted
- if (remoteStore == null) return;
- Folder remoteFolder = remoteStore.getFolder(mailbox.mServerId);
-
- /*
- * If the folder is a "special" folder we need to see if it exists
- * on the remote server. It if does not exist we'll try to create it. If we
- * can't create we'll abort. This will happen on every single Pop3 folder as
- * designed and on Imap folders during error conditions. This allows us
- * to treat Pop3 and Imap the same in this code.
- */
- if (mailbox.mType == Mailbox.TYPE_TRASH || mailbox.mType == Mailbox.TYPE_SENT
- || mailbox.mType == Mailbox.TYPE_DRAFTS) {
- if (!remoteFolder.exists()) {
- if (!remoteFolder.create(FolderType.HOLDS_MESSAGES)) {
- return;
- }
- }
- }
-
- // 3, Open the remote folder. This pre-loads certain metadata like message count.
- remoteFolder.open(OpenMode.READ_WRITE);
-
- // 4. Trash any remote messages that are marked as trashed locally.
- // TODO - this comment was here, but no code was here.
-
- // 5. Get the remote message count.
- int remoteMessageCount = remoteFolder.getMessageCount();
- ContentValues values = new ContentValues();
- values.put(MailboxColumns.TOTAL_COUNT, remoteMessageCount);
- mailbox.update(context, values);
-
- // 6. Determine the limit # of messages to download
- int visibleLimit = mailbox.mVisibleLimit;
- if (visibleLimit <= 0) {
- visibleLimit = MailActivityEmail.VISIBLE_LIMIT_DEFAULT;
- }
-
- // 7. Create a list of messages to download
- Message[] remoteMessages = new Message[0];
- final ArrayList<Message> unsyncedMessages = new ArrayList<Message>();
- HashMap<String, Message> remoteUidMap = new HashMap<String, Message>();
-
- if (remoteMessageCount > 0) {
- /*
- * Message numbers start at 1.
- */
- int remoteStart = Math.max(0, remoteMessageCount - visibleLimit) + 1;
- int remoteEnd = remoteMessageCount;
- remoteMessages = remoteFolder.getMessages(remoteStart, remoteEnd, null);
- // TODO Why are we running through the list twice? Combine w/ for loop below
- for (Message message : remoteMessages) {
- remoteUidMap.put(message.getUid(), message);
- }
-
- /*
- * Get a list of the messages that are in the remote list but not on the
- * local store, or messages that are in the local store but failed to download
- * on the last sync. These are the new messages that we will download.
- * Note, we also skip syncing messages which are flagged as "deleted message" sentinels,
- * because they are locally deleted and we don't need or want the old message from
- * the server.
- */
- for (Message message : remoteMessages) {
- LocalMessageInfo localMessage = localMessageMap.get(message.getUid());
- // localMessage == null -> message has never been created (not even headers)
- // mFlagLoaded = UNLOADED -> message created, but none of body loaded
- // mFlagLoaded = PARTIAL -> message created, a "sane" amt of body has been loaded
- // mFlagLoaded = COMPLETE -> message body has been completely loaded
- // mFlagLoaded = DELETED -> message has been deleted
- // Only the first two of these are "unsynced", so let's retrieve them
- if (localMessage == null ||
- (localMessage.mFlagLoaded == EmailContent.Message.FLAG_LOADED_UNLOADED)) {
- unsyncedMessages.add(message);
- }
- }
- }
-
- // 8. Download basic info about the new/unloaded messages (if any)
- /*
- * Fetch the flags and envelope only of the new messages. This is intended to get us
- * critical data as fast as possible, and then we'll fill in the details.
- */
- if (unsyncedMessages.size() > 0) {
- downloadFlagAndEnvelope(context, account, mailbox, remoteFolder, unsyncedMessages,
- localMessageMap, unseenMessages);
- }
-
- // 9. Refresh the flags for any messages in the local store that we didn't just download.
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.FLAGS);
- remoteFolder.fetch(remoteMessages, fp, null);
- boolean remoteSupportsSeen = false;
- boolean remoteSupportsFlagged = false;
- boolean remoteSupportsAnswered = false;
- for (Flag flag : remoteFolder.getPermanentFlags()) {
- if (flag == Flag.SEEN) {
- remoteSupportsSeen = true;
- }
- if (flag == Flag.FLAGGED) {
- remoteSupportsFlagged = true;
- }
- if (flag == Flag.ANSWERED) {
- remoteSupportsAnswered = true;
- }
- }
- // Update SEEN/FLAGGED/ANSWERED (star) flags (if supported remotely - e.g. not for POP3)
- if (remoteSupportsSeen || remoteSupportsFlagged || remoteSupportsAnswered) {
- for (Message remoteMessage : remoteMessages) {
- LocalMessageInfo localMessageInfo = localMessageMap.get(remoteMessage.getUid());
- if (localMessageInfo == null) {
- continue;
- }
- boolean localSeen = localMessageInfo.mFlagRead;
- boolean remoteSeen = remoteMessage.isSet(Flag.SEEN);
- boolean newSeen = (remoteSupportsSeen && (remoteSeen != localSeen));
- boolean localFlagged = localMessageInfo.mFlagFavorite;
- boolean remoteFlagged = remoteMessage.isSet(Flag.FLAGGED);
- boolean newFlagged = (remoteSupportsFlagged && (localFlagged != remoteFlagged));
- int localFlags = localMessageInfo.mFlags;
- boolean localAnswered = (localFlags & EmailContent.Message.FLAG_REPLIED_TO) != 0;
- boolean remoteAnswered = remoteMessage.isSet(Flag.ANSWERED);
- boolean newAnswered = (remoteSupportsAnswered && (localAnswered != remoteAnswered));
- if (newSeen || newFlagged || newAnswered) {
- Uri uri = ContentUris.withAppendedId(
- EmailContent.Message.CONTENT_URI, localMessageInfo.mId);
- ContentValues updateValues = new ContentValues();
- updateValues.put(MessageColumns.FLAG_READ, remoteSeen);
- updateValues.put(MessageColumns.FLAG_FAVORITE, remoteFlagged);
- if (remoteAnswered) {
- localFlags |= EmailContent.Message.FLAG_REPLIED_TO;
- } else {
- localFlags &= ~EmailContent.Message.FLAG_REPLIED_TO;
- }
- updateValues.put(MessageColumns.FLAGS, localFlags);
- resolver.update(uri, updateValues, null, null);
- }
- }
- }
-
- // 10. Remove any messages that are in the local store but no longer on the remote store.
- HashSet<String> localUidsToDelete = new HashSet<String>(localMessageMap.keySet());
- localUidsToDelete.removeAll(remoteUidMap.keySet());
- for (String uidToDelete : localUidsToDelete) {
- LocalMessageInfo infoToDelete = localMessageMap.get(uidToDelete);
-
- // Delete associated data (attachment files)
- // Attachment & Body records are auto-deleted when we delete the Message record
- AttachmentUtilities.deleteAllAttachmentFiles(context, account.mId,
- infoToDelete.mId);
-
- // Delete the message itself
- Uri uriToDelete = ContentUris.withAppendedId(
- EmailContent.Message.CONTENT_URI, infoToDelete.mId);
- resolver.delete(uriToDelete, null, null);
-
- // Delete extra rows (e.g. synced or deleted)
- Uri syncRowToDelete = ContentUris.withAppendedId(
- EmailContent.Message.UPDATED_CONTENT_URI, infoToDelete.mId);
- resolver.delete(syncRowToDelete, null, null);
- Uri deletERowToDelete = ContentUris.withAppendedId(
- EmailContent.Message.UPDATED_CONTENT_URI, infoToDelete.mId);
- resolver.delete(deletERowToDelete, null, null);
- }
-
- loadUnsyncedMessages(context, account, remoteFolder, unsyncedMessages, mailbox);
-
- // 14. Clean up and report results
- remoteFolder.close(false);
- }
-
- /**
- * Find messages in the updated table that need to be written back to server.
- *
- * Handles:
- * Read/Unread
- * Flagged
- * Append (upload)
- * Move To Trash
- * Empty trash
- * TODO:
- * Move
- *
- * @param account the account to scan for pending actions
- * @throws MessagingException
- */
- private static void processPendingActionsSynchronous(Context context, Account account)
- throws MessagingException {
- TrafficStats.setThreadStatsTag(TrafficFlags.getSyncFlags(context, account));
- String[] accountIdArgs = new String[] { Long.toString(account.mId) };
-
- // Handle deletes first, it's always better to get rid of things first
- processPendingDeletesSynchronous(context, account, accountIdArgs);
- }
-
- /**
- * Scan for messages that are in the Message_Deletes table, look for differences that
- * we can deal with, and do the work.
- *
- * @param account
- * @param resolver
- * @param accountIdArgs
- */
- private static void processPendingDeletesSynchronous(Context context, Account account,
- String[] accountIdArgs) {
- Cursor deletes = context.getContentResolver().query(
- EmailContent.Message.DELETED_CONTENT_URI,
- EmailContent.Message.CONTENT_PROJECTION,
- EmailContent.MessageColumns.ACCOUNT_KEY + "=?", accountIdArgs,
- EmailContent.MessageColumns.MAILBOX_KEY);
- try {
- // loop through messages marked as deleted
- while (deletes.moveToNext()) {
- EmailContent.Message oldMessage =
- EmailContent.getContent(deletes, EmailContent.Message.class);
-
- // Finally, delete the update
- Uri uri = ContentUris.withAppendedId(EmailContent.Message.DELETED_CONTENT_URI,
- oldMessage.mId);
- context.getContentResolver().delete(uri, null, null);
- }
- } finally {
- deletes.close();
- }
- }
-} \ No newline at end of file
diff --git a/email2/src/com/android/email/service/PopImapAuthenticatorService.java b/email2/src/com/android/email/service/PopImapAuthenticatorService.java
deleted file mode 100644
index b829be1f3..000000000
--- a/email2/src/com/android/email/service/PopImapAuthenticatorService.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-/**
- * This service needs to be declared separately from the base service
- */
-public class PopImapAuthenticatorService extends AuthenticatorService {
-}
diff --git a/email2/src/com/android/email/service/PopImapSyncAdapterService.java b/email2/src/com/android/email/service/PopImapSyncAdapterService.java
deleted file mode 100644
index 9a1f185e6..000000000
--- a/email2/src/com/android/email/service/PopImapSyncAdapterService.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.service;
-
-import android.accounts.OperationCanceledException;
-import android.app.Service;
-import android.content.AbstractThreadedSyncAdapter;
-import android.content.ContentProviderClient;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SyncResult;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.util.Log;
-
-import com.android.emailcommon.TempDirectory;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.service.EmailServiceProxy;
-
-import java.util.ArrayList;
-
-public class PopImapSyncAdapterService extends Service {
- private static final String TAG = "PopImapSyncAdapterService";
- private static SyncAdapterImpl sSyncAdapter = null;
- private static final Object sSyncAdapterLock = new Object();
-
- public PopImapSyncAdapterService() {
- super();
- }
-
- private static class SyncAdapterImpl extends AbstractThreadedSyncAdapter {
- private Context mContext;
-
- public SyncAdapterImpl(Context context) {
- super(context, true /* autoInitialize */);
- mContext = context;
- }
-
- @Override
- public void onPerformSync(android.accounts.Account account, Bundle extras,
- String authority, ContentProviderClient provider, SyncResult syncResult) {
- try {
- PopImapSyncAdapterService.performSync(mContext, account, extras,
- authority, provider, syncResult);
- } catch (OperationCanceledException e) {
- }
- }
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- synchronized (sSyncAdapterLock) {
- if (sSyncAdapter == null) {
- sSyncAdapter = new SyncAdapterImpl(getApplicationContext());
- }
- }
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return sSyncAdapter.getSyncAdapterBinder();
- }
-
- /**
- * @return whether or not this mailbox retrieves its data from the server (as opposed to just
- * a local mailbox that is never synced).
- */
- public static boolean loadsFromServer(Mailbox m, String protocol) {
- if (HostAuth.LEGACY_SCHEME_IMAP.equals(protocol)) {
- // TODO: actually use a sync flag when creating the mailboxes. Right now we use an
- // approximation for IMAP.
- return m.mType != Mailbox.TYPE_DRAFTS
- && m.mType != Mailbox.TYPE_OUTBOX
- && m.mType != Mailbox.TYPE_SEARCH;
-
- } else if (HostAuth.LEGACY_SCHEME_POP3.equals(protocol)) {
- return Mailbox.TYPE_INBOX == m.mType;
- }
-
- return false;
- }
-
- private static void sync(Context context, long mailboxId, SyncResult syncResult,
- boolean uiRefresh) {
- TempDirectory.setTempDirectory(context);
- Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
- if (mailbox == null) return;
- Account account = Account.restoreAccountWithId(context, mailbox.mAccountKey);
- if (account == null) return;
- ContentResolver resolver = context.getContentResolver();
- String protocol = account.getProtocol(context);
- if ((mailbox.mType != Mailbox.TYPE_OUTBOX) && !loadsFromServer(mailbox, protocol)) {
- // This is an update to a message in a non-syncing mailbox; delete this from the
- // updates table and return
- resolver.delete(Message.UPDATED_CONTENT_URI, Message.MAILBOX_KEY + "=?",
- new String[] {Long.toString(mailbox.mId)});
- return;
- }
- Log.d(TAG, "Mailbox: " + mailbox.mDisplayName);
-
- Uri mailboxUri = ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId);
- ContentValues values = new ContentValues();
- // Set mailbox sync state
- values.put(Mailbox.UI_SYNC_STATUS,
- uiRefresh ? EmailContent.SYNC_STATUS_USER : EmailContent.SYNC_STATUS_BACKGROUND);
- resolver.update(mailboxUri, values, null, null);
- try {
- try {
- if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
- EmailServiceStub.sendMailImpl(context, account.mId);
- } else if (protocol.equals(HostAuth.LEGACY_SCHEME_IMAP)) {
- ImapService.synchronizeMailboxSynchronous(context, account, mailbox);
- } else {
- Pop3Service.synchronizeMailboxSynchronous(context, account, mailbox);
- }
- } catch (MessagingException e) {
- int cause = e.getExceptionType();
- switch(cause) {
- case MessagingException.IOERROR:
- syncResult.stats.numIoExceptions++;
- break;
- case MessagingException.AUTHENTICATION_FAILED:
- syncResult.stats.numAuthExceptions++;
- break;
- }
- }
- } finally {
- // Always clear our sync state
- values.put(Mailbox.UI_SYNC_STATUS, EmailContent.SYNC_STATUS_NONE);
- resolver.update(mailboxUri, values, null, null);
- }
- }
-
- /**
- * Partial integration with system SyncManager; we initiate manual syncs upon request
- */
- private static void performSync(Context context, android.accounts.Account account,
- Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult)
- throws OperationCanceledException {
- // Find an EmailProvider account with the Account's email address
- Cursor c = null;
- try {
- c = provider.query(com.android.emailcommon.provider.Account.CONTENT_URI,
- Account.CONTENT_PROJECTION, AccountColumns.EMAIL_ADDRESS + "=?",
- new String[] {account.name}, null);
- if (c != null && c.moveToNext()) {
- Account acct = new Account();
- acct.restore(c);
- if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD)) {
- Log.d(TAG, "Upload sync request for " + acct.mDisplayName);
- // See if any boxes have mail...
- ArrayList<Long> mailboxesToUpdate;
- Cursor updatesCursor = provider.query(Message.UPDATED_CONTENT_URI,
- new String[] {Message.MAILBOX_KEY},
- Message.ACCOUNT_KEY + "=?",
- new String[] {Long.toString(acct.mId)},
- null);
- try {
- if ((updatesCursor == null) || (updatesCursor.getCount() == 0)) return;
- mailboxesToUpdate = new ArrayList<Long>();
- while (updatesCursor.moveToNext()) {
- Long mailboxId = updatesCursor.getLong(0);
- if (!mailboxesToUpdate.contains(mailboxId)) {
- mailboxesToUpdate.add(mailboxId);
- }
- }
- } finally {
- if (updatesCursor != null) {
- updatesCursor.close();
- }
- }
- for (long mailboxId: mailboxesToUpdate) {
- sync(context, mailboxId, syncResult, false);
- }
- } else {
- Log.d(TAG, "Sync request for " + acct.mDisplayName);
- Log.d(TAG, extras.toString());
- long mailboxId = extras.getLong(EmailServiceStub.SYNC_EXTRA_MAILBOX_ID,
- Mailbox.NO_MAILBOX);
- boolean isInbox = false;
- if (mailboxId == Mailbox.NO_MAILBOX) {
- mailboxId = Mailbox.findMailboxOfType(context, acct.mId,
- Mailbox.TYPE_INBOX);
- if (mailboxId == Mailbox.NO_MAILBOX) {
- // Update folders?
- EmailServiceProxy service =
- EmailServiceUtils.getServiceForAccount(context, null, acct.mId);
- service.updateFolderList(acct.mId);
- }
- isInbox = true;
- }
- if (mailboxId == Mailbox.NO_MAILBOX) return;
- boolean uiRefresh =
- extras.getBoolean(ContentResolver.SYNC_EXTRAS_FORCE, false);
- sync(context, mailboxId, syncResult, uiRefresh);
-
- // Outbox is a special case here
- Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
- if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
- return;
- }
-
- // Convert from minutes to seconds
- int syncFrequency = acct.mSyncInterval * 60;
- // Values < 0 are for "never" or "push"; 0 is undefined
- if (syncFrequency <= 0) return;
- Bundle ex = new Bundle();
- if (!isInbox) {
- ex.putLong(EmailServiceStub.SYNC_EXTRA_MAILBOX_ID, mailboxId);
- }
- Log.d(TAG, "Setting periodic sync for " + acct.mDisplayName + ": " +
- syncFrequency + " seconds");
- ContentResolver.addPeriodicSync(account, authority, ex, syncFrequency);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (c != null) {
- c.close();
- }
- }
- }
-} \ No newline at end of file
diff --git a/email2/src/com/android/email/view/CertificateSelector.java b/email2/src/com/android/email/view/CertificateSelector.java
deleted file mode 100644
index 90ce6d238..000000000
--- a/email2/src/com/android/email/view/CertificateSelector.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.email.view;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.security.KeyChain;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-
-import com.android.email.R;
-import com.android.email.activity.UiUtilities;
-
-/**
- * A simple view that can be used to select a certificate from the system {@link KeyChain}.
- *
- * Host activities must register themselves view {@link #setHostActivity} for this selector to work.
- */
-public class CertificateSelector extends RelativeLayout implements OnClickListener {
-
- /** Button to select or remove the certificate. */
- private Button mSelectButton;
- private TextView mAliasText;
-
- /** The value of the cert selected, if any. Null, otherwise. */
- private String mValue;
-
- /** The host activity. */
- private HostCallback mHost;
-
- public interface HostCallback {
- void onCertificateRequested();
- }
-
- public CertificateSelector(Context context) {
- super(context);
- }
- public CertificateSelector(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- public CertificateSelector(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- public void setHostActivity(HostCallback host) {
- mHost = host;
- }
-
- public void setDelegate(String uri) {
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- mAliasText = UiUtilities.getView(this, R.id.certificate_alias);
- mSelectButton = UiUtilities.getView(this, R.id.select_button);
- mSelectButton.setOnClickListener(this);
- setCertificate(null);
- }
-
- public void setCertificate(String alias) {
- Resources res = getResources();
- mValue = alias;
- mAliasText.setText(
- (alias == null)
- ? res.getString(R.string.account_setup_exchange_no_certificate)
- : alias);
- mSelectButton.setText(res.getString(
- (alias == null)
- ? R.string.account_setup_exchange_select_certificate
- : R.string.account_setup_exchange_remove_certificate));
- }
-
- public boolean hasCertificate() {
- return mValue != null;
- }
-
- /**
- * Gets the alias for the currently selected certificate, or null if one is not selected.
- */
- public String getCertificate() {
- return mValue;
- }
-
-
- @Override
- public void onClick(View target) {
- if (target == mSelectButton && mHost != null) {
- if (hasCertificate()) {
- // Handle the click on the button when it says "Remove"
- setCertificate(null);
- } else {
- mHost.onCertificateRequested();
- }
- }
- }
-
- @Override
- protected void onRestoreInstanceState(Parcelable parcel) {
- SavedState savedState = (SavedState) parcel;
- super.onRestoreInstanceState(savedState.getSuperState());
- setCertificate(savedState.mValue);
- }
-
- @Override
- protected Parcelable onSaveInstanceState() {
- return new SavedState(super.onSaveInstanceState(), getCertificate());
- }
-
- public static class SavedState extends BaseSavedState {
- final String mValue;
-
- SavedState(Parcelable superState, String value) {
- super(superState);
- mValue = value;
- }
-
- @Override
- public void writeToParcel(Parcel out, int flags) {
- super.writeToParcel(out, flags);
- out.writeString(mValue);
- }
-
- @SuppressWarnings("hiding")
- public static final Parcelable.Creator<SavedState> CREATOR
- = new Parcelable.Creator<SavedState>() {
- public SavedState createFromParcel(Parcel in) {
- return new SavedState(in);
- }
-
- public SavedState[] newArray(int size) {
- return new SavedState[size];
- }
- };
-
- private SavedState(Parcel in) {
- super(in);
- mValue = in.readString();
- }
- }
-}
diff --git a/email2/src/com/android/email2/ui/CreateShortcutActivityEmail.java b/email2/src/com/android/email2/ui/CreateShortcutActivityEmail.java
deleted file mode 100644
index 0dc08ad47..000000000
--- a/email2/src/com/android/email2/ui/CreateShortcutActivityEmail.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc.
- * Licensed to The Android Open Source Project.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email2.ui;
-
-import com.android.mail.providers.Account;
-import com.android.mail.ui.FolderSelectionActivity;
-import com.android.mail.ui.MailboxSelectionActivity;
-import com.android.mail.utils.AccountUtils;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-
-public class CreateShortcutActivityEmail extends Activity {
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- Account[] cachedAccounts = AccountUtils.getSyncingAccounts(this);
- Intent intent = getIntent();
- if (cachedAccounts != null && cachedAccounts.length == 1) {
- intent.setClass(this, FolderSelectionActivity.class);
- intent.setFlags(
- Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_FORWARD_RESULT);
- intent.setAction(Intent.ACTION_CREATE_SHORTCUT);
- intent.putExtra(FolderSelectionActivity.EXTRA_ACCOUNT_SHORTCUT,
- cachedAccounts[0]);
- } else {
- intent.setClass(this, MailboxSelectionActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
- }
- startActivity(intent);
- finish();
- }
-}
diff --git a/email2/src/com/android/email2/ui/MailActivityEmail.java b/email2/src/com/android/email2/ui/MailActivityEmail.java
deleted file mode 100644
index 915bf8cd4..000000000
--- a/email2/src/com/android/email2/ui/MailActivityEmail.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email2.ui;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.os.Bundle;
-import android.util.Log;
-
-import com.android.email.NotificationController;
-import com.android.email.Preferences;
-import com.android.email.R;
-import com.android.email.service.AttachmentDownloadService;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email.service.MailService;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.TempDirectory;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.service.EmailServiceProxy;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-
-public class MailActivityEmail extends com.android.mail.ui.MailActivity {
- /**
- * If this is enabled there will be additional logging information sent to
- * Log.d, including protocol dumps.
- *
- * This should only be used for logs that are useful for debbuging user problems,
- * not for internal/development logs.
- *
- * This can be enabled by typing "debug" in the AccountFolderList activity.
- * Changing the value to 'true' here will likely have no effect at all!
- *
- * TODO: rename this to sUserDebug, and rename LOGD below to DEBUG.
- */
- public static boolean DEBUG;
-
- // Exchange debugging flags (passed to Exchange, when available, via EmailServiceProxy)
- public static boolean DEBUG_EXCHANGE;
- public static boolean DEBUG_VERBOSE;
- public static boolean DEBUG_FILE;
-
- /**
- * If true, inhibit hardware graphics acceleration in UI (for a/b testing)
- */
- public static boolean sDebugInhibitGraphicsAcceleration = false;
-
- /**
- * Specifies how many messages will be shown in a folder by default. This number is set
- * on each new folder and can be incremented with "Load more messages..." by the
- * VISIBLE_LIMIT_INCREMENT
- */
- public static final int VISIBLE_LIMIT_DEFAULT = 25;
-
- /**
- * Number of additional messages to load when a user selects "Load more messages..."
- */
- public static final int VISIBLE_LIMIT_INCREMENT = 25;
-
- /**
- * This is used to force stacked UI to return to the "welcome" screen any time we change
- * the accounts list (e.g. deleting accounts in the Account Manager preferences.)
- */
- private static boolean sAccountsChangedNotification = false;
-
- private static String sMessageDecodeErrorString;
-
- private static Thread sUiThread;
-
- /**
- * Asynchronous version of {@link #setServicesEnabledSync(Context)}. Use when calling from
- * UI thread (or lifecycle entry points.)
- *
- * @param context
- */
- public static void setServicesEnabledAsync(final Context context) {
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- setServicesEnabledSync(context);
- }
- });
- }
-
- /**
- * Called throughout the application when the number of accounts has changed. This method
- * enables or disables the Compose activity, the boot receiver and the service based on
- * whether any accounts are configured.
- *
- * Blocking call - do not call from UI/lifecycle threads.
- *
- * @param context
- * @return true if there are any accounts configured.
- */
- public static boolean setServicesEnabledSync(Context context) {
- Cursor c = null;
- try {
- c = context.getContentResolver().query(
- Account.CONTENT_URI,
- Account.ID_PROJECTION,
- null, null, null);
- boolean enable = c.getCount() > 0;
- setServicesEnabled(context, enable);
- return enable;
- } finally {
- if (c != null) {
- c.close();
- }
- }
- }
-
- private static void setServicesEnabled(Context context, boolean enabled) {
- PackageManager pm = context.getPackageManager();
- pm.setComponentEnabledSetting(
- new ComponentName(context, MailService.class),
- enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
- PackageManager.DONT_KILL_APP);
- pm.setComponentEnabledSetting(
- new ComponentName(context, AttachmentDownloadService.class),
- enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
- PackageManager.DONT_KILL_APP);
-
- // Start/stop the various services depending on whether there are any accounts
- startOrStopService(enabled, context, new Intent(context, AttachmentDownloadService.class));
- NotificationController.getInstance(context).watchForMessages(enabled);
- }
-
- /**
- * Starts or stops the service as necessary.
- * @param enabled If {@code true}, the service will be started. Otherwise, it will be stopped.
- * @param context The context to manage the service with.
- * @param intent The intent of the service to be managed.
- */
- private static void startOrStopService(boolean enabled, Context context, Intent intent) {
- if (enabled) {
- context.startService(intent);
- } else {
- context.stopService(intent);
- }
- }
-
- @Override
- public void onCreate(Bundle bundle) {
- super.onCreate(bundle);
- sUiThread = Thread.currentThread();
- Preferences prefs = Preferences.getPreferences(this);
- DEBUG = prefs.getEnableDebugLogging();
- sDebugInhibitGraphicsAcceleration = prefs.getInhibitGraphicsAcceleration();
- enableStrictMode(prefs.getEnableStrictMode());
- TempDirectory.setTempDirectory(this);
-
- // Enable logging in the EAS service, so it starts up as early as possible.
- updateLoggingFlags(this);
-
- // Get a helper string used deep inside message decoders (which don't have context)
- sMessageDecodeErrorString = getString(R.string.message_decode_error);
-
- // Make sure all required services are running when the app is started (can prevent
- // issues after an adb sync/install)
- setServicesEnabledAsync(this);
- }
-
- /**
- * Load enabled debug flags from the preferences and update the EAS debug flag.
- */
- public static void updateLoggingFlags(Context context) {
- Preferences prefs = Preferences.getPreferences(context);
- int debugLogging = prefs.getEnableDebugLogging() ? EmailServiceProxy.DEBUG_BIT : 0;
- int verboseLogging =
- prefs.getEnableExchangeLogging() ? EmailServiceProxy.DEBUG_VERBOSE_BIT : 0;
- int fileLogging =
- prefs.getEnableExchangeFileLogging() ? EmailServiceProxy.DEBUG_FILE_BIT : 0;
- int enableStrictMode =
- prefs.getEnableStrictMode() ? EmailServiceProxy.DEBUG_ENABLE_STRICT_MODE : 0;
- int debugBits = debugLogging | verboseLogging | fileLogging | enableStrictMode;
- EmailServiceUtils.setRemoteServicesLogging(context, debugBits);
- }
-
- /**
- * Internal, utility method for logging.
- * The calls to log() must be guarded with "if (Email.LOGD)" for performance reasons.
- */
- public static void log(String message) {
- Log.d(Logging.LOG_TAG, message);
- }
-
- /**
- * Called by the accounts reconciler to notify that accounts have changed, or by "Welcome"
- * to clear the flag.
- * @param setFlag true to set the notification flag, false to clear it
- */
- public static synchronized void setNotifyUiAccountsChanged(boolean setFlag) {
- sAccountsChangedNotification = setFlag;
- }
-
- /**
- * Called from activity onResume() functions to check for an accounts-changed condition, at
- * which point they should finish() and jump to the Welcome activity.
- */
- public static synchronized boolean getNotifyUiAccountsChanged() {
- return sAccountsChangedNotification;
- }
-
- public static void warnIfUiThread() {
- if (Thread.currentThread().equals(sUiThread)) {
- Log.w(Logging.LOG_TAG, "Method called on the UI thread", new Exception("STACK TRACE"));
- }
- }
-
- /**
- * Retrieve a simple string that can be used when message decoders encounter bad data.
- * This is provided here because the protocol decoders typically don't have mContext.
- */
- public static String getMessageDecodeErrorString() {
- return sMessageDecodeErrorString != null ? sMessageDecodeErrorString : "";
- }
-
- public static void enableStrictMode(boolean enabled) {
- Utility.enableStrictMode(enabled);
- }
-}
diff --git a/email2/src/com/android/email2/ui/MailboxSelectionActivityEmail.java b/email2/src/com/android/email2/ui/MailboxSelectionActivityEmail.java
deleted file mode 100644
index 6831ef193..000000000
--- a/email2/src/com/android/email2/ui/MailboxSelectionActivityEmail.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.email2.ui;
-
- /* An activity that shows the list of all the available accounts and return the
- * one selected in onResult().
- */
-public class MailboxSelectionActivityEmail extends com.android.mail.ui.MailboxSelectionActivity {
-
-} \ No newline at end of file
diff --git a/email2/src/com/android/mail/browse/EmailConversationProvider.java b/email2/src/com/android/mail/browse/EmailConversationProvider.java
deleted file mode 100644
index ebff3137c..000000000
--- a/email2/src/com/android/mail/browse/EmailConversationProvider.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.mail.browse;
-
-import com.android.mail.browse.ConversationCursor.ConversationProvider;
-
-import java.lang.Override;
-
-public class EmailConversationProvider extends ConversationProvider {
- // The authority of our conversation provider (a forwarding provider)
- // This string must match the declaration in AndroidManifest.xml
- private static final String sAuthority = "com.android.email2.conversation.provider";
-
- @Override
- protected String getAuthority() {
- return sAuthority;
- }
-} \ No newline at end of file
diff --git a/email2/src/com/android/mail/providers/EmailAccountCacheProvider.java b/email2/src/com/android/mail/providers/EmailAccountCacheProvider.java
deleted file mode 100644
index a311e36cb..000000000
--- a/email2/src/com/android/mail/providers/EmailAccountCacheProvider.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.mail.providers;
-
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-
-import com.android.email.activity.setup.AccountSettings;
-
-public class EmailAccountCacheProvider extends MailAppProvider {
- // Content provider for Email
- private static final String sAuthority = "com.android.email2.accountcache";
- /**
- * Authority for the suggestions provider. This is specified in AndroidManifest.xml and
- * res/xml/searchable.xml.
- */
- private static final String sSuggestionsAuthority = "com.android.email.suggestionsprovider";
-
- @Override
- protected String getAuthority() {
- return sAuthority;
- }
-
- @Override
- protected Intent getNoAccountsIntent(Context context) {
- Intent intent = new Intent();
- intent.setAction(Intent.ACTION_EDIT);
- intent.setData(Uri.parse("content://ui.email.android.com/settings"));
- intent.putExtra(AccountSettings.EXTRA_NO_ACCOUNTS, true);
- return intent;
- }
-
- @Override
- public String getSuggestionAuthority() {
- return sSuggestionsAuthority;
- }
-}
diff --git a/email2/src/com/android/mail/providers/protos/boot/AccountReceiver.java b/email2/src/com/android/mail/providers/protos/boot/AccountReceiver.java
deleted file mode 100644
index 16eed27d3..000000000
--- a/email2/src/com/android/mail/providers/protos/boot/AccountReceiver.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.mail.providers.protos.boot;
-
-import com.android.mail.providers.MailAppProvider;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-
-public class AccountReceiver extends BroadcastReceiver {
- /**
- * Intent used to notify interested parties that the Mail provider has been created.
- */
- public static final String ACTION_PROVIDER_CREATED
- = "com.android.email2.providers.protos.boot.intent.ACTION_PROVIDER_CREATED";
-
- private static final Uri ACCOUNTS_URI =
- Uri.parse("content://com.android.email.provider/uiaccts");
-
-
- @Override
- public void onReceive(Context context, Intent intent) {
- MailAppProvider.addAccountsForUriAsync(ACCOUNTS_URI);
- }
-}
diff --git a/email2/src/com/android/mail/utils/LogTag.java b/email2/src/com/android/mail/utils/LogTag.java
deleted file mode 100644
index b0c39879f..000000000
--- a/email2/src/com/android/mail/utils/LogTag.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Copyright (c) 2012, Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.mail.utils;
-
-public class LogTag {
- private static String LOG_TAG = "Email";
-
- /**
- * Get the log tag to apply to logging.
- */
- public static String getLogTag() {
- return LOG_TAG;
- }
-}
diff --git a/email2/src/com/beetstra/ThirdPartyProject.prop b/email2/src/com/beetstra/ThirdPartyProject.prop
deleted file mode 100644
index 421e8cca6..000000000
--- a/email2/src/com/beetstra/ThirdPartyProject.prop
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2010 Google Inc. All Rights Reserved.
-#Fri Jul 16 10:03:09 PDT 2010
-currentVersion=1.0.0
-version=1.0.0
-isNative=false
-name=utf7_support
-keywords=utf7 support
-onDevice=true
-homepage=http\://sourceforge.net/projects/jutf7/
diff --git a/email2/src/com/beetstra/jutf7/Base64Util.java b/email2/src/com/beetstra/jutf7/Base64Util.java
deleted file mode 100644
index 6dffb32c5..000000000
--- a/email2/src/com/beetstra/jutf7/Base64Util.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2006 J.T. Beetstra
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * ====================================================================
- */
-
-package com.beetstra.jutf7;
-
-import java.util.Arrays;
-
-/**
- * <p>
- * Represent a base 64 mapping. The 64 characters used in the encoding can be
- * specified, since modified-UTF-7 uses other characters than UTF-7 (',' instead
- * of '/').
- * </p>
- * <p>
- * The exact type of the arguments and result values is adapted to the needs of
- * the encoder and decoder, as opposed to following a strict interpretation of
- * base 64.
- * </p>
- * <p>
- * Base 64, as specified in RFC 2045, is an encoding used to encode bytes as
- * characters. In (modified-)UTF-7 however, it is used to encode characters as
- * bytes, using some intermediate steps:
- * </p>
- * <ol>
- * <li>Encode all characters as a 16-bit (UTF-16) integer value</li>
- * <li>Write this as stream of bytes (most-significant first)</li>
- * <li>Encode these bytes using (modified) base 64 encoding</li>
- * <li>Write the thus formed stream of characters as a stream of bytes, using
- * ASCII encoding</li>
- * </ol>
- *
- * @author Jaap Beetstra
- */
-class Base64Util {
- private static final int ALPHABET_LENGTH = 64;
- private final char[] alphabet;
- private final int[] inverseAlphabet;
-
- /**
- * Initializes the class with the specified encoding/decoding alphabet.
- *
- * @param alphabet
- * @throws IllegalArgumentException if alphabet is not 64 characters long or
- * contains characters which are not 7-bit ASCII
- */
- Base64Util(final String alphabet) {
- this.alphabet = alphabet.toCharArray();
- if (alphabet.length() != ALPHABET_LENGTH)
- throw new IllegalArgumentException("alphabet has incorrect length (should be 64, not "
- + alphabet.length() + ")");
- inverseAlphabet = new int[128];
- Arrays.fill(inverseAlphabet, -1);
- for (int i = 0; i < this.alphabet.length; i++) {
- final char ch = this.alphabet[i];
- if (ch >= 128)
- throw new IllegalArgumentException("invalid character in alphabet: " + ch);
- inverseAlphabet[ch] = i;
- }
- }
-
- /**
- * Returns the integer value of the six bits represented by the specified
- * character.
- *
- * @param ch The character, as a ASCII encoded byte
- * @return The six bits, as an integer value, or -1 if the byte is not in
- * the alphabet
- */
- int getSextet(final byte ch) {
- if (ch >= 128)
- return -1;
- return inverseAlphabet[ch];
- }
-
- /**
- * Tells whether the alphabet contains the specified character.
- *
- * @param ch The character
- * @return true if the alphabet contains <code>ch</code>, false otherwise
- */
- boolean contains(final char ch) {
- if (ch >= 128)
- return false;
- return inverseAlphabet[ch] >= 0;
- }
-
- /**
- * Encodes the six bit group as a character.
- *
- * @param sextet The six bit group to be encoded
- * @return The ASCII value of the character
- */
- byte getChar(final int sextet) {
- return (byte)alphabet[sextet];
- }
-}
diff --git a/email2/src/com/beetstra/jutf7/CharsetProvider.java b/email2/src/com/beetstra/jutf7/CharsetProvider.java
deleted file mode 100644
index 582d6090b..000000000
--- a/email2/src/com/beetstra/jutf7/CharsetProvider.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2006 J.T. Beetstra
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * ====================================================================
- */
-
-package com.beetstra.jutf7;
-
-import java.nio.charset.Charset;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * <p>
- * Charset service-provider class used for both variants of the UTF-7 charset
- * and the modified-UTF-7 charset.
- * </p>
- *
- * @author Jaap Beetstra
- */
-public class CharsetProvider extends java.nio.charset.spi.CharsetProvider {
- private static final String UTF7_NAME = "UTF-7";
- private static final String UTF7_O_NAME = "X-UTF-7-OPTIONAL";
- private static final String UTF7_M_NAME = "X-MODIFIED-UTF-7";
- private static final String[] UTF7_ALIASES = new String[] {
- "UNICODE-1-1-UTF-7", "CSUNICODE11UTF7", "X-RFC2152", "X-RFC-2152"
- };
- private static final String[] UTF7_O_ALIASES = new String[] {
- "X-RFC2152-OPTIONAL", "X-RFC-2152-OPTIONAL"
- };
- private static final String[] UTF7_M_ALIASES = new String[] {
- "X-IMAP-MODIFIED-UTF-7", "X-IMAP4-MODIFIED-UTF7", "X-IMAP4-MODIFIED-UTF-7",
- "X-RFC3501", "X-RFC-3501"
- };
- private Charset utf7charset = new UTF7Charset(UTF7_NAME, UTF7_ALIASES, false);
- private Charset utf7oCharset = new UTF7Charset(UTF7_O_NAME, UTF7_O_ALIASES, true);
- private Charset imap4charset = new ModifiedUTF7Charset(UTF7_M_NAME, UTF7_M_ALIASES);
- private List<Charset> charsets;
-
- public CharsetProvider() {
- charsets = Arrays.asList(new Charset[] {
- utf7charset, imap4charset, utf7oCharset
- });
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Charset charsetForName(String charsetName) {
- charsetName = charsetName.toUpperCase();
- for (Iterator<Charset> iter = charsets.iterator(); iter.hasNext();) {
- Charset charset = iter.next();
- if (charset.name().equals(charsetName))
- return charset;
- }
- for (Iterator<Charset> iter = charsets.iterator(); iter.hasNext();) {
- Charset charset = iter.next();
- if (charset.aliases().contains(charsetName))
- return charset;
- }
- return null;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Iterator<Charset> charsets() {
- return charsets.iterator();
- }
-}
diff --git a/email2/src/com/beetstra/jutf7/ModifiedUTF7Charset.java b/email2/src/com/beetstra/jutf7/ModifiedUTF7Charset.java
deleted file mode 100644
index 603a19ee9..000000000
--- a/email2/src/com/beetstra/jutf7/ModifiedUTF7Charset.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2006 J.T. Beetstra
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * ====================================================================
- */
-
-package com.beetstra.jutf7;
-
-/**
- * <p>
- * The character set specified in RFC 3501 to use for IMAP4rev1 mailbox name
- * encoding.
- * </p>
- *
- * @see <a href="http://tools.ietf.org/html/rfc3501">RFC 3501< /a>
- * @author Jaap Beetstra
- */
-class ModifiedUTF7Charset extends UTF7StyleCharset {
- private static final String MODIFIED_BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- + "abcdefghijklmnopqrstuvwxyz" + "0123456789+,";
-
- ModifiedUTF7Charset(String name, String[] aliases) {
- super(name, aliases, MODIFIED_BASE64_ALPHABET, true);
- }
-
- boolean canEncodeDirectly(char ch) {
- if (ch == shift())
- return false;
- return ch >= 0x20 && ch <= 0x7E;
- }
-
- byte shift() {
- return '&';
- }
-
- byte unshift() {
- return '-';
- }
-}
diff --git a/email2/src/com/beetstra/jutf7/UTF7Charset.java b/email2/src/com/beetstra/jutf7/UTF7Charset.java
deleted file mode 100644
index 8c85472cf..000000000
--- a/email2/src/com/beetstra/jutf7/UTF7Charset.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2006 J.T. Beetstra
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * ====================================================================
- */
-
-package com.beetstra.jutf7;
-
-/**
- * <p>
- * The character set specified in RFC 2152. Two variants are supported using the
- * encodeOptional constructor flag
- * </p>
- *
- * @see <a href="http://tools.ietf.org/html/rfc2152">RFC 2152< /a>
- * @author Jaap Beetstra
- */
-class UTF7Charset extends UTF7StyleCharset {
- private static final String BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/";
- private static final String SET_D = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'(),-./:?";
- private static final String SET_O = "!\"#$%&*;<=>@[]^_`{|}";
- private static final String RULE_3 = " \t\r\n";
- final String directlyEncoded;
-
- UTF7Charset(String name, String[] aliases, boolean includeOptional) {
- super(name, aliases, BASE64_ALPHABET, false);
- if (includeOptional)
- this.directlyEncoded = SET_D + SET_O + RULE_3;
- else
- this.directlyEncoded = SET_D + RULE_3;
- }
-
- /*
- * (non-Javadoc)
- * @see com.beetstra.jutf7.UTF7StyleCharset#canEncodeDirectly(char)
- */
- boolean canEncodeDirectly(char ch) {
- return directlyEncoded.indexOf(ch) >= 0;
- }
-
- /*
- * (non-Javadoc)
- * @see com.beetstra.jutf7.UTF7StyleCharset#shift()
- */
- byte shift() {
- return '+';
- }
-
- /*
- * (non-Javadoc)
- * @see com.beetstra.jutf7.UTF7StyleCharset#unshift()
- */
- byte unshift() {
- return '-';
- }
-}
diff --git a/email2/src/com/beetstra/jutf7/UTF7StyleCharset.java b/email2/src/com/beetstra/jutf7/UTF7StyleCharset.java
deleted file mode 100644
index 0878af603..000000000
--- a/email2/src/com/beetstra/jutf7/UTF7StyleCharset.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2006 J.T. Beetstra
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * ====================================================================
- */
-
-package com.beetstra.jutf7;
-
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CharsetEncoder;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * <p>
- * Abstract base class for UTF-7 style encoding and decoding.
- * </p>
- *
- * @author Jaap Beetstra
- */
-abstract class UTF7StyleCharset extends Charset {
- private static final List CONTAINED = Arrays.asList(new String[] {
- "US-ASCII", "ISO-8859-1", "UTF-8", "UTF-16", "UTF-16LE", "UTF-16BE"
- });
- final boolean strict;
- Base64Util base64;
-
- /**
- * <p>
- * Besides the name and aliases, two additional parameters are required.
- * First the base 64 alphabet used; in modified UTF-7 a slightly different
- * alphabet is used. Additionally, it should be specified if encoders and
- * decoders should be strict about the interpretation of malformed encoded
- * sequences. This is used since modified UTF-7 specifically disallows some
- * constructs which are allowed (or not specifically disallowed) in UTF-7
- * (RFC 2152).
- * </p>
- *
- * @param canonicalName The name as defined in java.nio.charset.Charset
- * @param aliases The aliases as defined in java.nio.charset.Charset
- * @param alphabet The base 64 alphabet used
- * @param strict True if strict handling of sequences is requested
- */
- protected UTF7StyleCharset(String canonicalName, String[] aliases, String alphabet,
- boolean strict) {
- super(canonicalName, aliases);
- this.base64 = new Base64Util(alphabet);
- this.strict = strict;
- }
-
- /*
- * (non-Javadoc)
- * @see java.nio.charset.Charset#contains(java.nio.charset.Charset)
- */
- public boolean contains(final Charset cs) {
- return CONTAINED.contains(cs.name());
- }
-
- /*
- * (non-Javadoc)
- * @see java.nio.charset.Charset#newDecoder()
- */
- public CharsetDecoder newDecoder() {
- return new UTF7StyleCharsetDecoder(this, base64, strict);
- }
-
- /*
- * (non-Javadoc)
- * @see java.nio.charset.Charset#newEncoder()
- */
- public CharsetEncoder newEncoder() {
- return new UTF7StyleCharsetEncoder(this, base64, strict);
- }
-
- /**
- * Tells if a character can be encoded using simple (US-ASCII) encoding or
- * requires base 64 encoding.
- *
- * @param ch The character
- * @return True if the character can be encoded directly, false otherwise
- */
- abstract boolean canEncodeDirectly(char ch);
-
- /**
- * Returns character used to switch to base 64 encoding.
- *
- * @return The shift character
- */
- abstract byte shift();
-
- /**
- * Returns character used to switch from base 64 encoding to simple
- * encoding.
- *
- * @return The unshift character
- */
- abstract byte unshift();
-}
diff --git a/email2/src/com/beetstra/jutf7/UTF7StyleCharsetDecoder.java b/email2/src/com/beetstra/jutf7/UTF7StyleCharsetDecoder.java
deleted file mode 100644
index 2fa9d3435..000000000
--- a/email2/src/com/beetstra/jutf7/UTF7StyleCharsetDecoder.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2006 J.T. Beetstra
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * ====================================================================
- */
-
-package com.beetstra.jutf7;
-
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CoderResult;
-
-/**
- * <p>
- * The CharsetDecoder used to decode both variants of the UTF-7 charset and the
- * modified-UTF-7 charset.
- * </p>
- *
- * @author Jaap Beetstra
- */
-class UTF7StyleCharsetDecoder extends CharsetDecoder {
- private final Base64Util base64;
- private final byte shift;
- private final byte unshift;
- private final boolean strict;
- private boolean base64mode;
- private int bitsRead;
- private int tempChar;
- private boolean justShifted;
- private boolean justUnshifted;
-
- UTF7StyleCharsetDecoder(UTF7StyleCharset cs, Base64Util base64, boolean strict) {
- super(cs, 0.6f, 1.0f);
- this.base64 = base64;
- this.strict = strict;
- this.shift = cs.shift();
- this.unshift = cs.unshift();
- }
-
- /*
- * (non-Javadoc)
- * @see java.nio.charset.CharsetDecoder#decodeLoop(java.nio.ByteBuffer,
- * java.nio.CharBuffer)
- */
- protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) {
- while (in.hasRemaining()) {
- byte b = in.get();
- if (base64mode) {
- if (b == unshift) {
- if (base64bitsWaiting())
- return malformed(in);
- if (justShifted) {
- if (!out.hasRemaining())
- return overflow(in);
- out.put((char)shift);
- } else
- justUnshifted = true;
- setUnshifted();
- } else {
- if (!out.hasRemaining())
- return overflow(in);
- CoderResult result = handleBase64(in, out, b);
- if (result != null)
- return result;
- }
- justShifted = false;
- } else {
- if (b == shift) {
- base64mode = true;
- if (justUnshifted && strict)
- return malformed(in);
- justShifted = true;
- continue;
- }
- if (!out.hasRemaining())
- return overflow(in);
- out.put((char)b);
- justUnshifted = false;
- }
- }
- return CoderResult.UNDERFLOW;
- }
-
- private CoderResult overflow(ByteBuffer in) {
- in.position(in.position() - 1);
- return CoderResult.OVERFLOW;
- }
-
- /**
- * <p>
- * Decodes a byte in <i>base 64 mode</i>. Will directly write a character to
- * the output buffer if completed.
- * </p>
- *
- * @param in The input buffer
- * @param out The output buffer
- * @param lastRead Last byte read from the input buffer
- * @return CoderResult.malformed if a non-base 64 character was encountered
- * in strict mode, null otherwise
- */
- private CoderResult handleBase64(ByteBuffer in, CharBuffer out, byte lastRead) {
- CoderResult result = null;
- int sextet = base64.getSextet(lastRead);
- if (sextet >= 0) {
- bitsRead += 6;
- if (bitsRead < 16) {
- tempChar += sextet << (16 - bitsRead);
- } else {
- bitsRead -= 16;
- tempChar += sextet >> (bitsRead);
- out.put((char)tempChar);
- tempChar = (sextet << (16 - bitsRead)) & 0xFFFF;
- }
- } else {
- if (strict)
- return malformed(in);
- out.put((char)lastRead);
- if (base64bitsWaiting())
- result = malformed(in);
- setUnshifted();
- }
- return result;
- }
-
- /*
- * (non-Javadoc)
- * @see java.nio.charset.CharsetDecoder#implFlush(java.nio.CharBuffer)
- */
- protected CoderResult implFlush(CharBuffer out) {
- if ((base64mode && strict) || base64bitsWaiting())
- return CoderResult.malformedForLength(1);
- return CoderResult.UNDERFLOW;
- }
-
- /*
- * (non-Javadoc)
- * @see java.nio.charset.CharsetDecoder#implReset()
- */
- protected void implReset() {
- setUnshifted();
- justUnshifted = false;
- }
-
- /**
- * <p>
- * Resets the input buffer position to just before the last byte read, and
- * returns a result indicating to skip the last byte.
- * </p>
- *
- * @param in The input buffer
- * @return CoderResult.malformedForLength(1);
- */
- private CoderResult malformed(ByteBuffer in) {
- in.position(in.position() - 1);
- return CoderResult.malformedForLength(1);
- }
-
- /**
- * @return True if there are base64 encoded characters waiting to be written
- */
- private boolean base64bitsWaiting() {
- return tempChar != 0 || bitsRead >= 6;
- }
-
- /**
- * <p>
- * Updates internal state to reflect the decoder is no longer in <i>base 64
- * mode</i>
- * </p>
- */
- private void setUnshifted() {
- base64mode = false;
- bitsRead = 0;
- tempChar = 0;
- }
-}
diff --git a/email2/src/com/beetstra/jutf7/UTF7StyleCharsetEncoder.java b/email2/src/com/beetstra/jutf7/UTF7StyleCharsetEncoder.java
deleted file mode 100644
index de8239713..000000000
--- a/email2/src/com/beetstra/jutf7/UTF7StyleCharsetEncoder.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2006 J.T. Beetstra
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * ====================================================================
- */
-
-package com.beetstra.jutf7;
-
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.CharsetEncoder;
-import java.nio.charset.CoderResult;
-
-/**
- * <p>
- * The CharsetEncoder used to encode both variants of the UTF-7 charset and the
- * modified-UTF-7 charset.
- * </p>
- * <p>
- * <strong>Please note this class does not behave strictly according to the
- * specification in Sun Java VMs before 1.6.</strong> This is done to get around
- * a bug in the implementation of
- * {@link java.nio.charset.CharsetEncoder#encode(CharBuffer)}. Unfortunately,
- * that method cannot be overridden.
- * </p>
- *
- * @see <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6221056">JDK
- * bug 6221056< /a>
- * @author Jaap Beetstra
- */
-class UTF7StyleCharsetEncoder extends CharsetEncoder {
- private static final float AVG_BYTES_PER_CHAR = 1.5f;
- private static final float MAX_BYTES_PER_CHAR = 5.0f;
- private final UTF7StyleCharset cs;
- private final Base64Util base64;
- private final byte shift;
- private final byte unshift;
- private final boolean strict;
- private boolean base64mode;
- private int bitsToOutput;
- private int sextet;
- static boolean useUglyHackToForceCallToFlushInJava5;
- static {
- String version = System.getProperty("java.specification.version");
- String vendor = System.getProperty("java.vm.vendor");
- useUglyHackToForceCallToFlushInJava5 = "1.4".equals(version) || "1.5".equals(version);
- useUglyHackToForceCallToFlushInJava5 &= "Sun Microsystems Inc.".equals(vendor);
- }
-
- UTF7StyleCharsetEncoder(UTF7StyleCharset cs, Base64Util base64, boolean strict) {
- super(cs, AVG_BYTES_PER_CHAR, MAX_BYTES_PER_CHAR);
- this.cs = cs;
- this.base64 = base64;
- this.strict = strict;
- this.shift = cs.shift();
- this.unshift = cs.unshift();
- }
-
- /*
- * (non-Javadoc)
- * @see java.nio.charset.CharsetEncoder#implReset()
- */
- protected void implReset() {
- base64mode = false;
- sextet = 0;
- bitsToOutput = 0;
- }
-
- /**
- * {@inheritDoc}
- * <p>
- * Note that this method might return <code>CoderResult.OVERFLOW</code> (as
- * is required by the specification) if insufficient space is available in
- * the output buffer. However, calling it again on JDKs before Java 6
- * triggers a bug in
- * {@link java.nio.charset.CharsetEncoder#flush(ByteBuffer)} causing it to
- * throw an IllegalStateException (the buggy method is <code>final</code>,
- * thus cannot be overridden).
- * </p>
- *
- * @see <a
- * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6227608">
- * JDK bug 6227608< /a>
- * @param out The output byte buffer
- * @return A coder-result object describing the reason for termination
- */
- protected CoderResult implFlush(ByteBuffer out) {
- if (base64mode) {
- if (out.remaining() < 2)
- return CoderResult.OVERFLOW;
- if (bitsToOutput != 0)
- out.put(base64.getChar(sextet));
- out.put(unshift);
- }
- return CoderResult.UNDERFLOW;
- }
-
- /**
- * {@inheritDoc}
- * <p>
- * Note that this method might return <code>CoderResult.OVERFLOW</code>,
- * even though there is sufficient space available in the output buffer.
- * This is done to force the broken implementation of
- * {@link java.nio.charset.CharsetEncoder#encode(CharBuffer)} to call flush
- * (the buggy method is <code>final</code>, thus cannot be overridden).
- * </p>
- * <p>
- * However, String.getBytes() fails if CoderResult.OVERFLOW is returned,
- * since this assumes it always allocates sufficient bytes (maxBytesPerChar
- * * nr_of_chars). Thus, as an extra check, the size of the input buffer is
- * compared against the size of the output buffer. A static variable is used
- * to indicate if a broken java version is used.
- * </p>
- * <p>
- * It is not possible to directly write the last few bytes, since more bytes
- * might be waiting to be encoded then those available in the input buffer.
- * </p>
- *
- * @see <a
- * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6221056">
- * JDK bug 6221056< /a>
- * @param in The input character buffer
- * @param out The output byte buffer
- * @return A coder-result object describing the reason for termination
- */
- protected CoderResult encodeLoop(CharBuffer in, ByteBuffer out) {
- while (in.hasRemaining()) {
- if (out.remaining() < 4)
- return CoderResult.OVERFLOW;
- char ch = in.get();
- if (cs.canEncodeDirectly(ch)) {
- unshift(out, ch);
- out.put((byte)ch);
- } else if (!base64mode && ch == shift) {
- out.put(shift);
- out.put(unshift);
- } else
- encodeBase64(ch, out);
- }
- /*
- * <HACK type="ugly"> These lines are required to trick JDK 1.5 and
- * earlier into flushing when using Charset.encode(String),
- * Charset.encode(CharBuffer) or CharsetEncoder.encode(CharBuffer)
- * Without them, the last few bytes may be missing.
- */
- if (base64mode && useUglyHackToForceCallToFlushInJava5
- && out.limit() != MAX_BYTES_PER_CHAR * in.limit())
- return CoderResult.OVERFLOW;
- /* </HACK> */
- return CoderResult.UNDERFLOW;
- }
-
- /**
- * <p>
- * Writes the bytes necessary to leave <i>base 64 mode</i>. This might
- * include an unshift character.
- * </p>
- *
- * @param out
- * @param ch
- */
- private void unshift(ByteBuffer out, char ch) {
- if (!base64mode)
- return;
- if (bitsToOutput != 0)
- out.put(base64.getChar(sextet));
- if (base64.contains(ch) || ch == unshift || strict)
- out.put(unshift);
- base64mode = false;
- sextet = 0;
- bitsToOutput = 0;
- }
-
- /**
- * <p>
- * Writes the bytes necessary to encode a character in <i>base 64 mode</i>.
- * All bytes which are fully determined will be written. The fields
- * <code>bitsToOutput</code> and <code>sextet</code> are used to remember
- * the bytes not yet fully determined.
- * </p>
- *
- * @param out
- * @param ch
- */
- private void encodeBase64(char ch, ByteBuffer out) {
- if (!base64mode)
- out.put(shift);
- base64mode = true;
- bitsToOutput += 16;
- while (bitsToOutput >= 6) {
- bitsToOutput -= 6;
- sextet += (ch >> bitsToOutput);
- sextet &= 0x3F;
- out.put(base64.getChar(sextet));
- sextet = 0;
- }
- sextet = (ch << (6 - bitsToOutput)) & 0x3F;
- }
-}
diff --git a/emailcommon/Android.mk b/emailcommon/Android.mk
index bb322efa3..b4dddf02f 100644
--- a/emailcommon/Android.mk
+++ b/emailcommon/Android.mk
@@ -20,15 +20,23 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_MODULE := com.android.emailcommon
-LOCAL_STATIC_JAVA_LIBRARIES := guava
+unified_email_src_dir := ../../UnifiedEmail/src
+apache_src_dir := ../../UnifiedEmail/src/org
+
+imported_unified_email_files := \
+ $(unified_email_src_dir)/com/android/mail/utils/LogUtils.java \
+ $(unified_email_src_dir)/com/android/mail/providers/UIProvider.java
+
+LOCAL_MODULE := com.android.emailcommon2
+LOCAL_STATIC_JAVA_LIBRARIES := guava android-common
LOCAL_SRC_FILES := $(call all-java-files-under, src/com/android/emailcommon)
-LOCAL_SRC_FILES += $(call all-java-files-under, src/org)
LOCAL_SRC_FILES += \
src/com/android/emailcommon/service/IEmailService.aidl \
src/com/android/emailcommon/service/IEmailServiceCallback.aidl \
src/com/android/emailcommon/service/IPolicyService.aidl \
src/com/android/emailcommon/service/IAccountService.aidl
+LOCAL_SRC_FILES += $(call all-java-files-under, $(apache_src_dir))
+LOCAL_SRC_FILES += $(imported_unified_email_files)
LOCAL_SDK_VERSION := 14
diff --git a/emailcommon/src/com/android/emailcommon/Api.java b/emailcommon/src/com/android/emailcommon/Api.java
index 2b1e89b03..e20452ebe 100644
--- a/emailcommon/src/com/android/emailcommon/Api.java
+++ b/emailcommon/src/com/android/emailcommon/Api.java
@@ -21,8 +21,9 @@ package com.android.emailcommon;
*
* Level 1: As shipped in HC/MR1
* Level 2: Adds searchMessages to EmailService
+ * Level 3: Adds capabilities query
*
*/
public class Api {
- public static final int LEVEL = 2;
+ public static final int LEVEL = 3;
}
diff --git a/emailcommon/src/com/android/emailcommon/CalendarProviderStub.java b/emailcommon/src/com/android/emailcommon/CalendarProviderStub.java
deleted file mode 100644
index eac371ada..000000000
--- a/emailcommon/src/com/android/emailcommon/CalendarProviderStub.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.emailcommon;
-
-/**
- * This is the only non-SDK reference in the com.android.email project, referencing the once and
- * future CalendarProvider authority name.
- */
-public class CalendarProviderStub {
- public static final String AUTHORITY = "com.android.calendar";
-}
diff --git a/emailcommon/src/com/android/emailcommon/TrafficFlags.java b/emailcommon/src/com/android/emailcommon/TrafficFlags.java
index c8c4e034c..6b858c4c2 100644
--- a/emailcommon/src/com/android/emailcommon/TrafficFlags.java
+++ b/emailcommon/src/com/android/emailcommon/TrafficFlags.java
@@ -19,29 +19,17 @@ package com.android.emailcommon;
import android.content.Context;
import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.utility.Utility;
/**
* Constants for tagging threads for traffic stats, and associated utilities
*
* Example usage:
- * TrafficStats.setThreadStatsTag(accountId | PROTOCOL_IMAP | DATA_EMAIL | REASON_SYNC);
+ * TrafficStats.setThreadStatsTag(accountId | DATA_EMAIL | REASON_SYNC);
*/
public class TrafficFlags {
// Bits 0->15, account id
private static final int ACCOUNT_MASK = 0x0000FFFF;
- // Bits 16&17, protocol (0 = POP3)
- private static final int PROTOCOL_SHIFT = 16;
- private static final int PROTOCOL_MASK = 3 << PROTOCOL_SHIFT;
- public static final int PROTOCOL_POP3 = 0 << PROTOCOL_SHIFT;
- public static final int PROTOCOL_IMAP = 1 << PROTOCOL_SHIFT;
- public static final int PROTOCOL_EAS = 2 << PROTOCOL_SHIFT;
- public static final int PROTOCOL_SMTP = 3 << PROTOCOL_SHIFT;
- private static final String[] PROTOCOLS = new String[] {HostAuth.SCHEME_POP3,
- HostAuth.SCHEME_IMAP, HostAuth.SCHEME_EAS, HostAuth.SCHEME_SMTP};
-
// Bits 18&19, type (0 = EMAIL)
private static final int DATA_SHIFT = 18;
private static final int DATA_MASK = 3 << DATA_SHIFT;
@@ -68,8 +56,7 @@ public class TrafficFlags {
* @return flags for syncing this account
*/
public static int getSyncFlags(Context context, Account account) {
- int protocolIndex = Utility.arrayIndex(PROTOCOLS, account.getProtocol(context));
- return (int)account.mId | REASON_SYNC | (protocolIndex << PROTOCOL_SHIFT);
+ return (int)account.mId | REASON_SYNC;
}
/**
@@ -80,8 +67,7 @@ public class TrafficFlags {
* @return flags for loading an attachment in this account
*/
public static int getAttachmentFlags(Context context, Account account) {
- int protocolIndex = Utility.arrayIndex(PROTOCOLS, account.getProtocol(context));
- return (int)account.mId | REASON_ATTACHMENT_USER | (protocolIndex << PROTOCOL_SHIFT);
+ return (int)account.mId | REASON_ATTACHMENT_USER;
}
/**
@@ -92,7 +78,7 @@ public class TrafficFlags {
* @return flags for sending SMTP email from this account
*/
public static int getSmtpFlags(Context context, Account account) {
- return (int)account.mId | REASON_SYNC | PROTOCOL_SMTP;
+ return (int)account.mId | REASON_SYNC;
}
public static String toString(int flags) {
@@ -101,8 +87,6 @@ public class TrafficFlags {
sb.append(flags & ACCOUNT_MASK);
sb.append(',');
sb.append(REASONS[(flags & REASON_MASK) >> REASON_SHIFT]);
- sb.append(',');
- sb.append(PROTOCOLS[(flags & PROTOCOL_MASK) >> PROTOCOL_SHIFT]);
int maskedData = flags & DATA_MASK;
if (maskedData != 0) {
sb.append(',');
diff --git a/emailcommon/src/com/android/emailcommon/internet/MimeUtility.java b/emailcommon/src/com/android/emailcommon/internet/MimeUtility.java
index 3e1488da6..b96e01e59 100644
--- a/emailcommon/src/com/android/emailcommon/internet/MimeUtility.java
+++ b/emailcommon/src/com/android/emailcommon/internet/MimeUtility.java
@@ -16,6 +16,12 @@
package com.android.emailcommon.internet;
+import android.text.TextUtils;
+import android.util.Base64;
+import android.util.Base64DataException;
+import android.util.Base64InputStream;
+import android.util.Log;
+
import com.android.emailcommon.Logging;
import com.android.emailcommon.mail.Body;
import com.android.emailcommon.mail.BodyPart;
@@ -30,11 +36,6 @@ import org.apache.james.mime4j.decoder.DecoderUtil;
import org.apache.james.mime4j.decoder.QuotedPrintableInputStream;
import org.apache.james.mime4j.util.CharsetUtil;
-import android.util.Base64;
-import android.util.Base64DataException;
-import android.util.Base64InputStream;
-import android.util.Log;
-
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -406,55 +407,46 @@ public class MimeUtility {
public static void collectParts(Part part, ArrayList<Part> viewables,
ArrayList<Part> attachments) throws MessagingException {
String disposition = part.getDisposition();
- String dispositionType = null;
- String dispositionFilename = null;
- if (disposition != null) {
- dispositionType = MimeUtility.getHeaderParameter(disposition, null);
- dispositionFilename = MimeUtility.getHeaderParameter(disposition, "filename");
- }
- // An attachment filename can be defined in either the Content-Disposition header
- // or the Content-Type header. Content-Disposition is preferred, so we only try
- // the Content-Type header as a last resort.
- if (dispositionFilename == null) {
- String contentType = part.getContentType();
- dispositionFilename = MimeUtility.getHeaderParameter(contentType, "name");
- }
- boolean attachmentDisposition = "attachment".equalsIgnoreCase(dispositionType);
+ String dispositionType = MimeUtility.getHeaderParameter(disposition, null);
// If a disposition is not specified, default to "inline"
- boolean inlineDisposition = dispositionType == null
- || "inline".equalsIgnoreCase(dispositionType);
-
- // A guess that this part is intended to be an attachment
- boolean attachment = attachmentDisposition
- || (dispositionFilename != null && !inlineDisposition);
-
- // A guess that this part is intended to be an inline.
- boolean inline = inlineDisposition && (dispositionFilename != null);
-
- // One or the other
- boolean attachmentOrInline = attachment || inline;
+ boolean inline =
+ TextUtils.isEmpty(dispositionType) || "inline".equalsIgnoreCase(dispositionType);
+ // The lower-case mime type
+ String mimeType = part.getMimeType().toLowerCase();
if (part.getBody() instanceof Multipart) {
// If the part is Multipart but not alternative it's either mixed or
// something we don't know about, which means we treat it as mixed
// per the spec. We just process its pieces recursively.
- Multipart mp = (Multipart)part.getBody();
+ MimeMultipart mp = (MimeMultipart)part.getBody();
+ boolean foundHtml = false;
+ if (mp.getSubTypeForTest().equals("alternative")) {
+ for (int i = 0; i < mp.getCount(); i++) {
+ if (mp.getBodyPart(i).isMimeType("text/html")) {
+ foundHtml = true;
+ break;
+ }
+ }
+ }
for (int i = 0; i < mp.getCount(); i++) {
- collectParts(mp.getBodyPart(i), viewables, attachments);
+ // See if we have text and html
+ BodyPart bp = mp.getBodyPart(i);
+ // If there's html, don't bother loading text
+ if (foundHtml && bp.isMimeType("text/plain")) {
+ continue;
+ }
+ collectParts(bp, viewables, attachments);
}
} else if (part.getBody() instanceof Message) {
// If the part is an embedded message we just continue to process
// it, pulling any viewables or attachments into the running list.
Message message = (Message)part.getBody();
collectParts(message, viewables, attachments);
- } else if ((!attachmentOrInline) && ("text/html".equalsIgnoreCase(part.getMimeType()))) {
- // If the part is HTML and we got this far, it's a viewable part of a mixed
- viewables.add(part);
- } else if ((!attachmentOrInline) && ("text/plain".equalsIgnoreCase(part.getMimeType()))) {
- // If the part is text and we got this far, it's a viewable part of a mixed
+ } else if (inline && (mimeType.startsWith("text") || (mimeType.startsWith("image")))) {
+ // We'll treat text and images as viewables
viewables.add(part);
- } else if (attachmentOrInline) {
- // Finally, if it's an attachment or an inline we will include it as an attachment.
+ } else {
+ // Everything else is an attachment.
attachments.add(part);
}
}
diff --git a/emailcommon/src/com/android/emailcommon/internet/Rfc822Output.java b/emailcommon/src/com/android/emailcommon/internet/Rfc822Output.java
index e03a92694..a3167d6cb 100644
--- a/emailcommon/src/com/android/emailcommon/internet/Rfc822Output.java
+++ b/emailcommon/src/com/android/emailcommon/internet/Rfc822Output.java
@@ -16,6 +16,13 @@
package com.android.emailcommon.internet;
+import android.content.ContentUris;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.util.Base64;
+import android.util.Base64OutputStream;
+
import com.android.emailcommon.mail.Address;
import com.android.emailcommon.mail.MessagingException;
import com.android.emailcommon.provider.EmailContent.Attachment;
@@ -24,15 +31,6 @@ import com.android.emailcommon.provider.EmailContent.Message;
import org.apache.commons.io.IOUtils;
-import android.content.ContentUris;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.text.Html;
-import android.text.TextUtils;
-import android.util.Base64;
-import android.util.Base64OutputStream;
-
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
@@ -52,9 +50,6 @@ import java.util.regex.Pattern;
*/
public class Rfc822Output {
- private static final Pattern PATTERN_START_OF_LINE = Pattern.compile("(?m)^");
- private static final Pattern PATTERN_ENDLINE_CRLF = Pattern.compile("\r\n");
-
// In MIME, en_US-like date format should be used. In other words "MMM" should be encoded to
// "Jan", not the other localized format like "Ene" (meaning January in locale es).
private static final SimpleDateFormat DATE_FORMAT =
@@ -69,11 +64,6 @@ public class Rfc822Output {
Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
/** Match group in {@code BODDY_PATTERN} for the body HTML */
private static final int BODY_PATTERN_GROUP = 1;
- /** Pattern to find both dos and unix newlines */
- private static final Pattern NEWLINE_PATTERN =
- Pattern.compile("\\r?\\n");
- /** HTML string to use when replacing text newlines */
- private static final String NEWLINE_HTML = "<br>";
/** Index of the plain text version of the message body */
private final static int INDEX_BODY_TEXT = 0;
/** Index of the HTML version of the message body */
@@ -96,77 +86,19 @@ public class Rfc822Output {
}
/**
- * Returns an HTML encoded message alternate
- */
- /*package*/ static String getHtmlAlternate(Body body, boolean useSmartReply) {
- if (body.mHtmlReply == null) {
- return null;
- }
- StringBuffer altMessage = new StringBuffer();
- String htmlContent = TextUtils.htmlEncode(body.mTextContent); // Escape HTML reserved chars
- htmlContent = NEWLINE_PATTERN.matcher(htmlContent).replaceAll(NEWLINE_HTML);
- altMessage.append(htmlContent);
- if (body.mIntroText != null) {
- String htmlIntro = TextUtils.htmlEncode(body.mIntroText);
- htmlIntro = NEWLINE_PATTERN.matcher(htmlIntro).replaceAll(NEWLINE_HTML);
- altMessage.append(htmlIntro);
- }
- if (!useSmartReply) {
- String htmlBody = getHtmlBody(body.mHtmlReply);
- altMessage.append(htmlBody);
- }
- return altMessage.toString();
- }
-
- /**
* Gets both the plain text and HTML versions of the message body.
*/
/*package*/ static String[] buildBodyText(Body body, int flags, boolean useSmartReply) {
- String[] messageBody = new String[] { null, null };
if (body == null) {
- return messageBody;
- }
- String text = body.mTextContent;
- boolean isReply = (flags & Message.FLAG_TYPE_REPLY) != 0;
- boolean isForward = (flags & Message.FLAG_TYPE_FORWARD) != 0;
- // For all forwards/replies, we add the intro text
- if (isReply || isForward) {
- String intro = body.mIntroText == null ? "" : body.mIntroText;
- text += intro;
+ return new String[2];
}
- if (useSmartReply) {
- // useSmartReply is set to true for use by SmartReply/SmartForward in EAS.
- // SmartForward doesn't put a break between the original and new text, so we add an LF
- if (isForward) {
- text += "\n";
- }
- } else {
- String quotedText = body.mTextReply;
- // If there is no plain-text body, use de-tagified HTML as the text body
- if (quotedText == null && body.mHtmlReply != null) {
- quotedText = Html.fromHtml(body.mHtmlReply).toString();
- }
- if (quotedText != null) {
- // fix CR-LF line endings to LF-only needed by EditText.
- Matcher matcher = PATTERN_ENDLINE_CRLF.matcher(quotedText);
- quotedText = matcher.replaceAll("\n");
+ String[] messageBody = new String[] { body.mTextContent, body.mHtmlContent };
+ if (useSmartReply && body.mQuotedTextStartPos > 0) {
+ if (messageBody[0] != null) {
+ messageBody[0] = messageBody[0].substring(0, body.mQuotedTextStartPos);
+ } else if (messageBody[1] != null) {
+ messageBody[1] = messageBody[1].substring(0, body.mQuotedTextStartPos);
}
- if (isReply) {
- if (quotedText != null) {
- Matcher matcher = PATTERN_START_OF_LINE.matcher(quotedText);
- text += matcher.replaceAll(">");
- }
- } else if (isForward) {
- if (quotedText != null) {
- text += quotedText;
- }
- }
- }
- messageBody[INDEX_BODY_TEXT] = text;
- // Exchange 2003 doesn't seem to support multipart w/SmartReply and SmartForward, so
- // we'll skip this. Really, it would only matter if we could compose HTML replies
- if (!useSmartReply) {
- messageBody[INDEX_BODY_HTML] = getHtmlAlternate(body, useSmartReply);
}
return messageBody;
}
@@ -250,7 +182,7 @@ public class Rfc822Output {
writer.write("\r\n");
// first multipart element is the body
- if (bodyText[INDEX_BODY_TEXT] != null) {
+ if (bodyText[INDEX_BODY_TEXT] != null || bodyText[INDEX_BODY_HTML] != null) {
writeBoundary(writer, multipartBoundary, false);
writeTextWithHeaders(writer, stream, bodyText);
}
@@ -398,9 +330,7 @@ public class Rfc822Output {
}
/**
- * Write the body text. If only one version of the body is specified (either plain text
- * or HTML), the text is written directly. Otherwise, the plain text and HTML bodies
- * are both written with the appropriate headers.
+ * Write the body text.
*
* Note this always uses base64, even when not required. Slightly less efficient for
* US-ASCII text, but handles all formats even when non-ascii chars are involved. A small
@@ -412,49 +342,23 @@ public class Rfc822Output {
*/
private static void writeTextWithHeaders(Writer writer, OutputStream out, String[] bodyText)
throws IOException {
+ boolean html = false;
String text = bodyText[INDEX_BODY_TEXT];
- String html = bodyText[INDEX_BODY_HTML];
-
+ if (text == null) {
+ text = bodyText[INDEX_BODY_HTML];
+ html = true;
+ }
if (text == null) {
writer.write("\r\n"); // a truly empty message
} else {
- String multipartBoundary = null;
- boolean multipart = html != null;
-
- // Simplified case for no multipart - just emit text and be done.
- if (multipart) {
- // continue with multipart headers, then into multipart body
- multipartBoundary = getNextBoundary();
-
- writeHeader(writer, "Content-Type",
- "multipart/alternative; boundary=\"" + multipartBoundary + "\"");
- // Finish headers and prepare for body section(s)
- writer.write("\r\n");
- writeBoundary(writer, multipartBoundary, false);
- }
-
// first multipart element is the body
- writeHeader(writer, "Content-Type", "text/plain; charset=utf-8");
+ String mimeType = "text/" + (html ? "html" : "plain");
+ writeHeader(writer, "Content-Type", mimeType + "; charset=utf-8");
writeHeader(writer, "Content-Transfer-Encoding", "base64");
writer.write("\r\n");
byte[] textBytes = text.getBytes("UTF-8");
writer.flush();
out.write(Base64.encode(textBytes, Base64.CRLF));
-
- if (multipart) {
- // next multipart section
- writeBoundary(writer, multipartBoundary, false);
-
- writeHeader(writer, "Content-Type", "text/html; charset=utf-8");
- writeHeader(writer, "Content-Transfer-Encoding", "base64");
- writer.write("\r\n");
- byte[] htmlBytes = html.getBytes("UTF-8");
- writer.flush();
- out.write(Base64.encode(htmlBytes, Base64.CRLF));
-
- // end of multipart section
- writeBoundary(writer, multipartBoundary, true);
- }
}
}
diff --git a/emailcommon/src/com/android/emailcommon/mail/Address.java b/emailcommon/src/com/android/emailcommon/mail/Address.java
index a2807c916..5245c5691 100644
--- a/emailcommon/src/com/android/emailcommon/mail/Address.java
+++ b/emailcommon/src/com/android/emailcommon/mail/Address.java
@@ -16,16 +16,16 @@
package com.android.emailcommon.mail;
+import android.text.TextUtils;
+import android.text.util.Rfc822Token;
+import android.text.util.Rfc822Tokenizer;
+
import com.android.emailcommon.utility.Utility;
import com.google.common.annotations.VisibleForTesting;
import org.apache.james.mime4j.codec.EncoderUtil;
import org.apache.james.mime4j.decoder.DecoderUtil;
-import android.text.TextUtils;
-import android.text.util.Rfc822Token;
-import android.text.util.Rfc822Tokenizer;
-
import java.util.ArrayList;
import java.util.regex.Pattern;
@@ -192,6 +192,10 @@ public class Address {
return super.equals(o);
}
+ public int hashCode() {
+ return getAddress().hashCode();
+ }
+
/**
* Get human readable address string.
* Do not use this for email header.
@@ -352,14 +356,21 @@ public class Address {
}
/**
- * Unpacks an address list previously packed with pack()
- * @param addressList String with packed addresses as returned by pack()
+ * Unpacks an address list that is either CSV of RFC822 addresses OR (for backward
+ * compatibility) previously packed with pack()
+ * @param addressList string packed with pack() or CSV of RFC822 addresses
* @return array of addresses resulting from unpack
*/
public static Address[] unpack(String addressList) {
if (addressList == null || addressList.length() == 0) {
return EMPTY_ADDRESS_ARRAY;
}
+ // IF we're CSV, just parse
+ if ((addressList.indexOf(LIST_DELIMITER_PERSONAL) == -1) &&
+ (addressList.indexOf(LIST_DELIMITER_EMAIL) == -1)) {
+ return Address.parse(addressList);
+ }
+ // Otherwise, do backward-compatibile unpack
ArrayList<Address> addresses = new ArrayList<Address>();
int length = addressList.length();
int pairStartIndex = 0;
@@ -395,45 +406,11 @@ public class Address {
}
/**
- * Packs an address list into a String that is very quick to read
- * and parse. Packed lists can be unpacked with unpack().
- * The format is a series of packed addresses separated by LIST_DELIMITER_EMAIL.
- * Each address is packed as
- * a pair of address and personal separated by LIST_DELIMITER_PERSONAL,
- * where the personal and delimiter are optional.
- * E.g. "foo@x.com\1joe@x.com\2Joe Doe"
- * @param addresses Array of addresses
- * @return a string containing the packed addresses.
+ * Generate a String containing RFC822 addresses separated by commas
+ * NOTE: We used to "pack" these addresses in an app-specific format, but no longer do so
*/
public static String pack(Address[] addresses) {
- // TODO: return same value for both null & empty list
- if (addresses == null) {
- return null;
- }
- final int nAddr = addresses.length;
- if (nAddr == 0) {
- return "";
- }
-
- // shortcut: one email with no displayName
- if (nAddr == 1 && addresses[0].getPersonal() == null) {
- return addresses[0].getAddress();
- }
-
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < nAddr; i++) {
- if (i != 0) {
- sb.append(LIST_DELIMITER_EMAIL);
- }
- final Address address = addresses[i];
- sb.append(address.getAddress());
- final String displayName = address.getPersonal();
- if (displayName != null) {
- sb.append(LIST_DELIMITER_PERSONAL);
- sb.append(displayName);
- }
- }
- return sb.toString();
+ return Address.toHeader(addresses);
}
/**
diff --git a/emailcommon/src/com/android/emailcommon/mail/MeetingInfo.java b/emailcommon/src/com/android/emailcommon/mail/MeetingInfo.java
index 1489a5597..87637f7a1 100644
--- a/emailcommon/src/com/android/emailcommon/mail/MeetingInfo.java
+++ b/emailcommon/src/com/android/emailcommon/mail/MeetingInfo.java
@@ -26,4 +26,5 @@ public class MeetingInfo {
public static final String MEETING_TITLE = "TITLE";
public static final String MEETING_LOCATION = "LOC";
public static final String MEETING_RESPONSE_REQUESTED = "RESPONSE";
+ public static final String MEETING_ALL_DAY = "ALLDAY";
}
diff --git a/emailcommon/src/com/android/emailcommon/provider/Account.java b/emailcommon/src/com/android/emailcommon/provider/Account.java
index 94d858b31..7c7710a4d 100644..100755
--- a/emailcommon/src/com/android/emailcommon/provider/Account.java
+++ b/emailcommon/src/com/android/emailcommon/provider/Account.java
@@ -40,7 +40,6 @@ import java.util.UUID;
public final class Account extends EmailContent implements AccountColumns, Parcelable {
public static final String TABLE_NAME = "Account";
- @SuppressWarnings("hiding")
public static final Uri CONTENT_URI = Uri.parse(EmailContent.CONTENT_URI + "/account");
public static final Uri ADD_TO_FIELD_URI =
Uri.parse(EmailContent.CONTENT_URI + "/accountIdAddToField");
@@ -127,8 +126,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
public String mSecuritySyncKey;
public String mSignature;
public long mPolicyKey;
- public long mNotifiedMessageId;
- public int mNotifiedMessageCount;
// Convenience for creating/working with an account
public transient HostAuth mHostAuthRecv;
@@ -155,8 +152,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
public static final int CONTENT_SECURITY_SYNC_KEY_COLUMN = 15;
public static final int CONTENT_SIGNATURE_COLUMN = 16;
public static final int CONTENT_POLICY_KEY = 17;
- public static final int CONTENT_NOTIFIED_MESSAGE_ID = 18;
- public static final int CONTENT_NOTIFIED_MESSAGE_COUNT = 19;
public static final String[] CONTENT_PROJECTION = new String[] {
RECORD_ID, AccountColumns.DISPLAY_NAME,
@@ -166,8 +161,7 @@ public final class Account extends EmailContent implements AccountColumns, Parce
AccountColumns.COMPATIBILITY_UUID, AccountColumns.SENDER_NAME,
AccountColumns.RINGTONE_URI, AccountColumns.PROTOCOL_VERSION,
AccountColumns.NEW_MESSAGE_COUNT, AccountColumns.SECURITY_SYNC_KEY,
- AccountColumns.SIGNATURE, AccountColumns.POLICY_KEY,
- AccountColumns.NOTIFIED_MESSAGE_ID, AccountColumns.NOTIFIED_MESSAGE_COUNT
+ AccountColumns.SIGNATURE, AccountColumns.POLICY_KEY
};
public static final int CONTENT_MAILBOX_TYPE_COLUMN = 1;
@@ -200,13 +194,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
" AND " + MailboxColumns.ACCOUNT_KEY + " =?";
/**
- * This projection is for searching for the default account
- */
- private static final String[] DEFAULT_ID_PROJECTION = new String[] {
- RECORD_ID, IS_DEFAULT
- };
-
- /**
* no public constructor since this is a utility class
*/
public Account() {
@@ -272,8 +259,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
mSecuritySyncKey = cursor.getString(CONTENT_SECURITY_SYNC_KEY_COLUMN);
mSignature = cursor.getString(CONTENT_SIGNATURE_COLUMN);
mPolicyKey = cursor.getLong(CONTENT_POLICY_KEY);
- mNotifiedMessageId = cursor.getLong(CONTENT_NOTIFIED_MESSAGE_ID);
- mNotifiedMessageCount = cursor.getInt(CONTENT_NOTIFIED_MESSAGE_COUNT);
}
private long getId(Uri u) {
@@ -462,21 +447,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
}
/**
- * @return true if the instance is of an EAS account.
- *
- * NOTE This method accesses the DB if {@link #mHostAuthRecv} hasn't been restored yet.
- * Use caution when you use this on the main thread.
- */
- public boolean isEasAccount(Context context) {
- return "eas".equals(getProtocol(context));
- }
-
- public boolean supportsMoveMessages(Context context) {
- String protocol = getProtocol(context);
- return "eas".equals(protocol) || "imap".equals(protocol);
- }
-
- /**
* @return true if the account supports "search".
*/
public static boolean supportsServerSearch(Context context, long accountId) {
@@ -717,10 +687,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
*/
@Override
public int update(Context context, ContentValues cv) {
- if (mPolicy != null && mPolicyKey <= 0) {
- // If a policy is set and there's no policy, link it to the account
- Policy.setAccountPolicy(context, this, mPolicy, null);
- }
if (cv.containsKey(AccountColumns.IS_DEFAULT) &&
cv.getAsBoolean(AccountColumns.IS_DEFAULT)) {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
@@ -766,7 +732,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
int index = 0;
int recvIndex = -1;
int sendIndex = -1;
- int policyIndex = -1;
// Create operations for saving the send and recv hostAuths
// Also, remember which operation in the array they represent
@@ -783,12 +748,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
.withValues(mHostAuthSend.toContentValues())
.build());
}
- if (mPolicy != null) {
- policyIndex = index++;
- ops.add(ContentProviderOperation.newInsert(mPolicy.mBaseUri)
- .withValues(mPolicy.toContentValues())
- .build());
- }
// Create operations for making this the only default account
// Note, these are always updates because they change existing accounts
@@ -801,7 +760,7 @@ public final class Account extends EmailContent implements AccountColumns, Parce
// Now do the Account
ContentValues cv = null;
- if (recvIndex >= 0 || sendIndex >= 0 || policyIndex >= 0) {
+ if (recvIndex >= 0 || sendIndex >= 0) {
cv = new ContentValues();
if (recvIndex >= 0) {
cv.put(Account.HOST_AUTH_KEY_RECV, recvIndex);
@@ -809,9 +768,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
if (sendIndex >= 0) {
cv.put(Account.HOST_AUTH_KEY_SEND, sendIndex);
}
- if (policyIndex >= 0) {
- cv.put(Account.POLICY_KEY, policyIndex);
- }
}
ContentProviderOperation.Builder b = ContentProviderOperation.newInsert(mBaseUri);
@@ -835,11 +791,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
mHostAuthKeySend = newId;
mHostAuthSend.mId = newId;
}
- if (policyIndex >= 0) {
- long newId = getId(results[policyIndex].uri);
- mPolicyKey = newId;
- mPolicy.mId = newId;
- }
Uri u = results[index].uri;
mId = getId(u);
return u;
@@ -871,8 +822,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
values.put(AccountColumns.SECURITY_SYNC_KEY, mSecuritySyncKey);
values.put(AccountColumns.SIGNATURE, mSignature);
values.put(AccountColumns.POLICY_KEY, mPolicyKey);
- values.put(AccountColumns.NOTIFIED_MESSAGE_ID, mNotifiedMessageId);
- values.put(AccountColumns.NOTIFIED_MESSAGE_COUNT, mNotifiedMessageCount);
return values;
}
@@ -924,8 +873,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
dest.writeString(mSecuritySyncKey);
dest.writeString(mSignature);
dest.writeLong(mPolicyKey);
- dest.writeLong(mNotifiedMessageId);
- dest.writeInt(mNotifiedMessageCount);
if (mHostAuthRecv != null) {
dest.writeByte((byte)1);
@@ -965,8 +912,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
mSecuritySyncKey = in.readString();
mSignature = in.readString();
mPolicyKey = in.readLong();
- mNotifiedMessageId = in.readLong();
- mNotifiedMessageCount = in.readInt();
mHostAuthRecv = null;
if (in.readByte() == 1) {
@@ -997,5 +942,4 @@ public final class Account extends EmailContent implements AccountColumns, Parce
sb.append(']');
return sb.toString();
}
-
} \ No newline at end of file
diff --git a/emailcommon/src/com/android/emailcommon/provider/EmailContent.java b/emailcommon/src/com/android/emailcommon/provider/EmailContent.java
index 45876731b..7a6d4555e 100644..100755
--- a/emailcommon/src/com/android/emailcommon/provider/EmailContent.java
+++ b/emailcommon/src/com/android/emailcommon/provider/EmailContent.java
@@ -32,6 +32,7 @@ import android.os.RemoteException;
import com.android.emailcommon.utility.TextUtilities;
import com.android.emailcommon.utility.Utility;
+import com.android.mail.providers.UIProvider;
import com.google.common.annotations.VisibleForTesting;
import java.io.File;
@@ -70,6 +71,20 @@ public abstract class EmailContent {
public static final Uri CONTENT_NOTIFIER_URI = Uri.parse("content://" + NOTIFIER_AUTHORITY);
+ public static final Uri MAILBOX_NOTIFICATION_URI =
+ Uri.parse("content://" + EmailContent.AUTHORITY + "/mailboxNotification");
+ public static final String[] NOTIFICATION_PROJECTION =
+ new String[] {MailboxColumns.ID, MailboxColumns.UNREAD_COUNT, MailboxColumns.MESSAGE_COUNT};
+ public static final int NOTIFICATION_MAILBOX_ID_COLUMN = 0;
+ public static final int NOTIFICATION_MAILBOX_UNREAD_COUNT_COLUMN = 1;
+ public static final int NOTIFICATION_MAILBOX_MESSAGE_COUNT_COLUMN = 2;
+
+ public static final Uri MAILBOX_MOST_RECENT_MESSAGE_URI =
+ Uri.parse("content://" + EmailContent.AUTHORITY + "/mailboxMostRecentMessage");
+
+ public static final Uri ACCOUNT_CHECK_URI =
+ Uri.parse("content://" + EmailContent.AUTHORITY + "/accountCheck");
+
public static final String PROVIDER_PERMISSION = "com.android.email.permission.ACCESS_PROVIDER";
// All classes share this
@@ -92,6 +107,19 @@ public abstract class EmailContent {
public static final String ADD_COLUMN_NAME = "add";
public static final String SET_COLUMN_NAME = "set";
+ public static final int SYNC_STATUS_NONE = UIProvider.SyncStatus.NO_SYNC;
+ public static final int SYNC_STATUS_USER = UIProvider.SyncStatus.USER_REFRESH;
+ public static final int SYNC_STATUS_BACKGROUND = UIProvider.SyncStatus.BACKGROUND_SYNC;
+
+ public static final int LAST_SYNC_RESULT_SUCCESS = UIProvider.LastSyncResult.SUCCESS;
+ public static final int LAST_SYNC_RESULT_AUTH_ERROR = UIProvider.LastSyncResult.AUTH_ERROR;
+ public static final int LAST_SYNC_RESULT_SECURITY_ERROR =
+ UIProvider.LastSyncResult.SECURITY_ERROR;
+ public static final int LAST_SYNC_RESULT_CONNECTION_ERROR =
+ UIProvider.LastSyncResult.CONNECTION_ERROR;
+ public static final int LAST_SYNC_RESULT_INTERNAL_ERROR =
+ UIProvider.LastSyncResult.INTERNAL_ERROR;
+
// Newly created objects get this id
public static final int NOT_SAVED = -1;
// The base Uri that this piece of content came from
@@ -235,15 +263,20 @@ public abstract class EmailContent {
// The plain text content itself
public static final String TEXT_CONTENT = "textContent";
// Replied-to or forwarded body (in html form)
+ @Deprecated
public static final String HTML_REPLY = "htmlReply";
// Replied-to or forwarded body (in text form)
+ @Deprecated
public static final String TEXT_REPLY = "textReply";
// A reference to a message's unique id used in reply/forward.
// Protocol code can be expected to use this column in determining whether a message can be
// deleted safely (i.e. isn't referenced by other messages)
public static final String SOURCE_MESSAGE_KEY = "sourceMessageKey";
// The text to be placed between a reply/forward response and the original message
+ @Deprecated
public static final String INTRO_TEXT = "introText";
+ // The start of quoted text within our text content
+ public static final String QUOTED_TEXT_START_POS = "quotedTextStartPos";
}
public static final class Body extends EmailContent implements BodyColumns {
@@ -256,14 +289,19 @@ public abstract class EmailContent {
public static final int CONTENT_MESSAGE_KEY_COLUMN = 1;
public static final int CONTENT_HTML_CONTENT_COLUMN = 2;
public static final int CONTENT_TEXT_CONTENT_COLUMN = 3;
+ @Deprecated
public static final int CONTENT_HTML_REPLY_COLUMN = 4;
+ @Deprecated
public static final int CONTENT_TEXT_REPLY_COLUMN = 5;
public static final int CONTENT_SOURCE_KEY_COLUMN = 6;
+ @Deprecated
public static final int CONTENT_INTRO_TEXT_COLUMN = 7;
+ public static final int CONTENT_QUOTED_TEXT_START_POS_COLUMN = 8;
+
public static final String[] CONTENT_PROJECTION = new String[] {
RECORD_ID, BodyColumns.MESSAGE_KEY, BodyColumns.HTML_CONTENT, BodyColumns.TEXT_CONTENT,
BodyColumns.HTML_REPLY, BodyColumns.TEXT_REPLY, BodyColumns.SOURCE_MESSAGE_KEY,
- BodyColumns.INTRO_TEXT
+ BodyColumns.INTRO_TEXT, BodyColumns.QUOTED_TEXT_START_POS
};
public static final String[] COMMON_PROJECTION_TEXT = new String[] {
@@ -272,12 +310,15 @@ public abstract class EmailContent {
public static final String[] COMMON_PROJECTION_HTML = new String[] {
RECORD_ID, BodyColumns.HTML_CONTENT
};
+ @Deprecated
public static final String[] COMMON_PROJECTION_REPLY_TEXT = new String[] {
RECORD_ID, BodyColumns.TEXT_REPLY
};
+ @Deprecated
public static final String[] COMMON_PROJECTION_REPLY_HTML = new String[] {
RECORD_ID, BodyColumns.HTML_REPLY
};
+ @Deprecated
public static final String[] COMMON_PROJECTION_INTRO = new String[] {
RECORD_ID, BodyColumns.INTRO_TEXT
};
@@ -292,8 +333,11 @@ public abstract class EmailContent {
public long mMessageKey;
public String mHtmlContent;
public String mTextContent;
+ @Deprecated
public String mHtmlReply;
+ @Deprecated
public String mTextReply;
+ public int mQuotedTextStartPos;
/**
* Points to the ID of the message being replied to or forwarded. Will always be set,
@@ -301,6 +345,7 @@ public abstract class EmailContent {
* want to include quoted text.
*/
public long mSourceKey;
+ @Deprecated
public String mIntroText;
public Body() {
@@ -415,14 +460,17 @@ public abstract class EmailContent {
return restoreTextWithMessageId(context, messageId, Body.COMMON_PROJECTION_HTML);
}
+ @Deprecated
public static String restoreReplyTextWithMessageId(Context context, long messageId) {
return restoreTextWithMessageId(context, messageId, Body.COMMON_PROJECTION_REPLY_TEXT);
}
+ @Deprecated
public static String restoreReplyHtmlWithMessageId(Context context, long messageId) {
return restoreTextWithMessageId(context, messageId, Body.COMMON_PROJECTION_REPLY_HTML);
}
+ @Deprecated
public static String restoreIntroTextWithMessageId(Context context, long messageId) {
return restoreTextWithMessageId(context, messageId, Body.COMMON_PROJECTION_INTRO);
}
@@ -437,6 +485,7 @@ public abstract class EmailContent {
mTextReply = cursor.getString(CONTENT_TEXT_REPLY_COLUMN);
mSourceKey = cursor.getLong(CONTENT_SOURCE_KEY_COLUMN);
mIntroText = cursor.getString(CONTENT_INTRO_TEXT_COLUMN);
+ mQuotedTextStartPos = cursor.getInt(CONTENT_QUOTED_TEXT_START_POS_COLUMN);
}
public boolean update() {
@@ -466,8 +515,8 @@ public abstract class EmailContent {
public static final String FLAGS = "flags";
// Sync related identifiers
- // Any client-required identifier
- public static final String CLIENT_ID = "clientId";
+ // Saved draft info (reusing the never-used "clientId" column)
+ public static final String DRAFT_INFO = "clientId";
// The message-id in the message's header
public static final String MESSAGE_ID = "messageId";
@@ -492,6 +541,8 @@ public abstract class EmailContent {
// and the sync adapter might, for example, need more information about the original source
// of the message)
public static final String PROTOCOL_SEARCH_INFO = "protocolSearchInfo";
+ // Simple thread topic
+ public static final String THREAD_TOPIC = "threadTopic";
}
public static final class Message extends EmailContent implements SyncColumns, MessageColumns {
@@ -524,7 +575,7 @@ public abstract class EmailContent {
public static final int CONTENT_FLAG_ATTACHMENT_COLUMN = 7;
public static final int CONTENT_FLAGS_COLUMN = 8;
public static final int CONTENT_SERVER_ID_COLUMN = 9;
- public static final int CONTENT_CLIENT_ID_COLUMN = 10;
+ public static final int CONTENT_DRAFT_INFO_COLUMN = 10;
public static final int CONTENT_MESSAGE_ID_COLUMN = 11;
public static final int CONTENT_MAILBOX_KEY_COLUMN = 12;
public static final int CONTENT_ACCOUNT_KEY_COLUMN = 13;
@@ -537,6 +588,7 @@ public abstract class EmailContent {
public static final int CONTENT_MEETING_INFO_COLUMN = 20;
public static final int CONTENT_SNIPPET_COLUMN = 21;
public static final int CONTENT_PROTOCOL_SEARCH_INFO_COLUMN = 22;
+ public static final int CONTENT_THREAD_TOPIC_COLUMN = 23;
public static final String[] CONTENT_PROJECTION = new String[] {
RECORD_ID,
@@ -544,13 +596,14 @@ public abstract class EmailContent {
MessageColumns.SUBJECT, MessageColumns.FLAG_READ,
MessageColumns.FLAG_LOADED, MessageColumns.FLAG_FAVORITE,
MessageColumns.FLAG_ATTACHMENT, MessageColumns.FLAGS,
- SyncColumns.SERVER_ID, MessageColumns.CLIENT_ID,
+ SyncColumns.SERVER_ID, MessageColumns.DRAFT_INFO,
MessageColumns.MESSAGE_ID, MessageColumns.MAILBOX_KEY,
MessageColumns.ACCOUNT_KEY, MessageColumns.FROM_LIST,
MessageColumns.TO_LIST, MessageColumns.CC_LIST,
MessageColumns.BCC_LIST, MessageColumns.REPLY_TO_LIST,
SyncColumns.SERVER_TIMESTAMP, MessageColumns.MEETING_INFO,
- MessageColumns.SNIPPET, MessageColumns.PROTOCOL_SEARCH_INFO
+ MessageColumns.SNIPPET, MessageColumns.PROTOCOL_SEARCH_INFO,
+ MessageColumns.THREAD_TOPIC
};
public static final int LIST_ID_COLUMN = 0;
@@ -666,7 +719,7 @@ public abstract class EmailContent {
public String mServerId;
public long mServerTimeStamp;
- public String mClientId;
+ public int mDraftInfo;
public String mMessageId;
public long mMailboxKey;
@@ -685,6 +738,8 @@ public abstract class EmailContent {
public String mProtocolSearchInfo;
+ public String mThreadTopic;
+
/**
* Base64-encoded representation of the byte array provided by servers for identifying
* messages belonging to the same conversation thread. Currently unsupported and not
@@ -701,6 +756,7 @@ public abstract class EmailContent {
transient public long mSourceKey;
transient public ArrayList<Attachment> mAttachments = null;
transient public String mIntroText;
+ transient public int mQuotedTextStartPos;
// Values used in mFlagRead
@@ -716,7 +772,6 @@ public abstract class EmailContent {
// Bits used in mFlags
// The following three states are mutually exclusive, and indicate whether the message is an
// original, a reply, or a forward
- public static final int FLAG_TYPE_ORIGINAL = 0;
public static final int FLAG_TYPE_REPLY = 1<<0;
public static final int FLAG_TYPE_FORWARD = 1<<1;
public static final int FLAG_TYPE_MASK = FLAG_TYPE_REPLY | FLAG_TYPE_FORWARD;
@@ -747,6 +802,16 @@ public abstract class EmailContent {
public static final int FLAG_REPLIED_TO = 1 << 18;
public static final int FLAG_FORWARDED = 1 << 19;
+ // Outgoing, original message
+ public static final int FLAG_TYPE_ORIGINAL = 1 << 20;
+ // Outgoing, reply all message; note, FLAG_TYPE_REPLY should also be set for backward
+ // compatibility
+ public static final int FLAG_TYPE_REPLY_ALL = 1 << 21;
+
+ // Flag used in draftInfo to indicate that the reference message should be appended
+ public static final int DRAFT_INFO_APPEND_REF_MESSAGE = 1 << 24;
+ public static final int DRAFT_INFO_QUOTE_POS_MASK = 0xFFFFFF;
+
/** a pseudo ID for "no message". */
public static final long NO_MESSAGE = -1L;
@@ -770,7 +835,7 @@ public abstract class EmailContent {
values.put(SyncColumns.SERVER_ID, mServerId);
values.put(SyncColumns.SERVER_TIMESTAMP, mServerTimeStamp);
- values.put(MessageColumns.CLIENT_ID, mClientId);
+ values.put(MessageColumns.DRAFT_INFO, mDraftInfo);
values.put(MessageColumns.MESSAGE_ID, mMessageId);
values.put(MessageColumns.MAILBOX_KEY, mMailboxKey);
@@ -787,6 +852,8 @@ public abstract class EmailContent {
values.put(MessageColumns.SNIPPET, mSnippet);
values.put(MessageColumns.PROTOCOL_SEARCH_INFO, mProtocolSearchInfo);
+
+ values.put(MessageColumns.THREAD_TOPIC, mThreadTopic);
return values;
}
@@ -809,7 +876,7 @@ public abstract class EmailContent {
mFlags = cursor.getInt(CONTENT_FLAGS_COLUMN);
mServerId = cursor.getString(CONTENT_SERVER_ID_COLUMN);
mServerTimeStamp = cursor.getLong(CONTENT_SERVER_TIMESTAMP_COLUMN);
- mClientId = cursor.getString(CONTENT_CLIENT_ID_COLUMN);
+ mDraftInfo = cursor.getInt(CONTENT_DRAFT_INFO_COLUMN);
mMessageId = cursor.getString(CONTENT_MESSAGE_ID_COLUMN);
mMailboxKey = cursor.getLong(CONTENT_MAILBOX_KEY_COLUMN);
mAccountKey = cursor.getLong(CONTENT_ACCOUNT_KEY_COLUMN);
@@ -821,6 +888,7 @@ public abstract class EmailContent {
mMeetingInfo = cursor.getString(CONTENT_MEETING_INFO_COLUMN);
mSnippet = cursor.getString(CONTENT_SNIPPET_COLUMN);
mProtocolSearchInfo = cursor.getString(CONTENT_PROTOCOL_SEARCH_INFO_COLUMN);
+ mThreadTopic = cursor.getString(CONTENT_THREAD_TOPIC_COLUMN);
}
public boolean update() {
@@ -887,9 +955,20 @@ public abstract class EmailContent {
return null;
}
+ /**
+ * Save or update a message
+ * @param ops an array of CPOs that we'll add to
+ */
public void addSaveOps(ArrayList<ContentProviderOperation> ops) {
- // First, save the message
- ContentProviderOperation.Builder b = ContentProviderOperation.newInsert(mBaseUri);
+ boolean isNew = !isSaved();
+ ContentProviderOperation.Builder b;
+ // First, save/update the message
+ if (isNew) {
+ b = ContentProviderOperation.newInsert(mBaseUri);
+ } else {
+ b = ContentProviderOperation.newUpdate(mBaseUri)
+ .withSelection(Message.RECORD_ID + "=?", new String[] {Long.toString(mId)});
+ }
// Generate the snippet here, before we create the CPO for Message
if (mText != null) {
mSnippet = TextUtilities.makeSnippetFromPlainText(mText);
@@ -906,32 +985,41 @@ public abstract class EmailContent {
if (mHtml != null) {
cv.put(Body.HTML_CONTENT, mHtml);
}
- if (mTextReply != null) {
- cv.put(Body.TEXT_REPLY, mTextReply);
- }
- if (mHtmlReply != null) {
- cv.put(Body.HTML_REPLY, mHtmlReply);
- }
if (mSourceKey != 0) {
cv.put(Body.SOURCE_MESSAGE_KEY, mSourceKey);
}
- if (mIntroText != null) {
- cv.put(Body.INTRO_TEXT, mIntroText);
+ if (mQuotedTextStartPos != 0) {
+ cv.put(Body.QUOTED_TEXT_START_POS, mQuotedTextStartPos);
}
b = ContentProviderOperation.newInsert(Body.CONTENT_URI);
+ // Put our message id in the Body
+ if (!isNew) {
+ cv.put(Body.MESSAGE_KEY, mId);
+ }
b.withValues(cv);
- ContentValues backValues = new ContentValues();
+ // We'll need this if we're new
int messageBackValue = ops.size() - 1;
- backValues.put(Body.MESSAGE_KEY, messageBackValue);
- ops.add(b.withValueBackReferences(backValues).build());
+ // If we're new, create a back value entry
+ if (isNew) {
+ ContentValues backValues = new ContentValues();
+ backValues.put(Body.MESSAGE_KEY, messageBackValue);
+ b.withValueBackReferences(backValues);
+ }
+ // And add the Body operation
+ ops.add(b.build());
// Create the attaachments, if any
if (mAttachments != null) {
for (Attachment att: mAttachments) {
- ops.add(ContentProviderOperation.newInsert(Attachment.CONTENT_URI)
- .withValues(att.toContentValues())
- .withValueBackReference(Attachment.MESSAGE_KEY, messageBackValue)
- .build());
+ if (!isNew) {
+ att.mMessageKey = mId;
+ }
+ b = ContentProviderOperation.newInsert(Attachment.CONTENT_URI)
+ .withValues(att.toContentValues());
+ if (isNew) {
+ b.withValueBackReference(Attachment.MESSAGE_KEY, messageBackValue);
+ }
+ ops.add(b.build());
}
}
}
@@ -1034,6 +1122,12 @@ public abstract class EmailContent {
public static final String CONTENT_BYTES = "content_bytes";
// A foreign key into the Account table (for the message owning this attachment)
public static final String ACCOUNT_KEY = "accountKey";
+ // The UIProvider state of the attachment
+ public static final String UI_STATE = "uiState";
+ // The UIProvider destination of the attachment
+ public static final String UI_DESTINATION = "uiDestination";
+ // The UIProvider downloaded size of the attachment
+ public static final String UI_DOWNLOADED_SIZE = "uiDownloadedSize";
}
public static final class Attachment extends EmailContent
@@ -1057,6 +1151,9 @@ public abstract class EmailContent {
public int mFlags;
public byte[] mContentBytes;
public long mAccountKey;
+ public int mUiState;
+ public int mUiDestination;
+ public int mUiDownloadedSize;
public static final int CONTENT_ID_COLUMN = 0;
public static final int CONTENT_FILENAME_COLUMN = 1;
@@ -1071,12 +1168,16 @@ public abstract class EmailContent {
public static final int CONTENT_FLAGS_COLUMN = 10;
public static final int CONTENT_CONTENT_BYTES_COLUMN = 11;
public static final int CONTENT_ACCOUNT_KEY_COLUMN = 12;
+ public static final int CONTENT_UI_STATE_COLUMN = 13;
+ public static final int CONTENT_UI_DESTINATION_COLUMN = 14;
+ public static final int CONTENT_UI_DOWNLOADED_SIZE_COLUMN = 15;
public static final String[] CONTENT_PROJECTION = new String[] {
RECORD_ID, AttachmentColumns.FILENAME, AttachmentColumns.MIME_TYPE,
AttachmentColumns.SIZE, AttachmentColumns.CONTENT_ID, AttachmentColumns.CONTENT_URI,
AttachmentColumns.MESSAGE_KEY, AttachmentColumns.LOCATION, AttachmentColumns.ENCODING,
AttachmentColumns.CONTENT, AttachmentColumns.FLAGS, AttachmentColumns.CONTENT_BYTES,
- AttachmentColumns.ACCOUNT_KEY
+ AttachmentColumns.ACCOUNT_KEY, AttachmentColumns.UI_STATE,
+ AttachmentColumns.UI_DESTINATION, AttachmentColumns.UI_DOWNLOADED_SIZE
};
// All attachments with an empty URI, regardless of mailbox
@@ -1201,6 +1302,9 @@ public abstract class EmailContent {
mFlags = cursor.getInt(CONTENT_FLAGS_COLUMN);
mContentBytes = cursor.getBlob(CONTENT_CONTENT_BYTES_COLUMN);
mAccountKey = cursor.getLong(CONTENT_ACCOUNT_KEY_COLUMN);
+ mUiState = cursor.getInt(CONTENT_UI_STATE_COLUMN);
+ mUiDestination = cursor.getInt(CONTENT_UI_DESTINATION_COLUMN);
+ mUiDownloadedSize = cursor.getInt(CONTENT_UI_DOWNLOADED_SIZE_COLUMN);
}
@Override
@@ -1218,6 +1322,9 @@ public abstract class EmailContent {
values.put(AttachmentColumns.FLAGS, mFlags);
values.put(AttachmentColumns.CONTENT_BYTES, mContentBytes);
values.put(AttachmentColumns.ACCOUNT_KEY, mAccountKey);
+ values.put(AttachmentColumns.UI_STATE, mUiState);
+ values.put(AttachmentColumns.UI_DESTINATION, mUiDestination);
+ values.put(AttachmentColumns.UI_DOWNLOADED_SIZE, mUiDownloadedSize);
return values;
}
@@ -1247,6 +1354,9 @@ public abstract class EmailContent {
dest.writeInt(mContentBytes.length);
dest.writeByteArray(mContentBytes);
}
+ dest.writeInt(mUiState);
+ dest.writeInt(mUiDestination);
+ dest.writeInt(mUiDownloadedSize);
}
public Attachment(Parcel in) {
@@ -1270,6 +1380,9 @@ public abstract class EmailContent {
mContentBytes = new byte[contentBytesLen];
in.readByteArray(mContentBytes);
}
+ mUiState = in.readInt();
+ mUiDestination = in.readInt();
+ mUiDownloadedSize = in.readInt();
}
public static final Parcelable.Creator<EmailContent.Attachment> CREATOR
@@ -1289,7 +1402,8 @@ public abstract class EmailContent {
public String toString() {
return "[" + mFileName + ", " + mMimeType + ", " + mSize + ", " + mContentId + ", "
+ mContentUri + ", " + mMessageKey + ", " + mLocation + ", " + mEncoding + ", "
- + mFlags + ", " + mContentBytes + ", " + mAccountKey + "]";
+ + mFlags + ", " + mContentBytes + ", " + mAccountKey + "," + mUiState + ","
+ + mUiDestination + "," + mUiDownloadedSize + "]";
}
}
@@ -1334,10 +1448,6 @@ public abstract class EmailContent {
public static final String SIGNATURE = "signature";
// A foreign key into the Policy table
public static final String POLICY_KEY = "policyKey";
- // The last notified message id
- public static final String NOTIFIED_MESSAGE_ID = "notifiedMessageId";
- // The most recent notified message count
- public static final String NOTIFIED_MESSAGE_COUNT = "notifiedMessageCount";
}
public interface QuickResponseColumns {
@@ -1383,10 +1493,20 @@ public abstract class EmailContent {
public static final String SYNC_STATUS = "syncStatus";
// Number of messages in the mailbox.
public static final String MESSAGE_COUNT = "messageCount";
- // Message ID of the last 'seen' message
- public static final String LAST_SEEN_MESSAGE_KEY = "lastSeenMessageKey";
// The last time a message in this mailbox has been read (in millis)
public static final String LAST_TOUCHED_TIME = "lastTouchedTime";
+ // The UIProvider sync status
+ public static final String UI_SYNC_STATUS = "uiSyncStatus";
+ // The UIProvider last sync result
+ public static final String UI_LAST_SYNC_RESULT = "uiLastSyncResult";
+ // The UIProvider sync status
+ public static final String LAST_NOTIFIED_MESSAGE_KEY = "lastNotifiedMessageKey";
+ // The UIProvider last sync result
+ public static final String LAST_NOTIFIED_MESSAGE_COUNT = "lastNotifiedMessageCount";
+ // The total number of messages in the remote mailbox
+ public static final String TOTAL_COUNT = "totalCount";
+ // The full hierarchical name of this folder, in the form a/b/c
+ public static final String HIERARCHICAL_NAME = "hierarchicalName";
}
public interface HostAuthColumns {
@@ -1437,5 +1557,8 @@ public abstract class EmailContent {
public static final String MAX_CALENDAR_LOOKBACK = "maxCalendarLookback";
// Indicates that the server allows password recovery, not that we support it
public static final String PASSWORD_RECOVERY_ENABLED = "passwordRecoveryEnabled";
+ // Tokenized strings indicating protocol specific policies enforced/unsupported
+ public static final String PROTOCOL_POLICIES_ENFORCED = "protocolPoliciesEnforced";
+ public static final String PROTOCOL_POLICIES_UNSUPPORTED = "protocolPoliciesUnsupported";
}
}
diff --git a/emailcommon/src/com/android/emailcommon/provider/HostAuth.java b/emailcommon/src/com/android/emailcommon/provider/HostAuth.java
index 8729418bc..1d054424f 100644
--- a/emailcommon/src/com/android/emailcommon/provider/HostAuth.java
+++ b/emailcommon/src/com/android/emailcommon/provider/HostAuth.java
@@ -34,14 +34,19 @@ import java.net.URISyntaxException;
public final class HostAuth extends EmailContent implements HostAuthColumns, Parcelable {
public static final String TABLE_NAME = "HostAuth";
- @SuppressWarnings("hiding")
public static final Uri CONTENT_URI = Uri.parse(EmailContent.CONTENT_URI + "/hostauth");
- // TODO the three following constants duplicate constants in Store.java; remove those and
- // just reference these.
+
+ // These legacy constants should be used in code created prior to Email2
+ public static final String LEGACY_SCHEME_IMAP = "imap";
+ public static final String LEGACY_SCHEME_POP3 = "pop3";
+ public static final String LEGACY_SCHEME_EAS = "eas";
+ public static final String LEGACY_SCHEME_SMTP = "smtp";
+
+ // These constants should, over time, be replaced by information in services.xml
public static final String SCHEME_IMAP = "imap";
public static final String SCHEME_POP3 = "pop3";
public static final String SCHEME_EAS = "eas";
- public static final String SCHEME_SMTP = "smtp";
+
public static final String SCHEME_TRUST_ALL_CERTS = "trustallcerts";
public static final int PORT_UNKNOWN = -1;
@@ -269,19 +274,7 @@ public final class HostAuth extends EmailContent implements HostAuthColumns, Par
mPort = port;
if (mPort == PORT_UNKNOWN) {
boolean useSSL = ((mFlags & FLAG_SSL) != 0);
- // infer port# from protocol + security
- // SSL implies a different port - TLS runs in the "regular" port
- // NOTE: Although the port should be setup in the various setup screens, this
- // block cannot easily be moved because we get process URIs from other sources
- // (e.g. for tests, provider templates and account restore) that may or may not
- // have a port specified.
- if (SCHEME_POP3.equals(mProtocol)) {
- mPort = useSSL ? 995 : 110;
- } else if (SCHEME_IMAP.equals(mProtocol)) {
- mPort = useSSL ? 993 : 143;
- } else if (SCHEME_EAS.equals(mProtocol)) {
- mPort = useSSL ? 443 : 80;
- } else if (SCHEME_SMTP.equals(mProtocol)) {
+ if (LEGACY_SCHEME_SMTP.equals(mProtocol)) {
mPort = useSSL ? 465 : 587;
}
}
diff --git a/emailcommon/src/com/android/emailcommon/provider/Mailbox.java b/emailcommon/src/com/android/emailcommon/provider/Mailbox.java
index 7ab5f4731..0c2513508 100644
--- a/emailcommon/src/com/android/emailcommon/provider/Mailbox.java
+++ b/emailcommon/src/com/android/emailcommon/provider/Mailbox.java
@@ -33,7 +33,6 @@ import com.android.emailcommon.utility.Utility;
public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns, Parcelable {
public static final String TABLE_NAME = "Mailbox";
- @SuppressWarnings("hiding")
public static final Uri CONTENT_URI = Uri.parse(EmailContent.CONTENT_URI + "/mailbox");
public static final Uri ADD_TO_FIELD_URI =
Uri.parse(EmailContent.CONTENT_URI + "/mailboxIdAddToField");
@@ -55,8 +54,13 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
public int mFlags;
public int mVisibleLimit;
public String mSyncStatus;
- public long mLastSeenMessageKey;
public long mLastTouchedTime;
+ public int mUiSyncStatus;
+ public int mUiLastSyncResult;
+ public long mLastNotifiedMessageKey;
+ public int mLastNotifiedMessageCount;
+ public int mTotalCount;
+ public String mHierarchicalName;
public static final int CONTENT_ID_COLUMN = 0;
public static final int CONTENT_DISPLAY_NAME_COLUMN = 1;
@@ -74,8 +78,13 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
public static final int CONTENT_VISIBLE_LIMIT_COLUMN = 13;
public static final int CONTENT_SYNC_STATUS_COLUMN = 14;
public static final int CONTENT_PARENT_KEY_COLUMN = 15;
- public static final int CONTENT_LAST_SEEN_MESSAGE_KEY_COLUMN = 16;
- public static final int CONTENT_LAST_TOUCHED_TIME_COLUMN = 17;
+ public static final int CONTENT_LAST_TOUCHED_TIME_COLUMN = 16;
+ public static final int CONTENT_UI_SYNC_STATUS_COLUMN = 17;
+ public static final int CONTENT_UI_LAST_SYNC_RESULT_COLUMN = 18;
+ public static final int CONTENT_LAST_NOTIFIED_MESSAGE_KEY_COLUMN = 19;
+ public static final int CONTENT_LAST_NOTIFIED_MESSAGE_COUNT_COLUMN = 20;
+ public static final int CONTENT_TOTAL_COUNT_COLUMN = 21;
+ public static final int CONTENT_HIERARCHICAL_NAME_COLUMN = 22;
/**
* <em>NOTE</em>: If fields are added or removed, the method {@link #getHashes()}
@@ -87,8 +96,10 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
MailboxColumns.DELIMITER, MailboxColumns.SYNC_KEY, MailboxColumns.SYNC_LOOKBACK,
MailboxColumns.SYNC_INTERVAL, MailboxColumns.SYNC_TIME,
MailboxColumns.FLAG_VISIBLE, MailboxColumns.FLAGS, MailboxColumns.VISIBLE_LIMIT,
- MailboxColumns.SYNC_STATUS, MailboxColumns.PARENT_KEY,
- MailboxColumns.LAST_SEEN_MESSAGE_KEY, MailboxColumns.LAST_TOUCHED_TIME,
+ MailboxColumns.SYNC_STATUS, MailboxColumns.PARENT_KEY, MailboxColumns.LAST_TOUCHED_TIME,
+ MailboxColumns.UI_SYNC_STATUS, MailboxColumns.UI_LAST_SYNC_RESULT,
+ MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY, MailboxColumns.LAST_NOTIFIED_MESSAGE_COUNT,
+ MailboxColumns.TOTAL_COUNT, MailboxColumns.HIERARCHICAL_NAME
};
private static final String ACCOUNT_AND_MAILBOX_TYPE_SELECTION =
@@ -168,6 +179,8 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
public static final int TYPE_JUNK = 7;
/** Search results */
public static final int TYPE_SEARCH = 8;
+ /** Starred (virtual */
+ public static final int TYPE_STARRED = 9;
// Types after this are used for non-mail mailboxes (as in EAS)
public static final int TYPE_NOT_EMAIL = 0x40;
@@ -181,6 +194,10 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
// A mailbox that holds Messages that are attachments
public static final int TYPE_ATTACHMENT = 0x101;
+ // Default "touch" time for system mailboxes
+ public static final int DRAFTS_DEFAULT_TOUCH_TIME = 2;
+ public static final int SENT_DEFAULT_TOUCH_TIME = 1;
+
// Bit field flags; each is defined below
// Warning: Do not read these flags until POP/IMAP/EAS all populate them
/** No flags set */
@@ -197,6 +214,8 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
public static final int FLAG_ACCEPTS_MOVED_MAIL = 1<<4;
/** can be used as a target for appending messages */
public static final int FLAG_ACCEPTS_APPENDED_MAIL = 1<<5;
+ /** has user settings (sync lookback, etc.) */
+ public static final int FLAG_SUPPORTS_SETTINGS = 1<<6;
// Magic mailbox ID's
// NOTE: This is a quick solution for merged mailboxes. I would rather implement this
@@ -306,8 +325,13 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
mFlags = cursor.getInt(CONTENT_FLAGS_COLUMN);
mVisibleLimit = cursor.getInt(CONTENT_VISIBLE_LIMIT_COLUMN);
mSyncStatus = cursor.getString(CONTENT_SYNC_STATUS_COLUMN);
- mLastSeenMessageKey = cursor.getLong(CONTENT_LAST_SEEN_MESSAGE_KEY_COLUMN);
mLastTouchedTime = cursor.getLong(CONTENT_LAST_TOUCHED_TIME_COLUMN);
+ mUiSyncStatus = cursor.getInt(CONTENT_UI_SYNC_STATUS_COLUMN);
+ mUiLastSyncResult = cursor.getInt(CONTENT_UI_LAST_SYNC_RESULT_COLUMN);
+ mLastNotifiedMessageKey = cursor.getLong(CONTENT_LAST_NOTIFIED_MESSAGE_KEY_COLUMN);
+ mLastNotifiedMessageCount = cursor.getInt(CONTENT_LAST_NOTIFIED_MESSAGE_COUNT_COLUMN);
+ mTotalCount = cursor.getInt(CONTENT_TOTAL_COUNT_COLUMN);
+ mHierarchicalName = cursor.getString(CONTENT_HIERARCHICAL_NAME_COLUMN);
}
@Override
@@ -328,8 +352,13 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
values.put(MailboxColumns.FLAGS, mFlags);
values.put(MailboxColumns.VISIBLE_LIMIT, mVisibleLimit);
values.put(MailboxColumns.SYNC_STATUS, mSyncStatus);
- values.put(MailboxColumns.LAST_SEEN_MESSAGE_KEY, mLastSeenMessageKey);
values.put(MailboxColumns.LAST_TOUCHED_TIME, mLastTouchedTime);
+ values.put(MailboxColumns.UI_SYNC_STATUS, mUiSyncStatus);
+ values.put(MailboxColumns.UI_LAST_SYNC_RESULT, mUiLastSyncResult);
+ values.put(MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY, mLastNotifiedMessageKey);
+ values.put(MailboxColumns.LAST_NOTIFIED_MESSAGE_COUNT, mLastNotifiedMessageCount);
+ values.put(MailboxColumns.TOTAL_COUNT, mTotalCount);
+ values.put(MailboxColumns.HIERARCHICAL_NAME, mHierarchicalName);
return values;
}
@@ -468,31 +497,6 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
}
/**
- * @return whether or not this mailbox retrieves its data from the server (as opposed to just
- * a local mailbox that is never synced).
- */
- public boolean loadsFromServer(String protocol) {
- if (HostAuth.SCHEME_EAS.equals(protocol)) {
- return mType != Mailbox.TYPE_DRAFTS
- && mType != Mailbox.TYPE_OUTBOX
- && mType != Mailbox.TYPE_SEARCH
- && mType < Mailbox.TYPE_NOT_SYNCABLE;
-
- } else if (HostAuth.SCHEME_IMAP.equals(protocol)) {
- // TODO: actually use a sync flag when creating the mailboxes. Right now we use an
- // approximation for IMAP.
- return mType != Mailbox.TYPE_DRAFTS
- && mType != Mailbox.TYPE_OUTBOX
- && mType != Mailbox.TYPE_SEARCH;
-
- } else if (HostAuth.SCHEME_POP3.equals(protocol)) {
- return TYPE_INBOX == mType;
- }
-
- return false;
- }
-
- /**
* @return true if messages in a mailbox of a type can be replied/forwarded.
*/
public static boolean isMailboxTypeReplyAndForwardable(int type) {
@@ -538,10 +542,20 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
= mSyncStatus;
hash[CONTENT_PARENT_KEY_COLUMN]
= mParentKey;
- hash[CONTENT_LAST_SEEN_MESSAGE_KEY_COLUMN]
- = mLastSeenMessageKey;
hash[CONTENT_LAST_TOUCHED_TIME_COLUMN]
= mLastTouchedTime;
+ hash[CONTENT_UI_SYNC_STATUS_COLUMN]
+ = mUiSyncStatus;
+ hash[CONTENT_UI_LAST_SYNC_RESULT_COLUMN]
+ = mUiLastSyncResult;
+ hash[CONTENT_LAST_NOTIFIED_MESSAGE_KEY_COLUMN]
+ = mLastNotifiedMessageKey;
+ hash[CONTENT_LAST_NOTIFIED_MESSAGE_COUNT_COLUMN]
+ = mLastNotifiedMessageCount;
+ hash[CONTENT_TOTAL_COUNT_COLUMN]
+ = mTotalCount;
+ hash[CONTENT_HIERARCHICAL_NAME_COLUMN]
+ = mHierarchicalName;
return hash;
}
@@ -571,8 +585,13 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
dest.writeInt(mFlags);
dest.writeInt(mVisibleLimit);
dest.writeString(mSyncStatus);
- dest.writeLong(mLastSeenMessageKey);
dest.writeLong(mLastTouchedTime);
+ dest.writeInt(mUiSyncStatus);
+ dest.writeInt(mUiLastSyncResult);
+ dest.writeLong(mLastNotifiedMessageKey);
+ dest.writeInt(mLastNotifiedMessageCount);
+ dest.writeInt(mTotalCount);
+ dest.writeString(mHierarchicalName);
}
public Mailbox(Parcel in) {
@@ -593,8 +612,13 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
mFlags = in.readInt();
mVisibleLimit = in.readInt();
mSyncStatus = in.readString();
- mLastSeenMessageKey = in.readLong();
mLastTouchedTime = in.readLong();
+ mUiSyncStatus = in.readInt();
+ mUiLastSyncResult = in.readInt();
+ mLastNotifiedMessageKey = in.readLong();
+ mLastNotifiedMessageCount = in.readInt();
+ mTotalCount = in.readInt();
+ mHierarchicalName = in.readString();
}
public static final Parcelable.Creator<Mailbox> CREATOR = new Parcelable.Creator<Mailbox>() {
@@ -608,4 +632,9 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
return new Mailbox[size];
}
};
+
+ @Override
+ public String toString() {
+ return "[Mailbox " + mId + ": " + mDisplayName + "]";
+ }
}
diff --git a/emailcommon/src/com/android/emailcommon/provider/Policy.java b/emailcommon/src/com/android/emailcommon/provider/Policy.java
index 5c95abec8..d43290f9f 100644..100755
--- a/emailcommon/src/com/android/emailcommon/provider/Policy.java
+++ b/emailcommon/src/com/android/emailcommon/provider/Policy.java
@@ -16,21 +16,17 @@
package com.android.emailcommon.provider;
import android.app.admin.DevicePolicyManager;
-import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
-import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
-import android.os.RemoteException;
-import android.util.Log;
+import com.android.emailcommon.utility.TextUtilities;
import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
import java.util.ArrayList;
@@ -56,6 +52,8 @@ public final class Policy extends EmailContent implements EmailContent.PolicyCol
public static final int PASSWORD_MODE_SIMPLE = 1;
public static final int PASSWORD_MODE_STRONG = 2;
+ public static final char POLICY_STRING_DELIMITER = '\1';
+
public int mPasswordMode;
public int mPasswordMinLength;
public int mPasswordMaxFails;
@@ -76,6 +74,8 @@ public final class Policy extends EmailContent implements EmailContent.PolicyCol
public int mMaxEmailLookback;
public int mMaxCalendarLookback;
public boolean mPasswordRecoveryEnabled;
+ public String mProtocolPoliciesEnforced;
+ public String mProtocolPoliciesUnsupported;
public static final int CONTENT_ID_COLUMN = 0;
public static final int CONTENT_PASSWORD_MODE_COLUMN = 1;
@@ -98,6 +98,8 @@ public final class Policy extends EmailContent implements EmailContent.PolicyCol
public static final int CONTENT_MAX_EMAIL_LOOKBACK_COLUMN = 18;
public static final int CONTENT_MAX_CALENDAR_LOOKBACK_COLUMN = 19;
public static final int CONTENT_PASSWORD_RECOVERY_ENABLED_COLUMN = 20;
+ public static final int CONTENT_PROTOCOL_POLICIES_ENFORCED_COLUMN = 21;
+ public static final int CONTENT_PROTOCOL_POLICIES_UNSUPPORTED_COLUMN = 22;
public static final String[] CONTENT_PROJECTION = new String[] {RECORD_ID,
PolicyColumns.PASSWORD_MODE, PolicyColumns.PASSWORD_MIN_LENGTH,
@@ -109,7 +111,8 @@ public final class Policy extends EmailContent implements EmailContent.PolicyCol
PolicyColumns.DONT_ALLOW_ATTACHMENTS, PolicyColumns.DONT_ALLOW_HTML,
PolicyColumns.MAX_ATTACHMENT_SIZE, PolicyColumns.MAX_TEXT_TRUNCATION_SIZE,
PolicyColumns.MAX_HTML_TRUNCATION_SIZE, PolicyColumns.MAX_EMAIL_LOOKBACK,
- PolicyColumns.MAX_CALENDAR_LOOKBACK, PolicyColumns.PASSWORD_RECOVERY_ENABLED
+ PolicyColumns.MAX_CALENDAR_LOOKBACK, PolicyColumns.PASSWORD_RECOVERY_ENABLED,
+ PolicyColumns.PROTOCOL_POLICIES_ENFORCED, PolicyColumns.PROTOCOL_POLICIES_UNSUPPORTED
};
public static final Policy NO_POLICY = new Policy();
@@ -139,6 +142,24 @@ public final class Policy extends EmailContent implements EmailContent.PolicyCol
Account.ID_PROJECTION_COLUMN, Account.NO_ACCOUNT);
}
+ public static ArrayList<String> addPolicyStringToList(String policyString,
+ ArrayList<String> policyList) {
+ if (policyString != null) {
+ int start = 0;
+ int len = policyString.length();
+ while(start < len) {
+ int end = policyString.indexOf(POLICY_STRING_DELIMITER, start);
+ if (end > start) {
+ policyList.add(policyString.substring(start, end));
+ start = end + 1;
+ } else {
+ break;
+ }
+ }
+ }
+ return policyList;
+ }
+
// We override this method to insure that we never write invalid policy data to the provider
@Override
public Uri save(Context context) {
@@ -146,76 +167,6 @@ public final class Policy extends EmailContent implements EmailContent.PolicyCol
return super.save(context);
}
- public static void clearAccountPolicy(Context context, Account account) {
- setAccountPolicy(context, account, null, null);
- }
-
- /**
- * Convenience method for {@link #setAccountPolicy(Context, Account, Policy, String)}.
- */
- @VisibleForTesting
- public static void setAccountPolicy(Context context, long accountId, Policy policy,
- String securitySyncKey) {
- setAccountPolicy(context, Account.restoreAccountWithId(context, accountId),
- policy, securitySyncKey);
- }
-
- /**
- * Set the policy for an account atomically; this also removes any other policy associated with
- * the account and sets the policy key for the account. If policy is null, the policyKey is
- * set to 0 and the securitySyncKey to null. Also, update the account object to reflect the
- * current policyKey and securitySyncKey
- * @param context the caller's context
- * @param account the account whose policy is to be set
- * @param policy the policy to set, or null if we're clearing the policy
- * @param securitySyncKey the security sync key for this account (ignored if policy is null)
- */
- public static void setAccountPolicy(Context context, Account account, Policy policy,
- String securitySyncKey) {
- if (DEBUG_POLICY) {
- Log.d(TAG, "Set policy for account " + account.mDisplayName + ": " +
- ((policy == null) ? "none" : policy.toString()));
- }
- ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
-
- // Make sure this is a valid policy set
- if (policy != null) {
- policy.normalize();
- // Add the new policy (no account will yet reference this)
- ops.add(ContentProviderOperation.newInsert(
- Policy.CONTENT_URI).withValues(policy.toContentValues()).build());
- // Make the policyKey of the account our newly created policy, and set the sync key
- ops.add(ContentProviderOperation.newUpdate(
- ContentUris.withAppendedId(Account.CONTENT_URI, account.mId))
- .withValueBackReference(AccountColumns.POLICY_KEY, 0)
- .withValue(AccountColumns.SECURITY_SYNC_KEY, securitySyncKey)
- .build());
- } else {
- ops.add(ContentProviderOperation.newUpdate(
- ContentUris.withAppendedId(Account.CONTENT_URI, account.mId))
- .withValue(AccountColumns.SECURITY_SYNC_KEY, null)
- .withValue(AccountColumns.POLICY_KEY, 0)
- .build());
- }
-
- // Delete the previous policy associated with this account, if any
- if (account.mPolicyKey > 0) {
- ops.add(ContentProviderOperation.newDelete(
- ContentUris.withAppendedId(
- Policy.CONTENT_URI, account.mPolicyKey)).build());
- }
-
- try {
- context.getContentResolver().applyBatch(EmailContent.AUTHORITY, ops);
- account.refresh(context);
- } catch (RemoteException e) {
- // This is fatal to a remote process
- throw new IllegalStateException("Exception setting account policy.");
- } catch (OperationApplicationException e) {
- // Can't happen; our provider doesn't throw this exception
- }
- }
-
/**
* Review all attachment records for this account, and reset the "don't allow download" flag
* as required by the account's new security policies
@@ -286,6 +237,7 @@ public final class Policy extends EmailContent implements EmailContent.PolicyCol
public boolean equals(Object other) {
if (!(other instanceof Policy)) return false;
Policy otherPolicy = (Policy)other;
+ // Policies here are enforced by the DPM
if (mRequireEncryption != otherPolicy.mRequireEncryption) return false;
if (mRequireEncryptionExternal != otherPolicy.mRequireEncryptionExternal) return false;
if (mRequireRemoteWipe != otherPolicy.mRequireRemoteWipe) return false;
@@ -296,10 +248,13 @@ public final class Policy extends EmailContent implements EmailContent.PolicyCol
if (mPasswordMaxFails != otherPolicy.mPasswordMaxFails) return false;
if (mPasswordMinLength != otherPolicy.mPasswordMinLength) return false;
if (mPasswordMode != otherPolicy.mPasswordMode) return false;
+ if (mDontAllowCamera != otherPolicy.mDontAllowCamera) return false;
+
+ // Policies here are enforced by the Exchange sync manager
+ // They should eventually be removed from Policy and replaced with some opaque data
if (mRequireManualSyncWhenRoaming != otherPolicy.mRequireManualSyncWhenRoaming) {
return false;
}
- if (mDontAllowCamera != otherPolicy.mDontAllowCamera) return false;
if (mDontAllowAttachments != otherPolicy.mDontAllowAttachments) return false;
if (mDontAllowHtml != otherPolicy.mDontAllowHtml) return false;
if (mMaxAttachmentSize != otherPolicy.mMaxAttachmentSize) return false;
@@ -308,6 +263,15 @@ public final class Policy extends EmailContent implements EmailContent.PolicyCol
if (mMaxEmailLookback != otherPolicy.mMaxEmailLookback) return false;
if (mMaxCalendarLookback != otherPolicy.mMaxCalendarLookback) return false;
if (mPasswordRecoveryEnabled != otherPolicy.mPasswordRecoveryEnabled) return false;
+
+ if (!TextUtilities.stringOrNullEquals(mProtocolPoliciesEnforced,
+ otherPolicy.mProtocolPoliciesEnforced)) {
+ return false;
+ }
+ if (!TextUtilities.stringOrNullEquals(mProtocolPoliciesUnsupported,
+ otherPolicy.mProtocolPoliciesUnsupported)) {
+ return false;
+ }
return true;
}
@@ -353,6 +317,9 @@ public final class Policy extends EmailContent implements EmailContent.PolicyCol
mMaxEmailLookback = cursor.getInt(CONTENT_MAX_EMAIL_LOOKBACK_COLUMN);
mMaxCalendarLookback = cursor.getInt(CONTENT_MAX_CALENDAR_LOOKBACK_COLUMN);
mPasswordRecoveryEnabled = cursor.getInt(CONTENT_PASSWORD_RECOVERY_ENABLED_COLUMN) == 1;
+ mProtocolPoliciesEnforced = cursor.getString(CONTENT_PROTOCOL_POLICIES_ENFORCED_COLUMN);
+ mProtocolPoliciesUnsupported =
+ cursor.getString(CONTENT_PROTOCOL_POLICIES_UNSUPPORTED_COLUMN);
}
@Override
@@ -378,6 +345,8 @@ public final class Policy extends EmailContent implements EmailContent.PolicyCol
values.put(PolicyColumns.MAX_EMAIL_LOOKBACK, mMaxEmailLookback);
values.put(PolicyColumns.MAX_CALENDAR_LOOKBACK, mMaxCalendarLookback);
values.put(PolicyColumns.PASSWORD_RECOVERY_ENABLED, mPasswordRecoveryEnabled);
+ values.put(PolicyColumns.PROTOCOL_POLICIES_ENFORCED, mProtocolPoliciesEnforced);
+ values.put(PolicyColumns.PROTOCOL_POLICIES_UNSUPPORTED, mProtocolPoliciesUnsupported);
return values;
}
@@ -508,6 +477,8 @@ public final class Policy extends EmailContent implements EmailContent.PolicyCol
dest.writeInt(mMaxEmailLookback);
dest.writeInt(mMaxCalendarLookback);
dest.writeInt(mPasswordRecoveryEnabled ? 1 : 0);
+ dest.writeString(mProtocolPoliciesEnforced);
+ dest.writeString(mProtocolPoliciesUnsupported);
}
/**
@@ -536,5 +507,7 @@ public final class Policy extends EmailContent implements EmailContent.PolicyCol
mMaxEmailLookback = in.readInt();
mMaxCalendarLookback = in.readInt();
mPasswordRecoveryEnabled = in.readInt() == 1;
+ mProtocolPoliciesEnforced = in.readString();
+ mProtocolPoliciesUnsupported = in.readString();
}
} \ No newline at end of file
diff --git a/emailcommon/src/com/android/emailcommon/service/EmailServiceProxy.java b/emailcommon/src/com/android/emailcommon/service/EmailServiceProxy.java
index a44734368..2ec8d6b90 100644
--- a/emailcommon/src/com/android/emailcommon/service/EmailServiceProxy.java
+++ b/emailcommon/src/com/android/emailcommon/service/EmailServiceProxy.java
@@ -16,12 +16,6 @@
package com.android.emailcommon.service;
-import com.android.emailcommon.Api;
-import com.android.emailcommon.Device;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Policy;
-
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
@@ -29,6 +23,13 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
+import com.android.emailcommon.Api;
+import com.android.emailcommon.Device;
+import com.android.emailcommon.TempDirectory;
+import com.android.emailcommon.mail.MessagingException;
+import com.android.emailcommon.provider.HostAuth;
+import com.android.emailcommon.provider.Policy;
+
import java.io.IOException;
/**
@@ -49,9 +50,6 @@ import java.io.IOException;
public class EmailServiceProxy extends ServiceProxy implements IEmailService {
private static final String TAG = "EmailServiceProxy";
- // Private intent that will be used to connect to an independent Exchange service
- public static final String EXCHANGE_INTENT = "com.android.email.EXCHANGE_INTENT";
-
public static final String AUTO_DISCOVER_BUNDLE_ERROR_CODE = "autodiscover_error_code";
public static final String AUTO_DISCOVER_BUNDLE_HOST_AUTH = "autodiscover_host_auth";
@@ -64,6 +62,7 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
private final IEmailServiceCallback mCallback;
private Object mReturn = null;
private IEmailService mService;
+ private final boolean isRemote;
// Standard debugging
public static final int DEBUG_BIT = 1;
@@ -82,6 +81,7 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
public EmailServiceProxy(Context _context, Class<?> _class, IEmailServiceCallback _callback) {
super(_context, new Intent(_context, _class));
mCallback = _callback;
+ isRemote = false;
}
// The following two constructors are used with remote services that must be referenced by
@@ -90,18 +90,22 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
super(_context, _intent);
try {
Device.getDeviceId(_context);
+ TempDirectory.setTempDirectory(_context);
} catch (IOException e) {
}
mCallback = _callback;
+ isRemote = true;
}
public EmailServiceProxy(Context _context, String _action, IEmailServiceCallback _callback) {
super(_context, new Intent(_action));
try {
Device.getDeviceId(_context);
+ TempDirectory.setTempDirectory(_context);
} catch (IOException e) {
}
mCallback = _callback;
+ isRemote = true;
}
@Override
@@ -109,6 +113,10 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
mService = IEmailService.Stub.asInterface(binder);
}
+ public boolean isRemote() {
+ return isRemote;
+ }
+
@Override
public int getApiLevel() {
return Api.LEVEL;
@@ -124,9 +132,11 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
* @param background whether or not this request corresponds to a background action (i.e.
* prefetch) vs a foreground action (user request)
*/
+ @Override
public void loadAttachment(final long attachmentId, final boolean background)
throws RemoteException {
setTask(new ProxyTask() {
+ @Override
public void run() throws RemoteException {
try {
if (mCallback != null) mService.setCallback(mCallback);
@@ -153,8 +163,10 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
* @param mailboxId the id of the mailbox record
* @param userRequest whether or not the user specifically asked for the sync
*/
+ @Override
public void startSync(final long mailboxId, final boolean userRequest) throws RemoteException {
setTask(new ProxyTask() {
+ @Override
public void run() throws RemoteException {
if (mCallback != null) mService.setCallback(mCallback);
mService.startSync(mailboxId, userRequest);
@@ -170,8 +182,10 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
* @param mailboxId the id of the mailbox record
* @param userRequest whether or not the user specifically asked for the sync
*/
+ @Override
public void stopSync(final long mailboxId) throws RemoteException {
setTask(new ProxyTask() {
+ @Override
public void run() throws RemoteException {
if (mCallback != null) mService.setCallback(mCallback);
mService.stopSync(mailboxId);
@@ -189,8 +203,10 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
* @param hostAuth the hostauth object to validate
* @return a Bundle as described above
*/
+ @Override
public Bundle validate(final HostAuth hostAuth) throws RemoteException {
setTask(new ProxyTask() {
+ @Override
public void run() throws RemoteException{
if (mCallback != null) mService.setCallback(mCallback);
mReturn = mService.validate(hostAuth);
@@ -219,9 +235,11 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
* @param password the user's password
* @return a Bundle as described above
*/
+ @Override
public Bundle autoDiscover(final String userName, final String password)
throws RemoteException {
setTask(new ProxyTask() {
+ @Override
public void run() throws RemoteException{
if (mCallback != null) mService.setCallback(mCallback);
mReturn = mService.autoDiscover(userName, password);
@@ -244,8 +262,10 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
*
* @param accoundId the id of the account whose folder list is to be updated
*/
+ @Override
public void updateFolderList(final long accountId) throws RemoteException {
setTask(new ProxyTask() {
+ @Override
public void run() throws RemoteException {
if (mCallback != null) mService.setCallback(mCallback);
mService.updateFolderList(accountId);
@@ -259,8 +279,10 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
*
* @param flags an integer whose bits represent logging flags as defined in DEBUG_* flags above
*/
+ @Override
public void setLogging(final int flags) throws RemoteException {
setTask(new ProxyTask() {
+ @Override
public void run() throws RemoteException {
if (mCallback != null) mService.setCallback(mCallback);
mService.setLogging(flags);
@@ -274,8 +296,10 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
*
* @param cb a callback object through which all service callbacks are executed
*/
+ @Override
public void setCallback(final IEmailServiceCallback cb) throws RemoteException {
setTask(new ProxyTask() {
+ @Override
public void run() throws RemoteException {
mService.setCallback(cb);
}
@@ -289,8 +313,10 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
*
* @param accountId the id of the account whose host information has changed
*/
+ @Override
public void hostChanged(final long accountId) throws RemoteException {
setTask(new ProxyTask() {
+ @Override
public void run() throws RemoteException {
mService.hostChanged(accountId);
}
@@ -303,9 +329,11 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
* @param messageId the id of the message containing the meeting request
* @param response the response code, as defined in EmailServiceConstants
*/
+ @Override
public void sendMeetingResponse(final long messageId, final int response)
throws RemoteException {
setTask(new ProxyTask() {
+ @Override
public void run() throws RemoteException {
if (mCallback != null) mService.setCallback(mCallback);
mService.sendMeetingResponse(messageId, response);
@@ -314,11 +342,19 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
}
/**
- * Not yet used; intended to request the sync adapter to load a complete message
+ * Request the sync adapter to load a complete message
*
* @param messageId the id of the message to be loaded
*/
- public void loadMore(long messageId) throws RemoteException {
+ @Override
+ public void loadMore(final long messageId) throws RemoteException {
+ setTask(new ProxyTask() {
+ @Override
+ public void run() throws RemoteException {
+ if (mCallback != null) mService.setCallback(mCallback);
+ mService.loadMore(messageId);
+ }
+ }, "startSync");
}
/**
@@ -327,6 +363,7 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
* @param accountId the account in which the folder is to be created
* @param name the name of the folder to be created
*/
+ @Override
public boolean createFolder(long accountId, String name) throws RemoteException {
return false;
}
@@ -337,6 +374,7 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
* @param accountId the account in which the folder resides
* @param name the name of the folder to be deleted
*/
+ @Override
public boolean deleteFolder(long accountId, String name) throws RemoteException {
return false;
}
@@ -348,6 +386,7 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
* @param oldName the name of the existing folder
* @param newName the new name for the folder
*/
+ @Override
public boolean renameFolder(long accountId, String oldName, String newName)
throws RemoteException {
return false;
@@ -361,17 +400,17 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
*
* @param accountId the account whose data is to be deleted
*/
+ @Override
public void deleteAccountPIMData(final long accountId) throws RemoteException {
setTask(new ProxyTask() {
+ @Override
public void run() throws RemoteException {
mService.deleteAccountPIMData(accountId);
}
}, "deleteAccountPIMData");
}
-
/**
- * PRELIMINARY
* Search for messages given a query string. The string is interpreted as the logical AND of
* terms separated by white space. The search is performed on the specified mailbox in the
* specified account (including subfolders, as specified by the includeSubfolders parameter).
@@ -385,9 +424,11 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
* @param destMailboxId the id of the mailbox into which search results are appended
* @return the total number of matches for this search (regardless of how many were requested)
*/
+ @Override
public int searchMessages(final long accountId, final SearchParams searchParams,
final long destMailboxId) throws RemoteException {
setTask(new ProxyTask() {
+ @Override
public void run() throws RemoteException{
if (mCallback != null) mService.setCallback(mCallback);
mReturn = mService.searchMessages(accountId, searchParams, destMailboxId);
@@ -400,6 +441,41 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
return (Integer)mReturn;
}
}
+
+ /**
+ * Request the service to send mail in the specified account's Outbox
+ *
+ * @param accountId the account whose outgoing mail should be sent
+ */
+ @Override
+ public void sendMail(final long accountId) throws RemoteException {
+ setTask(new ProxyTask() {
+ @Override
+ public void run() throws RemoteException{
+ if (mCallback != null) mService.setCallback(mCallback);
+ mService.sendMail(accountId);
+ }
+ }, "sendMail");
+ }
+
+ @Override
+ public int getCapabilities(final long accountId) throws RemoteException {
+ setTask(new ProxyTask() {
+ @Override
+ public void run() throws RemoteException{
+ if (mCallback != null) mService.setCallback(mCallback);
+ mReturn = mService.getCapabilities(accountId);
+ }
+ }, "getCapabilities");
+ waitForCompletion();
+ if (mReturn == null) {
+ return 0;
+ } else {
+ return (Integer)mReturn;
+ }
+ }
+
+ @Override
public IBinder asBinder() {
return null;
}
diff --git a/emailcommon/src/com/android/emailcommon/service/IEmailService.aidl b/emailcommon/src/com/android/emailcommon/service/IEmailService.aidl
index 1c3d85946..ad21ecdee 100644
--- a/emailcommon/src/com/android/emailcommon/service/IEmailService.aidl
+++ b/emailcommon/src/com/android/emailcommon/service/IEmailService.aidl
@@ -57,4 +57,9 @@ interface IEmailService {
// API level 2
int searchMessages(long accountId, in SearchParams params, long destMailboxId);
+
+ void sendMail(long accountId);
+
+ // API level 3
+ int getCapabilities(long accountId);
}
diff --git a/emailcommon/src/com/android/emailcommon/service/IEmailServiceCallback.aidl b/emailcommon/src/com/android/emailcommon/service/IEmailServiceCallback.aidl
index e4c6093fc..c713f5211 100644
--- a/emailcommon/src/com/android/emailcommon/service/IEmailServiceCallback.aidl
+++ b/emailcommon/src/com/android/emailcommon/service/IEmailServiceCallback.aidl
@@ -65,4 +65,12 @@ oneway interface IEmailServiceCallback {
* progress = 0 for "start", 1..100 for optional progress reports
*/
void sendMessageStatus(long messageId, String subject, int statusCode, int progress);
+
+ /**
+ * Callback to indicate that a particular message is being loaded
+ * messageId = the message being sent
+ * statusCode = 0 for OK, 1 for progress, other codes for error
+ * progress = 0 for "start", 1..100 for optional progress reports
+ */
+ void loadMessageStatus(long messageId, int statusCode, int progress);
}
diff --git a/emailcommon/src/com/android/emailcommon/service/IPolicyService.aidl b/emailcommon/src/com/android/emailcommon/service/IPolicyService.aidl
index e9bcf42dd..9d4be36e4 100644..100755
--- a/emailcommon/src/com/android/emailcommon/service/IPolicyService.aidl
+++ b/emailcommon/src/com/android/emailcommon/service/IPolicyService.aidl
@@ -19,12 +19,7 @@ import com.android.emailcommon.provider.Policy;
interface IPolicyService {
boolean isActive(in Policy policies);
- void policiesRequired(long accountId);
- void policiesUpdated(long accountId);
void setAccountHoldFlag(long accountId, boolean newState);
- boolean isActiveAdmin();
- // This is about as oneway as you can get
+ void setAccountPolicy(long accountId, in Policy policy, String securityKey);
oneway void remoteWipe();
- boolean isSupported(in Policy policies);
- Policy clearUnsupportedPolicies(in Policy policies);
} \ No newline at end of file
diff --git a/emailcommon/src/com/android/emailcommon/service/PolicyServiceProxy.java b/emailcommon/src/com/android/emailcommon/service/PolicyServiceProxy.java
index a3b317e26..26e820dee 100644..100755
--- a/emailcommon/src/com/android/emailcommon/service/PolicyServiceProxy.java
+++ b/emailcommon/src/com/android/emailcommon/service/PolicyServiceProxy.java
@@ -49,24 +49,6 @@ public class PolicyServiceProxy extends ServiceProxy implements IPolicyService {
}
@Override
- public Policy clearUnsupportedPolicies(final Policy arg0) throws RemoteException {
- setTask(new ProxyTask() {
- public void run() throws RemoteException {
- mReturn = mService.clearUnsupportedPolicies(arg0);
- }
- }, "clearUnsupportedPolicies");
- waitForCompletion();
- if (DEBUG_PROXY) {
- Log.v(TAG, "clearUnsupportedPolicies: " + ((mReturn == null) ? "null" : mReturn));
- }
- if (mReturn == null) {
- throw new ServiceUnavailableException("clearUnsupportedPolicies");
- } else {
- return (Policy)mReturn;
- }
- }
-
- @Override
public boolean isActive(final Policy arg0) throws RemoteException {
setTask(new ProxyTask() {
public void run() throws RemoteException {
@@ -85,48 +67,14 @@ public class PolicyServiceProxy extends ServiceProxy implements IPolicyService {
}
@Override
- public boolean isActiveAdmin() throws RemoteException {
+ public void setAccountPolicy(final long accountId, final Policy policy,
+ final String securityKey) throws RemoteException {
setTask(new ProxyTask() {
public void run() throws RemoteException {
- mReturn = mService.isActiveAdmin();
+ mService.setAccountPolicy(accountId, policy, securityKey);
}
- }, "isActiveAdmin");
+ }, "setAccountPolicy");
waitForCompletion();
- if (DEBUG_PROXY) {
- Log.v(TAG, "isActiveAdmin: " + ((mReturn == null) ? "null" : mReturn));
- }
- if (mReturn == null) {
- throw new ServiceUnavailableException("isActiveAdmin");
- } else {
- return (Boolean)mReturn;
- }
- }
-
- @Override
- public boolean isSupported(final Policy arg0) throws RemoteException {
- setTask(new ProxyTask() {
- public void run() throws RemoteException {
- mReturn = mService.isSupported(arg0);
- }
- }, "isSupported");
- waitForCompletion();
- if (DEBUG_PROXY) {
- Log.v(TAG, "isSupported: " + ((mReturn == null) ? "null" : mReturn));
- }
- if (mReturn == null) {
- throw new ServiceUnavailableException("isSupported");
- } else {
- return (Boolean)mReturn;
- }
- }
-
- @Override
- public void policiesRequired(final long arg0) throws RemoteException {
- setTask(new ProxyTask() {
- public void run() throws RemoteException {
- mService.policiesRequired(arg0);
- }
- }, "policiesRequired");
}
@Override
@@ -147,15 +95,6 @@ public class PolicyServiceProxy extends ServiceProxy implements IPolicyService {
}, "setAccountHoldFlag");
}
- @Override
- public void policiesUpdated(final long arg0) throws RemoteException {
- setTask(new ProxyTask() {
- public void run() throws RemoteException {
- mService.policiesUpdated(arg0);
- }
- }, "policiesUpdated");
- }
-
// Static methods that encapsulate the proxy calls above
public static boolean isActive(Context context, Policy policies) {
try {
@@ -165,22 +104,6 @@ public class PolicyServiceProxy extends ServiceProxy implements IPolicyService {
return false;
}
- public static void policiesRequired(Context context, long accountId) {
- try {
- new PolicyServiceProxy(context).policiesRequired(accountId);
- } catch (RemoteException e) {
- throw new IllegalStateException("PolicyService transaction failed");
- }
- }
-
- public static void policiesUpdated(Context context, long accountId) {
- try {
- new PolicyServiceProxy(context).policiesUpdated(accountId);
- } catch (RemoteException e) {
- throw new IllegalStateException("PolicyService transaction failed");
- }
- }
-
public static void setAccountHoldFlag(Context context, Account account, boolean newState) {
try {
new PolicyServiceProxy(context).setAccountHoldFlag(account.mId, newState);
@@ -189,14 +112,6 @@ public class PolicyServiceProxy extends ServiceProxy implements IPolicyService {
}
}
- public static boolean isActiveAdmin(Context context) {
- try {
- return new PolicyServiceProxy(context).isActiveAdmin();
- } catch (RemoteException e) {
- }
- return false;
- }
-
public static void remoteWipe(Context context) {
try {
new PolicyServiceProxy(context).remoteWipe();
@@ -205,17 +120,11 @@ public class PolicyServiceProxy extends ServiceProxy implements IPolicyService {
}
}
- public static boolean isSupported(Context context, Policy policy) {
- try {
- return new PolicyServiceProxy(context).isSupported(policy);
- } catch (RemoteException e) {
- }
- return false;
- }
-
- public static Policy clearUnsupportedPolicies(Context context, Policy policy) {
+ public static void setAccountPolicy(Context context, long accountId, Policy policy,
+ String securityKey) {
try {
- return new PolicyServiceProxy(context).clearUnsupportedPolicies(policy);
+ new PolicyServiceProxy(context).setAccountPolicy(accountId, policy, securityKey);
+ return;
} catch (RemoteException e) {
}
throw new IllegalStateException("PolicyService transaction failed");
diff --git a/emailcommon/src/com/android/emailcommon/service/SearchParams.java b/emailcommon/src/com/android/emailcommon/service/SearchParams.java
index 367cc89ab..eacf01df9 100644
--- a/emailcommon/src/com/android/emailcommon/service/SearchParams.java
+++ b/emailcommon/src/com/android/emailcommon/service/SearchParams.java
@@ -40,6 +40,10 @@ public class SearchParams implements Parcelable {
// If zero, specifies a "new" search; otherwise, asks for a continuation of the previous
// query(ies) starting with the mOffset'th match (0 based)
public int mOffset = DEFAULT_OFFSET;
+ // The total number of results for this search
+ public int mTotalCount = 0;
+ // The id of the "search" mailbox being used
+ public long mSearchMailboxId;
/**
* Error codes returned by the searchMessages API
@@ -54,6 +58,12 @@ public class SearchParams implements Parcelable {
mFilter = filter;
}
+ public SearchParams(long mailboxId, String filter, long searchMailboxId) {
+ mMailboxId = mailboxId;
+ mFilter = filter;
+ mSearchMailboxId = searchMailboxId;
+ }
+
@Override
public boolean equals(Object o) {
if (o == this) {
diff --git a/emailcommon/src/com/android/emailcommon/utility/AttachmentUtilities.java b/emailcommon/src/com/android/emailcommon/utility/AttachmentUtilities.java
index e4d119b7a..f43458323 100644
--- a/emailcommon/src/com/android/emailcommon/utility/AttachmentUtilities.java
+++ b/emailcommon/src/com/android/emailcommon/utility/AttachmentUtilities.java
@@ -16,21 +16,35 @@
package com.android.emailcommon.utility;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-
+import android.app.DownloadManager;
import android.content.ContentResolver;
import android.content.ContentUris;
+import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
+import android.media.MediaScannerConnection;
import android.net.Uri;
+import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.MimeTypeMap;
+import com.android.emailcommon.Logging;
+import com.android.emailcommon.provider.EmailContent.Attachment;
+import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
+import com.android.emailcommon.provider.EmailContent.Body;
+import com.android.emailcommon.provider.EmailContent.BodyColumns;
+import com.android.emailcommon.provider.EmailContent.Message;
+import com.android.emailcommon.provider.EmailContent.MessageColumns;
+import com.android.mail.providers.UIProvider;
+
+import org.apache.commons.io.IOUtils;
+
import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
public class AttachmentUtilities {
public static final String AUTHORITY = "com.android.email.attachmentprovider";
@@ -225,23 +239,6 @@ public class AttachmentUtilities {
}
/**
- * @return mime-type for a {@link Uri}.
- * - Use {@link ContentResolver#getType} for a content: URI.
- * - Use {@link #inferMimeType} for a file: URI.
- * - Otherwise throw {@link IllegalArgumentException}.
- */
- public static String inferMimeTypeForUri(Context context, Uri uri) {
- final String scheme = uri.getScheme();
- if ("content".equals(scheme)) {
- return context.getContentResolver().getType(uri);
- } else if ("file".equals(scheme)) {
- return inferMimeType(uri.getLastPathSegment(), "");
- } else {
- throw new IllegalArgumentException();
- }
- }
-
- /**
* Extract and return filename's extension, converted to lower case, and not including the "."
*
* @return extension, or null if not found (or null/empty filename)
@@ -349,4 +346,83 @@ public class AttachmentUtilities {
}
}
}
+
+ private static long copyFile(InputStream in, OutputStream out) throws IOException {
+ long size = IOUtils.copy(in, out);
+ in.close();
+ out.flush();
+ out.close();
+ return size;
+ }
+
+ /**
+ * Save the attachment to its final resting place (cache or sd card)
+ */
+ public static void saveAttachment(Context context, InputStream in, Attachment attachment) {
+ Uri uri = ContentUris.withAppendedId(Attachment.CONTENT_URI, attachment.mId);
+ ContentValues cv = new ContentValues();
+ long attachmentId = attachment.mId;
+ long accountId = attachment.mAccountKey;
+ String contentUri = null;
+ long size;
+ try {
+ ContentResolver resolver = context.getContentResolver();
+ if (attachment.mUiDestination == UIProvider.AttachmentDestination.CACHE) {
+ Uri attUri = getAttachmentUri(accountId, attachmentId);
+ size = copyFile(in, resolver.openOutputStream(attUri));
+ contentUri = attUri.toString();
+ } else if (Utility.isExternalStorageMounted()) {
+ File downloads = Environment.getExternalStoragePublicDirectory(
+ Environment.DIRECTORY_DOWNLOADS);
+ downloads.mkdirs();
+ File file = Utility.createUniqueFile(downloads, attachment.mFileName);
+ size = copyFile(in, new FileOutputStream(file));
+ String absolutePath = file.getAbsolutePath();
+
+ // Although the download manager can scan media files, scanning only happens
+ // after the user clicks on the item in the Downloads app. So, we run the
+ // attachment through the media scanner ourselves so it gets added to
+ // gallery / music immediately.
+ MediaScannerConnection.scanFile(context, new String[] {absolutePath},
+ null, null);
+
+ DownloadManager dm =
+ (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
+ long id = dm.addCompletedDownload(attachment.mFileName, attachment.mFileName,
+ false /* do not use media scanner */,
+ attachment.mMimeType, absolutePath, size,
+ true /* show notification */);
+ contentUri = dm.getUriForDownloadedFile(id).toString();
+
+ } else {
+ Log.w(Logging.LOG_TAG, "Trying to save an attachment without external storage?");
+ throw new IOException();
+ }
+
+ // Update the attachment
+ cv.put(AttachmentColumns.SIZE, size);
+ cv.put(AttachmentColumns.CONTENT_URI, contentUri);
+ cv.put(AttachmentColumns.UI_STATE, UIProvider.AttachmentState.SAVED);
+ } catch (IOException e) {
+ // Handle failures here...
+ cv.put(AttachmentColumns.UI_STATE, UIProvider.AttachmentState.FAILED);
+ }
+ context.getContentResolver().update(uri, cv, null, null);
+
+ // If this is an inline attachment, update the body
+ if (contentUri != null && attachment.mContentId != null) {
+ Body body = Body.restoreBodyWithMessageId(context, attachment.mMessageKey);
+ if (body != null && body.mHtmlContent != null) {
+ cv.clear();
+ String html = body.mHtmlContent;
+ String contentIdRe =
+ "\\s+(?i)src=\"cid(?-i):\\Q" + attachment.mContentId + "\\E\"";
+ String srcContentUri = " src=\"" + contentUri + "\"";
+ html = html.replaceAll(contentIdRe, srcContentUri);
+ cv.put(BodyColumns.HTML_CONTENT, html);
+ context.getContentResolver().update(
+ ContentUris.withAppendedId(Body.CONTENT_URI, body.mId), cv, null, null);
+ }
+ }
+ }
}
diff --git a/emailcommon/src/com/android/emailcommon/utility/EmailClientConnectionManager.java b/emailcommon/src/com/android/emailcommon/utility/EmailClientConnectionManager.java
index 36ece4261..5e0429019 100644
--- a/emailcommon/src/com/android/emailcommon/utility/EmailClientConnectionManager.java
+++ b/emailcommon/src/com/android/emailcommon/utility/EmailClientConnectionManager.java
@@ -22,6 +22,7 @@ import android.net.SSLCertificateSocketFactory;
import android.util.Log;
import com.android.emailcommon.Logging;
+import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.utility.SSLUtils.KeyChainKeyManager;
import com.android.emailcommon.utility.SSLUtils.TrackingKeyManager;
@@ -41,6 +42,8 @@ import javax.net.ssl.KeyManager;
*/
public class EmailClientConnectionManager extends ThreadSafeClientConnManager {
+ private static final int STANDARD_PORT = 80;
+ private static final int STANDARD_SSL_PORT = 443;
private static final boolean LOG_ENABLED = false;
/**
@@ -57,19 +60,21 @@ public class EmailClientConnectionManager extends ThreadSafeClientConnManager {
mTrackingKeyManager = keyManager;
}
- public static EmailClientConnectionManager newInstance(HttpParams params) {
+ public static EmailClientConnectionManager newInstance(HttpParams params, boolean ssl,
+ int port) {
TrackingKeyManager keyManager = new TrackingKeyManager();
// Create a registry for our three schemes; http and https will use built-in factories
SchemeRegistry registry = new SchemeRegistry();
- registry.register(new Scheme("http",
- PlainSocketFactory.getSocketFactory(), 80));
+ registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(),
+ ssl ? STANDARD_PORT : port));
+ // Register https with the secure factory
registry.register(new Scheme("https",
- SSLUtils.getHttpSocketFactory(false, keyManager), 443));
-
+ SSLUtils.getHttpSocketFactory(false, keyManager), ssl ? port : STANDARD_SSL_PORT));
// Register the httpts scheme with our insecure factory
registry.register(new Scheme("httpts",
- SSLUtils.getHttpSocketFactory(true /*insecure*/, keyManager), 443));
+ SSLUtils.getHttpSocketFactory(true /*insecure*/, keyManager),
+ ssl ? port : STANDARD_SSL_PORT));
return new EmailClientConnectionManager(params, registry, keyManager);
}
@@ -81,22 +86,24 @@ public class EmailClientConnectionManager extends ThreadSafeClientConnManager {
* connection, so clients of this connection manager should use
* {@link #makeSchemeForClientCert(String, boolean)}.
*/
- public synchronized void registerClientCert(
- Context context, String clientCertAlias, boolean trustAllServerCerts)
+ public synchronized void registerClientCert(Context context, HostAuth hostAuth)
throws CertificateException {
SchemeRegistry registry = getSchemeRegistry();
- String schemeName = makeSchemeForClientCert(clientCertAlias, trustAllServerCerts);
+ String schemeName = makeSchemeForClientCert(hostAuth.mClientCertAlias,
+ hostAuth.shouldTrustAllServerCerts());
Scheme existing = registry.get(schemeName);
if (existing == null) {
if (LOG_ENABLED) {
Log.i(Logging.LOG_TAG, "Registering socket factory for certificate alias ["
- + clientCertAlias + "]");
+ + hostAuth.mClientCertAlias + "]");
}
- KeyManager keyManager = KeyChainKeyManager.fromAlias(context, clientCertAlias);
+ KeyManager keyManager =
+ KeyChainKeyManager.fromAlias(context, hostAuth.mClientCertAlias);
SSLCertificateSocketFactory underlying = SSLUtils.getSSLSocketFactory(
- trustAllServerCerts);
+ hostAuth.shouldTrustAllServerCerts());
underlying.setKeyManagers(new KeyManager[] { keyManager });
- registry.register(new Scheme(schemeName, new SSLSocketFactory(underlying), 443));
+ registry.register(
+ new Scheme(schemeName, new SSLSocketFactory(underlying), hostAuth.mPort));
}
}
diff --git a/emailcommon/src/com/android/emailcommon/utility/TextUtilities.java b/emailcommon/src/com/android/emailcommon/utility/TextUtilities.java
index 59f6fd2c0..0aa919098 100644..100755
--- a/emailcommon/src/com/android/emailcommon/utility/TextUtilities.java
+++ b/emailcommon/src/com/android/emailcommon/utility/TextUtilities.java
@@ -714,4 +714,15 @@ public class TextUtilities {
return (CharSequence)sb;
}
+
+ /**
+ * Determine whether two Strings (either of which might be null) are the same; this is true
+ * when both are null or both are Strings that are equal.
+ */
+ public static boolean stringOrNullEquals(String a, String b) {
+ if (a == null && b == null) return true;
+ if (a != null && b != null && a.equals(b)) return true;
+ return false;
+ }
+
}
diff --git a/emailcommon/src/com/android/emailcommon/utility/Utility.java b/emailcommon/src/com/android/emailcommon/utility/Utility.java
index 0a698d442..b74d4b3e0 100644
--- a/emailcommon/src/com/android/emailcommon/utility/Utility.java
+++ b/emailcommon/src/com/android/emailcommon/utility/Utility.java
@@ -52,7 +52,6 @@ import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
import com.android.emailcommon.provider.EmailContent.HostAuthColumns;
import com.android.emailcommon.provider.EmailContent.MailboxColumns;
import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.provider.Mailbox;
import com.android.emailcommon.provider.ProviderUnavailableException;
@@ -897,28 +896,27 @@ public class Utility {
* all accounts are updated.
* @return an {@link EmailAsyncTask} for test only.
*/
- public static EmailAsyncTask<Void, Void, Void> updateLastSeenMessageKey(final Context context,
- final long accountId) {
+ public static EmailAsyncTask<Void, Void, Void> updateLastNotifiedMessageKey(
+ final Context context, final long mailboxId) {
return EmailAsyncTask.runAsyncParallel(new Runnable() {
- private void updateLastSeenMessageKeyForAccount(long accountId) {
+ private void updateLastSeenMessageKeyForMailbox(long mailboxId) {
ContentResolver resolver = context.getContentResolver();
- if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
+ if (mailboxId == Mailbox.QUERY_ALL_INBOXES) {
Cursor c = resolver.query(
- Account.CONTENT_URI, EmailContent.ID_PROJECTION, null, null, null);
+ Mailbox.CONTENT_URI, EmailContent.ID_PROJECTION, Mailbox.TYPE + "=?",
+ new String[] { Integer.toString(Mailbox.TYPE_INBOX) }, null);
if (c == null) throw new ProviderUnavailableException();
try {
while (c.moveToNext()) {
final long id = c.getLong(EmailContent.ID_PROJECTION_COLUMN);
- updateLastSeenMessageKeyForAccount(id);
+ updateLastSeenMessageKeyForMailbox(id);
}
} finally {
c.close();
}
- } else if (accountId > 0L) {
- Mailbox mailbox =
- Mailbox.restoreMailboxOfType(context, accountId, Mailbox.TYPE_INBOX);
-
- // mailbox has been removed
+ } else if (mailboxId > 0L) {
+ Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
+ // mailbox has been removed
if (mailbox == null) {
return;
}
@@ -927,34 +925,33 @@ public class Utility {
// need a point at which we can compare against in the future. By setting this
// value, we are claiming that every message before this has potentially been
// seen by the user.
- long messageId = Utility.getFirstRowLong(
- context,
- Message.CONTENT_URI,
- EmailContent.ID_PROJECTION,
- MessageColumns.MAILBOX_KEY + "=?",
- new String[] { Long.toString(mailbox.mId) },
- MessageColumns.ID + " DESC",
- EmailContent.ID_PROJECTION_COLUMN, 0L);
- long oldLastSeenMessageId = Utility.getFirstRowLong(
- context, ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailbox.mId),
- new String[] { MailboxColumns.LAST_SEEN_MESSAGE_KEY },
- null, null, null, 0, 0L);
+ long mostRecentMessageId = Utility.getFirstRowLong(context,
+ ContentUris.withAppendedId(
+ EmailContent.MAILBOX_MOST_RECENT_MESSAGE_URI, mailboxId),
+ Message.ID_COLUMN_PROJECTION, null, null, null,
+ Message.ID_MAILBOX_COLUMN_ID, -1L);
+ long lastNotifiedMessageId = mailbox.mLastNotifiedMessageKey;
// Only update the db if the value has changed
- if (messageId != oldLastSeenMessageId) {
+ if (mostRecentMessageId != lastNotifiedMessageId) {
+ Log.d(Logging.LOG_TAG, "Most recent = " + mostRecentMessageId +
+ ", last notified: " + lastNotifiedMessageId +
+ "; updating last notified");
ContentValues values = mailbox.toContentValues();
- values.put(MailboxColumns.LAST_SEEN_MESSAGE_KEY, messageId);
+ values.put(MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY, mostRecentMessageId);
resolver.update(
Mailbox.CONTENT_URI,
values,
EmailContent.ID_SELECTION,
new String[] { Long.toString(mailbox.mId) });
+ } else {
+ Log.d(Logging.LOG_TAG, "Most recent = last notified; no change");
}
}
}
@Override
public void run() {
- updateLastSeenMessageKeyForAccount(accountId);
+ updateLastSeenMessageKeyForMailbox(mailboxId);
}
});
}
diff --git a/emailcommon/src/org/apache/commons/io/CopyUtils.java b/emailcommon/src/org/apache/commons/io/CopyUtils.java
deleted file mode 100644
index eab8307e7..000000000
--- a/emailcommon/src/org/apache/commons/io/CopyUtils.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.Writer;
-
-/**
- * This class provides static utility methods for buffered
- * copying between sources (<code>InputStream</code>, <code>Reader</code>,
- * <code>String</code> and <code>byte[]</code>) and destinations
- * (<code>OutputStream</code>, <code>Writer</code>, <code>String</code> and
- * <code>byte[]</code>).
- * <p>
- * Unless otherwise noted, these <code>copy</code> methods do <em>not</em>
- * flush or close the streams. Often doing so would require making non-portable
- * assumptions about the streams' origin and further use. This means that both
- * streams' <code>close()</code> methods must be called after copying. if one
- * omits this step, then the stream resources (sockets, file descriptors) are
- * released when the associated Stream is garbage-collected. It is not a good
- * idea to rely on this mechanism. For a good overview of the distinction
- * between "memory management" and "resource management", see
- * <a href="http://www.unixreview.com/articles/1998/9804/9804ja/ja.htm">this
- * UnixReview article</a>.
- * <p>
- * For byte-to-char methods, a <code>copy</code> variant allows the encoding
- * to be selected (otherwise the platform default is used). We would like to
- * encourage you to always specify the encoding because relying on the platform
- * default can lead to unexpected results.
- * <p
- * We don't provide special variants for the <code>copy</code> methods that
- * let you specify the buffer size because in modern VMs the impact on speed
- * seems to be minimal. We're using a default buffer size of 4 KB.
- * <p>
- * The <code>copy</code> methods use an internal buffer when copying. It is
- * therefore advisable <em>not</em> to deliberately wrap the stream arguments
- * to the <code>copy</code> methods in <code>Buffered*</code> streams. For
- * example, don't do the following:
- * <pre>
- * copy( new BufferedInputStream( in ), new BufferedOutputStream( out ) );
- * </pre>
- * The rationale is as follows:
- * <p>
- * Imagine that an InputStream's read() is a very expensive operation, which
- * would usually suggest wrapping in a BufferedInputStream. The
- * BufferedInputStream works by issuing infrequent
- * {@link java.io.InputStream#read(byte[] b, int off, int len)} requests on the
- * underlying InputStream, to fill an internal buffer, from which further
- * <code>read</code> requests can inexpensively get their data (until the buffer
- * runs out).
- * <p>
- * However, the <code>copy</code> methods do the same thing, keeping an
- * internal buffer, populated by
- * {@link InputStream#read(byte[] b, int off, int len)} requests. Having two
- * buffers (or three if the destination stream is also buffered) is pointless,
- * and the unnecessary buffer management hurts performance slightly (about 3%,
- * according to some simple experiments).
- * <p>
- * Behold, intrepid explorers; a map of this class:
- * <pre>
- * Method Input Output Dependency
- * ------ ----- ------ -------
- * 1 copy InputStream OutputStream (primitive)
- * 2 copy Reader Writer (primitive)
- *
- * 3 copy InputStream Writer 2
- *
- * 4 copy Reader OutputStream 2
- *
- * 5 copy String OutputStream 2
- * 6 copy String Writer (trivial)
- *
- * 7 copy byte[] Writer 3
- * 8 copy byte[] OutputStream (trivial)
- * </pre>
- * <p>
- * Note that only the first two methods shuffle bytes; the rest use these
- * two, or (if possible) copy using native Java copy methods. As there are
- * method variants to specify the encoding, each row may
- * correspond to up to 2 methods.
- * <p>
- * Origin of code: Excalibur.
- *
- * @author Peter Donald
- * @author Jeff Turner
- * @author Matthew Hawthorne
- * @version $Id: CopyUtils.java 437680 2006-08-28 11:57:00Z scolebourne $
- * @deprecated Use IOUtils. Will be removed in 2.0.
- * Methods renamed to IOUtils.write() or IOUtils.copy().
- * Null handling behaviour changed in IOUtils (null data does not
- * throw NullPointerException).
- */
-public class CopyUtils {
-
- /**
- * The default size of the buffer.
- */
- private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
-
- /**
- * Instances should NOT be constructed in standard programming.
- */
- public CopyUtils() { }
-
- // ----------------------------------------------------------------
- // byte[] -> OutputStream
- // ----------------------------------------------------------------
-
- /**
- * Copy bytes from a <code>byte[]</code> to an <code>OutputStream</code>.
- * @param input the byte array to read from
- * @param output the <code>OutputStream</code> to write to
- * @throws IOException In case of an I/O problem
- */
- public static void copy(byte[] input, OutputStream output)
- throws IOException {
- output.write(input);
- }
-
- // ----------------------------------------------------------------
- // byte[] -> Writer
- // ----------------------------------------------------------------
-
- /**
- * Copy and convert bytes from a <code>byte[]</code> to chars on a
- * <code>Writer</code>.
- * The platform's default encoding is used for the byte-to-char conversion.
- * @param input the byte array to read from
- * @param output the <code>Writer</code> to write to
- * @throws IOException In case of an I/O problem
- */
- public static void copy(byte[] input, Writer output)
- throws IOException {
- ByteArrayInputStream in = new ByteArrayInputStream(input);
- copy(in, output);
- }
-
-
- /**
- * Copy and convert bytes from a <code>byte[]</code> to chars on a
- * <code>Writer</code>, using the specified encoding.
- * @param input the byte array to read from
- * @param output the <code>Writer</code> to write to
- * @param encoding The name of a supported character encoding. See the
- * <a href="http://www.iana.org/assignments/character-sets">IANA
- * Charset Registry</a> for a list of valid encoding types.
- * @throws IOException In case of an I/O problem
- */
- public static void copy(
- byte[] input,
- Writer output,
- String encoding)
- throws IOException {
- ByteArrayInputStream in = new ByteArrayInputStream(input);
- copy(in, output, encoding);
- }
-
-
- // ----------------------------------------------------------------
- // Core copy methods
- // ----------------------------------------------------------------
-
- /**
- * Copy bytes from an <code>InputStream</code> to an
- * <code>OutputStream</code>.
- * @param input the <code>InputStream</code> to read from
- * @param output the <code>OutputStream</code> to write to
- * @return the number of bytes copied
- * @throws IOException In case of an I/O problem
- */
- public static int copy(
- InputStream input,
- OutputStream output)
- throws IOException {
- byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
- int count = 0;
- int n = 0;
- while (-1 != (n = input.read(buffer))) {
- output.write(buffer, 0, n);
- count += n;
- }
- return count;
- }
-
- // ----------------------------------------------------------------
- // Reader -> Writer
- // ----------------------------------------------------------------
-
- /**
- * Copy chars from a <code>Reader</code> to a <code>Writer</code>.
- * @param input the <code>Reader</code> to read from
- * @param output the <code>Writer</code> to write to
- * @return the number of characters copied
- * @throws IOException In case of an I/O problem
- */
- public static int copy(
- Reader input,
- Writer output)
- throws IOException {
- char[] buffer = new char[DEFAULT_BUFFER_SIZE];
- int count = 0;
- int n = 0;
- while (-1 != (n = input.read(buffer))) {
- output.write(buffer, 0, n);
- count += n;
- }
- return count;
- }
-
- // ----------------------------------------------------------------
- // InputStream -> Writer
- // ----------------------------------------------------------------
-
- /**
- * Copy and convert bytes from an <code>InputStream</code> to chars on a
- * <code>Writer</code>.
- * The platform's default encoding is used for the byte-to-char conversion.
- * @param input the <code>InputStream</code> to read from
- * @param output the <code>Writer</code> to write to
- * @throws IOException In case of an I/O problem
- */
- public static void copy(
- InputStream input,
- Writer output)
- throws IOException {
- InputStreamReader in = new InputStreamReader(input);
- copy(in, output);
- }
-
- /**
- * Copy and convert bytes from an <code>InputStream</code> to chars on a
- * <code>Writer</code>, using the specified encoding.
- * @param input the <code>InputStream</code> to read from
- * @param output the <code>Writer</code> to write to
- * @param encoding The name of a supported character encoding. See the
- * <a href="http://www.iana.org/assignments/character-sets">IANA
- * Charset Registry</a> for a list of valid encoding types.
- * @throws IOException In case of an I/O problem
- */
- public static void copy(
- InputStream input,
- Writer output,
- String encoding)
- throws IOException {
- InputStreamReader in = new InputStreamReader(input, encoding);
- copy(in, output);
- }
-
-
- // ----------------------------------------------------------------
- // Reader -> OutputStream
- // ----------------------------------------------------------------
-
- /**
- * Serialize chars from a <code>Reader</code> to bytes on an
- * <code>OutputStream</code>, and flush the <code>OutputStream</code>.
- * @param input the <code>Reader</code> to read from
- * @param output the <code>OutputStream</code> to write to
- * @throws IOException In case of an I/O problem
- */
- public static void copy(
- Reader input,
- OutputStream output)
- throws IOException {
- OutputStreamWriter out = new OutputStreamWriter(output);
- copy(input, out);
- // XXX Unless anyone is planning on rewriting OutputStreamWriter, we
- // have to flush here.
- out.flush();
- }
-
- // ----------------------------------------------------------------
- // String -> OutputStream
- // ----------------------------------------------------------------
-
- /**
- * Serialize chars from a <code>String</code> to bytes on an
- * <code>OutputStream</code>, and
- * flush the <code>OutputStream</code>.
- * @param input the <code>String</code> to read from
- * @param output the <code>OutputStream</code> to write to
- * @throws IOException In case of an I/O problem
- */
- public static void copy(
- String input,
- OutputStream output)
- throws IOException {
- StringReader in = new StringReader(input);
- OutputStreamWriter out = new OutputStreamWriter(output);
- copy(in, out);
- // XXX Unless anyone is planning on rewriting OutputStreamWriter, we
- // have to flush here.
- out.flush();
- }
-
- // ----------------------------------------------------------------
- // String -> Writer
- // ----------------------------------------------------------------
-
- /**
- * Copy chars from a <code>String</code> to a <code>Writer</code>.
- * @param input the <code>String</code> to read from
- * @param output the <code>Writer</code> to write to
- * @throws IOException In case of an I/O problem
- */
- public static void copy(String input, Writer output)
- throws IOException {
- output.write(input);
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/DirectoryWalker.java b/emailcommon/src/org/apache/commons/io/DirectoryWalker.java
deleted file mode 100644
index 9e564ae86..000000000
--- a/emailcommon/src/org/apache/commons/io/DirectoryWalker.java
+++ /dev/null
@@ -1,620 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
-import java.util.Collection;
-
-import org.apache.commons.io.filefilter.FileFilterUtils;
-import org.apache.commons.io.filefilter.IOFileFilter;
-import org.apache.commons.io.filefilter.TrueFileFilter;
-
-/**
- * Abstract class that walks through a directory hierarchy and provides
- * subclasses with convenient hooks to add specific behaviour.
- * <p>
- * This class operates with a {@link FileFilter} and maximum depth to
- * limit the files and direcories visited.
- * Commons IO supplies many common filter implementations in the
- * <a href="filefilter/package-summary.html"> filefilter</a> package.
- * <p>
- * The following sections describe:
- * <ul>
- * <li><a href="#example">1. Example Implementation</a> - example
- * <code>FileCleaner</code> implementation.</li>
- * <li><a href="#filter">2. Filter Example</a> - using
- * {@link FileFilter}(s) with <code>DirectoryWalker</code>.</li>
- * <li><a href="#cancel">3. Cancellation</a> - how to implement cancellation
- * behaviour.</li>
- * </ul>
- *
- * <a name="example"></a>
- * <h3>1. Example Implementation</h3>
- *
- * There are many possible extensions, for example, to delete all
- * files and '.svn' directories, and return a list of deleted files:
- * <pre>
- * public class FileCleaner extends DirectoryWalker {
- *
- * public FileCleaner() {
- * super();
- * }
- *
- * public List clean(File startDirectory) {
- * List results = new ArrayList();
- * walk(startDirectory, results);
- * return results;
- * }
- *
- * protected boolean handleDirectory(File directory, int depth, Collection results) {
- * // delete svn directories and then skip
- * if (".svn".equals(directory.getName())) {
- * directory.delete();
- * return false;
- * } else {
- * return true;
- * }
- *
- * }
- *
- * protected void handleFile(File file, int depth, Collection results) {
- * // delete file and add to list of deleted
- * file.delete();
- * results.add(file);
- * }
- * }
- * </pre>
- *
- * <a name="filter"></a>
- * <h3>2. Filter Example</h3>
- *
- * Choosing which directories and files to process can be a key aspect
- * of using this class. This information can be setup in three ways,
- * via three different constructors.
- * <p>
- * The first option is to visit all directories and files.
- * This is achieved via the no-args constructor.
- * <p>
- * The second constructor option is to supply a single {@link FileFilter}
- * that describes the files and directories to visit. Care must be taken
- * with this option as the same filter is used for both directories
- * and files.
- * <p>
- * For example, if you wanted all directories which are not hidden
- * and files which end in ".txt":
- * <pre>
- * public class FooDirectoryWalker extends DirectoryWalker {
- * public FooDirectoryWalker(FileFilter filter) {
- * super(filter, -1);
- * }
- * }
- *
- * // Build up the filters and create the walker
- * // Create a filter for Non-hidden directories
- * IOFileFilter fooDirFilter =
- * FileFilterUtils.andFileFilter(FileFilterUtils.directoryFileFilter,
- * HiddenFileFilter.VISIBLE);
- *
- * // Create a filter for Files ending in ".txt"
- * IOFileFilter fooFileFilter =
- * FileFilterUtils.andFileFilter(FileFilterUtils.fileFileFilter,
- * FileFilterUtils.suffixFileFilter(".txt"));
- *
- * // Combine the directory and file filters using an OR condition
- * java.io.FileFilter fooFilter =
- * FileFilterUtils.orFileFilter(fooDirFilter, fooFileFilter);
- *
- * // Use the filter to construct a DirectoryWalker implementation
- * FooDirectoryWalker walker = new FooDirectoryWalker(fooFilter);
- * </pre>
- * <p>
- * The third constructor option is to specify separate filters, one for
- * directories and one for files. These are combined internally to form
- * the correct <code>FileFilter</code>, something which is very easy to
- * get wrong when attempted manually, particularly when trying to
- * express constructs like 'any file in directories named docs'.
- * <p>
- * For example, if you wanted all directories which are not hidden
- * and files which end in ".txt":
- * <pre>
- * public class FooDirectoryWalker extends DirectoryWalker {
- * public FooDirectoryWalker(IOFileFilter dirFilter, IOFileFilter fileFilter) {
- * super(dirFilter, fileFilter, -1);
- * }
- * }
- *
- * // Use the filters to construct the walker
- * FooDirectoryWalker walker = new FooDirectoryWalker(
- * HiddenFileFilter.VISIBLE,
- * FileFilterUtils.suffixFileFilter(".txt"),
- * );
- * </pre>
- * This is much simpler than the previous example, and is why it is the preferred
- * option for filtering.
- *
- * <a name="cancel"></a>
- * <h3>3. Cancellation</h3>
- *
- * The DirectoryWalker contains some of the logic required for cancel processing.
- * Subclasses must complete the implementation.
- * <p>
- * What <code>DirectoryWalker</code> does provide for cancellation is:
- * <ul>
- * <li>{@link CancelException} which can be thrown in any of the
- * <i>lifecycle</i> methods to stop processing.</li>
- * <li>The <code>walk()</code> method traps thrown {@link CancelException}
- * and calls the <code>handleCancelled()</code> method, providing
- * a place for custom cancel processing.</li>
- * </ul>
- * <p>
- * Implementations need to provide:
- * <ul>
- * <li>The decision logic on whether to cancel processing or not.</li>
- * <li>Constructing and throwing a {@link CancelException}.</li>
- * <li>Custom cancel processing in the <code>handleCancelled()</code> method.
- * </ul>
- * <p>
- * Two possible scenarios are envisaged for cancellation:
- * <ul>
- * <li><a href="#external">3.1 External / Mult-threaded</a> - cancellation being
- * decided/initiated by an external process.</li>
- * <li><a href="#internal">3.2 Internal</a> - cancellation being decided/initiated
- * from within a DirectoryWalker implementation.</li>
- * </ul>
- * <p>
- * The following sections provide example implementations for these two different
- * scenarios.
- *
- * <a name="external"></a>
- * <h4>3.1 External / Multi-threaded</h4>
- *
- * This example provides a public <code>cancel()</code> method that can be
- * called by another thread to stop the processing. A typical example use-case
- * would be a cancel button on a GUI. Calling this method sets a
- * <a href="http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#36930">
- * volatile</a> flag to ensure it will work properly in a multi-threaded environment.
- * The flag is returned by the <code>handleIsCancelled()</code> method, which
- * will cause the walk to stop immediately. The <code>handleCancelled()</code>
- * method will be the next, and last, callback method received once cancellation
- * has occurred.
- *
- * <pre>
- * public class FooDirectoryWalker extends DirectoryWalker {
- *
- * private volatile boolean cancelled = false;
- *
- * public void cancel() {
- * cancelled = true;
- * }
- *
- * private void handleIsCancelled(File file, int depth, Collection results) {
- * return cancelled;
- * }
- *
- * protected void handleCancelled(File startDirectory, Collection results, CancelException cancel) {
- * // implement processing required when a cancellation occurs
- * }
- * }
- * </pre>
- *
- * <a name="internal"></a>
- * <h4>3.2 Internal</h4>
- *
- * This shows an example of how internal cancellation processing could be implemented.
- * <b>Note</b> the decision logic and throwing a {@link CancelException} could be implemented
- * in any of the <i>lifecycle</i> methods.
- *
- * <pre>
- * public class BarDirectoryWalker extends DirectoryWalker {
- *
- * protected boolean handleDirectory(File directory, int depth, Collection results) throws IOException {
- * // cancel if hidden directory
- * if (directory.isHidden()) {
- * throw new CancelException(file, depth);
- * }
- * return true;
- * }
- *
- * protected void handleFile(File file, int depth, Collection results) throws IOException {
- * // cancel if read-only file
- * if (!file.canWrite()) {
- * throw new CancelException(file, depth);
- * }
- * results.add(file);
- * }
- *
- * protected void handleCancelled(File startDirectory, Collection results, CancelException cancel) {
- * // implement processing required when a cancellation occurs
- * }
- * }
- * </pre>
- *
- * @since Commons IO 1.3
- * @version $Revision: 424748 $
- */
-public abstract class DirectoryWalker {
-
- /**
- * The file filter to use to filter files and directories.
- */
- private final FileFilter filter;
- /**
- * The limit on the directory depth to walk.
- */
- private final int depthLimit;
-
- /**
- * Construct an instance with no filtering and unlimited <i>depth</i>.
- */
- protected DirectoryWalker() {
- this(null, -1);
- }
-
- /**
- * Construct an instance with a filter and limit the <i>depth</i> navigated to.
- * <p>
- * The filter controls which files and directories will be navigated to as
- * part of the walk. The {@link FileFilterUtils} class is useful for combining
- * various filters together. A <code>null</code> filter means that no
- * filtering should occur and all files and directories will be visited.
- *
- * @param filter the filter to apply, null means visit all files
- * @param depthLimit controls how <i>deep</i> the hierarchy is
- * navigated to (less than 0 means unlimited)
- */
- protected DirectoryWalker(FileFilter filter, int depthLimit) {
- this.filter = filter;
- this.depthLimit = depthLimit;
- }
-
- /**
- * Construct an instance with a directory and a file filter and an optional
- * limit on the <i>depth</i> navigated to.
- * <p>
- * The filters control which files and directories will be navigated to as part
- * of the walk. This constructor uses {@link FileFilterUtils#makeDirectoryOnly(IOFileFilter)}
- * and {@link FileFilterUtils#makeFileOnly(IOFileFilter)} internally to combine the filters.
- * A <code>null</code> filter means that no filtering should occur.
- *
- * @param directoryFilter the filter to apply to directories, null means visit all directories
- * @param fileFilter the filter to apply to files, null means visit all files
- * @param depthLimit controls how <i>deep</i> the hierarchy is
- * navigated to (less than 0 means unlimited)
- */
- protected DirectoryWalker(IOFileFilter directoryFilter, IOFileFilter fileFilter, int depthLimit) {
- if (directoryFilter == null && fileFilter == null) {
- this.filter = null;
- } else {
- directoryFilter = (directoryFilter != null ? directoryFilter : TrueFileFilter.TRUE);
- fileFilter = (fileFilter != null ? fileFilter : TrueFileFilter.TRUE);
- directoryFilter = FileFilterUtils.makeDirectoryOnly(directoryFilter);
- fileFilter = FileFilterUtils.makeFileOnly(fileFilter);
- this.filter = FileFilterUtils.orFileFilter(directoryFilter, fileFilter);
- }
- this.depthLimit = depthLimit;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Internal method that walks the directory hierarchy in a depth-first manner.
- * <p>
- * Users of this class do not need to call this method. This method will
- * be called automatically by another (public) method on the specific subclass.
- * <p>
- * Writers of subclasses should call this method to start the directory walk.
- * Once called, this method will emit events as it walks the hierarchy.
- * The event methods have the prefix <code>handle</code>.
- *
- * @param startDirectory the directory to start from, not null
- * @param results the collection of result objects, may be updated
- * @throws NullPointerException if the start directory is null
- * @throws IOException if an I/O Error occurs
- */
- protected final void walk(File startDirectory, Collection results) throws IOException {
- if (startDirectory == null) {
- throw new NullPointerException("Start Directory is null");
- }
- try {
- handleStart(startDirectory, results);
- walk(startDirectory, 0, results);
- handleEnd(results);
- } catch(CancelException cancel) {
- handleCancelled(startDirectory, results, cancel);
- }
- }
-
- /**
- * Main recursive method to examine the directory hierarchy.
- *
- * @param directory the directory to examine, not null
- * @param depth the directory level (starting directory = 0)
- * @param results the collection of result objects, may be updated
- * @throws IOException if an I/O Error occurs
- */
- private void walk(File directory, int depth, Collection results) throws IOException {
- checkIfCancelled(directory, depth, results);
- if (handleDirectory(directory, depth, results)) {
- handleDirectoryStart(directory, depth, results);
- int childDepth = depth + 1;
- if (depthLimit < 0 || childDepth <= depthLimit) {
- checkIfCancelled(directory, depth, results);
- File[] childFiles = (filter == null ? directory.listFiles() : directory.listFiles(filter));
- if (childFiles == null) {
- handleRestricted(directory, childDepth, results);
- } else {
- for (int i = 0; i < childFiles.length; i++) {
- File childFile = childFiles[i];
- if (childFile.isDirectory()) {
- walk(childFile, childDepth, results);
- } else {
- checkIfCancelled(childFile, childDepth, results);
- handleFile(childFile, childDepth, results);
- checkIfCancelled(childFile, childDepth, results);
- }
- }
- }
- }
- handleDirectoryEnd(directory, depth, results);
- }
- checkIfCancelled(directory, depth, results);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Checks whether the walk has been cancelled by calling {@link #handleIsCancelled},
- * throwing a <code>CancelException</code> if it has.
- * <p>
- * Writers of subclasses should not normally call this method as it is called
- * automatically by the walk of the tree. However, sometimes a single method,
- * typically {@link #handleFile}, may take a long time to run. In that case,
- * you may wish to check for cancellation by calling this method.
- *
- * @param file the current file being processed
- * @param depth the current file level (starting directory = 0)
- * @param results the collection of result objects, may be updated
- * @throws IOException if an I/O Error occurs
- */
- protected final void checkIfCancelled(File file, int depth, Collection results) throws IOException {
- if (handleIsCancelled(file, depth, results)) {
- throw new CancelException(file, depth);
- }
- }
-
- /**
- * Overridable callback method invoked to determine if the entire walk
- * operation should be immediately cancelled.
- * <p>
- * This method should be implemented by those subclasses that want to
- * provide a public <code>cancel()</code> method available from another
- * thread. The design pattern for the subclass should be as follows:
- * <pre>
- * public class FooDirectoryWalker extends DirectoryWalker {
- * private volatile boolean cancelled = false;
- *
- * public void cancel() {
- * cancelled = true;
- * }
- * private void handleIsCancelled(File file, int depth, Collection results) {
- * return cancelled;
- * }
- * protected void handleCancelled(File startDirectory,
- * Collection results, CancelException cancel) {
- * // implement processing required when a cancellation occurs
- * }
- * }
- * </pre>
- * <p>
- * If this method returns true, then the directory walk is immediately
- * cancelled. The next callback method will be {@link #handleCancelled}.
- * <p>
- * This implementation returns false.
- *
- * @param file the file or directory being processed
- * @param depth the current directory level (starting directory = 0)
- * @param results the collection of result objects, may be updated
- * @return true if the walk has been cancelled
- * @throws IOException if an I/O Error occurs
- */
- protected boolean handleIsCancelled(
- File file, int depth, Collection results) throws IOException {
- // do nothing - overridable by subclass
- return false; // not cancelled
- }
-
- /**
- * Overridable callback method invoked when the operation is cancelled.
- * The file being processed when the cancellation occurred can be
- * obtained from the exception.
- * <p>
- * This implementation just re-throws the {@link CancelException}.
- *
- * @param startDirectory the directory that the walk started from
- * @param results the collection of result objects, may be updated
- * @param cancel the exception throw to cancel further processing
- * containing details at the point of cancellation.
- * @throws IOException if an I/O Error occurs
- */
- protected void handleCancelled(File startDirectory, Collection results,
- CancelException cancel) throws IOException {
- // re-throw exception - overridable by subclass
- throw cancel;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Overridable callback method invoked at the start of processing.
- * <p>
- * This implementation does nothing.
- *
- * @param startDirectory the directory to start from
- * @param results the collection of result objects, may be updated
- * @throws IOException if an I/O Error occurs
- */
- protected void handleStart(File startDirectory, Collection results) throws IOException {
- // do nothing - overridable by subclass
- }
-
- /**
- * Overridable callback method invoked to determine if a directory should be processed.
- * <p>
- * This method returns a boolean to indicate if the directory should be examined or not.
- * If you return false, the entire directory and any subdirectories will be skipped.
- * Note that this functionality is in addition to the filtering by file filter.
- * <p>
- * This implementation does nothing and returns true.
- *
- * @param directory the current directory being processed
- * @param depth the current directory level (starting directory = 0)
- * @param results the collection of result objects, may be updated
- * @return true to process this directory, false to skip this directory
- * @throws IOException if an I/O Error occurs
- */
- protected boolean handleDirectory(File directory, int depth, Collection results) throws IOException {
- // do nothing - overridable by subclass
- return true; // process directory
- }
-
- /**
- * Overridable callback method invoked at the start of processing each directory.
- * <p>
- * This implementation does nothing.
- *
- * @param directory the current directory being processed
- * @param depth the current directory level (starting directory = 0)
- * @param results the collection of result objects, may be updated
- * @throws IOException if an I/O Error occurs
- */
- protected void handleDirectoryStart(File directory, int depth, Collection results) throws IOException {
- // do nothing - overridable by subclass
- }
-
- /**
- * Overridable callback method invoked for each (non-directory) file.
- * <p>
- * This implementation does nothing.
- *
- * @param file the current file being processed
- * @param depth the current directory level (starting directory = 0)
- * @param results the collection of result objects, may be updated
- * @throws IOException if an I/O Error occurs
- */
- protected void handleFile(File file, int depth, Collection results) throws IOException {
- // do nothing - overridable by subclass
- }
-
- /**
- * Overridable callback method invoked for each restricted directory.
- * <p>
- * This implementation does nothing.
- *
- * @param directory the restricted directory
- * @param depth the current directory level (starting directory = 0)
- * @param results the collection of result objects, may be updated
- * @throws IOException if an I/O Error occurs
- */
- protected void handleRestricted(File directory, int depth, Collection results) throws IOException {
- // do nothing - overridable by subclass
- }
-
- /**
- * Overridable callback method invoked at the end of processing each directory.
- * <p>
- * This implementation does nothing.
- *
- * @param directory the directory being processed
- * @param depth the current directory level (starting directory = 0)
- * @param results the collection of result objects, may be updated
- * @throws IOException if an I/O Error occurs
- */
- protected void handleDirectoryEnd(File directory, int depth, Collection results) throws IOException {
- // do nothing - overridable by subclass
- }
-
- /**
- * Overridable callback method invoked at the end of processing.
- * <p>
- * This implementation does nothing.
- *
- * @param results the collection of result objects, may be updated
- * @throws IOException if an I/O Error occurs
- */
- protected void handleEnd(Collection results) throws IOException {
- // do nothing - overridable by subclass
- }
-
- //-----------------------------------------------------------------------
- /**
- * CancelException is thrown in DirectoryWalker to cancel the current
- * processing.
- */
- public static class CancelException extends IOException {
-
- /** Serialization id. */
- private static final long serialVersionUID = 1347339620135041008L;
-
- /** The file being processed when the exception was thrown. */
- private File file;
- /** The file depth when the exception was thrown. */
- private int depth = -1;
-
- /**
- * Constructs a <code>CancelException</code> with
- * the file and depth when cancellation occurred.
- *
- * @param file the file when the operation was cancelled, may be null
- * @param depth the depth when the operation was cancelled, may be null
- */
- public CancelException(File file, int depth) {
- this("Operation Cancelled", file, depth);
- }
-
- /**
- * Constructs a <code>CancelException</code> with
- * an appropriate message and the file and depth when
- * cancellation occurred.
- *
- * @param message the detail message
- * @param file the file when the operation was cancelled
- * @param depth the depth when the operation was cancelled
- */
- public CancelException(String message, File file, int depth) {
- super(message);
- this.file = file;
- this.depth = depth;
- }
-
- /**
- * Return the file when the operation was cancelled.
- *
- * @return the file when the operation was cancelled
- */
- public File getFile() {
- return file;
- }
-
- /**
- * Return the depth when the operation was cancelled.
- *
- * @return the depth when the operation was cancelled
- */
- public int getDepth() {
- return depth;
- }
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/EndianUtils.java b/emailcommon/src/org/apache/commons/io/EndianUtils.java
deleted file mode 100644
index 810feac04..000000000
--- a/emailcommon/src/org/apache/commons/io/EndianUtils.java
+++ /dev/null
@@ -1,489 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Utility code for dealing with different endian systems.
- * <p>
- * Different computer architectures adopt different conventions for
- * byte ordering. In so-called "Little Endian" architectures (eg Intel),
- * the low-order byte is stored in memory at the lowest address, and
- * subsequent bytes at higher addresses. For "Big Endian" architectures
- * (eg Motorola), the situation is reversed.
- * This class helps you solve this incompatability.
- * <p>
- * Origin of code: Excalibur
- *
- * @author <a href="mailto:peter@apache.org">Peter Donald</a>
- * @version $Id: EndianUtils.java 539632 2007-05-18 23:37:59Z bayard $
- * @see org.apache.commons.io.input.SwappedDataInputStream
- */
-public class EndianUtils {
-
- /**
- * Instances should NOT be constructed in standard programming.
- */
- public EndianUtils() {
- super();
- }
-
- // ========================================== Swapping routines
-
- /**
- * Converts a "short" value between endian systems.
- * @param value value to convert
- * @return the converted value
- */
- public static short swapShort(short value) {
- return (short) ( ( ( ( value >> 0 ) & 0xff ) << 8 ) +
- ( ( ( value >> 8 ) & 0xff ) << 0 ) );
- }
-
- /**
- * Converts a "int" value between endian systems.
- * @param value value to convert
- * @return the converted value
- */
- public static int swapInteger(int value) {
- return
- ( ( ( value >> 0 ) & 0xff ) << 24 ) +
- ( ( ( value >> 8 ) & 0xff ) << 16 ) +
- ( ( ( value >> 16 ) & 0xff ) << 8 ) +
- ( ( ( value >> 24 ) & 0xff ) << 0 );
- }
-
- /**
- * Converts a "long" value between endian systems.
- * @param value value to convert
- * @return the converted value
- */
- public static long swapLong(long value) {
- return
- ( ( ( value >> 0 ) & 0xff ) << 56 ) +
- ( ( ( value >> 8 ) & 0xff ) << 48 ) +
- ( ( ( value >> 16 ) & 0xff ) << 40 ) +
- ( ( ( value >> 24 ) & 0xff ) << 32 ) +
- ( ( ( value >> 32 ) & 0xff ) << 24 ) +
- ( ( ( value >> 40 ) & 0xff ) << 16 ) +
- ( ( ( value >> 48 ) & 0xff ) << 8 ) +
- ( ( ( value >> 56 ) & 0xff ) << 0 );
- }
-
- /**
- * Converts a "float" value between endian systems.
- * @param value value to convert
- * @return the converted value
- */
- public static float swapFloat(float value) {
- return Float.intBitsToFloat( swapInteger( Float.floatToIntBits( value ) ) );
- }
-
- /**
- * Converts a "double" value between endian systems.
- * @param value value to convert
- * @return the converted value
- */
- public static double swapDouble(double value) {
- return Double.longBitsToDouble( swapLong( Double.doubleToLongBits( value ) ) );
- }
-
- // ========================================== Swapping read/write routines
-
- /**
- * Writes a "short" value to a byte array at a given offset. The value is
- * converted to the opposed endian system while writing.
- * @param data target byte array
- * @param offset starting offset in the byte array
- * @param value value to write
- */
- public static void writeSwappedShort(byte[] data, int offset, short value) {
- data[ offset + 0 ] = (byte)( ( value >> 0 ) & 0xff );
- data[ offset + 1 ] = (byte)( ( value >> 8 ) & 0xff );
- }
-
- /**
- * Reads a "short" value from a byte array at a given offset. The value is
- * converted to the opposed endian system while reading.
- * @param data source byte array
- * @param offset starting offset in the byte array
- * @return the value read
- */
- public static short readSwappedShort(byte[] data, int offset) {
- return (short)( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
- ( ( data[ offset + 1 ] & 0xff ) << 8 ) );
- }
-
- /**
- * Reads an unsigned short (16-bit) value from a byte array at a given
- * offset. The value is converted to the opposed endian system while
- * reading.
- * @param data source byte array
- * @param offset starting offset in the byte array
- * @return the value read
- */
- public static int readSwappedUnsignedShort(byte[] data, int offset) {
- return ( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
- ( ( data[ offset + 1 ] & 0xff ) << 8 ) );
- }
-
- /**
- * Writes a "int" value to a byte array at a given offset. The value is
- * converted to the opposed endian system while writing.
- * @param data target byte array
- * @param offset starting offset in the byte array
- * @param value value to write
- */
- public static void writeSwappedInteger(byte[] data, int offset, int value) {
- data[ offset + 0 ] = (byte)( ( value >> 0 ) & 0xff );
- data[ offset + 1 ] = (byte)( ( value >> 8 ) & 0xff );
- data[ offset + 2 ] = (byte)( ( value >> 16 ) & 0xff );
- data[ offset + 3 ] = (byte)( ( value >> 24 ) & 0xff );
- }
-
- /**
- * Reads a "int" value from a byte array at a given offset. The value is
- * converted to the opposed endian system while reading.
- * @param data source byte array
- * @param offset starting offset in the byte array
- * @return the value read
- */
- public static int readSwappedInteger(byte[] data, int offset) {
- return ( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
- ( ( data[ offset + 1 ] & 0xff ) << 8 ) +
- ( ( data[ offset + 2 ] & 0xff ) << 16 ) +
- ( ( data[ offset + 3 ] & 0xff ) << 24 ) );
- }
-
- /**
- * Reads an unsigned integer (32-bit) value from a byte array at a given
- * offset. The value is converted to the opposed endian system while
- * reading.
- * @param data source byte array
- * @param offset starting offset in the byte array
- * @return the value read
- */
- public static long readSwappedUnsignedInteger(byte[] data, int offset) {
- long low = ( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
- ( ( data[ offset + 1 ] & 0xff ) << 8 ) +
- ( ( data[ offset + 2 ] & 0xff ) << 16 ) );
-
- long high = data[ offset + 3 ] & 0xff;
-
- return (high << 24) + (0xffffffffL & low);
- }
-
- /**
- * Writes a "long" value to a byte array at a given offset. The value is
- * converted to the opposed endian system while writing.
- * @param data target byte array
- * @param offset starting offset in the byte array
- * @param value value to write
- */
- public static void writeSwappedLong(byte[] data, int offset, long value) {
- data[ offset + 0 ] = (byte)( ( value >> 0 ) & 0xff );
- data[ offset + 1 ] = (byte)( ( value >> 8 ) & 0xff );
- data[ offset + 2 ] = (byte)( ( value >> 16 ) & 0xff );
- data[ offset + 3 ] = (byte)( ( value >> 24 ) & 0xff );
- data[ offset + 4 ] = (byte)( ( value >> 32 ) & 0xff );
- data[ offset + 5 ] = (byte)( ( value >> 40 ) & 0xff );
- data[ offset + 6 ] = (byte)( ( value >> 48 ) & 0xff );
- data[ offset + 7 ] = (byte)( ( value >> 56 ) & 0xff );
- }
-
- /**
- * Reads a "long" value from a byte array at a given offset. The value is
- * converted to the opposed endian system while reading.
- * @param data source byte array
- * @param offset starting offset in the byte array
- * @return the value read
- */
- public static long readSwappedLong(byte[] data, int offset) {
- long low =
- ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
- ( ( data[ offset + 1 ] & 0xff ) << 8 ) +
- ( ( data[ offset + 2 ] & 0xff ) << 16 ) +
- ( ( data[ offset + 3 ] & 0xff ) << 24 );
- long high =
- ( ( data[ offset + 4 ] & 0xff ) << 0 ) +
- ( ( data[ offset + 5 ] & 0xff ) << 8 ) +
- ( ( data[ offset + 6 ] & 0xff ) << 16 ) +
- ( ( data[ offset + 7 ] & 0xff ) << 24 );
- return (high << 32) + (0xffffffffL & low);
- }
-
- /**
- * Writes a "float" value to a byte array at a given offset. The value is
- * converted to the opposed endian system while writing.
- * @param data target byte array
- * @param offset starting offset in the byte array
- * @param value value to write
- */
- public static void writeSwappedFloat(byte[] data, int offset, float value) {
- writeSwappedInteger( data, offset, Float.floatToIntBits( value ) );
- }
-
- /**
- * Reads a "float" value from a byte array at a given offset. The value is
- * converted to the opposed endian system while reading.
- * @param data source byte array
- * @param offset starting offset in the byte array
- * @return the value read
- */
- public static float readSwappedFloat(byte[] data, int offset) {
- return Float.intBitsToFloat( readSwappedInteger( data, offset ) );
- }
-
- /**
- * Writes a "double" value to a byte array at a given offset. The value is
- * converted to the opposed endian system while writing.
- * @param data target byte array
- * @param offset starting offset in the byte array
- * @param value value to write
- */
- public static void writeSwappedDouble(byte[] data, int offset, double value) {
- writeSwappedLong( data, offset, Double.doubleToLongBits( value ) );
- }
-
- /**
- * Reads a "double" value from a byte array at a given offset. The value is
- * converted to the opposed endian system while reading.
- * @param data source byte array
- * @param offset starting offset in the byte array
- * @return the value read
- */
- public static double readSwappedDouble(byte[] data, int offset) {
- return Double.longBitsToDouble( readSwappedLong( data, offset ) );
- }
-
- /**
- * Writes a "short" value to an OutputStream. The value is
- * converted to the opposed endian system while writing.
- * @param output target OutputStream
- * @param value value to write
- * @throws IOException in case of an I/O problem
- */
- public static void writeSwappedShort(OutputStream output, short value)
- throws IOException
- {
- output.write( (byte)( ( value >> 0 ) & 0xff ) );
- output.write( (byte)( ( value >> 8 ) & 0xff ) );
- }
-
- /**
- * Reads a "short" value from an InputStream. The value is
- * converted to the opposed endian system while reading.
- * @param input source InputStream
- * @return the value just read
- * @throws IOException in case of an I/O problem
- */
- public static short readSwappedShort(InputStream input)
- throws IOException
- {
- return (short)( ( ( read( input ) & 0xff ) << 0 ) +
- ( ( read( input ) & 0xff ) << 8 ) );
- }
-
- /**
- * Reads a unsigned short (16-bit) from an InputStream. The value is
- * converted to the opposed endian system while reading.
- * @param input source InputStream
- * @return the value just read
- * @throws IOException in case of an I/O problem
- */
- public static int readSwappedUnsignedShort(InputStream input)
- throws IOException
- {
- int value1 = read( input );
- int value2 = read( input );
-
- return ( ( ( value1 & 0xff ) << 0 ) +
- ( ( value2 & 0xff ) << 8 ) );
- }
-
- /**
- * Writes a "int" value to an OutputStream. The value is
- * converted to the opposed endian system while writing.
- * @param output target OutputStream
- * @param value value to write
- * @throws IOException in case of an I/O problem
- */
- public static void writeSwappedInteger(OutputStream output, int value)
- throws IOException
- {
- output.write( (byte)( ( value >> 0 ) & 0xff ) );
- output.write( (byte)( ( value >> 8 ) & 0xff ) );
- output.write( (byte)( ( value >> 16 ) & 0xff ) );
- output.write( (byte)( ( value >> 24 ) & 0xff ) );
- }
-
- /**
- * Reads a "int" value from an InputStream. The value is
- * converted to the opposed endian system while reading.
- * @param input source InputStream
- * @return the value just read
- * @throws IOException in case of an I/O problem
- */
- public static int readSwappedInteger(InputStream input)
- throws IOException
- {
- int value1 = read( input );
- int value2 = read( input );
- int value3 = read( input );
- int value4 = read( input );
-
- return ( ( value1 & 0xff ) << 0 ) +
- ( ( value2 & 0xff ) << 8 ) +
- ( ( value3 & 0xff ) << 16 ) +
- ( ( value4 & 0xff ) << 24 );
- }
-
- /**
- * Reads a unsigned integer (32-bit) from an InputStream. The value is
- * converted to the opposed endian system while reading.
- * @param input source InputStream
- * @return the value just read
- * @throws IOException in case of an I/O problem
- */
- public static long readSwappedUnsignedInteger(InputStream input)
- throws IOException
- {
- int value1 = read( input );
- int value2 = read( input );
- int value3 = read( input );
- int value4 = read( input );
-
- long low = ( ( ( value1 & 0xff ) << 0 ) +
- ( ( value2 & 0xff ) << 8 ) +
- ( ( value3 & 0xff ) << 16 ) );
-
- long high = value4 & 0xff;
-
- return (high << 24) + (0xffffffffL & low);
- }
-
- /**
- * Writes a "long" value to an OutputStream. The value is
- * converted to the opposed endian system while writing.
- * @param output target OutputStream
- * @param value value to write
- * @throws IOException in case of an I/O problem
- */
- public static void writeSwappedLong(OutputStream output, long value)
- throws IOException
- {
- output.write( (byte)( ( value >> 0 ) & 0xff ) );
- output.write( (byte)( ( value >> 8 ) & 0xff ) );
- output.write( (byte)( ( value >> 16 ) & 0xff ) );
- output.write( (byte)( ( value >> 24 ) & 0xff ) );
- output.write( (byte)( ( value >> 32 ) & 0xff ) );
- output.write( (byte)( ( value >> 40 ) & 0xff ) );
- output.write( (byte)( ( value >> 48 ) & 0xff ) );
- output.write( (byte)( ( value >> 56 ) & 0xff ) );
- }
-
- /**
- * Reads a "long" value from an InputStream. The value is
- * converted to the opposed endian system while reading.
- * @param input source InputStream
- * @return the value just read
- * @throws IOException in case of an I/O problem
- */
- public static long readSwappedLong(InputStream input)
- throws IOException
- {
- byte[] bytes = new byte[8];
- for ( int i=0; i<8; i++ ) {
- bytes[i] = (byte) read( input );
- }
- return readSwappedLong( bytes, 0 );
- }
-
- /**
- * Writes a "float" value to an OutputStream. The value is
- * converted to the opposed endian system while writing.
- * @param output target OutputStream
- * @param value value to write
- * @throws IOException in case of an I/O problem
- */
- public static void writeSwappedFloat(OutputStream output, float value)
- throws IOException
- {
- writeSwappedInteger( output, Float.floatToIntBits( value ) );
- }
-
- /**
- * Reads a "float" value from an InputStream. The value is
- * converted to the opposed endian system while reading.
- * @param input source InputStream
- * @return the value just read
- * @throws IOException in case of an I/O problem
- */
- public static float readSwappedFloat(InputStream input)
- throws IOException
- {
- return Float.intBitsToFloat( readSwappedInteger( input ) );
- }
-
- /**
- * Writes a "double" value to an OutputStream. The value is
- * converted to the opposed endian system while writing.
- * @param output target OutputStream
- * @param value value to write
- * @throws IOException in case of an I/O problem
- */
- public static void writeSwappedDouble(OutputStream output, double value)
- throws IOException
- {
- writeSwappedLong( output, Double.doubleToLongBits( value ) );
- }
-
- /**
- * Reads a "double" value from an InputStream. The value is
- * converted to the opposed endian system while reading.
- * @param input source InputStream
- * @return the value just read
- * @throws IOException in case of an I/O problem
- */
- public static double readSwappedDouble(InputStream input)
- throws IOException
- {
- return Double.longBitsToDouble( readSwappedLong( input ) );
- }
-
- /**
- * Reads the next byte from the input stream.
- * @param input the stream
- * @return the byte
- * @throws IOException if the end of file is reached
- */
- private static int read(InputStream input)
- throws IOException
- {
- int value = input.read();
-
- if( -1 == value ) {
- throw new EOFException( "Unexpected EOF reached" );
- }
-
- return value;
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/FileCleaner.java b/emailcommon/src/org/apache/commons/io/FileCleaner.java
deleted file mode 100644
index 59c2f4109..000000000
--- a/emailcommon/src/org/apache/commons/io/FileCleaner.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io;
-
-import java.io.File;
-
-/**
- * Keeps track of files awaiting deletion, and deletes them when an associated
- * marker object is reclaimed by the garbage collector.
- * <p>
- * This utility creates a background thread to handle file deletion.
- * Each file to be deleted is registered with a handler object.
- * When the handler object is garbage collected, the file is deleted.
- * <p>
- * In an environment with multiple class loaders (a servlet container, for
- * example), you should consider stopping the background thread if it is no
- * longer needed. This is done by invoking the method
- * {@link #exitWhenFinished}, typically in
- * {@link javax.servlet.ServletContextListener#contextDestroyed} or similar.
- *
- * @author Noel Bergman
- * @author Martin Cooper
- * @version $Id: FileCleaner.java 553012 2007-07-03 23:01:07Z ggregory $
- * @deprecated Use {@link FileCleaningTracker}
- */
-public class FileCleaner {
- /**
- * The instance to use for the deprecated, static methods.
- */
- static final FileCleaningTracker theInstance = new FileCleaningTracker();
-
- //-----------------------------------------------------------------------
- /**
- * Track the specified file, using the provided marker, deleting the file
- * when the marker instance is garbage collected.
- * The {@link FileDeleteStrategy#NORMAL normal} deletion strategy will be used.
- *
- * @param file the file to be tracked, not null
- * @param marker the marker object used to track the file, not null
- * @throws NullPointerException if the file is null
- * @deprecated Use {@link FileCleaningTracker#track(File, Object)}.
- */
- public static void track(File file, Object marker) {
- theInstance.track(file, marker);
- }
-
- /**
- * Track the specified file, using the provided marker, deleting the file
- * when the marker instance is garbage collected.
- * The speified deletion strategy is used.
- *
- * @param file the file to be tracked, not null
- * @param marker the marker object used to track the file, not null
- * @param deleteStrategy the strategy to delete the file, null means normal
- * @throws NullPointerException if the file is null
- * @deprecated Use {@link FileCleaningTracker#track(File, Object, FileDeleteStrategy)}.
- */
- public static void track(File file, Object marker, FileDeleteStrategy deleteStrategy) {
- theInstance.track(file, marker, deleteStrategy);
- }
-
- /**
- * Track the specified file, using the provided marker, deleting the file
- * when the marker instance is garbage collected.
- * The {@link FileDeleteStrategy#NORMAL normal} deletion strategy will be used.
- *
- * @param path the full path to the file to be tracked, not null
- * @param marker the marker object used to track the file, not null
- * @throws NullPointerException if the path is null
- * @deprecated Use {@link FileCleaningTracker#track(String, Object)}.
- */
- public static void track(String path, Object marker) {
- theInstance.track(path, marker);
- }
-
- /**
- * Track the specified file, using the provided marker, deleting the file
- * when the marker instance is garbage collected.
- * The speified deletion strategy is used.
- *
- * @param path the full path to the file to be tracked, not null
- * @param marker the marker object used to track the file, not null
- * @param deleteStrategy the strategy to delete the file, null means normal
- * @throws NullPointerException if the path is null
- * @deprecated Use {@link FileCleaningTracker#track(String, Object, FileDeleteStrategy)}.
- */
- public static void track(String path, Object marker, FileDeleteStrategy deleteStrategy) {
- theInstance.track(path, marker, deleteStrategy);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Retrieve the number of files currently being tracked, and therefore
- * awaiting deletion.
- *
- * @return the number of files being tracked
- * @deprecated Use {@link FileCleaningTracker#getTrackCount()}.
- */
- public static int getTrackCount() {
- return theInstance.getTrackCount();
- }
-
- /**
- * Call this method to cause the file cleaner thread to terminate when
- * there are no more objects being tracked for deletion.
- * <p>
- * In a simple environment, you don't need this method as the file cleaner
- * thread will simply exit when the JVM exits. In a more complex environment,
- * with multiple class loaders (such as an application server), you should be
- * aware that the file cleaner thread will continue running even if the class
- * loader it was started from terminates. This can consitute a memory leak.
- * <p>
- * For example, suppose that you have developed a web application, which
- * contains the commons-io jar file in your WEB-INF/lib directory. In other
- * words, the FileCleaner class is loaded through the class loader of your
- * web application. If the web application is terminated, but the servlet
- * container is still running, then the file cleaner thread will still exist,
- * posing a memory leak.
- * <p>
- * This method allows the thread to be terminated. Simply call this method
- * in the resource cleanup code, such as {@link javax.servlet.ServletContextListener#contextDestroyed}.
- * One called, no new objects can be tracked by the file cleaner.
- * @deprecated Use {@link FileCleaningTracker#exitWhenFinished()}.
- */
- public static synchronized void exitWhenFinished() {
- theInstance.exitWhenFinished();
- }
-
- /**
- * Returns the singleton instance, which is used by the deprecated, static methods.
- * This is mainly useful for code, which wants to support the new
- * {@link FileCleaningTracker} class while maintain compatibility with the
- * deprecated {@link FileCleaner}.
- *
- * @return the singleton instance
- */
- public static FileCleaningTracker getInstance() {
- return theInstance;
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/FileCleaningTracker.java b/emailcommon/src/org/apache/commons/io/FileCleaningTracker.java
deleted file mode 100644
index 4074e6a76..000000000
--- a/emailcommon/src/org/apache/commons/io/FileCleaningTracker.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io;
-
-import java.io.File;
-import java.lang.ref.PhantomReference;
-import java.lang.ref.ReferenceQueue;
-import java.util.Collection;
-import java.util.Vector;
-
-/**
- * Keeps track of files awaiting deletion, and deletes them when an associated
- * marker object is reclaimed by the garbage collector.
- * <p>
- * This utility creates a background thread to handle file deletion.
- * Each file to be deleted is registered with a handler object.
- * When the handler object is garbage collected, the file is deleted.
- * <p>
- * In an environment with multiple class loaders (a servlet container, for
- * example), you should consider stopping the background thread if it is no
- * longer needed. This is done by invoking the method
- * {@link #exitWhenFinished}, typically in
- * {@link javax.servlet.ServletContextListener#contextDestroyed} or similar.
- *
- * @author Noel Bergman
- * @author Martin Cooper
- * @version $Id: FileCleaner.java 490987 2006-12-29 12:11:48Z scolebourne $
- */
-public class FileCleaningTracker {
- /**
- * Queue of <code>Tracker</code> instances being watched.
- */
- ReferenceQueue<Object> /* Tracker */ q = new ReferenceQueue<Object>();
- /**
- * Collection of <code>Tracker</code> instances in existence.
- */
- final Collection<Tracker> /* Tracker */ trackers = new Vector<Tracker>(); // synchronized
- /**
- * Whether to terminate the thread when the tracking is complete.
- */
- volatile boolean exitWhenFinished = false;
- /**
- * The thread that will clean up registered files.
- */
- Thread reaper;
-
- //-----------------------------------------------------------------------
- /**
- * Track the specified file, using the provided marker, deleting the file
- * when the marker instance is garbage collected.
- * The {@link FileDeleteStrategy#NORMAL normal} deletion strategy will be used.
- *
- * @param file the file to be tracked, not null
- * @param marker the marker object used to track the file, not null
- * @throws NullPointerException if the file is null
- */
- public void track(File file, Object marker) {
- track(file, marker, (FileDeleteStrategy) null);
- }
-
- /**
- * Track the specified file, using the provided marker, deleting the file
- * when the marker instance is garbage collected.
- * The speified deletion strategy is used.
- *
- * @param file the file to be tracked, not null
- * @param marker the marker object used to track the file, not null
- * @param deleteStrategy the strategy to delete the file, null means normal
- * @throws NullPointerException if the file is null
- */
- public void track(File file, Object marker, FileDeleteStrategy deleteStrategy) {
- if (file == null) {
- throw new NullPointerException("The file must not be null");
- }
- addTracker(file.getPath(), marker, deleteStrategy);
- }
-
- /**
- * Track the specified file, using the provided marker, deleting the file
- * when the marker instance is garbage collected.
- * The {@link FileDeleteStrategy#NORMAL normal} deletion strategy will be used.
- *
- * @param path the full path to the file to be tracked, not null
- * @param marker the marker object used to track the file, not null
- * @throws NullPointerException if the path is null
- */
- public void track(String path, Object marker) {
- track(path, marker, (FileDeleteStrategy) null);
- }
-
- /**
- * Track the specified file, using the provided marker, deleting the file
- * when the marker instance is garbage collected.
- * The speified deletion strategy is used.
- *
- * @param path the full path to the file to be tracked, not null
- * @param marker the marker object used to track the file, not null
- * @param deleteStrategy the strategy to delete the file, null means normal
- * @throws NullPointerException if the path is null
- */
- public void track(String path, Object marker, FileDeleteStrategy deleteStrategy) {
- if (path == null) {
- throw new NullPointerException("The path must not be null");
- }
- addTracker(path, marker, deleteStrategy);
- }
-
- /**
- * Adds a tracker to the list of trackers.
- *
- * @param path the full path to the file to be tracked, not null
- * @param marker the marker object used to track the file, not null
- * @param deleteStrategy the strategy to delete the file, null means normal
- */
- private synchronized void addTracker(String path, Object marker, FileDeleteStrategy deleteStrategy) {
- // synchronized block protects reaper
- if (exitWhenFinished) {
- throw new IllegalStateException("No new trackers can be added once exitWhenFinished() is called");
- }
- if (reaper == null) {
- reaper = new Reaper();
- reaper.start();
- }
- trackers.add(new Tracker(path, deleteStrategy, marker, q));
- }
-
- //-----------------------------------------------------------------------
- /**
- * Retrieve the number of files currently being tracked, and therefore
- * awaiting deletion.
- *
- * @return the number of files being tracked
- */
- public int getTrackCount() {
- return trackers.size();
- }
-
- /**
- * Call this method to cause the file cleaner thread to terminate when
- * there are no more objects being tracked for deletion.
- * <p>
- * In a simple environment, you don't need this method as the file cleaner
- * thread will simply exit when the JVM exits. In a more complex environment,
- * with multiple class loaders (such as an application server), you should be
- * aware that the file cleaner thread will continue running even if the class
- * loader it was started from terminates. This can consitute a memory leak.
- * <p>
- * For example, suppose that you have developed a web application, which
- * contains the commons-io jar file in your WEB-INF/lib directory. In other
- * words, the FileCleaner class is loaded through the class loader of your
- * web application. If the web application is terminated, but the servlet
- * container is still running, then the file cleaner thread will still exist,
- * posing a memory leak.
- * <p>
- * This method allows the thread to be terminated. Simply call this method
- * in the resource cleanup code, such as {@link javax.servlet.ServletContextListener#contextDestroyed}.
- * One called, no new objects can be tracked by the file cleaner.
- */
- public synchronized void exitWhenFinished() {
- // synchronized block protects reaper
- exitWhenFinished = true;
- if (reaper != null) {
- synchronized (reaper) {
- reaper.interrupt();
- }
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * The reaper thread.
- */
- private final class Reaper extends Thread {
- /** Construct a new Reaper */
- Reaper() {
- super("File Reaper");
- setPriority(Thread.MAX_PRIORITY);
- setDaemon(true);
- }
-
- /**
- * Run the reaper thread that will delete files as their associated
- * marker objects are reclaimed by the garbage collector.
- */
- @Override
- public void run() {
- // thread exits when exitWhenFinished is true and there are no more tracked objects
- while (exitWhenFinished == false || trackers.size() > 0) {
- Tracker tracker = null;
- try {
- // Wait for a tracker to remove.
- tracker = (Tracker) q.remove();
- } catch (Exception e) {
- continue;
- }
- if (tracker != null) {
- tracker.delete();
- tracker.clear();
- trackers.remove(tracker);
- }
- }
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Inner class which acts as the reference for a file pending deletion.
- */
- private static final class Tracker extends PhantomReference<Object> {
-
- /**
- * The full path to the file being tracked.
- */
- private final String path;
- /**
- * The strategy for deleting files.
- */
- private final FileDeleteStrategy deleteStrategy;
-
- /**
- * Constructs an instance of this class from the supplied parameters.
- *
- * @param path the full path to the file to be tracked, not null
- * @param deleteStrategy the strategy to delete the file, null means normal
- * @param marker the marker object used to track the file, not null
- * @param queue the queue on to which the tracker will be pushed, not null
- */
- Tracker(String path, FileDeleteStrategy deleteStrategy, Object marker, ReferenceQueue<Object> queue) {
- super(marker, queue);
- this.path = path;
- this.deleteStrategy = (deleteStrategy == null ? FileDeleteStrategy.NORMAL : deleteStrategy);
- }
-
- /**
- * Deletes the file associated with this tracker instance.
- *
- * @return <code>true</code> if the file was deleted successfully;
- * <code>false</code> otherwise.
- */
- public boolean delete() {
- return deleteStrategy.deleteQuietly(new File(path));
- }
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/FileDeleteStrategy.java b/emailcommon/src/org/apache/commons/io/FileDeleteStrategy.java
deleted file mode 100644
index 8b6b4b9aa..000000000
--- a/emailcommon/src/org/apache/commons/io/FileDeleteStrategy.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Strategy for deleting files.
- * <p>
- * There is more than one way to delete a file.
- * You may want to limit access to certain directories, to only delete
- * directories if they are empty, or maybe to force deletion.
- * <p>
- * This class captures the strategy to use and is designed for user subclassing.
- *
- * @author Stephen Colebourne
- * @version $Id: FileDeleteStrategy.java 453903 2006-10-07 13:47:06Z scolebourne $
- * @since Commons IO 1.3
- */
-public class FileDeleteStrategy {
-
- /**
- * The singleton instance for normal file deletion, which does not permit
- * the deletion of directories that are not empty.
- */
- public static final FileDeleteStrategy NORMAL = new FileDeleteStrategy("Normal");
- /**
- * The singleton instance for forced file deletion, which always deletes,
- * even if the file represents a non-empty directory.
- */
- public static final FileDeleteStrategy FORCE = new ForceFileDeleteStrategy();
-
- /** The name of the strategy. */
- private final String name;
-
- //-----------------------------------------------------------------------
- /**
- * Restricted constructor.
- *
- * @param name the name by which the strategy is known
- */
- protected FileDeleteStrategy(String name) {
- this.name = name;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Deletes the file object, which may be a file or a directory.
- * All <code>IOException</code>s are caught and false returned instead.
- * If the file does not exist or is null, true is returned.
- * <p>
- * Subclass writers should override {@link #doDelete(File)}, not this method.
- *
- * @param fileToDelete the file to delete, null returns true
- * @return true if the file was deleted, or there was no such file
- */
- public boolean deleteQuietly(File fileToDelete) {
- if (fileToDelete == null || fileToDelete.exists() == false) {
- return true;
- }
- try {
- return doDelete(fileToDelete);
- } catch (IOException ex) {
- return false;
- }
- }
-
- /**
- * Deletes the file object, which may be a file or a directory.
- * If the file does not exist, the method just returns.
- * <p>
- * Subclass writers should override {@link #doDelete(File)}, not this method.
- *
- * @param fileToDelete the file to delete, not null
- * @throws NullPointerException if the file is null
- * @throws IOException if an error occurs during file deletion
- */
- public void delete(File fileToDelete) throws IOException {
- if (fileToDelete.exists() && doDelete(fileToDelete) == false) {
- throw new IOException("Deletion failed: " + fileToDelete);
- }
- }
-
- /**
- * Actually deletes the file object, which may be a file or a directory.
- * <p>
- * This method is designed for subclasses to override.
- * The implementation may return either false or an <code>IOException</code>
- * when deletion fails. The {@link #delete(File)} and {@link #deleteQuietly(File)}
- * methods will handle either response appropriately.
- * A check has been made to ensure that the file will exist.
- * <p>
- * This implementation uses {@link File#delete()}.
- *
- * @param fileToDelete the file to delete, exists, not null
- * @return true if the file was deleteds
- * @throws NullPointerException if the file is null
- * @throws IOException if an error occurs during file deletion
- */
- protected boolean doDelete(File fileToDelete) throws IOException {
- return fileToDelete.delete();
- }
-
- //-----------------------------------------------------------------------
- /**
- * Gets a string describing the delete strategy.
- *
- * @return a string describing the delete strategy
- */
- public String toString() {
- return "FileDeleteStrategy[" + name + "]";
- }
-
- //-----------------------------------------------------------------------
- /**
- * Force file deletion strategy.
- */
- static class ForceFileDeleteStrategy extends FileDeleteStrategy {
- /** Default Constructor */
- ForceFileDeleteStrategy() {
- super("Force");
- }
-
- /**
- * Deletes the file object.
- * <p>
- * This implementation uses <code>FileUtils.forceDelete() <code>
- * if the file exists.
- *
- * @param fileToDelete the file to delete, not null
- * @return Always returns <code>true</code>
- * @throws NullPointerException if the file is null
- * @throws IOException if an error occurs during file deletion
- */
- protected boolean doDelete(File fileToDelete) throws IOException {
- FileUtils.forceDelete(fileToDelete);
- return true;
- }
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/FileSystemUtils.java b/emailcommon/src/org/apache/commons/io/FileSystemUtils.java
deleted file mode 100644
index 1765976c4..000000000
--- a/emailcommon/src/org/apache/commons/io/FileSystemUtils.java
+++ /dev/null
@@ -1,457 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.StringTokenizer;
-
-/**
- * General File System utilities.
- * <p>
- * This class provides static utility methods for general file system
- * functions not provided via the JDK {@link java.io.File File} class.
- * <p>
- * The current functions provided are:
- * <ul>
- * <li>Get the free space on a drive
- * </ul>
- *
- * @author Frank W. Zammetti
- * @author Stephen Colebourne
- * @author Thomas Ledoux
- * @author James Urie
- * @author Magnus Grimsell
- * @author Thomas Ledoux
- * @version $Id: FileSystemUtils.java 453889 2006-10-07 11:56:25Z scolebourne $
- * @since Commons IO 1.1
- */
-public class FileSystemUtils {
-
- /** Singleton instance, used mainly for testing. */
- private static final FileSystemUtils INSTANCE = new FileSystemUtils();
-
- /** Operating system state flag for error. */
- private static final int INIT_PROBLEM = -1;
- /** Operating system state flag for neither Unix nor Windows. */
- private static final int OTHER = 0;
- /** Operating system state flag for Windows. */
- private static final int WINDOWS = 1;
- /** Operating system state flag for Unix. */
- private static final int UNIX = 2;
- /** Operating system state flag for Posix flavour Unix. */
- private static final int POSIX_UNIX = 3;
-
- /** The operating system flag. */
- private static final int OS;
- static {
- int os = OTHER;
- try {
- String osName = System.getProperty("os.name");
- if (osName == null) {
- throw new IOException("os.name not found");
- }
- osName = osName.toLowerCase();
- // match
- if (osName.indexOf("windows") != -1) {
- os = WINDOWS;
- } else if (osName.indexOf("linux") != -1 ||
- osName.indexOf("sun os") != -1 ||
- osName.indexOf("sunos") != -1 ||
- osName.indexOf("solaris") != -1 ||
- osName.indexOf("mpe/ix") != -1 ||
- osName.indexOf("freebsd") != -1 ||
- osName.indexOf("irix") != -1 ||
- osName.indexOf("digital unix") != -1 ||
- osName.indexOf("unix") != -1 ||
- osName.indexOf("mac os x") != -1) {
- os = UNIX;
- } else if (osName.indexOf("hp-ux") != -1 ||
- osName.indexOf("aix") != -1) {
- os = POSIX_UNIX;
- } else {
- os = OTHER;
- }
-
- } catch (Exception ex) {
- os = INIT_PROBLEM;
- }
- OS = os;
- }
-
- /**
- * Instances should NOT be constructed in standard programming.
- */
- public FileSystemUtils() {
- super();
- }
-
- //-----------------------------------------------------------------------
- /**
- * Returns the free space on a drive or volume by invoking
- * the command line.
- * This method does not normalize the result, and typically returns
- * bytes on Windows, 512 byte units on OS X and kilobytes on Unix.
- * As this is not very useful, this method is deprecated in favour
- * of {@link #freeSpaceKb(String)} which returns a result in kilobytes.
- * <p>
- * Note that some OS's are NOT currently supported, including OS/390,
- * OpenVMS and and SunOS 5. (SunOS is supported by <code>freeSpaceKb</code>.)
- * <pre>
- * FileSystemUtils.freeSpace("C:"); // Windows
- * FileSystemUtils.freeSpace("/volume"); // *nix
- * </pre>
- * The free space is calculated via the command line.
- * It uses 'dir /-c' on Windows and 'df' on *nix.
- *
- * @param path the path to get free space for, not null, not empty on Unix
- * @return the amount of free drive space on the drive or volume
- * @throws IllegalArgumentException if the path is invalid
- * @throws IllegalStateException if an error occurred in initialisation
- * @throws IOException if an error occurs when finding the free space
- * @since Commons IO 1.1, enhanced OS support in 1.2 and 1.3
- * @deprecated Use freeSpaceKb(String)
- * Deprecated from 1.3, may be removed in 2.0
- */
- public static long freeSpace(String path) throws IOException {
- return INSTANCE.freeSpaceOS(path, OS, false);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Returns the free space on a drive or volume in kilobytes by invoking
- * the command line.
- * <pre>
- * FileSystemUtils.freeSpaceKb("C:"); // Windows
- * FileSystemUtils.freeSpaceKb("/volume"); // *nix
- * </pre>
- * The free space is calculated via the command line.
- * It uses 'dir /-c' on Windows, 'df -kP' on AIX/HP-UX and 'df -k' on other Unix.
- * <p>
- * In order to work, you must be running Windows, or have a implementation of
- * Unix df that supports GNU format when passed -k (or -kP). If you are going
- * to rely on this code, please check that it works on your OS by running
- * some simple tests to compare the command line with the output from this class.
- * If your operating system isn't supported, please raise a JIRA call detailing
- * the exact result from df -k and as much other detail as possible, thanks.
- *
- * @param path the path to get free space for, not null, not empty on Unix
- * @return the amount of free drive space on the drive or volume in kilobytes
- * @throws IllegalArgumentException if the path is invalid
- * @throws IllegalStateException if an error occurred in initialisation
- * @throws IOException if an error occurs when finding the free space
- * @since Commons IO 1.2, enhanced OS support in 1.3
- */
- public static long freeSpaceKb(String path) throws IOException {
- return INSTANCE.freeSpaceOS(path, OS, true);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Returns the free space on a drive or volume in a cross-platform manner.
- * Note that some OS's are NOT currently supported, including OS/390.
- * <pre>
- * FileSystemUtils.freeSpace("C:"); // Windows
- * FileSystemUtils.freeSpace("/volume"); // *nix
- * </pre>
- * The free space is calculated via the command line.
- * It uses 'dir /-c' on Windows and 'df' on *nix.
- *
- * @param path the path to get free space for, not null, not empty on Unix
- * @param os the operating system code
- * @param kb whether to normalize to kilobytes
- * @return the amount of free drive space on the drive or volume
- * @throws IllegalArgumentException if the path is invalid
- * @throws IllegalStateException if an error occurred in initialisation
- * @throws IOException if an error occurs when finding the free space
- */
- long freeSpaceOS(String path, int os, boolean kb) throws IOException {
- if (path == null) {
- throw new IllegalArgumentException("Path must not be empty");
- }
- switch (os) {
- case WINDOWS:
- return (kb ? freeSpaceWindows(path) / 1024 : freeSpaceWindows(path));
- case UNIX:
- return freeSpaceUnix(path, kb, false);
- case POSIX_UNIX:
- return freeSpaceUnix(path, kb, true);
- case OTHER:
- throw new IllegalStateException("Unsupported operating system");
- default:
- throw new IllegalStateException(
- "Exception caught when determining operating system");
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Find free space on the Windows platform using the 'dir' command.
- *
- * @param path the path to get free space for, including the colon
- * @return the amount of free drive space on the drive
- * @throws IOException if an error occurs
- */
- long freeSpaceWindows(String path) throws IOException {
- path = FilenameUtils.normalize(path);
- if (path.length() > 2 && path.charAt(1) == ':') {
- path = path.substring(0, 2); // seems to make it work
- }
-
- // build and run the 'dir' command
- String[] cmdAttribs = new String[] {"cmd.exe", "/C", "dir /-c " + path};
-
- // read in the output of the command to an ArrayList
- List<String> lines = performCommand(cmdAttribs, Integer.MAX_VALUE);
-
- // now iterate over the lines we just read and find the LAST
- // non-empty line (the free space bytes should be in the last element
- // of the ArrayList anyway, but this will ensure it works even if it's
- // not, still assuming it is on the last non-blank line)
- for (int i = lines.size() - 1; i >= 0; i--) {
- String line = lines.get(i);
- if (line.length() > 0) {
- return parseDir(line, path);
- }
- }
- // all lines are blank
- throw new IOException(
- "Command line 'dir /-c' did not return any info " +
- "for path '" + path + "'");
- }
-
- /**
- * Parses the Windows dir response last line
- *
- * @param line the line to parse
- * @param path the path that was sent
- * @return the number of bytes
- * @throws IOException if an error occurs
- */
- long parseDir(String line, String path) throws IOException {
- // read from the end of the line to find the last numeric
- // character on the line, then continue until we find the first
- // non-numeric character, and everything between that and the last
- // numeric character inclusive is our free space bytes count
- int bytesStart = 0;
- int bytesEnd = 0;
- int j = line.length() - 1;
- innerLoop1: while (j >= 0) {
- char c = line.charAt(j);
- if (Character.isDigit(c)) {
- // found the last numeric character, this is the end of
- // the free space bytes count
- bytesEnd = j + 1;
- break innerLoop1;
- }
- j--;
- }
- innerLoop2: while (j >= 0) {
- char c = line.charAt(j);
- if (!Character.isDigit(c) && c != ',' && c != '.') {
- // found the next non-numeric character, this is the
- // beginning of the free space bytes count
- bytesStart = j + 1;
- break innerLoop2;
- }
- j--;
- }
- if (j < 0) {
- throw new IOException(
- "Command line 'dir /-c' did not return valid info " +
- "for path '" + path + "'");
- }
-
- // remove commas and dots in the bytes count
- StringBuffer buf = new StringBuffer(line.substring(bytesStart, bytesEnd));
- for (int k = 0; k < buf.length(); k++) {
- if (buf.charAt(k) == ',' || buf.charAt(k) == '.') {
- buf.deleteCharAt(k--);
- }
- }
- return parseBytes(buf.toString(), path);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Find free space on the *nix platform using the 'df' command.
- *
- * @param path the path to get free space for
- * @param kb whether to normalize to kilobytes
- * @param posix whether to use the posix standard format flag
- * @return the amount of free drive space on the volume
- * @throws IOException if an error occurs
- */
- long freeSpaceUnix(String path, boolean kb, boolean posix) throws IOException {
- if (path.length() == 0) {
- throw new IllegalArgumentException("Path must not be empty");
- }
- path = FilenameUtils.normalize(path);
-
- // build and run the 'dir' command
- String flags = "-";
- if (kb) {
- flags += "k";
- }
- if (posix) {
- flags += "P";
- }
- String[] cmdAttribs =
- (flags.length() > 1 ? new String[] {"df", flags, path} : new String[] {"df", path});
-
- // perform the command, asking for up to 3 lines (header, interesting, overflow)
- List<String> lines = performCommand(cmdAttribs, 3);
- if (lines.size() < 2) {
- // unknown problem, throw exception
- throw new IOException(
- "Command line 'df' did not return info as expected " +
- "for path '" + path + "'- response was " + lines);
- }
- String line2 = lines.get(1); // the line we're interested in
-
- // Now, we tokenize the string. The fourth element is what we want.
- StringTokenizer tok = new StringTokenizer(line2, " ");
- if (tok.countTokens() < 4) {
- // could be long Filesystem, thus data on third line
- if (tok.countTokens() == 1 && lines.size() >= 3) {
- String line3 = lines.get(2); // the line may be interested in
- tok = new StringTokenizer(line3, " ");
- } else {
- throw new IOException(
- "Command line 'df' did not return data as expected " +
- "for path '" + path + "'- check path is valid");
- }
- } else {
- tok.nextToken(); // Ignore Filesystem
- }
- tok.nextToken(); // Ignore 1K-blocks
- tok.nextToken(); // Ignore Used
- String freeSpace = tok.nextToken();
- return parseBytes(freeSpace, path);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Parses the bytes from a string.
- *
- * @param freeSpace the free space string
- * @param path the path
- * @return the number of bytes
- * @throws IOException if an error occurs
- */
- long parseBytes(String freeSpace, String path) throws IOException {
- try {
- long bytes = Long.parseLong(freeSpace);
- if (bytes < 0) {
- throw new IOException(
- "Command line 'df' did not find free space in response " +
- "for path '" + path + "'- check path is valid");
- }
- return bytes;
-
- } catch (NumberFormatException ex) {
- throw new IOException(
- "Command line 'df' did not return numeric data as expected " +
- "for path '" + path + "'- check path is valid");
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Performs the os command.
- *
- * @param cmdAttribs the command line parameters
- * @param max The maximum limit for the lines returned
- * @return the parsed data
- * @throws IOException if an error occurs
- */
- List<String> performCommand(String[] cmdAttribs, int max) throws IOException {
- // this method does what it can to avoid the 'Too many open files' error
- // based on trial and error and these links:
- // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4784692
- // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4801027
- // http://forum.java.sun.com/thread.jspa?threadID=533029&messageID=2572018
- // however, its still not perfect as the JDK support is so poor
- // (see commond-exec or ant for a better multi-threaded multi-os solution)
-
- List<String> lines = new ArrayList<String>(20);
- Process proc = null;
- InputStream in = null;
- OutputStream out = null;
- InputStream err = null;
- BufferedReader inr = null;
- try {
- proc = openProcess(cmdAttribs);
- in = proc.getInputStream();
- out = proc.getOutputStream();
- err = proc.getErrorStream();
- inr = new BufferedReader(new InputStreamReader(in));
- String line = inr.readLine();
- while (line != null && lines.size() < max) {
- line = line.toLowerCase().trim();
- lines.add(line);
- line = inr.readLine();
- }
-
- proc.waitFor();
- if (proc.exitValue() != 0) {
- // os command problem, throw exception
- throw new IOException(
- "Command line returned OS error code '" + proc.exitValue() +
- "' for command " + Arrays.asList(cmdAttribs));
- }
- if (lines.size() == 0) {
- // unknown problem, throw exception
- throw new IOException(
- "Command line did not return any info " +
- "for command " + Arrays.asList(cmdAttribs));
- }
- return lines;
-
- } catch (InterruptedException ex) {
- throw new IOException(
- "Command line threw an InterruptedException '" + ex.getMessage() +
- "' for command " + Arrays.asList(cmdAttribs));
- } finally {
- IOUtils.closeQuietly(in);
- IOUtils.closeQuietly(out);
- IOUtils.closeQuietly(err);
- IOUtils.closeQuietly(inr);
- if (proc != null) {
- proc.destroy();
- }
- }
- }
-
- /**
- * Opens the process to the operating system.
- *
- * @param cmdAttribs the command line parameters
- * @return the process
- * @throws IOException if an error occurs
- */
- Process openProcess(String[] cmdAttribs) throws IOException {
- return Runtime.getRuntime().exec(cmdAttribs);
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/FileUtils.java b/emailcommon/src/org/apache/commons/io/FileUtils.java
deleted file mode 100644
index d5de771c7..000000000
--- a/emailcommon/src/org/apache/commons/io/FileUtils.java
+++ /dev/null
@@ -1,1890 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import java.util.zip.CRC32;
-import java.util.zip.CheckedInputStream;
-import java.util.zip.Checksum;
-
-import org.apache.commons.io.filefilter.DirectoryFileFilter;
-import org.apache.commons.io.filefilter.FalseFileFilter;
-import org.apache.commons.io.filefilter.FileFilterUtils;
-import org.apache.commons.io.filefilter.IOFileFilter;
-import org.apache.commons.io.filefilter.SuffixFileFilter;
-import org.apache.commons.io.filefilter.TrueFileFilter;
-import org.apache.commons.io.output.NullOutputStream;
-
-/**
- * General file manipulation utilities.
- * <p>
- * Facilities are provided in the following areas:
- * <ul>
- * <li>writing to a file
- * <li>reading from a file
- * <li>make a directory including parent directories
- * <li>copying files and directories
- * <li>deleting files and directories
- * <li>converting to and from a URL
- * <li>listing files and directories by filter and extension
- * <li>comparing file content
- * <li>file last changed date
- * <li>calculating a checksum
- * </ul>
- * <p>
- * Origin of code: Excalibur, Alexandria, Commons-Utils
- *
- * @author <a href="mailto:burton@relativity.yi.org">Kevin A. Burton</A>
- * @author <a href="mailto:sanders@apache.org">Scott Sanders</a>
- * @author <a href="mailto:dlr@finemaltcoding.com">Daniel Rall</a>
- * @author <a href="mailto:Christoph.Reck@dlr.de">Christoph.Reck</a>
- * @author <a href="mailto:peter@apache.org">Peter Donald</a>
- * @author <a href="mailto:jefft@apache.org">Jeff Turner</a>
- * @author Matthew Hawthorne
- * @author <a href="mailto:jeremias@apache.org">Jeremias Maerki</a>
- * @author Stephen Colebourne
- * @author Ian Springer
- * @author Chris Eldredge
- * @author Jim Harrington
- * @author Niall Pemberton
- * @author Sandy McArthur
- * @version $Id: FileUtils.java 610810 2008-01-10 15:04:49Z niallp $
- */
-public class FileUtils {
-
- /**
- * Instances should NOT be constructed in standard programming.
- */
- public FileUtils() {
- super();
- }
-
- /**
- * The number of bytes in a kilobyte.
- */
- public static final long ONE_KB = 1024;
-
- /**
- * The number of bytes in a megabyte.
- */
- public static final long ONE_MB = ONE_KB * ONE_KB;
-
- /**
- * The number of bytes in a gigabyte.
- */
- public static final long ONE_GB = ONE_KB * ONE_MB;
-
- /**
- * An empty array of type <code>File</code>.
- */
- public static final File[] EMPTY_FILE_ARRAY = new File[0];
-
- //-----------------------------------------------------------------------
- /**
- * Opens a {@link FileInputStream} for the specified file, providing better
- * error messages than simply calling <code>new FileInputStream(file)</code>.
- * <p>
- * At the end of the method either the stream will be successfully opened,
- * or an exception will have been thrown.
- * <p>
- * An exception is thrown if the file does not exist.
- * An exception is thrown if the file object exists but is a directory.
- * An exception is thrown if the file exists but cannot be read.
- *
- * @param file the file to open for input, must not be <code>null</code>
- * @return a new {@link FileInputStream} for the specified file
- * @throws FileNotFoundException if the file does not exist
- * @throws IOException if the file object is a directory
- * @throws IOException if the file cannot be read
- * @since Commons IO 1.3
- */
- public static FileInputStream openInputStream(File file) throws IOException {
- if (file.exists()) {
- if (file.isDirectory()) {
- throw new IOException("File '" + file + "' exists but is a directory");
- }
- if (file.canRead() == false) {
- throw new IOException("File '" + file + "' cannot be read");
- }
- } else {
- throw new FileNotFoundException("File '" + file + "' does not exist");
- }
- return new FileInputStream(file);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Opens a {@link FileOutputStream} for the specified file, checking and
- * creating the parent directory if it does not exist.
- * <p>
- * At the end of the method either the stream will be successfully opened,
- * or an exception will have been thrown.
- * <p>
- * The parent directory will be created if it does not exist.
- * The file will be created if it does not exist.
- * An exception is thrown if the file object exists but is a directory.
- * An exception is thrown if the file exists but cannot be written to.
- * An exception is thrown if the parent directory cannot be created.
- *
- * @param file the file to open for output, must not be <code>null</code>
- * @return a new {@link FileOutputStream} for the specified file
- * @throws IOException if the file object is a directory
- * @throws IOException if the file cannot be written to
- * @throws IOException if a parent directory needs creating but that fails
- * @since Commons IO 1.3
- */
- public static FileOutputStream openOutputStream(File file) throws IOException {
- if (file.exists()) {
- if (file.isDirectory()) {
- throw new IOException("File '" + file + "' exists but is a directory");
- }
- if (file.canWrite() == false) {
- throw new IOException("File '" + file + "' cannot be written to");
- }
- } else {
- File parent = file.getParentFile();
- if (parent != null && parent.exists() == false) {
- if (parent.mkdirs() == false) {
- throw new IOException("File '" + file + "' could not be created");
- }
- }
- }
- return new FileOutputStream(file);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Returns a human-readable version of the file size, where the input
- * represents a specific number of bytes.
- *
- * @param size the number of bytes
- * @return a human-readable display value (includes units)
- */
- public static String byteCountToDisplaySize(long size) {
- String displaySize;
-
- if (size / ONE_GB > 0) {
- displaySize = String.valueOf(size / ONE_GB) + " GB";
- } else if (size / ONE_MB > 0) {
- displaySize = String.valueOf(size / ONE_MB) + " MB";
- } else if (size / ONE_KB > 0) {
- displaySize = String.valueOf(size / ONE_KB) + " KB";
- } else {
- displaySize = String.valueOf(size) + " bytes";
- }
- return displaySize;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Implements the same behaviour as the "touch" utility on Unix. It creates
- * a new file with size 0 or, if the file exists already, it is opened and
- * closed without modifying it, but updating the file date and time.
- * <p>
- * NOTE: As from v1.3, this method throws an IOException if the last
- * modified date of the file cannot be set. Also, as from v1.3 this method
- * creates parent directories if they do not exist.
- *
- * @param file the File to touch
- * @throws IOException If an I/O problem occurs
- */
- public static void touch(File file) throws IOException {
- if (!file.exists()) {
- OutputStream out = openOutputStream(file);
- IOUtils.closeQuietly(out);
- }
- boolean success = file.setLastModified(System.currentTimeMillis());
- if (!success) {
- throw new IOException("Unable to set the last modification time for " + file);
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Converts a Collection containing java.io.File instanced into array
- * representation. This is to account for the difference between
- * File.listFiles() and FileUtils.listFiles().
- *
- * @param files a Collection containing java.io.File instances
- * @return an array of java.io.File
- */
- public static File[] convertFileCollectionToFileArray(Collection<File> files) {
- return files.toArray(new File[files.size()]);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Finds files within a given directory (and optionally its
- * subdirectories). All files found are filtered by an IOFileFilter.
- *
- * @param files the collection of files found.
- * @param directory the directory to search in.
- * @param filter the filter to apply to files and directories.
- */
- private static void innerListFiles(Collection<File> files, File directory,
- IOFileFilter filter) {
- File[] found = directory.listFiles((FileFilter) filter);
- if (found != null) {
- for (int i = 0; i < found.length; i++) {
- if (found[i].isDirectory()) {
- innerListFiles(files, found[i], filter);
- } else {
- files.add(found[i]);
- }
- }
- }
- }
-
- /**
- * Finds files within a given directory (and optionally its
- * subdirectories). All files found are filtered by an IOFileFilter.
- * <p>
- * If your search should recurse into subdirectories you can pass in
- * an IOFileFilter for directories. You don't need to bind a
- * DirectoryFileFilter (via logical AND) to this filter. This method does
- * that for you.
- * <p>
- * An example: If you want to search through all directories called
- * "temp" you pass in <code>FileFilterUtils.NameFileFilter("temp")</code>
- * <p>
- * Another common usage of this method is find files in a directory
- * tree but ignoring the directories generated CVS. You can simply pass
- * in <code>FileFilterUtils.makeCVSAware(null)</code>.
- *
- * @param directory the directory to search in
- * @param fileFilter filter to apply when finding files.
- * @param dirFilter optional filter to apply when finding subdirectories.
- * If this parameter is <code>null</code>, subdirectories will not be included in the
- * search. Use TrueFileFilter.INSTANCE to match all directories.
- * @return an collection of java.io.File with the matching files
- * @see org.apache.commons.io.filefilter.FileFilterUtils
- * @see org.apache.commons.io.filefilter.NameFileFilter
- */
- public static Collection<File> listFiles(
- File directory, IOFileFilter fileFilter, IOFileFilter dirFilter) {
- if (!directory.isDirectory()) {
- throw new IllegalArgumentException(
- "Parameter 'directory' is not a directory");
- }
- if (fileFilter == null) {
- throw new NullPointerException("Parameter 'fileFilter' is null");
- }
-
- //Setup effective file filter
- IOFileFilter effFileFilter = FileFilterUtils.andFileFilter(fileFilter,
- FileFilterUtils.notFileFilter(DirectoryFileFilter.INSTANCE));
-
- //Setup effective directory filter
- IOFileFilter effDirFilter;
- if (dirFilter == null) {
- effDirFilter = FalseFileFilter.INSTANCE;
- } else {
- effDirFilter = FileFilterUtils.andFileFilter(dirFilter,
- DirectoryFileFilter.INSTANCE);
- }
-
- //Find files
- Collection<File> files = new java.util.LinkedList<File>();
- innerListFiles(files, directory,
- FileFilterUtils.orFileFilter(effFileFilter, effDirFilter));
- return files;
- }
-
- /**
- * Allows iteration over the files in given directory (and optionally
- * its subdirectories).
- * <p>
- * All files found are filtered by an IOFileFilter. This method is
- * based on {@link #listFiles(File, IOFileFilter, IOFileFilter)}.
- *
- * @param directory the directory to search in
- * @param fileFilter filter to apply when finding files.
- * @param dirFilter optional filter to apply when finding subdirectories.
- * If this parameter is <code>null</code>, subdirectories will not be included in the
- * search. Use TrueFileFilter.INSTANCE to match all directories.
- * @return an iterator of java.io.File for the matching files
- * @see org.apache.commons.io.filefilter.FileFilterUtils
- * @see org.apache.commons.io.filefilter.NameFileFilter
- * @since Commons IO 1.2
- */
- public static Iterator<File> iterateFiles(
- File directory, IOFileFilter fileFilter, IOFileFilter dirFilter) {
- return listFiles(directory, fileFilter, dirFilter).iterator();
- }
-
- //-----------------------------------------------------------------------
- /**
- * Converts an array of file extensions to suffixes for use
- * with IOFileFilters.
- *
- * @param extensions an array of extensions. Format: {"java", "xml"}
- * @return an array of suffixes. Format: {".java", ".xml"}
- */
- private static String[] toSuffixes(String[] extensions) {
- String[] suffixes = new String[extensions.length];
- for (int i = 0; i < extensions.length; i++) {
- suffixes[i] = "." + extensions[i];
- }
- return suffixes;
- }
-
-
- /**
- * Finds files within a given directory (and optionally its subdirectories)
- * which match an array of extensions.
- *
- * @param directory the directory to search in
- * @param extensions an array of extensions, ex. {"java","xml"}. If this
- * parameter is <code>null</code>, all files are returned.
- * @param recursive if true all subdirectories are searched as well
- * @return an collection of java.io.File with the matching files
- */
- public static Collection<File> listFiles(
- File directory, String[] extensions, boolean recursive) {
- IOFileFilter filter;
- if (extensions == null) {
- filter = TrueFileFilter.INSTANCE;
- } else {
- String[] suffixes = toSuffixes(extensions);
- filter = new SuffixFileFilter(suffixes);
- }
- return listFiles(directory, filter,
- (recursive ? TrueFileFilter.INSTANCE : FalseFileFilter.INSTANCE));
- }
-
- /**
- * Allows iteration over the files in a given directory (and optionally
- * its subdirectories) which match an array of extensions. This method
- * is based on {@link #listFiles(File, String[], boolean)}.
- *
- * @param directory the directory to search in
- * @param extensions an array of extensions, ex. {"java","xml"}. If this
- * parameter is <code>null</code>, all files are returned.
- * @param recursive if true all subdirectories are searched as well
- * @return an iterator of java.io.File with the matching files
- * @since Commons IO 1.2
- */
- public static Iterator<File> iterateFiles(
- File directory, String[] extensions, boolean recursive) {
- return listFiles(directory, extensions, recursive).iterator();
- }
-
- //-----------------------------------------------------------------------
- /**
- * Compares the contents of two files to determine if they are equal or not.
- * <p>
- * This method checks to see if the two files are different lengths
- * or if they point to the same file, before resorting to byte-by-byte
- * comparison of the contents.
- * <p>
- * Code origin: Avalon
- *
- * @param file1 the first file
- * @param file2 the second file
- * @return true if the content of the files are equal or they both don't
- * exist, false otherwise
- * @throws IOException in case of an I/O error
- */
- public static boolean contentEquals(File file1, File file2) throws IOException {
- boolean file1Exists = file1.exists();
- if (file1Exists != file2.exists()) {
- return false;
- }
-
- if (!file1Exists) {
- // two not existing files are equal
- return true;
- }
-
- if (file1.isDirectory() || file2.isDirectory()) {
- // don't want to compare directory contents
- throw new IOException("Can't compare directories, only files");
- }
-
- if (file1.length() != file2.length()) {
- // lengths differ, cannot be equal
- return false;
- }
-
- if (file1.getCanonicalFile().equals(file2.getCanonicalFile())) {
- // same file
- return true;
- }
-
- InputStream input1 = null;
- InputStream input2 = null;
- try {
- input1 = new FileInputStream(file1);
- input2 = new FileInputStream(file2);
- return IOUtils.contentEquals(input1, input2);
-
- } finally {
- IOUtils.closeQuietly(input1);
- IOUtils.closeQuietly(input2);
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Convert from a <code>URL</code> to a <code>File</code>.
- * <p>
- * From version 1.1 this method will decode the URL.
- * Syntax such as <code>file:///my%20docs/file.txt</code> will be
- * correctly decoded to <code>/my docs/file.txt</code>.
- *
- * @param url the file URL to convert, <code>null</code> returns <code>null</code>
- * @return the equivalent <code>File</code> object, or <code>null</code>
- * if the URL's protocol is not <code>file</code>
- * @throws IllegalArgumentException if the file is incorrectly encoded
- */
- public static File toFile(URL url) {
- if (url == null || !url.getProtocol().equals("file")) {
- return null;
- } else {
- String filename = url.getFile().replace('/', File.separatorChar);
- int pos =0;
- while ((pos = filename.indexOf('%', pos)) >= 0) {
- if (pos + 2 < filename.length()) {
- String hexStr = filename.substring(pos + 1, pos + 3);
- char ch = (char) Integer.parseInt(hexStr, 16);
- filename = filename.substring(0, pos) + ch + filename.substring(pos + 3);
- }
- }
- return new File(filename);
- }
- }
-
- /**
- * Converts each of an array of <code>URL</code> to a <code>File</code>.
- * <p>
- * Returns an array of the same size as the input.
- * If the input is <code>null</code>, an empty array is returned.
- * If the input contains <code>null</code>, the output array contains <code>null</code> at the same
- * index.
- * <p>
- * This method will decode the URL.
- * Syntax such as <code>file:///my%20docs/file.txt</code> will be
- * correctly decoded to <code>/my docs/file.txt</code>.
- *
- * @param urls the file URLs to convert, <code>null</code> returns empty array
- * @return a non-<code>null</code> array of Files matching the input, with a <code>null</code> item
- * if there was a <code>null</code> at that index in the input array
- * @throws IllegalArgumentException if any file is not a URL file
- * @throws IllegalArgumentException if any file is incorrectly encoded
- * @since Commons IO 1.1
- */
- public static File[] toFiles(URL[] urls) {
- if (urls == null || urls.length == 0) {
- return EMPTY_FILE_ARRAY;
- }
- File[] files = new File[urls.length];
- for (int i = 0; i < urls.length; i++) {
- URL url = urls[i];
- if (url != null) {
- if (url.getProtocol().equals("file") == false) {
- throw new IllegalArgumentException(
- "URL could not be converted to a File: " + url);
- }
- files[i] = toFile(url);
- }
- }
- return files;
- }
-
- /**
- * Converts each of an array of <code>File</code> to a <code>URL</code>.
- * <p>
- * Returns an array of the same size as the input.
- *
- * @param files the files to convert
- * @return an array of URLs matching the input
- * @throws IOException if a file cannot be converted
- */
- public static URL[] toURLs(File[] files) throws IOException {
- URL[] urls = new URL[files.length];
-
- for (int i = 0; i < urls.length; i++) {
- urls[i] = files[i].toURI().toURL();
- }
-
- return urls;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Copies a file to a directory preserving the file date.
- * <p>
- * This method copies the contents of the specified source file
- * to a file of the same name in the specified destination directory.
- * The destination directory is created if it does not exist.
- * If the destination file exists, then this method will overwrite it.
- *
- * @param srcFile an existing file to copy, must not be <code>null</code>
- * @param destDir the directory to place the copy in, must not be <code>null</code>
- *
- * @throws NullPointerException if source or destination is null
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs during copying
- * @see #copyFile(File, File, boolean)
- */
- public static void copyFileToDirectory(File srcFile, File destDir) throws IOException {
- copyFileToDirectory(srcFile, destDir, true);
- }
-
- /**
- * Copies a file to a directory optionally preserving the file date.
- * <p>
- * This method copies the contents of the specified source file
- * to a file of the same name in the specified destination directory.
- * The destination directory is created if it does not exist.
- * If the destination file exists, then this method will overwrite it.
- *
- * @param srcFile an existing file to copy, must not be <code>null</code>
- * @param destDir the directory to place the copy in, must not be <code>null</code>
- * @param preserveFileDate true if the file date of the copy
- * should be the same as the original
- *
- * @throws NullPointerException if source or destination is <code>null</code>
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs during copying
- * @see #copyFile(File, File, boolean)
- * @since Commons IO 1.3
- */
- public static void copyFileToDirectory(File srcFile, File destDir, boolean preserveFileDate) throws IOException {
- if (destDir == null) {
- throw new NullPointerException("Destination must not be null");
- }
- if (destDir.exists() && destDir.isDirectory() == false) {
- throw new IllegalArgumentException("Destination '" + destDir + "' is not a directory");
- }
- copyFile(srcFile, new File(destDir, srcFile.getName()), preserveFileDate);
- }
-
- /**
- * Copies a file to a new location preserving the file date.
- * <p>
- * This method copies the contents of the specified source file to the
- * specified destination file. The directory holding the destination file is
- * created if it does not exist. If the destination file exists, then this
- * method will overwrite it.
- *
- * @param srcFile an existing file to copy, must not be <code>null</code>
- * @param destFile the new file, must not be <code>null</code>
- *
- * @throws NullPointerException if source or destination is <code>null</code>
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs during copying
- * @see #copyFileToDirectory(File, File)
- */
- public static void copyFile(File srcFile, File destFile) throws IOException {
- copyFile(srcFile, destFile, true);
- }
-
- /**
- * Copies a file to a new location.
- * <p>
- * This method copies the contents of the specified source file
- * to the specified destination file.
- * The directory holding the destination file is created if it does not exist.
- * If the destination file exists, then this method will overwrite it.
- *
- * @param srcFile an existing file to copy, must not be <code>null</code>
- * @param destFile the new file, must not be <code>null</code>
- * @param preserveFileDate true if the file date of the copy
- * should be the same as the original
- *
- * @throws NullPointerException if source or destination is <code>null</code>
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs during copying
- * @see #copyFileToDirectory(File, File, boolean)
- */
- public static void copyFile(File srcFile, File destFile,
- boolean preserveFileDate) throws IOException {
- if (srcFile == null) {
- throw new NullPointerException("Source must not be null");
- }
- if (destFile == null) {
- throw new NullPointerException("Destination must not be null");
- }
- if (srcFile.exists() == false) {
- throw new FileNotFoundException("Source '" + srcFile + "' does not exist");
- }
- if (srcFile.isDirectory()) {
- throw new IOException("Source '" + srcFile + "' exists but is a directory");
- }
- if (srcFile.getCanonicalPath().equals(destFile.getCanonicalPath())) {
- throw new IOException("Source '" + srcFile + "' and destination '" + destFile + "' are the same");
- }
- if (destFile.getParentFile() != null && destFile.getParentFile().exists() == false) {
- if (destFile.getParentFile().mkdirs() == false) {
- throw new IOException("Destination '" + destFile + "' directory cannot be created");
- }
- }
- if (destFile.exists() && destFile.canWrite() == false) {
- throw new IOException("Destination '" + destFile + "' exists but is read-only");
- }
- doCopyFile(srcFile, destFile, preserveFileDate);
- }
-
- /**
- * Internal copy file method.
- *
- * @param srcFile the validated source file, must not be <code>null</code>
- * @param destFile the validated destination file, must not be <code>null</code>
- * @param preserveFileDate whether to preserve the file date
- * @throws IOException if an error occurs
- */
- private static void doCopyFile(File srcFile, File destFile, boolean preserveFileDate) throws IOException {
- if (destFile.exists() && destFile.isDirectory()) {
- throw new IOException("Destination '" + destFile + "' exists but is a directory");
- }
-
- FileInputStream input = new FileInputStream(srcFile);
- try {
- FileOutputStream output = new FileOutputStream(destFile);
- try {
- IOUtils.copy(input, output);
- } finally {
- IOUtils.closeQuietly(output);
- }
- } finally {
- IOUtils.closeQuietly(input);
- }
-
- if (srcFile.length() != destFile.length()) {
- throw new IOException("Failed to copy full contents from '" +
- srcFile + "' to '" + destFile + "'");
- }
- if (preserveFileDate) {
- destFile.setLastModified(srcFile.lastModified());
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Copies a directory to within another directory preserving the file dates.
- * <p>
- * This method copies the source directory and all its contents to a
- * directory of the same name in the specified destination directory.
- * <p>
- * The destination directory is created if it does not exist.
- * If the destination directory did exist, then this method merges
- * the source with the destination, with the source taking precedence.
- *
- * @param srcDir an existing directory to copy, must not be <code>null</code>
- * @param destDir the directory to place the copy in, must not be <code>null</code>
- *
- * @throws NullPointerException if source or destination is <code>null</code>
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs during copying
- * @since Commons IO 1.2
- */
- public static void copyDirectoryToDirectory(File srcDir, File destDir) throws IOException {
- if (srcDir == null) {
- throw new NullPointerException("Source must not be null");
- }
- if (srcDir.exists() && srcDir.isDirectory() == false) {
- throw new IllegalArgumentException("Source '" + destDir + "' is not a directory");
- }
- if (destDir == null) {
- throw new NullPointerException("Destination must not be null");
- }
- if (destDir.exists() && destDir.isDirectory() == false) {
- throw new IllegalArgumentException("Destination '" + destDir + "' is not a directory");
- }
- copyDirectory(srcDir, new File(destDir, srcDir.getName()), true);
- }
-
- /**
- * Copies a whole directory to a new location preserving the file dates.
- * <p>
- * This method copies the specified directory and all its child
- * directories and files to the specified destination.
- * The destination is the new location and name of the directory.
- * <p>
- * The destination directory is created if it does not exist.
- * If the destination directory did exist, then this method merges
- * the source with the destination, with the source taking precedence.
- *
- * @param srcDir an existing directory to copy, must not be <code>null</code>
- * @param destDir the new directory, must not be <code>null</code>
- *
- * @throws NullPointerException if source or destination is <code>null</code>
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs during copying
- * @since Commons IO 1.1
- */
- public static void copyDirectory(File srcDir, File destDir) throws IOException {
- copyDirectory(srcDir, destDir, true);
- }
-
- /**
- * Copies a whole directory to a new location.
- * <p>
- * This method copies the contents of the specified source directory
- * to within the specified destination directory.
- * <p>
- * The destination directory is created if it does not exist.
- * If the destination directory did exist, then this method merges
- * the source with the destination, with the source taking precedence.
- *
- * @param srcDir an existing directory to copy, must not be <code>null</code>
- * @param destDir the new directory, must not be <code>null</code>
- * @param preserveFileDate true if the file date of the copy
- * should be the same as the original
- *
- * @throws NullPointerException if source or destination is <code>null</code>
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs during copying
- * @since Commons IO 1.1
- */
- public static void copyDirectory(File srcDir, File destDir,
- boolean preserveFileDate) throws IOException {
- copyDirectory(srcDir, destDir, null, preserveFileDate);
- }
-
- /**
- * Copies a filtered directory to a new location preserving the file dates.
- * <p>
- * This method copies the contents of the specified source directory
- * to within the specified destination directory.
- * <p>
- * The destination directory is created if it does not exist.
- * If the destination directory did exist, then this method merges
- * the source with the destination, with the source taking precedence.
- *
- * <h4>Example: Copy directories only</h4>
- * <pre>
- * // only copy the directory structure
- * FileUtils.copyDirectory(srcDir, destDir, DirectoryFileFilter.DIRECTORY);
- * </pre>
- *
- * <h4>Example: Copy directories and txt files</h4>
- * <pre>
- * // Create a filter for ".txt" files
- * IOFileFilter txtSuffixFilter = FileFilterUtils.suffixFileFilter(".txt");
- * IOFileFilter txtFiles = FileFilterUtils.andFileFilter(FileFileFilter.FILE, txtSuffixFilter);
- *
- * // Create a filter for either directories or ".txt" files
- * FileFilter filter = FileFilterUtils.orFileFilter(DirectoryFileFilter.DIRECTORY, txtFiles);
- *
- * // Copy using the filter
- * FileUtils.copyDirectory(srcDir, destDir, filter);
- * </pre>
- *
- * @param srcDir an existing directory to copy, must not be <code>null</code>
- * @param destDir the new directory, must not be <code>null</code>
- * @param filter the filter to apply, null means copy all directories and files
- * should be the same as the original
- *
- * @throws NullPointerException if source or destination is <code>null</code>
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs during copying
- * @since Commons IO 1.4
- */
- public static void copyDirectory(File srcDir, File destDir,
- FileFilter filter) throws IOException {
- copyDirectory(srcDir, destDir, filter, true);
- }
-
- /**
- * Copies a filtered directory to a new location.
- * <p>
- * This method copies the contents of the specified source directory
- * to within the specified destination directory.
- * <p>
- * The destination directory is created if it does not exist.
- * If the destination directory did exist, then this method merges
- * the source with the destination, with the source taking precedence.
- *
- * <h4>Example: Copy directories only</h4>
- * <pre>
- * // only copy the directory structure
- * FileUtils.copyDirectory(srcDir, destDir, DirectoryFileFilter.DIRECTORY, false);
- * </pre>
- *
- * <h4>Example: Copy directories and txt files</h4>
- * <pre>
- * // Create a filter for ".txt" files
- * IOFileFilter txtSuffixFilter = FileFilterUtils.suffixFileFilter(".txt");
- * IOFileFilter txtFiles = FileFilterUtils.andFileFilter(FileFileFilter.FILE, txtSuffixFilter);
- *
- * // Create a filter for either directories or ".txt" files
- * FileFilter filter = FileFilterUtils.orFileFilter(DirectoryFileFilter.DIRECTORY, txtFiles);
- *
- * // Copy using the filter
- * FileUtils.copyDirectory(srcDir, destDir, filter, false);
- * </pre>
- *
- * @param srcDir an existing directory to copy, must not be <code>null</code>
- * @param destDir the new directory, must not be <code>null</code>
- * @param filter the filter to apply, null means copy all directories and files
- * @param preserveFileDate true if the file date of the copy
- * should be the same as the original
- *
- * @throws NullPointerException if source or destination is <code>null</code>
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs during copying
- * @since Commons IO 1.4
- */
- public static void copyDirectory(File srcDir, File destDir,
- FileFilter filter, boolean preserveFileDate) throws IOException {
- if (srcDir == null) {
- throw new NullPointerException("Source must not be null");
- }
- if (destDir == null) {
- throw new NullPointerException("Destination must not be null");
- }
- if (srcDir.exists() == false) {
- throw new FileNotFoundException("Source '" + srcDir + "' does not exist");
- }
- if (srcDir.isDirectory() == false) {
- throw new IOException("Source '" + srcDir + "' exists but is not a directory");
- }
- if (srcDir.getCanonicalPath().equals(destDir.getCanonicalPath())) {
- throw new IOException("Source '" + srcDir + "' and destination '" + destDir + "' are the same");
- }
-
- // Cater for destination being directory within the source directory (see IO-141)
- List<String> exclusionList = null;
- if (destDir.getCanonicalPath().startsWith(srcDir.getCanonicalPath())) {
- File[] srcFiles = filter == null ? srcDir.listFiles() : srcDir.listFiles(filter);
- if (srcFiles != null && srcFiles.length > 0) {
- exclusionList = new ArrayList<String>(srcFiles.length);
- for (int i = 0; i < srcFiles.length; i++) {
- File copiedFile = new File(destDir, srcFiles[i].getName());
- exclusionList.add(copiedFile.getCanonicalPath());
- }
- }
- }
- doCopyDirectory(srcDir, destDir, filter, preserveFileDate, exclusionList);
- }
-
- /**
- * Internal copy directory method.
- *
- * @param srcDir the validated source directory, must not be <code>null</code>
- * @param destDir the validated destination directory, must not be <code>null</code>
- * @param filter the filter to apply, null means copy all directories and files
- * @param preserveFileDate whether to preserve the file date
- * @param exclusionList List of files and directories to exclude from the copy, may be null
- * @throws IOException if an error occurs
- * @since Commons IO 1.1
- */
- private static void doCopyDirectory(File srcDir, File destDir, FileFilter filter,
- boolean preserveFileDate, List<String> exclusionList) throws IOException {
- if (destDir.exists()) {
- if (destDir.isDirectory() == false) {
- throw new IOException("Destination '" + destDir + "' exists but is not a directory");
- }
- } else {
- if (destDir.mkdirs() == false) {
- throw new IOException("Destination '" + destDir + "' directory cannot be created");
- }
- if (preserveFileDate) {
- destDir.setLastModified(srcDir.lastModified());
- }
- }
- if (destDir.canWrite() == false) {
- throw new IOException("Destination '" + destDir + "' cannot be written to");
- }
- // recurse
- File[] files = filter == null ? srcDir.listFiles() : srcDir.listFiles(filter);
- if (files == null) { // null if security restricted
- throw new IOException("Failed to list contents of " + srcDir);
- }
- for (int i = 0; i < files.length; i++) {
- File copiedFile = new File(destDir, files[i].getName());
- if (exclusionList == null || !exclusionList.contains(files[i].getCanonicalPath())) {
- if (files[i].isDirectory()) {
- doCopyDirectory(files[i], copiedFile, filter, preserveFileDate, exclusionList);
- } else {
- doCopyFile(files[i], copiedFile, preserveFileDate);
- }
- }
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Copies bytes from the URL <code>source</code> to a file
- * <code>destination</code>. The directories up to <code>destination</code>
- * will be created if they don't already exist. <code>destination</code>
- * will be overwritten if it already exists.
- *
- * @param source the <code>URL</code> to copy bytes from, must not be <code>null</code>
- * @param destination the non-directory <code>File</code> to write bytes to
- * (possibly overwriting), must not be <code>null</code>
- * @throws IOException if <code>source</code> URL cannot be opened
- * @throws IOException if <code>destination</code> is a directory
- * @throws IOException if <code>destination</code> cannot be written
- * @throws IOException if <code>destination</code> needs creating but can't be
- * @throws IOException if an IO error occurs during copying
- */
- public static void copyURLToFile(URL source, File destination) throws IOException {
- InputStream input = source.openStream();
- try {
- FileOutputStream output = openOutputStream(destination);
- try {
- IOUtils.copy(input, output);
- } finally {
- IOUtils.closeQuietly(output);
- }
- } finally {
- IOUtils.closeQuietly(input);
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Deletes a directory recursively.
- *
- * @param directory directory to delete
- * @throws IOException in case deletion is unsuccessful
- */
- public static void deleteDirectory(File directory) throws IOException {
- if (!directory.exists()) {
- return;
- }
-
- cleanDirectory(directory);
- if (!directory.delete()) {
- String message =
- "Unable to delete directory " + directory + ".";
- throw new IOException(message);
- }
- }
-
- /**
- * Deletes a file, never throwing an exception. If file is a directory, delete it and all sub-directories.
- * <p>
- * The difference between File.delete() and this method are:
- * <ul>
- * <li>A directory to be deleted does not have to be empty.</li>
- * <li>No exceptions are thrown when a file or directory cannot be deleted.</li>
- * </ul>
- *
- * @param file file or directory to delete, can be <code>null</code>
- * @return <code>true</code> if the file or directory was deleted, otherwise
- * <code>false</code>
- *
- * @since Commons IO 1.4
- */
- public static boolean deleteQuietly(File file) {
- if (file == null) {
- return false;
- }
- try {
- if (file.isDirectory()) {
- cleanDirectory(file);
- }
- } catch (Exception e) {
- }
-
- try {
- return file.delete();
- } catch (Exception e) {
- return false;
- }
- }
-
- /**
- * Cleans a directory without deleting it.
- *
- * @param directory directory to clean
- * @throws IOException in case cleaning is unsuccessful
- */
- public static void cleanDirectory(File directory) throws IOException {
- if (!directory.exists()) {
- String message = directory + " does not exist";
- throw new IllegalArgumentException(message);
- }
-
- if (!directory.isDirectory()) {
- String message = directory + " is not a directory";
- throw new IllegalArgumentException(message);
- }
-
- File[] files = directory.listFiles();
- if (files == null) { // null if security restricted
- throw new IOException("Failed to list contents of " + directory);
- }
-
- IOException exception = null;
- for (int i = 0; i < files.length; i++) {
- File file = files[i];
- try {
- forceDelete(file);
- } catch (IOException ioe) {
- exception = ioe;
- }
- }
-
- if (null != exception) {
- throw exception;
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Waits for NFS to propagate a file creation, imposing a timeout.
- * <p>
- * This method repeatedly tests {@link File#exists()} until it returns
- * true up to the maximum time specified in seconds.
- *
- * @param file the file to check, must not be <code>null</code>
- * @param seconds the maximum time in seconds to wait
- * @return true if file exists
- * @throws NullPointerException if the file is <code>null</code>
- */
- public static boolean waitFor(File file, int seconds) {
- int timeout = 0;
- int tick = 0;
- while (!file.exists()) {
- if (tick++ >= 10) {
- tick = 0;
- if (timeout++ > seconds) {
- return false;
- }
- }
- try {
- Thread.sleep(100);
- } catch (InterruptedException ignore) {
- // ignore exception
- } catch (Exception ex) {
- break;
- }
- }
- return true;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Reads the contents of a file into a String.
- * The file is always closed.
- *
- * @param file the file to read, must not be <code>null</code>
- * @param encoding the encoding to use, <code>null</code> means platform default
- * @return the file contents, never <code>null</code>
- * @throws IOException in case of an I/O error
- * @throws java.io.UnsupportedEncodingException if the encoding is not supported by the VM
- */
- public static String readFileToString(File file, String encoding) throws IOException {
- InputStream in = null;
- try {
- in = openInputStream(file);
- return IOUtils.toString(in, encoding);
- } finally {
- IOUtils.closeQuietly(in);
- }
- }
-
-
- /**
- * Reads the contents of a file into a String using the default encoding for the VM.
- * The file is always closed.
- *
- * @param file the file to read, must not be <code>null</code>
- * @return the file contents, never <code>null</code>
- * @throws IOException in case of an I/O error
- * @since Commons IO 1.3.1
- */
- public static String readFileToString(File file) throws IOException {
- return readFileToString(file, null);
- }
-
- /**
- * Reads the contents of a file into a byte array.
- * The file is always closed.
- *
- * @param file the file to read, must not be <code>null</code>
- * @return the file contents, never <code>null</code>
- * @throws IOException in case of an I/O error
- * @since Commons IO 1.1
- */
- public static byte[] readFileToByteArray(File file) throws IOException {
- InputStream in = null;
- try {
- in = openInputStream(file);
- return IOUtils.toByteArray(in);
- } finally {
- IOUtils.closeQuietly(in);
- }
- }
-
- /**
- * Reads the contents of a file line by line to a List of Strings.
- * The file is always closed.
- *
- * @param file the file to read, must not be <code>null</code>
- * @param encoding the encoding to use, <code>null</code> means platform default
- * @return the list of Strings representing each line in the file, never <code>null</code>
- * @throws IOException in case of an I/O error
- * @throws java.io.UnsupportedEncodingException if the encoding is not supported by the VM
- * @since Commons IO 1.1
- */
- public static List<String> readLines(File file, String encoding) throws IOException {
- InputStream in = null;
- try {
- in = openInputStream(file);
- return IOUtils.readLines(in, encoding);
- } finally {
- IOUtils.closeQuietly(in);
- }
- }
-
- /**
- * Reads the contents of a file line by line to a List of Strings using the default encoding for the VM.
- * The file is always closed.
- *
- * @param file the file to read, must not be <code>null</code>
- * @return the list of Strings representing each line in the file, never <code>null</code>
- * @throws IOException in case of an I/O error
- * @since Commons IO 1.3
- */
- public static List<String> readLines(File file) throws IOException {
- return readLines(file, null);
- }
-
- /**
- * Returns an Iterator for the lines in a <code>File</code>.
- * <p>
- * This method opens an <code>InputStream</code> for the file.
- * When you have finished with the iterator you should close the stream
- * to free internal resources. This can be done by calling the
- * {@link LineIterator#close()} or
- * {@link LineIterator#closeQuietly(LineIterator)} method.
- * <p>
- * The recommended usage pattern is:
- * <pre>
- * LineIterator it = FileUtils.lineIterator(file, "UTF-8");
- * try {
- * while (it.hasNext()) {
- * String line = it.nextLine();
- * /// do something with line
- * }
- * } finally {
- * LineIterator.closeQuietly(iterator);
- * }
- * </pre>
- * <p>
- * If an exception occurs during the creation of the iterator, the
- * underlying stream is closed.
- *
- * @param file the file to open for input, must not be <code>null</code>
- * @param encoding the encoding to use, <code>null</code> means platform default
- * @return an Iterator of the lines in the file, never <code>null</code>
- * @throws IOException in case of an I/O error (file closed)
- * @since Commons IO 1.2
- */
- public static LineIterator lineIterator(File file, String encoding) throws IOException {
- InputStream in = null;
- try {
- in = openInputStream(file);
- return IOUtils.lineIterator(in, encoding);
- } catch (IOException ex) {
- IOUtils.closeQuietly(in);
- throw ex;
- } catch (RuntimeException ex) {
- IOUtils.closeQuietly(in);
- throw ex;
- }
- }
-
- /**
- * Returns an Iterator for the lines in a <code>File</code> using the default encoding for the VM.
- *
- * @param file the file to open for input, must not be <code>null</code>
- * @return an Iterator of the lines in the file, never <code>null</code>
- * @throws IOException in case of an I/O error (file closed)
- * @since Commons IO 1.3
- * @see #lineIterator(File, String)
- */
- public static LineIterator lineIterator(File file) throws IOException {
- return lineIterator(file, null);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Writes a String to a file creating the file if it does not exist.
- *
- * NOTE: As from v1.3, the parent directories of the file will be created
- * if they do not exist.
- *
- * @param file the file to write
- * @param data the content to write to the file
- * @param encoding the encoding to use, <code>null</code> means platform default
- * @throws IOException in case of an I/O error
- * @throws java.io.UnsupportedEncodingException if the encoding is not supported by the VM
- */
- public static void writeStringToFile(File file, String data, String encoding) throws IOException {
- OutputStream out = null;
- try {
- out = openOutputStream(file);
- IOUtils.write(data, out, encoding);
- } finally {
- IOUtils.closeQuietly(out);
- }
- }
-
- /**
- * Writes a String to a file creating the file if it does not exist using the default encoding for the VM.
- *
- * @param file the file to write
- * @param data the content to write to the file
- * @throws IOException in case of an I/O error
- */
- public static void writeStringToFile(File file, String data) throws IOException {
- writeStringToFile(file, data, null);
- }
-
- /**
- * Writes a byte array to a file creating the file if it does not exist.
- * <p>
- * NOTE: As from v1.3, the parent directories of the file will be created
- * if they do not exist.
- *
- * @param file the file to write to
- * @param data the content to write to the file
- * @throws IOException in case of an I/O error
- * @since Commons IO 1.1
- */
- public static void writeByteArrayToFile(File file, byte[] data) throws IOException {
- OutputStream out = null;
- try {
- out = openOutputStream(file);
- out.write(data);
- } finally {
- IOUtils.closeQuietly(out);
- }
- }
-
- /**
- * Writes the <code>toString()</code> value of each item in a collection to
- * the specified <code>File</code> line by line.
- * The specified character encoding and the default line ending will be used.
- * <p>
- * NOTE: As from v1.3, the parent directories of the file will be created
- * if they do not exist.
- *
- * @param file the file to write to
- * @param encoding the encoding to use, <code>null</code> means platform default
- * @param lines the lines to write, <code>null</code> entries produce blank lines
- * @throws IOException in case of an I/O error
- * @throws java.io.UnsupportedEncodingException if the encoding is not supported by the VM
- * @since Commons IO 1.1
- */
- public static void writeLines(File file, String encoding, Collection<Object> lines) throws IOException {
- writeLines(file, encoding, lines, null);
- }
-
- /**
- * Writes the <code>toString()</code> value of each item in a collection to
- * the specified <code>File</code> line by line.
- * The default VM encoding and the default line ending will be used.
- *
- * @param file the file to write to
- * @param lines the lines to write, <code>null</code> entries produce blank lines
- * @throws IOException in case of an I/O error
- * @since Commons IO 1.3
- */
- public static void writeLines(File file, Collection<Object> lines) throws IOException {
- writeLines(file, null, lines, null);
- }
-
- /**
- * Writes the <code>toString()</code> value of each item in a collection to
- * the specified <code>File</code> line by line.
- * The specified character encoding and the line ending will be used.
- * <p>
- * NOTE: As from v1.3, the parent directories of the file will be created
- * if they do not exist.
- *
- * @param file the file to write to
- * @param encoding the encoding to use, <code>null</code> means platform default
- * @param lines the lines to write, <code>null</code> entries produce blank lines
- * @param lineEnding the line separator to use, <code>null</code> is system default
- * @throws IOException in case of an I/O error
- * @throws java.io.UnsupportedEncodingException if the encoding is not supported by the VM
- * @since Commons IO 1.1
- */
- public static void writeLines(File file, String encoding, Collection<Object> lines, String lineEnding) throws IOException {
- OutputStream out = null;
- try {
- out = openOutputStream(file);
- IOUtils.writeLines(lines, lineEnding, out, encoding);
- } finally {
- IOUtils.closeQuietly(out);
- }
- }
-
- /**
- * Writes the <code>toString()</code> value of each item in a collection to
- * the specified <code>File</code> line by line.
- * The default VM encoding and the specified line ending will be used.
- *
- * @param file the file to write to
- * @param lines the lines to write, <code>null</code> entries produce blank lines
- * @param lineEnding the line separator to use, <code>null</code> is system default
- * @throws IOException in case of an I/O error
- * @since Commons IO 1.3
- */
- public static void writeLines(File file, Collection<Object> lines, String lineEnding) throws IOException {
- writeLines(file, null, lines, lineEnding);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Deletes a file. If file is a directory, delete it and all sub-directories.
- * <p>
- * The difference between File.delete() and this method are:
- * <ul>
- * <li>A directory to be deleted does not have to be empty.</li>
- * <li>You get exceptions when a file or directory cannot be deleted.
- * (java.io.File methods returns a boolean)</li>
- * </ul>
- *
- * @param file file or directory to delete, must not be <code>null</code>
- * @throws NullPointerException if the directory is <code>null</code>
- * @throws FileNotFoundException if the file was not found
- * @throws IOException in case deletion is unsuccessful
- */
- public static void forceDelete(File file) throws IOException {
- if (file.isDirectory()) {
- deleteDirectory(file);
- } else {
- boolean filePresent = file.exists();
- if (!file.delete()) {
- if (!filePresent){
- throw new FileNotFoundException("File does not exist: " + file);
- }
- String message =
- "Unable to delete file: " + file;
- throw new IOException(message);
- }
- }
- }
-
- /**
- * Schedules a file to be deleted when JVM exits.
- * If file is directory delete it and all sub-directories.
- *
- * @param file file or directory to delete, must not be <code>null</code>
- * @throws NullPointerException if the file is <code>null</code>
- * @throws IOException in case deletion is unsuccessful
- */
- public static void forceDeleteOnExit(File file) throws IOException {
- if (file.isDirectory()) {
- deleteDirectoryOnExit(file);
- } else {
- file.deleteOnExit();
- }
- }
-
- /**
- * Schedules a directory recursively for deletion on JVM exit.
- *
- * @param directory directory to delete, must not be <code>null</code>
- * @throws NullPointerException if the directory is <code>null</code>
- * @throws IOException in case deletion is unsuccessful
- */
- private static void deleteDirectoryOnExit(File directory) throws IOException {
- if (!directory.exists()) {
- return;
- }
-
- cleanDirectoryOnExit(directory);
- directory.deleteOnExit();
- }
-
- /**
- * Cleans a directory without deleting it.
- *
- * @param directory directory to clean, must not be <code>null</code>
- * @throws NullPointerException if the directory is <code>null</code>
- * @throws IOException in case cleaning is unsuccessful
- */
- private static void cleanDirectoryOnExit(File directory) throws IOException {
- if (!directory.exists()) {
- String message = directory + " does not exist";
- throw new IllegalArgumentException(message);
- }
-
- if (!directory.isDirectory()) {
- String message = directory + " is not a directory";
- throw new IllegalArgumentException(message);
- }
-
- File[] files = directory.listFiles();
- if (files == null) { // null if security restricted
- throw new IOException("Failed to list contents of " + directory);
- }
-
- IOException exception = null;
- for (int i = 0; i < files.length; i++) {
- File file = files[i];
- try {
- forceDeleteOnExit(file);
- } catch (IOException ioe) {
- exception = ioe;
- }
- }
-
- if (null != exception) {
- throw exception;
- }
- }
-
- /**
- * Makes a directory, including any necessary but nonexistent parent
- * directories. If there already exists a file with specified name or
- * the directory cannot be created then an exception is thrown.
- *
- * @param directory directory to create, must not be <code>null</code>
- * @throws NullPointerException if the directory is <code>null</code>
- * @throws IOException if the directory cannot be created
- */
- public static void forceMkdir(File directory) throws IOException {
- if (directory.exists()) {
- if (directory.isFile()) {
- String message =
- "File "
- + directory
- + " exists and is "
- + "not a directory. Unable to create directory.";
- throw new IOException(message);
- }
- } else {
- if (!directory.mkdirs()) {
- String message =
- "Unable to create directory " + directory;
- throw new IOException(message);
- }
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Counts the size of a directory recursively (sum of the length of all files).
- *
- * @param directory directory to inspect, must not be <code>null</code>
- * @return size of directory in bytes, 0 if directory is security restricted
- * @throws NullPointerException if the directory is <code>null</code>
- */
- public static long sizeOfDirectory(File directory) {
- if (!directory.exists()) {
- String message = directory + " does not exist";
- throw new IllegalArgumentException(message);
- }
-
- if (!directory.isDirectory()) {
- String message = directory + " is not a directory";
- throw new IllegalArgumentException(message);
- }
-
- long size = 0;
-
- File[] files = directory.listFiles();
- if (files == null) { // null if security restricted
- return 0L;
- }
- for (int i = 0; i < files.length; i++) {
- File file = files[i];
-
- if (file.isDirectory()) {
- size += sizeOfDirectory(file);
- } else {
- size += file.length();
- }
- }
-
- return size;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Tests if the specified <code>File</code> is newer than the reference
- * <code>File</code>.
- *
- * @param file the <code>File</code> of which the modification date must
- * be compared, must not be <code>null</code>
- * @param reference the <code>File</code> of which the modification date
- * is used, must not be <code>null</code>
- * @return true if the <code>File</code> exists and has been modified more
- * recently than the reference <code>File</code>
- * @throws IllegalArgumentException if the file is <code>null</code>
- * @throws IllegalArgumentException if the reference file is <code>null</code> or doesn't exist
- */
- public static boolean isFileNewer(File file, File reference) {
- if (reference == null) {
- throw new IllegalArgumentException("No specified reference file");
- }
- if (!reference.exists()) {
- throw new IllegalArgumentException("The reference file '"
- + file + "' doesn't exist");
- }
- return isFileNewer(file, reference.lastModified());
- }
-
- /**
- * Tests if the specified <code>File</code> is newer than the specified
- * <code>Date</code>.
- *
- * @param file the <code>File</code> of which the modification date
- * must be compared, must not be <code>null</code>
- * @param date the date reference, must not be <code>null</code>
- * @return true if the <code>File</code> exists and has been modified
- * after the given <code>Date</code>.
- * @throws IllegalArgumentException if the file is <code>null</code>
- * @throws IllegalArgumentException if the date is <code>null</code>
- */
- public static boolean isFileNewer(File file, Date date) {
- if (date == null) {
- throw new IllegalArgumentException("No specified date");
- }
- return isFileNewer(file, date.getTime());
- }
-
- /**
- * Tests if the specified <code>File</code> is newer than the specified
- * time reference.
- *
- * @param file the <code>File</code> of which the modification date must
- * be compared, must not be <code>null</code>
- * @param timeMillis the time reference measured in milliseconds since the
- * epoch (00:00:00 GMT, January 1, 1970)
- * @return true if the <code>File</code> exists and has been modified after
- * the given time reference.
- * @throws IllegalArgumentException if the file is <code>null</code>
- */
- public static boolean isFileNewer(File file, long timeMillis) {
- if (file == null) {
- throw new IllegalArgumentException("No specified file");
- }
- if (!file.exists()) {
- return false;
- }
- return file.lastModified() > timeMillis;
- }
-
-
- //-----------------------------------------------------------------------
- /**
- * Tests if the specified <code>File</code> is older than the reference
- * <code>File</code>.
- *
- * @param file the <code>File</code> of which the modification date must
- * be compared, must not be <code>null</code>
- * @param reference the <code>File</code> of which the modification date
- * is used, must not be <code>null</code>
- * @return true if the <code>File</code> exists and has been modified before
- * the reference <code>File</code>
- * @throws IllegalArgumentException if the file is <code>null</code>
- * @throws IllegalArgumentException if the reference file is <code>null</code> or doesn't exist
- */
- public static boolean isFileOlder(File file, File reference) {
- if (reference == null) {
- throw new IllegalArgumentException("No specified reference file");
- }
- if (!reference.exists()) {
- throw new IllegalArgumentException("The reference file '"
- + file + "' doesn't exist");
- }
- return isFileOlder(file, reference.lastModified());
- }
-
- /**
- * Tests if the specified <code>File</code> is older than the specified
- * <code>Date</code>.
- *
- * @param file the <code>File</code> of which the modification date
- * must be compared, must not be <code>null</code>
- * @param date the date reference, must not be <code>null</code>
- * @return true if the <code>File</code> exists and has been modified
- * before the given <code>Date</code>.
- * @throws IllegalArgumentException if the file is <code>null</code>
- * @throws IllegalArgumentException if the date is <code>null</code>
- */
- public static boolean isFileOlder(File file, Date date) {
- if (date == null) {
- throw new IllegalArgumentException("No specified date");
- }
- return isFileOlder(file, date.getTime());
- }
-
- /**
- * Tests if the specified <code>File</code> is older than the specified
- * time reference.
- *
- * @param file the <code>File</code> of which the modification date must
- * be compared, must not be <code>null</code>
- * @param timeMillis the time reference measured in milliseconds since the
- * epoch (00:00:00 GMT, January 1, 1970)
- * @return true if the <code>File</code> exists and has been modified before
- * the given time reference.
- * @throws IllegalArgumentException if the file is <code>null</code>
- */
- public static boolean isFileOlder(File file, long timeMillis) {
- if (file == null) {
- throw new IllegalArgumentException("No specified file");
- }
- if (!file.exists()) {
- return false;
- }
- return file.lastModified() < timeMillis;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Computes the checksum of a file using the CRC32 checksum routine.
- * The value of the checksum is returned.
- *
- * @param file the file to checksum, must not be <code>null</code>
- * @return the checksum value
- * @throws NullPointerException if the file or checksum is <code>null</code>
- * @throws IllegalArgumentException if the file is a directory
- * @throws IOException if an IO error occurs reading the file
- * @since Commons IO 1.3
- */
- public static long checksumCRC32(File file) throws IOException {
- CRC32 crc = new CRC32();
- checksum(file, crc);
- return crc.getValue();
- }
-
- /**
- * Computes the checksum of a file using the specified checksum object.
- * Multiple files may be checked using one <code>Checksum</code> instance
- * if desired simply by reusing the same checksum object.
- * For example:
- * <pre>
- * long csum = FileUtils.checksum(file, new CRC32()).getValue();
- * </pre>
- *
- * @param file the file to checksum, must not be <code>null</code>
- * @param checksum the checksum object to be used, must not be <code>null</code>
- * @return the checksum specified, updated with the content of the file
- * @throws NullPointerException if the file or checksum is <code>null</code>
- * @throws IllegalArgumentException if the file is a directory
- * @throws IOException if an IO error occurs reading the file
- * @since Commons IO 1.3
- */
- public static Checksum checksum(File file, Checksum checksum) throws IOException {
- if (file.isDirectory()) {
- throw new IllegalArgumentException("Checksums can't be computed on directories");
- }
- InputStream in = null;
- try {
- in = new CheckedInputStream(new FileInputStream(file), checksum);
- IOUtils.copy(in, new NullOutputStream());
- } finally {
- IOUtils.closeQuietly(in);
- }
- return checksum;
- }
-
- /**
- * Moves a directory.
- * <p>
- * When the destination directory is on another file system, do a "copy and delete".
- *
- * @param srcDir the directory to be moved
- * @param destDir the destination directory
- * @throws NullPointerException if source or destination is <code>null</code>
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs moving the file
- * @since Commons IO 1.4
- */
- public static void moveDirectory(File srcDir, File destDir) throws IOException {
- if (srcDir == null) {
- throw new NullPointerException("Source must not be null");
- }
- if (destDir == null) {
- throw new NullPointerException("Destination must not be null");
- }
- if (!srcDir.exists()) {
- throw new FileNotFoundException("Source '" + srcDir + "' does not exist");
- }
- if (!srcDir.isDirectory()) {
- throw new IOException("Source '" + srcDir + "' is not a directory");
- }
- if (destDir.exists()) {
- throw new IOException("Destination '" + destDir + "' already exists");
- }
- boolean rename = srcDir.renameTo(destDir);
- if (!rename) {
- copyDirectory( srcDir, destDir );
- deleteDirectory( srcDir );
- if (srcDir.exists()) {
- throw new IOException("Failed to delete original directory '" + srcDir +
- "' after copy to '" + destDir + "'");
- }
- }
- }
-
- /**
- * Moves a directory to another directory.
- *
- * @param src the file to be moved
- * @param destDir the destination file
- * @param createDestDir If <code>true</code> create the destination directory,
- * otherwise if <code>false</code> throw an IOException
- * @throws NullPointerException if source or destination is <code>null</code>
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs moving the file
- * @since Commons IO 1.4
- */
- public static void moveDirectoryToDirectory(File src, File destDir, boolean createDestDir) throws IOException {
- if (src == null) {
- throw new NullPointerException("Source must not be null");
- }
- if (destDir == null) {
- throw new NullPointerException("Destination directory must not be null");
- }
- if (!destDir.exists() && createDestDir) {
- destDir.mkdirs();
- }
- if (!destDir.exists()) {
- throw new FileNotFoundException("Destination directory '" + destDir +
- "' does not exist [createDestDir=" + createDestDir +"]");
- }
- if (!destDir.isDirectory()) {
- throw new IOException("Destination '" + destDir + "' is not a directory");
- }
- moveDirectory(src, new File(destDir, src.getName()));
-
- }
-
- /**
- * Moves a file.
- * <p>
- * When the destination file is on another file system, do a "copy and delete".
- *
- * @param srcFile the file to be moved
- * @param destFile the destination file
- * @throws NullPointerException if source or destination is <code>null</code>
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs moving the file
- * @since Commons IO 1.4
- */
- public static void moveFile(File srcFile, File destFile) throws IOException {
- if (srcFile == null) {
- throw new NullPointerException("Source must not be null");
- }
- if (destFile == null) {
- throw new NullPointerException("Destination must not be null");
- }
- if (!srcFile.exists()) {
- throw new FileNotFoundException("Source '" + srcFile + "' does not exist");
- }
- if (srcFile.isDirectory()) {
- throw new IOException("Source '" + srcFile + "' is a directory");
- }
- if (destFile.exists()) {
- throw new IOException("Destination '" + destFile + "' already exists");
- }
- if (destFile.isDirectory()) {
- throw new IOException("Destination '" + destFile + "' is a directory");
- }
- boolean rename = srcFile.renameTo(destFile);
- if (!rename) {
- copyFile( srcFile, destFile );
- if (!srcFile.delete()) {
- FileUtils.deleteQuietly(destFile);
- throw new IOException("Failed to delete original file '" + srcFile +
- "' after copy to '" + destFile + "'");
- }
- }
- }
-
- /**
- * Moves a file to a directory.
- *
- * @param srcFile the file to be moved
- * @param destDir the destination file
- * @param createDestDir If <code>true</code> create the destination directory,
- * otherwise if <code>false</code> throw an IOException
- * @throws NullPointerException if source or destination is <code>null</code>
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs moving the file
- * @since Commons IO 1.4
- */
- public static void moveFileToDirectory(File srcFile, File destDir, boolean createDestDir) throws IOException {
- if (srcFile == null) {
- throw new NullPointerException("Source must not be null");
- }
- if (destDir == null) {
- throw new NullPointerException("Destination directory must not be null");
- }
- if (!destDir.exists() && createDestDir) {
- destDir.mkdirs();
- }
- if (!destDir.exists()) {
- throw new FileNotFoundException("Destination directory '" + destDir +
- "' does not exist [createDestDir=" + createDestDir +"]");
- }
- if (!destDir.isDirectory()) {
- throw new IOException("Destination '" + destDir + "' is not a directory");
- }
- moveFile(srcFile, new File(destDir, srcFile.getName()));
- }
-
- /**
- * Moves a file or directory to the destination directory.
- * <p>
- * When the destination is on another file system, do a "copy and delete".
- *
- * @param src the file or directory to be moved
- * @param destDir the destination directory
- * @param createDestDir If <code>true</code> create the destination directory,
- * otherwise if <code>false</code> throw an IOException
- * @throws NullPointerException if source or destination is <code>null</code>
- * @throws IOException if source or destination is invalid
- * @throws IOException if an IO error occurs moving the file
- * @since Commons IO 1.4
- */
- public static void moveToDirectory(File src, File destDir, boolean createDestDir) throws IOException {
- if (src == null) {
- throw new NullPointerException("Source must not be null");
- }
- if (destDir == null) {
- throw new NullPointerException("Destination must not be null");
- }
- if (!src.exists()) {
- throw new FileNotFoundException("Source '" + src + "' does not exist");
- }
- if (src.isDirectory()) {
- moveDirectoryToDirectory(src, destDir, createDestDir);
- } else {
- moveFileToDirectory(src, destDir, createDestDir);
- }
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/FilenameUtils.java b/emailcommon/src/org/apache/commons/io/FilenameUtils.java
deleted file mode 100644
index d8cc78b24..000000000
--- a/emailcommon/src/org/apache/commons/io/FilenameUtils.java
+++ /dev/null
@@ -1,1260 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Stack;
-
-/**
- * General filename and filepath manipulation utilities.
- * <p>
- * When dealing with filenames you can hit problems when moving from a Windows
- * based development machine to a Unix based production machine.
- * This class aims to help avoid those problems.
- * <p>
- * <b>NOTE</b>: You may be able to avoid using this class entirely simply by
- * using JDK {@link java.io.File File} objects and the two argument constructor
- * {@link java.io.File#File(java.io.File, java.lang.String) File(File,String)}.
- * <p>
- * Most methods on this class are designed to work the same on both Unix and Windows.
- * Those that don't include 'System', 'Unix' or 'Windows' in their name.
- * <p>
- * Most methods recognise both separators (forward and back), and both
- * sets of prefixes. See the javadoc of each method for details.
- * <p>
- * This class defines six components within a filename
- * (example C:\dev\project\file.txt):
- * <ul>
- * <li>the prefix - C:\</li>
- * <li>the path - dev\project\</li>
- * <li>the full path - C:\dev\project\</li>
- * <li>the name - file.txt</li>
- * <li>the base name - file</li>
- * <li>the extension - txt</li>
- * </ul>
- * Note that this class works best if directory filenames end with a separator.
- * If you omit the last separator, it is impossible to determine if the filename
- * corresponds to a file or a directory. As a result, we have chosen to say
- * it corresponds to a file.
- * <p>
- * This class only supports Unix and Windows style names.
- * Prefixes are matched as follows:
- * <pre>
- * Windows:
- * a\b\c.txt --> "" --> relative
- * \a\b\c.txt --> "\" --> current drive absolute
- * C:a\b\c.txt --> "C:" --> drive relative
- * C:\a\b\c.txt --> "C:\" --> absolute
- * \\server\a\b\c.txt --> "\\server\" --> UNC
- *
- * Unix:
- * a/b/c.txt --> "" --> relative
- * /a/b/c.txt --> "/" --> absolute
- * ~/a/b/c.txt --> "~/" --> current user
- * ~ --> "~/" --> current user (slash added)
- * ~user/a/b/c.txt --> "~user/" --> named user
- * ~user --> "~user/" --> named user (slash added)
- * </pre>
- * Both prefix styles are matched always, irrespective of the machine that you are
- * currently running on.
- * <p>
- * Origin of code: Excalibur, Alexandria, Tomcat, Commons-Utils.
- *
- * @author <a href="mailto:burton@relativity.yi.org">Kevin A. Burton</A>
- * @author <a href="mailto:sanders@apache.org">Scott Sanders</a>
- * @author <a href="mailto:dlr@finemaltcoding.com">Daniel Rall</a>
- * @author <a href="mailto:Christoph.Reck@dlr.de">Christoph.Reck</a>
- * @author <a href="mailto:peter@apache.org">Peter Donald</a>
- * @author <a href="mailto:jefft@apache.org">Jeff Turner</a>
- * @author Matthew Hawthorne
- * @author Martin Cooper
- * @author <a href="mailto:jeremias@apache.org">Jeremias Maerki</a>
- * @author Stephen Colebourne
- * @version $Id: FilenameUtils.java 609870 2008-01-08 04:46:26Z niallp $
- * @since Commons IO 1.1
- */
-public class FilenameUtils {
-
- /**
- * The extension separator character.
- * @since Commons IO 1.4
- */
- public static final char EXTENSION_SEPARATOR = '.';
-
- /**
- * The extension separator String.
- * @since Commons IO 1.4
- */
- public static final String EXTENSION_SEPARATOR_STR = (new Character(EXTENSION_SEPARATOR)).toString();
-
- /**
- * The Unix separator character.
- */
- private static final char UNIX_SEPARATOR = '/';
-
- /**
- * The Windows separator character.
- */
- private static final char WINDOWS_SEPARATOR = '\\';
-
- /**
- * The system separator character.
- */
- private static final char SYSTEM_SEPARATOR = File.separatorChar;
-
- /**
- * The separator character that is the opposite of the system separator.
- */
- private static final char OTHER_SEPARATOR;
- static {
- if (isSystemWindows()) {
- OTHER_SEPARATOR = UNIX_SEPARATOR;
- } else {
- OTHER_SEPARATOR = WINDOWS_SEPARATOR;
- }
- }
-
- /**
- * Instances should NOT be constructed in standard programming.
- */
- public FilenameUtils() {
- super();
- }
-
- //-----------------------------------------------------------------------
- /**
- * Determines if Windows file system is in use.
- *
- * @return true if the system is Windows
- */
- static boolean isSystemWindows() {
- return SYSTEM_SEPARATOR == WINDOWS_SEPARATOR;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Checks if the character is a separator.
- *
- * @param ch the character to check
- * @return true if it is a separator character
- */
- private static boolean isSeparator(char ch) {
- return (ch == UNIX_SEPARATOR) || (ch == WINDOWS_SEPARATOR);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Normalizes a path, removing double and single dot path steps.
- * <p>
- * This method normalizes a path to a standard format.
- * The input may contain separators in either Unix or Windows format.
- * The output will contain separators in the format of the system.
- * <p>
- * A trailing slash will be retained.
- * A double slash will be merged to a single slash (but UNC names are handled).
- * A single dot path segment will be removed.
- * A double dot will cause that path segment and the one before to be removed.
- * If the double dot has no parent path segment to work with, <code>null</code>
- * is returned.
- * <p>
- * The output will be the same on both Unix and Windows except
- * for the separator character.
- * <pre>
- * /foo// --> /foo/
- * /foo/./ --> /foo/
- * /foo/../bar --> /bar
- * /foo/../bar/ --> /bar/
- * /foo/../bar/../baz --> /baz
- * //foo//./bar --> /foo/bar
- * /../ --> null
- * ../foo --> null
- * foo/bar/.. --> foo/
- * foo/../../bar --> null
- * foo/../bar --> bar
- * //server/foo/../bar --> //server/bar
- * //server/../bar --> null
- * C:\foo\..\bar --> C:\bar
- * C:\..\bar --> null
- * ~/foo/../bar/ --> ~/bar/
- * ~/../bar --> null
- * </pre>
- * (Note the file separator returned will be correct for Windows/Unix)
- *
- * @param filename the filename to normalize, null returns null
- * @return the normalized filename, or null if invalid
- */
- public static String normalize(String filename) {
- return doNormalize(filename, true);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Normalizes a path, removing double and single dot path steps,
- * and removing any final directory separator.
- * <p>
- * This method normalizes a path to a standard format.
- * The input may contain separators in either Unix or Windows format.
- * The output will contain separators in the format of the system.
- * <p>
- * A trailing slash will be removed.
- * A double slash will be merged to a single slash (but UNC names are handled).
- * A single dot path segment will be removed.
- * A double dot will cause that path segment and the one before to be removed.
- * If the double dot has no parent path segment to work with, <code>null</code>
- * is returned.
- * <p>
- * The output will be the same on both Unix and Windows except
- * for the separator character.
- * <pre>
- * /foo// --> /foo
- * /foo/./ --> /foo
- * /foo/../bar --> /bar
- * /foo/../bar/ --> /bar
- * /foo/../bar/../baz --> /baz
- * //foo//./bar --> /foo/bar
- * /../ --> null
- * ../foo --> null
- * foo/bar/.. --> foo
- * foo/../../bar --> null
- * foo/../bar --> bar
- * //server/foo/../bar --> //server/bar
- * //server/../bar --> null
- * C:\foo\..\bar --> C:\bar
- * C:\..\bar --> null
- * ~/foo/../bar/ --> ~/bar
- * ~/../bar --> null
- * </pre>
- * (Note the file separator returned will be correct for Windows/Unix)
- *
- * @param filename the filename to normalize, null returns null
- * @return the normalized filename, or null if invalid
- */
- public static String normalizeNoEndSeparator(String filename) {
- return doNormalize(filename, false);
- }
-
- /**
- * Internal method to perform the normalization.
- *
- * @param filename the filename
- * @param keepSeparator true to keep the final separator
- * @return the normalized filename
- */
- private static String doNormalize(String filename, boolean keepSeparator) {
- if (filename == null) {
- return null;
- }
- int size = filename.length();
- if (size == 0) {
- return filename;
- }
- int prefix = getPrefixLength(filename);
- if (prefix < 0) {
- return null;
- }
-
- char[] array = new char[size + 2]; // +1 for possible extra slash, +2 for arraycopy
- filename.getChars(0, filename.length(), array, 0);
-
- // fix separators throughout
- for (int i = 0; i < array.length; i++) {
- if (array[i] == OTHER_SEPARATOR) {
- array[i] = SYSTEM_SEPARATOR;
- }
- }
-
- // add extra separator on the end to simplify code below
- boolean lastIsDirectory = true;
- if (array[size - 1] != SYSTEM_SEPARATOR) {
- array[size++] = SYSTEM_SEPARATOR;
- lastIsDirectory = false;
- }
-
- // adjoining slashes
- for (int i = prefix + 1; i < size; i++) {
- if (array[i] == SYSTEM_SEPARATOR && array[i - 1] == SYSTEM_SEPARATOR) {
- System.arraycopy(array, i, array, i - 1, size - i);
- size--;
- i--;
- }
- }
-
- // dot slash
- for (int i = prefix + 1; i < size; i++) {
- if (array[i] == SYSTEM_SEPARATOR && array[i - 1] == '.' &&
- (i == prefix + 1 || array[i - 2] == SYSTEM_SEPARATOR)) {
- if (i == size - 1) {
- lastIsDirectory = true;
- }
- System.arraycopy(array, i + 1, array, i - 1, size - i);
- size -=2;
- i--;
- }
- }
-
- // double dot slash
- outer:
- for (int i = prefix + 2; i < size; i++) {
- if (array[i] == SYSTEM_SEPARATOR && array[i - 1] == '.' && array[i - 2] == '.' &&
- (i == prefix + 2 || array[i - 3] == SYSTEM_SEPARATOR)) {
- if (i == prefix + 2) {
- return null;
- }
- if (i == size - 1) {
- lastIsDirectory = true;
- }
- int j;
- for (j = i - 4 ; j >= prefix; j--) {
- if (array[j] == SYSTEM_SEPARATOR) {
- // remove b/../ from a/b/../c
- System.arraycopy(array, i + 1, array, j + 1, size - i);
- size -= (i - j);
- i = j + 1;
- continue outer;
- }
- }
- // remove a/../ from a/../c
- System.arraycopy(array, i + 1, array, prefix, size - i);
- size -= (i + 1 - prefix);
- i = prefix + 1;
- }
- }
-
- if (size <= 0) { // should never be less than 0
- return "";
- }
- if (size <= prefix) { // should never be less than prefix
- return new String(array, 0, size);
- }
- if (lastIsDirectory && keepSeparator) {
- return new String(array, 0, size); // keep trailing separator
- }
- return new String(array, 0, size - 1); // lose trailing separator
- }
-
- //-----------------------------------------------------------------------
- /**
- * Concatenates a filename to a base path using normal command line style rules.
- * <p>
- * The effect is equivalent to resultant directory after changing
- * directory to the first argument, followed by changing directory to
- * the second argument.
- * <p>
- * The first argument is the base path, the second is the path to concatenate.
- * The returned path is always normalized via {@link #normalize(String)},
- * thus <code>..</code> is handled.
- * <p>
- * If <code>pathToAdd</code> is absolute (has an absolute prefix), then
- * it will be normalized and returned.
- * Otherwise, the paths will be joined, normalized and returned.
- * <p>
- * The output will be the same on both Unix and Windows except
- * for the separator character.
- * <pre>
- * /foo/ + bar --> /foo/bar
- * /foo + bar --> /foo/bar
- * /foo + /bar --> /bar
- * /foo + C:/bar --> C:/bar
- * /foo + C:bar --> C:bar (*)
- * /foo/a/ + ../bar --> foo/bar
- * /foo/ + ../../bar --> null
- * /foo/ + /bar --> /bar
- * /foo/.. + /bar --> /bar
- * /foo + bar/c.txt --> /foo/bar/c.txt
- * /foo/c.txt + bar --> /foo/c.txt/bar (!)
- * </pre>
- * (*) Note that the Windows relative drive prefix is unreliable when
- * used with this method.
- * (!) Note that the first parameter must be a path. If it ends with a name, then
- * the name will be built into the concatenated path. If this might be a problem,
- * use {@link #getFullPath(String)} on the base path argument.
- *
- * @param basePath the base path to attach to, always treated as a path
- * @param fullFilenameToAdd the filename (or path) to attach to the base
- * @return the concatenated path, or null if invalid
- */
- public static String concat(String basePath, String fullFilenameToAdd) {
- int prefix = getPrefixLength(fullFilenameToAdd);
- if (prefix < 0) {
- return null;
- }
- if (prefix > 0) {
- return normalize(fullFilenameToAdd);
- }
- if (basePath == null) {
- return null;
- }
- int len = basePath.length();
- if (len == 0) {
- return normalize(fullFilenameToAdd);
- }
- char ch = basePath.charAt(len - 1);
- if (isSeparator(ch)) {
- return normalize(basePath + fullFilenameToAdd);
- } else {
- return normalize(basePath + '/' + fullFilenameToAdd);
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Converts all separators to the Unix separator of forward slash.
- *
- * @param path the path to be changed, null ignored
- * @return the updated path
- */
- public static String separatorsToUnix(String path) {
- if (path == null || path.indexOf(WINDOWS_SEPARATOR) == -1) {
- return path;
- }
- return path.replace(WINDOWS_SEPARATOR, UNIX_SEPARATOR);
- }
-
- /**
- * Converts all separators to the Windows separator of backslash.
- *
- * @param path the path to be changed, null ignored
- * @return the updated path
- */
- public static String separatorsToWindows(String path) {
- if (path == null || path.indexOf(UNIX_SEPARATOR) == -1) {
- return path;
- }
- return path.replace(UNIX_SEPARATOR, WINDOWS_SEPARATOR);
- }
-
- /**
- * Converts all separators to the system separator.
- *
- * @param path the path to be changed, null ignored
- * @return the updated path
- */
- public static String separatorsToSystem(String path) {
- if (path == null) {
- return null;
- }
- if (isSystemWindows()) {
- return separatorsToWindows(path);
- } else {
- return separatorsToUnix(path);
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Returns the length of the filename prefix, such as <code>C:/</code> or <code>~/</code>.
- * <p>
- * This method will handle a file in either Unix or Windows format.
- * <p>
- * The prefix length includes the first slash in the full filename
- * if applicable. Thus, it is possible that the length returned is greater
- * than the length of the input string.
- * <pre>
- * Windows:
- * a\b\c.txt --> "" --> relative
- * \a\b\c.txt --> "\" --> current drive absolute
- * C:a\b\c.txt --> "C:" --> drive relative
- * C:\a\b\c.txt --> "C:\" --> absolute
- * \\server\a\b\c.txt --> "\\server\" --> UNC
- *
- * Unix:
- * a/b/c.txt --> "" --> relative
- * /a/b/c.txt --> "/" --> absolute
- * ~/a/b/c.txt --> "~/" --> current user
- * ~ --> "~/" --> current user (slash added)
- * ~user/a/b/c.txt --> "~user/" --> named user
- * ~user --> "~user/" --> named user (slash added)
- * </pre>
- * <p>
- * The output will be the same irrespective of the machine that the code is running on.
- * ie. both Unix and Windows prefixes are matched regardless.
- *
- * @param filename the filename to find the prefix in, null returns -1
- * @return the length of the prefix, -1 if invalid or null
- */
- public static int getPrefixLength(String filename) {
- if (filename == null) {
- return -1;
- }
- int len = filename.length();
- if (len == 0) {
- return 0;
- }
- char ch0 = filename.charAt(0);
- if (ch0 == ':') {
- return -1;
- }
- if (len == 1) {
- if (ch0 == '~') {
- return 2; // return a length greater than the input
- }
- return (isSeparator(ch0) ? 1 : 0);
- } else {
- if (ch0 == '~') {
- int posUnix = filename.indexOf(UNIX_SEPARATOR, 1);
- int posWin = filename.indexOf(WINDOWS_SEPARATOR, 1);
- if (posUnix == -1 && posWin == -1) {
- return len + 1; // return a length greater than the input
- }
- posUnix = (posUnix == -1 ? posWin : posUnix);
- posWin = (posWin == -1 ? posUnix : posWin);
- return Math.min(posUnix, posWin) + 1;
- }
- char ch1 = filename.charAt(1);
- if (ch1 == ':') {
- ch0 = Character.toUpperCase(ch0);
- if (ch0 >= 'A' && ch0 <= 'Z') {
- if (len == 2 || isSeparator(filename.charAt(2)) == false) {
- return 2;
- }
- return 3;
- }
- return -1;
-
- } else if (isSeparator(ch0) && isSeparator(ch1)) {
- int posUnix = filename.indexOf(UNIX_SEPARATOR, 2);
- int posWin = filename.indexOf(WINDOWS_SEPARATOR, 2);
- if ((posUnix == -1 && posWin == -1) || posUnix == 2 || posWin == 2) {
- return -1;
- }
- posUnix = (posUnix == -1 ? posWin : posUnix);
- posWin = (posWin == -1 ? posUnix : posWin);
- return Math.min(posUnix, posWin) + 1;
- } else {
- return (isSeparator(ch0) ? 1 : 0);
- }
- }
- }
-
- /**
- * Returns the index of the last directory separator character.
- * <p>
- * This method will handle a file in either Unix or Windows format.
- * The position of the last forward or backslash is returned.
- * <p>
- * The output will be the same irrespective of the machine that the code is running on.
- *
- * @param filename the filename to find the last path separator in, null returns -1
- * @return the index of the last separator character, or -1 if there
- * is no such character
- */
- public static int indexOfLastSeparator(String filename) {
- if (filename == null) {
- return -1;
- }
- int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR);
- int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR);
- return Math.max(lastUnixPos, lastWindowsPos);
- }
-
- /**
- * Returns the index of the last extension separator character, which is a dot.
- * <p>
- * This method also checks that there is no directory separator after the last dot.
- * To do this it uses {@link #indexOfLastSeparator(String)} which will
- * handle a file in either Unix or Windows format.
- * <p>
- * The output will be the same irrespective of the machine that the code is running on.
- *
- * @param filename the filename to find the last path separator in, null returns -1
- * @return the index of the last separator character, or -1 if there
- * is no such character
- */
- public static int indexOfExtension(String filename) {
- if (filename == null) {
- return -1;
- }
- int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
- int lastSeparator = indexOfLastSeparator(filename);
- return (lastSeparator > extensionPos ? -1 : extensionPos);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Gets the prefix from a full filename, such as <code>C:/</code>
- * or <code>~/</code>.
- * <p>
- * This method will handle a file in either Unix or Windows format.
- * The prefix includes the first slash in the full filename where applicable.
- * <pre>
- * Windows:
- * a\b\c.txt --> "" --> relative
- * \a\b\c.txt --> "\" --> current drive absolute
- * C:a\b\c.txt --> "C:" --> drive relative
- * C:\a\b\c.txt --> "C:\" --> absolute
- * \\server\a\b\c.txt --> "\\server\" --> UNC
- *
- * Unix:
- * a/b/c.txt --> "" --> relative
- * /a/b/c.txt --> "/" --> absolute
- * ~/a/b/c.txt --> "~/" --> current user
- * ~ --> "~/" --> current user (slash added)
- * ~user/a/b/c.txt --> "~user/" --> named user
- * ~user --> "~user/" --> named user (slash added)
- * </pre>
- * <p>
- * The output will be the same irrespective of the machine that the code is running on.
- * ie. both Unix and Windows prefixes are matched regardless.
- *
- * @param filename the filename to query, null returns null
- * @return the prefix of the file, null if invalid
- */
- public static String getPrefix(String filename) {
- if (filename == null) {
- return null;
- }
- int len = getPrefixLength(filename);
- if (len < 0) {
- return null;
- }
- if (len > filename.length()) {
- return filename + UNIX_SEPARATOR; // we know this only happens for unix
- }
- return filename.substring(0, len);
- }
-
- /**
- * Gets the path from a full filename, which excludes the prefix.
- * <p>
- * This method will handle a file in either Unix or Windows format.
- * The method is entirely text based, and returns the text before and
- * including the last forward or backslash.
- * <pre>
- * C:\a\b\c.txt --> a\b\
- * ~/a/b/c.txt --> a/b/
- * a.txt --> ""
- * a/b/c --> a/b/
- * a/b/c/ --> a/b/c/
- * </pre>
- * <p>
- * The output will be the same irrespective of the machine that the code is running on.
- * <p>
- * This method drops the prefix from the result.
- * See {@link #getFullPath(String)} for the method that retains the prefix.
- *
- * @param filename the filename to query, null returns null
- * @return the path of the file, an empty string if none exists, null if invalid
- */
- public static String getPath(String filename) {
- return doGetPath(filename, 1);
- }
-
- /**
- * Gets the path from a full filename, which excludes the prefix, and
- * also excluding the final directory separator.
- * <p>
- * This method will handle a file in either Unix or Windows format.
- * The method is entirely text based, and returns the text before the
- * last forward or backslash.
- * <pre>
- * C:\a\b\c.txt --> a\b
- * ~/a/b/c.txt --> a/b
- * a.txt --> ""
- * a/b/c --> a/b
- * a/b/c/ --> a/b/c
- * </pre>
- * <p>
- * The output will be the same irrespective of the machine that the code is running on.
- * <p>
- * This method drops the prefix from the result.
- * See {@link #getFullPathNoEndSeparator(String)} for the method that retains the prefix.
- *
- * @param filename the filename to query, null returns null
- * @return the path of the file, an empty string if none exists, null if invalid
- */
- public static String getPathNoEndSeparator(String filename) {
- return doGetPath(filename, 0);
- }
-
- /**
- * Does the work of getting the path.
- *
- * @param filename the filename
- * @param separatorAdd 0 to omit the end separator, 1 to return it
- * @return the path
- */
- private static String doGetPath(String filename, int separatorAdd) {
- if (filename == null) {
- return null;
- }
- int prefix = getPrefixLength(filename);
- if (prefix < 0) {
- return null;
- }
- int index = indexOfLastSeparator(filename);
- if (prefix >= filename.length() || index < 0) {
- return "";
- }
- return filename.substring(prefix, index + separatorAdd);
- }
-
- /**
- * Gets the full path from a full filename, which is the prefix + path.
- * <p>
- * This method will handle a file in either Unix or Windows format.
- * The method is entirely text based, and returns the text before and
- * including the last forward or backslash.
- * <pre>
- * C:\a\b\c.txt --> C:\a\b\
- * ~/a/b/c.txt --> ~/a/b/
- * a.txt --> ""
- * a/b/c --> a/b/
- * a/b/c/ --> a/b/c/
- * C: --> C:
- * C:\ --> C:\
- * ~ --> ~/
- * ~/ --> ~/
- * ~user --> ~user/
- * ~user/ --> ~user/
- * </pre>
- * <p>
- * The output will be the same irrespective of the machine that the code is running on.
- *
- * @param filename the filename to query, null returns null
- * @return the path of the file, an empty string if none exists, null if invalid
- */
- public static String getFullPath(String filename) {
- return doGetFullPath(filename, true);
- }
-
- /**
- * Gets the full path from a full filename, which is the prefix + path,
- * and also excluding the final directory separator.
- * <p>
- * This method will handle a file in either Unix or Windows format.
- * The method is entirely text based, and returns the text before the
- * last forward or backslash.
- * <pre>
- * C:\a\b\c.txt --> C:\a\b
- * ~/a/b/c.txt --> ~/a/b
- * a.txt --> ""
- * a/b/c --> a/b
- * a/b/c/ --> a/b/c
- * C: --> C:
- * C:\ --> C:\
- * ~ --> ~
- * ~/ --> ~
- * ~user --> ~user
- * ~user/ --> ~user
- * </pre>
- * <p>
- * The output will be the same irrespective of the machine that the code is running on.
- *
- * @param filename the filename to query, null returns null
- * @return the path of the file, an empty string if none exists, null if invalid
- */
- public static String getFullPathNoEndSeparator(String filename) {
- return doGetFullPath(filename, false);
- }
-
- /**
- * Does the work of getting the path.
- *
- * @param filename the filename
- * @param includeSeparator true to include the end separator
- * @return the path
- */
- private static String doGetFullPath(String filename, boolean includeSeparator) {
- if (filename == null) {
- return null;
- }
- int prefix = getPrefixLength(filename);
- if (prefix < 0) {
- return null;
- }
- if (prefix >= filename.length()) {
- if (includeSeparator) {
- return getPrefix(filename); // add end slash if necessary
- } else {
- return filename;
- }
- }
- int index = indexOfLastSeparator(filename);
- if (index < 0) {
- return filename.substring(0, prefix);
- }
- int end = index + (includeSeparator ? 1 : 0);
- return filename.substring(0, end);
- }
-
- /**
- * Gets the name minus the path from a full filename.
- * <p>
- * This method will handle a file in either Unix or Windows format.
- * The text after the last forward or backslash is returned.
- * <pre>
- * a/b/c.txt --> c.txt
- * a.txt --> a.txt
- * a/b/c --> c
- * a/b/c/ --> ""
- * </pre>
- * <p>
- * The output will be the same irrespective of the machine that the code is running on.
- *
- * @param filename the filename to query, null returns null
- * @return the name of the file without the path, or an empty string if none exists
- */
- public static String getName(String filename) {
- if (filename == null) {
- return null;
- }
- int index = indexOfLastSeparator(filename);
- return filename.substring(index + 1);
- }
-
- /**
- * Gets the base name, minus the full path and extension, from a full filename.
- * <p>
- * This method will handle a file in either Unix or Windows format.
- * The text after the last forward or backslash and before the last dot is returned.
- * <pre>
- * a/b/c.txt --> c
- * a.txt --> a
- * a/b/c --> c
- * a/b/c/ --> ""
- * </pre>
- * <p>
- * The output will be the same irrespective of the machine that the code is running on.
- *
- * @param filename the filename to query, null returns null
- * @return the name of the file without the path, or an empty string if none exists
- */
- public static String getBaseName(String filename) {
- return removeExtension(getName(filename));
- }
-
- /**
- * Gets the extension of a filename.
- * <p>
- * This method returns the textual part of the filename after the last dot.
- * There must be no directory separator after the dot.
- * <pre>
- * foo.txt --> "txt"
- * a/b/c.jpg --> "jpg"
- * a/b.txt/c --> ""
- * a/b/c --> ""
- * </pre>
- * <p>
- * The output will be the same irrespective of the machine that the code is running on.
- *
- * @param filename the filename to retrieve the extension of.
- * @return the extension of the file or an empty string if none exists.
- */
- public static String getExtension(String filename) {
- if (filename == null) {
- return null;
- }
- int index = indexOfExtension(filename);
- if (index == -1) {
- return "";
- } else {
- return filename.substring(index + 1);
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Removes the extension from a filename.
- * <p>
- * This method returns the textual part of the filename before the last dot.
- * There must be no directory separator after the dot.
- * <pre>
- * foo.txt --> foo
- * a\b\c.jpg --> a\b\c
- * a\b\c --> a\b\c
- * a.b\c --> a.b\c
- * </pre>
- * <p>
- * The output will be the same irrespective of the machine that the code is running on.
- *
- * @param filename the filename to query, null returns null
- * @return the filename minus the extension
- */
- public static String removeExtension(String filename) {
- if (filename == null) {
- return null;
- }
- int index = indexOfExtension(filename);
- if (index == -1) {
- return filename;
- } else {
- return filename.substring(0, index);
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Checks whether two filenames are equal exactly.
- * <p>
- * No processing is performed on the filenames other than comparison,
- * thus this is merely a null-safe case-sensitive equals.
- *
- * @param filename1 the first filename to query, may be null
- * @param filename2 the second filename to query, may be null
- * @return true if the filenames are equal, null equals null
- * @see IOCase#SENSITIVE
- */
- public static boolean equals(String filename1, String filename2) {
- return equals(filename1, filename2, false, IOCase.SENSITIVE);
- }
-
- /**
- * Checks whether two filenames are equal using the case rules of the system.
- * <p>
- * No processing is performed on the filenames other than comparison.
- * The check is case-sensitive on Unix and case-insensitive on Windows.
- *
- * @param filename1 the first filename to query, may be null
- * @param filename2 the second filename to query, may be null
- * @return true if the filenames are equal, null equals null
- * @see IOCase#SYSTEM
- */
- public static boolean equalsOnSystem(String filename1, String filename2) {
- return equals(filename1, filename2, false, IOCase.SYSTEM);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Checks whether two filenames are equal after both have been normalized.
- * <p>
- * Both filenames are first passed to {@link #normalize(String)}.
- * The check is then performed in a case-sensitive manner.
- *
- * @param filename1 the first filename to query, may be null
- * @param filename2 the second filename to query, may be null
- * @return true if the filenames are equal, null equals null
- * @see IOCase#SENSITIVE
- */
- public static boolean equalsNormalized(String filename1, String filename2) {
- return equals(filename1, filename2, true, IOCase.SENSITIVE);
- }
-
- /**
- * Checks whether two filenames are equal after both have been normalized
- * and using the case rules of the system.
- * <p>
- * Both filenames are first passed to {@link #normalize(String)}.
- * The check is then performed case-sensitive on Unix and
- * case-insensitive on Windows.
- *
- * @param filename1 the first filename to query, may be null
- * @param filename2 the second filename to query, may be null
- * @return true if the filenames are equal, null equals null
- * @see IOCase#SYSTEM
- */
- public static boolean equalsNormalizedOnSystem(String filename1, String filename2) {
- return equals(filename1, filename2, true, IOCase.SYSTEM);
- }
-
- /**
- * Checks whether two filenames are equal, optionally normalizing and providing
- * control over the case-sensitivity.
- *
- * @param filename1 the first filename to query, may be null
- * @param filename2 the second filename to query, may be null
- * @param normalized whether to normalize the filenames
- * @param caseSensitivity what case sensitivity rule to use, null means case-sensitive
- * @return true if the filenames are equal, null equals null
- * @since Commons IO 1.3
- */
- public static boolean equals(
- String filename1, String filename2,
- boolean normalized, IOCase caseSensitivity) {
-
- if (filename1 == null || filename2 == null) {
- return filename1 == filename2;
- }
- if (normalized) {
- filename1 = normalize(filename1);
- filename2 = normalize(filename2);
- if (filename1 == null || filename2 == null) {
- throw new NullPointerException(
- "Error normalizing one or both of the file names");
- }
- }
- if (caseSensitivity == null) {
- caseSensitivity = IOCase.SENSITIVE;
- }
- return caseSensitivity.checkEquals(filename1, filename2);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Checks whether the extension of the filename is that specified.
- * <p>
- * This method obtains the extension as the textual part of the filename
- * after the last dot. There must be no directory separator after the dot.
- * The extension check is case-sensitive on all platforms.
- *
- * @param filename the filename to query, null returns false
- * @param extension the extension to check for, null or empty checks for no extension
- * @return true if the filename has the specified extension
- */
- public static boolean isExtension(String filename, String extension) {
- if (filename == null) {
- return false;
- }
- if (extension == null || extension.length() == 0) {
- return (indexOfExtension(filename) == -1);
- }
- String fileExt = getExtension(filename);
- return fileExt.equals(extension);
- }
-
- /**
- * Checks whether the extension of the filename is one of those specified.
- * <p>
- * This method obtains the extension as the textual part of the filename
- * after the last dot. There must be no directory separator after the dot.
- * The extension check is case-sensitive on all platforms.
- *
- * @param filename the filename to query, null returns false
- * @param extensions the extensions to check for, null checks for no extension
- * @return true if the filename is one of the extensions
- */
- public static boolean isExtension(String filename, String[] extensions) {
- if (filename == null) {
- return false;
- }
- if (extensions == null || extensions.length == 0) {
- return (indexOfExtension(filename) == -1);
- }
- String fileExt = getExtension(filename);
- for (int i = 0; i < extensions.length; i++) {
- if (fileExt.equals(extensions[i])) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Checks whether the extension of the filename is one of those specified.
- * <p>
- * This method obtains the extension as the textual part of the filename
- * after the last dot. There must be no directory separator after the dot.
- * The extension check is case-sensitive on all platforms.
- *
- * @param filename the filename to query, null returns false
- * @param extensions the extensions to check for, null checks for no extension
- * @return true if the filename is one of the extensions
- */
- public static boolean isExtension(String filename, Collection<String> extensions) {
- if (filename == null) {
- return false;
- }
- if (extensions == null || extensions.isEmpty()) {
- return (indexOfExtension(filename) == -1);
- }
- String fileExt = getExtension(filename);
- for (Iterator<String> it = extensions.iterator(); it.hasNext();) {
- if (fileExt.equals(it.next())) {
- return true;
- }
- }
- return false;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Checks a filename to see if it matches the specified wildcard matcher,
- * always testing case-sensitive.
- * <p>
- * The wildcard matcher uses the characters '?' and '*' to represent a
- * single or multiple wildcard characters.
- * This is the same as often found on Dos/Unix command lines.
- * The check is case-sensitive always.
- * <pre>
- * wildcardMatch("c.txt", "*.txt") --> true
- * wildcardMatch("c.txt", "*.jpg") --> false
- * wildcardMatch("a/b/c.txt", "a/b/*") --> true
- * wildcardMatch("c.txt", "*.???") --> true
- * wildcardMatch("c.txt", "*.????") --> false
- * </pre>
- *
- * @param filename the filename to match on
- * @param wildcardMatcher the wildcard string to match against
- * @return true if the filename matches the wilcard string
- * @see IOCase#SENSITIVE
- */
- public static boolean wildcardMatch(String filename, String wildcardMatcher) {
- return wildcardMatch(filename, wildcardMatcher, IOCase.SENSITIVE);
- }
-
- /**
- * Checks a filename to see if it matches the specified wildcard matcher
- * using the case rules of the system.
- * <p>
- * The wildcard matcher uses the characters '?' and '*' to represent a
- * single or multiple wildcard characters.
- * This is the same as often found on Dos/Unix command lines.
- * The check is case-sensitive on Unix and case-insensitive on Windows.
- * <pre>
- * wildcardMatch("c.txt", "*.txt") --> true
- * wildcardMatch("c.txt", "*.jpg") --> false
- * wildcardMatch("a/b/c.txt", "a/b/*") --> true
- * wildcardMatch("c.txt", "*.???") --> true
- * wildcardMatch("c.txt", "*.????") --> false
- * </pre>
- *
- * @param filename the filename to match on
- * @param wildcardMatcher the wildcard string to match against
- * @return true if the filename matches the wilcard string
- * @see IOCase#SYSTEM
- */
- public static boolean wildcardMatchOnSystem(String filename, String wildcardMatcher) {
- return wildcardMatch(filename, wildcardMatcher, IOCase.SYSTEM);
- }
-
- /**
- * Checks a filename to see if it matches the specified wildcard matcher
- * allowing control over case-sensitivity.
- * <p>
- * The wildcard matcher uses the characters '?' and '*' to represent a
- * single or multiple wildcard characters.
- *
- * @param filename the filename to match on
- * @param wildcardMatcher the wildcard string to match against
- * @param caseSensitivity what case sensitivity rule to use, null means case-sensitive
- * @return true if the filename matches the wilcard string
- * @since Commons IO 1.3
- */
- public static boolean wildcardMatch(String filename, String wildcardMatcher, IOCase caseSensitivity) {
- if (filename == null && wildcardMatcher == null) {
- return true;
- }
- if (filename == null || wildcardMatcher == null) {
- return false;
- }
- if (caseSensitivity == null) {
- caseSensitivity = IOCase.SENSITIVE;
- }
- filename = caseSensitivity.convertCase(filename);
- wildcardMatcher = caseSensitivity.convertCase(wildcardMatcher);
- String[] wcs = splitOnTokens(wildcardMatcher);
- boolean anyChars = false;
- int textIdx = 0;
- int wcsIdx = 0;
- Stack<int[]> backtrack = new Stack<int[]>();
-
- // loop around a backtrack stack, to handle complex * matching
- do {
- if (backtrack.size() > 0) {
- int[] array = backtrack.pop();
- wcsIdx = array[0];
- textIdx = array[1];
- anyChars = true;
- }
-
- // loop whilst tokens and text left to process
- while (wcsIdx < wcs.length) {
-
- if (wcs[wcsIdx].equals("?")) {
- // ? so move to next text char
- textIdx++;
- anyChars = false;
-
- } else if (wcs[wcsIdx].equals("*")) {
- // set any chars status
- anyChars = true;
- if (wcsIdx == wcs.length - 1) {
- textIdx = filename.length();
- }
-
- } else {
- // matching text token
- if (anyChars) {
- // any chars then try to locate text token
- textIdx = filename.indexOf(wcs[wcsIdx], textIdx);
- if (textIdx == -1) {
- // token not found
- break;
- }
- int repeat = filename.indexOf(wcs[wcsIdx], textIdx + 1);
- if (repeat >= 0) {
- backtrack.push(new int[] {wcsIdx, repeat});
- }
- } else {
- // matching from current position
- if (!filename.startsWith(wcs[wcsIdx], textIdx)) {
- // couldnt match token
- break;
- }
- }
-
- // matched text token, move text index to end of matched token
- textIdx += wcs[wcsIdx].length();
- anyChars = false;
- }
-
- wcsIdx++;
- }
-
- // full match
- if (wcsIdx == wcs.length && textIdx == filename.length()) {
- return true;
- }
-
- } while (backtrack.size() > 0);
-
- return false;
- }
-
- /**
- * Splits a string into a number of tokens.
- *
- * @param text the text to split
- * @return the tokens, never null
- */
- static String[] splitOnTokens(String text) {
- // used by wildcardMatch
- // package level so a unit test may run on this
-
- if (text.indexOf("?") == -1 && text.indexOf("*") == -1) {
- return new String[] { text };
- }
-
- char[] array = text.toCharArray();
- ArrayList<String> list = new ArrayList<String>();
- StringBuffer buffer = new StringBuffer();
- for (int i = 0; i < array.length; i++) {
- if (array[i] == '?' || array[i] == '*') {
- if (buffer.length() != 0) {
- list.add(buffer.toString());
- buffer.setLength(0);
- }
- if (array[i] == '?') {
- list.add("?");
- } else if (list.size() == 0 ||
- (i > 0 && list.get(list.size() - 1).equals("*") == false)) {
- list.add("*");
- }
- } else {
- buffer.append(array[i]);
- }
- }
- if (buffer.length() != 0) {
- list.add(buffer.toString());
- }
-
- return list.toArray( new String[ list.size() ] );
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/HexDump.java b/emailcommon/src/org/apache/commons/io/HexDump.java
deleted file mode 100644
index b0d468d18..000000000
--- a/emailcommon/src/org/apache/commons/io/HexDump.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * Dumps data in hexadecimal format.
- * <p>
- * Provides a single function to take an array of bytes and display it
- * in hexadecimal form.
- * <p>
- * Origin of code: POI.
- *
- * @author Scott Sanders
- * @author Marc Johnson
- * @version $Id: HexDump.java 596667 2007-11-20 13:50:14Z niallp $
- */
-public class HexDump {
-
- /**
- * Instances should NOT be constructed in standard programming.
- */
- public HexDump() {
- super();
- }
-
- /**
- * Dump an array of bytes to an OutputStream.
- *
- * @param data the byte array to be dumped
- * @param offset its offset, whatever that might mean
- * @param stream the OutputStream to which the data is to be
- * written
- * @param index initial index into the byte array
- *
- * @throws IOException is thrown if anything goes wrong writing
- * the data to stream
- * @throws ArrayIndexOutOfBoundsException if the index is
- * outside the data array's bounds
- * @throws IllegalArgumentException if the output stream is null
- */
-
- public static void dump(byte[] data, long offset,
- OutputStream stream, int index)
- throws IOException, ArrayIndexOutOfBoundsException,
- IllegalArgumentException {
-
- if ((index < 0) || (index >= data.length)) {
- throw new ArrayIndexOutOfBoundsException(
- "illegal index: " + index + " into array of length "
- + data.length);
- }
- if (stream == null) {
- throw new IllegalArgumentException("cannot write to nullstream");
- }
- long display_offset = offset + index;
- StringBuffer buffer = new StringBuffer(74);
-
- for (int j = index; j < data.length; j += 16) {
- int chars_read = data.length - j;
-
- if (chars_read > 16) {
- chars_read = 16;
- }
- dump(buffer, display_offset).append(' ');
- for (int k = 0; k < 16; k++) {
- if (k < chars_read) {
- dump(buffer, data[k + j]);
- } else {
- buffer.append(" ");
- }
- buffer.append(' ');
- }
- for (int k = 0; k < chars_read; k++) {
- if ((data[k + j] >= ' ') && (data[k + j] < 127)) {
- buffer.append((char) data[k + j]);
- } else {
- buffer.append('.');
- }
- }
- buffer.append(EOL);
- stream.write(buffer.toString().getBytes());
- stream.flush();
- buffer.setLength(0);
- display_offset += chars_read;
- }
- }
-
- /**
- * The line-separator (initializes to "line.separator" system property.
- */
- public static final String EOL =
- System.getProperty("line.separator");
- private static final char[] _hexcodes =
- {
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- 'A', 'B', 'C', 'D', 'E', 'F'
- };
- private static final int[] _shifts =
- {
- 28, 24, 20, 16, 12, 8, 4, 0
- };
-
- /**
- * Dump a long value into a StringBuffer.
- *
- * @param _lbuffer the StringBuffer to dump the value in
- * @param value the long value to be dumped
- * @return StringBuffer containing the dumped value.
- */
- private static StringBuffer dump(StringBuffer _lbuffer, long value) {
- for (int j = 0; j < 8; j++) {
- _lbuffer
- .append(_hexcodes[((int) (value >> _shifts[j])) & 15]);
- }
- return _lbuffer;
- }
-
- /**
- * Dump a byte value into a StringBuffer.
- *
- * @param _cbuffer the StringBuffer to dump the value in
- * @param value the byte value to be dumped
- * @return StringBuffer containing the dumped value.
- */
- private static StringBuffer dump(StringBuffer _cbuffer, byte value) {
- for (int j = 0; j < 2; j++) {
- _cbuffer.append(_hexcodes[(value >> _shifts[j + 6]) & 15]);
- }
- return _cbuffer;
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/IOCase.java b/emailcommon/src/org/apache/commons/io/IOCase.java
deleted file mode 100644
index 4230f450d..000000000
--- a/emailcommon/src/org/apache/commons/io/IOCase.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io;
-
-import java.io.Serializable;
-
-/**
- * Enumeration of IO case sensitivity.
- * <p>
- * Different filing systems have different rules for case-sensitivity.
- * Windows is case-insensitive, Unix is case-sensitive.
- * <p>
- * This class captures that difference, providing an enumeration to
- * control how filename comparisons should be performed. It also provides
- * methods that use the enumeration to perform comparisons.
- * <p>
- * Wherever possible, you should use the <code>check</code> methods in this
- * class to compare filenames.
- *
- * @author Stephen Colebourne
- * @version $Id: IOCase.java 606345 2007-12-21 23:43:01Z ggregory $
- * @since Commons IO 1.3
- */
-public final class IOCase implements Serializable {
-
- /**
- * The constant for case sensitive regardless of operating system.
- */
- public static final IOCase SENSITIVE = new IOCase("Sensitive", true);
-
- /**
- * The constant for case insensitive regardless of operating system.
- */
- public static final IOCase INSENSITIVE = new IOCase("Insensitive", false);
-
- /**
- * The constant for case sensitivity determined by the current operating system.
- * Windows is case-insensitive when comparing filenames, Unix is case-sensitive.
- * <p>
- * If you derialize this constant of Windows, and deserialize on Unix, or vice
- * versa, then the value of the case-sensitivity flag will change.
- */
- public static final IOCase SYSTEM = new IOCase("System", !FilenameUtils.isSystemWindows());
-
- /** Serialization version. */
- private static final long serialVersionUID = -6343169151696340687L;
-
- /** The enumeration name. */
- private final String name;
-
- /** The sensitivity flag. */
- private final transient boolean sensitive;
-
- //-----------------------------------------------------------------------
- /**
- * Factory method to create an IOCase from a name.
- *
- * @param name the name to find
- * @return the IOCase object
- * @throws IllegalArgumentException if the name is invalid
- */
- public static IOCase forName(String name) {
- if (IOCase.SENSITIVE.name.equals(name)){
- return IOCase.SENSITIVE;
- }
- if (IOCase.INSENSITIVE.name.equals(name)){
- return IOCase.INSENSITIVE;
- }
- if (IOCase.SYSTEM.name.equals(name)){
- return IOCase.SYSTEM;
- }
- throw new IllegalArgumentException("Invalid IOCase name: " + name);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Private constructor.
- *
- * @param name the name
- * @param sensitive the sensitivity
- */
- private IOCase(String name, boolean sensitive) {
- this.name = name;
- this.sensitive = sensitive;
- }
-
- /**
- * Replaces the enumeration from the stream with a real one.
- * This ensures that the correct flag is set for SYSTEM.
- *
- * @return the resolved object
- */
- private Object readResolve() {
- return forName(name);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Gets the name of the constant.
- *
- * @return the name of the constant
- */
- public String getName() {
- return name;
- }
-
- /**
- * Does the object represent case sensitive comparison.
- *
- * @return true if case sensitive
- */
- public boolean isCaseSensitive() {
- return sensitive;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Compares two strings using the case-sensitivity rule.
- * <p>
- * This method mimics {@link String#compareTo} but takes case-sensitivity
- * into account.
- *
- * @param str1 the first string to compare, not null
- * @param str2 the second string to compare, not null
- * @return true if equal using the case rules
- * @throws NullPointerException if either string is null
- */
- public int checkCompareTo(String str1, String str2) {
- if (str1 == null || str2 == null) {
- throw new NullPointerException("The strings must not be null");
- }
- return sensitive ? str1.compareTo(str2) : str1.compareToIgnoreCase(str2);
- }
-
- /**
- * Compares two strings using the case-sensitivity rule.
- * <p>
- * This method mimics {@link String#equals} but takes case-sensitivity
- * into account.
- *
- * @param str1 the first string to compare, not null
- * @param str2 the second string to compare, not null
- * @return true if equal using the case rules
- * @throws NullPointerException if either string is null
- */
- public boolean checkEquals(String str1, String str2) {
- if (str1 == null || str2 == null) {
- throw new NullPointerException("The strings must not be null");
- }
- return sensitive ? str1.equals(str2) : str1.equalsIgnoreCase(str2);
- }
-
- /**
- * Checks if one string starts with another using the case-sensitivity rule.
- * <p>
- * This method mimics {@link String#startsWith(String)} but takes case-sensitivity
- * into account.
- *
- * @param str the string to check, not null
- * @param start the start to compare against, not null
- * @return true if equal using the case rules
- * @throws NullPointerException if either string is null
- */
- public boolean checkStartsWith(String str, String start) {
- return str.regionMatches(!sensitive, 0, start, 0, start.length());
- }
-
- /**
- * Checks if one string ends with another using the case-sensitivity rule.
- * <p>
- * This method mimics {@link String#endsWith} but takes case-sensitivity
- * into account.
- *
- * @param str the string to check, not null
- * @param end the end to compare against, not null
- * @return true if equal using the case rules
- * @throws NullPointerException if either string is null
- */
- public boolean checkEndsWith(String str, String end) {
- int endLen = end.length();
- return str.regionMatches(!sensitive, str.length() - endLen, end, 0, endLen);
- }
-
- /**
- * Checks if one string contains another at a specific index using the case-sensitivity rule.
- * <p>
- * This method mimics parts of {@link String#regionMatches(boolean, int, String, int, int)}
- * but takes case-sensitivity into account.
- *
- * @param str the string to check, not null
- * @param strStartIndex the index to start at in str
- * @param search the start to search for, not null
- * @return true if equal using the case rules
- * @throws NullPointerException if either string is null
- */
- public boolean checkRegionMatches(String str, int strStartIndex, String search) {
- return str.regionMatches(!sensitive, strStartIndex, search, 0, search.length());
- }
-
- /**
- * Converts the case of the input String to a standard format.
- * Subsequent operations can then use standard String methods.
- *
- * @param str the string to convert, null returns null
- * @return the lower-case version if case-insensitive
- */
- String convertCase(String str) {
- if (str == null) {
- return null;
- }
- return sensitive ? str : str.toLowerCase();
- }
-
- //-----------------------------------------------------------------------
- /**
- * Gets a string describing the sensitivity.
- *
- * @return a string describing the sensitivity
- */
- public String toString() {
- return name;
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/IOExceptionWithCause.java b/emailcommon/src/org/apache/commons/io/IOExceptionWithCause.java
deleted file mode 100644
index a15815a22..000000000
--- a/emailcommon/src/org/apache/commons/io/IOExceptionWithCause.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.io;
-
-import java.io.IOException;
-
-/**
- * Subclasses IOException with the {@link Throwable} constructors missing before Java 6. If you are using Java 6,
- * consider this class deprecated and use {@link IOException}.
- *
- * @author <a href="http://commons.apache.org/io/">Apache Commons IO</a>
- * @version $Id$
- * @since Commons IO 1.4
- */
-public class IOExceptionWithCause extends IOException {
-
- /**
- * Defines the serial version UID.
- */
- private static final long serialVersionUID = 1L;
-
- /**
- * Constructs a new instance with the given message and cause.
- * <p>
- * As specified in {@link Throwable}, the message in the given <code>cause</code> is not used in this instance's
- * message.
- * </p>
- *
- * @param message
- * the message (see {@link #getMessage()})
- * @param cause
- * the cause (see {@link #getCause()}). A <code>null</code> value is allowed.
- */
- public IOExceptionWithCause(String message, Throwable cause) {
- super(message);
- this.initCause(cause);
- }
-
- /**
- * Constructs a new instance with the given cause.
- * <p>
- * The message is set to <code>cause==null ? null : cause.toString()</code>, which by default contains the class
- * and message of <code>cause</code>. This constructor is useful for call sites that just wrap another throwable.
- * </p>
- *
- * @param cause
- * the cause (see {@link #getCause()}). A <code>null</code> value is allowed.
- */
- public IOExceptionWithCause(Throwable cause) {
- super(cause == null ? null : cause.toString());
- this.initCause(cause);
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/IOUtils.java b/emailcommon/src/org/apache/commons/io/IOUtils.java
deleted file mode 100644
index 3f6c65c13..000000000
--- a/emailcommon/src/org/apache/commons/io/IOUtils.java
+++ /dev/null
@@ -1,1274 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.CharArrayWriter;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.commons.io.output.ByteArrayOutputStream;
-
-/**
- * General IO stream manipulation utilities.
- * <p>
- * This class provides static utility methods for input/output operations.
- * <ul>
- * <li>closeQuietly - these methods close a stream ignoring nulls and exceptions
- * <li>toXxx/read - these methods read data from a stream
- * <li>write - these methods write data to a stream
- * <li>copy - these methods copy all the data from one stream to another
- * <li>contentEquals - these methods compare the content of two streams
- * </ul>
- * <p>
- * The byte-to-char methods and char-to-byte methods involve a conversion step.
- * Two methods are provided in each case, one that uses the platform default
- * encoding and the other which allows you to specify an encoding. You are
- * encouraged to always specify an encoding because relying on the platform
- * default can lead to unexpected results, for example when moving from
- * development to production.
- * <p>
- * All the methods in this class that read a stream are buffered internally.
- * This means that there is no cause to use a <code>BufferedInputStream</code>
- * or <code>BufferedReader</code>. The default buffer size of 4K has been shown
- * to be efficient in tests.
- * <p>
- * Wherever possible, the methods in this class do <em>not</em> flush or close
- * the stream. This is to avoid making non-portable assumptions about the
- * streams' origin and further use. Thus the caller is still responsible for
- * closing streams after use.
- * <p>
- * Origin of code: Excalibur.
- *
- * @author Peter Donald
- * @author Jeff Turner
- * @author Matthew Hawthorne
- * @author Stephen Colebourne
- * @author Gareth Davis
- * @author Ian Springer
- * @author Niall Pemberton
- * @author Sandy McArthur
- * @version $Id: IOUtils.java 481854 2006-12-03 18:30:07Z scolebourne $
- */
-public class IOUtils {
- // NOTE: This class is focussed on InputStream, OutputStream, Reader and
- // Writer. Each method should take at least one of these as a parameter,
- // or return one of them.
-
- /**
- * The Unix directory separator character.
- */
- public static final char DIR_SEPARATOR_UNIX = '/';
- /**
- * The Windows directory separator character.
- */
- public static final char DIR_SEPARATOR_WINDOWS = '\\';
- /**
- * The system directory separator character.
- */
- public static final char DIR_SEPARATOR = File.separatorChar;
- /**
- * The Unix line separator string.
- */
- public static final String LINE_SEPARATOR_UNIX = "\n";
- /**
- * The Windows line separator string.
- */
- public static final String LINE_SEPARATOR_WINDOWS = "\r\n";
- /**
- * The system line separator string.
- */
- public static final String LINE_SEPARATOR;
- static {
- // avoid security issues
- StringWriter buf = new StringWriter(4);
- PrintWriter out = new PrintWriter(buf);
- out.println();
- LINE_SEPARATOR = buf.toString();
- }
-
- /**
- * The default buffer size to use.
- */
- private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
-
- /**
- * Instances should NOT be constructed in standard programming.
- */
- public IOUtils() {
- super();
- }
-
- //-----------------------------------------------------------------------
- /**
- * Unconditionally close an <code>Reader</code>.
- * <p>
- * Equivalent to {@link Reader#close()}, except any exceptions will be ignored.
- * This is typically used in finally blocks.
- *
- * @param input the Reader to close, may be null or already closed
- */
- public static void closeQuietly(Reader input) {
- try {
- if (input != null) {
- input.close();
- }
- } catch (IOException ioe) {
- // ignore
- }
- }
-
- /**
- * Unconditionally close a <code>Writer</code>.
- * <p>
- * Equivalent to {@link Writer#close()}, except any exceptions will be ignored.
- * This is typically used in finally blocks.
- *
- * @param output the Writer to close, may be null or already closed
- */
- public static void closeQuietly(Writer output) {
- try {
- if (output != null) {
- output.close();
- }
- } catch (IOException ioe) {
- // ignore
- }
- }
-
- /**
- * Unconditionally close an <code>InputStream</code>.
- * <p>
- * Equivalent to {@link InputStream#close()}, except any exceptions will be ignored.
- * This is typically used in finally blocks.
- *
- * @param input the InputStream to close, may be null or already closed
- */
- public static void closeQuietly(InputStream input) {
- try {
- if (input != null) {
- input.close();
- }
- } catch (IOException ioe) {
- // ignore
- }
- }
-
- /**
- * Unconditionally close an <code>OutputStream</code>.
- * <p>
- * Equivalent to {@link OutputStream#close()}, except any exceptions will be ignored.
- * This is typically used in finally blocks.
- *
- * @param output the OutputStream to close, may be null or already closed
- */
- public static void closeQuietly(OutputStream output) {
- try {
- if (output != null) {
- output.close();
- }
- } catch (IOException ioe) {
- // ignore
- }
- }
-
- // read toByteArray
- //-----------------------------------------------------------------------
- /**
- * Get the contents of an <code>InputStream</code> as a <code>byte[]</code>.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedInputStream</code>.
- *
- * @param input the <code>InputStream</code> to read from
- * @return the requested byte array
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs
- */
- public static byte[] toByteArray(InputStream input) throws IOException {
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- copy(input, output);
- return output.toByteArray();
- }
-
- /**
- * Get the contents of a <code>Reader</code> as a <code>byte[]</code>
- * using the default character encoding of the platform.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedReader</code>.
- *
- * @param input the <code>Reader</code> to read from
- * @return the requested byte array
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs
- */
- public static byte[] toByteArray(Reader input) throws IOException {
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- copy(input, output);
- return output.toByteArray();
- }
-
- /**
- * Get the contents of a <code>Reader</code> as a <code>byte[]</code>
- * using the specified character encoding.
- * <p>
- * Character encoding names can be found at
- * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedReader</code>.
- *
- * @param input the <code>Reader</code> to read from
- * @param encoding the encoding to use, null means platform default
- * @return the requested byte array
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static byte[] toByteArray(Reader input, String encoding)
- throws IOException {
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- copy(input, output, encoding);
- return output.toByteArray();
- }
-
- /**
- * Get the contents of a <code>String</code> as a <code>byte[]</code>
- * using the default character encoding of the platform.
- * <p>
- * This is the same as {@link String#getBytes()}.
- *
- * @param input the <code>String</code> to convert
- * @return the requested byte array
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs (never occurs)
- * @deprecated Use {@link String#getBytes()}
- */
- public static byte[] toByteArray(String input) throws IOException {
- return input.getBytes();
- }
-
- // read char[]
- //-----------------------------------------------------------------------
- /**
- * Get the contents of an <code>InputStream</code> as a character array
- * using the default character encoding of the platform.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedInputStream</code>.
- *
- * @param is the <code>InputStream</code> to read from
- * @return the requested character array
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static char[] toCharArray(InputStream is) throws IOException {
- CharArrayWriter output = new CharArrayWriter();
- copy(is, output);
- return output.toCharArray();
- }
-
- /**
- * Get the contents of an <code>InputStream</code> as a character array
- * using the specified character encoding.
- * <p>
- * Character encoding names can be found at
- * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedInputStream</code>.
- *
- * @param is the <code>InputStream</code> to read from
- * @param encoding the encoding to use, null means platform default
- * @return the requested character array
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static char[] toCharArray(InputStream is, String encoding)
- throws IOException {
- CharArrayWriter output = new CharArrayWriter();
- copy(is, output, encoding);
- return output.toCharArray();
- }
-
- /**
- * Get the contents of a <code>Reader</code> as a character array.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedReader</code>.
- *
- * @param input the <code>Reader</code> to read from
- * @return the requested character array
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static char[] toCharArray(Reader input) throws IOException {
- CharArrayWriter sw = new CharArrayWriter();
- copy(input, sw);
- return sw.toCharArray();
- }
-
- // read toString
- //-----------------------------------------------------------------------
- /**
- * Get the contents of an <code>InputStream</code> as a String
- * using the default character encoding of the platform.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedInputStream</code>.
- *
- * @param input the <code>InputStream</code> to read from
- * @return the requested String
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs
- */
- public static String toString(InputStream input) throws IOException {
- StringWriter sw = new StringWriter();
- copy(input, sw);
- return sw.toString();
- }
-
- /**
- * Get the contents of an <code>InputStream</code> as a String
- * using the specified character encoding.
- * <p>
- * Character encoding names can be found at
- * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedInputStream</code>.
- *
- * @param input the <code>InputStream</code> to read from
- * @param encoding the encoding to use, null means platform default
- * @return the requested String
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs
- */
- public static String toString(InputStream input, String encoding)
- throws IOException {
- StringWriter sw = new StringWriter();
- copy(input, sw, encoding);
- return sw.toString();
- }
-
- /**
- * Get the contents of a <code>Reader</code> as a String.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedReader</code>.
- *
- * @param input the <code>Reader</code> to read from
- * @return the requested String
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs
- */
- public static String toString(Reader input) throws IOException {
- StringWriter sw = new StringWriter();
- copy(input, sw);
- return sw.toString();
- }
-
- /**
- * Get the contents of a <code>byte[]</code> as a String
- * using the default character encoding of the platform.
- *
- * @param input the byte array to read from
- * @return the requested String
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs (never occurs)
- * @deprecated Use {@link String#String(byte[])}
- */
- public static String toString(byte[] input) throws IOException {
- return new String(input);
- }
-
- /**
- * Get the contents of a <code>byte[]</code> as a String
- * using the specified character encoding.
- * <p>
- * Character encoding names can be found at
- * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
- *
- * @param input the byte array to read from
- * @param encoding the encoding to use, null means platform default
- * @return the requested String
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs (never occurs)
- * @deprecated Use {@link String#String(byte[],String)}
- */
- public static String toString(byte[] input, String encoding)
- throws IOException {
- if (encoding == null) {
- return new String(input);
- } else {
- return new String(input, encoding);
- }
- }
-
- // readLines
- //-----------------------------------------------------------------------
- /**
- * Get the contents of an <code>InputStream</code> as a list of Strings,
- * one entry per line, using the default character encoding of the platform.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedInputStream</code>.
- *
- * @param input the <code>InputStream</code> to read from, not null
- * @return the list of Strings, never null
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static List<String> readLines(InputStream input) throws IOException {
- InputStreamReader reader = new InputStreamReader(input);
- return readLines(reader);
- }
-
- /**
- * Get the contents of an <code>InputStream</code> as a list of Strings,
- * one entry per line, using the specified character encoding.
- * <p>
- * Character encoding names can be found at
- * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedInputStream</code>.
- *
- * @param input the <code>InputStream</code> to read from, not null
- * @param encoding the encoding to use, null means platform default
- * @return the list of Strings, never null
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static List<String> readLines(InputStream input, String encoding) throws IOException {
- if (encoding == null) {
- return readLines(input);
- } else {
- InputStreamReader reader = new InputStreamReader(input, encoding);
- return readLines(reader);
- }
- }
-
- /**
- * Get the contents of a <code>Reader</code> as a list of Strings,
- * one entry per line.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedReader</code>.
- *
- * @param input the <code>Reader</code> to read from, not null
- * @return the list of Strings, never null
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static List<String> readLines(Reader input) throws IOException {
- BufferedReader reader = new BufferedReader(input);
- List<String> list = new ArrayList<String>();
- String line = reader.readLine();
- while (line != null) {
- list.add(line);
- line = reader.readLine();
- }
- return list;
- }
-
- // lineIterator
- //-----------------------------------------------------------------------
- /**
- * Return an Iterator for the lines in a <code>Reader</code>.
- * <p>
- * <code>LineIterator</code> holds a reference to the open
- * <code>Reader</code> specified here. When you have finished with the
- * iterator you should close the reader to free internal resources.
- * This can be done by closing the reader directly, or by calling
- * {@link LineIterator#close()} or {@link LineIterator#closeQuietly(LineIterator)}.
- * <p>
- * The recommended usage pattern is:
- * <pre>
- * try {
- * LineIterator it = IOUtils.lineIterator(reader);
- * while (it.hasNext()) {
- * String line = it.nextLine();
- * /// do something with line
- * }
- * } finally {
- * IOUtils.closeQuietly(reader);
- * }
- * </pre>
- *
- * @param reader the <code>Reader</code> to read from, not null
- * @return an Iterator of the lines in the reader, never null
- * @throws IllegalArgumentException if the reader is null
- * @since Commons IO 1.2
- */
- public static LineIterator lineIterator(Reader reader) {
- return new LineIterator(reader);
- }
-
- /**
- * Return an Iterator for the lines in an <code>InputStream</code>, using
- * the character encoding specified (or default encoding if null).
- * <p>
- * <code>LineIterator</code> holds a reference to the open
- * <code>InputStream</code> specified here. When you have finished with
- * the iterator you should close the stream to free internal resources.
- * This can be done by closing the stream directly, or by calling
- * {@link LineIterator#close()} or {@link LineIterator#closeQuietly(LineIterator)}.
- * <p>
- * The recommended usage pattern is:
- * <pre>
- * try {
- * LineIterator it = IOUtils.lineIterator(stream, "UTF-8");
- * while (it.hasNext()) {
- * String line = it.nextLine();
- * /// do something with line
- * }
- * } finally {
- * IOUtils.closeQuietly(stream);
- * }
- * </pre>
- *
- * @param input the <code>InputStream</code> to read from, not null
- * @param encoding the encoding to use, null means platform default
- * @return an Iterator of the lines in the reader, never null
- * @throws IllegalArgumentException if the input is null
- * @throws IOException if an I/O error occurs, such as if the encoding is invalid
- * @since Commons IO 1.2
- */
- public static LineIterator lineIterator(InputStream input, String encoding)
- throws IOException {
- Reader reader = null;
- if (encoding == null) {
- reader = new InputStreamReader(input);
- } else {
- reader = new InputStreamReader(input, encoding);
- }
- return new LineIterator(reader);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Convert the specified string to an input stream, encoded as bytes
- * using the default character encoding of the platform.
- *
- * @param input the string to convert
- * @return an input stream
- * @since Commons IO 1.1
- */
- public static InputStream toInputStream(String input) {
- byte[] bytes = input.getBytes();
- return new ByteArrayInputStream(bytes);
- }
-
- /**
- * Convert the specified string to an input stream, encoded as bytes
- * using the specified character encoding.
- * <p>
- * Character encoding names can be found at
- * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
- *
- * @param input the string to convert
- * @param encoding the encoding to use, null means platform default
- * @throws IOException if the encoding is invalid
- * @return an input stream
- * @since Commons IO 1.1
- */
- public static InputStream toInputStream(String input, String encoding) throws IOException {
- byte[] bytes = encoding != null ? input.getBytes(encoding) : input.getBytes();
- return new ByteArrayInputStream(bytes);
- }
-
- // write byte[]
- //-----------------------------------------------------------------------
- /**
- * Writes bytes from a <code>byte[]</code> to an <code>OutputStream</code>.
- *
- * @param data the byte array to write, do not modify during output,
- * null ignored
- * @param output the <code>OutputStream</code> to write to
- * @throws NullPointerException if output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void write(byte[] data, OutputStream output)
- throws IOException {
- if (data != null) {
- output.write(data);
- }
- }
-
- /**
- * Writes bytes from a <code>byte[]</code> to chars on a <code>Writer</code>
- * using the default character encoding of the platform.
- * <p>
- * This method uses {@link String#String(byte[])}.
- *
- * @param data the byte array to write, do not modify during output,
- * null ignored
- * @param output the <code>Writer</code> to write to
- * @throws NullPointerException if output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void write(byte[] data, Writer output) throws IOException {
- if (data != null) {
- output.write(new String(data));
- }
- }
-
- /**
- * Writes bytes from a <code>byte[]</code> to chars on a <code>Writer</code>
- * using the specified character encoding.
- * <p>
- * Character encoding names can be found at
- * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
- * <p>
- * This method uses {@link String#String(byte[], String)}.
- *
- * @param data the byte array to write, do not modify during output,
- * null ignored
- * @param output the <code>Writer</code> to write to
- * @param encoding the encoding to use, null means platform default
- * @throws NullPointerException if output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void write(byte[] data, Writer output, String encoding)
- throws IOException {
- if (data != null) {
- if (encoding == null) {
- write(data, output);
- } else {
- output.write(new String(data, encoding));
- }
- }
- }
-
- // write char[]
- //-----------------------------------------------------------------------
- /**
- * Writes chars from a <code>char[]</code> to a <code>Writer</code>
- * using the default character encoding of the platform.
- *
- * @param data the char array to write, do not modify during output,
- * null ignored
- * @param output the <code>Writer</code> to write to
- * @throws NullPointerException if output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void write(char[] data, Writer output) throws IOException {
- if (data != null) {
- output.write(data);
- }
- }
-
- /**
- * Writes chars from a <code>char[]</code> to bytes on an
- * <code>OutputStream</code>.
- * <p>
- * This method uses {@link String#String(char[])} and
- * {@link String#getBytes()}.
- *
- * @param data the char array to write, do not modify during output,
- * null ignored
- * @param output the <code>OutputStream</code> to write to
- * @throws NullPointerException if output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void write(char[] data, OutputStream output)
- throws IOException {
- if (data != null) {
- output.write(new String(data).getBytes());
- }
- }
-
- /**
- * Writes chars from a <code>char[]</code> to bytes on an
- * <code>OutputStream</code> using the specified character encoding.
- * <p>
- * Character encoding names can be found at
- * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
- * <p>
- * This method uses {@link String#String(char[])} and
- * {@link String#getBytes(String)}.
- *
- * @param data the char array to write, do not modify during output,
- * null ignored
- * @param output the <code>OutputStream</code> to write to
- * @param encoding the encoding to use, null means platform default
- * @throws NullPointerException if output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void write(char[] data, OutputStream output, String encoding)
- throws IOException {
- if (data != null) {
- if (encoding == null) {
- write(data, output);
- } else {
- output.write(new String(data).getBytes(encoding));
- }
- }
- }
-
- // write String
- //-----------------------------------------------------------------------
- /**
- * Writes chars from a <code>String</code> to a <code>Writer</code>.
- *
- * @param data the <code>String</code> to write, null ignored
- * @param output the <code>Writer</code> to write to
- * @throws NullPointerException if output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void write(String data, Writer output) throws IOException {
- if (data != null) {
- output.write(data);
- }
- }
-
- /**
- * Writes chars from a <code>String</code> to bytes on an
- * <code>OutputStream</code> using the default character encoding of the
- * platform.
- * <p>
- * This method uses {@link String#getBytes()}.
- *
- * @param data the <code>String</code> to write, null ignored
- * @param output the <code>OutputStream</code> to write to
- * @throws NullPointerException if output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void write(String data, OutputStream output)
- throws IOException {
- if (data != null) {
- output.write(data.getBytes());
- }
- }
-
- /**
- * Writes chars from a <code>String</code> to bytes on an
- * <code>OutputStream</code> using the specified character encoding.
- * <p>
- * Character encoding names can be found at
- * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
- * <p>
- * This method uses {@link String#getBytes(String)}.
- *
- * @param data the <code>String</code> to write, null ignored
- * @param output the <code>OutputStream</code> to write to
- * @param encoding the encoding to use, null means platform default
- * @throws NullPointerException if output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void write(String data, OutputStream output, String encoding)
- throws IOException {
- if (data != null) {
- if (encoding == null) {
- write(data, output);
- } else {
- output.write(data.getBytes(encoding));
- }
- }
- }
-
- // write StringBuffer
- //-----------------------------------------------------------------------
- /**
- * Writes chars from a <code>StringBuffer</code> to a <code>Writer</code>.
- *
- * @param data the <code>StringBuffer</code> to write, null ignored
- * @param output the <code>Writer</code> to write to
- * @throws NullPointerException if output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void write(StringBuffer data, Writer output)
- throws IOException {
- if (data != null) {
- output.write(data.toString());
- }
- }
-
- /**
- * Writes chars from a <code>StringBuffer</code> to bytes on an
- * <code>OutputStream</code> using the default character encoding of the
- * platform.
- * <p>
- * This method uses {@link String#getBytes()}.
- *
- * @param data the <code>StringBuffer</code> to write, null ignored
- * @param output the <code>OutputStream</code> to write to
- * @throws NullPointerException if output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void write(StringBuffer data, OutputStream output)
- throws IOException {
- if (data != null) {
- output.write(data.toString().getBytes());
- }
- }
-
- /**
- * Writes chars from a <code>StringBuffer</code> to bytes on an
- * <code>OutputStream</code> using the specified character encoding.
- * <p>
- * Character encoding names can be found at
- * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
- * <p>
- * This method uses {@link String#getBytes(String)}.
- *
- * @param data the <code>StringBuffer</code> to write, null ignored
- * @param output the <code>OutputStream</code> to write to
- * @param encoding the encoding to use, null means platform default
- * @throws NullPointerException if output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void write(StringBuffer data, OutputStream output,
- String encoding) throws IOException {
- if (data != null) {
- if (encoding == null) {
- write(data, output);
- } else {
- output.write(data.toString().getBytes(encoding));
- }
- }
- }
-
- // writeLines
- //-----------------------------------------------------------------------
- /**
- * Writes the <code>toString()</code> value of each item in a collection to
- * an <code>OutputStream</code> line by line, using the default character
- * encoding of the platform and the specified line ending.
- *
- * @param lines the lines to write, null entries produce blank lines
- * @param lineEnding the line separator to use, null is system default
- * @param output the <code>OutputStream</code> to write to, not null, not closed
- * @throws NullPointerException if the output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void writeLines(Collection<Object> lines, String lineEnding,
- OutputStream output) throws IOException {
- if (lines == null) {
- return;
- }
- if (lineEnding == null) {
- lineEnding = LINE_SEPARATOR;
- }
- for (Iterator<Object> it = lines.iterator(); it.hasNext(); ) {
- Object line = it.next();
- if (line != null) {
- output.write(line.toString().getBytes());
- }
- output.write(lineEnding.getBytes());
- }
- }
-
- /**
- * Writes the <code>toString()</code> value of each item in a collection to
- * an <code>OutputStream</code> line by line, using the specified character
- * encoding and the specified line ending.
- * <p>
- * Character encoding names can be found at
- * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
- *
- * @param lines the lines to write, null entries produce blank lines
- * @param lineEnding the line separator to use, null is system default
- * @param output the <code>OutputStream</code> to write to, not null, not closed
- * @param encoding the encoding to use, null means platform default
- * @throws NullPointerException if the output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void writeLines(Collection<Object> lines, String lineEnding,
- OutputStream output, String encoding) throws IOException {
- if (encoding == null) {
- writeLines(lines, lineEnding, output);
- } else {
- if (lines == null) {
- return;
- }
- if (lineEnding == null) {
- lineEnding = LINE_SEPARATOR;
- }
- for (Iterator<Object> it = lines.iterator(); it.hasNext(); ) {
- Object line = it.next();
- if (line != null) {
- output.write(line.toString().getBytes(encoding));
- }
- output.write(lineEnding.getBytes(encoding));
- }
- }
- }
-
- /**
- * Writes the <code>toString()</code> value of each item in a collection to
- * a <code>Writer</code> line by line, using the specified line ending.
- *
- * @param lines the lines to write, null entries produce blank lines
- * @param lineEnding the line separator to use, null is system default
- * @param writer the <code>Writer</code> to write to, not null, not closed
- * @throws NullPointerException if the input is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void writeLines(Collection<Object> lines, String lineEnding,
- Writer writer) throws IOException {
- if (lines == null) {
- return;
- }
- if (lineEnding == null) {
- lineEnding = LINE_SEPARATOR;
- }
- for (Iterator<Object> it = lines.iterator(); it.hasNext(); ) {
- Object line = it.next();
- if (line != null) {
- writer.write(line.toString());
- }
- writer.write(lineEnding);
- }
- }
-
- // copy from InputStream
- //-----------------------------------------------------------------------
- /**
- * Copy bytes from an <code>InputStream</code> to an
- * <code>OutputStream</code>.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedInputStream</code>.
- * <p>
- * Large streams (over 2GB) will return a bytes copied value of
- * <code>-1</code> after the copy has completed since the correct
- * number of bytes cannot be returned as an int. For large streams
- * use the <code>copyLarge(InputStream, OutputStream)</code> method.
- *
- * @param input the <code>InputStream</code> to read from
- * @param output the <code>OutputStream</code> to write to
- * @return the number of bytes copied
- * @throws NullPointerException if the input or output is null
- * @throws IOException if an I/O error occurs
- * @throws ArithmeticException if the byte count is too large
- * @since Commons IO 1.1
- */
- public static int copy(InputStream input, OutputStream output) throws IOException {
- long count = copyLarge(input, output);
- if (count > Integer.MAX_VALUE) {
- return -1;
- }
- return (int) count;
- }
-
- /**
- * Copy bytes from a large (over 2GB) <code>InputStream</code> to an
- * <code>OutputStream</code>.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedInputStream</code>.
- *
- * @param input the <code>InputStream</code> to read from
- * @param output the <code>OutputStream</code> to write to
- * @return the number of bytes copied
- * @throws NullPointerException if the input or output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.3
- */
- public static long copyLarge(InputStream input, OutputStream output)
- throws IOException {
- byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
- long count = 0;
- int n = 0;
- while (-1 != (n = input.read(buffer))) {
- output.write(buffer, 0, n);
- count += n;
- }
- return count;
- }
-
- /**
- * Copy bytes from an <code>InputStream</code> to chars on a
- * <code>Writer</code> using the default character encoding of the platform.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedInputStream</code>.
- * <p>
- * This method uses {@link InputStreamReader}.
- *
- * @param input the <code>InputStream</code> to read from
- * @param output the <code>Writer</code> to write to
- * @throws NullPointerException if the input or output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void copy(InputStream input, Writer output)
- throws IOException {
- InputStreamReader in = new InputStreamReader(input);
- copy(in, output);
- }
-
- /**
- * Copy bytes from an <code>InputStream</code> to chars on a
- * <code>Writer</code> using the specified character encoding.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedInputStream</code>.
- * <p>
- * Character encoding names can be found at
- * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
- * <p>
- * This method uses {@link InputStreamReader}.
- *
- * @param input the <code>InputStream</code> to read from
- * @param output the <code>Writer</code> to write to
- * @param encoding the encoding to use, null means platform default
- * @throws NullPointerException if the input or output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void copy(InputStream input, Writer output, String encoding)
- throws IOException {
- if (encoding == null) {
- copy(input, output);
- } else {
- InputStreamReader in = new InputStreamReader(input, encoding);
- copy(in, output);
- }
- }
-
- // copy from Reader
- //-----------------------------------------------------------------------
- /**
- * Copy chars from a <code>Reader</code> to a <code>Writer</code>.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedReader</code>.
- * <p>
- * Large streams (over 2GB) will return a chars copied value of
- * <code>-1</code> after the copy has completed since the correct
- * number of chars cannot be returned as an int. For large streams
- * use the <code>copyLarge(Reader, Writer)</code> method.
- *
- * @param input the <code>Reader</code> to read from
- * @param output the <code>Writer</code> to write to
- * @return the number of characters copied
- * @throws NullPointerException if the input or output is null
- * @throws IOException if an I/O error occurs
- * @throws ArithmeticException if the character count is too large
- * @since Commons IO 1.1
- */
- public static int copy(Reader input, Writer output) throws IOException {
- long count = copyLarge(input, output);
- if (count > Integer.MAX_VALUE) {
- return -1;
- }
- return (int) count;
- }
-
- /**
- * Copy chars from a large (over 2GB) <code>Reader</code> to a <code>Writer</code>.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedReader</code>.
- *
- * @param input the <code>Reader</code> to read from
- * @param output the <code>Writer</code> to write to
- * @return the number of characters copied
- * @throws NullPointerException if the input or output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.3
- */
- public static long copyLarge(Reader input, Writer output) throws IOException {
- char[] buffer = new char[DEFAULT_BUFFER_SIZE];
- long count = 0;
- int n = 0;
- while (-1 != (n = input.read(buffer))) {
- output.write(buffer, 0, n);
- count += n;
- }
- return count;
- }
-
- /**
- * Copy chars from a <code>Reader</code> to bytes on an
- * <code>OutputStream</code> using the default character encoding of the
- * platform, and calling flush.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedReader</code>.
- * <p>
- * Due to the implementation of OutputStreamWriter, this method performs a
- * flush.
- * <p>
- * This method uses {@link OutputStreamWriter}.
- *
- * @param input the <code>Reader</code> to read from
- * @param output the <code>OutputStream</code> to write to
- * @throws NullPointerException if the input or output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void copy(Reader input, OutputStream output)
- throws IOException {
- OutputStreamWriter out = new OutputStreamWriter(output);
- copy(input, out);
- // XXX Unless anyone is planning on rewriting OutputStreamWriter, we
- // have to flush here.
- out.flush();
- }
-
- /**
- * Copy chars from a <code>Reader</code> to bytes on an
- * <code>OutputStream</code> using the specified character encoding, and
- * calling flush.
- * <p>
- * This method buffers the input internally, so there is no need to use a
- * <code>BufferedReader</code>.
- * <p>
- * Character encoding names can be found at
- * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
- * <p>
- * Due to the implementation of OutputStreamWriter, this method performs a
- * flush.
- * <p>
- * This method uses {@link OutputStreamWriter}.
- *
- * @param input the <code>Reader</code> to read from
- * @param output the <code>OutputStream</code> to write to
- * @param encoding the encoding to use, null means platform default
- * @throws NullPointerException if the input or output is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static void copy(Reader input, OutputStream output, String encoding)
- throws IOException {
- if (encoding == null) {
- copy(input, output);
- } else {
- OutputStreamWriter out = new OutputStreamWriter(output, encoding);
- copy(input, out);
- // XXX Unless anyone is planning on rewriting OutputStreamWriter,
- // we have to flush here.
- out.flush();
- }
- }
-
- // content equals
- //-----------------------------------------------------------------------
- /**
- * Compare the contents of two Streams to determine if they are equal or
- * not.
- * <p>
- * This method buffers the input internally using
- * <code>BufferedInputStream</code> if they are not already buffered.
- *
- * @param input1 the first stream
- * @param input2 the second stream
- * @return true if the content of the streams are equal or they both don't
- * exist, false otherwise
- * @throws NullPointerException if either input is null
- * @throws IOException if an I/O error occurs
- */
- public static boolean contentEquals(InputStream input1, InputStream input2)
- throws IOException {
- if (!(input1 instanceof BufferedInputStream)) {
- input1 = new BufferedInputStream(input1);
- }
- if (!(input2 instanceof BufferedInputStream)) {
- input2 = new BufferedInputStream(input2);
- }
-
- int ch = input1.read();
- while (-1 != ch) {
- int ch2 = input2.read();
- if (ch != ch2) {
- return false;
- }
- ch = input1.read();
- }
-
- int ch2 = input2.read();
- return (ch2 == -1);
- }
-
- /**
- * Compare the contents of two Readers to determine if they are equal or
- * not.
- * <p>
- * This method buffers the input internally using
- * <code>BufferedReader</code> if they are not already buffered.
- *
- * @param input1 the first reader
- * @param input2 the second reader
- * @return true if the content of the readers are equal or they both don't
- * exist, false otherwise
- * @throws NullPointerException if either input is null
- * @throws IOException if an I/O error occurs
- * @since Commons IO 1.1
- */
- public static boolean contentEquals(Reader input1, Reader input2)
- throws IOException {
- if (!(input1 instanceof BufferedReader)) {
- input1 = new BufferedReader(input1);
- }
- if (!(input2 instanceof BufferedReader)) {
- input2 = new BufferedReader(input2);
- }
-
- int ch = input1.read();
- while (-1 != ch) {
- int ch2 = input2.read();
- if (ch != ch2) {
- return false;
- }
- ch = input1.read();
- }
-
- int ch2 = input2.read();
- return (ch2 == -1);
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/LineIterator.java b/emailcommon/src/org/apache/commons/io/LineIterator.java
deleted file mode 100644
index eac47d23a..000000000
--- a/emailcommon/src/org/apache/commons/io/LineIterator.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * An Iterator over the lines in a <code>Reader</code>.
- * <p>
- * <code>LineIterator</code> holds a reference to an open <code>Reader</code>.
- * When you have finished with the iterator you should close the reader
- * to free internal resources. This can be done by closing the reader directly,
- * or by calling the {@link #close()} or {@link #closeQuietly(LineIterator)}
- * method on the iterator.
- * <p>
- * The recommended usage pattern is:
- * <pre>
- * LineIterator it = FileUtils.lineIterator(file, "UTF-8");
- * try {
- * while (it.hasNext()) {
- * String line = it.nextLine();
- * /// do something with line
- * }
- * } finally {
- * LineIterator.closeQuietly(iterator);
- * }
- * </pre>
- *
- * @author Niall Pemberton
- * @author Stephen Colebourne
- * @author Sandy McArthur
- * @version $Id: LineIterator.java 437567 2006-08-28 06:39:07Z bayard $
- * @since Commons IO 1.2
- */
-public class LineIterator implements Iterator {
-
- /** The reader that is being read. */
- private final BufferedReader bufferedReader;
- /** The current line. */
- private String cachedLine;
- /** A flag indicating if the iterator has been fully read. */
- private boolean finished = false;
-
- /**
- * Constructs an iterator of the lines for a <code>Reader</code>.
- *
- * @param reader the <code>Reader</code> to read from, not null
- * @throws IllegalArgumentException if the reader is null
- */
- public LineIterator(final Reader reader) throws IllegalArgumentException {
- if (reader == null) {
- throw new IllegalArgumentException("Reader must not be null");
- }
- if (reader instanceof BufferedReader) {
- bufferedReader = (BufferedReader) reader;
- } else {
- bufferedReader = new BufferedReader(reader);
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Indicates whether the <code>Reader</code> has more lines.
- * If there is an <code>IOException</code> then {@link #close()} will
- * be called on this instance.
- *
- * @return <code>true</code> if the Reader has more lines
- * @throws IllegalStateException if an IO exception occurs
- */
- public boolean hasNext() {
- if (cachedLine != null) {
- return true;
- } else if (finished) {
- return false;
- } else {
- try {
- while (true) {
- String line = bufferedReader.readLine();
- if (line == null) {
- finished = true;
- return false;
- } else if (isValidLine(line)) {
- cachedLine = line;
- return true;
- }
- }
- } catch(IOException ioe) {
- close();
- throw new IllegalStateException(ioe.toString());
- }
- }
- }
-
- /**
- * Overridable method to validate each line that is returned.
- *
- * @param line the line that is to be validated
- * @return true if valid, false to remove from the iterator
- */
- protected boolean isValidLine(String line) {
- return true;
- }
-
- /**
- * Returns the next line in the wrapped <code>Reader</code>.
- *
- * @return the next line from the input
- * @throws NoSuchElementException if there is no line to return
- */
- public Object next() {
- return nextLine();
- }
-
- /**
- * Returns the next line in the wrapped <code>Reader</code>.
- *
- * @return the next line from the input
- * @throws NoSuchElementException if there is no line to return
- */
- public String nextLine() {
- if (!hasNext()) {
- throw new NoSuchElementException("No more lines");
- }
- String currentLine = cachedLine;
- cachedLine = null;
- return currentLine;
- }
-
- /**
- * Closes the underlying <code>Reader</code> quietly.
- * This method is useful if you only want to process the first few
- * lines of a larger file. If you do not close the iterator
- * then the <code>Reader</code> remains open.
- * This method can safely be called multiple times.
- */
- public void close() {
- finished = true;
- IOUtils.closeQuietly(bufferedReader);
- cachedLine = null;
- }
-
- /**
- * Unsupported.
- *
- * @throws UnsupportedOperationException always
- */
- public void remove() {
- throw new UnsupportedOperationException("Remove unsupported on LineIterator");
- }
-
- //-----------------------------------------------------------------------
- /**
- * Closes the iterator, handling null and ignoring exceptions.
- *
- * @param iterator the iterator to close
- */
- public static void closeQuietly(LineIterator iterator) {
- if (iterator != null) {
- iterator.close();
- }
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/ThirdPartyProject.prop b/emailcommon/src/org/apache/commons/io/ThirdPartyProject.prop
deleted file mode 100644
index b09d3900c..000000000
--- a/emailcommon/src/org/apache/commons/io/ThirdPartyProject.prop
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2010 Google Inc. All Rights Reserved.
-#Fri Jul 16 10:03:08 PDT 2010
-currentVersion=1.4
-version=1.4
-isNative=false
-name=apache_commons_io
-keywords=apache commons io
-onDevice=true
-homepage=http\://commons.apache.org/io/
diff --git a/emailcommon/src/org/apache/commons/io/comparator/DefaultFileComparator.java b/emailcommon/src/org/apache/commons/io/comparator/DefaultFileComparator.java
deleted file mode 100644
index 8de3cc4e7..000000000
--- a/emailcommon/src/org/apache/commons/io/comparator/DefaultFileComparator.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.comparator;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * Compare two files using the <b>default</b> {@link File#compareTo(File)} method.
- * <p>
- * This comparator can be used to sort lists or arrays of files
- * by using the default file comparison.
- * <p>
- * Example of sorting a list of files using the
- * {@link #DEFAULT_COMPARATOR} singleton instance:
- * <pre>
- * List&lt;File&gt; list = ...
- * Collections.sort(list, DefaultFileComparator.DEFAULT_COMPARATOR);
- * </pre>
- * <p>
- * Example of doing a <i>reverse</i> sort of an array of files using the
- * {@link #DEFAULT_REVERSE} singleton instance:
- * <pre>
- * File[] array = ...
- * Arrays.sort(array, DefaultFileComparator.DEFAULT_REVERSE);
- * </pre>
- * <p>
- *
- * @version $Revision: 609243 $ $Date: 2008-01-06 00:30:42 +0000 (Sun, 06 Jan 2008) $
- * @since Commons IO 1.4
- */
-public class DefaultFileComparator implements Comparator<File>, Serializable {
-
- /** Singleton default comparator instance */
- public static final Comparator<File> DEFAULT_COMPARATOR = new DefaultFileComparator();
-
- /** Singleton reverse default comparator instance */
- public static final Comparator<File> DEFAULT_REVERSE = new ReverseComparator<File>(DEFAULT_COMPARATOR);
-
- /**
- * Compare the two files using the {@link File#compareTo(File)} method.
- *
- * @param obj1 The first file to compare
- * @param obj2 The second file to compare
- * @return the result of calling file1's
- * {@link File#compareTo(File)} with file2 as the parameter.
- */
- public int compare(File file1, File file2) {
- return file1.compareTo(file2);
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/comparator/ExtensionFileComparator.java b/emailcommon/src/org/apache/commons/io/comparator/ExtensionFileComparator.java
deleted file mode 100644
index 5797b02eb..000000000
--- a/emailcommon/src/org/apache/commons/io/comparator/ExtensionFileComparator.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.comparator;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.Comparator;
-
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.IOCase;
-
-/**
- * Compare the file name <b>extensions</b> for order
- * (see {@link FilenameUtils#getExtension(String)}).
- * <p>
- * This comparator can be used to sort lists or arrays of files
- * by their file extension either in a case-sensitive, case-insensitive or
- * system dependant case sensitive way. A number of singleton instances
- * are provided for the various case sensitivity options (using {@link IOCase})
- * and the reverse of those options.
- * <p>
- * Example of a <i>case-sensitive</i> file extension sort using the
- * {@link #EXTENSION_COMPARATOR} singleton instance:
- * <pre>
- * List&lt;File&gt; list = ...
- * Collections.sort(list, ExtensionFileComparator.EXTENSION_COMPARATOR);
- * </pre>
- * <p>
- * Example of a <i>reverse case-insensitive</i> file extension sort using the
- * {@link #EXTENSION_INSENSITIVE_REVERSE} singleton instance:
- * <pre>
- * File[] array = ...
- * Arrays.sort(array, ExtensionFileComparator.EXTENSION_INSENSITIVE_REVERSE);
- * </pre>
- * <p>
- *
- * @version $Revision: 609243 $ $Date: 2008-01-06 00:30:42 +0000 (Sun, 06 Jan 2008) $
- * @since Commons IO 1.4
- */
-public class ExtensionFileComparator implements Comparator<File>, Serializable {
-
- /** Case-sensitive extension comparator instance (see {@link IOCase#SENSITIVE}) */
- public static final Comparator<File> EXTENSION_COMPARATOR = new ExtensionFileComparator();
-
- /** Reverse case-sensitive extension comparator instance (see {@link IOCase#SENSITIVE}) */
- public static final Comparator<File> EXTENSION_REVERSE = new ReverseComparator<File>(EXTENSION_COMPARATOR);
-
- /** Case-insensitive extension comparator instance (see {@link IOCase#INSENSITIVE}) */
- public static final Comparator<File> EXTENSION_INSENSITIVE_COMPARATOR = new ExtensionFileComparator(IOCase.INSENSITIVE);
-
- /** Reverse case-insensitive extension comparator instance (see {@link IOCase#INSENSITIVE}) */
- public static final Comparator<File> EXTENSION_INSENSITIVE_REVERSE
- = new ReverseComparator<File>(EXTENSION_INSENSITIVE_COMPARATOR);
-
- /** System sensitive extension comparator instance (see {@link IOCase#SYSTEM}) */
- public static final Comparator<File> EXTENSION_SYSTEM_COMPARATOR = new ExtensionFileComparator(IOCase.SYSTEM);
-
- /** Reverse system sensitive path comparator instance (see {@link IOCase#SYSTEM}) */
- public static final Comparator<File> EXTENSION_SYSTEM_REVERSE = new ReverseComparator<File>(EXTENSION_SYSTEM_COMPARATOR);
-
- /** Whether the comparison is case sensitive. */
- private final IOCase caseSensitivity;
-
- /**
- * Construct a case sensitive file extension comparator instance.
- */
- public ExtensionFileComparator() {
- this.caseSensitivity = IOCase.SENSITIVE;
- }
-
- /**
- * Construct a file extension comparator instance with the specified case-sensitivity.
- *
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- */
- public ExtensionFileComparator(IOCase caseSensitivity) {
- this.caseSensitivity = caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity;
- }
-
- /**
- * Compare the extensions of two files the specified case sensitivity.
- *
- * @param obj1 The first file to compare
- * @param obj2 The second file to compare
- * @return a negative value if the first file's extension
- * is less than the second, zero if the extensions are the
- * same and a positive value if the first files extension
- * is greater than the second file.
- *
- */
- public int compare(File file1, File file2) {
- String suffix1 = FilenameUtils.getExtension(file1.getName());
- String suffix2 = FilenameUtils.getExtension(file2.getName());
- return caseSensitivity.checkCompareTo(suffix1, suffix2);
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/comparator/LastModifiedFileComparator.java b/emailcommon/src/org/apache/commons/io/comparator/LastModifiedFileComparator.java
deleted file mode 100644
index 0dcd0b242..000000000
--- a/emailcommon/src/org/apache/commons/io/comparator/LastModifiedFileComparator.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.comparator;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * Compare the <b>last modified date/time</b> of two files for order
- * (see {@link File#lastModified()}).
- * <p>
- * This comparator can be used to sort lists or arrays of files
- * by their last modified date/time.
- * <p>
- * Example of sorting a list of files using the
- * {@link #LASTMODIFIED_COMPARATOR} singleton instance:
- * <pre>
- * List&lt;File&gt; list = ...
- * Collections.sort(list, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);
- * </pre>
- * <p>
- * Example of doing a <i>reverse</i> sort of an array of files using the
- * {@link #LASTMODIFIED_REVERSE} singleton instance:
- * <pre>
- * File[] array = ...
- * Arrays.sort(array, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
- * </pre>
- * <p>
- *
- * @version $Revision: 609243 $ $Date: 2008-01-06 00:30:42 +0000 (Sun, 06 Jan 2008) $
- * @since Commons IO 1.4
- */
-public class LastModifiedFileComparator implements Comparator<File>, Serializable {
-
- /** Last modified comparator instance */
- public static final Comparator<File> LASTMODIFIED_COMPARATOR = new LastModifiedFileComparator();
-
- /** Reverse last modified comparator instance */
- public static final Comparator<File> LASTMODIFIED_REVERSE = new ReverseComparator<File>(LASTMODIFIED_COMPARATOR);
-
- /**
- * Compare the last the last modified date/time of two files.
- *
- * @param obj1 The first file to compare
- * @param obj2 The second file to compare
- * @return a negative value if the first file's lastmodified date/time
- * is less than the second, zero if the lastmodified date/time are the
- * same and a positive value if the first files lastmodified date/time
- * is greater than the second file.
- *
- */
- public int compare(File file1, File file2) {
- long result = file1.lastModified() - file2.lastModified();
- if (result < 0) {
- return -1;
- } else if (result > 0) {
- return 1;
- } else {
- return 0;
- }
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/comparator/NameFileComparator.java b/emailcommon/src/org/apache/commons/io/comparator/NameFileComparator.java
deleted file mode 100644
index eb64fb589..000000000
--- a/emailcommon/src/org/apache/commons/io/comparator/NameFileComparator.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.comparator;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.Comparator;
-
-import org.apache.commons.io.IOCase;
-
-/**
- * Compare the <b>names</b> of two files for order (see {@link File#getName()}).
- * <p>
- * This comparator can be used to sort lists or arrays of files
- * by their name either in a case-sensitive, case-insensitive or
- * system dependant case sensitive way. A number of singleton instances
- * are provided for the various case sensitivity options (using {@link IOCase})
- * and the reverse of those options.
- * <p>
- * Example of a <i>case-sensitive</i> file name sort using the
- * {@link #NAME_COMPARATOR} singleton instance:
- * <pre>
- * List&lt;File&gt; list = ...
- * Collections.sort(list, NameFileComparator.NAME_COMPARATOR);
- * </pre>
- * <p>
- * Example of a <i>reverse case-insensitive</i> file name sort using the
- * {@link #NAME_INSENSITIVE_REVERSE} singleton instance:
- * <pre>
- * File[] array = ...
- * Arrays.sort(array, NameFileComparator.NAME_INSENSITIVE_REVERSE);
- * </pre>
- * <p>
- *
- * @version $Revision: 609243 $ $Date: 2008-01-06 00:30:42 +0000 (Sun, 06 Jan 2008) $
- * @since Commons IO 1.4
- */
-public class NameFileComparator implements Comparator<File>, Serializable {
-
- /** Case-sensitive name comparator instance (see {@link IOCase#SENSITIVE}) */
- public static final Comparator<File> NAME_COMPARATOR = new NameFileComparator();
-
- /** Reverse case-sensitive name comparator instance (see {@link IOCase#SENSITIVE}) */
- public static final Comparator<File> NAME_REVERSE = new ReverseComparator<File>(NAME_COMPARATOR);
-
- /** Case-insensitive name comparator instance (see {@link IOCase#INSENSITIVE}) */
- public static final Comparator<File> NAME_INSENSITIVE_COMPARATOR = new NameFileComparator(IOCase.INSENSITIVE);
-
- /** Reverse case-insensitive name comparator instance (see {@link IOCase#INSENSITIVE}) */
- public static final Comparator<File> NAME_INSENSITIVE_REVERSE = new ReverseComparator<File>(NAME_INSENSITIVE_COMPARATOR);
-
- /** System sensitive name comparator instance (see {@link IOCase#SYSTEM}) */
- public static final Comparator<File> NAME_SYSTEM_COMPARATOR = new NameFileComparator(IOCase.SYSTEM);
-
- /** Reverse system sensitive name comparator instance (see {@link IOCase#SYSTEM}) */
- public static final Comparator<File> NAME_SYSTEM_REVERSE = new ReverseComparator<File>(NAME_SYSTEM_COMPARATOR);
-
- /** Whether the comparison is case sensitive. */
- private final IOCase caseSensitivity;
-
- /**
- * Construct a case sensitive file name comparator instance.
- */
- public NameFileComparator() {
- this.caseSensitivity = IOCase.SENSITIVE;
- }
-
- /**
- * Construct a file name comparator instance with the specified case-sensitivity.
- *
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- */
- public NameFileComparator(IOCase caseSensitivity) {
- this.caseSensitivity = caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity;
- }
-
- /**
- * Compare the names of two files with the specified case sensitivity.
- *
- * @param obj1 The first file to compare
- * @param obj2 The second file to compare
- * @return a negative value if the first file's name
- * is less than the second, zero if the names are the
- * same and a positive value if the first files name
- * is greater than the second file.
- */
- public int compare(File file1, File file2) {
- return caseSensitivity.checkCompareTo(file1.getName(), file2.getName());
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/comparator/PathFileComparator.java b/emailcommon/src/org/apache/commons/io/comparator/PathFileComparator.java
deleted file mode 100644
index e93113825..000000000
--- a/emailcommon/src/org/apache/commons/io/comparator/PathFileComparator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.comparator;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.Comparator;
-
-import org.apache.commons.io.IOCase;
-
-/**
- * Compare the <b>path</b> of two files for order (see {@link File#getPath()}).
- * <p>
- * This comparator can be used to sort lists or arrays of files
- * by their path either in a case-sensitive, case-insensitive or
- * system dependant case sensitive way. A number of singleton instances
- * are provided for the various case sensitivity options (using {@link IOCase})
- * and the reverse of those options.
- * <p>
- * Example of a <i>case-sensitive</i> file path sort using the
- * {@link #PATH_COMPARATOR} singleton instance:
- * <pre>
- * List&lt;File&gt; list = ...
- * Collections.sort(list, PathFileComparator.PATH_COMPARATOR);
- * </pre>
- * <p>
- * Example of a <i>reverse case-insensitive</i> file path sort using the
- * {@link #PATH_INSENSITIVE_REVERSE} singleton instance:
- * <pre>
- * File[] array = ...
- * Arrays.sort(array, PathFileComparator.PATH_INSENSITIVE_REVERSE);
- * </pre>
- * <p>
- *
- * @version $Revision: 609243 $ $Date: 2008-01-06 00:30:42 +0000 (Sun, 06 Jan 2008) $
- * @since Commons IO 1.4
- */
-public class PathFileComparator implements Comparator<File>, Serializable {
-
- /** Case-sensitive path comparator instance (see {@link IOCase#SENSITIVE}) */
- public static final Comparator<File> PATH_COMPARATOR = new PathFileComparator();
-
- /** Reverse case-sensitive path comparator instance (see {@link IOCase#SENSITIVE}) */
- public static final Comparator<File> PATH_REVERSE = new ReverseComparator<File>(PATH_COMPARATOR);
-
- /** Case-insensitive path comparator instance (see {@link IOCase#INSENSITIVE}) */
- public static final Comparator<File> PATH_INSENSITIVE_COMPARATOR = new PathFileComparator(IOCase.INSENSITIVE);
-
- /** Reverse case-insensitive path comparator instance (see {@link IOCase#INSENSITIVE}) */
- public static final Comparator<File> PATH_INSENSITIVE_REVERSE = new ReverseComparator<File>(PATH_INSENSITIVE_COMPARATOR);
-
- /** System sensitive path comparator instance (see {@link IOCase#SYSTEM}) */
- public static final Comparator<File> PATH_SYSTEM_COMPARATOR = new PathFileComparator(IOCase.SYSTEM);
-
- /** Reverse system sensitive path comparator instance (see {@link IOCase#SYSTEM}) */
- public static final Comparator<File> PATH_SYSTEM_REVERSE = new ReverseComparator<File>(PATH_SYSTEM_COMPARATOR);
-
- /** Whether the comparison is case sensitive. */
- private final IOCase caseSensitivity;
-
- /**
- * Construct a case sensitive file path comparator instance.
- */
- public PathFileComparator() {
- this.caseSensitivity = IOCase.SENSITIVE;
- }
-
- /**
- * Construct a file path comparator instance with the specified case-sensitivity.
- *
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- */
- public PathFileComparator(IOCase caseSensitivity) {
- this.caseSensitivity = caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity;
- }
-
- /**
- * Compare the paths of two files the specified case sensitivity.
- *
- * @param obj1 The first file to compare
- * @param obj2 The second file to compare
- * @return a negative value if the first file's path
- * is less than the second, zero if the paths are the
- * same and a positive value if the first files path
- * is greater than the second file.
- *
- */
- public int compare(File file1, File file2) {
- return caseSensitivity.checkCompareTo(file1.getPath(), file2.getPath());
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/comparator/ReverseComparator.java b/emailcommon/src/org/apache/commons/io/comparator/ReverseComparator.java
deleted file mode 100644
index ab0b38caa..000000000
--- a/emailcommon/src/org/apache/commons/io/comparator/ReverseComparator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.comparator;
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * Reverses the result of comparing two objects using
- * the delegate {@link Comparator}.
- *
- * @version $Revision: 609243 $ $Date: 2008-01-06 00:30:42 +0000 (Sun, 06 Jan 2008) $
- * @since Commons IO 1.4
- */
-class ReverseComparator<T> implements Comparator<T>, Serializable {
-
- private final Comparator<T> delegate;
-
- /**
- * Construct an instance with the sepecified delegate {@link Comparator}.
- *
- * @param delegate The comparator to delegate to
- */
- public ReverseComparator(Comparator<T> delegate) {
- if (delegate == null) {
- throw new IllegalArgumentException("Delegate comparator is missing");
- }
- this.delegate = delegate;
- }
-
- /**
- * Compare using the delegate Comparator, but reversing the result.
- *
- * @param obj1 The first object to compare
- * @param obj2 The second object to compare
- * @return the result from the delegate {@link Comparator#compare(Object, Object)}
- * reversing the value (i.e. positive becomes negative and vice versa)
- */
- public int compare(T obj1, T obj2) {
- return delegate.compare(obj2, obj1); // parameters switched round
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/comparator/SizeFileComparator.java b/emailcommon/src/org/apache/commons/io/comparator/SizeFileComparator.java
deleted file mode 100644
index 609c159c9..000000000
--- a/emailcommon/src/org/apache/commons/io/comparator/SizeFileComparator.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.comparator;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.Comparator;
-
-import org.apache.commons.io.FileUtils;
-
-/**
- * Compare the <b>length/size</b> of two files for order (see
- * {@link File#length()} and {@link FileUtils#sizeOfDirectory(File)}).
- * <p>
- * This comparator can be used to sort lists or arrays of files
- * by their length/size.
- * <p>
- * Example of sorting a list of files using the
- * {@link #SIZE_COMPARATOR} singleton instance:
- * <pre>
- * List&lt;File&gt; list = ...
- * Collections.sort(list, LengthFileComparator.LENGTH_COMPARATOR);
- * </pre>
- * <p>
- * Example of doing a <i>reverse</i> sort of an array of files using the
- * {@link #SIZE_REVERSE} singleton instance:
- * <pre>
- * File[] array = ...
- * Arrays.sort(array, LengthFileComparator.LENGTH_REVERSE);
- * </pre>
- * <p>
- * <strong>N.B.</strong> Directories are treated as <b>zero size</b> unless
- * <code>sumDirectoryContents</code> is <code>true</code>.
- *
- * @version $Revision: 609243 $ $Date: 2008-01-06 00:30:42 +0000 (Sun, 06 Jan 2008) $
- * @since Commons IO 1.4
- */
-public class SizeFileComparator implements Comparator<File>, Serializable {
-
- /** Size comparator instance - directories are treated as zero size */
- public static final Comparator<File> SIZE_COMPARATOR = new SizeFileComparator();
-
- /** Reverse size comparator instance - directories are treated as zero size */
- public static final Comparator<File> SIZE_REVERSE = new ReverseComparator<File>(SIZE_COMPARATOR);
-
- /**
- * Size comparator instance which sums the size of a directory's contents
- * using {@link FileUtils#sizeOfDirectory(File)}
- */
- public static final Comparator<File> SIZE_SUMDIR_COMPARATOR = new SizeFileComparator(true);
-
- /**
- * Reverse size comparator instance which sums the size of a directory's contents
- * using {@link FileUtils#sizeOfDirectory(File)}
- */
- public static final Comparator<File> SIZE_SUMDIR_REVERSE = new ReverseComparator<File>(SIZE_SUMDIR_COMPARATOR);
-
- /** Whether the sum of the directory's contents should be calculated. */
- private final boolean sumDirectoryContents;
-
- /**
- * Construct a file size comparator instance (directories treated as zero size).
- */
- public SizeFileComparator() {
- this.sumDirectoryContents = false;
- }
-
- /**
- * Construct a file size comparator instance specifying whether the size of
- * the directory contents should be aggregated.
- * <p>
- * If the <code>sumDirectoryContents</code> is <code>true</code> The size of
- * directories is calculated using {@link FileUtils#sizeOfDirectory(File)}.
- *
- * @param sumDirectoryContents <code>true</code> if the sum of the directoryies contents
- * should be calculated, otherwise <code>false</code> if directories should be treated
- * as size zero (see {@link FileUtils#sizeOfDirectory(File)}).
- */
- public SizeFileComparator(boolean sumDirectoryContents) {
- this.sumDirectoryContents = sumDirectoryContents;
- }
-
- /**
- * Compare the length of two files.
- *
- * @param obj1 The first file to compare
- * @param obj2 The second file to compare
- * @return a negative value if the first file's length
- * is less than the second, zero if the lengths are the
- * same and a positive value if the first files length
- * is greater than the second file.
- *
- */
- public int compare(File file1, File file2) {
- long size1 = 0;
- if (file1.isDirectory()) {
- size1 = sumDirectoryContents && file1.exists() ? FileUtils.sizeOfDirectory(file1) : 0;
- } else {
- size1 = file1.length();
- }
- long size2 = 0;
- if (file2.isDirectory()) {
- size2 = sumDirectoryContents && file2.exists() ? FileUtils.sizeOfDirectory(file2) : 0;
- } else {
- size2 = file2.length();
- }
- long result = size1 - size2;
- if (result < 0) {
- return -1;
- } else if (result > 0) {
- return 1;
- } else {
- return 0;
- }
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/comparator/package.html b/emailcommon/src/org/apache/commons/io/comparator/package.html
deleted file mode 100644
index a2f756f18..000000000
--- a/emailcommon/src/org/apache/commons/io/comparator/package.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements. See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<html>
-<body>
-<p>This package provides various {@link java.util.Comparator} implementations
-for {@link java.io.File}s.
-</p>
-
-</body>
-</html>
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/AbstractFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/AbstractFileFilter.java
deleted file mode 100644
index 9e188f82e..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/AbstractFileFilter.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-
-/**
- * An abstract class which implements the Java FileFilter and FilenameFilter
- * interfaces via the IOFileFilter interface.
- * <p>
- * Note that a subclass <b>must</b> override one of the accept methods,
- * otherwise your class will infinitely loop.
- *
- * @since Commons IO 1.0
- * @version $Revision: 539231 $ $Date: 2007-05-18 04:10:33 +0100 (Fri, 18 May 2007) $
- *
- * @author Stephen Colebourne
- */
-public abstract class AbstractFileFilter implements IOFileFilter {
-
- /**
- * Checks to see if the File should be accepted by this filter.
- *
- * @param file the File to check
- * @return true if this file matches the test
- */
- public boolean accept(File file) {
- return accept(file.getParentFile(), file.getName());
- }
-
- /**
- * Checks to see if the File should be accepted by this filter.
- *
- * @param dir the directory File to check
- * @param name the filename within the directory to check
- * @return true if this file matches the test
- */
- public boolean accept(File dir, String name) {
- return accept(new File(dir, name));
- }
-
- /**
- * Provide a String representaion of this file filter.
- *
- * @return a String representaion
- */
- public String toString() {
- String name = getClass().getName();
- int period = name.lastIndexOf('.');
- return (period > 0 ? name.substring(period + 1) : name);
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/AgeFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/AgeFileFilter.java
deleted file mode 100644
index ab73cb840..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/AgeFileFilter.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.Date;
-
-import org.apache.commons.io.FileUtils;
-
-/**
- * Filters files based on a cutoff time, can filter either newer
- * files or files equal to or older.
- * <p>
- * For example, to print all files and directories in the
- * current directory older than one day:
- *
- * <pre>
- * File dir = new File(".");
- * // We are interested in files older than one day
- * long cutoff = System.currentTimeMillis() - (24 * 60 * 60 * 1000);
- * String[] files = dir.list( new AgeFileFilter(cutoff) );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * @author Rahul Akolkar
- * @version $Id: AgeFileFilter.java 606381 2007-12-22 02:03:16Z ggregory $
- * @since Commons IO 1.2
- */
-public class AgeFileFilter extends AbstractFileFilter implements Serializable {
-
- /** The cutoff time threshold. */
- private final long cutoff;
- /** Whether the files accepted will be older or newer. */
- private final boolean acceptOlder;
-
- /**
- * Constructs a new age file filter for files equal to or older than
- * a certain cutoff
- *
- * @param cutoff the threshold age of the files
- */
- public AgeFileFilter(long cutoff) {
- this(cutoff, true);
- }
-
- /**
- * Constructs a new age file filter for files on any one side
- * of a certain cutoff.
- *
- * @param cutoff the threshold age of the files
- * @param acceptOlder if true, older files (at or before the cutoff)
- * are accepted, else newer ones (after the cutoff).
- */
- public AgeFileFilter(long cutoff, boolean acceptOlder) {
- this.acceptOlder = acceptOlder;
- this.cutoff = cutoff;
- }
-
- /**
- * Constructs a new age file filter for files older than (at or before)
- * a certain cutoff date.
- *
- * @param cutoffDate the threshold age of the files
- */
- public AgeFileFilter(Date cutoffDate) {
- this(cutoffDate, true);
- }
-
- /**
- * Constructs a new age file filter for files on any one side
- * of a certain cutoff date.
- *
- * @param cutoffDate the threshold age of the files
- * @param acceptOlder if true, older files (at or before the cutoff)
- * are accepted, else newer ones (after the cutoff).
- */
- public AgeFileFilter(Date cutoffDate, boolean acceptOlder) {
- this(cutoffDate.getTime(), acceptOlder);
- }
-
- /**
- * Constructs a new age file filter for files older than (at or before)
- * a certain File (whose last modification time will be used as reference).
- *
- * @param cutoffReference the file whose last modification
- * time is usesd as the threshold age of the files
- */
- public AgeFileFilter(File cutoffReference) {
- this(cutoffReference, true);
- }
-
- /**
- * Constructs a new age file filter for files on any one side
- * of a certain File (whose last modification time will be used as
- * reference).
- *
- * @param cutoffReference the file whose last modification
- * time is usesd as the threshold age of the files
- * @param acceptOlder if true, older files (at or before the cutoff)
- * are accepted, else newer ones (after the cutoff).
- */
- public AgeFileFilter(File cutoffReference, boolean acceptOlder) {
- this(cutoffReference.lastModified(), acceptOlder);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Checks to see if the last modification of the file matches cutoff
- * favorably.
- * <p>
- * If last modification time equals cutoff and newer files are required,
- * file <b>IS NOT</b> selected.
- * If last modification time equals cutoff and older files are required,
- * file <b>IS</b> selected.
- *
- * @param file the File to check
- * @return true if the filename matches
- */
- public boolean accept(File file) {
- boolean newer = FileUtils.isFileNewer(file, cutoff);
- return acceptOlder ? !newer : newer;
- }
-
- /**
- * Provide a String representaion of this file filter.
- *
- * @return a String representaion
- */
- public String toString() {
- String condition = acceptOlder ? "<=" : ">";
- return super.toString() + "(" + condition + cutoff + ")";
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/AndFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/AndFileFilter.java
deleted file mode 100644
index 9f3bb06ae..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/AndFileFilter.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A {@link java.io.FileFilter} providing conditional AND logic across a list of
- * file filters. This filter returns <code>true</code> if all filters in the
- * list return <code>true</code>. Otherwise, it returns <code>false</code>.
- * Checking of the file filter list stops when the first filter returns
- * <code>false</code>.
- *
- * @since Commons IO 1.0
- * @version $Revision: 606381 $ $Date: 2007-12-22 02:03:16 +0000 (Sat, 22 Dec 2007) $
- *
- * @author Steven Caswell
- */
-public class AndFileFilter
- extends AbstractFileFilter
- implements ConditionalFileFilter, Serializable {
-
- /** The list of file filters. */
- private List<IOFileFilter> fileFilters;
-
- /**
- * Constructs a new instance of <code>AndFileFilter</code>.
- *
- * @since Commons IO 1.1
- */
- public AndFileFilter() {
- this.fileFilters = new ArrayList<IOFileFilter>();
- }
-
- /**
- * Constructs a new instance of <code>AndFileFilter</code>
- * with the specified list of filters.
- *
- * @param fileFilters a List of IOFileFilter instances, copied, null ignored
- * @since Commons IO 1.1
- */
- public AndFileFilter(final List<IOFileFilter> fileFilters) {
- if (fileFilters == null) {
- this.fileFilters = new ArrayList<IOFileFilter>();
- } else {
- this.fileFilters = new ArrayList<IOFileFilter>(fileFilters);
- }
- }
-
- /**
- * Constructs a new file filter that ANDs the result of two other filters.
- *
- * @param filter1 the first filter, must not be null
- * @param filter2 the second filter, must not be null
- * @throws IllegalArgumentException if either filter is null
- */
- public AndFileFilter(IOFileFilter filter1, IOFileFilter filter2) {
- if (filter1 == null || filter2 == null) {
- throw new IllegalArgumentException("The filters must not be null");
- }
- this.fileFilters = new ArrayList<IOFileFilter>();
- addFileFilter(filter1);
- addFileFilter(filter2);
- }
-
- /**
- * {@inheritDoc}
- */
- public void addFileFilter(final IOFileFilter ioFileFilter) {
- this.fileFilters.add(ioFileFilter);
- }
-
- /**
- * {@inheritDoc}
- */
- public List<IOFileFilter> getFileFilters() {
- return Collections.unmodifiableList(this.fileFilters);
- }
-
- /**
- * {@inheritDoc}
- */
- public boolean removeFileFilter(final IOFileFilter ioFileFilter) {
- return this.fileFilters.remove(ioFileFilter);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setFileFilters(final List<IOFileFilter> fileFilters) {
- this.fileFilters = new ArrayList<IOFileFilter>(fileFilters);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean accept(final File file) {
- if (this.fileFilters.size() == 0) {
- return false;
- }
- for (Iterator<IOFileFilter> iter = this.fileFilters.iterator(); iter.hasNext();) {
- IOFileFilter fileFilter = iter.next();
- if (!fileFilter.accept(file)) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean accept(final File file, final String name) {
- if (this.fileFilters.size() == 0) {
- return false;
- }
- for (Iterator<IOFileFilter> iter = this.fileFilters.iterator(); iter.hasNext();) {
- IOFileFilter fileFilter = iter.next();
- if (!fileFilter.accept(file, name)) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Provide a String representaion of this file filter.
- *
- * @return a String representaion
- */
- @Override
- public String toString() {
- StringBuffer buffer = new StringBuffer();
- buffer.append(super.toString());
- buffer.append("(");
- if (fileFilters != null) {
- for (int i = 0; i < fileFilters.size(); i++) {
- if (i > 0) {
- buffer.append(",");
- }
- Object filter = fileFilters.get(i);
- buffer.append(filter == null ? "null" : filter.toString());
- }
- }
- buffer.append(")");
- return buffer.toString();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/CanReadFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/CanReadFileFilter.java
deleted file mode 100644
index a9c132570..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/CanReadFileFilter.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-
-/**
- * This filter accepts <code>File</code>s that can be read.
- * <p>
- * Example, showing how to print out a list of the
- * current directory's <i>readable</i> files:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( CanReadFileFilter.CAN_READ );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * <p>
- * Example, showing how to print out a list of the
- * current directory's <i>un-readable</i> files:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( CanReadFileFilter.CANNOT_READ );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * <p>
- * Example, showing how to print out a list of the
- * current directory's <i>read-only</i> files:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( CanReadFileFilter.READ_ONLY );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * @since Commons IO 1.3
- * @version $Revision: 587916 $
- */
-public class CanReadFileFilter extends AbstractFileFilter implements Serializable {
-
- /** Singleton instance of <i>readable</i> filter */
- public static final IOFileFilter CAN_READ = new CanReadFileFilter();
-
- /** Singleton instance of not <i>readable</i> filter */
- public static final IOFileFilter CANNOT_READ = new NotFileFilter(CAN_READ);
-
- /** Singleton instance of <i>read-only</i> filter */
- public static final IOFileFilter READ_ONLY = new AndFileFilter(CAN_READ,
- CanWriteFileFilter.CANNOT_WRITE);
-
- /**
- * Restrictive consructor.
- */
- protected CanReadFileFilter() {
- }
-
- /**
- * Checks to see if the file can be read.
- *
- * @param file the File to check.
- * @return <code>true</code> if the file can be
- * read, otherwise <code>false</code>.
- */
- public boolean accept(File file) {
- return file.canRead();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/CanWriteFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/CanWriteFileFilter.java
deleted file mode 100644
index da664f25c..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/CanWriteFileFilter.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-
-/**
- * This filter accepts <code>File</code>s that can be written to.
- * <p>
- * Example, showing how to print out a list of the
- * current directory's <i>writable</i> files:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( CanWriteFileFilter.CAN_WRITE );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * <p>
- * Example, showing how to print out a list of the
- * current directory's <i>un-writable</i> files:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( CanWriteFileFilter.CANNOT_WRITE );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * <p>
- * <b>N.B.</b> For read-only files, use
- * <code>CanReadFileFilter.READ_ONLY</code>.
- *
- * @since Commons IO 1.3
- * @version $Revision: 587916 $
- */
-public class CanWriteFileFilter extends AbstractFileFilter implements Serializable {
-
- /** Singleton instance of <i>writable</i> filter */
- public static final IOFileFilter CAN_WRITE = new CanWriteFileFilter();
-
- /** Singleton instance of not <i>writable</i> filter */
- public static final IOFileFilter CANNOT_WRITE = new NotFileFilter(CAN_WRITE);
-
- /**
- * Restrictive consructor.
- */
- protected CanWriteFileFilter() {
- }
-
- /**
- * Checks to see if the file can be written to.
- *
- * @param file the File to check
- * @return <code>true</code> if the file can be
- * written to, otherwise <code>false</code>.
- */
- public boolean accept(File file) {
- return file.canWrite();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/ConditionalFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/ConditionalFileFilter.java
deleted file mode 100644
index b1c481368..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/ConditionalFileFilter.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.util.List;
-
-/**
- * Defines operations for conditional file filters.
- *
- * @since Commons IO 1.1
- * @version $Revision: 437567 $ $Date: 2006-08-28 07:39:07 +0100 (Mon, 28 Aug 2006) $
- *
- * @author Steven Caswell
- */
-public interface ConditionalFileFilter {
-
- /**
- * Adds the specified file filter to the list of file filters at the end of
- * the list.
- *
- * @param ioFileFilter the filter to be added
- * @since Commons IO 1.1
- */
- public void addFileFilter(IOFileFilter ioFileFilter);
-
- /**
- * Returns this conditional file filter's list of file filters.
- *
- * @return the file filter list
- * @since Commons IO 1.1
- */
- public List<IOFileFilter> getFileFilters();
-
- /**
- * Removes the specified file filter.
- *
- * @param ioFileFilter filter to be removed
- * @return <code>true</code> if the filter was found in the list,
- * <code>false</code> otherwise
- * @since Commons IO 1.1
- */
- public boolean removeFileFilter(IOFileFilter ioFileFilter);
-
- /**
- * Sets the list of file filters, replacing any previously configured
- * file filters on this filter.
- *
- * @param fileFilters the list of filters
- * @since Commons IO 1.1
- */
- public void setFileFilters(List<IOFileFilter> fileFilters);
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/DelegateFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/DelegateFileFilter.java
deleted file mode 100644
index c2d67c469..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/DelegateFileFilter.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FilenameFilter;
-import java.io.Serializable;
-
-/**
- * This class turns a Java FileFilter or FilenameFilter into an IO FileFilter.
- *
- * @since Commons IO 1.0
- * @version $Revision: 591058 $ $Date: 2007-11-01 15:47:05 +0000 (Thu, 01 Nov 2007) $
- *
- * @author Stephen Colebourne
- */
-public class DelegateFileFilter extends AbstractFileFilter implements Serializable {
-
- /** The Filename filter */
- private final FilenameFilter filenameFilter;
- /** The File filter */
- private final FileFilter fileFilter;
-
- /**
- * Constructs a delegate file filter around an existing FilenameFilter.
- *
- * @param filter the filter to decorate
- */
- public DelegateFileFilter(FilenameFilter filter) {
- if (filter == null) {
- throw new IllegalArgumentException("The FilenameFilter must not be null");
- }
- this.filenameFilter = filter;
- this.fileFilter = null;
- }
-
- /**
- * Constructs a delegate file filter around an existing FileFilter.
- *
- * @param filter the filter to decorate
- */
- public DelegateFileFilter(FileFilter filter) {
- if (filter == null) {
- throw new IllegalArgumentException("The FileFilter must not be null");
- }
- this.fileFilter = filter;
- this.filenameFilter = null;
- }
-
- /**
- * Checks the filter.
- *
- * @param file the file to check
- * @return true if the filter matches
- */
- public boolean accept(File file) {
- if (fileFilter != null) {
- return fileFilter.accept(file);
- } else {
- return super.accept(file);
- }
- }
-
- /**
- * Checks the filter.
- *
- * @param dir the directory
- * @param name the filename in the directory
- * @return true if the filter matches
- */
- public boolean accept(File dir, String name) {
- if (filenameFilter != null) {
- return filenameFilter.accept(dir, name);
- } else {
- return super.accept(dir, name);
- }
- }
-
- /**
- * Provide a String representaion of this file filter.
- *
- * @return a String representaion
- */
- public String toString() {
- String delegate = (fileFilter != null ? fileFilter.toString() : filenameFilter.toString());
- return super.toString() + "(" + delegate + ")";
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/DirectoryFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/DirectoryFileFilter.java
deleted file mode 100644
index 3412e7bef..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/DirectoryFileFilter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-
-/**
- * This filter accepts <code>File</code>s that are directories.
- * <p>
- * For example, here is how to print out a list of the
- * current directory's subdirectories:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( DirectoryFileFilter.INSTANCE );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * @since Commons IO 1.0
- * @version $Revision: 587916 $ $Date: 2007-10-24 16:53:07 +0100 (Wed, 24 Oct 2007) $
- *
- * @author Stephen Colebourne
- * @author Peter Donald
- */
-public class DirectoryFileFilter extends AbstractFileFilter implements Serializable {
-
- /**
- * Singleton instance of directory filter.
- * @since Commons IO 1.3
- */
- public static final IOFileFilter DIRECTORY = new DirectoryFileFilter();
- /**
- * Singleton instance of directory filter.
- * Please use the identical DirectoryFileFilter.DIRECTORY constant.
- * The new name is more JDK 1.5 friendly as it doesn't clash with other
- * values when using static imports.
- */
- public static final IOFileFilter INSTANCE = DIRECTORY;
-
- /**
- * Restrictive consructor.
- */
- protected DirectoryFileFilter() {
- }
-
- /**
- * Checks to see if the file is a directory.
- *
- * @param file the File to check
- * @return true if the file is a directory
- */
- public boolean accept(File file) {
- return file.isDirectory();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/EmptyFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/EmptyFileFilter.java
deleted file mode 100644
index e88a862d4..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/EmptyFileFilter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-
-/**
- * This filter accepts files or directories that are empty.
- * <p>
- * If the <code>File</code> is a directory it checks that
- * it contains no files.
- * <p>
- * Example, showing how to print out a list of the
- * current directory's empty files/directories:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( EmptyFileFilter.EMPTY );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * <p>
- * Example, showing how to print out a list of the
- * current directory's non-empty files/directories:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( EmptyFileFilter.NOT_EMPTY );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * @since Commons IO 1.3
- * @version $Revision: 587916 $
- */
-public class EmptyFileFilter extends AbstractFileFilter implements Serializable {
-
- /** Singleton instance of <i>empty</i> filter */
- public static final IOFileFilter EMPTY = new EmptyFileFilter();
-
- /** Singleton instance of <i>not-empty</i> filter */
- public static final IOFileFilter NOT_EMPTY = new NotFileFilter(EMPTY);
-
- /**
- * Restrictive consructor.
- */
- protected EmptyFileFilter() {
- }
-
- /**
- * Checks to see if the file is empty.
- *
- * @param file the file or directory to check
- * @return <code>true</code> if the file or directory
- * is <i>empty</i>, otherwise <code>false</code>.
- */
- public boolean accept(File file) {
- if (file.isDirectory()) {
- File[] files = file.listFiles();
- return (files == null || files.length == 0);
- } else {
- return (file.length() == 0);
- }
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/FalseFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/FalseFileFilter.java
deleted file mode 100644
index 8a87d4092..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/FalseFileFilter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-
-/**
- * A file filter that always returns false.
- *
- * @since Commons IO 1.0
- * @version $Revision: 587978 $ $Date: 2007-10-24 20:36:51 +0100 (Wed, 24 Oct 2007) $
- *
- * @author Stephen Colebourne
- */
-public class FalseFileFilter implements IOFileFilter, Serializable {
-
- /**
- * Singleton instance of false filter.
- * @since Commons IO 1.3
- */
- public static final IOFileFilter FALSE = new FalseFileFilter();
- /**
- * Singleton instance of false filter.
- * Please use the identical FalseFileFilter.FALSE constant.
- * The new name is more JDK 1.5 friendly as it doesn't clash with other
- * values when using static imports.
- */
- public static final IOFileFilter INSTANCE = FALSE;
-
- /**
- * Restrictive consructor.
- */
- protected FalseFileFilter() {
- }
-
- /**
- * Returns false.
- *
- * @param file the file to check
- * @return false
- */
- public boolean accept(File file) {
- return false;
- }
-
- /**
- * Returns false.
- *
- * @param dir the directory to check
- * @param name the filename
- * @return false
- */
- public boolean accept(File dir, String name) {
- return false;
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/FileFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/FileFileFilter.java
deleted file mode 100644
index 0d49eddd4..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/FileFileFilter.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-
-/**
- * This filter accepts <code>File</code>s that are files (not directories).
- * <p>
- * For example, here is how to print out a list of the real files
- * within the current directory:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( FileFileFilter.FILE );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * @since Commons IO 1.3
- * @version $Revision: 155419 $ $Date: 2007-10-24 16:53:07 +0100 (Wed, 24 Oct 2007) $
- */
-public class FileFileFilter extends AbstractFileFilter implements Serializable {
-
- /** Singleton instance of file filter */
- public static final IOFileFilter FILE = new FileFileFilter();
-
- /**
- * Restrictive consructor.
- */
- protected FileFileFilter() {
- }
-
- /**
- * Checks to see if the file is a file.
- *
- * @param file the File to check
- * @return true if the file is a file
- */
- public boolean accept(File file) {
- return file.isFile();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/FileFilterUtils.java b/emailcommon/src/org/apache/commons/io/filefilter/FileFilterUtils.java
deleted file mode 100644
index 71c37b1d2..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/FileFilterUtils.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FilenameFilter;
-import java.util.Date;
-
-/**
- * Useful utilities for working with file filters. It provides access to all
- * file filter implementations in this package so you don't have to import
- * every class you use.
- *
- * @since Commons IO 1.0
- * @version $Id: FileFilterUtils.java 609286 2008-01-06 10:01:26Z scolebourne $
- *
- * @author Stephen Colebourne
- * @author Jeremias Maerki
- * @author Masato Tezuka
- * @author Rahul Akolkar
- */
-public class FileFilterUtils {
-
- /**
- * FileFilterUtils is not normally instantiated.
- */
- public FileFilterUtils() {
- }
-
- //-----------------------------------------------------------------------
- /**
- * Returns a filter that returns true if the filename starts with the specified text.
- *
- * @param prefix the filename prefix
- * @return a prefix checking filter
- */
- public static IOFileFilter prefixFileFilter(String prefix) {
- return new PrefixFileFilter(prefix);
- }
-
- /**
- * Returns a filter that returns true if the filename ends with the specified text.
- *
- * @param suffix the filename suffix
- * @return a suffix checking filter
- */
- public static IOFileFilter suffixFileFilter(String suffix) {
- return new SuffixFileFilter(suffix);
- }
-
- /**
- * Returns a filter that returns true if the filename matches the specified text.
- *
- * @param name the filename
- * @return a name checking filter
- */
- public static IOFileFilter nameFileFilter(String name) {
- return new NameFileFilter(name);
- }
-
- /**
- * Returns a filter that checks if the file is a directory.
- *
- * @return file filter that accepts only directories and not files
- */
- public static IOFileFilter directoryFileFilter() {
- return DirectoryFileFilter.DIRECTORY;
- }
-
- /**
- * Returns a filter that checks if the file is a file (and not a directory).
- *
- * @return file filter that accepts only files and not directories
- */
- public static IOFileFilter fileFileFilter() {
- return FileFileFilter.FILE;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Returns a filter that ANDs the two specified filters.
- *
- * @param filter1 the first filter
- * @param filter2 the second filter
- * @return a filter that ANDs the two specified filters
- */
- public static IOFileFilter andFileFilter(IOFileFilter filter1, IOFileFilter filter2) {
- return new AndFileFilter(filter1, filter2);
- }
-
- /**
- * Returns a filter that ORs the two specified filters.
- *
- * @param filter1 the first filter
- * @param filter2 the second filter
- * @return a filter that ORs the two specified filters
- */
- public static IOFileFilter orFileFilter(IOFileFilter filter1, IOFileFilter filter2) {
- return new OrFileFilter(filter1, filter2);
- }
-
- /**
- * Returns a filter that NOTs the specified filter.
- *
- * @param filter the filter to invert
- * @return a filter that NOTs the specified filter
- */
- public static IOFileFilter notFileFilter(IOFileFilter filter) {
- return new NotFileFilter(filter);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Returns a filter that always returns true.
- *
- * @return a true filter
- */
- public static IOFileFilter trueFileFilter() {
- return TrueFileFilter.TRUE;
- }
-
- /**
- * Returns a filter that always returns false.
- *
- * @return a false filter
- */
- public static IOFileFilter falseFileFilter() {
- return FalseFileFilter.FALSE;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Returns an <code>IOFileFilter</code> that wraps the
- * <code>FileFilter</code> instance.
- *
- * @param filter the filter to be wrapped
- * @return a new filter that implements IOFileFilter
- */
- public static IOFileFilter asFileFilter(FileFilter filter) {
- return new DelegateFileFilter(filter);
- }
-
- /**
- * Returns an <code>IOFileFilter</code> that wraps the
- * <code>FilenameFilter</code> instance.
- *
- * @param filter the filter to be wrapped
- * @return a new filter that implements IOFileFilter
- */
- public static IOFileFilter asFileFilter(FilenameFilter filter) {
- return new DelegateFileFilter(filter);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Returns a filter that returns true if the file was last modified after
- * the specified cutoff time.
- *
- * @param cutoff the time threshold
- * @return an appropriately configured age file filter
- * @since Commons IO 1.2
- */
- public static IOFileFilter ageFileFilter(long cutoff) {
- return new AgeFileFilter(cutoff);
- }
-
- /**
- * Returns a filter that filters files based on a cutoff time.
- *
- * @param cutoff the time threshold
- * @param acceptOlder if true, older files get accepted, if false, newer
- * @return an appropriately configured age file filter
- * @since Commons IO 1.2
- */
- public static IOFileFilter ageFileFilter(long cutoff, boolean acceptOlder) {
- return new AgeFileFilter(cutoff, acceptOlder);
- }
-
- /**
- * Returns a filter that returns true if the file was last modified after
- * the specified cutoff date.
- *
- * @param cutoffDate the time threshold
- * @return an appropriately configured age file filter
- * @since Commons IO 1.2
- */
- public static IOFileFilter ageFileFilter(Date cutoffDate) {
- return new AgeFileFilter(cutoffDate);
- }
-
- /**
- * Returns a filter that filters files based on a cutoff date.
- *
- * @param cutoffDate the time threshold
- * @param acceptOlder if true, older files get accepted, if false, newer
- * @return an appropriately configured age file filter
- * @since Commons IO 1.2
- */
- public static IOFileFilter ageFileFilter(Date cutoffDate, boolean acceptOlder) {
- return new AgeFileFilter(cutoffDate, acceptOlder);
- }
-
- /**
- * Returns a filter that returns true if the file was last modified after
- * the specified reference file.
- *
- * @param cutoffReference the file whose last modification
- * time is usesd as the threshold age of the files
- * @return an appropriately configured age file filter
- * @since Commons IO 1.2
- */
- public static IOFileFilter ageFileFilter(File cutoffReference) {
- return new AgeFileFilter(cutoffReference);
- }
-
- /**
- * Returns a filter that filters files based on a cutoff reference file.
- *
- * @param cutoffReference the file whose last modification
- * time is usesd as the threshold age of the files
- * @param acceptOlder if true, older files get accepted, if false, newer
- * @return an appropriately configured age file filter
- * @since Commons IO 1.2
- */
- public static IOFileFilter ageFileFilter(File cutoffReference, boolean acceptOlder) {
- return new AgeFileFilter(cutoffReference, acceptOlder);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Returns a filter that returns true if the file is bigger than a certain size.
- *
- * @param threshold the file size threshold
- * @return an appropriately configured SizeFileFilter
- * @since Commons IO 1.2
- */
- public static IOFileFilter sizeFileFilter(long threshold) {
- return new SizeFileFilter(threshold);
- }
-
- /**
- * Returns a filter that filters based on file size.
- *
- * @param threshold the file size threshold
- * @param acceptLarger if true, larger files get accepted, if false, smaller
- * @return an appropriately configured SizeFileFilter
- * @since Commons IO 1.2
- */
- public static IOFileFilter sizeFileFilter(long threshold, boolean acceptLarger) {
- return new SizeFileFilter(threshold, acceptLarger);
- }
-
- /**
- * Returns a filter that accepts files whose size is &gt;= minimum size
- * and &lt;= maximum size.
- *
- * @param minSizeInclusive the minimum file size (inclusive)
- * @param maxSizeInclusive the maximum file size (inclusive)
- * @return an appropriately configured IOFileFilter
- * @since Commons IO 1.3
- */
- public static IOFileFilter sizeRangeFileFilter(long minSizeInclusive, long maxSizeInclusive ) {
- IOFileFilter minimumFilter = new SizeFileFilter(minSizeInclusive, true);
- IOFileFilter maximumFilter = new SizeFileFilter(maxSizeInclusive + 1L, false);
- return new AndFileFilter(minimumFilter, maximumFilter);
- }
-
- //-----------------------------------------------------------------------
- /* Constructed on demand and then cached */
- private static IOFileFilter cvsFilter;
-
- /* Constructed on demand and then cached */
- private static IOFileFilter svnFilter;
-
- /**
- * Decorates a filter to make it ignore CVS directories.
- * Passing in <code>null</code> will return a filter that accepts everything
- * except CVS directories.
- *
- * @param filter the filter to decorate, null means an unrestricted filter
- * @return the decorated filter, never null
- * @since Commons IO 1.1 (method existed but had bug in 1.0)
- */
- public static IOFileFilter makeCVSAware(IOFileFilter filter) {
- if (cvsFilter == null) {
- cvsFilter = notFileFilter(
- andFileFilter(directoryFileFilter(), nameFileFilter("CVS")));
- }
- if (filter == null) {
- return cvsFilter;
- } else {
- return andFileFilter(filter, cvsFilter);
- }
- }
-
- /**
- * Decorates a filter to make it ignore SVN directories.
- * Passing in <code>null</code> will return a filter that accepts everything
- * except SVN directories.
- *
- * @param filter the filter to decorate, null means an unrestricted filter
- * @return the decorated filter, never null
- * @since Commons IO 1.1
- */
- public static IOFileFilter makeSVNAware(IOFileFilter filter) {
- if (svnFilter == null) {
- svnFilter = notFileFilter(
- andFileFilter(directoryFileFilter(), nameFileFilter(".svn")));
- }
- if (filter == null) {
- return svnFilter;
- } else {
- return andFileFilter(filter, svnFilter);
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Decorates a filter so that it only applies to directories and not to files.
- *
- * @param filter the filter to decorate, null means an unrestricted filter
- * @return the decorated filter, never null
- * @since Commons IO 1.3
- */
- public static IOFileFilter makeDirectoryOnly(IOFileFilter filter) {
- if (filter == null) {
- return DirectoryFileFilter.DIRECTORY;
- }
- return new AndFileFilter(DirectoryFileFilter.DIRECTORY, filter);
- }
-
- /**
- * Decorates a filter so that it only applies to files and not to directories.
- *
- * @param filter the filter to decorate, null means an unrestricted filter
- * @return the decorated filter, never null
- * @since Commons IO 1.3
- */
- public static IOFileFilter makeFileOnly(IOFileFilter filter) {
- if (filter == null) {
- return FileFileFilter.FILE;
- }
- return new AndFileFilter(FileFileFilter.FILE, filter);
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/HiddenFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/HiddenFileFilter.java
deleted file mode 100644
index 244153d5e..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/HiddenFileFilter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-
-/**
- * This filter accepts <code>File</code>s that are hidden.
- * <p>
- * Example, showing how to print out a list of the
- * current directory's <i>hidden</i> files:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( HiddenFileFilter.HIDDEN );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * <p>
- * Example, showing how to print out a list of the
- * current directory's <i>visible</i> (i.e. not hidden) files:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( HiddenFileFilter.VISIBLE );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * @since Commons IO 1.3
- * @version $Revision: 587916 $
- */
-public class HiddenFileFilter extends AbstractFileFilter implements Serializable {
-
- /** Singleton instance of <i>hidden</i> filter */
- public static final IOFileFilter HIDDEN = new HiddenFileFilter();
-
- /** Singleton instance of <i>visible</i> filter */
- public static final IOFileFilter VISIBLE = new NotFileFilter(HIDDEN);
-
- /**
- * Restrictive consructor.
- */
- protected HiddenFileFilter() {
- }
-
- /**
- * Checks to see if the file is hidden.
- *
- * @param file the File to check
- * @return <code>true</code> if the file is
- * <i>hidden</i>, otherwise <code>false</code>.
- */
- public boolean accept(File file) {
- return file.isHidden();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/IOFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/IOFileFilter.java
deleted file mode 100644
index 5ebd82751..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/IOFileFilter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FilenameFilter;
-
-/**
- * An interface which brings the FileFilter and FilenameFilter
- * interfaces together.
- *
- * @since Commons IO 1.0
- * @version $Revision: 471628 $ $Date: 2006-11-06 04:06:45 +0000 (Mon, 06 Nov 2006) $
- *
- * @author Stephen Colebourne
- */
-public interface IOFileFilter extends FileFilter, FilenameFilter {
-
- /**
- * Checks to see if the File should be accepted by this filter.
- * <p>
- * Defined in {@link java.io.FileFilter}.
- *
- * @param file the File to check
- * @return true if this file matches the test
- */
- public boolean accept(File file);
-
- /**
- * Checks to see if the File should be accepted by this filter.
- * <p>
- * Defined in {@link java.io.FilenameFilter}.
- *
- * @param dir the directory File to check
- * @param name the filename within the directory to check
- * @return true if this file matches the test
- */
- public boolean accept(File dir, String name);
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/NameFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/NameFileFilter.java
deleted file mode 100644
index 19fe380e1..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/NameFileFilter.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.List;
-
-import org.apache.commons.io.IOCase;
-
-/**
- * Filters filenames for a certain name.
- * <p>
- * For example, to print all files and directories in the
- * current directory whose name is <code>Test</code>:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( new NameFileFilter("Test") );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * @since Commons IO 1.0
- * @version $Revision: 606381 $ $Date: 2007-12-22 02:03:16 +0000 (Sat, 22 Dec 2007) $
- *
- * @author Stephen Colebourne
- * @author Federico Barbieri
- * @author Serge Knystautas
- * @author Peter Donald
- */
-public class NameFileFilter extends AbstractFileFilter implements Serializable {
-
- /** The filenames to search for */
- private final String[] names;
- /** Whether the comparison is case sensitive. */
- private final IOCase caseSensitivity;
-
- /**
- * Constructs a new case-sensitive name file filter for a single name.
- *
- * @param name the name to allow, must not be null
- * @throws IllegalArgumentException if the name is null
- */
- public NameFileFilter(String name) {
- this(name, null);
- }
-
- /**
- * Construct a new name file filter specifying case-sensitivity.
- *
- * @param name the name to allow, must not be null
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- * @throws IllegalArgumentException if the name is null
- */
- public NameFileFilter(String name, IOCase caseSensitivity) {
- if (name == null) {
- throw new IllegalArgumentException("The wildcard must not be null");
- }
- this.names = new String[] {name};
- this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
- }
-
- /**
- * Constructs a new case-sensitive name file filter for an array of names.
- * <p>
- * The array is not cloned, so could be changed after constructing the
- * instance. This would be inadvisable however.
- *
- * @param names the names to allow, must not be null
- * @throws IllegalArgumentException if the names array is null
- */
- public NameFileFilter(String[] names) {
- this(names, null);
- }
-
- /**
- * Constructs a new name file filter for an array of names specifying case-sensitivity.
- * <p>
- * The array is not cloned, so could be changed after constructing the
- * instance. This would be inadvisable however.
- *
- * @param names the names to allow, must not be null
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- * @throws IllegalArgumentException if the names array is null
- */
- public NameFileFilter(String[] names, IOCase caseSensitivity) {
- if (names == null) {
- throw new IllegalArgumentException("The array of names must not be null");
- }
- this.names = names;
- this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
- }
-
- /**
- * Constructs a new case-sensitive name file filter for a list of names.
- *
- * @param names the names to allow, must not be null
- * @throws IllegalArgumentException if the name list is null
- * @throws ClassCastException if the list does not contain Strings
- */
- public NameFileFilter(List<String> names) {
- this(names, null);
- }
-
- /**
- * Constructs a new name file filter for a list of names specifying case-sensitivity.
- *
- * @param names the names to allow, must not be null
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- * @throws IllegalArgumentException if the name list is null
- * @throws ClassCastException if the list does not contain Strings
- */
- public NameFileFilter(List<String> names, IOCase caseSensitivity) {
- if (names == null) {
- throw new IllegalArgumentException("The list of names must not be null");
- }
- this.names = names.toArray(new String[names.size()]);
- this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Checks to see if the filename matches.
- *
- * @param file the File to check
- * @return true if the filename matches
- */
- @Override
- public boolean accept(File file) {
- String name = file.getName();
- for (int i = 0; i < this.names.length; i++) {
- if (caseSensitivity.checkEquals(name, names[i])) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Checks to see if the filename matches.
- *
- * @param file the File directory
- * @param name the filename
- * @return true if the filename matches
- */
- @Override
- public boolean accept(File file, String name) {
- for (int i = 0; i < names.length; i++) {
- if (caseSensitivity.checkEquals(name, names[i])) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Provide a String representaion of this file filter.
- *
- * @return a String representaion
- */
- @Override
- public String toString() {
- StringBuffer buffer = new StringBuffer();
- buffer.append(super.toString());
- buffer.append("(");
- if (names != null) {
- for (int i = 0; i < names.length; i++) {
- if (i > 0) {
- buffer.append(",");
- }
- buffer.append(names[i]);
- }
- }
- buffer.append(")");
- return buffer.toString();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/NotFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/NotFileFilter.java
deleted file mode 100644
index 710c8ecf3..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/NotFileFilter.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-
-/**
- * This filter produces a logical NOT of the filters specified.
- *
- * @since Commons IO 1.0
- * @version $Revision: 591058 $ $Date: 2007-11-01 15:47:05 +0000 (Thu, 01 Nov 2007) $
- *
- * @author Stephen Colebourne
- */
-public class NotFileFilter extends AbstractFileFilter implements Serializable {
-
- /** The filter */
- private final IOFileFilter filter;
-
- /**
- * Constructs a new file filter that NOTs the result of another filters.
- *
- * @param filter the filter, must not be null
- * @throws IllegalArgumentException if the filter is null
- */
- public NotFileFilter(IOFileFilter filter) {
- if (filter == null) {
- throw new IllegalArgumentException("The filter must not be null");
- }
- this.filter = filter;
- }
-
- /**
- * Checks to see if both filters are true.
- *
- * @param file the File to check
- * @return true if the filter returns false
- */
- public boolean accept(File file) {
- return ! filter.accept(file);
- }
-
- /**
- * Checks to see if both filters are true.
- *
- * @param file the File directory
- * @param name the filename
- * @return true if the filter returns false
- */
- public boolean accept(File file, String name) {
- return ! filter.accept(file, name);
- }
-
- /**
- * Provide a String representaion of this file filter.
- *
- * @return a String representaion
- */
- public String toString() {
- return super.toString() + "(" + filter.toString() + ")";
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/OrFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/OrFileFilter.java
deleted file mode 100644
index 520eefa4f..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/OrFileFilter.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A {@link java.io.FileFilter} providing conditional OR logic across a list of
- * file filters. This filter returns <code>true</code> if any filters in the
- * list return <code>true</code>. Otherwise, it returns <code>false</code>.
- * Checking of the file filter list stops when the first filter returns
- * <code>true</code>.
- *
- * @since Commons IO 1.0
- * @version $Revision: 606381 $ $Date: 2007-12-22 02:03:16 +0000 (Sat, 22 Dec 2007) $
- *
- * @author Steven Caswell
- */
-public class OrFileFilter
- extends AbstractFileFilter
- implements ConditionalFileFilter, Serializable {
-
- /** The list of file filters. */
- private List<IOFileFilter> fileFilters;
-
- /**
- * Constructs a new instance of <code>OrFileFilter</code>.
- *
- * @since Commons IO 1.1
- */
- public OrFileFilter() {
- this.fileFilters = new ArrayList<IOFileFilter>();
- }
-
- /**
- * Constructs a new instance of <code>OrFileFilter</code>
- * with the specified filters.
- *
- * @param fileFilters the file filters for this filter, copied, null ignored
- * @since Commons IO 1.1
- */
- public OrFileFilter(final List<IOFileFilter> fileFilters) {
- if (fileFilters == null) {
- this.fileFilters = new ArrayList<IOFileFilter>();
- } else {
- this.fileFilters = new ArrayList<IOFileFilter>(fileFilters);
- }
- }
-
- /**
- * Constructs a new file filter that ORs the result of two other filters.
- *
- * @param filter1 the first filter, must not be null
- * @param filter2 the second filter, must not be null
- * @throws IllegalArgumentException if either filter is null
- */
- public OrFileFilter(IOFileFilter filter1, IOFileFilter filter2) {
- if (filter1 == null || filter2 == null) {
- throw new IllegalArgumentException("The filters must not be null");
- }
- this.fileFilters = new ArrayList<IOFileFilter>();
- addFileFilter(filter1);
- addFileFilter(filter2);
- }
-
- /**
- * {@inheritDoc}
- */
- public void addFileFilter(final IOFileFilter ioFileFilter) {
- this.fileFilters.add(ioFileFilter);
- }
-
- /**
- * {@inheritDoc}
- */
- public List<IOFileFilter> getFileFilters() {
- return Collections.unmodifiableList(this.fileFilters);
- }
-
- /**
- * {@inheritDoc}
- */
- public boolean removeFileFilter(IOFileFilter ioFileFilter) {
- return this.fileFilters.remove(ioFileFilter);
- }
-
- /**
- * {@inheritDoc}
- */
- public void setFileFilters(final List<IOFileFilter> fileFilters) {
- this.fileFilters = fileFilters;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean accept(final File file) {
- for (Iterator<IOFileFilter> iter = this.fileFilters.iterator(); iter.hasNext();) {
- IOFileFilter fileFilter = iter.next();
- if (fileFilter.accept(file)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean accept(final File file, final String name) {
- for (Iterator<IOFileFilter> iter = this.fileFilters.iterator(); iter.hasNext();) {
- IOFileFilter fileFilter = iter.next();
- if (fileFilter.accept(file, name)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Provide a String representaion of this file filter.
- *
- * @return a String representaion
- */
- @Override
- public String toString() {
- StringBuffer buffer = new StringBuffer();
- buffer.append(super.toString());
- buffer.append("(");
- if (fileFilters != null) {
- for (int i = 0; i < fileFilters.size(); i++) {
- if (i > 0) {
- buffer.append(",");
- }
- Object filter = fileFilters.get(i);
- buffer.append(filter == null ? "null" : filter.toString());
- }
- }
- buffer.append(")");
- return buffer.toString();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/PrefixFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/PrefixFileFilter.java
deleted file mode 100644
index 8c6b737fb..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/PrefixFileFilter.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.List;
-
-import org.apache.commons.io.IOCase;
-
-/**
- * Filters filenames for a certain prefix.
- * <p>
- * For example, to print all files and directories in the
- * current directory whose name starts with <code>Test</code>:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( new PrefixFileFilter("Test") );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * @since Commons IO 1.0
- * @version $Revision: 606381 $ $Date: 2007-12-22 02:03:16 +0000 (Sat, 22 Dec 2007) $
- *
- * @author Stephen Colebourne
- * @author Federico Barbieri
- * @author Serge Knystautas
- * @author Peter Donald
- */
-public class PrefixFileFilter extends AbstractFileFilter implements Serializable {
-
- /** The filename prefixes to search for */
- private final String[] prefixes;
-
- /** Whether the comparison is case sensitive. */
- private final IOCase caseSensitivity;
-
- /**
- * Constructs a new Prefix file filter for a single prefix.
- *
- * @param prefix the prefix to allow, must not be null
- * @throws IllegalArgumentException if the prefix is null
- */
- public PrefixFileFilter(String prefix) {
- this(prefix, IOCase.SENSITIVE);
- }
-
- /**
- * Constructs a new Prefix file filter for a single prefix
- * specifying case-sensitivity.
- *
- * @param prefix the prefix to allow, must not be null
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- * @throws IllegalArgumentException if the prefix is null
- * @since Commons IO 1.4
- */
- public PrefixFileFilter(String prefix, IOCase caseSensitivity) {
- if (prefix == null) {
- throw new IllegalArgumentException("The prefix must not be null");
- }
- this.prefixes = new String[] {prefix};
- this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
- }
-
- /**
- * Constructs a new Prefix file filter for any of an array of prefixes.
- * <p>
- * The array is not cloned, so could be changed after constructing the
- * instance. This would be inadvisable however.
- *
- * @param prefixes the prefixes to allow, must not be null
- * @throws IllegalArgumentException if the prefix array is null
- */
- public PrefixFileFilter(String[] prefixes) {
- this(prefixes, IOCase.SENSITIVE);
- }
-
- /**
- * Constructs a new Prefix file filter for any of an array of prefixes
- * specifying case-sensitivity.
- * <p>
- * The array is not cloned, so could be changed after constructing the
- * instance. This would be inadvisable however.
- *
- * @param prefixes the prefixes to allow, must not be null
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- * @throws IllegalArgumentException if the prefix is null
- * @since Commons IO 1.4
- */
- public PrefixFileFilter(String[] prefixes, IOCase caseSensitivity) {
- if (prefixes == null) {
- throw new IllegalArgumentException("The array of prefixes must not be null");
- }
- this.prefixes = prefixes;
- this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
- }
-
- /**
- * Constructs a new Prefix file filter for a list of prefixes.
- *
- * @param prefixes the prefixes to allow, must not be null
- * @throws IllegalArgumentException if the prefix list is null
- * @throws ClassCastException if the list does not contain Strings
- */
- public PrefixFileFilter(List<String> prefixes) {
- this(prefixes, IOCase.SENSITIVE);
- }
-
- /**
- * Constructs a new Prefix file filter for a list of prefixes
- * specifying case-sensitivity.
- *
- * @param prefixes the prefixes to allow, must not be null
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- * @throws IllegalArgumentException if the prefix list is null
- * @throws ClassCastException if the list does not contain Strings
- * @since Commons IO 1.4
- */
- public PrefixFileFilter(List<String> prefixes, IOCase caseSensitivity) {
- if (prefixes == null) {
- throw new IllegalArgumentException("The list of prefixes must not be null");
- }
- this.prefixes = prefixes.toArray(new String[prefixes.size()]);
- this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
- }
-
- /**
- * Checks to see if the filename starts with the prefix.
- *
- * @param file the File to check
- * @return true if the filename starts with one of our prefixes
- */
- @Override
- public boolean accept(File file) {
- String name = file.getName();
- for (int i = 0; i < this.prefixes.length; i++) {
- if (caseSensitivity.checkStartsWith(name, prefixes[i])) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Checks to see if the filename starts with the prefix.
- *
- * @param file the File directory
- * @param name the filename
- * @return true if the filename starts with one of our prefixes
- */
- @Override
- public boolean accept(File file, String name) {
- for (int i = 0; i < prefixes.length; i++) {
- if (caseSensitivity.checkStartsWith(name, prefixes[i])) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Provide a String representaion of this file filter.
- *
- * @return a String representaion
- */
- @Override
- public String toString() {
- StringBuffer buffer = new StringBuffer();
- buffer.append(super.toString());
- buffer.append("(");
- if (prefixes != null) {
- for (int i = 0; i < prefixes.length; i++) {
- if (i > 0) {
- buffer.append(",");
- }
- buffer.append(prefixes[i]);
- }
- }
- buffer.append(")");
- return buffer.toString();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/RegexFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/RegexFileFilter.java
deleted file mode 100644
index b49a1bd3b..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/RegexFileFilter.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.regex.Pattern;
-
-import org.apache.commons.io.IOCase;
-
-/**
- * Filters files using supplied regular expression(s).
- * <p/>
- * See java.util.regex.Pattern for regex matching rules
- * <p/>
- *
- * <p/>
- * e.g.
- * <pre>
- * File dir = new File(".");
- * FileFilter fileFilter = new RegexFileFilter("^.*[tT]est(-\\d+)?\\.java$");
- * File[] files = dir.listFiles(fileFilter);
- * for (int i = 0; i < files.length; i++) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * @author Oliver Siegmar
- * @version $Revision: 606381 $
- * @since Commons IO 1.4
- */
-public class RegexFileFilter extends AbstractFileFilter implements Serializable {
-
- /** The regular expression pattern that will be used to match filenames */
- private final Pattern pattern;
-
- /**
- * Construct a new regular expression filter.
- *
- * @param pattern regular string expression to match
- * @throws IllegalArgumentException if the pattern is null
- */
- public RegexFileFilter(String pattern) {
- if (pattern == null) {
- throw new IllegalArgumentException("Pattern is missing");
- }
-
- this.pattern = Pattern.compile(pattern);
- }
-
- /**
- * Construct a new regular expression filter with the specified flags case sensitivity.
- *
- * @param pattern regular string expression to match
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- * @throws IllegalArgumentException if the pattern is null
- */
- public RegexFileFilter(String pattern, IOCase caseSensitivity) {
- if (pattern == null) {
- throw new IllegalArgumentException("Pattern is missing");
- }
- int flags = 0;
- if (caseSensitivity != null && !caseSensitivity.isCaseSensitive()) {
- flags = Pattern.CASE_INSENSITIVE;
- }
- this.pattern = Pattern.compile(pattern, flags);
- }
-
- /**
- * Construct a new regular expression filter with the specified flags.
- *
- * @param pattern regular string expression to match
- * @param flags pattern flags - e.g. {@link Pattern#CASE_INSENSITIVE}
- * @throws IllegalArgumentException if the pattern is null
- */
- public RegexFileFilter(String pattern, int flags) {
- if (pattern == null) {
- throw new IllegalArgumentException("Pattern is missing");
- }
- this.pattern = Pattern.compile(pattern, flags);
- }
-
- /**
- * Construct a new regular expression filter for a compiled regular expression
- *
- * @param pattern regular expression to match
- * @throws IllegalArgumentException if the pattern is null
- */
- public RegexFileFilter(Pattern pattern) {
- if (pattern == null) {
- throw new IllegalArgumentException("Pattern is missing");
- }
-
- this.pattern = pattern;
- }
-
- /**
- * Checks to see if the filename matches one of the regular expressions.
- *
- * @param dir the file directory
- * @param name the filename
- * @return true if the filename matches one of the regular expressions
- */
- public boolean accept(File dir, String name) {
- return (pattern.matcher(name).matches());
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/SizeFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/SizeFileFilter.java
deleted file mode 100644
index 614e4243f..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/SizeFileFilter.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-
-/**
- * Filters files based on size, can filter either smaller files or
- * files equal to or larger than a given threshold.
- * <p>
- * For example, to print all files and directories in the
- * current directory whose size is greater than 1 MB:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( new SizeFileFilter(1024 * 1024) );
- * for ( int i = 0; i &lt; files.length; i++ ) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * @author Rahul Akolkar
- * @version $Id: SizeFileFilter.java 591058 2007-11-01 15:47:05Z niallp $
- * @since Commons IO 1.2
- */
-public class SizeFileFilter extends AbstractFileFilter implements Serializable {
-
- /** The size threshold. */
- private final long size;
- /** Whether the files accepted will be larger or smaller. */
- private final boolean acceptLarger;
-
- /**
- * Constructs a new size file filter for files equal to or
- * larger than a certain size.
- *
- * @param size the threshold size of the files
- * @throws IllegalArgumentException if the size is negative
- */
- public SizeFileFilter(long size) {
- this(size, true);
- }
-
- /**
- * Constructs a new size file filter for files based on a certain size
- * threshold.
- *
- * @param size the threshold size of the files
- * @param acceptLarger if true, files equal to or larger are accepted,
- * otherwise smaller ones (but not equal to)
- * @throws IllegalArgumentException if the size is negative
- */
- public SizeFileFilter(long size, boolean acceptLarger) {
- if (size < 0) {
- throw new IllegalArgumentException("The size must be non-negative");
- }
- this.size = size;
- this.acceptLarger = acceptLarger;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Checks to see if the size of the file is favorable.
- * <p>
- * If size equals threshold and smaller files are required,
- * file <b>IS NOT</b> selected.
- * If size equals threshold and larger files are required,
- * file <b>IS</b> selected.
- *
- * @param file the File to check
- * @return true if the filename matches
- */
- public boolean accept(File file) {
- boolean smaller = file.length() < size;
- return acceptLarger ? !smaller : smaller;
- }
-
- /**
- * Provide a String representaion of this file filter.
- *
- * @return a String representaion
- */
- public String toString() {
- String condition = acceptLarger ? ">=" : "<";
- return super.toString() + "(" + condition + size + ")";
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/SuffixFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/SuffixFileFilter.java
deleted file mode 100644
index 8bdf781a4..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/SuffixFileFilter.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.List;
-
-import org.apache.commons.io.IOCase;
-
-/**
- * Filters files based on the suffix (what the filename ends with).
- * This is used in retrieving all the files of a particular type.
- * <p>
- * For example, to retrieve and print all <code>*.java</code> files
- * in the current directory:
- *
- * <pre>
- * File dir = new File(".");
- * String[] files = dir.list( new SuffixFileFilter(".java") );
- * for (int i = 0; i &lt; files.length; i++) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * @since Commons IO 1.0
- * @version $Revision: 606381 $ $Date: 2007-12-22 02:03:16 +0000 (Sat, 22 Dec 2007) $
- *
- * @author Stephen Colebourne
- * @author Federico Barbieri
- * @author Serge Knystautas
- * @author Peter Donald
- */
-public class SuffixFileFilter extends AbstractFileFilter implements Serializable {
-
- /** The filename suffixes to search for */
- private final String[] suffixes;
-
- /** Whether the comparison is case sensitive. */
- private final IOCase caseSensitivity;
-
- /**
- * Constructs a new Suffix file filter for a single extension.
- *
- * @param suffix the suffix to allow, must not be null
- * @throws IllegalArgumentException if the suffix is null
- */
- public SuffixFileFilter(String suffix) {
- this(suffix, IOCase.SENSITIVE);
- }
-
- /**
- * Constructs a new Suffix file filter for a single extension
- * specifying case-sensitivity.
- *
- * @param suffix the suffix to allow, must not be null
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- * @throws IllegalArgumentException if the suffix is null
- * @since Commons IO 1.4
- */
- public SuffixFileFilter(String suffix, IOCase caseSensitivity) {
- if (suffix == null) {
- throw new IllegalArgumentException("The suffix must not be null");
- }
- this.suffixes = new String[] {suffix};
- this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
- }
-
- /**
- * Constructs a new Suffix file filter for an array of suffixs.
- * <p>
- * The array is not cloned, so could be changed after constructing the
- * instance. This would be inadvisable however.
- *
- * @param suffixes the suffixes to allow, must not be null
- * @throws IllegalArgumentException if the suffix array is null
- */
- public SuffixFileFilter(String[] suffixes) {
- this(suffixes, IOCase.SENSITIVE);
- }
-
- /**
- * Constructs a new Suffix file filter for an array of suffixs
- * specifying case-sensitivity.
- * <p>
- * The array is not cloned, so could be changed after constructing the
- * instance. This would be inadvisable however.
- *
- * @param suffixes the suffixes to allow, must not be null
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- * @throws IllegalArgumentException if the suffix array is null
- * @since Commons IO 1.4
- */
- public SuffixFileFilter(String[] suffixes, IOCase caseSensitivity) {
- if (suffixes == null) {
- throw new IllegalArgumentException("The array of suffixes must not be null");
- }
- this.suffixes = suffixes;
- this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
- }
-
- /**
- * Constructs a new Suffix file filter for a list of suffixes.
- *
- * @param suffixes the suffixes to allow, must not be null
- * @throws IllegalArgumentException if the suffix list is null
- * @throws ClassCastException if the list does not contain Strings
- */
- public SuffixFileFilter(List<String> suffixes) {
- this(suffixes, IOCase.SENSITIVE);
- }
-
- /**
- * Constructs a new Suffix file filter for a list of suffixes
- * specifying case-sensitivity.
- *
- * @param suffixes the suffixes to allow, must not be null
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- * @throws IllegalArgumentException if the suffix list is null
- * @throws ClassCastException if the list does not contain Strings
- * @since Commons IO 1.4
- */
- public SuffixFileFilter(List<String> suffixes, IOCase caseSensitivity) {
- if (suffixes == null) {
- throw new IllegalArgumentException("The list of suffixes must not be null");
- }
- this.suffixes = suffixes.toArray(new String[suffixes.size()]);
- this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
- }
-
- /**
- * Checks to see if the filename ends with the suffix.
- *
- * @param file the File to check
- * @return true if the filename ends with one of our suffixes
- */
- @Override
- public boolean accept(File file) {
- String name = file.getName();
- for (int i = 0; i < this.suffixes.length; i++) {
- if (caseSensitivity.checkEndsWith(name, suffixes[i])) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Checks to see if the filename ends with the suffix.
- *
- * @param file the File directory
- * @param name the filename
- * @return true if the filename ends with one of our suffixes
- */
- @Override
- public boolean accept(File file, String name) {
- for (int i = 0; i < this.suffixes.length; i++) {
- if (caseSensitivity.checkEndsWith(name, suffixes[i])) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Provide a String representaion of this file filter.
- *
- * @return a String representaion
- */
- @Override
- public String toString() {
- StringBuffer buffer = new StringBuffer();
- buffer.append(super.toString());
- buffer.append("(");
- if (suffixes != null) {
- for (int i = 0; i < suffixes.length; i++) {
- if (i > 0) {
- buffer.append(",");
- }
- buffer.append(suffixes[i]);
- }
- }
- buffer.append(")");
- return buffer.toString();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/TrueFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/TrueFileFilter.java
deleted file mode 100644
index be1b13a7e..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/TrueFileFilter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-
-/**
- * A file filter that always returns true.
- *
- * @since Commons IO 1.0
- * @version $Revision: 587978 $ $Date: 2007-10-24 20:36:51 +0100 (Wed, 24 Oct 2007) $
- *
- * @author Stephen Colebourne
- */
-public class TrueFileFilter implements IOFileFilter, Serializable {
-
- /**
- * Singleton instance of true filter.
- * @since Commons IO 1.3
- */
- public static final IOFileFilter TRUE = new TrueFileFilter();
- /**
- * Singleton instance of true filter.
- * Please use the identical TrueFileFilter.TRUE constant.
- * The new name is more JDK 1.5 friendly as it doesn't clash with other
- * values when using static imports.
- */
- public static final IOFileFilter INSTANCE = TRUE;
-
- /**
- * Restrictive consructor.
- */
- protected TrueFileFilter() {
- }
-
- /**
- * Returns true.
- *
- * @param file the file to check
- * @return true
- */
- public boolean accept(File file) {
- return true;
- }
-
- /**
- * Returns true.
- *
- * @param dir the directory to check
- * @param name the filename
- * @return true
- */
- public boolean accept(File dir, String name) {
- return true;
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/WildcardFileFilter.java b/emailcommon/src/org/apache/commons/io/filefilter/WildcardFileFilter.java
deleted file mode 100644
index f3a1ee930..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/WildcardFileFilter.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.filefilter;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.List;
-
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.IOCase;
-
-/**
- * Filters files using the supplied wildcards.
- * <p>
- * This filter selects files and directories based on one or more wildcards.
- * Testing is case-sensitive by default, but this can be configured.
- * <p>
- * The wildcard matcher uses the characters '?' and '*' to represent a
- * single or multiple wildcard characters.
- * This is the same as often found on Dos/Unix command lines.
- * The extension check is case-sensitive by .
- * See {@link FilenameUtils#wildcardMatchOnSystem} for more information.
- * <p>
- * For example:
- * <pre>
- * File dir = new File(".");
- * FileFilter fileFilter = new WildcardFileFilter("*test*.java~*~");
- * File[] files = dir.listFiles(fileFilter);
- * for (int i = 0; i < files.length; i++) {
- * System.out.println(files[i]);
- * }
- * </pre>
- *
- * @author Jason Anderson
- * @version $Revision: 155419 $ $Date: 2007-12-22 02:03:16 +0000 (Sat, 22 Dec 2007) $
- * @since Commons IO 1.3
- */
-public class WildcardFileFilter extends AbstractFileFilter implements Serializable {
-
- /** The wildcards that will be used to match filenames. */
- private final String[] wildcards;
- /** Whether the comparison is case sensitive. */
- private final IOCase caseSensitivity;
-
- /**
- * Construct a new case-sensitive wildcard filter for a single wildcard.
- *
- * @param wildcard the wildcard to match
- * @throws IllegalArgumentException if the pattern is null
- */
- public WildcardFileFilter(String wildcard) {
- this(wildcard, null);
- }
-
- /**
- * Construct a new wildcard filter for a single wildcard specifying case-sensitivity.
- *
- * @param wildcard the wildcard to match, not null
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- * @throws IllegalArgumentException if the pattern is null
- */
- public WildcardFileFilter(String wildcard, IOCase caseSensitivity) {
- if (wildcard == null) {
- throw new IllegalArgumentException("The wildcard must not be null");
- }
- this.wildcards = new String[] { wildcard };
- this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
- }
-
- /**
- * Construct a new case-sensitive wildcard filter for an array of wildcards.
- * <p>
- * The array is not cloned, so could be changed after constructing the
- * instance. This would be inadvisable however.
- *
- * @param wildcards the array of wildcards to match
- * @throws IllegalArgumentException if the pattern array is null
- */
- public WildcardFileFilter(String[] wildcards) {
- this(wildcards, null);
- }
-
- /**
- * Construct a new wildcard filter for an array of wildcards specifying case-sensitivity.
- * <p>
- * The array is not cloned, so could be changed after constructing the
- * instance. This would be inadvisable however.
- *
- * @param wildcards the array of wildcards to match, not null
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- * @throws IllegalArgumentException if the pattern array is null
- */
- public WildcardFileFilter(String[] wildcards, IOCase caseSensitivity) {
- if (wildcards == null) {
- throw new IllegalArgumentException("The wildcard array must not be null");
- }
- this.wildcards = wildcards;
- this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
- }
-
- /**
- * Construct a new case-sensitive wildcard filter for a list of wildcards.
- *
- * @param wildcards the list of wildcards to match, not null
- * @throws IllegalArgumentException if the pattern list is null
- * @throws ClassCastException if the list does not contain Strings
- */
- public WildcardFileFilter(List<String> wildcards) {
- this(wildcards, null);
- }
-
- /**
- * Construct a new wildcard filter for a list of wildcards specifying case-sensitivity.
- *
- * @param wildcards the list of wildcards to match, not null
- * @param caseSensitivity how to handle case sensitivity, null means case-sensitive
- * @throws IllegalArgumentException if the pattern list is null
- * @throws ClassCastException if the list does not contain Strings
- */
- public WildcardFileFilter(List<String> wildcards, IOCase caseSensitivity) {
- if (wildcards == null) {
- throw new IllegalArgumentException("The wildcard list must not be null");
- }
- this.wildcards = wildcards.toArray(new String[wildcards.size()]);
- this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Checks to see if the filename matches one of the wildcards.
- *
- * @param dir the file directory
- * @param name the filename
- * @return true if the filename matches one of the wildcards
- */
- @Override
- public boolean accept(File dir, String name) {
- for (int i = 0; i < wildcards.length; i++) {
- if (FilenameUtils.wildcardMatch(name, wildcards[i], caseSensitivity)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Checks to see if the filename matches one of the wildcards.
- *
- * @param file the file to check
- * @return true if the filename matches one of the wildcards
- */
- @Override
- public boolean accept(File file) {
- String name = file.getName();
- for (int i = 0; i < wildcards.length; i++) {
- if (FilenameUtils.wildcardMatch(name, wildcards[i], caseSensitivity)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Provide a String representaion of this file filter.
- *
- * @return a String representaion
- */
- @Override
- public String toString() {
- StringBuffer buffer = new StringBuffer();
- buffer.append(super.toString());
- buffer.append("(");
- if (wildcards != null) {
- for (int i = 0; i < wildcards.length; i++) {
- if (i > 0) {
- buffer.append(",");
- }
- buffer.append(wildcards[i]);
- }
- }
- buffer.append(")");
- return buffer.toString();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/filefilter/package.html b/emailcommon/src/org/apache/commons/io/filefilter/package.html
deleted file mode 100644
index 7a45f251d..000000000
--- a/emailcommon/src/org/apache/commons/io/filefilter/package.html
+++ /dev/null
@@ -1,143 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements. See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<html>
-<body>
-<p>This package defines an interface (IOFileFilter) that combines both
-{@link java.io.FileFilter} and {@link java.io.FilenameFilter}. Besides
-that the package offers a series of ready-to-use implementations of the
-IOFileFilter interface including implementation that allow you to combine
-other such filters.</p>
-<p>These filter can be used to list files or in {@link java.awt.FileDialog},
-for example.</p>
-
-<p>There are a number of 'primitive' filters:</p>
-
-<table>
- <tbody>
- <tr>
- <td><a href="DirectoryFileFilter.html">DirectoryFilter</a></td>
- <td>Only accept directories</td>
- </tr>
- <tr>
- <td><a href="PrefixFileFilter.html">PrefixFileFilter</a></td>
- <td>Filter based on a prefix</td>
- </tr>
- <tr>
- <td><a href="SuffixFileFilter.html">SuffixFileFilter</a></td>
- <td>Filter based on a suffix</td>
- </tr>
- <tr>
- <td><a href="NameFileFilter.html">NameFileFilter</a></td>
- <td>Filter based on a filename</td>
- </tr>
- <tr>
- <td><a href="WildcardFileFilter.html">WildcardFileFilter</a></td>
- <td>Filter based on wildcards</td>
- </tr>
- <tr>
- <td><a href="AgeFileFilter.html">AgeFileFilter</a></td>
- <td>Filter based on last modified time of file</td>
- </tr>
- <tr>
- <td><a href="SizeFileFilter.html">SizeFileFilter</a></td>
- <td>Filter based on file size</td>
- </tr>
- </tbody>
-</table>
-
-<p>And there are five 'boolean' filters:</p>
-
-<table>
- <tbody>
- <tr>
- <td><a href="TrueFileFilter.html">TrueFileFilter</a></td>
- <td>Accept all files</td>
- </tr>
- <tr>
- <td><a href="FalseFileFilter.html">FalseFileFilter</a></td>
- <td>Accept no files</td>
- </tr>
- <tr>
- <td><a href="NotFileFilter.html">NotFileFilter</a></td>
- <td>Applies a logical NOT to an existing filter</td>
- </tr>
- <tr>
- <td><a href="AndFileFilter.html">AndFileFilter</a></td>
- <td>Combines two filters using a logical AND</td>
- </tr>
- <tr>
- <td><a href="OrFileFilter.html">OrFileFilter</a></td>
- <td>Combines two filter using a logical OR</td>
- </tr>
-
- </tbody>
-</table>
-
-<p>These boolean FilenameFilters can be nested, to allow arbitrary expressions.
-For example, here is how one could print all non-directory files in the
-current directory, starting with "A", and ending in ".java" or ".class":</p>
-
-<pre>
- File dir = new File(".");
- String[] files = dir.list(
- new AndFileFilter(
- new AndFileFilter(
- new PrefixFileFilter("A"),
- new OrFileFilter(
- new SuffixFileFilter(".class"),
- new SuffixFileFilter(".java")
- )
- ),
- new NotFileFilter(
- new DirectoryFileFilter()
- )
- )
- );
- for ( int i=0; i&lt;files.length; i++ ) {
- System.out.println(files[i]);
- }
-</pre>
-
-<p>This package also contains a utility class:
-<a href="FileFilterUtils.html">FileFilterUtils</a>. It allows you to use all
-file filters without having to put them in the import section. Here's how the
-above example will look using FileFilterUtils:</p>
-<pre>
- File dir = new File(".");
- String[] files = dir.list(
- FileFilterUtils.andFileFilter(
- FileFilterUtils.andFileFilter(
- FileFilterUtils.prefixFileFilter("A"),
- FileFilterUtils.orFileFilter(
- FileFilterUtils.suffixFileFilter(".class"),
- FileFilterUtils.suffixFileFilter(".java")
- )
- ),
- FileFilterUtils.notFileFilter(
- FileFilterUtils.directoryFileFilter()
- )
- )
- );
- for ( int i=0; i&lt;files.length; i++ ) {
- System.out.println(files[i]);
- }
-</pre>
-<p>There are a few other goodies in that class so please have a look at the
-documentation in detail.</p>
- </body>
-</html>
diff --git a/emailcommon/src/org/apache/commons/io/input/AutoCloseInputStream.java b/emailcommon/src/org/apache/commons/io/input/AutoCloseInputStream.java
deleted file mode 100644
index bb62358f7..000000000
--- a/emailcommon/src/org/apache/commons/io/input/AutoCloseInputStream.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.input;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Proxy stream that closes and discards the underlying stream as soon as the
- * end of input has been reached or when the stream is explicitly closed.
- * Not even a reference to the underlying stream is kept after it has been
- * closed, so any allocated in-memory buffers can be freed even if the
- * client application still keeps a reference to the proxy stream.
- * <p>
- * This class is typically used to release any resources related to an open
- * stream as soon as possible even if the client application (by not explicitly
- * closing the stream when no longer needed) or the underlying stream (by not
- * releasing resources once the last byte has been read) do not do that.
- *
- * @version $Id: AutoCloseInputStream.java 610010 2008-01-08 14:50:59Z niallp $
- * @since Commons IO 1.4
- */
-public class AutoCloseInputStream extends ProxyInputStream {
-
- /**
- * Creates an automatically closing proxy for the given input stream.
- *
- * @param in underlying input stream
- */
- public AutoCloseInputStream(InputStream in) {
- super(in);
- }
-
- /**
- * Closes the underlying input stream and replaces the reference to it
- * with a {@link ClosedInputStream} instance.
- * <p>
- * This method is automatically called by the read methods when the end
- * of input has been reached.
- * <p>
- * Note that it is safe to call this method any number of times. The original
- * underlying input stream is closed and discarded only once when this
- * method is first called.
- *
- * @throws IOException if the underlying input stream can not be closed
- */
- public void close() throws IOException {
- in.close();
- in = new ClosedInputStream();
- }
-
- /**
- * Reads and returns a single byte from the underlying input stream.
- * If the underlying stream returns -1, the {@link #close()} method is
- * called to automatically close and discard the stream.
- *
- * @return next byte in the stream, or -1 if no more bytes are available
- * @throws IOException if the stream could not be read or closed
- */
- public int read() throws IOException {
- int n = in.read();
- if (n == -1) {
- close();
- }
- return n;
- }
-
- /**
- * Reads and returns bytes from the underlying input stream to the given
- * buffer. If the underlying stream returns -1, the {@link #close()} method
- * i called to automatically close and discard the stream.
- *
- * @param b buffer to which bytes from the stream are written
- * @return number of bytes read, or -1 if no more bytes are available
- * @throws IOException if the stream could not be read or closed
- */
- public int read(byte[] b) throws IOException {
- int n = in.read(b);
- if (n == -1) {
- close();
- }
- return n;
- }
-
- /**
- * Reads and returns bytes from the underlying input stream to the given
- * buffer. If the underlying stream returns -1, the {@link #close()} method
- * i called to automatically close and discard the stream.
- *
- * @param b buffer to which bytes from the stream are written
- * @param off start offset within the buffer
- * @param len maximum number of bytes to read
- * @return number of bytes read, or -1 if no more bytes are available
- * @throws IOException if the stream could not be read or closed
- */
- public int read(byte[] b, int off, int len) throws IOException {
- int n = in.read(b, off, len);
- if (n == -1) {
- close();
- }
- return n;
- }
-
- /**
- * Ensures that the stream is closed before it gets garbage-collected.
- * As mentioned in {@link #close()}, this is a no-op if the stream has
- * already been closed.
- * @throws Throwable if an error occurs
- */
- protected void finalize() throws Throwable {
- close();
- super.finalize();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/input/CharSequenceReader.java b/emailcommon/src/org/apache/commons/io/input/CharSequenceReader.java
deleted file mode 100644
index 6ee11d87d..000000000
--- a/emailcommon/src/org/apache/commons/io/input/CharSequenceReader.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.input;
-
-import java.io.Reader;
-import java.io.Serializable;
-
-/**
- * {@link Reader} implementation that can read from String, StringBuffer,
- * StringBuilder or CharBuffer.
- * <p>
- * <strong>Note:</strong> Supports {@link #mark(int)} and {@link #reset()}.
- *
- * @version $Revision: 610516 $ $Date: 2008-01-09 19:05:05 +0000 (Wed, 09 Jan 2008) $
- * @since Commons IO 1.4
- */
-public class CharSequenceReader extends Reader implements Serializable {
-
- private final CharSequence charSequence;
- private int idx;
- private int mark;
-
- /**
- * Construct a new instance with the specified character sequence.
- *
- * @param charSequence The character sequence, may be <code>null</code>
- */
- public CharSequenceReader(CharSequence charSequence) {
- this.charSequence = (charSequence != null ? charSequence : "");
- }
-
- /**
- * Close resets the file back to the start and removes any marked position.
- */
- public void close() {
- idx = 0;
- mark = 0;
- }
-
- /**
- * Mark the current position.
- *
- * @param readAheadLimit ignored
- */
- public void mark(int readAheadLimit) {
- mark = idx;
- }
-
- /**
- * Mark is supported (returns true).
- *
- * @return <code>true</code>
- */
- public boolean markSupported() {
- return true;
- }
-
- /**
- * Read a single character.
- *
- * @return the next character from the character sequence
- * or -1 if the end has been reached.
- */
- public int read() {
- if (idx >= charSequence.length()) {
- return -1;
- } else {
- return charSequence.charAt(idx++);
- }
- }
-
- /**
- * Read the sepcified number of characters into the array.
- *
- * @param array The array to store the characters in
- * @param offset The starting position in the array to store
- * @param length The maximum number of characters to read
- * @return The number of characters read or -1 if there are
- * no more
- */
- public int read(char[] array, int offset, int length) {
- if (idx >= charSequence.length()) {
- return -1;
- }
- if (array == null) {
- throw new NullPointerException("Character array is missing");
- }
- if (length < 0 || (offset + length) > array.length) {
- throw new IndexOutOfBoundsException("Array Size=" + array.length +
- ", offset=" + offset + ", length=" + length);
- }
- int count = 0;
- for (int i = 0; i < length; i++) {
- int c = read();
- if (c == -1) {
- return count;
- }
- array[offset + i] = (char)c;
- count++;
- }
- return count;
- }
-
- /**
- * Reset the reader to the last marked position (or the beginning if
- * mark has not been called).
- */
- public void reset() {
- idx = mark;
- }
-
- /**
- * Skip the specified number of characters.
- *
- * @param n The number of characters to skip
- * @return The actual number of characters skipped
- */
- public long skip(long n) {
- if (n < 0) {
- throw new IllegalArgumentException(
- "Number of characters to skip is less than zero: " + n);
- }
- if (idx >= charSequence.length()) {
- return -1;
- }
- int dest = (int)Math.min(charSequence.length(), (idx + n));
- int count = dest - idx;
- idx = dest;
- return count;
- }
-
- /**
- * Return a String representation of the underlying
- * character sequence.
- *
- * @return The contents of the character sequence
- */
- public String toString() {
- return charSequence.toString();
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/input/ClassLoaderObjectInputStream.java b/emailcommon/src/org/apache/commons/io/input/ClassLoaderObjectInputStream.java
deleted file mode 100644
index 13d048946..000000000
--- a/emailcommon/src/org/apache/commons/io/input/ClassLoaderObjectInputStream.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.input;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectStreamClass;
-import java.io.StreamCorruptedException;
-
-/**
- * A special ObjectInputStream that loads a class based on a specified
- * <code>ClassLoader</code> rather than the system default.
- * <p>
- * This is useful in dynamic container environments.
- *
- * @author Paul Hammant
- * @version $Id: ClassLoaderObjectInputStream.java 437567 2006-08-28 06:39:07Z bayard $
- * @since Commons IO 1.1
- */
-public class ClassLoaderObjectInputStream extends ObjectInputStream {
-
- /** The class loader to use. */
- private ClassLoader classLoader;
-
- /**
- * Constructs a new ClassLoaderObjectInputStream.
- *
- * @param classLoader the ClassLoader from which classes should be loaded
- * @param inputStream the InputStream to work on
- * @throws IOException in case of an I/O error
- * @throws StreamCorruptedException if the stream is corrupted
- */
- public ClassLoaderObjectInputStream(
- ClassLoader classLoader, InputStream inputStream)
- throws IOException, StreamCorruptedException {
- super(inputStream);
- this.classLoader = classLoader;
- }
-
- /**
- * Resolve a class specified by the descriptor using the
- * specified ClassLoader or the super ClassLoader.
- *
- * @param objectStreamClass descriptor of the class
- * @return the Class object described by the ObjectStreamClass
- * @throws IOException in case of an I/O error
- * @throws ClassNotFoundException if the Class cannot be found
- */
- protected Class resolveClass(ObjectStreamClass objectStreamClass)
- throws IOException, ClassNotFoundException {
-
- Class clazz = Class.forName(objectStreamClass.getName(), false, classLoader);
-
- if (clazz != null) {
- // the classloader knows of the class
- return clazz;
- } else {
- // classloader knows not of class, let the super classloader do it
- return super.resolveClass(objectStreamClass);
- }
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/input/CloseShieldInputStream.java b/emailcommon/src/org/apache/commons/io/input/CloseShieldInputStream.java
deleted file mode 100644
index 2058beeb2..000000000
--- a/emailcommon/src/org/apache/commons/io/input/CloseShieldInputStream.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.input;
-
-import java.io.InputStream;
-
-/**
- * Proxy stream that prevents the underlying input stream from being closed.
- * <p>
- * This class is typically used in cases where an input stream needs to be
- * passed to a component that wants to explicitly close the stream even if
- * more input would still be available to other components.
- *
- * @version $Id: CloseShieldInputStream.java 587913 2007-10-24 15:47:30Z niallp $
- * @since Commons IO 1.4
- */
-public class CloseShieldInputStream extends ProxyInputStream {
-
- /**
- * Creates a proxy that shields the given input stream from being
- * closed.
- *
- * @param in underlying input stream
- */
- public CloseShieldInputStream(InputStream in) {
- super(in);
- }
-
- /**
- * Replaces the underlying input stream with a {@link ClosedInputStream}
- * sentinel. The original input stream will remain open, but this proxy
- * will appear closed.
- */
- public void close() {
- in = new ClosedInputStream();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/input/ClosedInputStream.java b/emailcommon/src/org/apache/commons/io/input/ClosedInputStream.java
deleted file mode 100644
index 86c83c903..000000000
--- a/emailcommon/src/org/apache/commons/io/input/ClosedInputStream.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.input;
-
-import java.io.InputStream;
-
-/**
- * Closed input stream. This stream returns -1 to all attempts to read
- * something from the stream.
- * <p>
- * Typically uses of this class include testing for corner cases in methods
- * that accept input streams and acting as a sentinel value instead of a
- * <code>null</code> input stream.
- *
- * @version $Id: ClosedInputStream.java 601751 2007-12-06 14:55:45Z niallp $
- * @since Commons IO 1.4
- */
-public class ClosedInputStream extends InputStream {
-
- /**
- * A singleton.
- */
- public static final ClosedInputStream CLOSED_INPUT_STREAM = new ClosedInputStream();
-
- /**
- * Returns -1 to indicate that the stream is closed.
- *
- * @return always -1
- */
- public int read() {
- return -1;
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/input/CountingInputStream.java b/emailcommon/src/org/apache/commons/io/input/CountingInputStream.java
deleted file mode 100644
index 2782276c8..000000000
--- a/emailcommon/src/org/apache/commons/io/input/CountingInputStream.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.input;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A decorating input stream that counts the number of bytes that have passed
- * through the stream so far.
- * <p>
- * A typical use case would be during debugging, to ensure that data is being
- * read as expected.
- *
- * @author Marcelo Liberato
- * @version $Id: CountingInputStream.java 471628 2006-11-06 04:06:45Z bayard $
- */
-public class CountingInputStream extends ProxyInputStream {
-
- /** The count of bytes that have passed. */
- private long count;
-
- /**
- * Constructs a new CountingInputStream.
- *
- * @param in the InputStream to delegate to
- */
- public CountingInputStream(InputStream in) {
- super(in);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Reads a number of bytes into the byte array, keeping count of the
- * number read.
- *
- * @param b the buffer into which the data is read, not null
- * @return the total number of bytes read into the buffer, -1 if end of stream
- * @throws IOException if an I/O error occurs
- * @see java.io.InputStream#read(byte[])
- */
- public int read(byte[] b) throws IOException {
- int found = super.read(b);
- this.count += (found >= 0) ? found : 0;
- return found;
- }
-
- /**
- * Reads a number of bytes into the byte array at a specific offset,
- * keeping count of the number read.
- *
- * @param b the buffer into which the data is read, not null
- * @param off the start offset in the buffer
- * @param len the maximum number of bytes to read
- * @return the total number of bytes read into the buffer, -1 if end of stream
- * @throws IOException if an I/O error occurs
- * @see java.io.InputStream#read(byte[], int, int)
- */
- public int read(byte[] b, int off, int len) throws IOException {
- int found = super.read(b, off, len);
- this.count += (found >= 0) ? found : 0;
- return found;
- }
-
- /**
- * Reads the next byte of data adding to the count of bytes received
- * if a byte is successfully read.
- *
- * @return the byte read, -1 if end of stream
- * @throws IOException if an I/O error occurs
- * @see java.io.InputStream#read()
- */
- public int read() throws IOException {
- int found = super.read();
- this.count += (found >= 0) ? 1 : 0;
- return found;
- }
-
- /**
- * Skips the stream over the specified number of bytes, adding the skipped
- * amount to the count.
- *
- * @param length the number of bytes to skip
- * @return the actual number of bytes skipped
- * @throws IOException if an I/O error occurs
- * @see java.io.InputStream#skip(long)
- */
- public long skip(final long length) throws IOException {
- final long skip = super.skip(length);
- this.count += skip;
- return skip;
- }
-
- //-----------------------------------------------------------------------
- /**
- * The number of bytes that have passed through this stream.
- * <p>
- * NOTE: From v1.3 this method throws an ArithmeticException if the
- * count is greater than can be expressed by an <code>int</code>.
- * See {@link #getByteCount()} for a method using a <code>long</code>.
- *
- * @return the number of bytes accumulated
- * @throws ArithmeticException if the byte count is too large
- */
- public synchronized int getCount() {
- long result = getByteCount();
- if (result > Integer.MAX_VALUE) {
- throw new ArithmeticException("The byte count " + result + " is too large to be converted to an int");
- }
- return (int) result;
- }
-
- /**
- * Set the byte count back to 0.
- * <p>
- * NOTE: From v1.3 this method throws an ArithmeticException if the
- * count is greater than can be expressed by an <code>int</code>.
- * See {@link #resetByteCount()} for a method using a <code>long</code>.
- *
- * @return the count previous to resetting
- * @throws ArithmeticException if the byte count is too large
- */
- public synchronized int resetCount() {
- long result = resetByteCount();
- if (result > Integer.MAX_VALUE) {
- throw new ArithmeticException("The byte count " + result + " is too large to be converted to an int");
- }
- return (int) result;
- }
-
- /**
- * The number of bytes that have passed through this stream.
- * <p>
- * NOTE: This method is an alternative for <code>getCount()</code>
- * and was added because that method returns an integer which will
- * result in incorrect count for files over 2GB.
- *
- * @return the number of bytes accumulated
- * @since Commons IO 1.3
- */
- public synchronized long getByteCount() {
- return this.count;
- }
-
- /**
- * Set the byte count back to 0.
- * <p>
- * NOTE: This method is an alternative for <code>resetCount()</code>
- * and was added because that method returns an integer which will
- * result in incorrect count for files over 2GB.
- *
- * @return the count previous to resetting
- * @since Commons IO 1.3
- */
- public synchronized long resetByteCount() {
- long tmp = this.count;
- this.count = 0;
- return tmp;
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/input/DemuxInputStream.java b/emailcommon/src/org/apache/commons/io/input/DemuxInputStream.java
deleted file mode 100644
index 64b41c4d4..000000000
--- a/emailcommon/src/org/apache/commons/io/input/DemuxInputStream.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.input;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Data written to this stream is forwarded to a stream that has been associated
- * with this thread.
- *
- * @author <a href="mailto:peter@apache.org">Peter Donald</a>
- * @version $Revision: 437567 $ $Date: 2006-08-28 07:39:07 +0100 (Mon, 28 Aug 2006) $
- */
-public class DemuxInputStream
- extends InputStream
-{
- private InheritableThreadLocal<InputStream> m_streams = new InheritableThreadLocal<InputStream>();
-
- /**
- * Bind the specified stream to the current thread.
- *
- * @param input the stream to bind
- * @return the InputStream that was previously active
- */
- public InputStream bindStream( InputStream input )
- {
- InputStream oldValue = getStream();
- m_streams.set( input );
- return oldValue;
- }
-
- /**
- * Closes stream associated with current thread.
- *
- * @throws IOException if an error occurs
- */
- @Override
- public void close()
- throws IOException
- {
- InputStream input = getStream();
- if( null != input )
- {
- input.close();
- }
- }
-
- /**
- * Read byte from stream associated with current thread.
- *
- * @return the byte read from stream
- * @throws IOException if an error occurs
- */
- @Override
- public int read()
- throws IOException
- {
- InputStream input = getStream();
- if( null != input )
- {
- return input.read();
- }
- else
- {
- return -1;
- }
- }
-
- /**
- * Utility method to retrieve stream bound to current thread (if any).
- *
- * @return the input stream
- */
- private InputStream getStream()
- {
- return m_streams.get();
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/input/NullInputStream.java b/emailcommon/src/org/apache/commons/io/input/NullInputStream.java
deleted file mode 100644
index 7cee2c6d0..000000000
--- a/emailcommon/src/org/apache/commons/io/input/NullInputStream.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.input;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A functional, light weight {@link InputStream} that emulates
- * a stream of a specified size.
- * <p>
- * This implementation provides a light weight
- * object for testing with an {@link InputStream}
- * where the contents don't matter.
- * <p>
- * One use case would be for testing the handling of
- * large {@link InputStream} as it can emulate that
- * scenario without the overhead of actually processing
- * large numbers of bytes - significantly speeding up
- * test execution times.
- * <p>
- * This implementation returns zero from the method that
- * reads a byte and leaves the array unchanged in the read
- * methods that are passed a byte array.
- * If alternative data is required the <code>processByte()</code> and
- * <code>processBytes()</code> methods can be implemented to generate
- * data, for example:
- *
- * <pre>
- * public class TestInputStream extends NullInputStream {
- * public TestInputStream(int size) {
- * super(size);
- * }
- * protected int processByte() {
- * return ... // return required value here
- * }
- * protected void processBytes(byte[] bytes, int offset, int length) {
- * for (int i = offset; i < length; i++) {
- * bytes[i] = ... // set array value here
- * }
- * }
- * }
- * </pre>
- *
- * @since Commons IO 1.3
- * @version $Revision: 463529 $
- */
-public class NullInputStream extends InputStream {
-
- private long size;
- private long position;
- private long mark = -1;
- private long readlimit;
- private boolean eof;
- private boolean throwEofException;
- private boolean markSupported;
-
- /**
- * Create an {@link InputStream} that emulates a specified size
- * which supports marking and does not throw EOFException.
- *
- * @param size The size of the input stream to emulate.
- */
- public NullInputStream(long size) {
- this(size, true, false);
- }
-
- /**
- * Create an {@link InputStream} that emulates a specified
- * size with option settings.
- *
- * @param size The size of the input stream to emulate.
- * @param markSupported Whether this instance will support
- * the <code>mark()</code> functionality.
- * @param throwEofException Whether this implementation
- * will throw an {@link EOFException} or return -1 when the
- * end of file is reached.
- */
- public NullInputStream(long size, boolean markSupported, boolean throwEofException) {
- this.size = size;
- this.markSupported = markSupported;
- this.throwEofException = throwEofException;
- }
-
- /**
- * Return the current position.
- *
- * @return the current position.
- */
- public long getPosition() {
- return position;
- }
-
- /**
- * Return the size this {@link InputStream} emulates.
- *
- * @return The size of the input stream to emulate.
- */
- public long getSize() {
- return size;
- }
-
- /**
- * Return the number of bytes that can be read.
- *
- * @return The number of bytes that can be read.
- */
- public int available() {
- long avail = size - position;
- if (avail <= 0) {
- return 0;
- } else if (avail > Integer.MAX_VALUE) {
- return Integer.MAX_VALUE;
- } else {
- return (int)avail;
- }
- }
-
- /**
- * Close this input stream - resets the internal state to
- * the initial values.
- *
- * @throws IOException If an error occurs.
- */
- public void close() throws IOException {
- eof = false;
- position = 0;
- mark = -1;
- }
-
- /**
- * Mark the current position.
- *
- * @param readlimit The number of bytes before this marked position
- * is invalid.
- * @throws UnsupportedOperationException if mark is not supported.
- */
- public synchronized void mark(int readlimit) {
- if (!markSupported) {
- throw new UnsupportedOperationException("Mark not supported");
- }
- mark = position;
- this.readlimit = readlimit;
- }
-
- /**
- * Indicates whether <i>mark</i> is supported.
- *
- * @return Whether <i>mark</i> is supported or not.
- */
- public boolean markSupported() {
- return markSupported;
- }
-
- /**
- * Read a byte.
- *
- * @return Either The byte value returned by <code>processByte()</code>
- * or <code>-1</code> if the end of file has been reached and
- * <code>throwEofException</code> is set to <code>false</code>.
- * @throws EOFException if the end of file is reached and
- * <code>throwEofException</code> is set to <code>true</code>.
- * @throws IOException if trying to read past the end of file.
- */
- public int read() throws IOException {
- if (eof) {
- throw new IOException("Read after end of file");
- }
- if (position == size) {
- return doEndOfFile();
- }
- position++;
- return processByte();
- }
-
- /**
- * Read some bytes into the specified array.
- *
- * @param bytes The byte array to read into
- * @return The number of bytes read or <code>-1</code>
- * if the end of file has been reached and
- * <code>throwEofException</code> is set to <code>false</code>.
- * @throws EOFException if the end of file is reached and
- * <code>throwEofException</code> is set to <code>true</code>.
- * @throws IOException if trying to read past the end of file.
- */
- public int read(byte[] bytes) throws IOException {
- return read(bytes, 0, bytes.length);
- }
-
- /**
- * Read the specified number bytes into an array.
- *
- * @param bytes The byte array to read into.
- * @param offset The offset to start reading bytes into.
- * @param length The number of bytes to read.
- * @return The number of bytes read or <code>-1</code>
- * if the end of file has been reached and
- * <code>throwEofException</code> is set to <code>false</code>.
- * @throws EOFException if the end of file is reached and
- * <code>throwEofException</code> is set to <code>true</code>.
- * @throws IOException if trying to read past the end of file.
- */
- public int read(byte[] bytes, int offset, int length) throws IOException {
- if (eof) {
- throw new IOException("Read after end of file");
- }
- if (position == size) {
- return doEndOfFile();
- }
- position += length;
- int returnLength = length;
- if (position > size) {
- returnLength = length - (int)(position - size);
- position = size;
- }
- processBytes(bytes, offset, returnLength);
- return returnLength;
- }
-
- /**
- * Reset the stream to the point when mark was last called.
- *
- * @throws UnsupportedOperationException if mark is not supported.
- * @throws IOException If no position has been marked
- * or the read limit has been exceed since the last position was
- * marked.
- */
- public synchronized void reset() throws IOException {
- if (!markSupported) {
- throw new UnsupportedOperationException("Mark not supported");
- }
- if (mark < 0) {
- throw new IOException("No position has been marked");
- }
- if (position > (mark + readlimit)) {
- throw new IOException("Marked position [" + mark +
- "] is no longer valid - passed the read limit [" +
- readlimit + "]");
- }
- position = mark;
- eof = false;
- }
-
- /**
- * Skip a specified number of bytes.
- *
- * @param numberOfBytes The number of bytes to skip.
- * @return The number of bytes skipped or <code>-1</code>
- * if the end of file has been reached and
- * <code>throwEofException</code> is set to <code>false</code>.
- * @throws EOFException if the end of file is reached and
- * <code>throwEofException</code> is set to <code>true</code>.
- * @throws IOException if trying to read past the end of file.
- */
- public long skip(long numberOfBytes) throws IOException {
- if (eof) {
- throw new IOException("Skip after end of file");
- }
- if (position == size) {
- return doEndOfFile();
- }
- position += numberOfBytes;
- long returnLength = numberOfBytes;
- if (position > size) {
- returnLength = numberOfBytes - (position - size);
- position = size;
- }
- return returnLength;
- }
-
- /**
- * Return a byte value for the <code>read()</code> method.
- * <p>
- * This implementation returns zero.
- *
- * @return This implementation always returns zero.
- */
- protected int processByte() {
- // do nothing - overridable by subclass
- return 0;
- }
-
- /**
- * Process the bytes for the <code>read(byte[], offset, length)</code>
- * method.
- * <p>
- * This implementation leaves the byte array unchanged.
- *
- * @param bytes The byte array
- * @param offset The offset to start at.
- * @param length The number of bytes.
- */
- protected void processBytes(byte[] bytes, int offset, int length) {
- // do nothing - overridable by subclass
- }
-
- /**
- * Handle End of File.
- *
- * @return <code>-1</code> if <code>throwEofException</code> is
- * set to <code>false</code>
- * @throws EOFException if <code>throwEofException</code> is set
- * to <code>true</code>.
- */
- private int doEndOfFile() throws EOFException {
- eof = true;
- if (throwEofException) {
- throw new EOFException();
- }
- return -1;
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/input/NullReader.java b/emailcommon/src/org/apache/commons/io/input/NullReader.java
deleted file mode 100644
index 159e39021..000000000
--- a/emailcommon/src/org/apache/commons/io/input/NullReader.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.input;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.Reader;
-
-/**
- * A functional, light weight {@link Reader} that emulates
- * a reader of a specified size.
- * <p>
- * This implementation provides a light weight
- * object for testing with an {@link Reader}
- * where the contents don't matter.
- * <p>
- * One use case would be for testing the handling of
- * large {@link Reader} as it can emulate that
- * scenario without the overhead of actually processing
- * large numbers of characters - significantly speeding up
- * test execution times.
- * <p>
- * This implementation returns a space from the method that
- * reads a character and leaves the array unchanged in the read
- * methods that are passed a character array.
- * If alternative data is required the <code>processChar()</code> and
- * <code>processChars()</code> methods can be implemented to generate
- * data, for example:
- *
- * <pre>
- * public class TestReader extends NullReader {
- * public TestReader(int size) {
- * super(size);
- * }
- * protected char processChar() {
- * return ... // return required value here
- * }
- * protected void processChars(char[] chars, int offset, int length) {
- * for (int i = offset; i < length; i++) {
- * chars[i] = ... // set array value here
- * }
- * }
- * }
- * </pre>
- *
- * @since Commons IO 1.3
- * @version $Revision: 463529 $
- */
-public class NullReader extends Reader {
-
- private long size;
- private long position;
- private long mark = -1;
- private long readlimit;
- private boolean eof;
- private boolean throwEofException;
- private boolean markSupported;
-
- /**
- * Create a {@link Reader} that emulates a specified size
- * which supports marking and does not throw EOFException.
- *
- * @param size The size of the reader to emulate.
- */
- public NullReader(long size) {
- this(size, true, false);
- }
-
- /**
- * Create a {@link Reader} that emulates a specified
- * size with option settings.
- *
- * @param size The size of the reader to emulate.
- * @param markSupported Whether this instance will support
- * the <code>mark()</code> functionality.
- * @param throwEofException Whether this implementation
- * will throw an {@link EOFException} or return -1 when the
- * end of file is reached.
- */
- public NullReader(long size, boolean markSupported, boolean throwEofException) {
- this.size = size;
- this.markSupported = markSupported;
- this.throwEofException = throwEofException;
- }
-
- /**
- * Return the current position.
- *
- * @return the current position.
- */
- public long getPosition() {
- return position;
- }
-
- /**
- * Return the size this {@link Reader} emulates.
- *
- * @return The size of the reader to emulate.
- */
- public long getSize() {
- return size;
- }
-
- /**
- * Close this Reader - resets the internal state to
- * the initial values.
- *
- * @throws IOException If an error occurs.
- */
- public void close() throws IOException {
- eof = false;
- position = 0;
- mark = -1;
- }
-
- /**
- * Mark the current position.
- *
- * @param readlimit The number of characters before this marked position
- * is invalid.
- * @throws UnsupportedOperationException if mark is not supported.
- */
- public synchronized void mark(int readlimit) {
- if (!markSupported) {
- throw new UnsupportedOperationException("Mark not supported");
- }
- mark = position;
- this.readlimit = readlimit;
- }
-
- /**
- * Indicates whether <i>mark</i> is supported.
- *
- * @return Whether <i>mark</i> is supported or not.
- */
- public boolean markSupported() {
- return markSupported;
- }
-
- /**
- * Read a character.
- *
- * @return Either The character value returned by <code>processChar()</code>
- * or <code>-1</code> if the end of file has been reached and
- * <code>throwEofException</code> is set to <code>false</code>.
- * @throws EOFException if the end of file is reached and
- * <code>throwEofException</code> is set to <code>true</code>.
- * @throws IOException if trying to read past the end of file.
- */
- public int read() throws IOException {
- if (eof) {
- throw new IOException("Read after end of file");
- }
- if (position == size) {
- return doEndOfFile();
- }
- position++;
- return processChar();
- }
-
- /**
- * Read some characters into the specified array.
- *
- * @param chars The character array to read into
- * @return The number of characters read or <code>-1</code>
- * if the end of file has been reached and
- * <code>throwEofException</code> is set to <code>false</code>.
- * @throws EOFException if the end of file is reached and
- * <code>throwEofException</code> is set to <code>true</code>.
- * @throws IOException if trying to read past the end of file.
- */
- public int read(char[] chars) throws IOException {
- return read(chars, 0, chars.length);
- }
-
- /**
- * Read the specified number characters into an array.
- *
- * @param chars The character array to read into.
- * @param offset The offset to start reading characters into.
- * @param length The number of characters to read.
- * @return The number of characters read or <code>-1</code>
- * if the end of file has been reached and
- * <code>throwEofException</code> is set to <code>false</code>.
- * @throws EOFException if the end of file is reached and
- * <code>throwEofException</code> is set to <code>true</code>.
- * @throws IOException if trying to read past the end of file.
- */
- public int read(char[] chars, int offset, int length) throws IOException {
- if (eof) {
- throw new IOException("Read after end of file");
- }
- if (position == size) {
- return doEndOfFile();
- }
- position += length;
- int returnLength = length;
- if (position > size) {
- returnLength = length - (int)(position - size);
- position = size;
- }
- processChars(chars, offset, returnLength);
- return returnLength;
- }
-
- /**
- * Reset the stream to the point when mark was last called.
- *
- * @throws UnsupportedOperationException if mark is not supported.
- * @throws IOException If no position has been marked
- * or the read limit has been exceed since the last position was
- * marked.
- */
- public synchronized void reset() throws IOException {
- if (!markSupported) {
- throw new UnsupportedOperationException("Mark not supported");
- }
- if (mark < 0) {
- throw new IOException("No position has been marked");
- }
- if (position > (mark + readlimit)) {
- throw new IOException("Marked position [" + mark +
- "] is no longer valid - passed the read limit [" +
- readlimit + "]");
- }
- position = mark;
- eof = false;
- }
-
- /**
- * Skip a specified number of characters.
- *
- * @param numberOfChars The number of characters to skip.
- * @return The number of characters skipped or <code>-1</code>
- * if the end of file has been reached and
- * <code>throwEofException</code> is set to <code>false</code>.
- * @throws EOFException if the end of file is reached and
- * <code>throwEofException</code> is set to <code>true</code>.
- * @throws IOException if trying to read past the end of file.
- */
- public long skip(long numberOfChars) throws IOException {
- if (eof) {
- throw new IOException("Skip after end of file");
- }
- if (position == size) {
- return doEndOfFile();
- }
- position += numberOfChars;
- long returnLength = numberOfChars;
- if (position > size) {
- returnLength = numberOfChars - (position - size);
- position = size;
- }
- return returnLength;
- }
-
- /**
- * Return a character value for the <code>read()</code> method.
- * <p>
- * This implementation returns zero.
- *
- * @return This implementation always returns zero.
- */
- protected int processChar() {
- // do nothing - overridable by subclass
- return 0;
- }
-
- /**
- * Process the characters for the <code>read(char[], offset, length)</code>
- * method.
- * <p>
- * This implementation leaves the character array unchanged.
- *
- * @param chars The character array
- * @param offset The offset to start at.
- * @param length The number of characters.
- */
- protected void processChars(char[] chars, int offset, int length) {
- // do nothing - overridable by subclass
- }
-
- /**
- * Handle End of File.
- *
- * @return <code>-1</code> if <code>throwEofException</code> is
- * set to <code>false</code>
- * @throws EOFException if <code>throwEofException</code> is set
- * to <code>true</code>.
- */
- private int doEndOfFile() throws EOFException {
- eof = true;
- if (throwEofException) {
- throw new EOFException();
- }
- return -1;
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/input/ProxyInputStream.java b/emailcommon/src/org/apache/commons/io/input/ProxyInputStream.java
deleted file mode 100644
index a08ad92d0..000000000
--- a/emailcommon/src/org/apache/commons/io/input/ProxyInputStream.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.input;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A Proxy stream which acts as expected, that is it passes the method
- * calls on to the proxied stream and doesn't change which methods are
- * being called.
- * <p>
- * It is an alternative base class to FilterInputStream
- * to increase reusability, because FilterInputStream changes the
- * methods being called, such as read(byte[]) to read(byte[], int, int).
- *
- * @author Stephen Colebourne
- * @version $Id: ProxyInputStream.java 610010 2008-01-08 14:50:59Z niallp $
- */
-public abstract class ProxyInputStream extends FilterInputStream {
-
- /**
- * Constructs a new ProxyInputStream.
- *
- * @param proxy the InputStream to delegate to
- */
- public ProxyInputStream(InputStream proxy) {
- super(proxy);
- // the proxy is stored in a protected superclass variable named 'in'
- }
-
- /**
- * Invokes the delegate's <code>read()</code> method.
- * @return the byte read or -1 if the end of stream
- * @throws IOException if an I/O error occurs
- */
- public int read() throws IOException {
- return in.read();
- }
-
- /**
- * Invokes the delegate's <code>read(byte[])</code> method.
- * @param bts the buffer to read the bytes into
- * @return the number of bytes read or -1 if the end of stream
- * @throws IOException if an I/O error occurs
- */
- public int read(byte[] bts) throws IOException {
- return in.read(bts);
- }
-
- /**
- * Invokes the delegate's <code>read(byte[], int, int)</code> method.
- * @param bts the buffer to read the bytes into
- * @param st The start offset
- * @param end The number of bytes to read
- * @return the number of bytes read or -1 if the end of stream
- * @throws IOException if an I/O error occurs
- */
- public int read(byte[] bts, int st, int end) throws IOException {
- return in.read(bts, st, end);
- }
-
- /**
- * Invokes the delegate's <code>skip(long)</code> method.
- * @param ln the number of bytes to skip
- * @return the number of bytes to skipped or -1 if the end of stream
- * @throws IOException if an I/O error occurs
- */
- public long skip(long ln) throws IOException {
- return in.skip(ln);
- }
-
- /**
- * Invokes the delegate's <code>available()</code> method.
- * @return the number of available bytes
- * @throws IOException if an I/O error occurs
- */
- public int available() throws IOException {
- return in.available();
- }
-
- /**
- * Invokes the delegate's <code>close()</code> method.
- * @throws IOException if an I/O error occurs
- */
- public void close() throws IOException {
- in.close();
- }
-
- /**
- * Invokes the delegate's <code>mark(int)</code> method.
- * @param idx read ahead limit
- */
- public synchronized void mark(int idx) {
- in.mark(idx);
- }
-
- /**
- * Invokes the delegate's <code>reset()</code> method.
- * @throws IOException if an I/O error occurs
- */
- public synchronized void reset() throws IOException {
- in.reset();
- }
-
- /**
- * Invokes the delegate's <code>markSupported()</code> method.
- * @return true if mark is supported, otherwise false
- */
- public boolean markSupported() {
- return in.markSupported();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/input/ProxyReader.java b/emailcommon/src/org/apache/commons/io/input/ProxyReader.java
deleted file mode 100644
index d55290f5a..000000000
--- a/emailcommon/src/org/apache/commons/io/input/ProxyReader.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.input;
-
-import java.io.FilterReader;
-import java.io.IOException;
-import java.io.Reader;
-
-/**
- * A Proxy stream which acts as expected, that is it passes the method
- * calls on to the proxied stream and doesn't change which methods are
- * being called.
- * <p>
- * It is an alternative base class to FilterReader
- * to increase reusability, because FilterReader changes the
- * methods being called, such as read(char[]) to read(char[], int, int).
- *
- * @author Stephen Colebourne
- * @version $Id: ProxyReader.java 610010 2008-01-08 14:50:59Z niallp $
- */
-public abstract class ProxyReader extends FilterReader {
-
- /**
- * Constructs a new ProxyReader.
- *
- * @param proxy the Reader to delegate to
- */
- public ProxyReader(Reader proxy) {
- super(proxy);
- // the proxy is stored in a protected superclass variable named 'in'
- }
-
- /**
- * Invokes the delegate's <code>read()</code> method.
- * @return the character read or -1 if the end of stream
- * @throws IOException if an I/O error occurs
- */
- public int read() throws IOException {
- return in.read();
- }
-
- /**
- * Invokes the delegate's <code>read(char[])</code> method.
- * @param chr the buffer to read the characters into
- * @return the number of characters read or -1 if the end of stream
- * @throws IOException if an I/O error occurs
- */
- public int read(char[] chr) throws IOException {
- return in.read(chr);
- }
-
- /**
- * Invokes the delegate's <code>read(char[], int, int)</code> method.
- * @param chr the buffer to read the characters into
- * @param st The start offset
- * @param end The number of bytes to read
- * @return the number of characters read or -1 if the end of stream
- * @throws IOException if an I/O error occurs
- */
- public int read(char[] chr, int st, int end) throws IOException {
- return in.read(chr, st, end);
- }
-
- /**
- * Invokes the delegate's <code>skip(long)</code> method.
- * @param ln the number of bytes to skip
- * @return the number of bytes to skipped or -1 if the end of stream
- * @throws IOException if an I/O error occurs
- */
- public long skip(long ln) throws IOException {
- return in.skip(ln);
- }
-
- /**
- * Invokes the delegate's <code>ready()</code> method.
- * @return true if the stream is ready to be read
- * @throws IOException if an I/O error occurs
- */
- public boolean ready() throws IOException {
- return in.ready();
- }
-
- /**
- * Invokes the delegate's <code>close()</code> method.
- * @throws IOException if an I/O error occurs
- */
- public void close() throws IOException {
- in.close();
- }
-
- /**
- * Invokes the delegate's <code>mark(int)</code> method.
- * @param idx read ahead limit
- * @throws IOException if an I/O error occurs
- */
- public synchronized void mark(int idx) throws IOException {
- in.mark(idx);
- }
-
- /**
- * Invokes the delegate's <code>reset()</code> method.
- * @throws IOException if an I/O error occurs
- */
- public synchronized void reset() throws IOException {
- in.reset();
- }
-
- /**
- * Invokes the delegate's <code>markSupported()</code> method.
- * @return true if mark is supported, otherwise false
- */
- public boolean markSupported() {
- return in.markSupported();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/input/SwappedDataInputStream.java b/emailcommon/src/org/apache/commons/io/input/SwappedDataInputStream.java
deleted file mode 100644
index 5b65b1eee..000000000
--- a/emailcommon/src/org/apache/commons/io/input/SwappedDataInputStream.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.input;
-
-import java.io.DataInput;
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.apache.commons.io.EndianUtils;
-
-/**
- * DataInput for systems relying on little endian data formats.
- * When read, values will be changed from little endian to big
- * endian formats for internal usage.
- * <p>
- * <b>Origin of code: </b>Avalon Excalibur (IO)
- *
- * @author <a href="mailto:peter@apache.org">Peter Donald</a>
- * @version CVS $Revision: 610010 $ $Date: 2008-01-08 14:50:59 +0000 (Tue, 08 Jan 2008) $
- */
-public class SwappedDataInputStream extends ProxyInputStream
- implements DataInput
-{
-
- /**
- * Constructs a SwappedDataInputStream.
- *
- * @param input InputStream to read from
- */
- public SwappedDataInputStream( InputStream input )
- {
- super( input );
- }
-
- /**
- * Return <code>{@link #readByte()} == 0</code>
- * @return the true if the byte read is zero, otherwise false
- * @throws IOException if an I/O error occurs
- * @throws EOFException if an end of file is reached unexpectedly
- */
- public boolean readBoolean()
- throws IOException, EOFException
- {
- return ( 0 == readByte() );
- }
-
- /**
- * Invokes the delegate's <code>read()</code> method.
- * @return the byte read or -1 if the end of stream
- * @throws IOException if an I/O error occurs
- * @throws EOFException if an end of file is reached unexpectedly
- */
- public byte readByte()
- throws IOException, EOFException
- {
- return (byte)in.read();
- }
-
- /**
- * Reads a character delegating to {@link #readShort()}.
- * @return the byte read or -1 if the end of stream
- * @throws IOException if an I/O error occurs
- * @throws EOFException if an end of file is reached unexpectedly
- */
- public char readChar()
- throws IOException, EOFException
- {
- return (char)readShort();
- }
-
- /**
- * Delegates to {@link EndianUtils#readSwappedDouble(InputStream)}.
- * @return the read long
- * @throws IOException if an I/O error occurs
- * @throws EOFException if an end of file is reached unexpectedly
- */
- public double readDouble()
- throws IOException, EOFException
- {
- return EndianUtils.readSwappedDouble( in );
- }
-
- /**
- * Delegates to {@link EndianUtils#readSwappedFloat(InputStream)}.
- * @return the read long
- * @throws IOException if an I/O error occurs
- * @throws EOFException if an end of file is reached unexpectedly
- */
- public float readFloat()
- throws IOException, EOFException
- {
- return EndianUtils.readSwappedFloat( in );
- }
-
- /**
- * Invokes the delegate's <code>read(byte[] data, int, int)</code> method.
- *
- * @param data the buffer to read the bytes into
- * @throws EOFException if an end of file is reached unexpectedly
- * @throws IOException if an I/O error occurs
- */
- public void readFully( byte[] data )
- throws IOException, EOFException
- {
- readFully( data, 0, data.length );
- }
-
-
- /**
- * Invokes the delegate's <code>read(byte[] data, int, int)</code> method.
- *
- * @param data the buffer to read the bytes into
- * @param offset The start offset
- * @param length The number of bytes to read
- * @throws EOFException if an end of file is reached unexpectedly
- * @throws IOException if an I/O error occurs
- */
- public void readFully( byte[] data, int offset, int length )
- throws IOException, EOFException
- {
- int remaining = length;
-
- while( remaining > 0 )
- {
- int location = offset + ( length - remaining );
- int count = read( data, location, remaining );
-
- if( -1 == count )
- {
- throw new EOFException();
- }
-
- remaining -= count;
- }
- }
-
- /**
- * Delegates to {@link EndianUtils#readSwappedInteger(InputStream)}.
- * @return the read long
- * @throws EOFException if an end of file is reached unexpectedly
- * @throws IOException if an I/O error occurs
- */
- public int readInt()
- throws IOException, EOFException
- {
- return EndianUtils.readSwappedInteger( in );
- }
-
- /**
- * Not currently supported - throws {@link UnsupportedOperationException}.
- * @return the line read
- * @throws EOFException if an end of file is reached unexpectedly
- * @throws IOException if an I/O error occurs
- */
- public String readLine()
- throws IOException, EOFException
- {
- throw new UnsupportedOperationException(
- "Operation not supported: readLine()" );
- }
-
- /**
- * Delegates to {@link EndianUtils#readSwappedLong(InputStream)}.
- * @return the read long
- * @throws EOFException if an end of file is reached unexpectedly
- * @throws IOException if an I/O error occurs
- */
- public long readLong()
- throws IOException, EOFException
- {
- return EndianUtils.readSwappedLong( in );
- }
-
- /**
- * Delegates to {@link EndianUtils#readSwappedShort(InputStream)}.
- * @return the read long
- * @throws EOFException if an end of file is reached unexpectedly
- * @throws IOException if an I/O error occurs
- */
- public short readShort()
- throws IOException, EOFException
- {
- return EndianUtils.readSwappedShort( in );
- }
-
- /**
- * Invokes the delegate's <code>read()</code> method.
- * @return the byte read or -1 if the end of stream
- * @throws EOFException if an end of file is reached unexpectedly
- * @throws IOException if an I/O error occurs
- */
- public int readUnsignedByte()
- throws IOException, EOFException
- {
- return in.read();
- }
-
- /**
- * Delegates to {@link EndianUtils#readSwappedUnsignedShort(InputStream)}.
- * @return the read long
- * @throws EOFException if an end of file is reached unexpectedly
- * @throws IOException if an I/O error occurs
- */
- public int readUnsignedShort()
- throws IOException, EOFException
- {
- return EndianUtils.readSwappedUnsignedShort( in );
- }
-
- /**
- * Not currently supported - throws {@link UnsupportedOperationException}.
- * @return UTF String read
- * @throws EOFException if an end of file is reached unexpectedly
- * @throws IOException if an I/O error occurs
- */
- public String readUTF()
- throws IOException, EOFException
- {
- throw new UnsupportedOperationException(
- "Operation not supported: readUTF()" );
- }
-
- /**
- * Invokes the delegate's <code>skip(int)</code> method.
- * @param count the number of bytes to skip
- * @return the number of bytes to skipped or -1 if the end of stream
- * @throws EOFException if an end of file is reached unexpectedly
- * @throws IOException if an I/O error occurs
- */
- public int skipBytes( int count )
- throws IOException, EOFException
- {
- return (int)in.skip( count );
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/input/TeeInputStream.java b/emailcommon/src/org/apache/commons/io/input/TeeInputStream.java
deleted file mode 100644
index fed000ed6..000000000
--- a/emailcommon/src/org/apache/commons/io/input/TeeInputStream.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.input;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * InputStream proxy that transparently writes a copy of all bytes read
- * from the proxied stream to a given OutputStream. Using {@link #skip(long)}
- * or {@link #mark(int)}/{@link #reset()} on the stream will result on some
- * bytes from the input stream being skipped or duplicated in the output
- * stream.
- * <p>
- * The proxied input stream is closed when the {@link #close()} method is
- * called on this proxy. It is configurable whether the associated output
- * stream will also closed.
- *
- * @version $Id: TeeInputStream.java 587913 2007-10-24 15:47:30Z niallp $
- * @since Commons IO 1.4
- */
-public class TeeInputStream extends ProxyInputStream {
-
- /**
- * The output stream that will receive a copy of all bytes read from the
- * proxied input stream.
- */
- private final OutputStream branch;
-
- /**
- * Flag for closing also the associated output stream when this
- * stream is closed.
- */
- private final boolean closeBranch;
-
- /**
- * Creates a TeeInputStream that proxies the given {@link InputStream}
- * and copies all read bytes to the given {@link OutputStream}. The given
- * output stream will not be closed when this stream gets closed.
- *
- * @param input input stream to be proxied
- * @param branch output stream that will receive a copy of all bytes read
- */
- public TeeInputStream(InputStream input, OutputStream branch) {
- this(input, branch, false);
- }
-
- /**
- * Creates a TeeInputStream that proxies the given {@link InputStream}
- * and copies all read bytes to the given {@link OutputStream}. The given
- * output stream will be closed when this stream gets closed if the
- * closeBranch parameter is <code>true</code>.
- *
- * @param input input stream to be proxied
- * @param branch output stream that will receive a copy of all bytes read
- * @param closeBranch flag for closing also the output stream when this
- * stream is closed
- */
- public TeeInputStream(
- InputStream input, OutputStream branch, boolean closeBranch) {
- super(input);
- this.branch = branch;
- this.closeBranch = closeBranch;
- }
-
- /**
- * Closes the proxied input stream and, if so configured, the associated
- * output stream. An exception thrown from one stream will not prevent
- * closing of the other stream.
- *
- * @throws IOException if either of the streams could not be closed
- */
- public void close() throws IOException {
- try {
- super.close();
- } finally {
- if (closeBranch) {
- branch.close();
- }
- }
- }
-
- /**
- * Reads a single byte from the proxied input stream and writes it to
- * the associated output stream.
- *
- * @return next byte from the stream, or -1 if the stream has ended
- * @throws IOException if the stream could not be read (or written)
- */
- public int read() throws IOException {
- int ch = super.read();
- if (ch != -1) {
- branch.write(ch);
- }
- return ch;
- }
-
- /**
- * Reads bytes from the proxied input stream and writes the read bytes
- * to the associated output stream.
- *
- * @param bts byte buffer
- * @param st start offset within the buffer
- * @param end maximum number of bytes to read
- * @return number of bytes read, or -1 if the stream has ended
- * @throws IOException if the stream could not be read (or written)
- */
- public int read(byte[] bts, int st, int end) throws IOException {
- int n = super.read(bts, st, end);
- if (n != -1) {
- branch.write(bts, st, n);
- }
- return n;
- }
-
- /**
- * Reads bytes from the proxied input stream and writes the read bytes
- * to the associated output stream.
- *
- * @param bts byte buffer
- * @return number of bytes read, or -1 if the stream has ended
- * @throws IOException if the stream could not be read (or written)
- */
- public int read(byte[] bts) throws IOException {
- int n = super.read(bts);
- if (n != -1) {
- branch.write(bts, 0, n);
- }
- return n;
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/input/package.html b/emailcommon/src/org/apache/commons/io/input/package.html
deleted file mode 100644
index 9aa8b15ba..000000000
--- a/emailcommon/src/org/apache/commons/io/input/package.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements. See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<html>
-<body>
-<p>
-This package provides implementations of input classes, such as
-<code>InputStream</code> and <code>Reader</code>.
-</p>
-</body>
-</html>
diff --git a/emailcommon/src/org/apache/commons/io/output/ByteArrayOutputStream.java b/emailcommon/src/org/apache/commons/io/output/ByteArrayOutputStream.java
deleted file mode 100644
index 906a41dd4..000000000
--- a/emailcommon/src/org/apache/commons/io/output/ByteArrayOutputStream.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * This class implements an output stream in which the data is
- * written into a byte array. The buffer automatically grows as data
- * is written to it.
- * <p>
- * The data can be retrieved using <code>toByteArray()</code> and
- * <code>toString()</code>.
- * <p>
- * Closing a <tt>ByteArrayOutputStream</tt> has no effect. The methods in
- * this class can be called after the stream has been closed without
- * generating an <tt>IOException</tt>.
- * <p>
- * This is an alternative implementation of the java.io.ByteArrayOutputStream
- * class. The original implementation only allocates 32 bytes at the beginning.
- * As this class is designed for heavy duty it starts at 1024 bytes. In contrast
- * to the original it doesn't reallocate the whole memory block but allocates
- * additional buffers. This way no buffers need to be garbage collected and
- * the contents don't have to be copied to the new buffer. This class is
- * designed to behave exactly like the original. The only exception is the
- * deprecated toString(int) method that has been ignored.
- *
- * @author <a href="mailto:jeremias@apache.org">Jeremias Maerki</a>
- * @author Holger Hoffstatte
- * @version $Id: ByteArrayOutputStream.java 610010 2008-01-08 14:50:59Z niallp $
- */
-public class ByteArrayOutputStream extends OutputStream {
-
- /** A singleton empty byte array. */
- private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
-
- /** The list of buffers, which grows and never reduces. */
- private List<byte[]> buffers = new ArrayList<byte[]>();
- /** The index of the current buffer. */
- private int currentBufferIndex;
- /** The total count of bytes in all the filled buffers. */
- private int filledBufferSum;
- /** The current buffer. */
- private byte[] currentBuffer;
- /** The total count of bytes written. */
- private int count;
-
- /**
- * Creates a new byte array output stream. The buffer capacity is
- * initially 1024 bytes, though its size increases if necessary.
- */
- public ByteArrayOutputStream() {
- this(1024);
- }
-
- /**
- * Creates a new byte array output stream, with a buffer capacity of
- * the specified size, in bytes.
- *
- * @param size the initial size
- * @throws IllegalArgumentException if size is negative
- */
- public ByteArrayOutputStream(int size) {
- if (size < 0) {
- throw new IllegalArgumentException(
- "Negative initial size: " + size);
- }
- needNewBuffer(size);
- }
-
- /**
- * Return the appropriate <code>byte[]</code> buffer
- * specified by index.
- *
- * @param index the index of the buffer required
- * @return the buffer
- */
- private byte[] getBuffer(int index) {
- return buffers.get(index);
- }
-
- /**
- * Makes a new buffer available either by allocating
- * a new one or re-cycling an existing one.
- *
- * @param newcount the size of the buffer if one is created
- */
- private void needNewBuffer(int newcount) {
- if (currentBufferIndex < buffers.size() - 1) {
- //Recycling old buffer
- filledBufferSum += currentBuffer.length;
-
- currentBufferIndex++;
- currentBuffer = getBuffer(currentBufferIndex);
- } else {
- //Creating new buffer
- int newBufferSize;
- if (currentBuffer == null) {
- newBufferSize = newcount;
- filledBufferSum = 0;
- } else {
- newBufferSize = Math.max(
- currentBuffer.length << 1,
- newcount - filledBufferSum);
- filledBufferSum += currentBuffer.length;
- }
-
- currentBufferIndex++;
- currentBuffer = new byte[newBufferSize];
- buffers.add(currentBuffer);
- }
- }
-
- /**
- * Write the bytes to byte array.
- * @param b the bytes to write
- * @param off The start offset
- * @param len The number of bytes to write
- */
- @Override
- public void write(byte[] b, int off, int len) {
- if ((off < 0)
- || (off > b.length)
- || (len < 0)
- || ((off + len) > b.length)
- || ((off + len) < 0)) {
- throw new IndexOutOfBoundsException();
- } else if (len == 0) {
- return;
- }
- synchronized (this) {
- int newcount = count + len;
- int remaining = len;
- int inBufferPos = count - filledBufferSum;
- while (remaining > 0) {
- int part = Math.min(remaining, currentBuffer.length - inBufferPos);
- System.arraycopy(b, off + len - remaining, currentBuffer, inBufferPos, part);
- remaining -= part;
- if (remaining > 0) {
- needNewBuffer(newcount);
- inBufferPos = 0;
- }
- }
- count = newcount;
- }
- }
-
- /**
- * Write a byte to byte array.
- * @param b the byte to write
- */
- @Override
- public synchronized void write(int b) {
- int inBufferPos = count - filledBufferSum;
- if (inBufferPos == currentBuffer.length) {
- needNewBuffer(count + 1);
- inBufferPos = 0;
- }
- currentBuffer[inBufferPos] = (byte) b;
- count++;
- }
-
- /**
- * Writes the entire contents of the specified input stream to this
- * byte stream. Bytes from the input stream are read directly into the
- * internal buffers of this streams.
- *
- * @param in the input stream to read from
- * @return total number of bytes read from the input stream
- * (and written to this stream)
- * @throws IOException if an I/O error occurs while reading the input stream
- * @since Commons IO 1.4
- */
- public synchronized int write(InputStream in) throws IOException {
- int readCount = 0;
- int inBufferPos = count - filledBufferSum;
- int n = in.read(currentBuffer, inBufferPos, currentBuffer.length - inBufferPos);
- while (n != -1) {
- readCount += n;
- inBufferPos += n;
- count += n;
- if (inBufferPos == currentBuffer.length) {
- needNewBuffer(currentBuffer.length);
- inBufferPos = 0;
- }
- n = in.read(currentBuffer, inBufferPos, currentBuffer.length - inBufferPos);
- }
- return readCount;
- }
-
- /**
- * Return the current size of the byte array.
- * @return the current size of the byte array
- */
- public synchronized int size() {
- return count;
- }
-
- /**
- * Closing a <tt>ByteArrayOutputStream</tt> has no effect. The methods in
- * this class can be called after the stream has been closed without
- * generating an <tt>IOException</tt>.
- *
- * @throws IOException never (this method should not declare this exception
- * but it has to now due to backwards compatability)
- */
- @Override
- public void close() throws IOException {
- //nop
- }
-
- /**
- * @see java.io.ByteArrayOutputStream#reset()
- */
- public synchronized void reset() {
- count = 0;
- filledBufferSum = 0;
- currentBufferIndex = 0;
- currentBuffer = getBuffer(currentBufferIndex);
- }
-
- /**
- * Writes the entire contents of this byte stream to the
- * specified output stream.
- *
- * @param out the output stream to write to
- * @throws IOException if an I/O error occurs, such as if the stream is closed
- * @see java.io.ByteArrayOutputStream#writeTo(OutputStream)
- */
- public synchronized void writeTo(OutputStream out) throws IOException {
- int remaining = count;
- for (int i = 0; i < buffers.size(); i++) {
- byte[] buf = getBuffer(i);
- int c = Math.min(buf.length, remaining);
- out.write(buf, 0, c);
- remaining -= c;
- if (remaining == 0) {
- break;
- }
- }
- }
-
- /**
- * Gets the curent contents of this byte stream as a byte array.
- * The result is independent of this stream.
- *
- * @return the current contents of this output stream, as a byte array
- * @see java.io.ByteArrayOutputStream#toByteArray()
- */
- public synchronized byte[] toByteArray() {
- int remaining = count;
- if (remaining == 0) {
- return EMPTY_BYTE_ARRAY;
- }
- byte newbuf[] = new byte[remaining];
- int pos = 0;
- for (int i = 0; i < buffers.size(); i++) {
- byte[] buf = getBuffer(i);
- int c = Math.min(buf.length, remaining);
- System.arraycopy(buf, 0, newbuf, pos, c);
- pos += c;
- remaining -= c;
- if (remaining == 0) {
- break;
- }
- }
- return newbuf;
- }
-
- /**
- * Gets the curent contents of this byte stream as a string.
- * @return the contents of the byte array as a String
- * @see java.io.ByteArrayOutputStream#toString()
- */
- @Override
- public String toString() {
- return new String(toByteArray());
- }
-
- /**
- * Gets the curent contents of this byte stream as a string
- * using the specified encoding.
- *
- * @param enc the name of the character encoding
- * @return the string converted from the byte array
- * @throws UnsupportedEncodingException if the encoding is not supported
- * @see java.io.ByteArrayOutputStream#toString(String)
- */
- public String toString(String enc) throws UnsupportedEncodingException {
- return new String(toByteArray(), enc);
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/CloseShieldOutputStream.java b/emailcommon/src/org/apache/commons/io/output/CloseShieldOutputStream.java
deleted file mode 100644
index 63f44be40..000000000
--- a/emailcommon/src/org/apache/commons/io/output/CloseShieldOutputStream.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.OutputStream;
-
-/**
- * Proxy stream that prevents the underlying output stream from being closed.
- * <p>
- * This class is typically used in cases where an output stream needs to be
- * passed to a component that wants to explicitly close the stream even if
- * other components would still use the stream for output.
- *
- * @version $Id: CloseShieldOutputStream.java 587913 2007-10-24 15:47:30Z niallp $
- * @since Commons IO 1.4
- */
-public class CloseShieldOutputStream extends ProxyOutputStream {
-
- /**
- * Creates a proxy that shields the given output stream from being
- * closed.
- *
- * @param out underlying output stream
- */
- public CloseShieldOutputStream(OutputStream out) {
- super(out);
- }
-
- /**
- * Replaces the underlying output stream with a {@link ClosedOutputStream}
- * sentinel. The original output stream will remain open, but this proxy
- * will appear closed.
- */
- public void close() {
- out = new ClosedOutputStream();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/ClosedOutputStream.java b/emailcommon/src/org/apache/commons/io/output/ClosedOutputStream.java
deleted file mode 100644
index b585c0cf4..000000000
--- a/emailcommon/src/org/apache/commons/io/output/ClosedOutputStream.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * Closed output stream. This stream throws an exception on all attempts to
- * write something to the stream.
- * <p>
- * Typically uses of this class include testing for corner cases in methods
- * that accept an output stream and acting as a sentinel value instead of
- * a <code>null</code> output stream.
- *
- * @version $Id: ClosedOutputStream.java 601751 2007-12-06 14:55:45Z niallp $
- * @since Commons IO 1.4
- */
-public class ClosedOutputStream extends OutputStream {
-
- /**
- * A singleton.
- */
- public static final ClosedOutputStream CLOSED_OUTPUT_STREAM = new ClosedOutputStream();
-
- /**
- * Throws an {@link IOException} to indicate that the stream is closed.
- *
- * @param b ignored
- * @throws IOException always thrown
- */
- public void write(int b) throws IOException {
- throw new IOException("write(" + b + ") failed: stream is closed");
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/CountingOutputStream.java b/emailcommon/src/org/apache/commons/io/output/CountingOutputStream.java
deleted file mode 100644
index 672882860..000000000
--- a/emailcommon/src/org/apache/commons/io/output/CountingOutputStream.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * A decorating output stream that counts the number of bytes that have passed
- * through the stream so far.
- * <p>
- * A typical use case would be during debugging, to ensure that data is being
- * written as expected.
- *
- * @version $Id: CountingOutputStream.java 471628 2006-11-06 04:06:45Z bayard $
- */
-public class CountingOutputStream extends ProxyOutputStream {
-
- /** The count of bytes that have passed. */
- private long count;
-
- /**
- * Constructs a new CountingOutputStream.
- *
- * @param out the OutputStream to write to
- */
- public CountingOutputStream( OutputStream out ) {
- super(out);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Writes the contents of the specified byte array to this output stream
- * keeping count of the number of bytes written.
- *
- * @param b the bytes to write, not null
- * @throws IOException if an I/O error occurs
- * @see java.io.OutputStream#write(byte[])
- */
- public void write(byte[] b) throws IOException {
- count += b.length;
- super.write(b);
- }
-
- /**
- * Writes a portion of the specified byte array to this output stream
- * keeping count of the number of bytes written.
- *
- * @param b the bytes to write, not null
- * @param off the start offset in the buffer
- * @param len the maximum number of bytes to write
- * @throws IOException if an I/O error occurs
- * @see java.io.OutputStream#write(byte[], int, int)
- */
- public void write(byte[] b, int off, int len) throws IOException {
- count += len;
- super.write(b, off, len);
- }
-
- /**
- * Writes a single byte to the output stream adding to the count of the
- * number of bytes written.
- *
- * @param b the byte to write
- * @throws IOException if an I/O error occurs
- * @see java.io.OutputStream#write(int)
- */
- public void write(int b) throws IOException {
- count++;
- super.write(b);
- }
-
- //-----------------------------------------------------------------------
- /**
- * The number of bytes that have passed through this stream.
- * <p>
- * NOTE: From v1.3 this method throws an ArithmeticException if the
- * count is greater than can be expressed by an <code>int</code>.
- * See {@link #getByteCount()} for a method using a <code>long</code>.
- *
- * @return the number of bytes accumulated
- * @throws ArithmeticException if the byte count is too large
- */
- public synchronized int getCount() {
- long result = getByteCount();
- if (result > Integer.MAX_VALUE) {
- throw new ArithmeticException("The byte count " + result + " is too large to be converted to an int");
- }
- return (int) result;
- }
-
- /**
- * Set the byte count back to 0.
- * <p>
- * NOTE: From v1.3 this method throws an ArithmeticException if the
- * count is greater than can be expressed by an <code>int</code>.
- * See {@link #resetByteCount()} for a method using a <code>long</code>.
- *
- * @return the count previous to resetting
- * @throws ArithmeticException if the byte count is too large
- */
- public synchronized int resetCount() {
- long result = resetByteCount();
- if (result > Integer.MAX_VALUE) {
- throw new ArithmeticException("The byte count " + result + " is too large to be converted to an int");
- }
- return (int) result;
- }
-
- /**
- * The number of bytes that have passed through this stream.
- * <p>
- * NOTE: This method is an alternative for <code>getCount()</code>.
- * It was added because that method returns an integer which will
- * result in incorrect count for files over 2GB.
- *
- * @return the number of bytes accumulated
- * @since Commons IO 1.3
- */
- public synchronized long getByteCount() {
- return this.count;
- }
-
- /**
- * Set the byte count back to 0.
- * <p>
- * NOTE: This method is an alternative for <code>resetCount()</code>.
- * It was added because that method returns an integer which will
- * result in incorrect count for files over 2GB.
- *
- * @return the count previous to resetting
- * @since Commons IO 1.3
- */
- public synchronized long resetByteCount() {
- long tmp = this.count;
- this.count = 0;
- return tmp;
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/DeferredFileOutputStream.java b/emailcommon/src/org/apache/commons/io/output/DeferredFileOutputStream.java
deleted file mode 100644
index b8a9e9607..000000000
--- a/emailcommon/src/org/apache/commons/io/output/DeferredFileOutputStream.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.apache.commons.io.IOUtils;
-
-
-/**
- * An output stream which will retain data in memory until a specified
- * threshold is reached, and only then commit it to disk. If the stream is
- * closed before the threshold is reached, the data will not be written to
- * disk at all.
- * <p>
- * This class originated in FileUpload processing. In this use case, you do
- * not know in advance the size of the file being uploaded. If the file is small
- * you want to store it in memory (for speed), but if the file is large you want
- * to store it to file (to avoid memory issues).
- *
- * @author <a href="mailto:martinc@apache.org">Martin Cooper</a>
- * @author gaxzerow
- *
- * @version $Id: DeferredFileOutputStream.java 606381 2007-12-22 02:03:16Z ggregory $
- */
-public class DeferredFileOutputStream
- extends ThresholdingOutputStream
-{
-
- // ----------------------------------------------------------- Data members
-
-
- /**
- * The output stream to which data will be written prior to the theshold
- * being reached.
- */
- private ByteArrayOutputStream memoryOutputStream;
-
-
- /**
- * The output stream to which data will be written at any given time. This
- * will always be one of <code>memoryOutputStream</code> or
- * <code>diskOutputStream</code>.
- */
- private OutputStream currentOutputStream;
-
-
- /**
- * The file to which output will be directed if the threshold is exceeded.
- */
- private File outputFile;
-
- /**
- * The temporary file prefix.
- */
- private String prefix;
-
- /**
- * The temporary file suffix.
- */
- private String suffix;
-
- /**
- * The directory to use for temporary files.
- */
- private File directory;
-
-
- /**
- * True when close() has been called successfully.
- */
- private boolean closed = false;
-
- // ----------------------------------------------------------- Constructors
-
-
- /**
- * Constructs an instance of this class which will trigger an event at the
- * specified threshold, and save data to a file beyond that point.
- *
- * @param threshold The number of bytes at which to trigger an event.
- * @param outputFile The file to which data is saved beyond the threshold.
- */
- public DeferredFileOutputStream(int threshold, File outputFile)
- {
- super(threshold);
- this.outputFile = outputFile;
-
- memoryOutputStream = new ByteArrayOutputStream();
- currentOutputStream = memoryOutputStream;
- }
-
-
- /**
- * Constructs an instance of this class which will trigger an event at the
- * specified threshold, and save data to a temporary file beyond that point.
- *
- * @param threshold The number of bytes at which to trigger an event.
- * @param prefix Prefix to use for the temporary file.
- * @param suffix Suffix to use for the temporary file.
- * @param directory Temporary file directory.
- *
- * @since Commons IO 1.4
- */
- public DeferredFileOutputStream(int threshold, String prefix, String suffix, File directory)
- {
- this(threshold, (File)null);
- if (prefix == null) {
- throw new IllegalArgumentException("Temporary file prefix is missing");
- }
- this.prefix = prefix;
- this.suffix = suffix;
- this.directory = directory;
- }
-
-
- // --------------------------------------- ThresholdingOutputStream methods
-
-
- /**
- * Returns the current output stream. This may be memory based or disk
- * based, depending on the current state with respect to the threshold.
- *
- * @return The underlying output stream.
- *
- * @exception IOException if an error occurs.
- */
- protected OutputStream getStream() throws IOException
- {
- return currentOutputStream;
- }
-
-
- /**
- * Switches the underlying output stream from a memory based stream to one
- * that is backed by disk. This is the point at which we realise that too
- * much data is being written to keep in memory, so we elect to switch to
- * disk-based storage.
- *
- * @exception IOException if an error occurs.
- */
- protected void thresholdReached() throws IOException
- {
- if (prefix != null) {
- outputFile = File.createTempFile(prefix, suffix, directory);
- }
- FileOutputStream fos = new FileOutputStream(outputFile);
- memoryOutputStream.writeTo(fos);
- currentOutputStream = fos;
- memoryOutputStream = null;
- }
-
-
- // --------------------------------------------------------- Public methods
-
-
- /**
- * Determines whether or not the data for this output stream has been
- * retained in memory.
- *
- * @return <code>true</code> if the data is available in memory;
- * <code>false</code> otherwise.
- */
- public boolean isInMemory()
- {
- return (!isThresholdExceeded());
- }
-
-
- /**
- * Returns the data for this output stream as an array of bytes, assuming
- * that the data has been retained in memory. If the data was written to
- * disk, this method returns <code>null</code>.
- *
- * @return The data for this output stream, or <code>null</code> if no such
- * data is available.
- */
- public byte[] getData()
- {
- if (memoryOutputStream != null)
- {
- return memoryOutputStream.toByteArray();
- }
- return null;
- }
-
-
- /**
- * Returns either the output file specified in the constructor or
- * the temporary file created or null.
- * <p>
- * If the constructor specifying the file is used then it returns that
- * same output file, even when threashold has not been reached.
- * <p>
- * If constructor specifying a temporary file prefix/suffix is used
- * then the temporary file created once the threashold is reached is returned
- * If the threshold was not reached then <code>null</code> is returned.
- *
- * @return The file for this output stream, or <code>null</code> if no such
- * file exists.
- */
- public File getFile()
- {
- return outputFile;
- }
-
-
- /**
- * Closes underlying output stream, and mark this as closed
- *
- * @exception IOException if an error occurs.
- */
- public void close() throws IOException
- {
- super.close();
- closed = true;
- }
-
-
- /**
- * Writes the data from this output stream to the specified output stream,
- * after it has been closed.
- *
- * @param out output stream to write to.
- * @exception IOException if this stream is not yet closed or an error occurs.
- */
- public void writeTo(OutputStream out) throws IOException
- {
- // we may only need to check if this is closed if we are working with a file
- // but we should force the habit of closing wether we are working with
- // a file or memory.
- if (!closed)
- {
- throw new IOException("Stream not closed");
- }
-
- if(isInMemory())
- {
- memoryOutputStream.writeTo(out);
- }
- else
- {
- FileInputStream fis = new FileInputStream(outputFile);
- try {
- IOUtils.copy(fis, out);
- } finally {
- IOUtils.closeQuietly(fis);
- }
- }
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/DemuxOutputStream.java b/emailcommon/src/org/apache/commons/io/output/DemuxOutputStream.java
deleted file mode 100644
index 280df14d3..000000000
--- a/emailcommon/src/org/apache/commons/io/output/DemuxOutputStream.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * Data written to this stream is forwarded to a stream that has been associated
- * with this thread.
- *
- * @author <a href="mailto:peter@apache.org">Peter Donald</a>
- * @version $Revision: 437567 $ $Date: 2006-08-28 07:39:07 +0100 (Mon, 28 Aug 2006) $
- */
-public class DemuxOutputStream
- extends OutputStream
-{
- private InheritableThreadLocal<OutputStream> m_streams = new InheritableThreadLocal<OutputStream>();
-
- /**
- * Bind the specified stream to the current thread.
- *
- * @param output the stream to bind
- * @return the OutputStream that was previously active
- */
- public OutputStream bindStream( OutputStream output )
- {
- OutputStream stream = getStream();
- m_streams.set( output );
- return stream;
- }
-
- /**
- * Closes stream associated with current thread.
- *
- * @throws IOException if an error occurs
- */
- @Override
- public void close()
- throws IOException
- {
- OutputStream output = getStream();
- if( null != output )
- {
- output.close();
- }
- }
-
- /**
- * Flushes stream associated with current thread.
- *
- * @throws IOException if an error occurs
- */
- @Override
- public void flush()
- throws IOException
- {
- OutputStream output = getStream();
- if( null != output )
- {
- output.flush();
- }
- }
-
- /**
- * Writes byte to stream associated with current thread.
- *
- * @param ch the byte to write to stream
- * @throws IOException if an error occurs
- */
- @Override
- public void write( int ch )
- throws IOException
- {
- OutputStream output = getStream();
- if( null != output )
- {
- output.write( ch );
- }
- }
-
- /**
- * Utility method to retrieve stream bound to current thread (if any).
- *
- * @return the output stream
- */
- private OutputStream getStream()
- {
- return m_streams.get();
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/FileWriterWithEncoding.java b/emailcommon/src/org/apache/commons/io/output/FileWriterWithEncoding.java
deleted file mode 100644
index a8f89334b..000000000
--- a/emailcommon/src/org/apache/commons/io/output/FileWriterWithEncoding.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetEncoder;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-
-/**
- * Writer of files that allows the encoding to be set.
- * <p>
- * This class provides a simple alternative to <code>FileWriter</code>
- * that allows an encoding to be set. Unfortunately, it cannot subclass
- * <code>FileWriter</code>.
- * <p>
- * By default, the file will be overwritten, but this may be changed to append.
- * <p>
- * The encoding must be specified using either the name of the {@link Charset},
- * the {@link Charset}, or a {@link CharsetEncoder}. If the default encoding
- * is required then use the {@link java.io.FileWriter} directly, rather than
- * this implementation.
- * <p>
- *
- *
- * @since Commons IO 1.4
- * @version $Id: FileWriterWithEncoding.java 611634 2008-01-13 20:35:00Z niallp $
- */
-public class FileWriterWithEncoding extends Writer {
- // Cannot extend ProxyWriter, as requires writer to be
- // known when super() is called
-
- /** The writer to decorate. */
- private final Writer out;
-
- /**
- * Constructs a FileWriterWithEncoding with a file encoding.
- *
- * @param filename the name of the file to write to, not null
- * @param encoding the encoding to use, not null
- * @throws NullPointerException if the file name or encoding is null
- * @throws IOException in case of an I/O error
- */
- public FileWriterWithEncoding(String filename, String encoding) throws IOException {
- this(new File(filename), encoding, false);
- }
-
- /**
- * Constructs a FileWriterWithEncoding with a file encoding.
- *
- * @param filename the name of the file to write to, not null
- * @param encoding the encoding to use, not null
- * @param append true if content should be appended, false to overwrite
- * @throws NullPointerException if the file name or encoding is null
- * @throws IOException in case of an I/O error
- */
- public FileWriterWithEncoding(String filename, String encoding, boolean append) throws IOException {
- this(new File(filename), encoding, append);
- }
-
- /**
- * Constructs a FileWriterWithEncoding with a file encoding.
- *
- * @param filename the name of the file to write to, not null
- * @param encoding the encoding to use, not null
- * @throws NullPointerException if the file name or encoding is null
- * @throws IOException in case of an I/O error
- */
- public FileWriterWithEncoding(String filename, Charset encoding) throws IOException {
- this(new File(filename), encoding, false);
- }
-
- /**
- * Constructs a FileWriterWithEncoding with a file encoding.
- *
- * @param filename the name of the file to write to, not null
- * @param encoding the encoding to use, not null
- * @param append true if content should be appended, false to overwrite
- * @throws NullPointerException if the file name or encoding is null
- * @throws IOException in case of an I/O error
- */
- public FileWriterWithEncoding(String filename, Charset encoding, boolean append) throws IOException {
- this(new File(filename), encoding, append);
- }
-
- /**
- * Constructs a FileWriterWithEncoding with a file encoding.
- *
- * @param filename the name of the file to write to, not null
- * @param encoding the encoding to use, not null
- * @throws NullPointerException if the file name or encoding is null
- * @throws IOException in case of an I/O error
- */
- public FileWriterWithEncoding(String filename, CharsetEncoder encoding) throws IOException {
- this(new File(filename), encoding, false);
- }
-
- /**
- * Constructs a FileWriterWithEncoding with a file encoding.
- *
- * @param filename the name of the file to write to, not null
- * @param encoding the encoding to use, not null
- * @param append true if content should be appended, false to overwrite
- * @throws NullPointerException if the file name or encoding is null
- * @throws IOException in case of an I/O error
- */
- public FileWriterWithEncoding(String filename, CharsetEncoder encoding, boolean append) throws IOException {
- this(new File(filename), encoding, append);
- }
-
- /**
- * Constructs a FileWriterWithEncoding with a file encoding.
- *
- * @param file the file to write to, not null
- * @param encoding the encoding to use, not null
- * @throws NullPointerException if the file or encoding is null
- * @throws IOException in case of an I/O error
- */
- public FileWriterWithEncoding(File file, String encoding) throws IOException {
- this(file, encoding, false);
- }
-
- /**
- * Constructs a FileWriterWithEncoding with a file encoding.
- *
- * @param file the file to write to, not null
- * @param encoding the encoding to use, not null
- * @param append true if content should be appended, false to overwrite
- * @throws NullPointerException if the file or encoding is null
- * @throws IOException in case of an I/O error
- */
- public FileWriterWithEncoding(File file, String encoding, boolean append) throws IOException {
- super();
- this.out = initWriter(file, encoding, append);
- }
-
- /**
- * Constructs a FileWriterWithEncoding with a file encoding.
- *
- * @param file the file to write to, not null
- * @param encoding the encoding to use, not null
- * @throws NullPointerException if the file or encoding is null
- * @throws IOException in case of an I/O error
- */
- public FileWriterWithEncoding(File file, Charset encoding) throws IOException {
- this(file, encoding, false);
- }
-
- /**
- * Constructs a FileWriterWithEncoding with a file encoding.
- *
- * @param file the file to write to, not null
- * @param encoding the encoding to use, not null
- * @param append true if content should be appended, false to overwrite
- * @throws NullPointerException if the file or encoding is null
- * @throws IOException in case of an I/O error
- */
- public FileWriterWithEncoding(File file, Charset encoding, boolean append) throws IOException {
- super();
- this.out = initWriter(file, encoding, append);
- }
-
- /**
- * Constructs a FileWriterWithEncoding with a file encoding.
- *
- * @param file the file to write to, not null
- * @param encoding the encoding to use, not null
- * @throws NullPointerException if the file or encoding is null
- * @throws IOException in case of an I/O error
- */
- public FileWriterWithEncoding(File file, CharsetEncoder encoding) throws IOException {
- this(file, encoding, false);
- }
-
- /**
- * Constructs a FileWriterWithEncoding with a file encoding.
- *
- * @param file the file to write to, not null
- * @param encoding the encoding to use, not null
- * @param append true if content should be appended, false to overwrite
- * @throws NullPointerException if the file or encoding is null
- * @throws IOException in case of an I/O error
- */
- public FileWriterWithEncoding(File file, CharsetEncoder encoding, boolean append) throws IOException {
- super();
- this.out = initWriter(file, encoding, append);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Initialise the wrapped file writer.
- * Ensure that a cleanup occurs if the writer creation fails.
- *
- * @param file the file to be accessed
- * @param encoding the encoding to use - may be Charset, CharsetEncoder or String
- * @param append true to append
- * @return the initialised writer
- * @throws NullPointerException if the file or encoding is null
- * @throws IOException if an error occurs
- */
- private static Writer initWriter(File file, Object encoding, boolean append) throws IOException {
- if (file == null) {
- throw new NullPointerException("File is missing");
- }
- if (encoding == null) {
- throw new NullPointerException("Encoding is missing");
- }
- boolean fileExistedAlready = file.exists();
- OutputStream stream = null;
- Writer writer = null;
- try {
- stream = new FileOutputStream(file, append);
- if (encoding instanceof Charset) {
- writer = new OutputStreamWriter(stream, (Charset)encoding);
- } else if (encoding instanceof CharsetEncoder) {
- writer = new OutputStreamWriter(stream, (CharsetEncoder)encoding);
- } else {
- writer = new OutputStreamWriter(stream, (String)encoding);
- }
- } catch (IOException ex) {
- IOUtils.closeQuietly(writer);
- IOUtils.closeQuietly(stream);
- if (fileExistedAlready == false) {
- FileUtils.deleteQuietly(file);
- }
- throw ex;
- } catch (RuntimeException ex) {
- IOUtils.closeQuietly(writer);
- IOUtils.closeQuietly(stream);
- if (fileExistedAlready == false) {
- FileUtils.deleteQuietly(file);
- }
- throw ex;
- }
- return writer;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Write a character.
- * @param idx the character to write
- * @throws IOException if an I/O error occurs
- */
- public void write(int idx) throws IOException {
- out.write(idx);
- }
-
- /**
- * Write the characters from an array.
- * @param chr the characters to write
- * @throws IOException if an I/O error occurs
- */
- public void write(char[] chr) throws IOException {
- out.write(chr);
- }
-
- /**
- * Write the specified characters from an array.
- * @param chr the characters to write
- * @param st The start offset
- * @param end The number of characters to write
- * @throws IOException if an I/O error occurs
- */
- public void write(char[] chr, int st, int end) throws IOException {
- out.write(chr, st, end);
- }
-
- /**
- * Write the characters from a string.
- * @param str the string to write
- * @throws IOException if an I/O error occurs
- */
- public void write(String str) throws IOException {
- out.write(str);
- }
-
- /**
- * Write the specified characters from a string.
- * @param str the string to write
- * @param st The start offset
- * @param end The number of characters to write
- * @throws IOException if an I/O error occurs
- */
- public void write(String str, int st, int end) throws IOException {
- out.write(str, st, end);
- }
-
- /**
- * Flush the stream.
- * @throws IOException if an I/O error occurs
- */
- public void flush() throws IOException {
- out.flush();
- }
-
- /**
- * Close the stream.
- * @throws IOException if an I/O error occurs
- */
- public void close() throws IOException {
- out.close();
- }
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/LockableFileWriter.java b/emailcommon/src/org/apache/commons/io/output/LockableFileWriter.java
deleted file mode 100644
index 6b10bd282..000000000
--- a/emailcommon/src/org/apache/commons/io/output/LockableFileWriter.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-
-/**
- * FileWriter that will create and honor lock files to allow simple
- * cross thread file lock handling.
- * <p>
- * This class provides a simple alternative to <code>FileWriter</code>
- * that will use a lock file to prevent duplicate writes.
- * <p>
- * By default, the file will be overwritten, but this may be changed to append.
- * The lock directory may be specified, but defaults to the system property
- * <code>java.io.tmpdir</code>.
- * The encoding may also be specified, and defaults to the platform default.
- *
- * @author <a href="mailto:sanders@apache.org">Scott Sanders</a>
- * @author <a href="mailto:ms@collab.net">Michael Salmon</a>
- * @author <a href="mailto:jon@collab.net">Jon S. Stevens</a>
- * @author <a href="mailto:dlr@finemaltcoding.com">Daniel Rall</a>
- * @author Stephen Colebourne
- * @author Andy Lehane
- * @version $Id: LockableFileWriter.java 610010 2008-01-08 14:50:59Z niallp $
- */
-public class LockableFileWriter extends Writer {
- // Cannot extend ProxyWriter, as requires writer to be
- // known when super() is called
-
- /** The extension for the lock file. */
- private static final String LCK = ".lck";
-
- /** The writer to decorate. */
- private final Writer out;
- /** The lock file. */
- private final File lockFile;
-
- /**
- * Constructs a LockableFileWriter.
- * If the file exists, it is overwritten.
- *
- * @param fileName the file to write to, not null
- * @throws NullPointerException if the file is null
- * @throws IOException in case of an I/O error
- */
- public LockableFileWriter(String fileName) throws IOException {
- this(fileName, false, null);
- }
-
- /**
- * Constructs a LockableFileWriter.
- *
- * @param fileName file to write to, not null
- * @param append true if content should be appended, false to overwrite
- * @throws NullPointerException if the file is null
- * @throws IOException in case of an I/O error
- */
- public LockableFileWriter(String fileName, boolean append) throws IOException {
- this(fileName, append, null);
- }
-
- /**
- * Constructs a LockableFileWriter.
- *
- * @param fileName the file to write to, not null
- * @param append true if content should be appended, false to overwrite
- * @param lockDir the directory in which the lock file should be held
- * @throws NullPointerException if the file is null
- * @throws IOException in case of an I/O error
- */
- public LockableFileWriter(String fileName, boolean append, String lockDir) throws IOException {
- this(new File(fileName), append, lockDir);
- }
-
- /**
- * Constructs a LockableFileWriter.
- * If the file exists, it is overwritten.
- *
- * @param file the file to write to, not null
- * @throws NullPointerException if the file is null
- * @throws IOException in case of an I/O error
- */
- public LockableFileWriter(File file) throws IOException {
- this(file, false, null);
- }
-
- /**
- * Constructs a LockableFileWriter.
- *
- * @param file the file to write to, not null
- * @param append true if content should be appended, false to overwrite
- * @throws NullPointerException if the file is null
- * @throws IOException in case of an I/O error
- */
- public LockableFileWriter(File file, boolean append) throws IOException {
- this(file, append, null);
- }
-
- /**
- * Constructs a LockableFileWriter.
- *
- * @param file the file to write to, not null
- * @param append true if content should be appended, false to overwrite
- * @param lockDir the directory in which the lock file should be held
- * @throws NullPointerException if the file is null
- * @throws IOException in case of an I/O error
- */
- public LockableFileWriter(File file, boolean append, String lockDir) throws IOException {
- this(file, null, append, lockDir);
- }
-
- /**
- * Constructs a LockableFileWriter with a file encoding.
- *
- * @param file the file to write to, not null
- * @param encoding the encoding to use, null means platform default
- * @throws NullPointerException if the file is null
- * @throws IOException in case of an I/O error
- */
- public LockableFileWriter(File file, String encoding) throws IOException {
- this(file, encoding, false, null);
- }
-
- /**
- * Constructs a LockableFileWriter with a file encoding.
- *
- * @param file the file to write to, not null
- * @param encoding the encoding to use, null means platform default
- * @param append true if content should be appended, false to overwrite
- * @param lockDir the directory in which the lock file should be held
- * @throws NullPointerException if the file is null
- * @throws IOException in case of an I/O error
- */
- public LockableFileWriter(File file, String encoding, boolean append,
- String lockDir) throws IOException {
- super();
- // init file to create/append
- file = file.getAbsoluteFile();
- if (file.getParentFile() != null) {
- FileUtils.forceMkdir(file.getParentFile());
- }
- if (file.isDirectory()) {
- throw new IOException("File specified is a directory");
- }
-
- // init lock file
- if (lockDir == null) {
- lockDir = System.getProperty("java.io.tmpdir");
- }
- File lockDirFile = new File(lockDir);
- FileUtils.forceMkdir(lockDirFile);
- testLockDir(lockDirFile);
- lockFile = new File(lockDirFile, file.getName() + LCK);
-
- // check if locked
- createLock();
-
- // init wrapped writer
- out = initWriter(file, encoding, append);
- }
-
- //-----------------------------------------------------------------------
- /**
- * Tests that we can write to the lock directory.
- *
- * @param lockDir the File representing the lock directory
- * @throws IOException if we cannot write to the lock directory
- * @throws IOException if we cannot find the lock file
- */
- private void testLockDir(File lockDir) throws IOException {
- if (!lockDir.exists()) {
- throw new IOException(
- "Could not find lockDir: " + lockDir.getAbsolutePath());
- }
- if (!lockDir.canWrite()) {
- throw new IOException(
- "Could not write to lockDir: " + lockDir.getAbsolutePath());
- }
- }
-
- /**
- * Creates the lock file.
- *
- * @throws IOException if we cannot create the file
- */
- private void createLock() throws IOException {
- synchronized (LockableFileWriter.class) {
- if (!lockFile.createNewFile()) {
- throw new IOException("Can't write file, lock " +
- lockFile.getAbsolutePath() + " exists");
- }
- lockFile.deleteOnExit();
- }
- }
-
- /**
- * Initialise the wrapped file writer.
- * Ensure that a cleanup occurs if the writer creation fails.
- *
- * @param file the file to be accessed
- * @param encoding the encoding to use
- * @param append true to append
- * @return The initialised writer
- * @throws IOException if an error occurs
- */
- private Writer initWriter(File file, String encoding, boolean append) throws IOException {
- boolean fileExistedAlready = file.exists();
- OutputStream stream = null;
- Writer writer = null;
- try {
- if (encoding == null) {
- writer = new FileWriter(file.getAbsolutePath(), append);
- } else {
- stream = new FileOutputStream(file.getAbsolutePath(), append);
- writer = new OutputStreamWriter(stream, encoding);
- }
- } catch (IOException ex) {
- IOUtils.closeQuietly(writer);
- IOUtils.closeQuietly(stream);
- lockFile.delete();
- if (fileExistedAlready == false) {
- file.delete();
- }
- throw ex;
- } catch (RuntimeException ex) {
- IOUtils.closeQuietly(writer);
- IOUtils.closeQuietly(stream);
- lockFile.delete();
- if (fileExistedAlready == false) {
- file.delete();
- }
- throw ex;
- }
- return writer;
- }
-
- //-----------------------------------------------------------------------
- /**
- * Closes the file writer.
- *
- * @throws IOException if an I/O error occurs
- */
- public void close() throws IOException {
- try {
- out.close();
- } finally {
- lockFile.delete();
- }
- }
-
- //-----------------------------------------------------------------------
- /**
- * Write a character.
- * @param idx the character to write
- * @throws IOException if an I/O error occurs
- */
- public void write(int idx) throws IOException {
- out.write(idx);
- }
-
- /**
- * Write the characters from an array.
- * @param chr the characters to write
- * @throws IOException if an I/O error occurs
- */
- public void write(char[] chr) throws IOException {
- out.write(chr);
- }
-
- /**
- * Write the specified characters from an array.
- * @param chr the characters to write
- * @param st The start offset
- * @param end The number of characters to write
- * @throws IOException if an I/O error occurs
- */
- public void write(char[] chr, int st, int end) throws IOException {
- out.write(chr, st, end);
- }
-
- /**
- * Write the characters from a string.
- * @param str the string to write
- * @throws IOException if an I/O error occurs
- */
- public void write(String str) throws IOException {
- out.write(str);
- }
-
- /**
- * Write the specified characters from a string.
- * @param str the string to write
- * @param st The start offset
- * @param end The number of characters to write
- * @throws IOException if an I/O error occurs
- */
- public void write(String str, int st, int end) throws IOException {
- out.write(str, st, end);
- }
-
- /**
- * Flush the stream.
- * @throws IOException if an I/O error occurs
- */
- public void flush() throws IOException {
- out.flush();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/NullOutputStream.java b/emailcommon/src/org/apache/commons/io/output/NullOutputStream.java
deleted file mode 100644
index 7e3cdaf2c..000000000
--- a/emailcommon/src/org/apache/commons/io/output/NullOutputStream.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * This OutputStream writes all data to the famous <b>/dev/null</b>.
- * <p>
- * This output stream has no destination (file/socket etc.) and all
- * bytes written to it are ignored and lost.
- *
- * @author Jeremias Maerki
- * @version $Id: NullOutputStream.java 610010 2008-01-08 14:50:59Z niallp $
- */
-public class NullOutputStream extends OutputStream {
-
- /**
- * A singleton.
- */
- public static final NullOutputStream NULL_OUTPUT_STREAM = new NullOutputStream();
-
- /**
- * Does nothing - output to <code>/dev/null</code>.
- * @param b The bytes to write
- * @param off The start offset
- * @param len The number of bytes to write
- */
- public void write(byte[] b, int off, int len) {
- //to /dev/null
- }
-
- /**
- * Does nothing - output to <code>/dev/null</code>.
- * @param b The byte to write
- */
- public void write(int b) {
- //to /dev/null
- }
-
- /**
- * Does nothing - output to <code>/dev/null</code>.
- * @param b The bytes to write
- * @throws IOException never
- */
- public void write(byte[] b) throws IOException {
- //to /dev/null
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/NullWriter.java b/emailcommon/src/org/apache/commons/io/output/NullWriter.java
deleted file mode 100644
index aed52aba8..000000000
--- a/emailcommon/src/org/apache/commons/io/output/NullWriter.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.Writer;
-
-/**
- * This {@link Writer} writes all data to the famous <b>/dev/null</b>.
- * <p>
- * This <code>Writer</code> has no destination (file/socket etc.) and all
- * characters written to it are ignored and lost.
- *
- * @version $Id: NullWriter.java 610010 2008-01-08 14:50:59Z niallp $
- */
-public class NullWriter extends Writer {
-
- /**
- * A singleton.
- */
- public static final NullWriter NULL_WRITER = new NullWriter();
-
- /**
- * Constructs a new NullWriter.
- */
- public NullWriter() {
- }
-
- /**
- * Does nothing - output to <code>/dev/null</code>.
- * @param idx The character to write
- */
- public void write(int idx) {
- //to /dev/null
- }
-
- /**
- * Does nothing - output to <code>/dev/null</code>.
- * @param chr The characters to write
- */
- public void write(char[] chr) {
- //to /dev/null
- }
-
- /**
- * Does nothing - output to <code>/dev/null</code>.
- * @param chr The characters to write
- * @param st The start offset
- * @param end The number of characters to write
- */
- public void write(char[] chr, int st, int end) {
- //to /dev/null
- }
-
- /**
- * Does nothing - output to <code>/dev/null</code>.
- * @param str The string to write
- */
- public void write(String str) {
- //to /dev/null
- }
-
- /**
- * Does nothing - output to <code>/dev/null</code>.
- * @param str The string to write
- * @param st The start offset
- * @param end The number of characters to write
- */
- public void write(String str, int st, int end) {
- //to /dev/null
- }
-
- /** @see java.io.Writer#flush() */
- public void flush() {
- //to /dev/null
- }
-
- /** @see java.io.Writer#close() */
- public void close() {
- //to /dev/null
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/ProxyOutputStream.java b/emailcommon/src/org/apache/commons/io/output/ProxyOutputStream.java
deleted file mode 100644
index b63d72317..000000000
--- a/emailcommon/src/org/apache/commons/io/output/ProxyOutputStream.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * A Proxy stream which acts as expected, that is it passes the method
- * calls on to the proxied stream and doesn't change which methods are
- * being called. It is an alternative base class to FilterOutputStream
- * to increase reusability.
- *
- * @author Stephen Colebourne
- * @version $Id: ProxyOutputStream.java 610010 2008-01-08 14:50:59Z niallp $
- */
-public class ProxyOutputStream extends FilterOutputStream {
-
- /**
- * Constructs a new ProxyOutputStream.
- *
- * @param proxy the OutputStream to delegate to
- */
- public ProxyOutputStream(OutputStream proxy) {
- super(proxy);
- // the proxy is stored in a protected superclass variable named 'out'
- }
-
- /**
- * Invokes the delegate's <code>write(int)</code> method.
- * @param idx the byte to write
- * @throws IOException if an I/O error occurs
- */
- public void write(int idx) throws IOException {
- out.write(idx);
- }
-
- /**
- * Invokes the delegate's <code>write(byte[])</code> method.
- * @param bts the bytes to write
- * @throws IOException if an I/O error occurs
- */
- public void write(byte[] bts) throws IOException {
- out.write(bts);
- }
-
- /**
- * Invokes the delegate's <code>write(byte[])</code> method.
- * @param bts the bytes to write
- * @param st The start offset
- * @param end The number of bytes to write
- * @throws IOException if an I/O error occurs
- */
- public void write(byte[] bts, int st, int end) throws IOException {
- out.write(bts, st, end);
- }
-
- /**
- * Invokes the delegate's <code>flush()</code> method.
- * @throws IOException if an I/O error occurs
- */
- public void flush() throws IOException {
- out.flush();
- }
-
- /**
- * Invokes the delegate's <code>close()</code> method.
- * @throws IOException if an I/O error occurs
- */
- public void close() throws IOException {
- out.close();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/ProxyWriter.java b/emailcommon/src/org/apache/commons/io/output/ProxyWriter.java
deleted file mode 100644
index fbec62885..000000000
--- a/emailcommon/src/org/apache/commons/io/output/ProxyWriter.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.FilterWriter;
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * A Proxy stream which acts as expected, that is it passes the method
- * calls on to the proxied stream and doesn't change which methods are
- * being called. It is an alternative base class to FilterWriter
- * to increase reusability, because FilterWriter changes the
- * methods being called, such as write(char[]) to write(char[], int, int)
- * and write(String) to write(String, int, int).
- *
- * @author Stephen Colebourne
- * @version $Id: ProxyWriter.java 610010 2008-01-08 14:50:59Z niallp $
- */
-public class ProxyWriter extends FilterWriter {
-
- /**
- * Constructs a new ProxyWriter.
- *
- * @param proxy the Writer to delegate to
- */
- public ProxyWriter(Writer proxy) {
- super(proxy);
- // the proxy is stored in a protected superclass variable named 'out'
- }
-
- /**
- * Invokes the delegate's <code>write(int)</code> method.
- * @param idx the character to write
- * @throws IOException if an I/O error occurs
- */
- public void write(int idx) throws IOException {
- out.write(idx);
- }
-
- /**
- * Invokes the delegate's <code>write(char[])</code> method.
- * @param chr the characters to write
- * @throws IOException if an I/O error occurs
- */
- public void write(char[] chr) throws IOException {
- out.write(chr);
- }
-
- /**
- * Invokes the delegate's <code>write(char[], int, int)</code> method.
- * @param chr the characters to write
- * @param st The start offset
- * @param end The number of characters to write
- * @throws IOException if an I/O error occurs
- */
- public void write(char[] chr, int st, int end) throws IOException {
- out.write(chr, st, end);
- }
-
- /**
- * Invokes the delegate's <code>write(String)</code> method.
- * @param str the string to write
- * @throws IOException if an I/O error occurs
- */
- public void write(String str) throws IOException {
- out.write(str);
- }
-
- /**
- * Invokes the delegate's <code>write(String)</code> method.
- * @param str the string to write
- * @param st The start offset
- * @param end The number of characters to write
- * @throws IOException if an I/O error occurs
- */
- public void write(String str, int st, int end) throws IOException {
- out.write(str, st, end);
- }
-
- /**
- * Invokes the delegate's <code>flush()</code> method.
- * @throws IOException if an I/O error occurs
- */
- public void flush() throws IOException {
- out.flush();
- }
-
- /**
- * Invokes the delegate's <code>close()</code> method.
- * @throws IOException if an I/O error occurs
- */
- public void close() throws IOException {
- out.close();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/TeeOutputStream.java b/emailcommon/src/org/apache/commons/io/output/TeeOutputStream.java
deleted file mode 100644
index ee957fb3b..000000000
--- a/emailcommon/src/org/apache/commons/io/output/TeeOutputStream.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * Classic splitter of OutputStream. Named after the unix 'tee'
- * command. It allows a stream to be branched off so there
- * are now two streams.
- *
- * @version $Id: TeeOutputStream.java 610010 2008-01-08 14:50:59Z niallp $
- */
-public class TeeOutputStream extends ProxyOutputStream {
-
- /** the second OutputStream to write to */
- protected OutputStream branch;
-
- /**
- * Constructs a TeeOutputStream.
- * @param out the main OutputStream
- * @param branch the second OutputStream
- */
- public TeeOutputStream( OutputStream out, OutputStream branch ) {
- super(out);
- this.branch = branch;
- }
-
- /**
- * Write the bytes to both streams.
- * @param b the bytes to write
- * @throws IOException if an I/O error occurs
- */
- public synchronized void write(byte[] b) throws IOException {
- super.write(b);
- this.branch.write(b);
- }
-
- /**
- * Write the specified bytes to both streams.
- * @param b the bytes to write
- * @param off The start offset
- * @param len The number of bytes to write
- * @throws IOException if an I/O error occurs
- */
- public synchronized void write(byte[] b, int off, int len) throws IOException {
- super.write(b, off, len);
- this.branch.write(b, off, len);
- }
-
- /**
- * Write a byte to both streams.
- * @param b the byte to write
- * @throws IOException if an I/O error occurs
- */
- public synchronized void write(int b) throws IOException {
- super.write(b);
- this.branch.write(b);
- }
-
- /**
- * Flushes both streams.
- * @throws IOException if an I/O error occurs
- */
- public void flush() throws IOException {
- super.flush();
- this.branch.flush();
- }
-
- /**
- * Closes both streams.
- * @throws IOException if an I/O error occurs
- */
- public void close() throws IOException {
- super.close();
- this.branch.close();
- }
-
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/ThresholdingOutputStream.java b/emailcommon/src/org/apache/commons/io/output/ThresholdingOutputStream.java
deleted file mode 100644
index fa69a804c..000000000
--- a/emailcommon/src/org/apache/commons/io/output/ThresholdingOutputStream.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.io.output;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-
-/**
- * An output stream which triggers an event when a specified number of bytes of
- * data have been written to it. The event can be used, for example, to throw
- * an exception if a maximum has been reached, or to switch the underlying
- * stream type when the threshold is exceeded.
- * <p>
- * This class overrides all <code>OutputStream</code> methods. However, these
- * overrides ultimately call the corresponding methods in the underlying output
- * stream implementation.
- * <p>
- * NOTE: This implementation may trigger the event <em>before</em> the threshold
- * is actually reached, since it triggers when a pending write operation would
- * cause the threshold to be exceeded.
- *
- * @author <a href="mailto:martinc@apache.org">Martin Cooper</a>
- *
- * @version $Id: ThresholdingOutputStream.java 540714 2007-05-22 19:39:44Z niallp $
- */
-public abstract class ThresholdingOutputStream
- extends OutputStream
-{
-
- // ----------------------------------------------------------- Data members
-
-
- /**
- * The threshold at which the event will be triggered.
- */
- private int threshold;
-
-
- /**
- * The number of bytes written to the output stream.
- */
- private long written;
-
-
- /**
- * Whether or not the configured threshold has been exceeded.
- */
- private boolean thresholdExceeded;
-
-
- // ----------------------------------------------------------- Constructors
-
-
- /**
- * Constructs an instance of this class which will trigger an event at the
- * specified threshold.
- *
- * @param threshold The number of bytes at which to trigger an event.
- */
- public ThresholdingOutputStream(int threshold)
- {
- this.threshold = threshold;
- }
-
-
- // --------------------------------------------------- OutputStream methods
-
-
- /**
- * Writes the specified byte to this output stream.
- *
- * @param b The byte to be written.
- *
- * @exception IOException if an error occurs.
- */
- public void write(int b) throws IOException
- {
- checkThreshold(1);
- getStream().write(b);
- written++;
- }
-
-
- /**
- * Writes <code>b.length</code> bytes from the specified byte array to this
- * output stream.
- *
- * @param b The array of bytes to be written.
- *
- * @exception IOException if an error occurs.
- */
- public void write(byte b[]) throws IOException
- {
- checkThreshold(b.length);
- getStream().write(b);
- written += b.length;
- }
-
-
- /**
- * Writes <code>len</code> bytes from the specified byte array starting at
- * offset <code>off</code> to this output stream.
- *
- * @param b The byte array from which the data will be written.
- * @param off The start offset in the byte array.
- * @param len The number of bytes to write.
- *
- * @exception IOException if an error occurs.
- */
- public void write(byte b[], int off, int len) throws IOException
- {
- checkThreshold(len);
- getStream().write(b, off, len);
- written += len;
- }
-
-
- /**
- * Flushes this output stream and forces any buffered output bytes to be
- * written out.
- *
- * @exception IOException if an error occurs.
- */
- public void flush() throws IOException
- {
- getStream().flush();
- }
-
-
- /**
- * Closes this output stream and releases any system resources associated
- * with this stream.
- *
- * @exception IOException if an error occurs.
- */
- public void close() throws IOException
- {
- try
- {
- flush();
- }
- catch (IOException ignored)
- {
- // ignore
- }
- getStream().close();
- }
-
-
- // --------------------------------------------------------- Public methods
-
-
- /**
- * Returns the threshold, in bytes, at which an event will be triggered.
- *
- * @return The threshold point, in bytes.
- */
- public int getThreshold()
- {
- return threshold;
- }
-
-
- /**
- * Returns the number of bytes that have been written to this output stream.
- *
- * @return The number of bytes written.
- */
- public long getByteCount()
- {
- return written;
- }
-
-
- /**
- * Determines whether or not the configured threshold has been exceeded for
- * this output stream.
- *
- * @return <code>true</code> if the threshold has been reached;
- * <code>false</code> otherwise.
- */
- public boolean isThresholdExceeded()
- {
- return (written > threshold);
- }
-
-
- // ------------------------------------------------------ Protected methods
-
-
- /**
- * Checks to see if writing the specified number of bytes would cause the
- * configured threshold to be exceeded. If so, triggers an event to allow
- * a concrete implementation to take action on this.
- *
- * @param count The number of bytes about to be written to the underlying
- * output stream.
- *
- * @exception IOException if an error occurs.
- */
- protected void checkThreshold(int count) throws IOException
- {
- if (!thresholdExceeded && (written + count > threshold))
- {
- thresholdExceeded = true;
- thresholdReached();
- }
- }
-
- /**
- * Resets the byteCount to zero. You can call this from
- * {@link #thresholdReached()} if you want the event to be triggered again.
- */
- protected void resetByteCount()
- {
- this.thresholdExceeded = false;
- this.written = 0;
- }
-
- // ------------------------------------------------------- Abstract methods
-
-
- /**
- * Returns the underlying output stream, to which the corresponding
- * <code>OutputStream</code> methods in this class will ultimately delegate.
- *
- * @return The underlying output stream.
- *
- * @exception IOException if an error occurs.
- */
- protected abstract OutputStream getStream() throws IOException;
-
-
- /**
- * Indicates that the configured threshold has been reached, and that a
- * subclass should take whatever action necessary on this event. This may
- * include changing the underlying output stream.
- *
- * @exception IOException if an error occurs.
- */
- protected abstract void thresholdReached() throws IOException;
-}
diff --git a/emailcommon/src/org/apache/commons/io/output/package.html b/emailcommon/src/org/apache/commons/io/output/package.html
deleted file mode 100644
index db2cbce59..000000000
--- a/emailcommon/src/org/apache/commons/io/output/package.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements. See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<html>
-<body>
-<p>
-This package provides implementations of output classes, such as
-<code>OutputStream</code> and <code>Writer</code>.
-</p>
-</body>
-</html>
diff --git a/emailcommon/src/org/apache/commons/io/overview.html b/emailcommon/src/org/apache/commons/io/overview.html
deleted file mode 100644
index 31311b5e9..000000000
--- a/emailcommon/src/org/apache/commons/io/overview.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements. See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<html>
-<body bgcolor="white">
-<p>
-The commons-io component contains utility classes,
-filters, streams, readers and writers.
-</p>
-<p>
-These classes aim to add to the standard JDK IO classes.
-The utilities provide convenience wrappers around the JDK, simplifying
-various operations into pre-tested units of code.
-The filters and streams provide useful implementations that perhaps should
-be in the JDK itself.
-</p>
-</body>
-</html>
diff --git a/emailcommon/src/org/apache/commons/io/package.html b/emailcommon/src/org/apache/commons/io/package.html
deleted file mode 100644
index e5ba9b0aa..000000000
--- a/emailcommon/src/org/apache/commons/io/package.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements. See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<html>
-<body bgcolor="white">
-<p>
-This package defines utility classes for working with streams, readers,
-writers and files. The most commonly used classes are described here:
-</p>
-<p>
-<b>IOUtils</b> is the most frequently used class.
-It provides operations to read, write, copy and close streams.
-</p>
-<p>
-<b>FileUtils</b> provides operations based around the JDK File class.
-These include reading, writing, copying, comparing and deleting.
-</p>
-<p>
-<b>FilenameUtils</b> provides utilities based on filenames.
-This utility class manipulates filenames without using File objects.
-It aims to simplify the transition between Windows and Unix.
-Before using this class however, you should consider whether you should
-be using File objects.
-</p>
-<p>
-<b>FileSystemUtils</b> allows access to the filing system in ways the JDK
-does not support. At present this allows you to get the free space on a drive.
-</p>
-<p>
-<b>EndianUtils</b> swaps data between Big-Endian and Little-Endian formats.
-</p>
-</body>
-</html>
diff --git a/emailcommon/src/org/apache/james/mime4j/AbstractContentHandler.java b/emailcommon/src/org/apache/james/mime4j/AbstractContentHandler.java
deleted file mode 100644
index 06c9b90a0..000000000
--- a/emailcommon/src/org/apache/james/mime4j/AbstractContentHandler.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Abstract <code>ContentHandler</code> with default implementations of all
- * the methods of the <code>ContentHandler</code> interface.
- *
- * The default is to todo nothing.
- *
- *
- * @version $Id: AbstractContentHandler.java,v 1.3 2004/10/02 12:41:10 ntherning Exp $
- */
-public abstract class AbstractContentHandler implements ContentHandler {
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#endMultipart()
- */
- public void endMultipart() {
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#startMultipart(org.apache.james.mime4j.BodyDescriptor)
- */
- public void startMultipart(BodyDescriptor bd) {
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#body(org.apache.james.mime4j.BodyDescriptor, java.io.InputStream)
- */
- public void body(BodyDescriptor bd, InputStream is) throws IOException {
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#endBodyPart()
- */
- public void endBodyPart() {
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#endHeader()
- */
- public void endHeader() {
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#endMessage()
- */
- public void endMessage() {
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#epilogue(java.io.InputStream)
- */
- public void epilogue(InputStream is) throws IOException {
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#field(java.lang.String)
- */
- public void field(String fieldData) {
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#preamble(java.io.InputStream)
- */
- public void preamble(InputStream is) throws IOException {
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#startBodyPart()
- */
- public void startBodyPart() {
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#startHeader()
- */
- public void startHeader() {
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#startMessage()
- */
- public void startMessage() {
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#raw(java.io.InputStream)
- */
- public void raw(InputStream is) throws IOException {
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/BodyDescriptor.java b/emailcommon/src/org/apache/james/mime4j/BodyDescriptor.java
deleted file mode 100644
index 2fef0be04..000000000
--- a/emailcommon/src/org/apache/james/mime4j/BodyDescriptor.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Encapsulates the values of the MIME-specific header fields
- * (which starts with <code>Content-</code>).
- *
- *
- * @version $Id: BodyDescriptor.java,v 1.4 2005/02/11 10:08:37 ntherning Exp $
- */
-public class BodyDescriptor {
- private static Log log = LogFactory.getLog(BodyDescriptor.class);
-
- private String mimeType = "text/plain";
- private String boundary = null;
- private String charset = "us-ascii";
- private String transferEncoding = "7bit";
- private Map<String, String> parameters = new HashMap<String, String>();
- private boolean contentTypeSet = false;
- private boolean contentTransferEncSet = false;
-
- /**
- * Creates a new root <code>BodyDescriptor</code> instance.
- */
- public BodyDescriptor() {
- this(null);
- }
-
- /**
- * Creates a new <code>BodyDescriptor</code> instance.
- *
- * @param parent the descriptor of the parent or <code>null</code> if this
- * is the root descriptor.
- */
- public BodyDescriptor(BodyDescriptor parent) {
- if (parent != null && parent.isMimeType("multipart/digest")) {
- mimeType = "message/rfc822";
- } else {
- mimeType = "text/plain";
- }
- }
-
- /**
- * Should be called for each <code>Content-</code> header field of
- * a MIME message or part.
- *
- * @param name the field name.
- * @param value the field value.
- */
- public void addField(String name, String value) {
-
- name = name.trim().toLowerCase();
-
- if (name.equals("content-transfer-encoding") && !contentTransferEncSet) {
- contentTransferEncSet = true;
-
- value = value.trim().toLowerCase();
- if (value.length() > 0) {
- transferEncoding = value;
- }
-
- } else if (name.equals("content-type") && !contentTypeSet) {
- contentTypeSet = true;
-
- value = value.trim();
-
- /*
- * Unfold Content-Type value
- */
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < value.length(); i++) {
- char c = value.charAt(i);
- if (c == '\r' || c == '\n') {
- continue;
- }
- sb.append(c);
- }
-
- Map<String, String> params = getHeaderParams(sb.toString());
-
- String main = params.get("");
- if (main != null) {
- main = main.toLowerCase().trim();
- int index = main.indexOf('/');
- boolean valid = false;
- if (index != -1) {
- String type = main.substring(0, index).trim();
- String subtype = main.substring(index + 1).trim();
- if (type.length() > 0 && subtype.length() > 0) {
- main = type + "/" + subtype;
- valid = true;
- }
- }
-
- if (!valid) {
- main = null;
- }
- }
- String b = params.get("boundary");
-
- if (main != null
- && ((main.startsWith("multipart/") && b != null)
- || !main.startsWith("multipart/"))) {
-
- mimeType = main;
- }
-
- if (isMultipart()) {
- boundary = b;
- }
-
- String c = params.get("charset");
- if (c != null) {
- c = c.trim();
- if (c.length() > 0) {
- charset = c.toLowerCase();
- }
- }
-
- /*
- * Add all other parameters to parameters.
- */
- parameters.putAll(params);
- parameters.remove("");
- parameters.remove("boundary");
- parameters.remove("charset");
- }
- }
-
- private Map<String, String> getHeaderParams(String headerValue) {
- Map<String, String> result = new HashMap<String, String>();
-
- // split main value and parameters
- String main;
- String rest;
- if (headerValue.indexOf(";") == -1) {
- main = headerValue;
- rest = null;
- } else {
- main = headerValue.substring(0, headerValue.indexOf(";"));
- rest = headerValue.substring(main.length() + 1);
- }
-
- result.put("", main);
- if (rest != null) {
- char[] chars = rest.toCharArray();
- StringBuffer paramName = new StringBuffer();
- StringBuffer paramValue = new StringBuffer();
-
- final byte READY_FOR_NAME = 0;
- final byte IN_NAME = 1;
- final byte READY_FOR_VALUE = 2;
- final byte IN_VALUE = 3;
- final byte IN_QUOTED_VALUE = 4;
- final byte VALUE_DONE = 5;
- final byte ERROR = 99;
-
- byte state = READY_FOR_NAME;
- boolean escaped = false;
- for (int i = 0; i < chars.length; i++) {
- char c = chars[i];
-
- switch (state) {
- case ERROR:
- if (c == ';')
- state = READY_FOR_NAME;
- break;
-
- case READY_FOR_NAME:
- if (c == '=') {
- log.error("Expected header param name, got '='");
- state = ERROR;
- break;
- }
-
- paramName = new StringBuffer();
- paramValue = new StringBuffer();
-
- state = IN_NAME;
- // $FALL-THROUGH$
-
- case IN_NAME:
- if (c == '=') {
- if (paramName.length() == 0)
- state = ERROR;
- else
- state = READY_FOR_VALUE;
- break;
- }
-
- // not '='... just add to name
- paramName.append(c);
- break;
-
- case READY_FOR_VALUE:
- boolean fallThrough = false;
- switch (c) {
- case ' ':
- case '\t':
- break; // ignore spaces, especially before '"'
-
- case '"':
- state = IN_QUOTED_VALUE;
- break;
-
- default:
- state = IN_VALUE;
- fallThrough = true;
- break;
- }
- if (!fallThrough)
- break;
-
- // $FALL-THROUGH$
-
- case IN_VALUE:
- fallThrough = false;
- switch (c) {
- case ';':
- case ' ':
- case '\t':
- result.put(
- paramName.toString().trim().toLowerCase(),
- paramValue.toString().trim());
- state = VALUE_DONE;
- fallThrough = true;
- break;
- default:
- paramValue.append(c);
- break;
- }
- if (!fallThrough)
- break;
-
- // $FALL-THROUGH$
-
- case VALUE_DONE:
- switch (c) {
- case ';':
- state = READY_FOR_NAME;
- break;
-
- case ' ':
- case '\t':
- break;
-
- default:
- state = ERROR;
- break;
- }
- break;
-
- case IN_QUOTED_VALUE:
- switch (c) {
- case '"':
- if (!escaped) {
- // don't trim quoted strings; the spaces could be intentional.
- result.put(
- paramName.toString().trim().toLowerCase(),
- paramValue.toString());
- state = VALUE_DONE;
- } else {
- escaped = false;
- paramValue.append(c);
- }
- break;
-
- case '\\':
- if (escaped) {
- paramValue.append('\\');
- }
- escaped = !escaped;
- break;
-
- default:
- if (escaped) {
- paramValue.append('\\');
- }
- escaped = false;
- paramValue.append(c);
- break;
- }
- break;
-
- }
- }
-
- // done looping. check if anything is left over.
- if (state == IN_VALUE) {
- result.put(
- paramName.toString().trim().toLowerCase(),
- paramValue.toString().trim());
- }
- }
-
- return result;
- }
-
-
- public boolean isMimeType(String mimeType) {
- return this.mimeType.equals(mimeType.toLowerCase());
- }
-
- /**
- * Return true if the BodyDescriptor belongs to a message
- */
- public boolean isMessage() {
- return mimeType.equals("message/rfc822");
- }
-
- /**
- * Return true if the BodyDescripotro belongs to a multipart
- */
- public boolean isMultipart() {
- return mimeType.startsWith("multipart/");
- }
-
- /**
- * Return the MimeType
- */
- public String getMimeType() {
- return mimeType;
- }
-
- /**
- * Return the boundary
- */
- public String getBoundary() {
- return boundary;
- }
-
- /**
- * Return the charset
- */
- public String getCharset() {
- return charset;
- }
-
- /**
- * Return all parameters for the BodyDescriptor
- */
- public Map<String, String> getParameters() {
- return parameters;
- }
-
- /**
- * Return the TransferEncoding
- */
- public String getTransferEncoding() {
- return transferEncoding;
- }
-
- /**
- * Return true if it's base64 encoded
- */
- public boolean isBase64Encoded() {
- return "base64".equals(transferEncoding);
- }
-
- /**
- * Return true if it's quoted-printable
- */
- public boolean isQuotedPrintableEncoded() {
- return "quoted-printable".equals(transferEncoding);
- }
-
- @Override
- public String toString() {
- return mimeType;
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/CloseShieldInputStream.java b/emailcommon/src/org/apache/james/mime4j/CloseShieldInputStream.java
deleted file mode 100644
index 94995d110..000000000
--- a/emailcommon/src/org/apache/james/mime4j/CloseShieldInputStream.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j;
-
-import java.io.InputStream;
-import java.io.IOException;
-
-/**
- * InputStream that shields its underlying input stream from
- * being closed.
- *
- *
- * @version $Id: CloseShieldInputStream.java,v 1.2 2004/10/02 12:41:10 ntherning Exp $
- */
-public class CloseShieldInputStream extends InputStream {
-
- /**
- * Underlying InputStream
- */
- private InputStream is;
-
- public CloseShieldInputStream(InputStream is) {
- this.is = is;
- }
-
- public InputStream getUnderlyingStream() {
- return is;
- }
-
- /**
- * @see java.io.InputStream#read()
- */
- public int read() throws IOException {
- checkIfClosed();
- return is.read();
- }
-
- /**
- * @see java.io.InputStream#available()
- */
- public int available() throws IOException {
- checkIfClosed();
- return is.available();
- }
-
-
- /**
- * Set the underlying InputStream to null
- */
- public void close() throws IOException {
- is = null;
- }
-
- /**
- * @see java.io.FilterInputStream#reset()
- */
- public synchronized void reset() throws IOException {
- checkIfClosed();
- is.reset();
- }
-
- /**
- * @see java.io.FilterInputStream#markSupported()
- */
- public boolean markSupported() {
- if (is == null)
- return false;
- return is.markSupported();
- }
-
- /**
- * @see java.io.FilterInputStream#mark(int)
- */
- public synchronized void mark(int readlimit) {
- if (is != null)
- is.mark(readlimit);
- }
-
- /**
- * @see java.io.FilterInputStream#skip(long)
- */
- public long skip(long n) throws IOException {
- checkIfClosed();
- return is.skip(n);
- }
-
- /**
- * @see java.io.FilterInputStream#read(byte[])
- */
- public int read(byte b[]) throws IOException {
- checkIfClosed();
- return is.read(b);
- }
-
- /**
- * @see java.io.FilterInputStream#read(byte[], int, int)
- */
- public int read(byte b[], int off, int len) throws IOException {
- checkIfClosed();
- return is.read(b, off, len);
- }
-
- /**
- * Check if the underlying InputStream is null. If so throw an Exception
- *
- * @throws IOException if the underlying InputStream is null
- */
- private void checkIfClosed() throws IOException {
- if (is == null)
- throw new IOException("Stream is closed");
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/ContentHandler.java b/emailcommon/src/org/apache/james/mime4j/ContentHandler.java
deleted file mode 100644
index 946c89401..000000000
--- a/emailcommon/src/org/apache/james/mime4j/ContentHandler.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * <p>
- * Receives notifications of the content of a plain RFC822 or MIME message.
- * Implement this interface and register an instance of that implementation
- * with a <code>MimeStreamParser</code> instance using its
- * {@link org.apache.james.mime4j.MimeStreamParser#setContentHandler(ContentHandler)}
- * method. The parser uses the <code>ContentHandler</code> instance to report
- * basic message-related events like the start and end of the body of a
- * part in a multipart MIME entity.
- * </p>
- * <p>
- * Events will be generated in the order the corresponding elements occur in
- * the message stream parsed by the parser. E.g.:
- * <pre>
- * startMessage()
- * startHeader()
- * field(...)
- * field(...)
- * ...
- * endHeader()
- * startMultipart()
- * preamble(...)
- * startBodyPart()
- * startHeader()
- * field(...)
- * field(...)
- * ...
- * endHeader()
- * body()
- * endBodyPart()
- * startBodyPart()
- * startHeader()
- * field(...)
- * field(...)
- * ...
- * endHeader()
- * body()
- * endBodyPart()
- * epilogue(...)
- * endMultipart()
- * endMessage()
- * </pre>
- * The above shows an example of a MIME message consisting of a multipart
- * body containing two body parts.
- * </p>
- * <p>
- * See MIME RFCs 2045-2049 for more information on the structure of MIME
- * messages and RFC 822 and 2822 for the general structure of Internet mail
- * messages.
- * </p>
- *
- *
- * @version $Id: ContentHandler.java,v 1.3 2004/10/02 12:41:10 ntherning Exp $
- */
-public interface ContentHandler {
- /**
- * Called when a new message starts (a top level message or an embedded
- * rfc822 message).
- */
- void startMessage();
-
- /**
- * Called when a message ends.
- */
- void endMessage();
-
- /**
- * Called when a new body part starts inside a
- * <code>multipart/*</code> entity.
- */
- void startBodyPart();
-
- /**
- * Called when a body part ends.
- */
- void endBodyPart();
-
- /**
- * Called when a header (of a message or body part) is about to be parsed.
- */
- void startHeader();
-
- /**
- * Called for each field of a header.
- *
- * @param fieldData the raw contents of the field
- * (<code>Field-Name: field value</code>). The value will not be
- * unfolded.
- */
- void field(String fieldData);
-
- /**
- * Called when there are no more header fields in a message or body part.
- */
- void endHeader();
-
- /**
- * Called for the preamble (whatever comes before the first body part)
- * of a <code>multipart/*</code> entity.
- *
- * @param is used to get the contents of the preamble.
- * @throws IOException should be thrown on I/O errors.
- */
- void preamble(InputStream is) throws IOException;
-
- /**
- * Called for the epilogue (whatever comes after the final body part)
- * of a <code>multipart/*</code> entity.
- *
- * @param is used to get the contents of the epilogue.
- * @throws IOException should be thrown on I/O errors.
- */
- void epilogue(InputStream is) throws IOException;
-
- /**
- * Called when the body of a multipart entity is about to be parsed.
- *
- * @param bd encapsulates the values (either read from the
- * message stream or, if not present, determined implictly
- * as described in the
- * MIME rfc:s) of the <code>Content-Type</code> and
- * <code>Content-Transfer-Encoding</code> header fields.
- */
- void startMultipart(BodyDescriptor bd);
-
- /**
- * Called when the body of an entity has been parsed.
- */
- void endMultipart();
-
- /**
- * Called when the body of a discrete (non-multipart) entity is about to
- * be parsed.
- *
- * @param bd see {@link #startMultipart(BodyDescriptor)}
- * @param is the contents of the body. NOTE: this is the raw body contents
- * - it will not be decoded if encoded. The <code>bd</code>
- * parameter should be used to determine how the stream data
- * should be decoded.
- * @throws IOException should be thrown on I/O errors.
- */
- void body(BodyDescriptor bd, InputStream is) throws IOException;
-
- /**
- * Called when a new entity (message or body part) starts and the
- * parser is in <code>raw</code> mode.
- *
- * @param is the raw contents of the entity.
- * @throws IOException should be thrown on I/O errors.
- * @see MimeStreamParser#setRaw(boolean)
- */
- void raw(InputStream is) throws IOException;
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/EOLConvertingInputStream.java b/emailcommon/src/org/apache/james/mime4j/EOLConvertingInputStream.java
deleted file mode 100644
index 7d5009ca5..000000000
--- a/emailcommon/src/org/apache/james/mime4j/EOLConvertingInputStream.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PushbackInputStream;
-
-/**
- * InputStream which converts <code>\r</code>
- * bytes not followed by <code>\n</code> and <code>\n</code> not
- * preceded by <code>\r</code> to <code>\r\n</code>.
- *
- *
- * @version $Id: EOLConvertingInputStream.java,v 1.4 2004/11/29 13:15:42 ntherning Exp $
- */
-public class EOLConvertingInputStream extends InputStream {
- /** Converts single '\r' to '\r\n' */
- public static final int CONVERT_CR = 1;
- /** Converts single '\n' to '\r\n' */
- public static final int CONVERT_LF = 2;
- /** Converts single '\r' and '\n' to '\r\n' */
- public static final int CONVERT_BOTH = 3;
-
- private PushbackInputStream in = null;
- private int previous = 0;
- private int flags = CONVERT_BOTH;
-
- /**
- * Creates a new <code>EOLConvertingInputStream</code>
- * instance converting bytes in the given <code>InputStream</code>.
- * The flag <code>CONVERT_BOTH</code> is the default.
- *
- * @param in the <code>InputStream</code> to read from.
- */
- public EOLConvertingInputStream(InputStream in) {
- this(in, CONVERT_BOTH);
- }
- /**
- * Creates a new <code>EOLConvertingInputStream</code>
- * instance converting bytes in the given <code>InputStream</code>.
- *
- * @param in the <code>InputStream</code> to read from.
- * @param flags one of <code>CONVERT_CR</code>, <code>CONVERT_LF</code> or
- * <code>CONVERT_BOTH</code>.
- */
- public EOLConvertingInputStream(InputStream in, int flags) {
- super();
-
- this.in = new PushbackInputStream(in, 2);
- this.flags = flags;
- }
-
- /**
- * Closes the underlying stream.
- *
- * @throws IOException on I/O errors.
- */
- public void close() throws IOException {
- in.close();
- }
-
- /**
- * @see java.io.InputStream#read()
- */
- public int read() throws IOException {
- int b = in.read();
-
- if (b == -1) {
- return -1;
- }
-
- if ((flags & CONVERT_CR) != 0 && b == '\r') {
- int c = in.read();
- if (c != -1) {
- in.unread(c);
- }
- if (c != '\n') {
- in.unread('\n');
- }
- } else if ((flags & CONVERT_LF) != 0 && b == '\n' && previous != '\r') {
- b = '\r';
- in.unread('\n');
- }
-
- previous = b;
-
- return b;
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/Log.java b/emailcommon/src/org/apache/james/mime4j/Log.java
deleted file mode 100644
index e7f33fcc7..000000000
--- a/emailcommon/src/org/apache/james/mime4j/Log.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.james.mime4j;
-
-import com.android.emailcommon.Logging;
-
-/**
- * Empty stub for the apache logging library.
- */
-public class Log {
- public Log(Class mClazz) {
- }
-
- public boolean isDebugEnabled() {
- return false;
- }
-
- public boolean isErrorEnabled() {
- return true;
- }
-
- public boolean isFatalEnabled() {
- return true;
- }
-
- public boolean isInfoEnabled() {
- return false;
- }
-
- public boolean isTraceEnabled() {
- return false;
- }
-
- public boolean isWarnEnabled() {
- return true;
- }
-
- public void trace(Object message) {
- if (!isTraceEnabled()) return;
- android.util.Log.v(Logging.LOG_TAG, toString(message, null));
- }
-
- public void trace(Object message, Throwable t) {
- if (!isTraceEnabled()) return;
- android.util.Log.v(Logging.LOG_TAG, toString(message, t));
- }
-
- public void debug(Object message) {
- if (!isDebugEnabled()) return;
- android.util.Log.d(Logging.LOG_TAG, toString(message, null));
- }
-
- public void debug(Object message, Throwable t) {
- if (!isDebugEnabled()) return;
- android.util.Log.d(Logging.LOG_TAG, toString(message, t));
- }
-
- public void info(Object message) {
- if (!isInfoEnabled()) return;
- android.util.Log.i(Logging.LOG_TAG, toString(message, null));
- }
-
- public void info(Object message, Throwable t) {
- if (!isInfoEnabled()) return;
- android.util.Log.i(Logging.LOG_TAG, toString(message, t));
- }
-
- public void warn(Object message) {
- android.util.Log.w(Logging.LOG_TAG, toString(message, null));
- }
-
- public void warn(Object message, Throwable t) {
- android.util.Log.w(Logging.LOG_TAG, toString(message, t));
- }
-
- public void error(Object message) {
- android.util.Log.e(Logging.LOG_TAG, toString(message, null));
- }
-
- public void error(Object message, Throwable t) {
- android.util.Log.e(Logging.LOG_TAG, toString(message, t));
- }
-
- public void fatal(Object message) {
- android.util.Log.e(Logging.LOG_TAG, toString(message, null));
- }
-
- public void fatal(Object message, Throwable t) {
- android.util.Log.e(Logging.LOG_TAG, toString(message, t));
- }
-
- private static String toString(Object o, Throwable t) {
- String m = (o == null) ? "(null)" : o.toString();
- if (t == null) {
- return m;
- } else {
- return m + " " + t.getMessage();
- }
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/LogFactory.java b/emailcommon/src/org/apache/james/mime4j/LogFactory.java
deleted file mode 100644
index c8f00d1d3..000000000
--- a/emailcommon/src/org/apache/james/mime4j/LogFactory.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.james.mime4j;
-
-/**
- * Empty stub for the apache logging library.
- */
-public final class LogFactory {
- private LogFactory() {
- }
-
- public static Log getLog(Class clazz) {
- return new Log(clazz);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/MimeBoundaryInputStream.java b/emailcommon/src/org/apache/james/mime4j/MimeBoundaryInputStream.java
deleted file mode 100644
index 0fffb7820..000000000
--- a/emailcommon/src/org/apache/james/mime4j/MimeBoundaryInputStream.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PushbackInputStream;
-
-/**
- * Stream that constrains itself to a single MIME body part.
- * After the stream ends (i.e. read() returns -1) {@link #hasMoreParts()}
- * can be used to determine if a final boundary has been seen or not.
- * If {@link #parentEOF()} is <code>true</code> an unexpected end of stream
- * has been detected in the parent stream.
- *
- *
- *
- * @version $Id: MimeBoundaryInputStream.java,v 1.2 2004/11/29 13:15:42 ntherning Exp $
- */
-public class MimeBoundaryInputStream extends InputStream {
-
- private PushbackInputStream s = null;
- private byte[] boundary = null;
- private boolean first = true;
- private boolean eof = false;
- private boolean parenteof = false;
- private boolean moreParts = true;
-
- /**
- * Creates a new MimeBoundaryInputStream.
- * @param s The underlying stream.
- * @param boundary Boundary string (not including leading hyphens).
- */
- public MimeBoundaryInputStream(InputStream s, String boundary)
- throws IOException {
-
- this.s = new PushbackInputStream(s, boundary.length() + 4);
-
- boundary = "--" + boundary;
- this.boundary = new byte[boundary.length()];
- for (int i = 0; i < this.boundary.length; i++) {
- this.boundary[i] = (byte) boundary.charAt(i);
- }
-
- /*
- * By reading one byte we will update moreParts to be as expected
- * before any bytes have been read.
- */
- int b = read();
- if (b != -1) {
- this.s.unread(b);
- }
- }
-
- /**
- * Closes the underlying stream.
- *
- * @throws IOException on I/O errors.
- */
- public void close() throws IOException {
- s.close();
- }
-
- /**
- * Determines if the underlying stream has more parts (this stream has
- * not seen an end boundary).
- *
- * @return <code>true</code> if there are more parts in the underlying
- * stream, <code>false</code> otherwise.
- */
- public boolean hasMoreParts() {
- return moreParts;
- }
-
- /**
- * Determines if the parent stream has reached EOF
- *
- * @return <code>true</code> if EOF has been reached for the parent stream,
- * <code>false</code> otherwise.
- */
- public boolean parentEOF() {
- return parenteof;
- }
-
- /**
- * Consumes all unread bytes of this stream. After a call to this method
- * this stream will have reached EOF.
- *
- * @throws IOException on I/O errors.
- */
- public void consume() throws IOException {
- while (read() != -1) {
- }
- }
-
- /**
- * @see java.io.InputStream#read()
- */
- public int read() throws IOException {
- if (eof) {
- return -1;
- }
-
- if (first) {
- first = false;
- if (matchBoundary()) {
- return -1;
- }
- }
-
- int b1 = s.read();
- int b2 = s.read();
-
- if (b1 == '\r' && b2 == '\n') {
- if (matchBoundary()) {
- return -1;
- }
- }
-
- if (b2 != -1) {
- s.unread(b2);
- }
-
- parenteof = b1 == -1;
- eof = parenteof;
-
- return b1;
- }
-
- private boolean matchBoundary() throws IOException {
-
- for (int i = 0; i < boundary.length; i++) {
- int b = s.read();
- if (b != boundary[i]) {
- if (b != -1) {
- s.unread(b);
- }
- for (int j = i - 1; j >= 0; j--) {
- s.unread(boundary[j]);
- }
- return false;
- }
- }
-
- /*
- * We have a match. Is it an end boundary?
- */
- int prev = s.read();
- int curr = s.read();
- moreParts = !(prev == '-' && curr == '-');
- do {
- if (curr == '\n' && prev == '\r') {
- break;
- }
- prev = curr;
- } while ((curr = s.read()) != -1);
-
- if (curr == -1) {
- moreParts = false;
- parenteof = true;
- }
-
- eof = true;
-
- return true;
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/MimeStreamParser.java b/emailcommon/src/org/apache/james/mime4j/MimeStreamParser.java
deleted file mode 100644
index d2eaa9707..000000000
--- a/emailcommon/src/org/apache/james/mime4j/MimeStreamParser.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j;
-
-import com.android.emailcommon.utility.LoggingInputStream;
-
-import org.apache.james.mime4j.decoder.Base64InputStream;
-import org.apache.james.mime4j.decoder.QuotedPrintableInputStream;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.BitSet;
-import java.util.LinkedList;
-
-/**
- * <p>
- * Parses MIME (or RFC822) message streams of bytes or characters and reports
- * parsing events to a <code>ContentHandler</code> instance.
- * </p>
- * <p>
- * Typical usage:<br/>
- * <pre>
- * ContentHandler handler = new MyHandler();
- * MimeStreamParser parser = new MimeStreamParser();
- * parser.setContentHandler(handler);
- * parser.parse(new BufferedInputStream(new FileInputStream("mime.msg")));
- * </pre>
- * <strong>NOTE:</strong> All lines must end with CRLF
- * (<code>\r\n</code>). If you are unsure of the line endings in your stream
- * you should wrap it in a {@link org.apache.james.mime4j.EOLConvertingInputStream} instance.
- *
- *
- * @version $Id: MimeStreamParser.java,v 1.8 2005/02/11 10:12:02 ntherning Exp $
- */
-public class MimeStreamParser {
- private static final Log log = LogFactory.getLog(MimeStreamParser.class);
-
- private static final boolean DEBUG_LOG_MESSAGE = false; //DO NOT RELEASE AS 'TRUE'
-
- private static BitSet fieldChars = null;
-
- private RootInputStream rootStream = null;
- private LinkedList<BodyDescriptor> bodyDescriptors = new LinkedList<BodyDescriptor>();
- private ContentHandler handler = null;
- private boolean raw = false;
-
- static {
- fieldChars = new BitSet();
- for (int i = 0x21; i <= 0x39; i++) {
- fieldChars.set(i);
- }
- for (int i = 0x3b; i <= 0x7e; i++) {
- fieldChars.set(i);
- }
- }
-
- /**
- * Creates a new <code>MimeStreamParser</code> instance.
- */
- public MimeStreamParser() {
- }
-
- /**
- * Parses a stream of bytes containing a MIME message.
- *
- * @param is the stream to parse.
- * @throws IOException on I/O errors.
- */
- public void parse(InputStream is) throws IOException {
- if (DEBUG_LOG_MESSAGE) {
- is = new LoggingInputStream(is, "MIME", true);
- }
- rootStream = new RootInputStream(is);
- parseMessage(rootStream);
- }
-
- /**
- * Determines if this parser is currently in raw mode.
- *
- * @return <code>true</code> if in raw mode, <code>false</code>
- * otherwise.
- * @see #setRaw(boolean)
- */
- public boolean isRaw() {
- return raw;
- }
-
- /**
- * Enables or disables raw mode. In raw mode all future entities
- * (messages or body parts) in the stream will be reported to the
- * {@link ContentHandler#raw(InputStream)} handler method only.
- * The stream will contain the entire unparsed entity contents
- * including header fields and whatever is in the body.
- *
- * @param raw <code>true</code> enables raw mode, <code>false</code>
- * disables it.
- */
- public void setRaw(boolean raw) {
- this.raw = raw;
- }
-
- /**
- * Finishes the parsing and stops reading lines.
- * NOTE: No more lines will be parsed but the parser
- * will still call
- * {@link ContentHandler#endMultipart()},
- * {@link ContentHandler#endBodyPart()},
- * {@link ContentHandler#endMessage()}, etc to match previous calls
- * to
- * {@link ContentHandler#startMultipart(BodyDescriptor)},
- * {@link ContentHandler#startBodyPart()},
- * {@link ContentHandler#startMessage()}, etc.
- */
- public void stop() {
- rootStream.truncate();
- }
-
- /**
- * Parses an entity which consists of a header followed by a body containing
- * arbitrary data, body parts or an embedded message.
- *
- * @param is the stream to parse.
- * @throws IOException on I/O errors.
- */
- private void parseEntity(InputStream is) throws IOException {
- BodyDescriptor bd = parseHeader(is);
-
- if (bd.isMultipart()) {
- bodyDescriptors.addFirst(bd);
-
- handler.startMultipart(bd);
-
- MimeBoundaryInputStream tempIs =
- new MimeBoundaryInputStream(is, bd.getBoundary());
- handler.preamble(new CloseShieldInputStream(tempIs));
- tempIs.consume();
-
- while (tempIs.hasMoreParts()) {
- tempIs = new MimeBoundaryInputStream(is, bd.getBoundary());
- parseBodyPart(tempIs);
- tempIs.consume();
- if (tempIs.parentEOF()) {
-// if (log.isWarnEnabled()) {
-// log.warn("Line " + rootStream.getLineNumber()
-// + ": Body part ended prematurely. "
-// + "Higher level boundary detected or "
-// + "EOF reached.");
-// }
- break;
- }
- }
-
- handler.epilogue(new CloseShieldInputStream(is));
-
- handler.endMultipart();
-
- bodyDescriptors.removeFirst();
-
- } else if (bd.isMessage()) {
- if (bd.isBase64Encoded()) {
- log.warn("base64 encoded message/rfc822 detected");
- is = new EOLConvertingInputStream(
- new Base64InputStream(is));
- } else if (bd.isQuotedPrintableEncoded()) {
- log.warn("quoted-printable encoded message/rfc822 detected");
- is = new EOLConvertingInputStream(
- new QuotedPrintableInputStream(is));
- }
- bodyDescriptors.addFirst(bd);
- parseMessage(is);
- bodyDescriptors.removeFirst();
- } else {
- handler.body(bd, new CloseShieldInputStream(is));
- }
-
- /*
- * Make sure the stream has been consumed.
- */
- while (is.read() != -1) {
- }
- }
-
- private void parseMessage(InputStream is) throws IOException {
- if (raw) {
- handler.raw(new CloseShieldInputStream(is));
- } else {
- handler.startMessage();
- parseEntity(is);
- handler.endMessage();
- }
- }
-
- private void parseBodyPart(InputStream is) throws IOException {
- if (raw) {
- handler.raw(new CloseShieldInputStream(is));
- } else {
- handler.startBodyPart();
- parseEntity(is);
- handler.endBodyPart();
- }
- }
-
- /**
- * Parses a header.
- *
- * @param is the stream to parse.
- * @return a <code>BodyDescriptor</code> describing the body following
- * the header.
- */
- private BodyDescriptor parseHeader(InputStream is) throws IOException {
- BodyDescriptor bd = new BodyDescriptor(bodyDescriptors.isEmpty()
- ? null : (BodyDescriptor) bodyDescriptors.getFirst());
-
- handler.startHeader();
-
- int lineNumber = rootStream.getLineNumber();
-
- StringBuffer sb = new StringBuffer();
- int curr = 0;
- int prev = 0;
- while ((curr = is.read()) != -1) {
- if (curr == '\n' && (prev == '\n' || prev == 0)) {
- /*
- * [\r]\n[\r]\n or an immediate \r\n have been seen.
- */
- sb.deleteCharAt(sb.length() - 1);
- break;
- }
- sb.append((char) curr);
- prev = curr == '\r' ? prev : curr;
- }
-
-// if (curr == -1 && log.isWarnEnabled()) {
-// log.warn("Line " + rootStream.getLineNumber()
-// + ": Unexpected end of headers detected. "
-// + "Boundary detected in header or EOF reached.");
-// }
-
- int start = 0;
- int pos = 0;
- int startLineNumber = lineNumber;
- while (pos < sb.length()) {
- while (pos < sb.length() && sb.charAt(pos) != '\r') {
- pos++;
- }
- if (pos < sb.length() - 1 && sb.charAt(pos + 1) != '\n') {
- pos++;
- continue;
- }
-
- if (pos >= sb.length() - 2 || fieldChars.get(sb.charAt(pos + 2))) {
-
- /*
- * field should be the complete field data excluding the
- * trailing \r\n.
- */
- String field = sb.substring(start, pos);
- start = pos + 2;
-
- /*
- * Check for a valid field.
- */
- int index = field.indexOf(':');
- boolean valid = false;
- if (index != -1 && fieldChars.get(field.charAt(0))) {
- valid = true;
- String fieldName = field.substring(0, index).trim();
- for (int i = 0; i < fieldName.length(); i++) {
- if (!fieldChars.get(fieldName.charAt(i))) {
- valid = false;
- break;
- }
- }
-
- if (valid) {
- handler.field(field);
- bd.addField(fieldName, field.substring(index + 1));
- }
- }
-
- if (!valid && log.isWarnEnabled()) {
- log.warn("Line " + startLineNumber
- + ": Ignoring invalid field: '" + field.trim() + "'");
- }
-
- startLineNumber = lineNumber;
- }
-
- pos += 2;
- lineNumber++;
- }
-
- handler.endHeader();
-
- return bd;
- }
-
- /**
- * Sets the <code>ContentHandler</code> to use when reporting
- * parsing events.
- *
- * @param h the <code>ContentHandler</code>.
- */
- public void setContentHandler(ContentHandler h) {
- this.handler = h;
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/RootInputStream.java b/emailcommon/src/org/apache/james/mime4j/RootInputStream.java
deleted file mode 100644
index fa848df18..000000000
--- a/emailcommon/src/org/apache/james/mime4j/RootInputStream.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * <code>InputStream</code> used by the parser to wrap the original user
- * supplied stream. This stream keeps track of the current line number and
- * can also be truncated. When truncated the stream will appear to have
- * reached end of file. This is used by the parser's
- * {@link org.apache.james.mime4j.MimeStreamParser#stop()} method.
- *
- *
- * @version $Id: RootInputStream.java,v 1.2 2004/10/02 12:41:10 ntherning Exp $
- */
-class RootInputStream extends InputStream {
- private InputStream is = null;
- private int lineNumber = 1;
- private int prev = -1;
- private boolean truncated = false;
-
- /**
- * Creates a new <code>RootInputStream</code>.
- *
- * @param in the stream to read from.
- */
- public RootInputStream(InputStream is) {
- this.is = is;
- }
-
- /**
- * Gets the current line number starting at 1
- * (the number of <code>\r\n</code> read so far plus 1).
- *
- * @return the current line number.
- */
- public int getLineNumber() {
- return lineNumber;
- }
-
- /**
- * Truncates this <code>InputStream</code>. After this call any
- * call to {@link #read()}, {@link #read(byte[]) or
- * {@link #read(byte[], int, int)} will return
- * -1 as if end-of-file had been reached.
- */
- public void truncate() {
- this.truncated = true;
- }
-
- /**
- * @see java.io.InputStream#read()
- */
- public int read() throws IOException {
- if (truncated) {
- return -1;
- }
-
- int b = is.read();
- if (prev == '\r' && b == '\n') {
- lineNumber++;
- }
- prev = b;
- return b;
- }
-
- /**
- *
- * @see java.io.InputStream#read(byte[], int, int)
- */
- public int read(byte[] b, int off, int len) throws IOException {
- if (truncated) {
- return -1;
- }
-
- int n = is.read(b, off, len);
- for (int i = off; i < off + n; i++) {
- if (prev == '\r' && b[i] == '\n') {
- lineNumber++;
- }
- prev = b[i];
- }
- return n;
- }
-
- /**
- * @see java.io.InputStream#read(byte[])
- */
- public int read(byte[] b) throws IOException {
- return read(b, 0, b.length);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/SimpleContentHandler.java b/emailcommon/src/org/apache/james/mime4j/SimpleContentHandler.java
deleted file mode 100644
index 13f1fd2c6..000000000
--- a/emailcommon/src/org/apache/james/mime4j/SimpleContentHandler.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j;
-
-import org.apache.james.mime4j.decoder.Base64InputStream;
-import org.apache.james.mime4j.decoder.QuotedPrintableInputStream;
-import org.apache.james.mime4j.field.Field;
-import org.apache.james.mime4j.message.Header;
-
-import java.io.InputStream;
-import java.io.IOException;
-
-/**
- * Abstract implementation of ContentHandler that automates common
- * tasks. Currently performs header parsing and applies content-transfer
- * decoding to body parts.
- *
- *
- */
-public abstract class SimpleContentHandler extends AbstractContentHandler {
-
- /**
- * Called after headers are parsed.
- */
- public abstract void headers(Header header);
-
- /**
- * Called when the body of a discrete (non-multipart) entity is encountered.
-
- * @param bd encapsulates the values (either read from the
- * message stream or, if not present, determined implictly
- * as described in the
- * MIME rfc:s) of the <code>Content-Type</code> and
- * <code>Content-Transfer-Encoding</code> header fields.
- * @param is the contents of the body. Base64 or quoted-printable
- * decoding will be applied transparently.
- * @throws IOException should be thrown on I/O errors.
- */
- public abstract void bodyDecoded(BodyDescriptor bd, InputStream is) throws IOException;
-
-
- /* Implement introduced callbacks. */
-
- private Header currHeader;
-
- /**
- * @see org.apache.james.mime4j.AbstractContentHandler#startHeader()
- */
- public final void startHeader() {
- currHeader = new Header();
- }
-
- /**
- * @see org.apache.james.mime4j.AbstractContentHandler#field(java.lang.String)
- */
- public final void field(String fieldData) {
- currHeader.addField(Field.parse(fieldData));
- }
-
- /**
- * @see org.apache.james.mime4j.AbstractContentHandler#endHeader()
- */
- public final void endHeader() {
- Header tmp = currHeader;
- currHeader = null;
- headers(tmp);
- }
-
- /**
- * @see org.apache.james.mime4j.AbstractContentHandler#body(org.apache.james.mime4j.BodyDescriptor, java.io.InputStream)
- */
- public final void body(BodyDescriptor bd, InputStream is) throws IOException {
- if (bd.isBase64Encoded()) {
- bodyDecoded(bd, new Base64InputStream(is));
- }
- else if (bd.isQuotedPrintableEncoded()) {
- bodyDecoded(bd, new QuotedPrintableInputStream(is));
- }
- else {
- bodyDecoded(bd, is);
- }
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/ThirdPartyProject.prop b/emailcommon/src/org/apache/james/mime4j/ThirdPartyProject.prop
deleted file mode 100644
index 525791c21..000000000
--- a/emailcommon/src/org/apache/james/mime4j/ThirdPartyProject.prop
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright 2010 Google Inc. All Rights Reserved.
-#Fri Jul 16 10:03:08 PDT 2010
-currentVersion=0.6
-version=Unknown / modified locally
-isNative=false
-feedurl=https\://issues.apache.org/jira/secure/ReleaseNote.jspa
-name=apache_mime4j
-keywords=apache mime4j
-onDevice=true
-homepage=http\://james.apache.org/index.html
diff --git a/emailcommon/src/org/apache/james/mime4j/codec/EncoderUtil.java b/emailcommon/src/org/apache/james/mime4j/codec/EncoderUtil.java
deleted file mode 100644
index 6841bc998..000000000
--- a/emailcommon/src/org/apache/james/mime4j/codec/EncoderUtil.java
+++ /dev/null
@@ -1,630 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.codec;
-
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.util.BitSet;
-import java.util.Locale;
-
-import org.apache.james.mime4j.util.CharsetUtil;
-
-/**
- * ANDROID: THIS CLASS IS COPIED FROM A NEWER VERSION OF MIME4J
- */
-
-/**
- * Static methods for encoding header field values. This includes encoded-words
- * as defined in <a href='http://www.faqs.org/rfcs/rfc2047.html'>RFC 2047</a>
- * or display-names of an e-mail address, for example.
- *
- */
-public class EncoderUtil {
-
- // This array is a lookup table that translates 6-bit positive integer index
- // values into their "Base64 Alphabet" equivalents as specified in Table 1
- // of RFC 2045.
- // ANDROID: THIS TABLE IS COPIED FROM BASE64OUTPUTSTREAM
- static final byte[] BASE64_TABLE = { 'A', 'B', 'C', 'D', 'E', 'F',
- 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
- 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
- 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
- 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5',
- '6', '7', '8', '9', '+', '/' };
-
- // Byte used to pad output.
- private static final byte BASE64_PAD = '=';
-
- private static final BitSet Q_REGULAR_CHARS = initChars("=_?");
-
- private static final BitSet Q_RESTRICTED_CHARS = initChars("=_?\"#$%&'(),.:;<>@[\\]^`{|}~");
-
- private static final int MAX_USED_CHARACTERS = 50;
-
- private static final String ENC_WORD_PREFIX = "=?";
- private static final String ENC_WORD_SUFFIX = "?=";
-
- private static final int ENCODED_WORD_MAX_LENGTH = 75; // RFC 2047
-
- private static final BitSet TOKEN_CHARS = initChars("()<>@,;:\\\"/[]?=");
-
- private static final BitSet ATEXT_CHARS = initChars("()<>@.,;:\\\"[]");
-
- private static BitSet initChars(String specials) {
- BitSet bs = new BitSet(128);
- for (char ch = 33; ch < 127; ch++) {
- if (specials.indexOf(ch) == -1) {
- bs.set(ch);
- }
- }
- return bs;
- }
-
- /**
- * Selects one of the two encodings specified in RFC 2047.
- */
- public enum Encoding {
- /** The B encoding (identical to base64 defined in RFC 2045). */
- B,
- /** The Q encoding (similar to quoted-printable defined in RFC 2045). */
- Q
- }
-
- /**
- * Indicates the intended usage of an encoded word.
- */
- public enum Usage {
- /**
- * Encoded word is used to replace a 'text' token in any Subject or
- * Comments header field.
- */
- TEXT_TOKEN,
- /**
- * Encoded word is used to replace a 'word' entity within a 'phrase',
- * for example, one that precedes an address in a From, To, or Cc
- * header.
- */
- WORD_ENTITY
- }
-
- private EncoderUtil() {
- }
-
- /**
- * Encodes the display-name portion of an address. See <a
- * href='http://www.faqs.org/rfcs/rfc5322.html'>RFC 5322</a> section 3.4
- * and <a href='http://www.faqs.org/rfcs/rfc2047.html'>RFC 2047</a> section
- * 5.3. The specified string should not be folded.
- *
- * @param displayName
- * display-name to encode.
- * @return encoded display-name.
- */
- public static String encodeAddressDisplayName(String displayName) {
- // display-name = phrase
- // phrase = 1*( encoded-word / word )
- // word = atom / quoted-string
- // atom = [CFWS] 1*atext [CFWS]
- // CFWS = comment or folding white space
-
- if (isAtomPhrase(displayName)) {
- return displayName;
- } else if (hasToBeEncoded(displayName, 0)) {
- return encodeEncodedWord(displayName, Usage.WORD_ENTITY);
- } else {
- return quote(displayName);
- }
- }
-
- /**
- * Encodes the local part of an address specification as described in RFC
- * 5322 section 3.4.1. Leading and trailing CFWS should have been removed
- * before calling this method. The specified string should not contain any
- * illegal (control or non-ASCII) characters.
- *
- * @param localPart
- * the local part to encode
- * @return the encoded local part.
- */
- public static String encodeAddressLocalPart(String localPart) {
- // local-part = dot-atom / quoted-string
- // dot-atom = [CFWS] dot-atom-text [CFWS]
- // CFWS = comment or folding white space
-
- if (isDotAtomText(localPart)) {
- return localPart;
- } else {
- return quote(localPart);
- }
- }
-
- /**
- * Encodes the specified strings into a header parameter as described in RFC
- * 2045 section 5.1 and RFC 2183 section 2. The specified strings should not
- * contain any illegal (control or non-ASCII) characters.
- *
- * @param name
- * parameter name.
- * @param value
- * parameter value.
- * @return encoded result.
- */
- public static String encodeHeaderParameter(String name, String value) {
- name = name.toLowerCase(Locale.US);
-
- // value := token / quoted-string
- if (isToken(value)) {
- return name + "=" + value;
- } else {
- return name + "=" + quote(value);
- }
- }
-
- /**
- * Shortcut method that encodes the specified text into an encoded-word if
- * the text has to be encoded.
- *
- * @param text
- * text to encode.
- * @param usage
- * whether the encoded-word is to be used to replace a text token
- * or a word entity (see RFC 822).
- * @param usedCharacters
- * number of characters already used up (<code>0 <= usedCharacters <= 50</code>).
- * @return the specified text if encoding is not necessary or an encoded
- * word or a sequence of encoded words otherwise.
- */
- public static String encodeIfNecessary(String text, Usage usage,
- int usedCharacters) {
- if (hasToBeEncoded(text, usedCharacters))
- return encodeEncodedWord(text, usage, usedCharacters);
- else
- return text;
- }
-
- /**
- * Determines if the specified string has to encoded into an encoded-word.
- * Returns <code>true</code> if the text contains characters that don't
- * fall into the printable ASCII character set or if the text contains a
- * 'word' (sequence of non-whitespace characters) longer than 77 characters
- * (including characters already used up in the line).
- *
- * @param text
- * text to analyze.
- * @param usedCharacters
- * number of characters already used up (<code>0 <= usedCharacters <= 50</code>).
- * @return <code>true</code> if the specified text has to be encoded into
- * an encoded-word, <code>false</code> otherwise.
- */
- public static boolean hasToBeEncoded(String text, int usedCharacters) {
- if (text == null)
- throw new IllegalArgumentException();
- if (usedCharacters < 0 || usedCharacters > MAX_USED_CHARACTERS)
- throw new IllegalArgumentException();
-
- int nonWhiteSpaceCount = usedCharacters;
-
- for (int idx = 0; idx < text.length(); idx++) {
- char ch = text.charAt(idx);
- if (ch == '\t' || ch == ' ') {
- nonWhiteSpaceCount = 0;
- } else {
- nonWhiteSpaceCount++;
- if (nonWhiteSpaceCount > 77) {
- // Line cannot be folded into multiple lines with no more
- // than 78 characters each. Encoding as encoded-words makes
- // that possible. One character has to be reserved for
- // folding white space; that leaves 77 characters.
- return true;
- }
-
- if (ch < 32 || ch >= 127) {
- // non-printable ascii character has to be encoded
- return true;
- }
- }
- }
-
- return false;
- }
-
- /**
- * Encodes the specified text into an encoded word or a sequence of encoded
- * words separated by space. The text is separated into a sequence of
- * encoded words if it does not fit in a single one.
- * <p>
- * The charset to encode the specified text into a byte array and the
- * encoding to use for the encoded-word are detected automatically.
- * <p>
- * This method assumes that zero characters have already been used up in the
- * current line.
- *
- * @param text
- * text to encode.
- * @param usage
- * whether the encoded-word is to be used to replace a text token
- * or a word entity (see RFC 822).
- * @return the encoded word (or sequence of encoded words if the given text
- * does not fit in a single encoded word).
- * @see #hasToBeEncoded(String, int)
- */
- public static String encodeEncodedWord(String text, Usage usage) {
- return encodeEncodedWord(text, usage, 0, null, null);
- }
-
- /**
- * Encodes the specified text into an encoded word or a sequence of encoded
- * words separated by space. The text is separated into a sequence of
- * encoded words if it does not fit in a single one.
- * <p>
- * The charset to encode the specified text into a byte array and the
- * encoding to use for the encoded-word are detected automatically.
- *
- * @param text
- * text to encode.
- * @param usage
- * whether the encoded-word is to be used to replace a text token
- * or a word entity (see RFC 822).
- * @param usedCharacters
- * number of characters already used up (<code>0 <= usedCharacters <= 50</code>).
- * @return the encoded word (or sequence of encoded words if the given text
- * does not fit in a single encoded word).
- * @see #hasToBeEncoded(String, int)
- */
- public static String encodeEncodedWord(String text, Usage usage,
- int usedCharacters) {
- return encodeEncodedWord(text, usage, usedCharacters, null, null);
- }
-
- /**
- * Encodes the specified text into an encoded word or a sequence of encoded
- * words separated by space. The text is separated into a sequence of
- * encoded words if it does not fit in a single one.
- *
- * @param text
- * text to encode.
- * @param usage
- * whether the encoded-word is to be used to replace a text token
- * or a word entity (see RFC 822).
- * @param usedCharacters
- * number of characters already used up (<code>0 <= usedCharacters <= 50</code>).
- * @param charset
- * the Java charset that should be used to encode the specified
- * string into a byte array. A suitable charset is detected
- * automatically if this parameter is <code>null</code>.
- * @param encoding
- * the encoding to use for the encoded-word (either B or Q). A
- * suitable encoding is automatically chosen if this parameter is
- * <code>null</code>.
- * @return the encoded word (or sequence of encoded words if the given text
- * does not fit in a single encoded word).
- * @see #hasToBeEncoded(String, int)
- */
- public static String encodeEncodedWord(String text, Usage usage,
- int usedCharacters, Charset charset, Encoding encoding) {
- if (text == null)
- throw new IllegalArgumentException();
- if (usedCharacters < 0 || usedCharacters > MAX_USED_CHARACTERS)
- throw new IllegalArgumentException();
-
- if (charset == null)
- charset = determineCharset(text);
-
- String mimeCharset = CharsetUtil.toMimeCharset(charset.name());
- if (mimeCharset == null) {
- // cannot happen if charset was originally null
- throw new IllegalArgumentException("Unsupported charset");
- }
-
- byte[] bytes = encode(text, charset);
-
- if (encoding == null)
- encoding = determineEncoding(bytes, usage);
-
- if (encoding == Encoding.B) {
- String prefix = ENC_WORD_PREFIX + mimeCharset + "?B?";
- return encodeB(prefix, text, usedCharacters, charset, bytes);
- } else {
- String prefix = ENC_WORD_PREFIX + mimeCharset + "?Q?";
- return encodeQ(prefix, text, usage, usedCharacters, charset, bytes);
- }
- }
-
- /**
- * Encodes the specified byte array using the B encoding defined in RFC
- * 2047.
- *
- * @param bytes
- * byte array to encode.
- * @return encoded string.
- */
- public static String encodeB(byte[] bytes) {
- StringBuilder sb = new StringBuilder();
-
- int idx = 0;
- final int end = bytes.length;
- for (; idx < end - 2; idx += 3) {
- int data = (bytes[idx] & 0xff) << 16 | (bytes[idx + 1] & 0xff) << 8
- | bytes[idx + 2] & 0xff;
- sb.append((char) BASE64_TABLE[data >> 18 & 0x3f]);
- sb.append((char) BASE64_TABLE[data >> 12 & 0x3f]);
- sb.append((char) BASE64_TABLE[data >> 6 & 0x3f]);
- sb.append((char) BASE64_TABLE[data & 0x3f]);
- }
-
- if (idx == end - 2) {
- int data = (bytes[idx] & 0xff) << 16 | (bytes[idx + 1] & 0xff) << 8;
- sb.append((char) BASE64_TABLE[data >> 18 & 0x3f]);
- sb.append((char) BASE64_TABLE[data >> 12 & 0x3f]);
- sb.append((char) BASE64_TABLE[data >> 6 & 0x3f]);
- sb.append((char) BASE64_PAD);
-
- } else if (idx == end - 1) {
- int data = (bytes[idx] & 0xff) << 16;
- sb.append((char) BASE64_TABLE[data >> 18 & 0x3f]);
- sb.append((char) BASE64_TABLE[data >> 12 & 0x3f]);
- sb.append((char) BASE64_PAD);
- sb.append((char) BASE64_PAD);
- }
-
- return sb.toString();
- }
-
- /**
- * Encodes the specified byte array using the Q encoding defined in RFC
- * 2047.
- *
- * @param bytes
- * byte array to encode.
- * @param usage
- * whether the encoded-word is to be used to replace a text token
- * or a word entity (see RFC 822).
- * @return encoded string.
- */
- public static String encodeQ(byte[] bytes, Usage usage) {
- BitSet qChars = usage == Usage.TEXT_TOKEN ? Q_REGULAR_CHARS
- : Q_RESTRICTED_CHARS;
-
- StringBuilder sb = new StringBuilder();
-
- final int end = bytes.length;
- for (int idx = 0; idx < end; idx++) {
- int v = bytes[idx] & 0xff;
- if (v == 32) {
- sb.append('_');
- } else if (!qChars.get(v)) {
- sb.append('=');
- sb.append(hexDigit(v >>> 4));
- sb.append(hexDigit(v & 0xf));
- } else {
- sb.append((char) v);
- }
- }
-
- return sb.toString();
- }
-
- /**
- * Tests whether the specified string is a token as defined in RFC 2045
- * section 5.1.
- *
- * @param str
- * string to test.
- * @return <code>true</code> if the specified string is a RFC 2045 token,
- * <code>false</code> otherwise.
- */
- public static boolean isToken(String str) {
- // token := 1*<any (US-ASCII) CHAR except SPACE, CTLs, or tspecials>
- // tspecials := "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\" /
- // <"> / "/" / "[" / "]" / "?" / "="
- // CTL := 0.- 31., 127.
-
- final int length = str.length();
- if (length == 0)
- return false;
-
- for (int idx = 0; idx < length; idx++) {
- char ch = str.charAt(idx);
- if (!TOKEN_CHARS.get(ch))
- return false;
- }
-
- return true;
- }
-
- private static boolean isAtomPhrase(String str) {
- // atom = [CFWS] 1*atext [CFWS]
-
- boolean containsAText = false;
-
- final int length = str.length();
- for (int idx = 0; idx < length; idx++) {
- char ch = str.charAt(idx);
- if (ATEXT_CHARS.get(ch)) {
- containsAText = true;
- } else if (!CharsetUtil.isWhitespace(ch)) {
- return false;
- }
- }
-
- return containsAText;
- }
-
- // RFC 5322 section 3.2.3
- private static boolean isDotAtomText(String str) {
- // dot-atom-text = 1*atext *("." 1*atext)
- // atext = ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'" / "*" /
- // "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~"
-
- char prev = '.';
-
- final int length = str.length();
- if (length == 0)
- return false;
-
- for (int idx = 0; idx < length; idx++) {
- char ch = str.charAt(idx);
-
- if (ch == '.') {
- if (prev == '.' || idx == length - 1)
- return false;
- } else {
- if (!ATEXT_CHARS.get(ch))
- return false;
- }
-
- prev = ch;
- }
-
- return true;
- }
-
- // RFC 5322 section 3.2.4
- private static String quote(String str) {
- // quoted-string = [CFWS] DQUOTE *([FWS] qcontent) [FWS] DQUOTE [CFWS]
- // qcontent = qtext / quoted-pair
- // qtext = %d33 / %d35-91 / %d93-126
- // quoted-pair = ("\" (VCHAR / WSP))
- // VCHAR = %x21-7E
- // DQUOTE = %x22
-
- String escaped = str.replaceAll("[\\\\\"]", "\\\\$0");
- return "\"" + escaped + "\"";
- }
-
- private static String encodeB(String prefix, String text,
- int usedCharacters, Charset charset, byte[] bytes) {
- int encodedLength = bEncodedLength(bytes);
-
- int totalLength = prefix.length() + encodedLength
- + ENC_WORD_SUFFIX.length();
- if (totalLength <= ENCODED_WORD_MAX_LENGTH - usedCharacters) {
- return prefix + encodeB(bytes) + ENC_WORD_SUFFIX;
- } else {
- int splitOffset = text.offsetByCodePoints(text.length() / 2, -1);
-
- String part1 = text.substring(0, splitOffset);
- byte[] bytes1 = encode(part1, charset);
- String word1 = encodeB(prefix, part1, usedCharacters, charset,
- bytes1);
-
- String part2 = text.substring(splitOffset);
- byte[] bytes2 = encode(part2, charset);
- String word2 = encodeB(prefix, part2, 0, charset, bytes2);
-
- return word1 + " " + word2;
- }
- }
-
- private static int bEncodedLength(byte[] bytes) {
- return (bytes.length + 2) / 3 * 4;
- }
-
- private static String encodeQ(String prefix, String text, Usage usage,
- int usedCharacters, Charset charset, byte[] bytes) {
- int encodedLength = qEncodedLength(bytes, usage);
-
- int totalLength = prefix.length() + encodedLength
- + ENC_WORD_SUFFIX.length();
- if (totalLength <= ENCODED_WORD_MAX_LENGTH - usedCharacters) {
- return prefix + encodeQ(bytes, usage) + ENC_WORD_SUFFIX;
- } else {
- int splitOffset = text.offsetByCodePoints(text.length() / 2, -1);
-
- String part1 = text.substring(0, splitOffset);
- byte[] bytes1 = encode(part1, charset);
- String word1 = encodeQ(prefix, part1, usage, usedCharacters,
- charset, bytes1);
-
- String part2 = text.substring(splitOffset);
- byte[] bytes2 = encode(part2, charset);
- String word2 = encodeQ(prefix, part2, usage, 0, charset, bytes2);
-
- return word1 + " " + word2;
- }
- }
-
- private static int qEncodedLength(byte[] bytes, Usage usage) {
- BitSet qChars = usage == Usage.TEXT_TOKEN ? Q_REGULAR_CHARS
- : Q_RESTRICTED_CHARS;
-
- int count = 0;
-
- for (int idx = 0; idx < bytes.length; idx++) {
- int v = bytes[idx] & 0xff;
- if (v == 32) {
- count++;
- } else if (!qChars.get(v)) {
- count += 3;
- } else {
- count++;
- }
- }
-
- return count;
- }
-
- private static byte[] encode(String text, Charset charset) {
- ByteBuffer buffer = charset.encode(text);
- byte[] bytes = new byte[buffer.limit()];
- buffer.get(bytes);
- return bytes;
- }
-
- private static Charset determineCharset(String text) {
- // it is an important property of iso-8859-1 that it directly maps
- // unicode code points 0000 to 00ff to byte values 00 to ff.
- boolean ascii = true;
- final int len = text.length();
- for (int index = 0; index < len; index++) {
- char ch = text.charAt(index);
- if (ch > 0xff) {
- return CharsetUtil.UTF_8;
- }
- if (ch > 0x7f) {
- ascii = false;
- }
- }
- return ascii ? CharsetUtil.US_ASCII : CharsetUtil.ISO_8859_1;
- }
-
- private static Encoding determineEncoding(byte[] bytes, Usage usage) {
- if (bytes.length == 0)
- return Encoding.Q;
-
- BitSet qChars = usage == Usage.TEXT_TOKEN ? Q_REGULAR_CHARS
- : Q_RESTRICTED_CHARS;
-
- int qEncoded = 0;
- for (int i = 0; i < bytes.length; i++) {
- int v = bytes[i] & 0xff;
- if (v != 32 && !qChars.get(v)) {
- qEncoded++;
- }
- }
-
- int percentage = qEncoded * 100 / bytes.length;
- return percentage > 30 ? Encoding.B : Encoding.Q;
- }
-
- private static char hexDigit(int i) {
- return i < 10 ? (char) (i + '0') : (char) (i - 10 + 'A');
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/decoder/Base64InputStream.java b/emailcommon/src/org/apache/james/mime4j/decoder/Base64InputStream.java
deleted file mode 100644
index 2461ed571..000000000
--- a/emailcommon/src/org/apache/james/mime4j/decoder/Base64InputStream.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-/**
- * Modified to improve efficiency by Android 21-Aug-2009
- */
-
-package org.apache.james.mime4j.decoder;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Performs Base-64 decoding on an underlying stream.
- *
- *
- * @version $Id: Base64InputStream.java,v 1.3 2004/11/29 13:15:47 ntherning Exp $
- */
-public class Base64InputStream extends InputStream {
- private final InputStream s;
- private int outCount = 0;
- private int outIndex = 0;
- private final int[] outputBuffer = new int[3];
- private final byte[] inputBuffer = new byte[4];
- private boolean done = false;
-
- public Base64InputStream(InputStream s) {
- this.s = s;
- }
-
- /**
- * Closes the underlying stream.
- *
- * @throws IOException on I/O errors.
- */
- @Override
- public void close() throws IOException {
- s.close();
- }
-
- @Override
- public int read() throws IOException {
- if (outIndex == outCount) {
- fillBuffer();
- if (outIndex == outCount) {
- return -1;
- }
- }
-
- return outputBuffer[outIndex++];
- }
-
- /**
- * Retrieve data from the underlying stream, decode it,
- * and put the results in the byteq.
- * @throws IOException
- */
- private void fillBuffer() throws IOException {
- outCount = 0;
- outIndex = 0;
- int inCount = 0;
-
- int i;
- // "done" is needed for the two successive '=' at the end
- while (!done) {
- switch (i = s.read()) {
- case -1:
- // No more input - just return, let outputBuffer drain out, and be done
- return;
- case '=':
- // once we meet the first '=', avoid reading the second '='
- done = true;
- decodeAndEnqueue(inCount);
- return;
- default:
- byte sX = TRANSLATION[i];
- if (sX < 0) continue;
- inputBuffer[inCount++] = sX;
- if (inCount == 4) {
- decodeAndEnqueue(inCount);
- return;
- }
- break;
- }
- }
- }
-
- private void decodeAndEnqueue(int len) {
- int accum = 0;
- accum |= inputBuffer[0] << 18;
- accum |= inputBuffer[1] << 12;
- accum |= inputBuffer[2] << 6;
- accum |= inputBuffer[3];
-
- // There's a bit of duplicated code here because we want to have straight-through operation
- // for the most common case of len==4
- if (len == 4) {
- outputBuffer[0] = (accum >> 16) & 0xFF;
- outputBuffer[1] = (accum >> 8) & 0xFF;
- outputBuffer[2] = (accum) & 0xFF;
- outCount = 3;
- return;
- } else if (len == 3) {
- outputBuffer[0] = (accum >> 16) & 0xFF;
- outputBuffer[1] = (accum >> 8) & 0xFF;
- outCount = 2;
- return;
- } else { // len == 2
- outputBuffer[0] = (accum >> 16) & 0xFF;
- outCount = 1;
- return;
- }
- }
-
- private static byte[] TRANSLATION = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x00 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, /* 0x20 */
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, /* 0x30 */
- -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 0x40 */
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, /* 0x50 */
- -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, /* 0x60 */
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, /* 0x70 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xA0 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xB0 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xC0 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xD0 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xE0 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 0xF0 */
- };
-
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/decoder/ByteQueue.java b/emailcommon/src/org/apache/james/mime4j/decoder/ByteQueue.java
deleted file mode 100644
index 68e7d3380..000000000
--- a/emailcommon/src/org/apache/james/mime4j/decoder/ByteQueue.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.decoder;
-
-import java.util.Iterator;
-
-public class ByteQueue {
-
- private UnboundedFifoByteBuffer buf;
- private int initialCapacity = -1;
-
- public ByteQueue() {
- buf = new UnboundedFifoByteBuffer();
- }
-
- public ByteQueue(int initialCapacity) {
- buf = new UnboundedFifoByteBuffer(initialCapacity);
- this.initialCapacity = initialCapacity;
- }
-
- public void enqueue(byte b) {
- buf.add(b);
- }
-
- public byte dequeue() {
- return buf.remove();
- }
-
- public int count() {
- return buf.size();
- }
-
- public void clear() {
- if (initialCapacity != -1)
- buf = new UnboundedFifoByteBuffer(initialCapacity);
- else
- buf = new UnboundedFifoByteBuffer();
- }
-
- public Iterator iterator() {
- return buf.iterator();
- }
-
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/decoder/DecoderUtil.java b/emailcommon/src/org/apache/james/mime4j/decoder/DecoderUtil.java
deleted file mode 100644
index 551be0f57..000000000
--- a/emailcommon/src/org/apache/james/mime4j/decoder/DecoderUtil.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.decoder;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.util.CharsetUtil;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-
-/**
- * Static methods for decoding strings, byte arrays and encoded words.
- *
- *
- * @version $Id: DecoderUtil.java,v 1.3 2005/02/07 15:33:59 ntherning Exp $
- */
-public class DecoderUtil {
- private static Log log = LogFactory.getLog(DecoderUtil.class);
-
- /**
- * Decodes a string containing quoted-printable encoded data.
- *
- * @param s the string to decode.
- * @return the decoded bytes.
- */
- public static byte[] decodeBaseQuotedPrintable(String s) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- try {
- byte[] bytes = s.getBytes("US-ASCII");
-
- QuotedPrintableInputStream is = new QuotedPrintableInputStream(
- new ByteArrayInputStream(bytes));
-
- int b = 0;
- while ((b = is.read()) != -1) {
- baos.write(b);
- }
- } catch (IOException e) {
- /*
- * This should never happen!
- */
- log.error(e);
- }
-
- return baos.toByteArray();
- }
-
- /**
- * Decodes a string containing base64 encoded data.
- *
- * @param s the string to decode.
- * @return the decoded bytes.
- */
- public static byte[] decodeBase64(String s) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- try {
- byte[] bytes = s.getBytes("US-ASCII");
-
- Base64InputStream is = new Base64InputStream(
- new ByteArrayInputStream(bytes));
-
- int b = 0;
- while ((b = is.read()) != -1) {
- baos.write(b);
- }
- } catch (IOException e) {
- /*
- * This should never happen!
- */
- log.error(e);
- }
-
- return baos.toByteArray();
- }
-
- /**
- * Decodes an encoded word encoded with the 'B' encoding (described in
- * RFC 2047) found in a header field body.
- *
- * @param encodedWord the encoded word to decode.
- * @param charset the Java charset to use.
- * @return the decoded string.
- * @throws UnsupportedEncodingException if the given Java charset isn't
- * supported.
- */
- public static String decodeB(String encodedWord, String charset)
- throws UnsupportedEncodingException {
-
- return new String(decodeBase64(encodedWord), charset);
- }
-
- /**
- * Decodes an encoded word encoded with the 'Q' encoding (described in
- * RFC 2047) found in a header field body.
- *
- * @param encodedWord the encoded word to decode.
- * @param charset the Java charset to use.
- * @return the decoded string.
- * @throws UnsupportedEncodingException if the given Java charset isn't
- * supported.
- */
- public static String decodeQ(String encodedWord, String charset)
- throws UnsupportedEncodingException {
-
- /*
- * Replace _ with =20
- */
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < encodedWord.length(); i++) {
- char c = encodedWord.charAt(i);
- if (c == '_') {
- sb.append("=20");
- } else {
- sb.append(c);
- }
- }
-
- return new String(decodeBaseQuotedPrintable(sb.toString()), charset);
- }
-
- /**
- * Decodes a string containing encoded words as defined by RFC 2047.
- * Encoded words in have the form
- * =?charset?enc?Encoded word?= where enc is either 'Q' or 'q' for
- * quoted-printable and 'B' or 'b' for Base64.
- *
- * ANDROID: COPIED FROM A NEWER VERSION OF MIME4J
- *
- * @param body the string to decode.
- * @return the decoded string.
- */
- public static String decodeEncodedWords(String body) {
-
- // ANDROID: Most strings will not include "=?" so a quick test can prevent unneeded
- // object creation. This could also be handled via lazy creation of the StringBuilder.
- if (body.indexOf("=?") == -1) {
- return body;
- }
-
- int previousEnd = 0;
- boolean previousWasEncoded = false;
-
- StringBuilder sb = new StringBuilder();
-
- while (true) {
- int begin = body.indexOf("=?", previousEnd);
-
- // ANDROID: The mime4j original version has an error here. It gets confused if
- // the encoded string begins with an '=' (just after "?Q?"). This patch seeks forward
- // to find the two '?' in the "header", before looking for the final "?=".
- int endScan = begin + 2;
- if (begin != -1) {
- int qm1 = body.indexOf('?', endScan + 2);
- int qm2 = body.indexOf('?', qm1 + 1);
- if (qm2 != -1) {
- endScan = qm2 + 1;
- }
- }
-
- int end = begin == -1 ? -1 : body.indexOf("?=", endScan);
- if (end == -1) {
- if (previousEnd == 0)
- return body;
-
- sb.append(body.substring(previousEnd));
- return sb.toString();
- }
- end += 2;
-
- String sep = body.substring(previousEnd, begin);
-
- String decoded = decodeEncodedWord(body, begin, end);
- if (decoded == null) {
- sb.append(sep);
- sb.append(body.substring(begin, end));
- } else {
- if (!previousWasEncoded || !CharsetUtil.isWhitespace(sep)) {
- sb.append(sep);
- }
- sb.append(decoded);
- }
-
- previousEnd = end;
- previousWasEncoded = decoded != null;
- }
- }
-
- // return null on error
- private static String decodeEncodedWord(String body, int begin, int end) {
- int qm1 = body.indexOf('?', begin + 2);
- if (qm1 == end - 2)
- return null;
-
- int qm2 = body.indexOf('?', qm1 + 1);
- if (qm2 == end - 2)
- return null;
-
- String mimeCharset = body.substring(begin + 2, qm1);
- String encoding = body.substring(qm1 + 1, qm2);
- String encodedText = body.substring(qm2 + 1, end - 2);
-
- String charset = CharsetUtil.toJavaCharset(mimeCharset);
- if (charset == null) {
- if (log.isWarnEnabled()) {
- log.warn("MIME charset '" + mimeCharset + "' in encoded word '"
- + body.substring(begin, end) + "' doesn't have a "
- + "corresponding Java charset");
- }
- return null;
- } else if (!CharsetUtil.isDecodingSupported(charset)) {
- if (log.isWarnEnabled()) {
- log.warn("Current JDK doesn't support decoding of charset '"
- + charset + "' (MIME charset '" + mimeCharset
- + "' in encoded word '" + body.substring(begin, end)
- + "')");
- }
- return null;
- }
-
- if (encodedText.length() == 0) {
- if (log.isWarnEnabled()) {
- log.warn("Missing encoded text in encoded word: '"
- + body.substring(begin, end) + "'");
- }
- return null;
- }
-
- try {
- if (encoding.equalsIgnoreCase("Q")) {
- return DecoderUtil.decodeQ(encodedText, charset);
- } else if (encoding.equalsIgnoreCase("B")) {
- return DecoderUtil.decodeB(encodedText, charset);
- } else {
- if (log.isWarnEnabled()) {
- log.warn("Warning: Unknown encoding in encoded word '"
- + body.substring(begin, end) + "'");
- }
- return null;
- }
- } catch (UnsupportedEncodingException e) {
- // should not happen because of isDecodingSupported check above
- if (log.isWarnEnabled()) {
- log.warn("Unsupported encoding in encoded word '"
- + body.substring(begin, end) + "'", e);
- }
- return null;
- } catch (RuntimeException e) {
- if (log.isWarnEnabled()) {
- log.warn("Could not decode encoded word '"
- + body.substring(begin, end) + "'", e);
- }
- return null;
- }
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/decoder/QuotedPrintableInputStream.java b/emailcommon/src/org/apache/james/mime4j/decoder/QuotedPrintableInputStream.java
deleted file mode 100644
index cbcb22628..000000000
--- a/emailcommon/src/org/apache/james/mime4j/decoder/QuotedPrintableInputStream.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.decoder;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-
-/**
- * Performs Quoted-Printable decoding on an underlying stream.
- *
- *
- *
- * @version $Id: QuotedPrintableInputStream.java,v 1.3 2004/11/29 13:15:47 ntherning Exp $
- */
-public class QuotedPrintableInputStream extends InputStream {
- private static Log log = LogFactory.getLog(QuotedPrintableInputStream.class);
-
- private InputStream stream;
- ByteQueue byteq = new ByteQueue();
- ByteQueue pushbackq = new ByteQueue();
- private byte state = 0;
-
- public QuotedPrintableInputStream(InputStream stream) {
- this.stream = stream;
- }
-
- /**
- * Closes the underlying stream.
- *
- * @throws IOException on I/O errors.
- */
- public void close() throws IOException {
- stream.close();
- }
-
- public int read() throws IOException {
- fillBuffer();
- if (byteq.count() == 0)
- return -1;
- else {
- byte val = byteq.dequeue();
- if (val >= 0)
- return val;
- else
- return val & 0xFF;
- }
- }
-
- /**
- * Pulls bytes out of the underlying stream and places them in the
- * pushback queue. This is necessary (vs. reading from the
- * underlying stream directly) to detect and filter out "transport
- * padding" whitespace, i.e., all whitespace that appears immediately
- * before a CRLF.
- *
- * @throws IOException Underlying stream threw IOException.
- */
- private void populatePushbackQueue() throws IOException {
- //Debug.verify(pushbackq.count() == 0, "PopulatePushbackQueue called when pushback queue was not empty!");
-
- if (pushbackq.count() != 0)
- return;
-
- while (true) {
- int i = stream.read();
- switch (i) {
- case -1:
- // stream is done
- pushbackq.clear(); // discard any whitespace preceding EOF
- return;
- case ' ':
- case '\t':
- pushbackq.enqueue((byte)i);
- break;
- case '\r':
- case '\n':
- pushbackq.clear(); // discard any whitespace preceding EOL
- pushbackq.enqueue((byte)i);
- return;
- default:
- pushbackq.enqueue((byte)i);
- return;
- }
- }
- }
-
- /**
- * Causes the pushback queue to get populated if it is empty, then
- * consumes and decodes bytes out of it until one or more bytes are
- * in the byte queue. This decoding step performs the actual QP
- * decoding.
- *
- * @throws IOException Underlying stream threw IOException.
- */
- private void fillBuffer() throws IOException {
- byte msdChar = 0; // first digit of escaped num
- while (byteq.count() == 0) {
- if (pushbackq.count() == 0) {
- populatePushbackQueue();
- if (pushbackq.count() == 0)
- return;
- }
-
- byte b = (byte)pushbackq.dequeue();
-
- switch (state) {
- case 0: // start state, no bytes pending
- if (b != '=') {
- byteq.enqueue(b);
- break; // state remains 0
- } else {
- state = 1;
- break;
- }
- case 1: // encountered "=" so far
- if (b == '\r') {
- state = 2;
- break;
- } else if ((b >= '0' && b <= '9') || (b >= 'A' && b <= 'F') || (b >= 'a' && b <= 'f')) {
- state = 3;
- msdChar = b; // save until next digit encountered
- break;
- } else if (b == '=') {
- /*
- * Special case when == is encountered.
- * Emit one = and stay in this state.
- */
- if (log.isWarnEnabled()) {
- log.warn("Malformed MIME; got ==");
- }
- byteq.enqueue((byte)'=');
- break;
- } else {
- if (log.isWarnEnabled()) {
- log.warn("Malformed MIME; expected \\r or "
- + "[0-9A-Z], got " + b);
- }
- state = 0;
- byteq.enqueue((byte)'=');
- byteq.enqueue(b);
- break;
- }
- case 2: // encountered "=\r" so far
- if (b == '\n') {
- state = 0;
- break;
- } else {
- if (log.isWarnEnabled()) {
- log.warn("Malformed MIME; expected "
- + (int)'\n' + ", got " + b);
- }
- state = 0;
- byteq.enqueue((byte)'=');
- byteq.enqueue((byte)'\r');
- byteq.enqueue(b);
- break;
- }
- case 3: // encountered =<digit> so far; expecting another <digit> to complete the octet
- if ((b >= '0' && b <= '9') || (b >= 'A' && b <= 'F') || (b >= 'a' && b <= 'f')) {
- byte msd = asciiCharToNumericValue(msdChar);
- byte low = asciiCharToNumericValue(b);
- state = 0;
- byteq.enqueue((byte)((msd << 4) | low));
- break;
- } else {
- if (log.isWarnEnabled()) {
- log.warn("Malformed MIME; expected "
- + "[0-9A-Z], got " + b);
- }
- state = 0;
- byteq.enqueue((byte)'=');
- byteq.enqueue(msdChar);
- byteq.enqueue(b);
- break;
- }
- default: // should never happen
- log.error("Illegal state: " + state);
- state = 0;
- byteq.enqueue(b);
- break;
- }
- }
- }
-
- /**
- * Converts '0' => 0, 'A' => 10, etc.
- * @param c ASCII character value.
- * @return Numeric value of hexadecimal character.
- */
- private byte asciiCharToNumericValue(byte c) {
- if (c >= '0' && c <= '9') {
- return (byte)(c - '0');
- } else if (c >= 'A' && c <= 'Z') {
- return (byte)(0xA + (c - 'A'));
- } else if (c >= 'a' && c <= 'z') {
- return (byte)(0xA + (c - 'a'));
- } else {
- /*
- * This should never happen since all calls to this method
- * are preceded by a check that c is in [0-9A-Za-z]
- */
- throw new IllegalArgumentException((char) c
- + " is not a hexadecimal digit");
- }
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/decoder/UnboundedFifoByteBuffer.java b/emailcommon/src/org/apache/james/mime4j/decoder/UnboundedFifoByteBuffer.java
deleted file mode 100644
index dc32caf36..000000000
--- a/emailcommon/src/org/apache/james/mime4j/decoder/UnboundedFifoByteBuffer.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.decoder;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * UnboundedFifoByteBuffer is a very efficient buffer implementation.
- * According to performance testing, it exhibits a constant access time, but it
- * also outperforms ArrayList when used for the same purpose.
- * <p>
- * The removal order of an <code>UnboundedFifoByteBuffer</code> is based on the insertion
- * order; elements are removed in the same order in which they were added.
- * The iteration order is the same as the removal order.
- * <p>
- * The {@link #remove()} and {@link #get()} operations perform in constant time.
- * The {@link #add(Object)} operation performs in amortized constant time. All
- * other operations perform in linear time or worse.
- * <p>
- * Note that this implementation is not synchronized. The following can be
- * used to provide synchronized access to your <code>UnboundedFifoByteBuffer</code>:
- * <pre>
- * Buffer fifo = BufferUtils.synchronizedBuffer(new UnboundedFifoByteBuffer());
- * </pre>
- * <p>
- * This buffer prevents null objects from being added.
- *
- * @since Commons Collections 3.0 (previously in main package v2.1)
- * @version $Revision: 1.1 $ $Date: 2004/08/24 06:52:02 $
- *
- *
- *
- *
- *
- *
- */
-class UnboundedFifoByteBuffer {
-
- protected byte[] buffer;
- protected int head;
- protected int tail;
-
- /**
- * Constructs an UnboundedFifoByteBuffer with the default number of elements.
- * It is exactly the same as performing the following:
- *
- * <pre>
- * new UnboundedFifoByteBuffer(32);
- * </pre>
- */
- public UnboundedFifoByteBuffer() {
- this(32);
- }
-
- /**
- * Constructs an UnboundedFifoByteBuffer with the specified number of elements.
- * The integer must be a positive integer.
- *
- * @param initialSize the initial size of the buffer
- * @throws IllegalArgumentException if the size is less than 1
- */
- public UnboundedFifoByteBuffer(int initialSize) {
- if (initialSize <= 0) {
- throw new IllegalArgumentException("The size must be greater than 0");
- }
- buffer = new byte[initialSize + 1];
- head = 0;
- tail = 0;
- }
-
- /**
- * Returns the number of elements stored in the buffer.
- *
- * @return this buffer's size
- */
- public int size() {
- int size = 0;
-
- if (tail < head) {
- size = buffer.length - head + tail;
- } else {
- size = tail - head;
- }
-
- return size;
- }
-
- /**
- * Returns true if this buffer is empty; false otherwise.
- *
- * @return true if this buffer is empty
- */
- public boolean isEmpty() {
- return (size() == 0);
- }
-
- /**
- * Adds the given element to this buffer.
- *
- * @param b the byte to add
- * @return true, always
- */
- public boolean add(final byte b) {
-
- if (size() + 1 >= buffer.length) {
- byte[] tmp = new byte[((buffer.length - 1) * 2) + 1];
-
- int j = 0;
- for (int i = head; i != tail;) {
- tmp[j] = buffer[i];
- buffer[i] = 0;
-
- j++;
- i++;
- if (i == buffer.length) {
- i = 0;
- }
- }
-
- buffer = tmp;
- head = 0;
- tail = j;
- }
-
- buffer[tail] = b;
- tail++;
- if (tail >= buffer.length) {
- tail = 0;
- }
- return true;
- }
-
- /**
- * Returns the next object in the buffer.
- *
- * @return the next object in the buffer
- * @throws BufferUnderflowException if this buffer is empty
- */
- public byte get() {
- if (isEmpty()) {
- throw new IllegalStateException("The buffer is already empty");
- }
-
- return buffer[head];
- }
-
- /**
- * Removes the next object from the buffer
- *
- * @return the removed object
- * @throws BufferUnderflowException if this buffer is empty
- */
- public byte remove() {
- if (isEmpty()) {
- throw new IllegalStateException("The buffer is already empty");
- }
-
- byte element = buffer[head];
-
- head++;
- if (head >= buffer.length) {
- head = 0;
- }
-
- return element;
- }
-
- /**
- * Increments the internal index.
- *
- * @param index the index to increment
- * @return the updated index
- */
- private int increment(int index) {
- index++;
- if (index >= buffer.length) {
- index = 0;
- }
- return index;
- }
-
- /**
- * Decrements the internal index.
- *
- * @param index the index to decrement
- * @return the updated index
- */
- private int decrement(int index) {
- index--;
- if (index < 0) {
- index = buffer.length - 1;
- }
- return index;
- }
-
- /**
- * Returns an iterator over this buffer's elements.
- *
- * @return an iterator over this buffer's elements
- */
- public Iterator iterator() {
- return new Iterator() {
-
- private int index = head;
- private int lastReturnedIndex = -1;
-
- public boolean hasNext() {
- return index != tail;
-
- }
-
- public Object next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- lastReturnedIndex = index;
- index = increment(index);
- return new Byte(buffer[lastReturnedIndex]);
- }
-
- public void remove() {
- if (lastReturnedIndex == -1) {
- throw new IllegalStateException();
- }
-
- // First element can be removed quickly
- if (lastReturnedIndex == head) {
- UnboundedFifoByteBuffer.this.remove();
- lastReturnedIndex = -1;
- return;
- }
-
- // Other elements require us to shift the subsequent elements
- int i = lastReturnedIndex + 1;
- while (i != tail) {
- if (i >= buffer.length) {
- buffer[i - 1] = buffer[0];
- i = 0;
- } else {
- buffer[i - 1] = buffer[i];
- i++;
- }
- }
-
- lastReturnedIndex = -1;
- tail = decrement(tail);
- buffer[tail] = 0;
- index = decrement(index);
- }
-
- };
- }
-
-} \ No newline at end of file
diff --git a/emailcommon/src/org/apache/james/mime4j/field/AddressListField.java b/emailcommon/src/org/apache/james/mime4j/field/AddressListField.java
deleted file mode 100644
index b37abbb11..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/AddressListField.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.field.address.AddressList;
-import org.apache.james.mime4j.field.address.parser.ParseException;
-
-public class AddressListField extends Field {
- private AddressList addressList;
- private ParseException parseException;
-
- protected AddressListField(String name, String body, String raw, AddressList addressList, ParseException parseException) {
- super(name, body, raw);
- this.addressList = addressList;
- this.parseException = parseException;
- }
-
- public AddressList getAddressList() {
- return addressList;
- }
-
- public ParseException getParseException() {
- return parseException;
- }
-
- public static class Parser implements FieldParser {
- private static Log log = LogFactory.getLog(Parser.class);
-
- public Field parse(final String name, final String body, final String raw) {
- AddressList addressList = null;
- ParseException parseException = null;
- try {
- addressList = AddressList.parse(body);
- }
- catch (ParseException e) {
- if (log.isDebugEnabled()) {
- log.debug("Parsing value '" + body + "': "+ e.getMessage());
- }
- parseException = e;
- }
- return new AddressListField(name, body, raw, addressList, parseException);
- }
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/ContentTransferEncodingField.java b/emailcommon/src/org/apache/james/mime4j/field/ContentTransferEncodingField.java
deleted file mode 100644
index eb6151377..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/ContentTransferEncodingField.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field;
-
-
-
-/**
- * Represents a <code>Content-Transfer-Encoding</code> field.
- *
- *
- * @version $Id: ContentTransferEncodingField.java,v 1.2 2004/10/02 12:41:11 ntherning Exp $
- */
-public class ContentTransferEncodingField extends Field {
- /**
- * The <code>7bit</code> encoding.
- */
- public static final String ENC_7BIT = "7bit";
- /**
- * The <code>8bit</code> encoding.
- */
- public static final String ENC_8BIT = "8bit";
- /**
- * The <code>binary</code> encoding.
- */
- public static final String ENC_BINARY = "binary";
- /**
- * The <code>quoted-printable</code> encoding.
- */
- public static final String ENC_QUOTED_PRINTABLE = "quoted-printable";
- /**
- * The <code>base64</code> encoding.
- */
- public static final String ENC_BASE64 = "base64";
-
- private String encoding;
-
- protected ContentTransferEncodingField(String name, String body, String raw, String encoding) {
- super(name, body, raw);
- this.encoding = encoding;
- }
-
- /**
- * Gets the encoding defined in this field.
- *
- * @return the encoding or an empty string if not set.
- */
- public String getEncoding() {
- return encoding;
- }
-
- /**
- * Gets the encoding of the given field if. Returns the default
- * <code>7bit</code> if not set or if
- * <code>f</code> is <code>null</code>.
- *
- * @return the encoding.
- */
- public static String getEncoding(ContentTransferEncodingField f) {
- if (f != null && f.getEncoding().length() != 0) {
- return f.getEncoding();
- }
- return ENC_7BIT;
- }
-
- public static class Parser implements FieldParser {
- public Field parse(final String name, final String body, final String raw) {
- final String encoding = body.trim().toLowerCase();
- return new ContentTransferEncodingField(name, body, raw, encoding);
- }
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/ContentTypeField.java b/emailcommon/src/org/apache/james/mime4j/field/ContentTypeField.java
deleted file mode 100644
index 646cf141a..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/ContentTypeField.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field;
-
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.field.contenttype.parser.ContentTypeParser;
-import org.apache.james.mime4j.field.contenttype.parser.ParseException;
-import org.apache.james.mime4j.field.contenttype.parser.TokenMgrError;
-
-/**
- * Represents a <code>Content-Type</code> field.
- *
- * <p>TODO: Remove dependency on Java 1.4 regexps</p>
- *
- *
- * @version $Id: ContentTypeField.java,v 1.6 2005/01/27 14:16:31 ntherning Exp $
- */
-public class ContentTypeField extends Field {
-
- /**
- * The prefix of all <code>multipart</code> MIME types.
- */
- public static final String TYPE_MULTIPART_PREFIX = "multipart/";
- /**
- * The <code>multipart/digest</code> MIME type.
- */
- public static final String TYPE_MULTIPART_DIGEST = "multipart/digest";
- /**
- * The <code>text/plain</code> MIME type.
- */
- public static final String TYPE_TEXT_PLAIN = "text/plain";
- /**
- * The <code>message/rfc822</code> MIME type.
- */
- public static final String TYPE_MESSAGE_RFC822 = "message/rfc822";
- /**
- * The name of the <code>boundary</code> parameter.
- */
- public static final String PARAM_BOUNDARY = "boundary";
- /**
- * The name of the <code>charset</code> parameter.
- */
- public static final String PARAM_CHARSET = "charset";
-
- private String mimeType = "";
- private Map<String, String> parameters = null;
- private ParseException parseException;
-
- protected ContentTypeField(String name, String body, String raw, String mimeType, Map<String, String> parameters, ParseException parseException) {
- super(name, body, raw);
- this.mimeType = mimeType;
- this.parameters = parameters;
- this.parseException = parseException;
- }
-
- /**
- * Gets the exception that was raised during parsing of
- * the field value, if any; otherwise, null.
- */
- public ParseException getParseException() {
- return parseException;
- }
-
- /**
- * Gets the MIME type defined in this Content-Type field.
- *
- * @return the MIME type or an empty string if not set.
- */
- public String getMimeType() {
- return mimeType;
- }
-
- /**
- * Gets the MIME type defined in the child's
- * Content-Type field or derives a MIME type from the parent
- * if child is <code>null</code> or hasn't got a MIME type value set.
- * If child's MIME type is multipart but no boundary
- * has been set the MIME type of child will be derived from
- * the parent.
- *
- * @param child the child.
- * @param parent the parent.
- * @return the MIME type.
- */
- public static String getMimeType(ContentTypeField child,
- ContentTypeField parent) {
-
- if (child == null || child.getMimeType().length() == 0
- || child.isMultipart() && child.getBoundary() == null) {
-
- if (parent != null && parent.isMimeType(TYPE_MULTIPART_DIGEST)) {
- return TYPE_MESSAGE_RFC822;
- } else {
- return TYPE_TEXT_PLAIN;
- }
- }
-
- return child.getMimeType();
- }
-
- /**
- * Gets the value of a parameter. Parameter names are case-insensitive.
- *
- * @param name the name of the parameter to get.
- * @return the parameter value or <code>null</code> if not set.
- */
- public String getParameter(String name) {
- return parameters != null
- ? parameters.get(name.toLowerCase())
- : null;
- }
-
- /**
- * Gets all parameters.
- *
- * @return the parameters.
- */
- public Map<String, String> getParameters() {
- if (parameters != null) {
- return Collections.unmodifiableMap(parameters);
- }
- return Collections.emptyMap();
- }
-
- /**
- * Gets the value of the <code>boundary</code> parameter if set.
- *
- * @return the <code>boundary</code> parameter value or <code>null</code>
- * if not set.
- */
- public String getBoundary() {
- return getParameter(PARAM_BOUNDARY);
- }
-
- /**
- * Gets the value of the <code>charset</code> parameter if set.
- *
- * @return the <code>charset</code> parameter value or <code>null</code>
- * if not set.
- */
- public String getCharset() {
- return getParameter(PARAM_CHARSET);
- }
-
- /**
- * Gets the value of the <code>charset</code> parameter if set for the
- * given field. Returns the default <code>us-ascii</code> if not set or if
- * <code>f</code> is <code>null</code>.
- *
- * @return the <code>charset</code> parameter value.
- */
- public static String getCharset(ContentTypeField f) {
- if (f != null) {
- if (f.getCharset() != null && f.getCharset().length() > 0) {
- return f.getCharset();
- }
- }
- return "us-ascii";
- }
-
- /**
- * Determines if the MIME type of this field matches the given one.
- *
- * @param mimeType the MIME type to match against.
- * @return <code>true</code> if the MIME type of this field matches,
- * <code>false</code> otherwise.
- */
- public boolean isMimeType(String mimeType) {
- return this.mimeType.equalsIgnoreCase(mimeType);
- }
-
- /**
- * Determines if the MIME type of this field is <code>multipart/*</code>.
- *
- * @return <code>true</code> if this field is has a <code>multipart/*</code>
- * MIME type, <code>false</code> otherwise.
- */
- public boolean isMultipart() {
- return mimeType.startsWith(TYPE_MULTIPART_PREFIX);
- }
-
- public static class Parser implements FieldParser {
- private static Log log = LogFactory.getLog(Parser.class);
-
- public Field parse(final String name, final String body, final String raw) {
- ParseException parseException = null;
- String mimeType = "";
- Map<String, String> parameters = null;
-
- ContentTypeParser parser = new ContentTypeParser(new StringReader(body));
- try {
- parser.parseAll();
- }
- catch (ParseException e) {
- if (log.isDebugEnabled()) {
- log.debug("Parsing value '" + body + "': "+ e.getMessage());
- }
- parseException = e;
- }
- catch (TokenMgrError e) {
- if (log.isDebugEnabled()) {
- log.debug("Parsing value '" + body + "': "+ e.getMessage());
- }
- parseException = new ParseException(e.getMessage());
- }
-
- try {
- final String type = parser.getType();
- final String subType = parser.getSubType();
-
- if (type != null && subType != null) {
- mimeType = (type + "/" + parser.getSubType()).toLowerCase();
-
- ArrayList<String> paramNames = parser.getParamNames();
- ArrayList<String> paramValues = parser.getParamValues();
-
- if (paramNames != null && paramValues != null) {
- for (int i = 0; i < paramNames.size() && i < paramValues.size(); i++) {
- if (parameters == null)
- parameters = new HashMap<String, String>((int)(paramNames.size() * 1.3 + 1));
- String paramName = paramNames.get(i).toLowerCase();
- String paramValue = paramValues.get(i);
- parameters.put(paramName, paramValue);
- }
- }
- }
- }
- catch (NullPointerException npe) {
- }
- return new ContentTypeField(name, body, raw, mimeType, parameters, parseException);
- }
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/DateTimeField.java b/emailcommon/src/org/apache/james/mime4j/field/DateTimeField.java
deleted file mode 100644
index e65551fcd..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/DateTimeField.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field;
-
-//BEGIN android-changed: Stubbing out logging
-import com.android.emailcommon.utility.Utility;
-
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END
-import org.apache.james.mime4j.field.datetime.DateTime;
-import org.apache.james.mime4j.field.datetime.parser.ParseException;
-
-import java.util.Date;
-
-public class DateTimeField extends Field {
- private Date date;
- private ParseException parseException;
-
- protected DateTimeField(String name, String body, String raw, Date date, ParseException parseException) {
- super(name, body, raw);
- this.date = date;
- this.parseException = parseException;
- }
-
- public Date getDate() {
- return date;
- }
-
- public ParseException getParseException() {
- return parseException;
- }
-
- public static class Parser implements FieldParser {
- private static Log log = LogFactory.getLog(Parser.class);
-
- public Field parse(final String name, String body, final String raw) {
- Date date = null;
- ParseException parseException = null;
- //BEGIN android-changed
- body = Utility.cleanUpMimeDate(body);
- //END android-changed
- try {
- date = DateTime.parse(body).getDate();
- }
- catch (ParseException e) {
- if (log.isDebugEnabled()) {
- log.debug("Parsing value '" + body + "': "+ e.getMessage());
- }
- parseException = e;
- }
- return new DateTimeField(name, body, raw, date, parseException);
- }
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/DefaultFieldParser.java b/emailcommon/src/org/apache/james/mime4j/field/DefaultFieldParser.java
deleted file mode 100644
index 84fcdcb2d..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/DefaultFieldParser.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2006 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field;
-
-public class DefaultFieldParser extends DelegatingFieldParser {
-
- public DefaultFieldParser() {
- setFieldParser(Field.CONTENT_TRANSFER_ENCODING, new ContentTransferEncodingField.Parser());
- setFieldParser(Field.CONTENT_TYPE, new ContentTypeField.Parser());
-
- final DateTimeField.Parser dateTimeParser = new DateTimeField.Parser();
- setFieldParser(Field.DATE, dateTimeParser);
- setFieldParser(Field.RESENT_DATE, dateTimeParser);
-
- final MailboxListField.Parser mailboxListParser = new MailboxListField.Parser();
- setFieldParser(Field.FROM, mailboxListParser);
- setFieldParser(Field.RESENT_FROM, mailboxListParser);
-
- final MailboxField.Parser mailboxParser = new MailboxField.Parser();
- setFieldParser(Field.SENDER, mailboxParser);
- setFieldParser(Field.RESENT_SENDER, mailboxParser);
-
- final AddressListField.Parser addressListParser = new AddressListField.Parser();
- setFieldParser(Field.TO, addressListParser);
- setFieldParser(Field.RESENT_TO, addressListParser);
- setFieldParser(Field.CC, addressListParser);
- setFieldParser(Field.RESENT_CC, addressListParser);
- setFieldParser(Field.BCC, addressListParser);
- setFieldParser(Field.RESENT_BCC, addressListParser);
- setFieldParser(Field.REPLY_TO, addressListParser);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/DelegatingFieldParser.java b/emailcommon/src/org/apache/james/mime4j/field/DelegatingFieldParser.java
deleted file mode 100644
index 2a2866f57..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/DelegatingFieldParser.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2006 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class DelegatingFieldParser implements FieldParser {
-
- private Map<String, FieldParser> parsers = new HashMap<String, FieldParser>();
- private FieldParser defaultParser = new UnstructuredField.Parser();
-
- /**
- * Sets the parser used for the field named <code>name</code>.
- * @param name the name of the field
- * @param parser the parser for fields named <code>name</code>
- */
- public void setFieldParser(final String name, final FieldParser parser) {
- parsers.put(name.toLowerCase(), parser);
- }
-
- public FieldParser getParser(final String name) {
- final FieldParser field = parsers.get(name.toLowerCase());
- if(field==null) {
- return defaultParser;
- }
- return field;
- }
-
- public Field parse(final String name, final String body, final String raw) {
- final FieldParser parser = getParser(name);
- return parser.parse(name, body, raw);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/Field.java b/emailcommon/src/org/apache/james/mime4j/field/Field.java
deleted file mode 100644
index 7c2a20dc8..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/Field.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * The base class of all field classes.
- *
- *
- * @version $Id: Field.java,v 1.6 2004/10/25 07:26:46 ntherning Exp $
- */
-public abstract class Field {
- public static final String SENDER = "Sender";
- public static final String FROM = "From";
- public static final String TO = "To";
- public static final String CC = "Cc";
- public static final String BCC = "Bcc";
- public static final String REPLY_TO = "Reply-To";
- public static final String RESENT_SENDER = "Resent-Sender";
- public static final String RESENT_FROM = "Resent-From";
- public static final String RESENT_TO = "Resent-To";
- public static final String RESENT_CC = "Resent-Cc";
- public static final String RESENT_BCC = "Resent-Bcc";
-
- public static final String DATE = "Date";
- public static final String RESENT_DATE = "Resent-Date";
-
- public static final String SUBJECT = "Subject";
- public static final String CONTENT_TYPE = "Content-Type";
- public static final String CONTENT_TRANSFER_ENCODING =
- "Content-Transfer-Encoding";
-
- private static final String FIELD_NAME_PATTERN =
- "^([\\x21-\\x39\\x3b-\\x7e]+)[ \t]*:";
- private static final Pattern fieldNamePattern =
- Pattern.compile(FIELD_NAME_PATTERN);
-
- private static final DefaultFieldParser parser = new DefaultFieldParser();
-
- private final String name;
- private final String body;
- private final String raw;
-
- protected Field(final String name, final String body, final String raw) {
- this.name = name;
- this.body = body;
- this.raw = raw;
- }
-
- /**
- * Parses the given string and returns an instance of the
- * <code>Field</code> class. The type of the class returned depends on
- * the field name:
- * <table>
- * <tr>
- * <td><em>Field name</em></td><td><em>Class returned</em></td>
- * <td>Content-Type</td><td>org.apache.james.mime4j.field.ContentTypeField</td>
- * <td>other</td><td>org.apache.james.mime4j.field.UnstructuredField</td>
- * </tr>
- * </table>
- *
- * @param s the string to parse.
- * @return a <code>Field</code> instance.
- * @throws IllegalArgumentException on parse errors.
- */
- public static Field parse(final String raw) {
-
- /*
- * Unfold the field.
- */
- final String unfolded = raw.replaceAll("\r|\n", "");
-
- /*
- * Split into name and value.
- */
- final Matcher fieldMatcher = fieldNamePattern.matcher(unfolded);
- if (!fieldMatcher.find()) {
- throw new IllegalArgumentException("Invalid field in string");
- }
- final String name = fieldMatcher.group(1);
-
- String body = unfolded.substring(fieldMatcher.end());
- if (body.length() > 0 && body.charAt(0) == ' ') {
- body = body.substring(1);
- }
-
- return parser.parse(name, body, raw);
- }
-
- /**
- * Gets the default parser used to parse fields.
- * @return the default field parser
- */
- public static DefaultFieldParser getParser() {
- return parser;
- }
-
- /**
- * Gets the name of the field (<code>Subject</code>,
- * <code>From</code>, etc).
- *
- * @return the field name.
- */
- public String getName() {
- return name;
- }
-
- /**
- * Gets the original raw field string.
- *
- * @return the original raw field string.
- */
- public String getRaw() {
- return raw;
- }
-
- /**
- * Gets the unfolded, unparsed and possibly encoded (see RFC 2047) field
- * body string.
- *
- * @return the unfolded unparsed field body string.
- */
- public String getBody() {
- return body;
- }
-
- /**
- * Determines if this is a <code>Content-Type</code> field.
- *
- * @return <code>true</code> if this is a <code>Content-Type</code> field,
- * <code>false</code> otherwise.
- */
- public boolean isContentType() {
- return CONTENT_TYPE.equalsIgnoreCase(name);
- }
-
- /**
- * Determines if this is a <code>Subject</code> field.
- *
- * @return <code>true</code> if this is a <code>Subject</code> field,
- * <code>false</code> otherwise.
- */
- public boolean isSubject() {
- return SUBJECT.equalsIgnoreCase(name);
- }
-
- /**
- * Determines if this is a <code>From</code> field.
- *
- * @return <code>true</code> if this is a <code>From</code> field,
- * <code>false</code> otherwise.
- */
- public boolean isFrom() {
- return FROM.equalsIgnoreCase(name);
- }
-
- /**
- * Determines if this is a <code>To</code> field.
- *
- * @return <code>true</code> if this is a <code>To</code> field,
- * <code>false</code> otherwise.
- */
- public boolean isTo() {
- return TO.equalsIgnoreCase(name);
- }
-
- /**
- * @see #getRaw()
- */
- public String toString() {
- return raw;
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/FieldParser.java b/emailcommon/src/org/apache/james/mime4j/field/FieldParser.java
deleted file mode 100644
index 4f33c9e26..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/FieldParser.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright 2006 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field;
-
-public interface FieldParser {
-
- Field parse(final String name, final String body, final String raw);
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/MailboxField.java b/emailcommon/src/org/apache/james/mime4j/field/MailboxField.java
deleted file mode 100644
index 9404fd621..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/MailboxField.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.field.address.AddressList;
-import org.apache.james.mime4j.field.address.Mailbox;
-import org.apache.james.mime4j.field.address.MailboxList;
-import org.apache.james.mime4j.field.address.parser.ParseException;
-
-public class MailboxField extends Field {
- private final Mailbox mailbox;
- private final ParseException parseException;
-
- protected MailboxField(final String name, final String body, final String raw, final Mailbox mailbox, final ParseException parseException) {
- super(name, body, raw);
- this.mailbox = mailbox;
- this.parseException = parseException;
- }
-
- public Mailbox getMailbox() {
- return mailbox;
- }
-
- public ParseException getParseException() {
- return parseException;
- }
-
- public static class Parser implements FieldParser {
- private static Log log = LogFactory.getLog(Parser.class);
-
- public Field parse(final String name, final String body, final String raw) {
- Mailbox mailbox = null;
- ParseException parseException = null;
- try {
- MailboxList mailboxList = AddressList.parse(body).flatten();
- if (mailboxList.size() > 0) {
- mailbox = mailboxList.get(0);
- }
- }
- catch (ParseException e) {
- if (log.isDebugEnabled()) {
- log.debug("Parsing value '" + body + "': "+ e.getMessage());
- }
- parseException = e;
- }
- return new MailboxField(name, body, raw, mailbox, parseException);
- }
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/MailboxListField.java b/emailcommon/src/org/apache/james/mime4j/field/MailboxListField.java
deleted file mode 100644
index 6364fc88c..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/MailboxListField.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.field.address.AddressList;
-import org.apache.james.mime4j.field.address.MailboxList;
-import org.apache.james.mime4j.field.address.parser.ParseException;
-
-public class MailboxListField extends Field {
-
- private MailboxList mailboxList;
- private ParseException parseException;
-
- protected MailboxListField(final String name, final String body, final String raw, final MailboxList mailboxList, final ParseException parseException) {
- super(name, body, raw);
- this.mailboxList = mailboxList;
- this.parseException = parseException;
- }
-
- public MailboxList getMailboxList() {
- return mailboxList;
- }
-
- public ParseException getParseException() {
- return parseException;
- }
-
- public static class Parser implements FieldParser {
- private static Log log = LogFactory.getLog(Parser.class);
-
- public Field parse(final String name, final String body, final String raw) {
- MailboxList mailboxList = null;
- ParseException parseException = null;
- try {
- mailboxList = AddressList.parse(body).flatten();
- }
- catch (ParseException e) {
- if (log.isDebugEnabled()) {
- log.debug("Parsing value '" + body + "': "+ e.getMessage());
- }
- parseException = e;
- }
- return new MailboxListField(name, body, raw, mailboxList, parseException);
- }
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/UnstructuredField.java b/emailcommon/src/org/apache/james/mime4j/field/UnstructuredField.java
deleted file mode 100644
index 5e2adf9f2..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/UnstructuredField.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field;
-
-import org.apache.james.mime4j.decoder.DecoderUtil;
-
-
-/**
- * Simple unstructured field such as <code>Subject</code>.
- *
- *
- * @version $Id: UnstructuredField.java,v 1.3 2004/10/25 07:26:46 ntherning Exp $
- */
-public class UnstructuredField extends Field {
- private String value;
-
- protected UnstructuredField(String name, String body, String raw, String value) {
- super(name, body, raw);
- this.value = value;
- }
-
- public String getValue() {
- return value;
- }
-
- public static class Parser implements FieldParser {
- public Field parse(final String name, final String body, final String raw) {
- final String value = DecoderUtil.decodeEncodedWords(body);
- return new UnstructuredField(name, body, raw, value);
- }
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/Address.java b/emailcommon/src/org/apache/james/mime4j/field/address/Address.java
deleted file mode 100644
index 2a5d61e36..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/Address.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field.address;
-
-import java.util.ArrayList;
-
-/**
- * The abstract base for classes that represent RFC2822 addresses.
- * This includes groups and mailboxes.
- *
- * Currently, no public methods are introduced on this class.
- *
- *
- */
-public abstract class Address {
-
- /**
- * Adds any mailboxes represented by this address
- * into the given ArrayList. Note that this method
- * has default (package) access, so a doAddMailboxesTo
- * method is needed to allow the behavior to be
- * overridden by subclasses.
- */
- final void addMailboxesTo(ArrayList<Address> results) {
- doAddMailboxesTo(results);
- }
-
- /**
- * Adds any mailboxes represented by this address
- * into the given ArrayList. Must be overridden by
- * concrete subclasses.
- */
- protected abstract void doAddMailboxesTo(ArrayList<Address> results);
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/AddressList.java b/emailcommon/src/org/apache/james/mime4j/field/address/AddressList.java
deleted file mode 100644
index fa4d02c23..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/AddressList.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field.address;
-
-import org.apache.james.mime4j.field.address.parser.AddressListParser;
-import org.apache.james.mime4j.field.address.parser.ParseException;
-
-import java.io.StringReader;
-import java.util.ArrayList;
-
-/**
- * An immutable, random-access list of Address objects.
- *
- *
- */
-public class AddressList {
-
- private ArrayList<Address> addresses;
-
- /**
- * @param addresses An ArrayList that contains only Address objects.
- * @param dontCopy true iff it is not possible for the addresses ArrayList to be modified by someone else.
- */
- public AddressList(ArrayList<Address> addresses, boolean dontCopy) {
- if (addresses != null)
- this.addresses = (dontCopy ? addresses : new ArrayList<Address>(addresses));
- else
- this.addresses = new ArrayList<Address>(0);
- }
-
- /**
- * The number of elements in this list.
- */
- public int size() {
- return addresses.size();
- }
-
- /**
- * Gets an address.
- */
- public Address get(int index) {
- if (0 > index || size() <= index)
- throw new IndexOutOfBoundsException();
- return addresses.get(index);
- }
-
- /**
- * Returns a flat list of all mailboxes represented
- * in this address list. Use this if you don't care
- * about grouping.
- */
- public MailboxList flatten() {
- // in the common case, all addresses are mailboxes
- boolean groupDetected = false;
- for (int i = 0; i < size(); i++) {
- if (!(get(i) instanceof Mailbox)) {
- groupDetected = true;
- break;
- }
- }
-
- if (!groupDetected)
- return new MailboxList(addresses, true);
-
- ArrayList<Address> results = new ArrayList<Address>();
- for (int i = 0; i < size(); i++) {
- Address addr = get(i);
- addr.addMailboxesTo(results);
- }
-
- // copy-on-construct this time, because subclasses
- // could have held onto a reference to the results
- return new MailboxList(results, false);
- }
-
- /**
- * Dumps a representation of this address list to
- * stdout, for debugging purposes.
- */
- public void print() {
- for (int i = 0; i < size(); i++) {
- Address addr = get(i);
- System.out.println(addr.toString());
- }
- }
-
- /**
- * Parse the address list string, such as the value
- * of a From, To, Cc, Bcc, Sender, or Reply-To
- * header.
- *
- * The string MUST be unfolded already.
- */
- public static AddressList parse(String rawAddressList) throws ParseException {
- AddressListParser parser = new AddressListParser(new StringReader(rawAddressList));
- return Builder.getInstance().buildAddressList(parser.parse());
- }
-
- /**
- * Test console.
- */
- public static void main(String[] args) throws Exception {
- java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
- while (true) {
- try {
- System.out.print("> ");
- String line = reader.readLine();
- if (line.length() == 0 || line.toLowerCase().equals("exit") || line.toLowerCase().equals("quit")) {
- System.out.println("Goodbye.");
- return;
- }
- AddressList list = parse(line);
- list.print();
- }
- catch(Exception e) {
- e.printStackTrace();
- Thread.sleep(300);
- }
- }
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/Builder.java b/emailcommon/src/org/apache/james/mime4j/field/address/Builder.java
deleted file mode 100644
index a2bd3f0c6..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/Builder.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field.address;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.apache.james.mime4j.decoder.DecoderUtil;
-import org.apache.james.mime4j.field.address.parser.ASTaddr_spec;
-import org.apache.james.mime4j.field.address.parser.ASTaddress;
-import org.apache.james.mime4j.field.address.parser.ASTaddress_list;
-import org.apache.james.mime4j.field.address.parser.ASTangle_addr;
-import org.apache.james.mime4j.field.address.parser.ASTdomain;
-import org.apache.james.mime4j.field.address.parser.ASTgroup_body;
-import org.apache.james.mime4j.field.address.parser.ASTlocal_part;
-import org.apache.james.mime4j.field.address.parser.ASTmailbox;
-import org.apache.james.mime4j.field.address.parser.ASTname_addr;
-import org.apache.james.mime4j.field.address.parser.ASTphrase;
-import org.apache.james.mime4j.field.address.parser.ASTroute;
-import org.apache.james.mime4j.field.address.parser.Node;
-import org.apache.james.mime4j.field.address.parser.SimpleNode;
-import org.apache.james.mime4j.field.address.parser.Token;
-
-/**
- * Transforms the JJTree-generated abstract syntax tree
- * into a graph of org.apache.james.mime4j.field.address objects.
- *
- *
- */
-class Builder {
-
- private static Builder singleton = new Builder();
-
- public static Builder getInstance() {
- return singleton;
- }
-
-
-
- public AddressList buildAddressList(ASTaddress_list node) {
- ArrayList<Address> list = new ArrayList<Address>();
- for (int i = 0; i < node.jjtGetNumChildren(); i++) {
- ASTaddress childNode = (ASTaddress) node.jjtGetChild(i);
- Address address = buildAddress(childNode);
- list.add(address);
- }
- return new AddressList(list, true);
- }
-
- private Address buildAddress(ASTaddress node) {
- ChildNodeIterator it = new ChildNodeIterator(node);
- Node n = it.nextNode();
- if (n instanceof ASTaddr_spec) {
- return buildAddrSpec((ASTaddr_spec)n);
- }
- else if (n instanceof ASTangle_addr) {
- return buildAngleAddr((ASTangle_addr)n);
- }
- else if (n instanceof ASTphrase) {
- String name = buildString((ASTphrase)n, false);
- Node n2 = it.nextNode();
- if (n2 instanceof ASTgroup_body) {
- return new Group(name, buildGroupBody((ASTgroup_body)n2));
- }
- else if (n2 instanceof ASTangle_addr) {
- name = DecoderUtil.decodeEncodedWords(name);
- return new NamedMailbox(name, buildAngleAddr((ASTangle_addr)n2));
- }
- else {
- throw new IllegalStateException();
- }
- }
- else {
- throw new IllegalStateException();
- }
- }
-
-
-
- private MailboxList buildGroupBody(ASTgroup_body node) {
- ArrayList<Address> results = new ArrayList<Address>();
- ChildNodeIterator it = new ChildNodeIterator(node);
- while (it.hasNext()) {
- Node n = it.nextNode();
- if (n instanceof ASTmailbox)
- results.add(buildMailbox((ASTmailbox)n));
- else
- throw new IllegalStateException();
- }
- return new MailboxList(results, true);
- }
-
- private Mailbox buildMailbox(ASTmailbox node) {
- ChildNodeIterator it = new ChildNodeIterator(node);
- Node n = it.nextNode();
- if (n instanceof ASTaddr_spec) {
- return buildAddrSpec((ASTaddr_spec)n);
- }
- else if (n instanceof ASTangle_addr) {
- return buildAngleAddr((ASTangle_addr)n);
- }
- else if (n instanceof ASTname_addr) {
- return buildNameAddr((ASTname_addr)n);
- }
- else {
- throw new IllegalStateException();
- }
- }
-
- private NamedMailbox buildNameAddr(ASTname_addr node) {
- ChildNodeIterator it = new ChildNodeIterator(node);
- Node n = it.nextNode();
- String name;
- if (n instanceof ASTphrase) {
- name = buildString((ASTphrase)n, false);
- }
- else {
- throw new IllegalStateException();
- }
-
- n = it.nextNode();
- if (n instanceof ASTangle_addr) {
- name = DecoderUtil.decodeEncodedWords(name);
- return new NamedMailbox(name, buildAngleAddr((ASTangle_addr) n));
- }
- else {
- throw new IllegalStateException();
- }
- }
-
- private Mailbox buildAngleAddr(ASTangle_addr node) {
- ChildNodeIterator it = new ChildNodeIterator(node);
- DomainList route = null;
- Node n = it.nextNode();
- if (n instanceof ASTroute) {
- route = buildRoute((ASTroute)n);
- n = it.nextNode();
- }
- else if (n instanceof ASTaddr_spec)
- ; // do nothing
- else
- throw new IllegalStateException();
-
- if (n instanceof ASTaddr_spec)
- return buildAddrSpec(route, (ASTaddr_spec)n);
- else
- throw new IllegalStateException();
- }
-
- private DomainList buildRoute(ASTroute node) {
- ArrayList<String> results = new ArrayList<String>(node.jjtGetNumChildren());
- ChildNodeIterator it = new ChildNodeIterator(node);
- while (it.hasNext()) {
- Node n = it.nextNode();
- if (n instanceof ASTdomain)
- results.add(buildString((ASTdomain)n, true));
- else
- throw new IllegalStateException();
- }
- return new DomainList(results, true);
- }
-
- private Mailbox buildAddrSpec(ASTaddr_spec node) {
- return buildAddrSpec(null, node);
- }
- private Mailbox buildAddrSpec(DomainList route, ASTaddr_spec node) {
- ChildNodeIterator it = new ChildNodeIterator(node);
- String localPart = buildString((ASTlocal_part)it.nextNode(), true);
- String domain = buildString((ASTdomain)it.nextNode(), true);
- return new Mailbox(route, localPart, domain);
- }
-
-
- private String buildString(SimpleNode node, boolean stripSpaces) {
- Token head = node.firstToken;
- Token tail = node.lastToken;
- StringBuffer out = new StringBuffer();
-
- while (head != tail) {
- out.append(head.image);
- head = head.next;
- if (!stripSpaces)
- addSpecials(out, head.specialToken);
- }
- out.append(tail.image);
-
- return out.toString();
- }
-
- private void addSpecials(StringBuffer out, Token specialToken) {
- if (specialToken != null) {
- addSpecials(out, specialToken.specialToken);
- out.append(specialToken.image);
- }
- }
-
- private static class ChildNodeIterator implements Iterator<Node> {
-
- private SimpleNode simpleNode;
- private int index;
- private int len;
-
- public ChildNodeIterator(SimpleNode simpleNode) {
- this.simpleNode = simpleNode;
- this.len = simpleNode.jjtGetNumChildren();
- this.index = 0;
- }
-
- public void remove() {
- throw new UnsupportedOperationException();
- }
-
- public boolean hasNext() {
- return index < len;
- }
-
- public Node next() {
- return nextNode();
- }
-
- public Node nextNode() {
- return simpleNode.jjtGetChild(index++);
- }
-
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/DomainList.java b/emailcommon/src/org/apache/james/mime4j/field/address/DomainList.java
deleted file mode 100644
index df5b4de27..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/DomainList.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field.address;
-
-import java.util.ArrayList;
-
-/**
- * An immutable, random-access list of Strings (that
- * are supposedly domain names or domain literals).
- *
- *
- */
-public class DomainList {
- private ArrayList<String> domains;
-
- /**
- * @param domains An ArrayList that contains only String objects.
- * @param dontCopy true iff it is not possible for the domains ArrayList to be modified by someone else.
- */
- public DomainList(ArrayList<String> domains, boolean dontCopy) {
- if (domains != null)
- this.domains = (dontCopy ? domains : new ArrayList<String>(domains));
- else
- this.domains = new ArrayList<String>(0);
- }
-
- /**
- * The number of elements in this list.
- */
- public int size() {
- return domains.size();
- }
-
- /**
- * Gets the domain name or domain literal at the
- * specified index.
- * @throws IndexOutOfBoundsException If index is &lt; 0 or &gt;= size().
- */
- public String get(int index) {
- if (0 > index || size() <= index)
- throw new IndexOutOfBoundsException();
- return domains.get(index);
- }
-
- /**
- * Returns the list of domains formatted as a route
- * string (not including the trailing ':').
- */
- public String toRouteString() {
- StringBuffer out = new StringBuffer();
- for (int i = 0; i < domains.size(); i++) {
- out.append("@");
- out.append(get(i));
- if (i + 1 < domains.size())
- out.append(",");
- }
- return out.toString();
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/Group.java b/emailcommon/src/org/apache/james/mime4j/field/address/Group.java
deleted file mode 100644
index cca2b40b5..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/Group.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field.address;
-
-import java.util.ArrayList;
-
-/**
- * A named group of zero or more mailboxes.
- *
- *
- */
-public class Group extends Address {
- private String name;
- private MailboxList mailboxList;
-
- /**
- * @param name The group name.
- * @param mailboxes The mailboxes in this group.
- */
- public Group(String name, MailboxList mailboxes) {
- this.name = name;
- this.mailboxList = mailboxes;
- }
-
- /**
- * Returns the group name.
- */
- public String getName() {
- return name;
- }
-
- /**
- * Returns the mailboxes in this group.
- */
- public MailboxList getMailboxes() {
- return mailboxList;
- }
-
- @Override
- public String toString() {
- StringBuffer buf = new StringBuffer();
- buf.append(name);
- buf.append(":");
- for (int i = 0; i < mailboxList.size(); i++) {
- buf.append(mailboxList.get(i).toString());
- if (i + 1 < mailboxList.size())
- buf.append(",");
- }
- buf.append(";");
- return buf.toString();
- }
-
- @Override
- protected void doAddMailboxesTo(ArrayList<Address> results) {
- for (int i = 0; i < mailboxList.size(); i++)
- results.add(mailboxList.get(i));
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/Mailbox.java b/emailcommon/src/org/apache/james/mime4j/field/address/Mailbox.java
deleted file mode 100644
index c05a57f8e..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/Mailbox.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field.address;
-
-import java.util.ArrayList;
-
-/**
- * Represents a single e-mail address.
- *
- *
- */
-public class Mailbox extends Address {
- private DomainList route;
- private String localPart;
- private String domain;
-
- /**
- * Creates a mailbox without a route. Routes are obsolete.
- * @param localPart The part of the e-mail address to the left of the "@".
- * @param domain The part of the e-mail address to the right of the "@".
- */
- public Mailbox(String localPart, String domain) {
- this(null, localPart, domain);
- }
-
- /**
- * Creates a mailbox with a route. Routes are obsolete.
- * @param route The zero or more domains that make up the route. Can be null.
- * @param localPart The part of the e-mail address to the left of the "@".
- * @param domain The part of the e-mail address to the right of the "@".
- */
- public Mailbox(DomainList route, String localPart, String domain) {
- this.route = route;
- this.localPart = localPart;
- this.domain = domain;
- }
-
- /**
- * Returns the route list.
- */
- public DomainList getRoute() {
- return route;
- }
-
- /**
- * Returns the left part of the e-mail address
- * (before "@").
- */
- public String getLocalPart() {
- return localPart;
- }
-
- /**
- * Returns the right part of the e-mail address
- * (after "@").
- */
- public String getDomain() {
- return domain;
- }
-
- /**
- * Formats the address as a string, not including
- * the route.
- *
- * @see #getAddressString(boolean)
- */
- public String getAddressString() {
- return getAddressString(false);
- }
-
- /**
- * Note that this value may not be usable
- * for transport purposes, only display purposes.
- *
- * For example, if the unparsed address was
- *
- * <"Joe Cheng"@joecheng.com>
- *
- * this method would return
- *
- * <Joe Cheng@joecheng.com>
- *
- * which is not valid for transport; the local part
- * would need to be re-quoted.
- *
- * @param includeRoute true if the route should be included if it exists.
- */
- public String getAddressString(boolean includeRoute) {
- return "<" + (!includeRoute || route == null ? "" : route.toRouteString() + ":")
- + localPart
- + (domain == null ? "" : "@")
- + domain + ">";
- }
-
- @Override
- protected final void doAddMailboxesTo(ArrayList<Address> results) {
- results.add(this);
- }
-
- @Override
- public String toString() {
- return getAddressString();
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/MailboxList.java b/emailcommon/src/org/apache/james/mime4j/field/address/MailboxList.java
deleted file mode 100644
index 25337de9e..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/MailboxList.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field.address;
-
-import java.util.ArrayList;
-
-/**
- * An immutable, random-access list of Mailbox objects.
- *
- *
- */
-public class MailboxList {
-
- private ArrayList<Address> mailboxes;
-
- /**
- * @param mailboxes An ArrayList that contains only Mailbox objects.
- * @param dontCopy true iff it is not possible for the mailboxes ArrayList to be modified by someone else.
- */
- public MailboxList(ArrayList<Address> mailboxes, boolean dontCopy) {
- if (mailboxes != null)
- this.mailboxes = (dontCopy ? mailboxes : new ArrayList<Address>(mailboxes));
- else
- this.mailboxes = new ArrayList<Address>(0);
- }
-
- /**
- * The number of elements in this list.
- */
- public int size() {
- return mailboxes.size();
- }
-
- /**
- * Gets an address.
- */
- public Mailbox get(int index) {
- if (0 > index || size() <= index)
- throw new IndexOutOfBoundsException();
- return (Mailbox)mailboxes.get(index);
- }
-
- /**
- * Dumps a representation of this mailbox list to
- * stdout, for debugging purposes.
- */
- public void print() {
- for (int i = 0; i < size(); i++) {
- Mailbox mailbox = get(i);
- System.out.println(mailbox.toString());
- }
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/NamedMailbox.java b/emailcommon/src/org/apache/james/mime4j/field/address/NamedMailbox.java
deleted file mode 100644
index a54bd1dad..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/NamedMailbox.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field.address;
-
-/**
- * A Mailbox that has a name/description.
- *
- *
- */
-public class NamedMailbox extends Mailbox {
- private String name;
-
- /**
- * @see Mailbox#Mailbox(String, String)
- */
- public NamedMailbox(String name, String localPart, String domain) {
- super(localPart, domain);
- this.name = name;
- }
-
- /**
- * @see Mailbox#Mailbox(DomainList, String, String)
- */
- public NamedMailbox(String name, DomainList route, String localPart, String domain) {
- super(route, localPart, domain);
- this.name = name;
- }
-
- /**
- * Creates a named mailbox based on an unnamed mailbox.
- */
- public NamedMailbox(String name, Mailbox baseMailbox) {
- super(baseMailbox.getRoute(), baseMailbox.getLocalPart(), baseMailbox.getDomain());
- this.name = name;
- }
-
- /**
- * Returns the name of the mailbox.
- */
- public String getName() {
- return this.name;
- }
-
- /**
- * Same features (or problems) as Mailbox.getAddressString(boolean),
- * only more so.
- *
- * @see Mailbox#getAddressString(boolean)
- */
- @Override
- public String getAddressString(boolean includeRoute) {
- return (name == null ? "" : name + " ") + super.getAddressString(includeRoute);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTaddr_spec.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTaddr_spec.java
deleted file mode 100644
index 4d56d000b..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTaddr_spec.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTaddr_spec.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTaddr_spec extends SimpleNode {
- public ASTaddr_spec(int id) {
- super(id);
- }
-
- public ASTaddr_spec(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTaddress.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTaddress.java
deleted file mode 100644
index 47bdeda8e..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTaddress.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTaddress.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTaddress extends SimpleNode {
- public ASTaddress(int id) {
- super(id);
- }
-
- public ASTaddress(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTaddress_list.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTaddress_list.java
deleted file mode 100644
index 737840e38..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTaddress_list.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTaddress_list.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTaddress_list extends SimpleNode {
- public ASTaddress_list(int id) {
- super(id);
- }
-
- public ASTaddress_list(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTangle_addr.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTangle_addr.java
deleted file mode 100644
index 8cb8f421f..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTangle_addr.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTangle_addr.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTangle_addr extends SimpleNode {
- public ASTangle_addr(int id) {
- super(id);
- }
-
- public ASTangle_addr(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTdomain.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTdomain.java
deleted file mode 100644
index b52664386..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTdomain.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTdomain.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTdomain extends SimpleNode {
- public ASTdomain(int id) {
- super(id);
- }
-
- public ASTdomain(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTgroup_body.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTgroup_body.java
deleted file mode 100644
index f6017b9fc..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTgroup_body.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTgroup_body.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTgroup_body extends SimpleNode {
- public ASTgroup_body(int id) {
- super(id);
- }
-
- public ASTgroup_body(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTlocal_part.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTlocal_part.java
deleted file mode 100644
index 5c244fa3e..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTlocal_part.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTlocal_part.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTlocal_part extends SimpleNode {
- public ASTlocal_part(int id) {
- super(id);
- }
-
- public ASTlocal_part(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTmailbox.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTmailbox.java
deleted file mode 100644
index aeb469da1..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTmailbox.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTmailbox.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTmailbox extends SimpleNode {
- public ASTmailbox(int id) {
- super(id);
- }
-
- public ASTmailbox(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTname_addr.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTname_addr.java
deleted file mode 100644
index 846c73167..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTname_addr.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTname_addr.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTname_addr extends SimpleNode {
- public ASTname_addr(int id) {
- super(id);
- }
-
- public ASTname_addr(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTphrase.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTphrase.java
deleted file mode 100644
index 7d711c529..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTphrase.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTphrase.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTphrase extends SimpleNode {
- public ASTphrase(int id) {
- super(id);
- }
-
- public ASTphrase(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTroute.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTroute.java
deleted file mode 100644
index 54ea11523..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ASTroute.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTroute.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTroute extends SimpleNode {
- public ASTroute(int id) {
- super(id);
- }
-
- public ASTroute(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParser.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParser.java
deleted file mode 100644
index dde2a0892..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParser.java
+++ /dev/null
@@ -1,977 +0,0 @@
-/* Generated By:JJTree&JavaCC: Do not edit this line. AddressListParser.java */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.address.parser;
-
-public class AddressListParser/*@bgen(jjtree)*/implements AddressListParserTreeConstants, AddressListParserConstants {/*@bgen(jjtree)*/
- protected JJTAddressListParserState jjtree = new JJTAddressListParserState();public static void main(String args[]) throws ParseException {
- while (true) {
- try {
- AddressListParser parser = new AddressListParser(System.in);
- parser.parseLine();
- ((SimpleNode)parser.jjtree.rootNode()).dump("> ");
- } catch (Exception x) {
- x.printStackTrace();
- return;
- }
- }
- }
-
- private static void log(String msg) {
- System.out.print(msg);
- }
-
- public ASTaddress_list parse() throws ParseException {
- try {
- parseAll();
- return (ASTaddress_list)jjtree.rootNode();
- } catch (TokenMgrError tme) {
- throw new ParseException(tme.getMessage());
- }
- }
-
-
- void jjtreeOpenNodeScope(Node n) {
- ((SimpleNode)n).firstToken = getToken(1);
- }
-
- void jjtreeCloseNodeScope(Node n) {
- ((SimpleNode)n).lastToken = getToken(0);
- }
-
- final public void parseLine() throws ParseException {
- address_list();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 1:
- jj_consume_token(1);
- break;
- default:
- jj_la1[0] = jj_gen;
- ;
- }
- jj_consume_token(2);
- }
-
- final public void parseAll() throws ParseException {
- address_list();
- jj_consume_token(0);
- }
-
- final public void address_list() throws ParseException {
- /*@bgen(jjtree) address_list */
- ASTaddress_list jjtn000 = new ASTaddress_list(JJTADDRESS_LIST);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 6:
- case DOTATOM:
- case QUOTEDSTRING:
- address();
- break;
- default:
- jj_la1[1] = jj_gen;
- ;
- }
- label_1:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 3:
- ;
- break;
- default:
- jj_la1[2] = jj_gen;
- break label_1;
- }
- jj_consume_token(3);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 6:
- case DOTATOM:
- case QUOTEDSTRING:
- address();
- break;
- default:
- jj_la1[3] = jj_gen;
- ;
- }
- }
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void address() throws ParseException {
- /*@bgen(jjtree) address */
- ASTaddress jjtn000 = new ASTaddress(JJTADDRESS);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- if (jj_2_1(2147483647)) {
- addr_spec();
- } else {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 6:
- angle_addr();
- break;
- case DOTATOM:
- case QUOTEDSTRING:
- phrase();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 4:
- group_body();
- break;
- case 6:
- angle_addr();
- break;
- default:
- jj_la1[4] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- break;
- default:
- jj_la1[5] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void mailbox() throws ParseException {
- /*@bgen(jjtree) mailbox */
- ASTmailbox jjtn000 = new ASTmailbox(JJTMAILBOX);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- if (jj_2_2(2147483647)) {
- addr_spec();
- } else {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 6:
- angle_addr();
- break;
- case DOTATOM:
- case QUOTEDSTRING:
- name_addr();
- break;
- default:
- jj_la1[6] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void name_addr() throws ParseException {
- /*@bgen(jjtree) name_addr */
- ASTname_addr jjtn000 = new ASTname_addr(JJTNAME_ADDR);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- phrase();
- angle_addr();
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void group_body() throws ParseException {
- /*@bgen(jjtree) group_body */
- ASTgroup_body jjtn000 = new ASTgroup_body(JJTGROUP_BODY);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- jj_consume_token(4);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 6:
- case DOTATOM:
- case QUOTEDSTRING:
- mailbox();
- break;
- default:
- jj_la1[7] = jj_gen;
- ;
- }
- label_2:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 3:
- ;
- break;
- default:
- jj_la1[8] = jj_gen;
- break label_2;
- }
- jj_consume_token(3);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 6:
- case DOTATOM:
- case QUOTEDSTRING:
- mailbox();
- break;
- default:
- jj_la1[9] = jj_gen;
- ;
- }
- }
- jj_consume_token(5);
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void angle_addr() throws ParseException {
- /*@bgen(jjtree) angle_addr */
- ASTangle_addr jjtn000 = new ASTangle_addr(JJTANGLE_ADDR);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- jj_consume_token(6);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 8:
- route();
- break;
- default:
- jj_la1[10] = jj_gen;
- ;
- }
- addr_spec();
- jj_consume_token(7);
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void route() throws ParseException {
- /*@bgen(jjtree) route */
- ASTroute jjtn000 = new ASTroute(JJTROUTE);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- jj_consume_token(8);
- domain();
- label_3:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 3:
- case 8:
- ;
- break;
- default:
- jj_la1[11] = jj_gen;
- break label_3;
- }
- label_4:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 3:
- ;
- break;
- default:
- jj_la1[12] = jj_gen;
- break label_4;
- }
- jj_consume_token(3);
- }
- jj_consume_token(8);
- domain();
- }
- jj_consume_token(4);
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void phrase() throws ParseException {
- /*@bgen(jjtree) phrase */
- ASTphrase jjtn000 = new ASTphrase(JJTPHRASE);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- label_5:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DOTATOM:
- jj_consume_token(DOTATOM);
- break;
- case QUOTEDSTRING:
- jj_consume_token(QUOTEDSTRING);
- break;
- default:
- jj_la1[13] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DOTATOM:
- case QUOTEDSTRING:
- ;
- break;
- default:
- jj_la1[14] = jj_gen;
- break label_5;
- }
- }
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void addr_spec() throws ParseException {
- /*@bgen(jjtree) addr_spec */
- ASTaddr_spec jjtn000 = new ASTaddr_spec(JJTADDR_SPEC);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- local_part();
- jj_consume_token(8);
- domain();
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void local_part() throws ParseException {
- /*@bgen(jjtree) local_part */
- ASTlocal_part jjtn000 = new ASTlocal_part(JJTLOCAL_PART);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);Token t;
- try {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DOTATOM:
- t = jj_consume_token(DOTATOM);
- break;
- case QUOTEDSTRING:
- t = jj_consume_token(QUOTEDSTRING);
- break;
- default:
- jj_la1[15] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- label_6:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 9:
- case DOTATOM:
- case QUOTEDSTRING:
- ;
- break;
- default:
- jj_la1[16] = jj_gen;
- break label_6;
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 9:
- t = jj_consume_token(9);
- break;
- default:
- jj_la1[17] = jj_gen;
- ;
- }
- if (t.image.charAt(t.image.length() - 1) != '.' || t.kind == AddressListParserConstants.QUOTEDSTRING)
- {if (true) throw new ParseException("Words in local part must be separated by '.'");}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DOTATOM:
- t = jj_consume_token(DOTATOM);
- break;
- case QUOTEDSTRING:
- t = jj_consume_token(QUOTEDSTRING);
- break;
- default:
- jj_la1[18] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void domain() throws ParseException {
- /*@bgen(jjtree) domain */
- ASTdomain jjtn000 = new ASTdomain(JJTDOMAIN);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);Token t;
- try {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DOTATOM:
- t = jj_consume_token(DOTATOM);
- label_7:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 9:
- case DOTATOM:
- ;
- break;
- default:
- jj_la1[19] = jj_gen;
- break label_7;
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 9:
- t = jj_consume_token(9);
- break;
- default:
- jj_la1[20] = jj_gen;
- ;
- }
- if (t.image.charAt(t.image.length() - 1) != '.')
- {if (true) throw new ParseException("Atoms in domain names must be separated by '.'");}
- t = jj_consume_token(DOTATOM);
- }
- break;
- case DOMAINLITERAL:
- jj_consume_token(DOMAINLITERAL);
- break;
- default:
- jj_la1[21] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final private boolean jj_2_1(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_1(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(0, xla); }
- }
-
- final private boolean jj_2_2(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_2(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(1, xla); }
- }
-
- final private boolean jj_3R_11() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(9)) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(14)) {
- jj_scanpos = xsp;
- if (jj_scan_token(31)) return true;
- }
- return false;
- }
-
- final private boolean jj_3R_13() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(9)) jj_scanpos = xsp;
- if (jj_scan_token(DOTATOM)) return true;
- return false;
- }
-
- final private boolean jj_3R_8() {
- if (jj_3R_9()) return true;
- if (jj_scan_token(8)) return true;
- if (jj_3R_10()) return true;
- return false;
- }
-
- final private boolean jj_3_1() {
- if (jj_3R_8()) return true;
- return false;
- }
-
- final private boolean jj_3R_12() {
- if (jj_scan_token(DOTATOM)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_13()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- final private boolean jj_3R_10() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_12()) {
- jj_scanpos = xsp;
- if (jj_scan_token(18)) return true;
- }
- return false;
- }
-
- final private boolean jj_3_2() {
- if (jj_3R_8()) return true;
- return false;
- }
-
- final private boolean jj_3R_9() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(14)) {
- jj_scanpos = xsp;
- if (jj_scan_token(31)) return true;
- }
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_11()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- public AddressListParserTokenManager token_source;
- SimpleCharStream jj_input_stream;
- public Token token, jj_nt;
- private int jj_ntk;
- private Token jj_scanpos, jj_lastpos;
- private int jj_la;
- public boolean lookingAhead = false;
- private boolean jj_semLA;
- private int jj_gen;
- final private int[] jj_la1 = new int[22];
- static private int[] jj_la1_0;
- static private int[] jj_la1_1;
- static {
- jj_la1_0();
- jj_la1_1();
- }
- private static void jj_la1_0() {
- jj_la1_0 = new int[] {0x2,0x80004040,0x8,0x80004040,0x50,0x80004040,0x80004040,0x80004040,0x8,0x80004040,0x100,0x108,0x8,0x80004000,0x80004000,0x80004000,0x80004200,0x200,0x80004000,0x4200,0x200,0x44000,};
- }
- private static void jj_la1_1() {
- jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
- }
- final private JJCalls[] jj_2_rtns = new JJCalls[2];
- private boolean jj_rescan = false;
- private int jj_gc = 0;
-
- public AddressListParser(java.io.InputStream stream) {
- this(stream, null);
- }
- public AddressListParser(java.io.InputStream stream, String encoding) {
- try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
- token_source = new AddressListParserTokenManager(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 22; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- public void ReInit(java.io.InputStream stream) {
- ReInit(stream, null);
- }
- public void ReInit(java.io.InputStream stream, String encoding) {
- try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
- token_source.ReInit(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jjtree.reset();
- jj_gen = 0;
- for (int i = 0; i < 22; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- public AddressListParser(java.io.Reader stream) {
- jj_input_stream = new SimpleCharStream(stream, 1, 1);
- token_source = new AddressListParserTokenManager(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 22; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- public void ReInit(java.io.Reader stream) {
- jj_input_stream.ReInit(stream, 1, 1);
- token_source.ReInit(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jjtree.reset();
- jj_gen = 0;
- for (int i = 0; i < 22; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- public AddressListParser(AddressListParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 22; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- public void ReInit(AddressListParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jjtree.reset();
- jj_gen = 0;
- for (int i = 0; i < 22; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- final private Token jj_consume_token(int kind) throws ParseException {
- Token oldToken;
- if ((oldToken = token).next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- if (token.kind == kind) {
- jj_gen++;
- if (++jj_gc > 100) {
- jj_gc = 0;
- for (int i = 0; i < jj_2_rtns.length; i++) {
- JJCalls c = jj_2_rtns[i];
- while (c != null) {
- if (c.gen < jj_gen) c.first = null;
- c = c.next;
- }
- }
- }
- return token;
- }
- token = oldToken;
- jj_kind = kind;
- throw generateParseException();
- }
-
- static private final class LookaheadSuccess extends java.lang.Error { }
- final private LookaheadSuccess jj_ls = new LookaheadSuccess();
- final private boolean jj_scan_token(int kind) {
- if (jj_scanpos == jj_lastpos) {
- jj_la--;
- if (jj_scanpos.next == null) {
- jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
- } else {
- jj_lastpos = jj_scanpos = jj_scanpos.next;
- }
- } else {
- jj_scanpos = jj_scanpos.next;
- }
- if (jj_rescan) {
- int i = 0; Token tok = token;
- while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
- if (tok != null) jj_add_error_token(kind, i);
- }
- if (jj_scanpos.kind != kind) return true;
- if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
- return false;
- }
-
- final public Token getNextToken() {
- if (token.next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- jj_gen++;
- return token;
- }
-
- final public Token getToken(int index) {
- Token t = lookingAhead ? jj_scanpos : token;
- for (int i = 0; i < index; i++) {
- if (t.next != null) t = t.next;
- else t = t.next = token_source.getNextToken();
- }
- return t;
- }
-
- final private int jj_ntk() {
- if ((jj_nt=token.next) == null)
- return (jj_ntk = (token.next=token_source.getNextToken()).kind);
- else
- return (jj_ntk = jj_nt.kind);
- }
-
- private java.util.Vector<int[]> jj_expentries = new java.util.Vector<int[]>();
- private int[] jj_expentry;
- private int jj_kind = -1;
- private int[] jj_lasttokens = new int[100];
- private int jj_endpos;
-
- private void jj_add_error_token(int kind, int pos) {
- if (pos >= 100) return;
- if (pos == jj_endpos + 1) {
- jj_lasttokens[jj_endpos++] = kind;
- } else if (jj_endpos != 0) {
- jj_expentry = new int[jj_endpos];
- for (int i = 0; i < jj_endpos; i++) {
- jj_expentry[i] = jj_lasttokens[i];
- }
- boolean exists = false;
- for (java.util.Enumeration<int[]> e = jj_expentries.elements(); e.hasMoreElements();) {
- int[] oldentry = e.nextElement();
- if (oldentry.length == jj_expentry.length) {
- exists = true;
- for (int i = 0; i < jj_expentry.length; i++) {
- if (oldentry[i] != jj_expentry[i]) {
- exists = false;
- break;
- }
- }
- if (exists) break;
- }
- }
- if (!exists) jj_expentries.addElement(jj_expentry);
- if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
- }
- }
-
- public ParseException generateParseException() {
- jj_expentries.removeAllElements();
- boolean[] la1tokens = new boolean[34];
- for (int i = 0; i < 34; i++) {
- la1tokens[i] = false;
- }
- if (jj_kind >= 0) {
- la1tokens[jj_kind] = true;
- jj_kind = -1;
- }
- for (int i = 0; i < 22; i++) {
- if (jj_la1[i] == jj_gen) {
- for (int j = 0; j < 32; j++) {
- if ((jj_la1_0[i] & (1<<j)) != 0) {
- la1tokens[j] = true;
- }
- if ((jj_la1_1[i] & (1<<j)) != 0) {
- la1tokens[32+j] = true;
- }
- }
- }
- }
- for (int i = 0; i < 34; i++) {
- if (la1tokens[i]) {
- jj_expentry = new int[1];
- jj_expentry[0] = i;
- jj_expentries.addElement(jj_expentry);
- }
- }
- jj_endpos = 0;
- jj_rescan_token();
- jj_add_error_token(0, 0);
- int[][] exptokseq = new int[jj_expentries.size()][];
- for (int i = 0; i < jj_expentries.size(); i++) {
- exptokseq[i] = jj_expentries.elementAt(i);
- }
- return new ParseException(token, exptokseq, tokenImage);
- }
-
- final public void enable_tracing() {
- }
-
- final public void disable_tracing() {
- }
-
- final private void jj_rescan_token() {
- jj_rescan = true;
- for (int i = 0; i < 2; i++) {
- try {
- JJCalls p = jj_2_rtns[i];
- do {
- if (p.gen > jj_gen) {
- jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
- switch (i) {
- case 0: jj_3_1(); break;
- case 1: jj_3_2(); break;
- }
- }
- p = p.next;
- } while (p != null);
- } catch(LookaheadSuccess ls) { }
- }
- jj_rescan = false;
- }
-
- final private void jj_save(int index, int xla) {
- JJCalls p = jj_2_rtns[index];
- while (p.gen > jj_gen) {
- if (p.next == null) { p = p.next = new JJCalls(); break; }
- p = p.next;
- }
- p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
- }
-
- static final class JJCalls {
- int gen;
- Token first;
- int arg;
- JJCalls next;
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParser.jj b/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParser.jj
deleted file mode 100644
index 685988634..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParser.jj
+++ /dev/null
@@ -1,595 +0,0 @@
-/*@bgen(jjtree) Generated By:JJTree: Do not edit this line. /Users/jason/Projects/apache-mime4j-0.3/target/generated-sources/jjtree/org/apache/james/mime4j/field/address/parser/AddressListParser.jj */
-/*@egen*//****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-
-/**
- * RFC2822 address list parser.
- *
- * Created 9/17/2004
- * by Joe Cheng <code@joecheng.com>
- */
-
-options {
- STATIC=false;
- LOOKAHEAD=1;
- //DEBUG_PARSER=true;
- //DEBUG_TOKEN_MANAGER=true;
-}
-
-PARSER_BEGIN(AddressListParser)
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.address.parser;
-
-public class AddressListParser/*@bgen(jjtree)*/implements AddressListParserTreeConstants/*@egen*/ {/*@bgen(jjtree)*/
- protected JJTAddressListParserState jjtree = new JJTAddressListParserState();
-
-/*@egen*/
- public static void main(String args[]) throws ParseException {
- while (true) {
- try {
- AddressListParser parser = new AddressListParser(System.in);
- parser.parseLine();
- ((SimpleNode)parser.jjtree.rootNode()).dump("> ");
- } catch (Exception x) {
- x.printStackTrace();
- return;
- }
- }
- }
-
- private static void log(String msg) {
- System.out.print(msg);
- }
-
- public ASTaddress_list parse() throws ParseException {
- try {
- parseAll();
- return (ASTaddress_list)jjtree.rootNode();
- } catch (TokenMgrError tme) {
- throw new ParseException(tme.getMessage());
- }
- }
-
-
- void jjtreeOpenNodeScope(Node n) {
- ((SimpleNode)n).firstToken = getToken(1);
- }
-
- void jjtreeCloseNodeScope(Node n) {
- ((SimpleNode)n).lastToken = getToken(0);
- }
-}
-
-PARSER_END(AddressListParser)
-
-void parseLine() :
-{}
-{
- address_list() ["\r"] "\n"
-}
-
-void parseAll() :
-{}
-{
- address_list() <EOF>
-}
-
-void address_list() :
-{/*@bgen(jjtree) address_list */
- ASTaddress_list jjtn000 = new ASTaddress_list(JJTADDRESS_LIST);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) address_list */
- try {
-/*@egen*/
- [ address() ]
- (
- ","
- [ address() ]
- )*/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void address() :
-{/*@bgen(jjtree) address */
- ASTaddress jjtn000 = new ASTaddress(JJTADDRESS);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) address */
- try {
-/*@egen*/
- LOOKAHEAD(2147483647)
- addr_spec()
-| angle_addr()
-| ( phrase() (group_body() | angle_addr()) )/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void mailbox() :
-{/*@bgen(jjtree) mailbox */
- ASTmailbox jjtn000 = new ASTmailbox(JJTMAILBOX);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) mailbox */
- try {
-/*@egen*/
- LOOKAHEAD(2147483647)
- addr_spec()
-| angle_addr()
-| name_addr()/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void name_addr() :
-{/*@bgen(jjtree) name_addr */
- ASTname_addr jjtn000 = new ASTname_addr(JJTNAME_ADDR);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) name_addr */
- try {
-/*@egen*/
- phrase() angle_addr()/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void group_body() :
-{/*@bgen(jjtree) group_body */
- ASTgroup_body jjtn000 = new ASTgroup_body(JJTGROUP_BODY);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) group_body */
- try {
-/*@egen*/
- ":"
- [ mailbox() ]
- (
- ","
- [ mailbox() ]
- )*
- ";"/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void angle_addr() :
-{/*@bgen(jjtree) angle_addr */
- ASTangle_addr jjtn000 = new ASTangle_addr(JJTANGLE_ADDR);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) angle_addr */
- try {
-/*@egen*/
- "<" [ route() ] addr_spec() ">"/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void route() :
-{/*@bgen(jjtree) route */
- ASTroute jjtn000 = new ASTroute(JJTROUTE);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) route */
- try {
-/*@egen*/
- "@" domain() ( (",")* "@" domain() )* ":"/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void phrase() :
-{/*@bgen(jjtree) phrase */
- ASTphrase jjtn000 = new ASTphrase(JJTPHRASE);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) phrase */
-try {
-/*@egen*/
-( <DOTATOM>
-| <QUOTEDSTRING>
-)+/*@bgen(jjtree)*/
-} finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
-}
-/*@egen*/
-}
-
-void addr_spec() :
-{/*@bgen(jjtree) addr_spec */
- ASTaddr_spec jjtn000 = new ASTaddr_spec(JJTADDR_SPEC);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) addr_spec */
- try {
-/*@egen*/
- ( local_part() "@" domain() )/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void local_part() :
-{/*@bgen(jjtree) local_part */
- ASTlocal_part jjtn000 = new ASTlocal_part(JJTLOCAL_PART);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/ Token t; }
-{/*@bgen(jjtree) local_part */
- try {
-/*@egen*/
- ( t=<DOTATOM> | t=<QUOTEDSTRING> )
- ( [t="."]
- {
- if (t.image.charAt(t.image.length() - 1) != '.' || t.kind == AddressListParserConstants.QUOTEDSTRING)
- throw new ParseException("Words in local part must be separated by '.'");
- }
- ( t=<DOTATOM> | t=<QUOTEDSTRING> )
- )*/*@bgen(jjtree)*/
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void domain() :
-{/*@bgen(jjtree) domain */
- ASTdomain jjtn000 = new ASTdomain(JJTDOMAIN);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/ Token t; }
-{/*@bgen(jjtree) domain */
- try {
-/*@egen*/
- ( t=<DOTATOM>
- ( [t="."]
- {
- if (t.image.charAt(t.image.length() - 1) != '.')
- throw new ParseException("Atoms in domain names must be separated by '.'");
- }
- t=<DOTATOM>
- )*
- )
-| <DOMAINLITERAL>/*@bgen(jjtree)*/
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-SPECIAL_TOKEN :
-{
- < WS: ( [" ", "\t"] )+ >
-}
-
-TOKEN :
-{
- < #ALPHA: ["a" - "z", "A" - "Z"] >
-| < #DIGIT: ["0" - "9"] >
-| < #ATEXT: ( <ALPHA> | <DIGIT>
- | "!" | "#" | "$" | "%"
- | "&" | "'" | "*" | "+"
- | "-" | "/" | "=" | "?"
- | "^" | "_" | "`" | "{"
- | "|" | "}" | "~"
- )>
-| < DOTATOM: <ATEXT> ( <ATEXT> | "." )* >
-}
-
-TOKEN_MGR_DECLS :
-{
- // Keeps track of how many levels of comment nesting
- // we've encountered. This is only used when the 2nd
- // level is reached, for example ((this)), not (this).
- // This is because the outermost level must be treated
- // specially anyway, because the outermost ")" has a
- // different token type than inner ")" instances.
- static int commentNest;
-}
-
-MORE :
-{
- // domain literal
- "[" : INDOMAINLITERAL
-}
-
-<INDOMAINLITERAL>
-MORE :
-{
- < <QUOTEDPAIR>> { image.deleteCharAt(image.length() - 2); }
-| < ~["[", "]", "\\"] >
-}
-
-<INDOMAINLITERAL>
-TOKEN :
-{
- < DOMAINLITERAL: "]" > { matchedToken.image = image.toString(); }: DEFAULT
-}
-
-MORE :
-{
- // starts a comment
- "(" : INCOMMENT
-}
-
-<INCOMMENT>
-SKIP :
-{
- // ends a comment
- < COMMENT: ")" > : DEFAULT
- // if this is ever changed to not be a SKIP, need
- // to make sure matchedToken.token = token.toString()
- // is called.
-}
-
-<INCOMMENT>
-MORE :
-{
- < <QUOTEDPAIR>> { image.deleteCharAt(image.length() - 2); }
-| "(" { commentNest = 1; } : NESTED_COMMENT
-| < <ANY>>
-}
-
-<NESTED_COMMENT>
-MORE :
-{
- < <QUOTEDPAIR>> { image.deleteCharAt(image.length() - 2); }
-| "(" { ++commentNest; }
-| ")" { --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT); }
-| < <ANY>>
-}
-
-
-// QUOTED STRINGS
-
-MORE :
-{
- "\"" { image.deleteCharAt(image.length() - 1); } : INQUOTEDSTRING
-}
-
-<INQUOTEDSTRING>
-MORE :
-{
- < <QUOTEDPAIR>> { image.deleteCharAt(image.length() - 2); }
-| < (~["\"", "\\"])+ >
-}
-
-<INQUOTEDSTRING>
-TOKEN :
-{
- < QUOTEDSTRING: "\"" > { matchedToken.image = image.substring(0, image.length() - 1); } : DEFAULT
-}
-
-// GLOBALS
-
-<*>
-TOKEN :
-{
- < #QUOTEDPAIR: "\\" <ANY> >
-| < #ANY: ~[] >
-}
-
-// ERROR!
-/*
-
-<*>
-TOKEN :
-{
- < UNEXPECTED_CHAR: <ANY> >
-}
-
-*/ \ No newline at end of file
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserConstants.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserConstants.java
deleted file mode 100644
index a21ad35db..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserConstants.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/* Generated By:JJTree&JavaCC: Do not edit this line. AddressListParserConstants.java */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.address.parser;
-
-public interface AddressListParserConstants {
-
- int EOF = 0;
- int WS = 10;
- int ALPHA = 11;
- int DIGIT = 12;
- int ATEXT = 13;
- int DOTATOM = 14;
- int DOMAINLITERAL = 18;
- int COMMENT = 20;
- int QUOTEDSTRING = 31;
- int QUOTEDPAIR = 32;
- int ANY = 33;
-
- int DEFAULT = 0;
- int INDOMAINLITERAL = 1;
- int INCOMMENT = 2;
- int NESTED_COMMENT = 3;
- int INQUOTEDSTRING = 4;
-
- String[] tokenImage = {
- "<EOF>",
- "\"\\r\"",
- "\"\\n\"",
- "\",\"",
- "\":\"",
- "\";\"",
- "\"<\"",
- "\">\"",
- "\"@\"",
- "\".\"",
- "<WS>",
- "<ALPHA>",
- "<DIGIT>",
- "<ATEXT>",
- "<DOTATOM>",
- "\"[\"",
- "<token of kind 16>",
- "<token of kind 17>",
- "\"]\"",
- "\"(\"",
- "\")\"",
- "<token of kind 21>",
- "\"(\"",
- "<token of kind 23>",
- "<token of kind 24>",
- "\"(\"",
- "\")\"",
- "<token of kind 27>",
- "\"\\\"\"",
- "<token of kind 29>",
- "<token of kind 30>",
- "\"\\\"\"",
- "<QUOTEDPAIR>",
- "<ANY>",
- };
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserTokenManager.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserTokenManager.java
deleted file mode 100644
index df8974a3b..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserTokenManager.java
+++ /dev/null
@@ -1,1009 +0,0 @@
-/* Generated By:JJTree&JavaCC: Do not edit this line. AddressListParserTokenManager.java */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.address.parser;
-
-public class AddressListParserTokenManager implements AddressListParserConstants
-{
- // Keeps track of how many levels of comment nesting
- // we've encountered. This is only used when the 2nd
- // level is reached, for example ((this)), not (this).
- // This is because the outermost level must be treated
- // specially anyway, because the outermost ")" has a
- // different token type than inner ")" instances.
- static int commentNest;
- public java.io.PrintStream debugStream = System.out;
- public void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_0(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_0(int pos, long active0)
-{
- return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
-}
-private final int jjStopAtPos(int pos, int kind)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- return pos + 1;
-}
-private final int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_0(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_0()
-{
- switch(curChar)
- {
- case 10:
- return jjStopAtPos(0, 2);
- case 13:
- return jjStopAtPos(0, 1);
- case 34:
- return jjStopAtPos(0, 28);
- case 40:
- return jjStopAtPos(0, 19);
- case 44:
- return jjStopAtPos(0, 3);
- case 46:
- return jjStopAtPos(0, 9);
- case 58:
- return jjStopAtPos(0, 4);
- case 59:
- return jjStopAtPos(0, 5);
- case 60:
- return jjStopAtPos(0, 6);
- case 62:
- return jjStopAtPos(0, 7);
- case 64:
- return jjStopAtPos(0, 8);
- case 91:
- return jjStopAtPos(0, 15);
- default :
- return jjMoveNfa_0(1, 0);
- }
-}
-private final void jjCheckNAdd(int state)
-{
- if (jjrounds[state] != jjround)
- {
- jjstateSet[jjnewStateCnt++] = state;
- jjrounds[state] = jjround;
- }
-}
-private final void jjAddStates(int start, int end)
-{
- do {
- jjstateSet[jjnewStateCnt++] = jjnextStates[start];
- } while (start++ != end);
-}
-private final void jjCheckNAddTwoStates(int state1, int state2)
-{
- jjCheckNAdd(state1);
- jjCheckNAdd(state2);
-}
-private final void jjCheckNAddStates(int start, int end)
-{
- do {
- jjCheckNAdd(jjnextStates[start]);
- } while (start++ != end);
-}
-private final void jjCheckNAddStates(int start)
-{
- jjCheckNAdd(jjnextStates[start]);
- jjCheckNAdd(jjnextStates[start + 1]);
-}
-private final int jjMoveNfa_0(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 1:
- if ((0xa3ffacfa00000000L & l) != 0L)
- {
- if (kind > 14)
- kind = 14;
- jjCheckNAdd(2);
- }
- else if ((0x100000200L & l) != 0L)
- {
- if (kind > 10)
- kind = 10;
- jjCheckNAdd(0);
- }
- break;
- case 0:
- if ((0x100000200L & l) == 0L)
- break;
- kind = 10;
- jjCheckNAdd(0);
- break;
- case 2:
- if ((0xa3ffecfa00000000L & l) == 0L)
- break;
- if (kind > 14)
- kind = 14;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 1:
- case 2:
- if ((0x7fffffffc7fffffeL & l) == 0L)
- break;
- if (kind > 14)
- kind = 14;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_2(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_2(int pos, long active0)
-{
- return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_2(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_2(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_2()
-{
- switch(curChar)
- {
- case 40:
- return jjStopAtPos(0, 22);
- case 41:
- return jjStopAtPos(0, 20);
- default :
- return jjMoveNfa_2(0, 0);
- }
-}
-static final long[] jjbitVec0 = {
- 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-private final int jjMoveNfa_2(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 23)
- kind = 23;
- break;
- case 1:
- if (kind > 21)
- kind = 21;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 23)
- kind = 23;
- if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 21)
- kind = 21;
- break;
- case 2:
- if (kind > 23)
- kind = 23;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 23)
- kind = 23;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 21)
- kind = 21;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_4(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_4(int pos, long active0)
-{
- return jjMoveNfa_4(jjStopStringLiteralDfa_4(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_4(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_4(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_4()
-{
- switch(curChar)
- {
- case 34:
- return jjStopAtPos(0, 31);
- default :
- return jjMoveNfa_4(0, 0);
- }
-}
-private final int jjMoveNfa_4(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- case 2:
- if ((0xfffffffbffffffffL & l) == 0L)
- break;
- if (kind > 30)
- kind = 30;
- jjCheckNAdd(2);
- break;
- case 1:
- if (kind > 29)
- kind = 29;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((0xffffffffefffffffL & l) != 0L)
- {
- if (kind > 30)
- kind = 30;
- jjCheckNAdd(2);
- }
- else if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 29)
- kind = 29;
- break;
- case 2:
- if ((0xffffffffefffffffL & l) == 0L)
- break;
- if (kind > 30)
- kind = 30;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- case 2:
- if ((jjbitVec0[i2] & l2) == 0L)
- break;
- if (kind > 30)
- kind = 30;
- jjCheckNAdd(2);
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 29)
- kind = 29;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_3(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_3(int pos, long active0)
-{
- return jjMoveNfa_3(jjStopStringLiteralDfa_3(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_3(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_3(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_3()
-{
- switch(curChar)
- {
- case 40:
- return jjStopAtPos(0, 25);
- case 41:
- return jjStopAtPos(0, 26);
- default :
- return jjMoveNfa_3(0, 0);
- }
-}
-private final int jjMoveNfa_3(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 27)
- kind = 27;
- break;
- case 1:
- if (kind > 24)
- kind = 24;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 27)
- kind = 27;
- if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 24)
- kind = 24;
- break;
- case 2:
- if (kind > 27)
- kind = 27;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 27)
- kind = 27;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 24)
- kind = 24;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_1(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_1(int pos, long active0)
-{
- return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_1(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_1(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_1()
-{
- switch(curChar)
- {
- case 93:
- return jjStopAtPos(0, 18);
- default :
- return jjMoveNfa_1(0, 0);
- }
-}
-private final int jjMoveNfa_1(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 17)
- kind = 17;
- break;
- case 1:
- if (kind > 16)
- kind = 16;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((0xffffffffc7ffffffL & l) != 0L)
- {
- if (kind > 17)
- kind = 17;
- }
- else if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 16)
- kind = 16;
- break;
- case 2:
- if ((0xffffffffc7ffffffL & l) != 0L && kind > 17)
- kind = 17;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 17)
- kind = 17;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 16)
- kind = 16;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-static final int[] jjnextStates = {
-};
-public static final String[] jjstrLiteralImages = {
-"", "\15", "\12", "\54", "\72", "\73", "\74", "\76", "\100", "\56", null, null,
-null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-null, null, null, null, null, null, null, null, };
-public static final String[] lexStateNames = {
- "DEFAULT",
- "INDOMAINLITERAL",
- "INCOMMENT",
- "NESTED_COMMENT",
- "INQUOTEDSTRING",
-};
-public static final int[] jjnewLexState = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 0, 2, 0, -1, 3, -1, -1,
- -1, -1, -1, 4, -1, -1, 0, -1, -1,
-};
-static final long[] jjtoToken = {
- 0x800443ffL,
-};
-static final long[] jjtoSkip = {
- 0x100400L,
-};
-static final long[] jjtoSpecial = {
- 0x400L,
-};
-static final long[] jjtoMore = {
- 0x7feb8000L,
-};
-protected SimpleCharStream input_stream;
-private final int[] jjrounds = new int[3];
-private final int[] jjstateSet = new int[6];
-StringBuffer image;
-int jjimageLen;
-int lengthOfMatch;
-protected char curChar;
-public AddressListParserTokenManager(SimpleCharStream stream){
- if (SimpleCharStream.staticFlag)
- throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
- input_stream = stream;
-}
-public AddressListParserTokenManager(SimpleCharStream stream, int lexState){
- this(stream);
- SwitchTo(lexState);
-}
-public void ReInit(SimpleCharStream stream)
-{
- jjmatchedPos = jjnewStateCnt = 0;
- curLexState = defaultLexState;
- input_stream = stream;
- ReInitRounds();
-}
-private final void ReInitRounds()
-{
- int i;
- jjround = 0x80000001;
- for (i = 3; i-- > 0;)
- jjrounds[i] = 0x80000000;
-}
-public void ReInit(SimpleCharStream stream, int lexState)
-{
- ReInit(stream);
- SwitchTo(lexState);
-}
-public void SwitchTo(int lexState)
-{
- if (lexState >= 5 || lexState < 0)
- throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
- else
- curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
- Token t = Token.newToken(jjmatchedKind);
- t.kind = jjmatchedKind;
- String im = jjstrLiteralImages[jjmatchedKind];
- t.image = (im == null) ? input_stream.GetImage() : im;
- t.beginLine = input_stream.getBeginLine();
- t.beginColumn = input_stream.getBeginColumn();
- t.endLine = input_stream.getEndLine();
- t.endColumn = input_stream.getEndColumn();
- return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-public Token getNextToken()
-{
- int kind;
- Token specialToken = null;
- Token matchedToken;
- int curPos = 0;
-
- EOFLoop :
- for (;;)
- {
- try
- {
- curChar = input_stream.BeginToken();
- }
- catch(java.io.IOException e)
- {
- jjmatchedKind = 0;
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- return matchedToken;
- }
- image = null;
- jjimageLen = 0;
-
- for (;;)
- {
- switch(curLexState)
- {
- case 0:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_0();
- break;
- case 1:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_1();
- break;
- case 2:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_2();
- break;
- case 3:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_3();
- break;
- case 4:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_4();
- break;
- }
- if (jjmatchedKind != 0x7fffffff)
- {
- if (jjmatchedPos + 1 < curPos)
- input_stream.backup(curPos - jjmatchedPos - 1);
- if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- TokenLexicalActions(matchedToken);
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- return matchedToken;
- }
- else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- matchedToken = jjFillToken();
- if (specialToken == null)
- specialToken = matchedToken;
- else
- {
- matchedToken.specialToken = specialToken;
- specialToken = (specialToken.next = matchedToken);
- }
- }
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- continue EOFLoop;
- }
- MoreLexicalActions();
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- curPos = 0;
- jjmatchedKind = 0x7fffffff;
- try {
- curChar = input_stream.readChar();
- continue;
- }
- catch (java.io.IOException e1) { }
- }
- int error_line = input_stream.getEndLine();
- int error_column = input_stream.getEndColumn();
- String error_after = null;
- boolean EOFSeen = false;
- try { input_stream.readChar(); input_stream.backup(1); }
- catch (java.io.IOException e1) {
- EOFSeen = true;
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- if (curChar == '\n' || curChar == '\r') {
- error_line++;
- error_column = 0;
- }
- else
- error_column++;
- }
- if (!EOFSeen) {
- input_stream.backup(1);
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- }
- throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
- }
- }
-}
-
-void MoreLexicalActions()
-{
- jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
- switch(jjmatchedKind)
- {
- case 16 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 21 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 22 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- commentNest = 1;
- break;
- case 24 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 25 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- ++commentNest;
- break;
- case 26 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT);
- break;
- case 28 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 1);
- break;
- case 29 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- default :
- break;
- }
-}
-void TokenLexicalActions(Token matchedToken)
-{
- switch(jjmatchedKind)
- {
- case 18 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
- matchedToken.image = image.toString();
- break;
- case 31 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
- matchedToken.image = image.substring(0, image.length() - 1);
- break;
- default :
- break;
- }
-}
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserTreeConstants.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserTreeConstants.java
deleted file mode 100644
index 5987f19d8..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserTreeConstants.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. /Users/jason/Projects/apache-mime4j-0.3/target/generated-sources/jjtree/org/apache/james/mime4j/field/address/parser/AddressListParserTreeConstants.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public interface AddressListParserTreeConstants
-{
- public int JJTVOID = 0;
- public int JJTADDRESS_LIST = 1;
- public int JJTADDRESS = 2;
- public int JJTMAILBOX = 3;
- public int JJTNAME_ADDR = 4;
- public int JJTGROUP_BODY = 5;
- public int JJTANGLE_ADDR = 6;
- public int JJTROUTE = 7;
- public int JJTPHRASE = 8;
- public int JJTADDR_SPEC = 9;
- public int JJTLOCAL_PART = 10;
- public int JJTDOMAIN = 11;
-
-
- public String[] jjtNodeName = {
- "void",
- "address_list",
- "address",
- "mailbox",
- "name_addr",
- "group_body",
- "angle_addr",
- "route",
- "phrase",
- "addr_spec",
- "local_part",
- "domain",
- };
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserVisitor.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserVisitor.java
deleted file mode 100644
index 8ec2fe7d2..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/AddressListParserVisitor.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. /Users/jason/Projects/apache-mime4j-0.3/target/generated-sources/jjtree/org/apache/james/mime4j/field/address/parser/AddressListParserVisitor.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public interface AddressListParserVisitor
-{
- public Object visit(SimpleNode node, Object data);
- public Object visit(ASTaddress_list node, Object data);
- public Object visit(ASTaddress node, Object data);
- public Object visit(ASTmailbox node, Object data);
- public Object visit(ASTname_addr node, Object data);
- public Object visit(ASTgroup_body node, Object data);
- public Object visit(ASTangle_addr node, Object data);
- public Object visit(ASTroute node, Object data);
- public Object visit(ASTphrase node, Object data);
- public Object visit(ASTaddr_spec node, Object data);
- public Object visit(ASTlocal_part node, Object data);
- public Object visit(ASTdomain node, Object data);
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/BaseNode.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/BaseNode.java
deleted file mode 100644
index 42fe3db0c..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/BaseNode.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field.address.parser;
-
-import org.apache.james.mime4j.field.address.parser.Node;
-import org.apache.james.mime4j.field.address.parser.Token;
-
-public abstract class BaseNode implements Node {
-
- public Token firstToken;
- public Token lastToken;
-
-} \ No newline at end of file
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/JJTAddressListParserState.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/JJTAddressListParserState.java
deleted file mode 100644
index 08b5c5bef..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/JJTAddressListParserState.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. /Users/jason/Projects/apache-mime4j-0.3/target/generated-sources/jjtree/org/apache/james/mime4j/field/address/parser/JJTAddressListParserState.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-class JJTAddressListParserState {
- private java.util.Stack<Node> nodes;
- private java.util.Stack<Integer> marks;
-
- private int sp; // number of nodes on stack
- private int mk; // current mark
- private boolean node_created;
-
- JJTAddressListParserState() {
- nodes = new java.util.Stack<Node>();
- marks = new java.util.Stack<Integer>();
- sp = 0;
- mk = 0;
- }
-
- /* Determines whether the current node was actually closed and
- pushed. This should only be called in the final user action of a
- node scope. */
- boolean nodeCreated() {
- return node_created;
- }
-
- /* Call this to reinitialize the node stack. It is called
- automatically by the parser's ReInit() method. */
- void reset() {
- nodes.removeAllElements();
- marks.removeAllElements();
- sp = 0;
- mk = 0;
- }
-
- /* Returns the root node of the AST. It only makes sense to call
- this after a successful parse. */
- Node rootNode() {
- return nodes.elementAt(0);
- }
-
- /* Pushes a node on to the stack. */
- void pushNode(Node n) {
- nodes.push(n);
- ++sp;
- }
-
- /* Returns the node on the top of the stack, and remove it from the
- stack. */
- Node popNode() {
- if (--sp < mk) {
- mk = marks.pop().intValue();
- }
- return nodes.pop();
- }
-
- /* Returns the node currently on the top of the stack. */
- Node peekNode() {
- return nodes.peek();
- }
-
- /* Returns the number of children on the stack in the current node
- scope. */
- int nodeArity() {
- return sp - mk;
- }
-
-
- void clearNodeScope(Node n) {
- while (sp > mk) {
- popNode();
- }
- mk = marks.pop().intValue();
- }
-
-
- void openNodeScope(Node n) {
- marks.push(new Integer(mk));
- mk = sp;
- n.jjtOpen();
- }
-
-
- /* A definite node is constructed from a specified number of
- children. That number of nodes are popped from the stack and
- made the children of the definite node. Then the definite node
- is pushed on to the stack. */
- void closeNodeScope(Node n, int num) {
- mk = marks.pop().intValue();
- while (num-- > 0) {
- Node c = popNode();
- c.jjtSetParent(n);
- n.jjtAddChild(c, num);
- }
- n.jjtClose();
- pushNode(n);
- node_created = true;
- }
-
-
- /* A conditional node is constructed if its condition is true. All
- the nodes that have been pushed since the node was opened are
- made children of the the conditional node, which is then pushed
- on to the stack. If the condition is false the node is not
- constructed and they are left on the stack. */
- void closeNodeScope(Node n, boolean condition) {
- if (condition) {
- int a = nodeArity();
- mk = marks.pop().intValue();
- while (a-- > 0) {
- Node c = popNode();
- c.jjtSetParent(n);
- n.jjtAddChild(c, a);
- }
- n.jjtClose();
- pushNode(n);
- node_created = true;
- } else {
- mk = marks.pop().intValue();
- node_created = false;
- }
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/Node.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/Node.java
deleted file mode 100644
index 158892016..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/Node.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. Node.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-/* All AST nodes must implement this interface. It provides basic
- machinery for constructing the parent and child relationships
- between nodes. */
-
-public interface Node {
-
- /** This method is called after the node has been made the current
- node. It indicates that child nodes can now be added to it. */
- public void jjtOpen();
-
- /** This method is called after all the child nodes have been
- added. */
- public void jjtClose();
-
- /** This pair of methods are used to inform the node of its
- parent. */
- public void jjtSetParent(Node n);
- public Node jjtGetParent();
-
- /** This method tells the node to add its argument to the node's
- list of children. */
- public void jjtAddChild(Node n, int i);
-
- /** This method returns a child node. The children are numbered
- from zero, left to right. */
- public Node jjtGetChild(int i);
-
- /** Return the number of children the node has. */
- public int jjtGetNumChildren();
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data);
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ParseException.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/ParseException.java
deleted file mode 100644
index 939c6cfed..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/ParseException.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.address.parser;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
-public class ParseException extends Exception {
-
- /**
- * This constructor is used by the method "generateParseException"
- * in the generated parser. Calling this constructor generates
- * a new object of this type with the fields "currentToken",
- * "expectedTokenSequences", and "tokenImage" set. The boolean
- * flag "specialConstructor" is also set to true to indicate that
- * this constructor was used to create this object.
- * This constructor calls its super class with the empty string
- * to force the "toString" method of parent class "Throwable" to
- * print the error message in the form:
- * ParseException: <result of getMessage>
- */
- public ParseException(Token currentTokenVal,
- int[][] expectedTokenSequencesVal,
- String[] tokenImageVal
- )
- {
- super("");
- specialConstructor = true;
- currentToken = currentTokenVal;
- expectedTokenSequences = expectedTokenSequencesVal;
- tokenImage = tokenImageVal;
- }
-
- /**
- * The following constructors are for use by you for whatever
- * purpose you can think of. Constructing the exception in this
- * manner makes the exception behave in the normal way - i.e., as
- * documented in the class "Throwable". The fields "errorToken",
- * "expectedTokenSequences", and "tokenImage" do not contain
- * relevant information. The JavaCC generated code does not use
- * these constructors.
- */
-
- public ParseException() {
- super();
- specialConstructor = false;
- }
-
- public ParseException(String message) {
- super(message);
- specialConstructor = false;
- }
-
- /**
- * This variable determines which constructor was used to create
- * this object and thereby affects the semantics of the
- * "getMessage" method (see below).
- */
- protected boolean specialConstructor;
-
- /**
- * This is the last token that has been consumed successfully. If
- * this object has been created due to a parse error, the token
- * followng this token will (therefore) be the first error token.
- */
- public Token currentToken;
-
- /**
- * Each entry in this array is an array of integers. Each array
- * of integers represents a sequence of tokens (by their ordinal
- * values) that is expected at this point of the parse.
- */
- public int[][] expectedTokenSequences;
-
- /**
- * This is a reference to the "tokenImage" array of the generated
- * parser within which the parse error occurred. This array is
- * defined in the generated ...Constants interface.
- */
- public String[] tokenImage;
-
- /**
- * This method has the standard behavior when this object has been
- * created using the standard constructors. Otherwise, it uses
- * "currentToken" and "expectedTokenSequences" to generate a parse
- * error message and returns it. If this object has been created
- * due to a parse error, and you do not catch it (it gets thrown
- * from the parser), then this method is called during the printing
- * of the final stack trace, and hence the correct error message
- * gets displayed.
- */
- public String getMessage() {
- if (!specialConstructor) {
- return super.getMessage();
- }
- StringBuffer expected = new StringBuffer();
- int maxSize = 0;
- for (int i = 0; i < expectedTokenSequences.length; i++) {
- if (maxSize < expectedTokenSequences[i].length) {
- maxSize = expectedTokenSequences[i].length;
- }
- for (int j = 0; j < expectedTokenSequences[i].length; j++) {
- expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" ");
- }
- if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
- expected.append("...");
- }
- expected.append(eol).append(" ");
- }
- String retval = "Encountered \"";
- Token tok = currentToken.next;
- for (int i = 0; i < maxSize; i++) {
- if (i != 0) retval += " ";
- if (tok.kind == 0) {
- retval += tokenImage[0];
- break;
- }
- retval += add_escapes(tok.image);
- tok = tok.next;
- }
- retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
- retval += "." + eol;
- if (expectedTokenSequences.length == 1) {
- retval += "Was expecting:" + eol + " ";
- } else {
- retval += "Was expecting one of:" + eol + " ";
- }
- retval += expected.toString();
- return retval;
- }
-
- /**
- * The end of line string for this machine.
- */
- protected String eol = System.getProperty("line.separator", "\n");
-
- /**
- * Used to convert raw characters to their escaped version
- * when these raw version cannot be used as part of an ASCII
- * string literal.
- */
- protected String add_escapes(String str) {
- StringBuffer retval = new StringBuffer();
- char ch;
- for (int i = 0; i < str.length(); i++) {
- switch (str.charAt(i))
- {
- case 0 :
- continue;
- case '\b':
- retval.append("\\b");
- continue;
- case '\t':
- retval.append("\\t");
- continue;
- case '\n':
- retval.append("\\n");
- continue;
- case '\f':
- retval.append("\\f");
- continue;
- case '\r':
- retval.append("\\r");
- continue;
- case '\"':
- retval.append("\\\"");
- continue;
- case '\'':
- retval.append("\\\'");
- continue;
- case '\\':
- retval.append("\\\\");
- continue;
- default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
- } else {
- retval.append(ch);
- }
- continue;
- }
- }
- return retval.toString();
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/SimpleCharStream.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/SimpleCharStream.java
deleted file mode 100644
index 957bbeabc..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/SimpleCharStream.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.address.parser;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (without unicode processing).
- */
-
-public class SimpleCharStream
-{
- public static final boolean staticFlag = false;
- int bufsize;
- int available;
- int tokenBegin;
- public int bufpos = -1;
- protected int bufline[];
- protected int bufcolumn[];
-
- protected int column = 0;
- protected int line = 1;
-
- protected boolean prevCharIsCR = false;
- protected boolean prevCharIsLF = false;
-
- protected java.io.Reader inputStream;
-
- protected char[] buffer;
- protected int maxNextCharInd = 0;
- protected int inBuf = 0;
- protected int tabSize = 8;
-
- protected void setTabSize(int i) { tabSize = i; }
- protected int getTabSize(int i) { return tabSize; }
-
-
- protected void ExpandBuff(boolean wrapAround)
- {
- char[] newbuffer = new char[bufsize + 2048];
- int newbufline[] = new int[bufsize + 2048];
- int newbufcolumn[] = new int[bufsize + 2048];
-
- try
- {
- if (wrapAround)
- {
- System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
- System.arraycopy(buffer, 0, newbuffer,
- bufsize - tokenBegin, bufpos);
- buffer = newbuffer;
-
- System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
- System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
- bufline = newbufline;
-
- System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
- System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
- bufcolumn = newbufcolumn;
-
- maxNextCharInd = (bufpos += (bufsize - tokenBegin));
- }
- else
- {
- System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
- buffer = newbuffer;
-
- System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
- bufline = newbufline;
-
- System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
- bufcolumn = newbufcolumn;
-
- maxNextCharInd = (bufpos -= tokenBegin);
- }
- }
- catch (Throwable t)
- {
- throw new Error(t.getMessage());
- }
-
-
- bufsize += 2048;
- available = bufsize;
- tokenBegin = 0;
- }
-
- protected void FillBuff() throws java.io.IOException
- {
- if (maxNextCharInd == available)
- {
- if (available == bufsize)
- {
- if (tokenBegin > 2048)
- {
- bufpos = maxNextCharInd = 0;
- available = tokenBegin;
- }
- else if (tokenBegin < 0)
- bufpos = maxNextCharInd = 0;
- else
- ExpandBuff(false);
- }
- else if (available > tokenBegin)
- available = bufsize;
- else if ((tokenBegin - available) < 2048)
- ExpandBuff(true);
- else
- available = tokenBegin;
- }
-
- int i;
- try {
- if ((i = inputStream.read(buffer, maxNextCharInd,
- available - maxNextCharInd)) == -1)
- {
- inputStream.close();
- throw new java.io.IOException();
- }
- else
- maxNextCharInd += i;
- return;
- }
- catch(java.io.IOException e) {
- --bufpos;
- backup(0);
- if (tokenBegin == -1)
- tokenBegin = bufpos;
- throw e;
- }
- }
-
- public char BeginToken() throws java.io.IOException
- {
- tokenBegin = -1;
- char c = readChar();
- tokenBegin = bufpos;
-
- return c;
- }
-
- protected void UpdateLineColumn(char c)
- {
- column++;
-
- if (prevCharIsLF)
- {
- prevCharIsLF = false;
- line += (column = 1);
- }
- else if (prevCharIsCR)
- {
- prevCharIsCR = false;
- if (c == '\n')
- {
- prevCharIsLF = true;
- }
- else
- line += (column = 1);
- }
-
- switch (c)
- {
- case '\r' :
- prevCharIsCR = true;
- break;
- case '\n' :
- prevCharIsLF = true;
- break;
- case '\t' :
- column--;
- column += (tabSize - (column % tabSize));
- break;
- default :
- break;
- }
-
- bufline[bufpos] = line;
- bufcolumn[bufpos] = column;
- }
-
- public char readChar() throws java.io.IOException
- {
- if (inBuf > 0)
- {
- --inBuf;
-
- if (++bufpos == bufsize)
- bufpos = 0;
-
- return buffer[bufpos];
- }
-
- if (++bufpos >= maxNextCharInd)
- FillBuff();
-
- char c = buffer[bufpos];
-
- UpdateLineColumn(c);
- return (c);
- }
-
- /**
- * @deprecated
- * @see #getEndColumn
- */
-
- public int getColumn() {
- return bufcolumn[bufpos];
- }
-
- /**
- * @deprecated
- * @see #getEndLine
- */
-
- public int getLine() {
- return bufline[bufpos];
- }
-
- public int getEndColumn() {
- return bufcolumn[bufpos];
- }
-
- public int getEndLine() {
- return bufline[bufpos];
- }
-
- public int getBeginColumn() {
- return bufcolumn[tokenBegin];
- }
-
- public int getBeginLine() {
- return bufline[tokenBegin];
- }
-
- public void backup(int amount) {
-
- inBuf += amount;
- if ((bufpos -= amount) < 0)
- bufpos += bufsize;
- }
-
- public SimpleCharStream(java.io.Reader dstream, int startline,
- int startcolumn, int buffersize)
- {
- inputStream = dstream;
- line = startline;
- column = startcolumn - 1;
-
- available = bufsize = buffersize;
- buffer = new char[buffersize];
- bufline = new int[buffersize];
- bufcolumn = new int[buffersize];
- }
-
- public SimpleCharStream(java.io.Reader dstream, int startline,
- int startcolumn)
- {
- this(dstream, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.Reader dstream)
- {
- this(dstream, 1, 1, 4096);
- }
- public void ReInit(java.io.Reader dstream, int startline,
- int startcolumn, int buffersize)
- {
- inputStream = dstream;
- line = startline;
- column = startcolumn - 1;
-
- if (buffer == null || buffersize != buffer.length)
- {
- available = bufsize = buffersize;
- buffer = new char[buffersize];
- bufline = new int[buffersize];
- bufcolumn = new int[buffersize];
- }
- prevCharIsLF = prevCharIsCR = false;
- tokenBegin = inBuf = maxNextCharInd = 0;
- bufpos = -1;
- }
-
- public void ReInit(java.io.Reader dstream, int startline,
- int startcolumn)
- {
- ReInit(dstream, startline, startcolumn, 4096);
- }
-
- public void ReInit(java.io.Reader dstream)
- {
- ReInit(dstream, 1, 1, 4096);
- }
- public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
- {
- this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, int startline,
- int startcolumn, int buffersize)
- {
- this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn) throws java.io.UnsupportedEncodingException
- {
- this(dstream, encoding, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, int startline,
- int startcolumn)
- {
- this(dstream, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
- {
- this(dstream, encoding, 1, 1, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream)
- {
- this(dstream, 1, 1, 4096);
- }
-
- public void ReInit(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
- {
- ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
- }
-
- public void ReInit(java.io.InputStream dstream, int startline,
- int startcolumn, int buffersize)
- {
- ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
- }
-
- public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
- {
- ReInit(dstream, encoding, 1, 1, 4096);
- }
-
- public void ReInit(java.io.InputStream dstream)
- {
- ReInit(dstream, 1, 1, 4096);
- }
- public void ReInit(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn) throws java.io.UnsupportedEncodingException
- {
- ReInit(dstream, encoding, startline, startcolumn, 4096);
- }
- public void ReInit(java.io.InputStream dstream, int startline,
- int startcolumn)
- {
- ReInit(dstream, startline, startcolumn, 4096);
- }
- public String GetImage()
- {
- if (bufpos >= tokenBegin)
- return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
- else
- return new String(buffer, tokenBegin, bufsize - tokenBegin) +
- new String(buffer, 0, bufpos + 1);
- }
-
- public char[] GetSuffix(int len)
- {
- char[] ret = new char[len];
-
- if ((bufpos + 1) >= len)
- System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
- else
- {
- System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
- len - bufpos - 1);
- System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
- }
-
- return ret;
- }
-
- public void Done()
- {
- buffer = null;
- bufline = null;
- bufcolumn = null;
- }
-
- /**
- * Method to adjust line and column numbers for the start of a token.
- */
- public void adjustBeginLineColumn(int newLine, int newCol)
- {
- int start = tokenBegin;
- int len;
-
- if (bufpos >= tokenBegin)
- {
- len = bufpos - tokenBegin + inBuf + 1;
- }
- else
- {
- len = bufsize - tokenBegin + bufpos + 1 + inBuf;
- }
-
- int i = 0, j = 0, k = 0;
- int nextColDiff = 0, columnDiff = 0;
-
- while (i < len &&
- bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
- {
- bufline[j] = newLine;
- nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
- bufcolumn[j] = newCol + columnDiff;
- columnDiff = nextColDiff;
- i++;
- }
-
- if (i < len)
- {
- bufline[j] = newLine++;
- bufcolumn[j] = newCol + columnDiff;
-
- while (i++ < len)
- {
- if (bufline[j = start % bufsize] != bufline[++start % bufsize])
- bufline[j] = newLine++;
- else
- bufline[j] = newLine;
- }
- }
-
- line = bufline[j];
- column = bufcolumn[j];
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/SimpleNode.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/SimpleNode.java
deleted file mode 100644
index 9bf537e60..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/SimpleNode.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. SimpleNode.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class SimpleNode extends org.apache.james.mime4j.field.address.parser.BaseNode implements Node {
- protected Node parent;
- protected Node[] children;
- protected int id;
- protected AddressListParser parser;
-
- public SimpleNode(int i) {
- id = i;
- }
-
- public SimpleNode(AddressListParser p, int i) {
- this(i);
- parser = p;
- }
-
- public void jjtOpen() {
- }
-
- public void jjtClose() {
- }
-
- public void jjtSetParent(Node n) { parent = n; }
- public Node jjtGetParent() { return parent; }
-
- public void jjtAddChild(Node n, int i) {
- if (children == null) {
- children = new Node[i + 1];
- } else if (i >= children.length) {
- Node c[] = new Node[i + 1];
- System.arraycopy(children, 0, c, 0, children.length);
- children = c;
- }
- children[i] = n;
- }
-
- public Node jjtGetChild(int i) {
- return children[i];
- }
-
- public int jjtGetNumChildren() {
- return (children == null) ? 0 : children.length;
- }
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-
- /** Accept the visitor. **/
- public Object childrenAccept(AddressListParserVisitor visitor, Object data) {
- if (children != null) {
- for (int i = 0; i < children.length; ++i) {
- children[i].jjtAccept(visitor, data);
- }
- }
- return data;
- }
-
- /* You can override these two methods in subclasses of SimpleNode to
- customize the way the node appears when the tree is dumped. If
- your output uses more than one line you should override
- toString(String), otherwise overriding toString() is probably all
- you need to do. */
-
- public String toString() { return AddressListParserTreeConstants.jjtNodeName[id]; }
- public String toString(String prefix) { return prefix + toString(); }
-
- /* Override this method if you want to customize how the node dumps
- out its children. */
-
- public void dump(String prefix) {
- System.out.println(toString(prefix));
- if (children != null) {
- for (int i = 0; i < children.length; ++i) {
- SimpleNode n = (SimpleNode)children[i];
- if (n != null) {
- n.dump(prefix + " ");
- }
- }
- }
- }
-}
-
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/Token.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/Token.java
deleted file mode 100644
index 0228aac3e..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/Token.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.address.parser;
-
-/**
- * Describes the input token stream.
- */
-
-public class Token {
-
- /**
- * An integer that describes the kind of this token. This numbering
- * system is determined by JavaCCParser, and a table of these numbers is
- * stored in the file ...Constants.java.
- */
- public int kind;
-
- /**
- * beginLine and beginColumn describe the position of the first character
- * of this token; endLine and endColumn describe the position of the
- * last character of this token.
- */
- public int beginLine, beginColumn, endLine, endColumn;
-
- /**
- * The string image of the token.
- */
- public String image;
-
- /**
- * A reference to the next regular (non-special) token from the input
- * stream. If this is the last token from the input stream, or if the
- * token manager has not read tokens beyond this one, this field is
- * set to null. This is true only if this token is also a regular
- * token. Otherwise, see below for a description of the contents of
- * this field.
- */
- public Token next;
-
- /**
- * This field is used to access special tokens that occur prior to this
- * token, but after the immediately preceding regular (non-special) token.
- * If there are no such special tokens, this field is set to null.
- * When there are more than one such special token, this field refers
- * to the last of these special tokens, which in turn refers to the next
- * previous special token through its specialToken field, and so on
- * until the first special token (whose specialToken field is null).
- * The next fields of special tokens refer to other special tokens that
- * immediately follow it (without an intervening regular token). If there
- * is no such token, this field is null.
- */
- public Token specialToken;
-
- /**
- * Returns the image.
- */
- public String toString()
- {
- return image;
- }
-
- /**
- * Returns a new Token object, by default. However, if you want, you
- * can create and return subclass objects based on the value of ofKind.
- * Simply add the cases to the switch for all those special cases.
- * For example, if you have a subclass of Token called IDToken that
- * you want to create if ofKind is ID, simlpy add something like :
- *
- * case MyParserConstants.ID : return new IDToken();
- *
- * to the following switch statement. Then you can cast matchedToken
- * variable to the appropriate type and use it in your lexical actions.
- */
- public static final Token newToken(int ofKind)
- {
- switch(ofKind)
- {
- default : return new Token();
- }
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/address/parser/TokenMgrError.java b/emailcommon/src/org/apache/james/mime4j/field/address/parser/TokenMgrError.java
deleted file mode 100644
index c06a44cf3..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/address/parser/TokenMgrError.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.address.parser;
-
-public class TokenMgrError extends Error
-{
- /*
- * Ordinals for various reasons why an Error of this type can be thrown.
- */
-
- /**
- * Lexical error occured.
- */
- static final int LEXICAL_ERROR = 0;
-
- /**
- * An attempt wass made to create a second instance of a static token manager.
- */
- static final int STATIC_LEXER_ERROR = 1;
-
- /**
- * Tried to change to an invalid lexical state.
- */
- static final int INVALID_LEXICAL_STATE = 2;
-
- /**
- * Detected (and bailed out of) an infinite loop in the token manager.
- */
- static final int LOOP_DETECTED = 3;
-
- /**
- * Indicates the reason why the exception is thrown. It will have
- * one of the above 4 values.
- */
- int errorCode;
-
- /**
- * Replaces unprintable characters by their espaced (or unicode escaped)
- * equivalents in the given string
- */
- protected static final String addEscapes(String str) {
- StringBuffer retval = new StringBuffer();
- char ch;
- for (int i = 0; i < str.length(); i++) {
- switch (str.charAt(i))
- {
- case 0 :
- continue;
- case '\b':
- retval.append("\\b");
- continue;
- case '\t':
- retval.append("\\t");
- continue;
- case '\n':
- retval.append("\\n");
- continue;
- case '\f':
- retval.append("\\f");
- continue;
- case '\r':
- retval.append("\\r");
- continue;
- case '\"':
- retval.append("\\\"");
- continue;
- case '\'':
- retval.append("\\\'");
- continue;
- case '\\':
- retval.append("\\\\");
- continue;
- default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
- } else {
- retval.append(ch);
- }
- continue;
- }
- }
- return retval.toString();
- }
-
- /**
- * Returns a detailed message for the Error when it is thrown by the
- * token manager to indicate a lexical error.
- * Parameters :
- * EOFSeen : indicates if EOF caused the lexicl error
- * curLexState : lexical state in which this error occured
- * errorLine : line number when the error occured
- * errorColumn : column number when the error occured
- * errorAfter : prefix that was seen before this error occured
- * curchar : the offending character
- * Note: You can customize the lexical error message by modifying this method.
- */
- protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
- return("Lexical error at line " +
- errorLine + ", column " +
- errorColumn + ". Encountered: " +
- (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
- "after : \"" + addEscapes(errorAfter) + "\"");
- }
-
- /**
- * You can also modify the body of this method to customize your error messages.
- * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
- * of end-users concern, so you can return something like :
- *
- * "Internal Error : Please file a bug report .... "
- *
- * from this method for such cases in the release version of your parser.
- */
- public String getMessage() {
- return super.getMessage();
- }
-
- /*
- * Constructors of various flavors follow.
- */
-
- public TokenMgrError() {
- }
-
- public TokenMgrError(String message, int reason) {
- super(message);
- errorCode = reason;
- }
-
- public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
- this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParser.java b/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParser.java
deleted file mode 100644
index 9d4a0f564..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParser.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ContentTypeParser.java */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.contenttype.parser;
-
-import java.util.ArrayList;
-import java.util.Vector;
-
-public class ContentTypeParser implements ContentTypeParserConstants {
-
- private String type;
- private String subtype;
- private ArrayList<String> paramNames = new ArrayList<String>();
- private ArrayList<String> paramValues = new ArrayList<String>();
-
- public String getType() { return type; }
- public String getSubType() { return subtype; }
- public ArrayList<String> getParamNames() { return paramNames; }
- public ArrayList<String> getParamValues() { return paramValues; }
-
- public static void main(String args[]) throws ParseException {
- while (true) {
- try {
- ContentTypeParser parser = new ContentTypeParser(System.in);
- parser.parseLine();
- } catch (Exception x) {
- x.printStackTrace();
- return;
- }
- }
- }
-
- final public void parseLine() throws ParseException {
- parse();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 1:
- jj_consume_token(1);
- break;
- default:
- jj_la1[0] = jj_gen;
- ;
- }
- jj_consume_token(2);
- }
-
- final public void parseAll() throws ParseException {
- parse();
- jj_consume_token(0);
- }
-
- final public void parse() throws ParseException {
- Token type;
- Token subtype;
- type = jj_consume_token(ATOKEN);
- jj_consume_token(3);
- subtype = jj_consume_token(ATOKEN);
- this.type = type.image;
- this.subtype = subtype.image;
- label_1:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 4:
- ;
- break;
- default:
- jj_la1[1] = jj_gen;
- break label_1;
- }
- jj_consume_token(4);
- parameter();
- }
- }
-
- final public void parameter() throws ParseException {
- Token attrib;
- String val;
- attrib = jj_consume_token(ATOKEN);
- jj_consume_token(5);
- val = value();
- paramNames.add(attrib.image);
- paramValues.add(val);
- }
-
- final public String value() throws ParseException {
- Token t;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case ATOKEN:
- t = jj_consume_token(ATOKEN);
- break;
- case QUOTEDSTRING:
- t = jj_consume_token(QUOTEDSTRING);
- break;
- default:
- jj_la1[2] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- {if (true) return t.image;}
- throw new Error("Missing return statement in function");
- }
-
- public ContentTypeParserTokenManager token_source;
- SimpleCharStream jj_input_stream;
- public Token token, jj_nt;
- private int jj_ntk;
- private int jj_gen;
- final private int[] jj_la1 = new int[3];
- static private int[] jj_la1_0;
- static {
- jj_la1_0();
- }
- private static void jj_la1_0() {
- jj_la1_0 = new int[] {0x2,0x10,0x280000,};
- }
-
- public ContentTypeParser(java.io.InputStream stream) {
- this(stream, null);
- }
- public ContentTypeParser(java.io.InputStream stream, String encoding) {
- try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
- token_source = new ContentTypeParserTokenManager(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 3; i++) jj_la1[i] = -1;
- }
-
- public void ReInit(java.io.InputStream stream) {
- ReInit(stream, null);
- }
- public void ReInit(java.io.InputStream stream, String encoding) {
- try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
- token_source.ReInit(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 3; i++) jj_la1[i] = -1;
- }
-
- public ContentTypeParser(java.io.Reader stream) {
- jj_input_stream = new SimpleCharStream(stream, 1, 1);
- token_source = new ContentTypeParserTokenManager(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 3; i++) jj_la1[i] = -1;
- }
-
- public void ReInit(java.io.Reader stream) {
- jj_input_stream.ReInit(stream, 1, 1);
- token_source.ReInit(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 3; i++) jj_la1[i] = -1;
- }
-
- public ContentTypeParser(ContentTypeParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 3; i++) jj_la1[i] = -1;
- }
-
- public void ReInit(ContentTypeParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 3; i++) jj_la1[i] = -1;
- }
-
- final private Token jj_consume_token(int kind) throws ParseException {
- Token oldToken;
- if ((oldToken = token).next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- if (token.kind == kind) {
- jj_gen++;
- return token;
- }
- token = oldToken;
- jj_kind = kind;
- throw generateParseException();
- }
-
- final public Token getNextToken() {
- if (token.next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- jj_gen++;
- return token;
- }
-
- final public Token getToken(int index) {
- Token t = token;
- for (int i = 0; i < index; i++) {
- if (t.next != null) t = t.next;
- else t = t.next = token_source.getNextToken();
- }
- return t;
- }
-
- final private int jj_ntk() {
- if ((jj_nt=token.next) == null)
- return (jj_ntk = (token.next=token_source.getNextToken()).kind);
- else
- return (jj_ntk = jj_nt.kind);
- }
-
- private Vector<int[]> jj_expentries = new Vector<int[]>();
- private int[] jj_expentry;
- private int jj_kind = -1;
-
- public ParseException generateParseException() {
- jj_expentries.removeAllElements();
- boolean[] la1tokens = new boolean[24];
- for (int i = 0; i < 24; i++) {
- la1tokens[i] = false;
- }
- if (jj_kind >= 0) {
- la1tokens[jj_kind] = true;
- jj_kind = -1;
- }
- for (int i = 0; i < 3; i++) {
- if (jj_la1[i] == jj_gen) {
- for (int j = 0; j < 32; j++) {
- if ((jj_la1_0[i] & (1<<j)) != 0) {
- la1tokens[j] = true;
- }
- }
- }
- }
- for (int i = 0; i < 24; i++) {
- if (la1tokens[i]) {
- jj_expentry = new int[1];
- jj_expentry[0] = i;
- jj_expentries.addElement(jj_expentry);
- }
- }
- int[][] exptokseq = new int[jj_expentries.size()][];
- for (int i = 0; i < jj_expentries.size(); i++) {
- exptokseq[i] = jj_expentries.elementAt(i);
- }
- return new ParseException(token, exptokseq, tokenImage);
- }
-
- final public void enable_tracing() {
- }
-
- final public void disable_tracing() {
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParserConstants.java b/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParserConstants.java
deleted file mode 100644
index 8a763287d..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParserConstants.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ContentTypeParserConstants.java */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.contenttype.parser;
-
-public interface ContentTypeParserConstants {
-
- int EOF = 0;
- int WS = 6;
- int COMMENT = 8;
- int QUOTEDSTRING = 19;
- int DIGITS = 20;
- int ATOKEN = 21;
- int QUOTEDPAIR = 22;
- int ANY = 23;
-
- int DEFAULT = 0;
- int INCOMMENT = 1;
- int NESTED_COMMENT = 2;
- int INQUOTEDSTRING = 3;
-
- String[] tokenImage = {
- "<EOF>",
- "\"\\r\"",
- "\"\\n\"",
- "\"/\"",
- "\";\"",
- "\"=\"",
- "<WS>",
- "\"(\"",
- "\")\"",
- "<token of kind 9>",
- "\"(\"",
- "<token of kind 11>",
- "<token of kind 12>",
- "\"(\"",
- "\")\"",
- "<token of kind 15>",
- "\"\\\"\"",
- "<token of kind 17>",
- "<token of kind 18>",
- "\"\\\"\"",
- "<DIGITS>",
- "<ATOKEN>",
- "<QUOTEDPAIR>",
- "<ANY>",
- };
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParserTokenManager.java b/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParserTokenManager.java
deleted file mode 100644
index 05d940db5..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParserTokenManager.java
+++ /dev/null
@@ -1,877 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ContentTypeParserTokenManager.java */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.contenttype.parser;
-import java.util.ArrayList;
-
-public class ContentTypeParserTokenManager implements ContentTypeParserConstants
-{
- // Keeps track of how many levels of comment nesting
- // we've encountered. This is only used when the 2nd
- // level is reached, for example ((this)), not (this).
- // This is because the outermost level must be treated
- // specially anyway, because the outermost ")" has a
- // different token type than inner ")" instances.
- static int commentNest;
- public java.io.PrintStream debugStream = System.out;
- public void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_0(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_0(int pos, long active0)
-{
- return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
-}
-private final int jjStopAtPos(int pos, int kind)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- return pos + 1;
-}
-private final int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_0(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_0()
-{
- switch(curChar)
- {
- case 10:
- return jjStartNfaWithStates_0(0, 2, 2);
- case 13:
- return jjStartNfaWithStates_0(0, 1, 2);
- case 34:
- return jjStopAtPos(0, 16);
- case 40:
- return jjStopAtPos(0, 7);
- case 47:
- return jjStopAtPos(0, 3);
- case 59:
- return jjStopAtPos(0, 4);
- case 61:
- return jjStopAtPos(0, 5);
- default :
- return jjMoveNfa_0(3, 0);
- }
-}
-private final void jjCheckNAdd(int state)
-{
- if (jjrounds[state] != jjround)
- {
- jjstateSet[jjnewStateCnt++] = state;
- jjrounds[state] = jjround;
- }
-}
-private final void jjAddStates(int start, int end)
-{
- do {
- jjstateSet[jjnewStateCnt++] = jjnextStates[start];
- } while (start++ != end);
-}
-private final void jjCheckNAddTwoStates(int state1, int state2)
-{
- jjCheckNAdd(state1);
- jjCheckNAdd(state2);
-}
-private final void jjCheckNAddStates(int start, int end)
-{
- do {
- jjCheckNAdd(jjnextStates[start]);
- } while (start++ != end);
-}
-private final void jjCheckNAddStates(int start)
-{
- jjCheckNAdd(jjnextStates[start]);
- jjCheckNAdd(jjnextStates[start + 1]);
-}
-static final long[] jjbitVec0 = {
- 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-private final int jjMoveNfa_0(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 3:
- if ((0x3ff6cfafffffdffL & l) != 0L)
- {
- if (kind > 21)
- kind = 21;
- jjCheckNAdd(2);
- }
- else if ((0x100000200L & l) != 0L)
- {
- if (kind > 6)
- kind = 6;
- jjCheckNAdd(0);
- }
- if ((0x3ff000000000000L & l) != 0L)
- {
- if (kind > 20)
- kind = 20;
- jjCheckNAdd(1);
- }
- break;
- case 0:
- if ((0x100000200L & l) == 0L)
- break;
- kind = 6;
- jjCheckNAdd(0);
- break;
- case 1:
- if ((0x3ff000000000000L & l) == 0L)
- break;
- if (kind > 20)
- kind = 20;
- jjCheckNAdd(1);
- break;
- case 2:
- if ((0x3ff6cfafffffdffL & l) == 0L)
- break;
- if (kind > 21)
- kind = 21;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 3:
- case 2:
- if ((0xffffffffc7fffffeL & l) == 0L)
- break;
- kind = 21;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 3:
- case 2:
- if ((jjbitVec0[i2] & l2) == 0L)
- break;
- if (kind > 21)
- kind = 21;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_1(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_1(int pos, long active0)
-{
- return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_1(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_1(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_1()
-{
- switch(curChar)
- {
- case 40:
- return jjStopAtPos(0, 10);
- case 41:
- return jjStopAtPos(0, 8);
- default :
- return jjMoveNfa_1(0, 0);
- }
-}
-private final int jjMoveNfa_1(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 11)
- kind = 11;
- break;
- case 1:
- if (kind > 9)
- kind = 9;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 11)
- kind = 11;
- if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 9)
- kind = 9;
- break;
- case 2:
- if (kind > 11)
- kind = 11;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 11)
- kind = 11;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 9)
- kind = 9;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_3(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_3(int pos, long active0)
-{
- return jjMoveNfa_3(jjStopStringLiteralDfa_3(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_3(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_3(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_3()
-{
- switch(curChar)
- {
- case 34:
- return jjStopAtPos(0, 19);
- default :
- return jjMoveNfa_3(0, 0);
- }
-}
-private final int jjMoveNfa_3(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- case 2:
- if ((0xfffffffbffffffffL & l) == 0L)
- break;
- if (kind > 18)
- kind = 18;
- jjCheckNAdd(2);
- break;
- case 1:
- if (kind > 17)
- kind = 17;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((0xffffffffefffffffL & l) != 0L)
- {
- if (kind > 18)
- kind = 18;
- jjCheckNAdd(2);
- }
- else if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 17)
- kind = 17;
- break;
- case 2:
- if ((0xffffffffefffffffL & l) == 0L)
- break;
- if (kind > 18)
- kind = 18;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- case 2:
- if ((jjbitVec0[i2] & l2) == 0L)
- break;
- if (kind > 18)
- kind = 18;
- jjCheckNAdd(2);
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 17)
- kind = 17;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_2(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_2(int pos, long active0)
-{
- return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_2(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_2(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_2()
-{
- switch(curChar)
- {
- case 40:
- return jjStopAtPos(0, 13);
- case 41:
- return jjStopAtPos(0, 14);
- default :
- return jjMoveNfa_2(0, 0);
- }
-}
-private final int jjMoveNfa_2(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 15)
- kind = 15;
- break;
- case 1:
- if (kind > 12)
- kind = 12;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 15)
- kind = 15;
- if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 12)
- kind = 12;
- break;
- case 2:
- if (kind > 15)
- kind = 15;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 15)
- kind = 15;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 12)
- kind = 12;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-static final int[] jjnextStates = {
-};
-public static final String[] jjstrLiteralImages = {
-"", "\15", "\12", "\57", "\73", "\75", null, null, null, null, null, null,
-null, null, null, null, null, null, null, null, null, null, null, null, };
-public static final String[] lexStateNames = {
- "DEFAULT",
- "INCOMMENT",
- "NESTED_COMMENT",
- "INQUOTEDSTRING",
-};
-public static final int[] jjnewLexState = {
- -1, -1, -1, -1, -1, -1, -1, 1, 0, -1, 2, -1, -1, -1, -1, -1, 3, -1, -1, 0, -1, -1, -1, -1,
-};
-static final long[] jjtoToken = {
- 0x38003fL,
-};
-static final long[] jjtoSkip = {
- 0x140L,
-};
-static final long[] jjtoSpecial = {
- 0x40L,
-};
-static final long[] jjtoMore = {
- 0x7fe80L,
-};
-protected SimpleCharStream input_stream;
-private final int[] jjrounds = new int[3];
-private final int[] jjstateSet = new int[6];
-StringBuffer image;
-int jjimageLen;
-int lengthOfMatch;
-protected char curChar;
-public ContentTypeParserTokenManager(SimpleCharStream stream){
- if (SimpleCharStream.staticFlag)
- throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
- input_stream = stream;
-}
-public ContentTypeParserTokenManager(SimpleCharStream stream, int lexState){
- this(stream);
- SwitchTo(lexState);
-}
-public void ReInit(SimpleCharStream stream)
-{
- jjmatchedPos = jjnewStateCnt = 0;
- curLexState = defaultLexState;
- input_stream = stream;
- ReInitRounds();
-}
-private final void ReInitRounds()
-{
- int i;
- jjround = 0x80000001;
- for (i = 3; i-- > 0;)
- jjrounds[i] = 0x80000000;
-}
-public void ReInit(SimpleCharStream stream, int lexState)
-{
- ReInit(stream);
- SwitchTo(lexState);
-}
-public void SwitchTo(int lexState)
-{
- if (lexState >= 4 || lexState < 0)
- throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
- else
- curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
- Token t = Token.newToken(jjmatchedKind);
- t.kind = jjmatchedKind;
- String im = jjstrLiteralImages[jjmatchedKind];
- t.image = (im == null) ? input_stream.GetImage() : im;
- t.beginLine = input_stream.getBeginLine();
- t.beginColumn = input_stream.getBeginColumn();
- t.endLine = input_stream.getEndLine();
- t.endColumn = input_stream.getEndColumn();
- return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-public Token getNextToken()
-{
- int kind;
- Token specialToken = null;
- Token matchedToken;
- int curPos = 0;
-
- EOFLoop :
- for (;;)
- {
- try
- {
- curChar = input_stream.BeginToken();
- }
- catch(java.io.IOException e)
- {
- jjmatchedKind = 0;
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- return matchedToken;
- }
- image = null;
- jjimageLen = 0;
-
- for (;;)
- {
- switch(curLexState)
- {
- case 0:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_0();
- break;
- case 1:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_1();
- break;
- case 2:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_2();
- break;
- case 3:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_3();
- break;
- }
- if (jjmatchedKind != 0x7fffffff)
- {
- if (jjmatchedPos + 1 < curPos)
- input_stream.backup(curPos - jjmatchedPos - 1);
- if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- TokenLexicalActions(matchedToken);
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- return matchedToken;
- }
- else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- matchedToken = jjFillToken();
- if (specialToken == null)
- specialToken = matchedToken;
- else
- {
- matchedToken.specialToken = specialToken;
- specialToken = (specialToken.next = matchedToken);
- }
- }
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- continue EOFLoop;
- }
- MoreLexicalActions();
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- curPos = 0;
- jjmatchedKind = 0x7fffffff;
- try {
- curChar = input_stream.readChar();
- continue;
- }
- catch (java.io.IOException e1) { }
- }
- int error_line = input_stream.getEndLine();
- int error_column = input_stream.getEndColumn();
- String error_after = null;
- boolean EOFSeen = false;
- try { input_stream.readChar(); input_stream.backup(1); }
- catch (java.io.IOException e1) {
- EOFSeen = true;
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- if (curChar == '\n' || curChar == '\r') {
- error_line++;
- error_column = 0;
- }
- else
- error_column++;
- }
- if (!EOFSeen) {
- input_stream.backup(1);
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- }
- throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
- }
- }
-}
-
-void MoreLexicalActions()
-{
- jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
- switch(jjmatchedKind)
- {
- case 9 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 10 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- commentNest = 1;
- break;
- case 12 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 13 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- ++commentNest;
- break;
- case 14 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT);
- break;
- case 16 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 1);
- break;
- case 17 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- default :
- break;
- }
-}
-void TokenLexicalActions(Token matchedToken)
-{
- switch(jjmatchedKind)
- {
- case 19 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
- matchedToken.image = image.substring(0, image.length() - 1);
- break;
- default :
- break;
- }
-}
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ParseException.java b/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ParseException.java
deleted file mode 100644
index 2c5dc8275..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/ParseException.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.contenttype.parser;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
-public class ParseException extends Exception {
-
- /**
- * This constructor is used by the method "generateParseException"
- * in the generated parser. Calling this constructor generates
- * a new object of this type with the fields "currentToken",
- * "expectedTokenSequences", and "tokenImage" set. The boolean
- * flag "specialConstructor" is also set to true to indicate that
- * this constructor was used to create this object.
- * This constructor calls its super class with the empty string
- * to force the "toString" method of parent class "Throwable" to
- * print the error message in the form:
- * ParseException: <result of getMessage>
- */
- public ParseException(Token currentTokenVal,
- int[][] expectedTokenSequencesVal,
- String[] tokenImageVal
- )
- {
- super("");
- specialConstructor = true;
- currentToken = currentTokenVal;
- expectedTokenSequences = expectedTokenSequencesVal;
- tokenImage = tokenImageVal;
- }
-
- /**
- * The following constructors are for use by you for whatever
- * purpose you can think of. Constructing the exception in this
- * manner makes the exception behave in the normal way - i.e., as
- * documented in the class "Throwable". The fields "errorToken",
- * "expectedTokenSequences", and "tokenImage" do not contain
- * relevant information. The JavaCC generated code does not use
- * these constructors.
- */
-
- public ParseException() {
- super();
- specialConstructor = false;
- }
-
- public ParseException(String message) {
- super(message);
- specialConstructor = false;
- }
-
- /**
- * This variable determines which constructor was used to create
- * this object and thereby affects the semantics of the
- * "getMessage" method (see below).
- */
- protected boolean specialConstructor;
-
- /**
- * This is the last token that has been consumed successfully. If
- * this object has been created due to a parse error, the token
- * followng this token will (therefore) be the first error token.
- */
- public Token currentToken;
-
- /**
- * Each entry in this array is an array of integers. Each array
- * of integers represents a sequence of tokens (by their ordinal
- * values) that is expected at this point of the parse.
- */
- public int[][] expectedTokenSequences;
-
- /**
- * This is a reference to the "tokenImage" array of the generated
- * parser within which the parse error occurred. This array is
- * defined in the generated ...Constants interface.
- */
- public String[] tokenImage;
-
- /**
- * This method has the standard behavior when this object has been
- * created using the standard constructors. Otherwise, it uses
- * "currentToken" and "expectedTokenSequences" to generate a parse
- * error message and returns it. If this object has been created
- * due to a parse error, and you do not catch it (it gets thrown
- * from the parser), then this method is called during the printing
- * of the final stack trace, and hence the correct error message
- * gets displayed.
- */
- public String getMessage() {
- if (!specialConstructor) {
- return super.getMessage();
- }
- StringBuffer expected = new StringBuffer();
- int maxSize = 0;
- for (int i = 0; i < expectedTokenSequences.length; i++) {
- if (maxSize < expectedTokenSequences[i].length) {
- maxSize = expectedTokenSequences[i].length;
- }
- for (int j = 0; j < expectedTokenSequences[i].length; j++) {
- expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" ");
- }
- if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
- expected.append("...");
- }
- expected.append(eol).append(" ");
- }
- String retval = "Encountered \"";
- Token tok = currentToken.next;
- for (int i = 0; i < maxSize; i++) {
- if (i != 0) retval += " ";
- if (tok.kind == 0) {
- retval += tokenImage[0];
- break;
- }
- retval += add_escapes(tok.image);
- tok = tok.next;
- }
- retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
- retval += "." + eol;
- if (expectedTokenSequences.length == 1) {
- retval += "Was expecting:" + eol + " ";
- } else {
- retval += "Was expecting one of:" + eol + " ";
- }
- retval += expected.toString();
- return retval;
- }
-
- /**
- * The end of line string for this machine.
- */
- protected String eol = System.getProperty("line.separator", "\n");
-
- /**
- * Used to convert raw characters to their escaped version
- * when these raw version cannot be used as part of an ASCII
- * string literal.
- */
- protected String add_escapes(String str) {
- StringBuffer retval = new StringBuffer();
- char ch;
- for (int i = 0; i < str.length(); i++) {
- switch (str.charAt(i))
- {
- case 0 :
- continue;
- case '\b':
- retval.append("\\b");
- continue;
- case '\t':
- retval.append("\\t");
- continue;
- case '\n':
- retval.append("\\n");
- continue;
- case '\f':
- retval.append("\\f");
- continue;
- case '\r':
- retval.append("\\r");
- continue;
- case '\"':
- retval.append("\\\"");
- continue;
- case '\'':
- retval.append("\\\'");
- continue;
- case '\\':
- retval.append("\\\\");
- continue;
- default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
- } else {
- retval.append(ch);
- }
- continue;
- }
- }
- return retval.toString();
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/SimpleCharStream.java b/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/SimpleCharStream.java
deleted file mode 100644
index c139e4f38..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/SimpleCharStream.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.contenttype.parser;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (without unicode processing).
- */
-
-public class SimpleCharStream
-{
- public static final boolean staticFlag = false;
- int bufsize;
- int available;
- int tokenBegin;
- public int bufpos = -1;
- protected int bufline[];
- protected int bufcolumn[];
-
- protected int column = 0;
- protected int line = 1;
-
- protected boolean prevCharIsCR = false;
- protected boolean prevCharIsLF = false;
-
- protected java.io.Reader inputStream;
-
- protected char[] buffer;
- protected int maxNextCharInd = 0;
- protected int inBuf = 0;
- protected int tabSize = 8;
-
- protected void setTabSize(int i) { tabSize = i; }
- protected int getTabSize(int i) { return tabSize; }
-
-
- protected void ExpandBuff(boolean wrapAround)
- {
- char[] newbuffer = new char[bufsize + 2048];
- int newbufline[] = new int[bufsize + 2048];
- int newbufcolumn[] = new int[bufsize + 2048];
-
- try
- {
- if (wrapAround)
- {
- System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
- System.arraycopy(buffer, 0, newbuffer,
- bufsize - tokenBegin, bufpos);
- buffer = newbuffer;
-
- System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
- System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
- bufline = newbufline;
-
- System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
- System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
- bufcolumn = newbufcolumn;
-
- maxNextCharInd = (bufpos += (bufsize - tokenBegin));
- }
- else
- {
- System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
- buffer = newbuffer;
-
- System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
- bufline = newbufline;
-
- System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
- bufcolumn = newbufcolumn;
-
- maxNextCharInd = (bufpos -= tokenBegin);
- }
- }
- catch (Throwable t)
- {
- throw new Error(t.getMessage());
- }
-
-
- bufsize += 2048;
- available = bufsize;
- tokenBegin = 0;
- }
-
- protected void FillBuff() throws java.io.IOException
- {
- if (maxNextCharInd == available)
- {
- if (available == bufsize)
- {
- if (tokenBegin > 2048)
- {
- bufpos = maxNextCharInd = 0;
- available = tokenBegin;
- }
- else if (tokenBegin < 0)
- bufpos = maxNextCharInd = 0;
- else
- ExpandBuff(false);
- }
- else if (available > tokenBegin)
- available = bufsize;
- else if ((tokenBegin - available) < 2048)
- ExpandBuff(true);
- else
- available = tokenBegin;
- }
-
- int i;
- try {
- if ((i = inputStream.read(buffer, maxNextCharInd,
- available - maxNextCharInd)) == -1)
- {
- inputStream.close();
- throw new java.io.IOException();
- }
- else
- maxNextCharInd += i;
- return;
- }
- catch(java.io.IOException e) {
- --bufpos;
- backup(0);
- if (tokenBegin == -1)
- tokenBegin = bufpos;
- throw e;
- }
- }
-
- public char BeginToken() throws java.io.IOException
- {
- tokenBegin = -1;
- char c = readChar();
- tokenBegin = bufpos;
-
- return c;
- }
-
- protected void UpdateLineColumn(char c)
- {
- column++;
-
- if (prevCharIsLF)
- {
- prevCharIsLF = false;
- line += (column = 1);
- }
- else if (prevCharIsCR)
- {
- prevCharIsCR = false;
- if (c == '\n')
- {
- prevCharIsLF = true;
- }
- else
- line += (column = 1);
- }
-
- switch (c)
- {
- case '\r' :
- prevCharIsCR = true;
- break;
- case '\n' :
- prevCharIsLF = true;
- break;
- case '\t' :
- column--;
- column += (tabSize - (column % tabSize));
- break;
- default :
- break;
- }
-
- bufline[bufpos] = line;
- bufcolumn[bufpos] = column;
- }
-
- public char readChar() throws java.io.IOException
- {
- if (inBuf > 0)
- {
- --inBuf;
-
- if (++bufpos == bufsize)
- bufpos = 0;
-
- return buffer[bufpos];
- }
-
- if (++bufpos >= maxNextCharInd)
- FillBuff();
-
- char c = buffer[bufpos];
-
- UpdateLineColumn(c);
- return (c);
- }
-
- /**
- * @deprecated
- * @see #getEndColumn
- */
-
- public int getColumn() {
- return bufcolumn[bufpos];
- }
-
- /**
- * @deprecated
- * @see #getEndLine
- */
-
- public int getLine() {
- return bufline[bufpos];
- }
-
- public int getEndColumn() {
- return bufcolumn[bufpos];
- }
-
- public int getEndLine() {
- return bufline[bufpos];
- }
-
- public int getBeginColumn() {
- return bufcolumn[tokenBegin];
- }
-
- public int getBeginLine() {
- return bufline[tokenBegin];
- }
-
- public void backup(int amount) {
-
- inBuf += amount;
- if ((bufpos -= amount) < 0)
- bufpos += bufsize;
- }
-
- public SimpleCharStream(java.io.Reader dstream, int startline,
- int startcolumn, int buffersize)
- {
- inputStream = dstream;
- line = startline;
- column = startcolumn - 1;
-
- available = bufsize = buffersize;
- buffer = new char[buffersize];
- bufline = new int[buffersize];
- bufcolumn = new int[buffersize];
- }
-
- public SimpleCharStream(java.io.Reader dstream, int startline,
- int startcolumn)
- {
- this(dstream, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.Reader dstream)
- {
- this(dstream, 1, 1, 4096);
- }
- public void ReInit(java.io.Reader dstream, int startline,
- int startcolumn, int buffersize)
- {
- inputStream = dstream;
- line = startline;
- column = startcolumn - 1;
-
- if (buffer == null || buffersize != buffer.length)
- {
- available = bufsize = buffersize;
- buffer = new char[buffersize];
- bufline = new int[buffersize];
- bufcolumn = new int[buffersize];
- }
- prevCharIsLF = prevCharIsCR = false;
- tokenBegin = inBuf = maxNextCharInd = 0;
- bufpos = -1;
- }
-
- public void ReInit(java.io.Reader dstream, int startline,
- int startcolumn)
- {
- ReInit(dstream, startline, startcolumn, 4096);
- }
-
- public void ReInit(java.io.Reader dstream)
- {
- ReInit(dstream, 1, 1, 4096);
- }
- public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
- {
- this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, int startline,
- int startcolumn, int buffersize)
- {
- this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn) throws java.io.UnsupportedEncodingException
- {
- this(dstream, encoding, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, int startline,
- int startcolumn)
- {
- this(dstream, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
- {
- this(dstream, encoding, 1, 1, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream)
- {
- this(dstream, 1, 1, 4096);
- }
-
- public void ReInit(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
- {
- ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
- }
-
- public void ReInit(java.io.InputStream dstream, int startline,
- int startcolumn, int buffersize)
- {
- ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
- }
-
- public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
- {
- ReInit(dstream, encoding, 1, 1, 4096);
- }
-
- public void ReInit(java.io.InputStream dstream)
- {
- ReInit(dstream, 1, 1, 4096);
- }
- public void ReInit(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn) throws java.io.UnsupportedEncodingException
- {
- ReInit(dstream, encoding, startline, startcolumn, 4096);
- }
- public void ReInit(java.io.InputStream dstream, int startline,
- int startcolumn)
- {
- ReInit(dstream, startline, startcolumn, 4096);
- }
- public String GetImage()
- {
- if (bufpos >= tokenBegin)
- return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
- else
- return new String(buffer, tokenBegin, bufsize - tokenBegin) +
- new String(buffer, 0, bufpos + 1);
- }
-
- public char[] GetSuffix(int len)
- {
- char[] ret = new char[len];
-
- if ((bufpos + 1) >= len)
- System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
- else
- {
- System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
- len - bufpos - 1);
- System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
- }
-
- return ret;
- }
-
- public void Done()
- {
- buffer = null;
- bufline = null;
- bufcolumn = null;
- }
-
- /**
- * Method to adjust line and column numbers for the start of a token.
- */
- public void adjustBeginLineColumn(int newLine, int newCol)
- {
- int start = tokenBegin;
- int len;
-
- if (bufpos >= tokenBegin)
- {
- len = bufpos - tokenBegin + inBuf + 1;
- }
- else
- {
- len = bufsize - tokenBegin + bufpos + 1 + inBuf;
- }
-
- int i = 0, j = 0, k = 0;
- int nextColDiff = 0, columnDiff = 0;
-
- while (i < len &&
- bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
- {
- bufline[j] = newLine;
- nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
- bufcolumn[j] = newCol + columnDiff;
- columnDiff = nextColDiff;
- i++;
- }
-
- if (i < len)
- {
- bufline[j] = newLine++;
- bufcolumn[j] = newCol + columnDiff;
-
- while (i++ < len)
- {
- if (bufline[j = start % bufsize] != bufline[++start % bufsize])
- bufline[j] = newLine++;
- else
- bufline[j] = newLine;
- }
- }
-
- line = bufline[j];
- column = bufcolumn[j];
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/Token.java b/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/Token.java
deleted file mode 100644
index 5bef6cf02..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/Token.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.contenttype.parser;
-
-/**
- * Describes the input token stream.
- */
-
-public class Token {
-
- /**
- * An integer that describes the kind of this token. This numbering
- * system is determined by JavaCCParser, and a table of these numbers is
- * stored in the file ...Constants.java.
- */
- public int kind;
-
- /**
- * beginLine and beginColumn describe the position of the first character
- * of this token; endLine and endColumn describe the position of the
- * last character of this token.
- */
- public int beginLine, beginColumn, endLine, endColumn;
-
- /**
- * The string image of the token.
- */
- public String image;
-
- /**
- * A reference to the next regular (non-special) token from the input
- * stream. If this is the last token from the input stream, or if the
- * token manager has not read tokens beyond this one, this field is
- * set to null. This is true only if this token is also a regular
- * token. Otherwise, see below for a description of the contents of
- * this field.
- */
- public Token next;
-
- /**
- * This field is used to access special tokens that occur prior to this
- * token, but after the immediately preceding regular (non-special) token.
- * If there are no such special tokens, this field is set to null.
- * When there are more than one such special token, this field refers
- * to the last of these special tokens, which in turn refers to the next
- * previous special token through its specialToken field, and so on
- * until the first special token (whose specialToken field is null).
- * The next fields of special tokens refer to other special tokens that
- * immediately follow it (without an intervening regular token). If there
- * is no such token, this field is null.
- */
- public Token specialToken;
-
- /**
- * Returns the image.
- */
- public String toString()
- {
- return image;
- }
-
- /**
- * Returns a new Token object, by default. However, if you want, you
- * can create and return subclass objects based on the value of ofKind.
- * Simply add the cases to the switch for all those special cases.
- * For example, if you have a subclass of Token called IDToken that
- * you want to create if ofKind is ID, simlpy add something like :
- *
- * case MyParserConstants.ID : return new IDToken();
- *
- * to the following switch statement. Then you can cast matchedToken
- * variable to the appropriate type and use it in your lexical actions.
- */
- public static final Token newToken(int ofKind)
- {
- switch(ofKind)
- {
- default : return new Token();
- }
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/TokenMgrError.java b/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/TokenMgrError.java
deleted file mode 100644
index 4a490efac..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/contenttype/parser/TokenMgrError.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.contenttype.parser;
-
-public class TokenMgrError extends Error
-{
- /*
- * Ordinals for various reasons why an Error of this type can be thrown.
- */
-
- /**
- * Lexical error occured.
- */
- static final int LEXICAL_ERROR = 0;
-
- /**
- * An attempt wass made to create a second instance of a static token manager.
- */
- static final int STATIC_LEXER_ERROR = 1;
-
- /**
- * Tried to change to an invalid lexical state.
- */
- static final int INVALID_LEXICAL_STATE = 2;
-
- /**
- * Detected (and bailed out of) an infinite loop in the token manager.
- */
- static final int LOOP_DETECTED = 3;
-
- /**
- * Indicates the reason why the exception is thrown. It will have
- * one of the above 4 values.
- */
- int errorCode;
-
- /**
- * Replaces unprintable characters by their espaced (or unicode escaped)
- * equivalents in the given string
- */
- protected static final String addEscapes(String str) {
- StringBuffer retval = new StringBuffer();
- char ch;
- for (int i = 0; i < str.length(); i++) {
- switch (str.charAt(i))
- {
- case 0 :
- continue;
- case '\b':
- retval.append("\\b");
- continue;
- case '\t':
- retval.append("\\t");
- continue;
- case '\n':
- retval.append("\\n");
- continue;
- case '\f':
- retval.append("\\f");
- continue;
- case '\r':
- retval.append("\\r");
- continue;
- case '\"':
- retval.append("\\\"");
- continue;
- case '\'':
- retval.append("\\\'");
- continue;
- case '\\':
- retval.append("\\\\");
- continue;
- default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
- } else {
- retval.append(ch);
- }
- continue;
- }
- }
- return retval.toString();
- }
-
- /**
- * Returns a detailed message for the Error when it is thrown by the
- * token manager to indicate a lexical error.
- * Parameters :
- * EOFSeen : indicates if EOF caused the lexicl error
- * curLexState : lexical state in which this error occured
- * errorLine : line number when the error occured
- * errorColumn : column number when the error occured
- * errorAfter : prefix that was seen before this error occured
- * curchar : the offending character
- * Note: You can customize the lexical error message by modifying this method.
- */
- protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
- return("Lexical error at line " +
- errorLine + ", column " +
- errorColumn + ". Encountered: " +
- (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
- "after : \"" + addEscapes(errorAfter) + "\"");
- }
-
- /**
- * You can also modify the body of this method to customize your error messages.
- * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
- * of end-users concern, so you can return something like :
- *
- * "Internal Error : Please file a bug report .... "
- *
- * from this method for such cases in the release version of your parser.
- */
- public String getMessage() {
- return super.getMessage();
- }
-
- /*
- * Constructors of various flavors follow.
- */
-
- public TokenMgrError() {
- }
-
- public TokenMgrError(String message, int reason) {
- super(message);
- errorCode = reason;
- }
-
- public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
- this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/datetime/DateTime.java b/emailcommon/src/org/apache/james/mime4j/field/datetime/DateTime.java
deleted file mode 100644
index bf00ca753..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/datetime/DateTime.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.field.datetime;
-
-import org.apache.james.mime4j.field.datetime.parser.DateTimeParser;
-import org.apache.james.mime4j.field.datetime.parser.ParseException;
-import org.apache.james.mime4j.field.datetime.parser.TokenMgrError;
-
-import java.util.Date;
-import java.util.Calendar;
-import java.util.TimeZone;
-import java.util.GregorianCalendar;
-import java.io.StringReader;
-
-public class DateTime {
- private final Date date;
- private final int year;
- private final int month;
- private final int day;
- private final int hour;
- private final int minute;
- private final int second;
- private final int timeZone;
-
- public DateTime(String yearString, int month, int day, int hour, int minute, int second, int timeZone) {
- this.year = convertToYear(yearString);
- this.date = convertToDate(year, month, day, hour, minute, second, timeZone);
- this.month = month;
- this.day = day;
- this.hour = hour;
- this.minute = minute;
- this.second = second;
- this.timeZone = timeZone;
- }
-
- private int convertToYear(String yearString) {
- int year = Integer.parseInt(yearString);
- switch (yearString.length()) {
- case 1:
- case 2:
- if (year >= 0 && year < 50)
- return 2000 + year;
- else
- return 1900 + year;
- case 3:
- return 1900 + year;
- default:
- return year;
- }
- }
-
- public static Date convertToDate(int year, int month, int day, int hour, int minute, int second, int timeZone) {
- Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT+0"));
- c.set(year, month - 1, day, hour, minute, second);
- c.set(Calendar.MILLISECOND, 0);
-
- if (timeZone != Integer.MIN_VALUE) {
- int minutes = ((timeZone / 100) * 60) + timeZone % 100;
- c.add(Calendar.MINUTE, -1 * minutes);
- }
-
- return c.getTime();
- }
-
- public Date getDate() {
- return date;
- }
-
- public int getYear() {
- return year;
- }
-
- public int getMonth() {
- return month;
- }
-
- public int getDay() {
- return day;
- }
-
- public int getHour() {
- return hour;
- }
-
- public int getMinute() {
- return minute;
- }
-
- public int getSecond() {
- return second;
- }
-
- public int getTimeZone() {
- return timeZone;
- }
-
- public void print() {
- System.out.println(getYear() + " " + getMonth() + " " + getDay() + "; " + getHour() + " " + getMinute() + " " + getSecond() + " " + getTimeZone());
- }
-
-
- public static DateTime parse(String dateString) throws ParseException {
- try {
- return new DateTimeParser(new StringReader(dateString)).parseAll();
- }
- catch (TokenMgrError err) {
- throw new ParseException(err.getMessage());
- }
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/DateTimeParser.java b/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/DateTimeParser.java
deleted file mode 100644
index 04cb9520b..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/DateTimeParser.java
+++ /dev/null
@@ -1,570 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. DateTimeParser.java */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.datetime.parser;
-
-import org.apache.james.mime4j.field.datetime.DateTime;
-
-import java.util.Vector;
-
-public class DateTimeParser implements DateTimeParserConstants {
- private static final boolean ignoreMilitaryZoneOffset = true;
-
- public static void main(String args[]) throws ParseException {
- while (true) {
- try {
- DateTimeParser parser = new DateTimeParser(System.in);
- parser.parseLine();
- } catch (Exception x) {
- x.printStackTrace();
- return;
- }
- }
- }
-
- private static int parseDigits(Token token) {
- return Integer.parseInt(token.image, 10);
- }
-
- private static int getMilitaryZoneOffset(char c) {
- if (ignoreMilitaryZoneOffset)
- return 0;
-
- c = Character.toUpperCase(c);
-
- switch (c) {
- case 'A': return 1;
- case 'B': return 2;
- case 'C': return 3;
- case 'D': return 4;
- case 'E': return 5;
- case 'F': return 6;
- case 'G': return 7;
- case 'H': return 8;
- case 'I': return 9;
- case 'K': return 10;
- case 'L': return 11;
- case 'M': return 12;
-
- case 'N': return -1;
- case 'O': return -2;
- case 'P': return -3;
- case 'Q': return -4;
- case 'R': return -5;
- case 'S': return -6;
- case 'T': return -7;
- case 'U': return -8;
- case 'V': return -9;
- case 'W': return -10;
- case 'X': return -11;
- case 'Y': return -12;
-
- case 'Z': return 0;
- default: return 0;
- }
- }
-
- private static class Time {
- private int hour;
- private int minute;
- private int second;
- private int zone;
-
- public Time(int hour, int minute, int second, int zone) {
- this.hour = hour;
- this.minute = minute;
- this.second = second;
- this.zone = zone;
- }
-
- public int getHour() { return hour; }
- public int getMinute() { return minute; }
- public int getSecond() { return second; }
- public int getZone() { return zone; }
- }
-
- private static class Date {
- private String year;
- private int month;
- private int day;
-
- public Date(String year, int month, int day) {
- this.year = year;
- this.month = month;
- this.day = day;
- }
-
- public String getYear() { return year; }
- public int getMonth() { return month; }
- public int getDay() { return day; }
- }
-
- final public DateTime parseLine() throws ParseException {
- DateTime dt;
- dt = date_time();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 1:
- jj_consume_token(1);
- break;
- default:
- jj_la1[0] = jj_gen;
- ;
- }
- jj_consume_token(2);
- {if (true) return dt;}
- throw new Error("Missing return statement in function");
- }
-
- final public DateTime parseAll() throws ParseException {
- DateTime dt;
- dt = date_time();
- jj_consume_token(0);
- {if (true) return dt;}
- throw new Error("Missing return statement in function");
- }
-
- final public DateTime date_time() throws ParseException {
- Date d; Time t;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- day_of_week();
- jj_consume_token(3);
- break;
- default:
- jj_la1[1] = jj_gen;
- ;
- }
- d = date();
- t = time();
- {if (true) return new DateTime(
- d.getYear(),
- d.getMonth(),
- d.getDay(),
- t.getHour(),
- t.getMinute(),
- t.getSecond(),
- t.getZone());} // time zone offset
-
- throw new Error("Missing return statement in function");
- }
-
- final public String day_of_week() throws ParseException {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 4:
- jj_consume_token(4);
- break;
- case 5:
- jj_consume_token(5);
- break;
- case 6:
- jj_consume_token(6);
- break;
- case 7:
- jj_consume_token(7);
- break;
- case 8:
- jj_consume_token(8);
- break;
- case 9:
- jj_consume_token(9);
- break;
- case 10:
- jj_consume_token(10);
- break;
- default:
- jj_la1[2] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- {if (true) return token.image;}
- throw new Error("Missing return statement in function");
- }
-
- final public Date date() throws ParseException {
- int d, m; String y;
- d = day();
- m = month();
- y = year();
- {if (true) return new Date(y, m, d);}
- throw new Error("Missing return statement in function");
- }
-
- final public int day() throws ParseException {
- Token t;
- t = jj_consume_token(DIGITS);
- {if (true) return parseDigits(t);}
- throw new Error("Missing return statement in function");
- }
-
- final public int month() throws ParseException {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 11:
- jj_consume_token(11);
- {if (true) return 1;}
- break;
- case 12:
- jj_consume_token(12);
- {if (true) return 2;}
- break;
- case 13:
- jj_consume_token(13);
- {if (true) return 3;}
- break;
- case 14:
- jj_consume_token(14);
- {if (true) return 4;}
- break;
- case 15:
- jj_consume_token(15);
- {if (true) return 5;}
- break;
- case 16:
- jj_consume_token(16);
- {if (true) return 6;}
- break;
- case 17:
- jj_consume_token(17);
- {if (true) return 7;}
- break;
- case 18:
- jj_consume_token(18);
- {if (true) return 8;}
- break;
- case 19:
- jj_consume_token(19);
- {if (true) return 9;}
- break;
- case 20:
- jj_consume_token(20);
- {if (true) return 10;}
- break;
- case 21:
- jj_consume_token(21);
- {if (true) return 11;}
- break;
- case 22:
- jj_consume_token(22);
- {if (true) return 12;}
- break;
- default:
- jj_la1[3] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- throw new Error("Missing return statement in function");
- }
-
- final public String year() throws ParseException {
- Token t;
- t = jj_consume_token(DIGITS);
- {if (true) return t.image;}
- throw new Error("Missing return statement in function");
- }
-
- final public Time time() throws ParseException {
- int h, m, s=0, z;
- h = hour();
- jj_consume_token(23);
- m = minute();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 23:
- jj_consume_token(23);
- s = second();
- break;
- default:
- jj_la1[4] = jj_gen;
- ;
- }
- z = zone();
- {if (true) return new Time(h, m, s, z);}
- throw new Error("Missing return statement in function");
- }
-
- final public int hour() throws ParseException {
- Token t;
- t = jj_consume_token(DIGITS);
- {if (true) return parseDigits(t);}
- throw new Error("Missing return statement in function");
- }
-
- final public int minute() throws ParseException {
- Token t;
- t = jj_consume_token(DIGITS);
- {if (true) return parseDigits(t);}
- throw new Error("Missing return statement in function");
- }
-
- final public int second() throws ParseException {
- Token t;
- t = jj_consume_token(DIGITS);
- {if (true) return parseDigits(t);}
- throw new Error("Missing return statement in function");
- }
-
- final public int zone() throws ParseException {
- Token t, u; int z;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case OFFSETDIR:
- t = jj_consume_token(OFFSETDIR);
- u = jj_consume_token(DIGITS);
- z=parseDigits(u)*(t.image.equals("-") ? -1 : 1);
- break;
- case 25:
- case 26:
- case 27:
- case 28:
- case 29:
- case 30:
- case 31:
- case 32:
- case 33:
- case 34:
- case MILITARY_ZONE:
- z = obs_zone();
- break;
- default:
- jj_la1[5] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- {if (true) return z;}
- throw new Error("Missing return statement in function");
- }
-
- final public int obs_zone() throws ParseException {
- Token t; int z;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 25:
- jj_consume_token(25);
- z=0;
- break;
- case 26:
- jj_consume_token(26);
- z=0;
- break;
- case 27:
- jj_consume_token(27);
- z=-5;
- break;
- case 28:
- jj_consume_token(28);
- z=-4;
- break;
- case 29:
- jj_consume_token(29);
- z=-6;
- break;
- case 30:
- jj_consume_token(30);
- z=-5;
- break;
- case 31:
- jj_consume_token(31);
- z=-7;
- break;
- case 32:
- jj_consume_token(32);
- z=-6;
- break;
- case 33:
- jj_consume_token(33);
- z=-8;
- break;
- case 34:
- jj_consume_token(34);
- z=-7;
- break;
- case MILITARY_ZONE:
- t = jj_consume_token(MILITARY_ZONE);
- z=getMilitaryZoneOffset(t.image.charAt(0));
- break;
- default:
- jj_la1[6] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- {if (true) return z * 100;}
- throw new Error("Missing return statement in function");
- }
-
- public DateTimeParserTokenManager token_source;
- SimpleCharStream jj_input_stream;
- public Token token, jj_nt;
- private int jj_ntk;
- private int jj_gen;
- final private int[] jj_la1 = new int[7];
- static private int[] jj_la1_0;
- static private int[] jj_la1_1;
- static {
- jj_la1_0();
- jj_la1_1();
- }
- private static void jj_la1_0() {
- jj_la1_0 = new int[] {0x2,0x7f0,0x7f0,0x7ff800,0x800000,0xff000000,0xfe000000,};
- }
- private static void jj_la1_1() {
- jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0xf,0xf,};
- }
-
- public DateTimeParser(java.io.InputStream stream) {
- this(stream, null);
- }
- public DateTimeParser(java.io.InputStream stream, String encoding) {
- try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
- token_source = new DateTimeParserTokenManager(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 7; i++) jj_la1[i] = -1;
- }
-
- public void ReInit(java.io.InputStream stream) {
- ReInit(stream, null);
- }
- public void ReInit(java.io.InputStream stream, String encoding) {
- try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
- token_source.ReInit(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 7; i++) jj_la1[i] = -1;
- }
-
- public DateTimeParser(java.io.Reader stream) {
- jj_input_stream = new SimpleCharStream(stream, 1, 1);
- token_source = new DateTimeParserTokenManager(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 7; i++) jj_la1[i] = -1;
- }
-
- public void ReInit(java.io.Reader stream) {
- jj_input_stream.ReInit(stream, 1, 1);
- token_source.ReInit(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 7; i++) jj_la1[i] = -1;
- }
-
- public DateTimeParser(DateTimeParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 7; i++) jj_la1[i] = -1;
- }
-
- public void ReInit(DateTimeParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 7; i++) jj_la1[i] = -1;
- }
-
- final private Token jj_consume_token(int kind) throws ParseException {
- Token oldToken;
- if ((oldToken = token).next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- if (token.kind == kind) {
- jj_gen++;
- return token;
- }
- token = oldToken;
- jj_kind = kind;
- throw generateParseException();
- }
-
- final public Token getNextToken() {
- if (token.next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- jj_gen++;
- return token;
- }
-
- final public Token getToken(int index) {
- Token t = token;
- for (int i = 0; i < index; i++) {
- if (t.next != null) t = t.next;
- else t = t.next = token_source.getNextToken();
- }
- return t;
- }
-
- final private int jj_ntk() {
- if ((jj_nt=token.next) == null)
- return (jj_ntk = (token.next=token_source.getNextToken()).kind);
- else
- return (jj_ntk = jj_nt.kind);
- }
-
- private Vector<int[]> jj_expentries = new Vector<int[]>();
- private int[] jj_expentry;
- private int jj_kind = -1;
-
- public ParseException generateParseException() {
- jj_expentries.removeAllElements();
- boolean[] la1tokens = new boolean[49];
- for (int i = 0; i < 49; i++) {
- la1tokens[i] = false;
- }
- if (jj_kind >= 0) {
- la1tokens[jj_kind] = true;
- jj_kind = -1;
- }
- for (int i = 0; i < 7; i++) {
- if (jj_la1[i] == jj_gen) {
- for (int j = 0; j < 32; j++) {
- if ((jj_la1_0[i] & (1<<j)) != 0) {
- la1tokens[j] = true;
- }
- if ((jj_la1_1[i] & (1<<j)) != 0) {
- la1tokens[32+j] = true;
- }
- }
- }
- }
- for (int i = 0; i < 49; i++) {
- if (la1tokens[i]) {
- jj_expentry = new int[1];
- jj_expentry[0] = i;
- jj_expentries.addElement(jj_expentry);
- }
- }
- int[][] exptokseq = new int[jj_expentries.size()][];
- for (int i = 0; i < jj_expentries.size(); i++) {
- exptokseq[i] = jj_expentries.elementAt(i);
- }
- return new ParseException(token, exptokseq, tokenImage);
- }
-
- final public void enable_tracing() {
- }
-
- final public void disable_tracing() {
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/DateTimeParserConstants.java b/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/DateTimeParserConstants.java
deleted file mode 100644
index 17389d816..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/DateTimeParserConstants.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. DateTimeParserConstants.java */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.datetime.parser;
-
-public interface DateTimeParserConstants {
-
- int EOF = 0;
- int OFFSETDIR = 24;
- int MILITARY_ZONE = 35;
- int WS = 36;
- int COMMENT = 38;
- int DIGITS = 46;
- int QUOTEDPAIR = 47;
- int ANY = 48;
-
- int DEFAULT = 0;
- int INCOMMENT = 1;
- int NESTED_COMMENT = 2;
-
- String[] tokenImage = {
- "<EOF>",
- "\"\\r\"",
- "\"\\n\"",
- "\",\"",
- "\"Mon\"",
- "\"Tue\"",
- "\"Wed\"",
- "\"Thu\"",
- "\"Fri\"",
- "\"Sat\"",
- "\"Sun\"",
- "\"Jan\"",
- "\"Feb\"",
- "\"Mar\"",
- "\"Apr\"",
- "\"May\"",
- "\"Jun\"",
- "\"Jul\"",
- "\"Aug\"",
- "\"Sep\"",
- "\"Oct\"",
- "\"Nov\"",
- "\"Dec\"",
- "\":\"",
- "<OFFSETDIR>",
- "\"UT\"",
- "\"GMT\"",
- "\"EST\"",
- "\"EDT\"",
- "\"CST\"",
- "\"CDT\"",
- "\"MST\"",
- "\"MDT\"",
- "\"PST\"",
- "\"PDT\"",
- "<MILITARY_ZONE>",
- "<WS>",
- "\"(\"",
- "\")\"",
- "<token of kind 39>",
- "\"(\"",
- "<token of kind 41>",
- "<token of kind 42>",
- "\"(\"",
- "\")\"",
- "<token of kind 45>",
- "<DIGITS>",
- "<QUOTEDPAIR>",
- "<ANY>",
- };
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/DateTimeParserTokenManager.java b/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/DateTimeParserTokenManager.java
deleted file mode 100644
index e75998cf2..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/DateTimeParserTokenManager.java
+++ /dev/null
@@ -1,882 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. DateTimeParserTokenManager.java */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.datetime.parser;
-import org.apache.james.mime4j.field.datetime.DateTime;
-import java.util.Calendar;
-
-public class DateTimeParserTokenManager implements DateTimeParserConstants
-{
- // Keeps track of how many levels of comment nesting
- // we've encountered. This is only used when the 2nd
- // level is reached, for example ((this)), not (this).
- // This is because the outermost level must be treated
- // specially anyway, because the outermost ")" has a
- // different token type than inner ")" instances.
- static int commentNest;
- public java.io.PrintStream debugStream = System.out;
- public void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_0(int pos, long active0)
-{
- switch (pos)
- {
- case 0:
- if ((active0 & 0x7fe7cf7f0L) != 0L)
- {
- jjmatchedKind = 35;
- return -1;
- }
- return -1;
- case 1:
- if ((active0 & 0x7fe7cf7f0L) != 0L)
- {
- if (jjmatchedPos == 0)
- {
- jjmatchedKind = 35;
- jjmatchedPos = 0;
- }
- return -1;
- }
- return -1;
- default :
- return -1;
- }
-}
-private final int jjStartNfa_0(int pos, long active0)
-{
- return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
-}
-private final int jjStopAtPos(int pos, int kind)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- return pos + 1;
-}
-private final int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_0(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_0()
-{
- switch(curChar)
- {
- case 10:
- return jjStopAtPos(0, 2);
- case 13:
- return jjStopAtPos(0, 1);
- case 40:
- return jjStopAtPos(0, 37);
- case 44:
- return jjStopAtPos(0, 3);
- case 58:
- return jjStopAtPos(0, 23);
- case 65:
- return jjMoveStringLiteralDfa1_0(0x44000L);
- case 67:
- return jjMoveStringLiteralDfa1_0(0x60000000L);
- case 68:
- return jjMoveStringLiteralDfa1_0(0x400000L);
- case 69:
- return jjMoveStringLiteralDfa1_0(0x18000000L);
- case 70:
- return jjMoveStringLiteralDfa1_0(0x1100L);
- case 71:
- return jjMoveStringLiteralDfa1_0(0x4000000L);
- case 74:
- return jjMoveStringLiteralDfa1_0(0x30800L);
- case 77:
- return jjMoveStringLiteralDfa1_0(0x18000a010L);
- case 78:
- return jjMoveStringLiteralDfa1_0(0x200000L);
- case 79:
- return jjMoveStringLiteralDfa1_0(0x100000L);
- case 80:
- return jjMoveStringLiteralDfa1_0(0x600000000L);
- case 83:
- return jjMoveStringLiteralDfa1_0(0x80600L);
- case 84:
- return jjMoveStringLiteralDfa1_0(0xa0L);
- case 85:
- return jjMoveStringLiteralDfa1_0(0x2000000L);
- case 87:
- return jjMoveStringLiteralDfa1_0(0x40L);
- default :
- return jjMoveNfa_0(0, 0);
- }
-}
-private final int jjMoveStringLiteralDfa1_0(long active0)
-{
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) {
- jjStopStringLiteralDfa_0(0, active0);
- return 1;
- }
- switch(curChar)
- {
- case 68:
- return jjMoveStringLiteralDfa2_0(active0, 0x550000000L);
- case 77:
- return jjMoveStringLiteralDfa2_0(active0, 0x4000000L);
- case 83:
- return jjMoveStringLiteralDfa2_0(active0, 0x2a8000000L);
- case 84:
- if ((active0 & 0x2000000L) != 0L)
- return jjStopAtPos(1, 25);
- break;
- case 97:
- return jjMoveStringLiteralDfa2_0(active0, 0xaa00L);
- case 99:
- return jjMoveStringLiteralDfa2_0(active0, 0x100000L);
- case 101:
- return jjMoveStringLiteralDfa2_0(active0, 0x481040L);
- case 104:
- return jjMoveStringLiteralDfa2_0(active0, 0x80L);
- case 111:
- return jjMoveStringLiteralDfa2_0(active0, 0x200010L);
- case 112:
- return jjMoveStringLiteralDfa2_0(active0, 0x4000L);
- case 114:
- return jjMoveStringLiteralDfa2_0(active0, 0x100L);
- case 117:
- return jjMoveStringLiteralDfa2_0(active0, 0x70420L);
- default :
- break;
- }
- return jjStartNfa_0(0, active0);
-}
-private final int jjMoveStringLiteralDfa2_0(long old0, long active0)
-{
- if (((active0 &= old0)) == 0L)
- return jjStartNfa_0(0, old0);
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) {
- jjStopStringLiteralDfa_0(1, active0);
- return 2;
- }
- switch(curChar)
- {
- case 84:
- if ((active0 & 0x4000000L) != 0L)
- return jjStopAtPos(2, 26);
- else if ((active0 & 0x8000000L) != 0L)
- return jjStopAtPos(2, 27);
- else if ((active0 & 0x10000000L) != 0L)
- return jjStopAtPos(2, 28);
- else if ((active0 & 0x20000000L) != 0L)
- return jjStopAtPos(2, 29);
- else if ((active0 & 0x40000000L) != 0L)
- return jjStopAtPos(2, 30);
- else if ((active0 & 0x80000000L) != 0L)
- return jjStopAtPos(2, 31);
- else if ((active0 & 0x100000000L) != 0L)
- return jjStopAtPos(2, 32);
- else if ((active0 & 0x200000000L) != 0L)
- return jjStopAtPos(2, 33);
- else if ((active0 & 0x400000000L) != 0L)
- return jjStopAtPos(2, 34);
- break;
- case 98:
- if ((active0 & 0x1000L) != 0L)
- return jjStopAtPos(2, 12);
- break;
- case 99:
- if ((active0 & 0x400000L) != 0L)
- return jjStopAtPos(2, 22);
- break;
- case 100:
- if ((active0 & 0x40L) != 0L)
- return jjStopAtPos(2, 6);
- break;
- case 101:
- if ((active0 & 0x20L) != 0L)
- return jjStopAtPos(2, 5);
- break;
- case 103:
- if ((active0 & 0x40000L) != 0L)
- return jjStopAtPos(2, 18);
- break;
- case 105:
- if ((active0 & 0x100L) != 0L)
- return jjStopAtPos(2, 8);
- break;
- case 108:
- if ((active0 & 0x20000L) != 0L)
- return jjStopAtPos(2, 17);
- break;
- case 110:
- if ((active0 & 0x10L) != 0L)
- return jjStopAtPos(2, 4);
- else if ((active0 & 0x400L) != 0L)
- return jjStopAtPos(2, 10);
- else if ((active0 & 0x800L) != 0L)
- return jjStopAtPos(2, 11);
- else if ((active0 & 0x10000L) != 0L)
- return jjStopAtPos(2, 16);
- break;
- case 112:
- if ((active0 & 0x80000L) != 0L)
- return jjStopAtPos(2, 19);
- break;
- case 114:
- if ((active0 & 0x2000L) != 0L)
- return jjStopAtPos(2, 13);
- else if ((active0 & 0x4000L) != 0L)
- return jjStopAtPos(2, 14);
- break;
- case 116:
- if ((active0 & 0x200L) != 0L)
- return jjStopAtPos(2, 9);
- else if ((active0 & 0x100000L) != 0L)
- return jjStopAtPos(2, 20);
- break;
- case 117:
- if ((active0 & 0x80L) != 0L)
- return jjStopAtPos(2, 7);
- break;
- case 118:
- if ((active0 & 0x200000L) != 0L)
- return jjStopAtPos(2, 21);
- break;
- case 121:
- if ((active0 & 0x8000L) != 0L)
- return jjStopAtPos(2, 15);
- break;
- default :
- break;
- }
- return jjStartNfa_0(1, active0);
-}
-private final void jjCheckNAdd(int state)
-{
- if (jjrounds[state] != jjround)
- {
- jjstateSet[jjnewStateCnt++] = state;
- jjrounds[state] = jjround;
- }
-}
-private final void jjAddStates(int start, int end)
-{
- do {
- jjstateSet[jjnewStateCnt++] = jjnextStates[start];
- } while (start++ != end);
-}
-private final void jjCheckNAddTwoStates(int state1, int state2)
-{
- jjCheckNAdd(state1);
- jjCheckNAdd(state2);
-}
-private final void jjCheckNAddStates(int start, int end)
-{
- do {
- jjCheckNAdd(jjnextStates[start]);
- } while (start++ != end);
-}
-private final void jjCheckNAddStates(int start)
-{
- jjCheckNAdd(jjnextStates[start]);
- jjCheckNAdd(jjnextStates[start + 1]);
-}
-private final int jjMoveNfa_0(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 4;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((0x3ff000000000000L & l) != 0L)
- {
- if (kind > 46)
- kind = 46;
- jjCheckNAdd(3);
- }
- else if ((0x100000200L & l) != 0L)
- {
- if (kind > 36)
- kind = 36;
- jjCheckNAdd(2);
- }
- else if ((0x280000000000L & l) != 0L)
- {
- if (kind > 24)
- kind = 24;
- }
- break;
- case 2:
- if ((0x100000200L & l) == 0L)
- break;
- kind = 36;
- jjCheckNAdd(2);
- break;
- case 3:
- if ((0x3ff000000000000L & l) == 0L)
- break;
- kind = 46;
- jjCheckNAdd(3);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((0x7fffbfe07fffbfeL & l) != 0L)
- kind = 35;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 4 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_1(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_1(int pos, long active0)
-{
- return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_1(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_1(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_1()
-{
- switch(curChar)
- {
- case 40:
- return jjStopAtPos(0, 40);
- case 41:
- return jjStopAtPos(0, 38);
- default :
- return jjMoveNfa_1(0, 0);
- }
-}
-static final long[] jjbitVec0 = {
- 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-private final int jjMoveNfa_1(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 41)
- kind = 41;
- break;
- case 1:
- if (kind > 39)
- kind = 39;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 41)
- kind = 41;
- if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 39)
- kind = 39;
- break;
- case 2:
- if (kind > 41)
- kind = 41;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 41)
- kind = 41;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 39)
- kind = 39;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_2(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_2(int pos, long active0)
-{
- return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_2(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_2(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_2()
-{
- switch(curChar)
- {
- case 40:
- return jjStopAtPos(0, 43);
- case 41:
- return jjStopAtPos(0, 44);
- default :
- return jjMoveNfa_2(0, 0);
- }
-}
-private final int jjMoveNfa_2(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 45)
- kind = 45;
- break;
- case 1:
- if (kind > 42)
- kind = 42;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 45)
- kind = 45;
- if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 42)
- kind = 42;
- break;
- case 2:
- if (kind > 45)
- kind = 45;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 45)
- kind = 45;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 42)
- kind = 42;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-static final int[] jjnextStates = {
-};
-public static final String[] jjstrLiteralImages = {
-"", "\15", "\12", "\54", "\115\157\156", "\124\165\145", "\127\145\144",
-"\124\150\165", "\106\162\151", "\123\141\164", "\123\165\156", "\112\141\156",
-"\106\145\142", "\115\141\162", "\101\160\162", "\115\141\171", "\112\165\156",
-"\112\165\154", "\101\165\147", "\123\145\160", "\117\143\164", "\116\157\166",
-"\104\145\143", "\72", null, "\125\124", "\107\115\124", "\105\123\124", "\105\104\124",
-"\103\123\124", "\103\104\124", "\115\123\124", "\115\104\124", "\120\123\124",
-"\120\104\124", null, null, null, null, null, null, null, null, null, null, null, null, null,
-null, };
-public static final String[] lexStateNames = {
- "DEFAULT",
- "INCOMMENT",
- "NESTED_COMMENT",
-};
-public static final int[] jjnewLexState = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 0, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1,
-};
-static final long[] jjtoToken = {
- 0x400fffffffffL,
-};
-static final long[] jjtoSkip = {
- 0x5000000000L,
-};
-static final long[] jjtoSpecial = {
- 0x1000000000L,
-};
-static final long[] jjtoMore = {
- 0x3fa000000000L,
-};
-protected SimpleCharStream input_stream;
-private final int[] jjrounds = new int[4];
-private final int[] jjstateSet = new int[8];
-StringBuffer image;
-int jjimageLen;
-int lengthOfMatch;
-protected char curChar;
-public DateTimeParserTokenManager(SimpleCharStream stream){
- if (SimpleCharStream.staticFlag)
- throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
- input_stream = stream;
-}
-public DateTimeParserTokenManager(SimpleCharStream stream, int lexState){
- this(stream);
- SwitchTo(lexState);
-}
-public void ReInit(SimpleCharStream stream)
-{
- jjmatchedPos = jjnewStateCnt = 0;
- curLexState = defaultLexState;
- input_stream = stream;
- ReInitRounds();
-}
-private final void ReInitRounds()
-{
- int i;
- jjround = 0x80000001;
- for (i = 4; i-- > 0;)
- jjrounds[i] = 0x80000000;
-}
-public void ReInit(SimpleCharStream stream, int lexState)
-{
- ReInit(stream);
- SwitchTo(lexState);
-}
-public void SwitchTo(int lexState)
-{
- if (lexState >= 3 || lexState < 0)
- throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
- else
- curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
- Token t = Token.newToken(jjmatchedKind);
- t.kind = jjmatchedKind;
- String im = jjstrLiteralImages[jjmatchedKind];
- t.image = (im == null) ? input_stream.GetImage() : im;
- t.beginLine = input_stream.getBeginLine();
- t.beginColumn = input_stream.getBeginColumn();
- t.endLine = input_stream.getEndLine();
- t.endColumn = input_stream.getEndColumn();
- return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-public Token getNextToken()
-{
- int kind;
- Token specialToken = null;
- Token matchedToken;
- int curPos = 0;
-
- EOFLoop :
- for (;;)
- {
- try
- {
- curChar = input_stream.BeginToken();
- }
- catch(java.io.IOException e)
- {
- jjmatchedKind = 0;
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- return matchedToken;
- }
- image = null;
- jjimageLen = 0;
-
- for (;;)
- {
- switch(curLexState)
- {
- case 0:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_0();
- break;
- case 1:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_1();
- break;
- case 2:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_2();
- break;
- }
- if (jjmatchedKind != 0x7fffffff)
- {
- if (jjmatchedPos + 1 < curPos)
- input_stream.backup(curPos - jjmatchedPos - 1);
- if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- return matchedToken;
- }
- else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- matchedToken = jjFillToken();
- if (specialToken == null)
- specialToken = matchedToken;
- else
- {
- matchedToken.specialToken = specialToken;
- specialToken = (specialToken.next = matchedToken);
- }
- }
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- continue EOFLoop;
- }
- MoreLexicalActions();
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- curPos = 0;
- jjmatchedKind = 0x7fffffff;
- try {
- curChar = input_stream.readChar();
- continue;
- }
- catch (java.io.IOException e1) { }
- }
- int error_line = input_stream.getEndLine();
- int error_column = input_stream.getEndColumn();
- String error_after = null;
- boolean EOFSeen = false;
- try { input_stream.readChar(); input_stream.backup(1); }
- catch (java.io.IOException e1) {
- EOFSeen = true;
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- if (curChar == '\n' || curChar == '\r') {
- error_line++;
- error_column = 0;
- }
- else
- error_column++;
- }
- if (!EOFSeen) {
- input_stream.backup(1);
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- }
- throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
- }
- }
-}
-
-void MoreLexicalActions()
-{
- jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
- switch(jjmatchedKind)
- {
- case 39 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 40 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- commentNest = 1;
- break;
- case 42 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 43 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- ++commentNest;
- break;
- case 44 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT);
- break;
- default :
- break;
- }
-}
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/ParseException.java b/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/ParseException.java
deleted file mode 100644
index 418699107..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/ParseException.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.datetime.parser;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
-public class ParseException extends Exception {
-
- /**
- * This constructor is used by the method "generateParseException"
- * in the generated parser. Calling this constructor generates
- * a new object of this type with the fields "currentToken",
- * "expectedTokenSequences", and "tokenImage" set. The boolean
- * flag "specialConstructor" is also set to true to indicate that
- * this constructor was used to create this object.
- * This constructor calls its super class with the empty string
- * to force the "toString" method of parent class "Throwable" to
- * print the error message in the form:
- * ParseException: <result of getMessage>
- */
- public ParseException(Token currentTokenVal,
- int[][] expectedTokenSequencesVal,
- String[] tokenImageVal
- )
- {
- super("");
- specialConstructor = true;
- currentToken = currentTokenVal;
- expectedTokenSequences = expectedTokenSequencesVal;
- tokenImage = tokenImageVal;
- }
-
- /**
- * The following constructors are for use by you for whatever
- * purpose you can think of. Constructing the exception in this
- * manner makes the exception behave in the normal way - i.e., as
- * documented in the class "Throwable". The fields "errorToken",
- * "expectedTokenSequences", and "tokenImage" do not contain
- * relevant information. The JavaCC generated code does not use
- * these constructors.
- */
-
- public ParseException() {
- super();
- specialConstructor = false;
- }
-
- public ParseException(String message) {
- super(message);
- specialConstructor = false;
- }
-
- /**
- * This variable determines which constructor was used to create
- * this object and thereby affects the semantics of the
- * "getMessage" method (see below).
- */
- protected boolean specialConstructor;
-
- /**
- * This is the last token that has been consumed successfully. If
- * this object has been created due to a parse error, the token
- * followng this token will (therefore) be the first error token.
- */
- public Token currentToken;
-
- /**
- * Each entry in this array is an array of integers. Each array
- * of integers represents a sequence of tokens (by their ordinal
- * values) that is expected at this point of the parse.
- */
- public int[][] expectedTokenSequences;
-
- /**
- * This is a reference to the "tokenImage" array of the generated
- * parser within which the parse error occurred. This array is
- * defined in the generated ...Constants interface.
- */
- public String[] tokenImage;
-
- /**
- * This method has the standard behavior when this object has been
- * created using the standard constructors. Otherwise, it uses
- * "currentToken" and "expectedTokenSequences" to generate a parse
- * error message and returns it. If this object has been created
- * due to a parse error, and you do not catch it (it gets thrown
- * from the parser), then this method is called during the printing
- * of the final stack trace, and hence the correct error message
- * gets displayed.
- */
- public String getMessage() {
- if (!specialConstructor) {
- return super.getMessage();
- }
- StringBuffer expected = new StringBuffer();
- int maxSize = 0;
- for (int i = 0; i < expectedTokenSequences.length; i++) {
- if (maxSize < expectedTokenSequences[i].length) {
- maxSize = expectedTokenSequences[i].length;
- }
- for (int j = 0; j < expectedTokenSequences[i].length; j++) {
- expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" ");
- }
- if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
- expected.append("...");
- }
- expected.append(eol).append(" ");
- }
- String retval = "Encountered \"";
- Token tok = currentToken.next;
- for (int i = 0; i < maxSize; i++) {
- if (i != 0) retval += " ";
- if (tok.kind == 0) {
- retval += tokenImage[0];
- break;
- }
- retval += add_escapes(tok.image);
- tok = tok.next;
- }
- retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
- retval += "." + eol;
- if (expectedTokenSequences.length == 1) {
- retval += "Was expecting:" + eol + " ";
- } else {
- retval += "Was expecting one of:" + eol + " ";
- }
- retval += expected.toString();
- return retval;
- }
-
- /**
- * The end of line string for this machine.
- */
- protected String eol = System.getProperty("line.separator", "\n");
-
- /**
- * Used to convert raw characters to their escaped version
- * when these raw version cannot be used as part of an ASCII
- * string literal.
- */
- protected String add_escapes(String str) {
- StringBuffer retval = new StringBuffer();
- char ch;
- for (int i = 0; i < str.length(); i++) {
- switch (str.charAt(i))
- {
- case 0 :
- continue;
- case '\b':
- retval.append("\\b");
- continue;
- case '\t':
- retval.append("\\t");
- continue;
- case '\n':
- retval.append("\\n");
- continue;
- case '\f':
- retval.append("\\f");
- continue;
- case '\r':
- retval.append("\\r");
- continue;
- case '\"':
- retval.append("\\\"");
- continue;
- case '\'':
- retval.append("\\\'");
- continue;
- case '\\':
- retval.append("\\\\");
- continue;
- default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
- } else {
- retval.append(ch);
- }
- continue;
- }
- }
- return retval.toString();
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/SimpleCharStream.java b/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/SimpleCharStream.java
deleted file mode 100644
index d44a9018b..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/SimpleCharStream.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.datetime.parser;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (without unicode processing).
- */
-
-public class SimpleCharStream
-{
- public static final boolean staticFlag = false;
- int bufsize;
- int available;
- int tokenBegin;
- public int bufpos = -1;
- protected int bufline[];
- protected int bufcolumn[];
-
- protected int column = 0;
- protected int line = 1;
-
- protected boolean prevCharIsCR = false;
- protected boolean prevCharIsLF = false;
-
- protected java.io.Reader inputStream;
-
- protected char[] buffer;
- protected int maxNextCharInd = 0;
- protected int inBuf = 0;
- protected int tabSize = 8;
-
- protected void setTabSize(int i) { tabSize = i; }
- protected int getTabSize(int i) { return tabSize; }
-
-
- protected void ExpandBuff(boolean wrapAround)
- {
- char[] newbuffer = new char[bufsize + 2048];
- int newbufline[] = new int[bufsize + 2048];
- int newbufcolumn[] = new int[bufsize + 2048];
-
- try
- {
- if (wrapAround)
- {
- System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
- System.arraycopy(buffer, 0, newbuffer,
- bufsize - tokenBegin, bufpos);
- buffer = newbuffer;
-
- System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
- System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
- bufline = newbufline;
-
- System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
- System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
- bufcolumn = newbufcolumn;
-
- maxNextCharInd = (bufpos += (bufsize - tokenBegin));
- }
- else
- {
- System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
- buffer = newbuffer;
-
- System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
- bufline = newbufline;
-
- System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
- bufcolumn = newbufcolumn;
-
- maxNextCharInd = (bufpos -= tokenBegin);
- }
- }
- catch (Throwable t)
- {
- throw new Error(t.getMessage());
- }
-
-
- bufsize += 2048;
- available = bufsize;
- tokenBegin = 0;
- }
-
- protected void FillBuff() throws java.io.IOException
- {
- if (maxNextCharInd == available)
- {
- if (available == bufsize)
- {
- if (tokenBegin > 2048)
- {
- bufpos = maxNextCharInd = 0;
- available = tokenBegin;
- }
- else if (tokenBegin < 0)
- bufpos = maxNextCharInd = 0;
- else
- ExpandBuff(false);
- }
- else if (available > tokenBegin)
- available = bufsize;
- else if ((tokenBegin - available) < 2048)
- ExpandBuff(true);
- else
- available = tokenBegin;
- }
-
- int i;
- try {
- if ((i = inputStream.read(buffer, maxNextCharInd,
- available - maxNextCharInd)) == -1)
- {
- inputStream.close();
- throw new java.io.IOException();
- }
- else
- maxNextCharInd += i;
- return;
- }
- catch(java.io.IOException e) {
- --bufpos;
- backup(0);
- if (tokenBegin == -1)
- tokenBegin = bufpos;
- throw e;
- }
- }
-
- public char BeginToken() throws java.io.IOException
- {
- tokenBegin = -1;
- char c = readChar();
- tokenBegin = bufpos;
-
- return c;
- }
-
- protected void UpdateLineColumn(char c)
- {
- column++;
-
- if (prevCharIsLF)
- {
- prevCharIsLF = false;
- line += (column = 1);
- }
- else if (prevCharIsCR)
- {
- prevCharIsCR = false;
- if (c == '\n')
- {
- prevCharIsLF = true;
- }
- else
- line += (column = 1);
- }
-
- switch (c)
- {
- case '\r' :
- prevCharIsCR = true;
- break;
- case '\n' :
- prevCharIsLF = true;
- break;
- case '\t' :
- column--;
- column += (tabSize - (column % tabSize));
- break;
- default :
- break;
- }
-
- bufline[bufpos] = line;
- bufcolumn[bufpos] = column;
- }
-
- public char readChar() throws java.io.IOException
- {
- if (inBuf > 0)
- {
- --inBuf;
-
- if (++bufpos == bufsize)
- bufpos = 0;
-
- return buffer[bufpos];
- }
-
- if (++bufpos >= maxNextCharInd)
- FillBuff();
-
- char c = buffer[bufpos];
-
- UpdateLineColumn(c);
- return (c);
- }
-
- /**
- * @deprecated
- * @see #getEndColumn
- */
-
- public int getColumn() {
- return bufcolumn[bufpos];
- }
-
- /**
- * @deprecated
- * @see #getEndLine
- */
-
- public int getLine() {
- return bufline[bufpos];
- }
-
- public int getEndColumn() {
- return bufcolumn[bufpos];
- }
-
- public int getEndLine() {
- return bufline[bufpos];
- }
-
- public int getBeginColumn() {
- return bufcolumn[tokenBegin];
- }
-
- public int getBeginLine() {
- return bufline[tokenBegin];
- }
-
- public void backup(int amount) {
-
- inBuf += amount;
- if ((bufpos -= amount) < 0)
- bufpos += bufsize;
- }
-
- public SimpleCharStream(java.io.Reader dstream, int startline,
- int startcolumn, int buffersize)
- {
- inputStream = dstream;
- line = startline;
- column = startcolumn - 1;
-
- available = bufsize = buffersize;
- buffer = new char[buffersize];
- bufline = new int[buffersize];
- bufcolumn = new int[buffersize];
- }
-
- public SimpleCharStream(java.io.Reader dstream, int startline,
- int startcolumn)
- {
- this(dstream, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.Reader dstream)
- {
- this(dstream, 1, 1, 4096);
- }
- public void ReInit(java.io.Reader dstream, int startline,
- int startcolumn, int buffersize)
- {
- inputStream = dstream;
- line = startline;
- column = startcolumn - 1;
-
- if (buffer == null || buffersize != buffer.length)
- {
- available = bufsize = buffersize;
- buffer = new char[buffersize];
- bufline = new int[buffersize];
- bufcolumn = new int[buffersize];
- }
- prevCharIsLF = prevCharIsCR = false;
- tokenBegin = inBuf = maxNextCharInd = 0;
- bufpos = -1;
- }
-
- public void ReInit(java.io.Reader dstream, int startline,
- int startcolumn)
- {
- ReInit(dstream, startline, startcolumn, 4096);
- }
-
- public void ReInit(java.io.Reader dstream)
- {
- ReInit(dstream, 1, 1, 4096);
- }
- public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
- {
- this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, int startline,
- int startcolumn, int buffersize)
- {
- this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn) throws java.io.UnsupportedEncodingException
- {
- this(dstream, encoding, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, int startline,
- int startcolumn)
- {
- this(dstream, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
- {
- this(dstream, encoding, 1, 1, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream)
- {
- this(dstream, 1, 1, 4096);
- }
-
- public void ReInit(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
- {
- ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
- }
-
- public void ReInit(java.io.InputStream dstream, int startline,
- int startcolumn, int buffersize)
- {
- ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
- }
-
- public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
- {
- ReInit(dstream, encoding, 1, 1, 4096);
- }
-
- public void ReInit(java.io.InputStream dstream)
- {
- ReInit(dstream, 1, 1, 4096);
- }
- public void ReInit(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn) throws java.io.UnsupportedEncodingException
- {
- ReInit(dstream, encoding, startline, startcolumn, 4096);
- }
- public void ReInit(java.io.InputStream dstream, int startline,
- int startcolumn)
- {
- ReInit(dstream, startline, startcolumn, 4096);
- }
- public String GetImage()
- {
- if (bufpos >= tokenBegin)
- return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
- else
- return new String(buffer, tokenBegin, bufsize - tokenBegin) +
- new String(buffer, 0, bufpos + 1);
- }
-
- public char[] GetSuffix(int len)
- {
- char[] ret = new char[len];
-
- if ((bufpos + 1) >= len)
- System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
- else
- {
- System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
- len - bufpos - 1);
- System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
- }
-
- return ret;
- }
-
- public void Done()
- {
- buffer = null;
- bufline = null;
- bufcolumn = null;
- }
-
- /**
- * Method to adjust line and column numbers for the start of a token.
- */
- public void adjustBeginLineColumn(int newLine, int newCol)
- {
- int start = tokenBegin;
- int len;
-
- if (bufpos >= tokenBegin)
- {
- len = bufpos - tokenBegin + inBuf + 1;
- }
- else
- {
- len = bufsize - tokenBegin + bufpos + 1 + inBuf;
- }
-
- int i = 0, j = 0, k = 0;
- int nextColDiff = 0, columnDiff = 0;
-
- while (i < len &&
- bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
- {
- bufline[j] = newLine;
- nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
- bufcolumn[j] = newCol + columnDiff;
- columnDiff = nextColDiff;
- i++;
- }
-
- if (i < len)
- {
- bufline[j] = newLine++;
- bufcolumn[j] = newCol + columnDiff;
-
- while (i++ < len)
- {
- if (bufline[j = start % bufsize] != bufline[++start % bufsize])
- bufline[j] = newLine++;
- else
- bufline[j] = newLine;
- }
- }
-
- line = bufline[j];
- column = bufcolumn[j];
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/Token.java b/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/Token.java
deleted file mode 100644
index 52d101ed0..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/Token.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.datetime.parser;
-
-/**
- * Describes the input token stream.
- */
-
-public class Token {
-
- /**
- * An integer that describes the kind of this token. This numbering
- * system is determined by JavaCCParser, and a table of these numbers is
- * stored in the file ...Constants.java.
- */
- public int kind;
-
- /**
- * beginLine and beginColumn describe the position of the first character
- * of this token; endLine and endColumn describe the position of the
- * last character of this token.
- */
- public int beginLine, beginColumn, endLine, endColumn;
-
- /**
- * The string image of the token.
- */
- public String image;
-
- /**
- * A reference to the next regular (non-special) token from the input
- * stream. If this is the last token from the input stream, or if the
- * token manager has not read tokens beyond this one, this field is
- * set to null. This is true only if this token is also a regular
- * token. Otherwise, see below for a description of the contents of
- * this field.
- */
- public Token next;
-
- /**
- * This field is used to access special tokens that occur prior to this
- * token, but after the immediately preceding regular (non-special) token.
- * If there are no such special tokens, this field is set to null.
- * When there are more than one such special token, this field refers
- * to the last of these special tokens, which in turn refers to the next
- * previous special token through its specialToken field, and so on
- * until the first special token (whose specialToken field is null).
- * The next fields of special tokens refer to other special tokens that
- * immediately follow it (without an intervening regular token). If there
- * is no such token, this field is null.
- */
- public Token specialToken;
-
- /**
- * Returns the image.
- */
- public String toString()
- {
- return image;
- }
-
- /**
- * Returns a new Token object, by default. However, if you want, you
- * can create and return subclass objects based on the value of ofKind.
- * Simply add the cases to the switch for all those special cases.
- * For example, if you have a subclass of Token called IDToken that
- * you want to create if ofKind is ID, simlpy add something like :
- *
- * case MyParserConstants.ID : return new IDToken();
- *
- * to the following switch statement. Then you can cast matchedToken
- * variable to the appropriate type and use it in your lexical actions.
- */
- public static final Token newToken(int ofKind)
- {
- switch(ofKind)
- {
- default : return new Token();
- }
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/TokenMgrError.java b/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/TokenMgrError.java
deleted file mode 100644
index 973255070..000000000
--- a/emailcommon/src/org/apache/james/mime4j/field/datetime/parser/TokenMgrError.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.james.mime4j.field.datetime.parser;
-
-public class TokenMgrError extends Error
-{
- /*
- * Ordinals for various reasons why an Error of this type can be thrown.
- */
-
- /**
- * Lexical error occured.
- */
- static final int LEXICAL_ERROR = 0;
-
- /**
- * An attempt wass made to create a second instance of a static token manager.
- */
- static final int STATIC_LEXER_ERROR = 1;
-
- /**
- * Tried to change to an invalid lexical state.
- */
- static final int INVALID_LEXICAL_STATE = 2;
-
- /**
- * Detected (and bailed out of) an infinite loop in the token manager.
- */
- static final int LOOP_DETECTED = 3;
-
- /**
- * Indicates the reason why the exception is thrown. It will have
- * one of the above 4 values.
- */
- int errorCode;
-
- /**
- * Replaces unprintable characters by their espaced (or unicode escaped)
- * equivalents in the given string
- */
- protected static final String addEscapes(String str) {
- StringBuffer retval = new StringBuffer();
- char ch;
- for (int i = 0; i < str.length(); i++) {
- switch (str.charAt(i))
- {
- case 0 :
- continue;
- case '\b':
- retval.append("\\b");
- continue;
- case '\t':
- retval.append("\\t");
- continue;
- case '\n':
- retval.append("\\n");
- continue;
- case '\f':
- retval.append("\\f");
- continue;
- case '\r':
- retval.append("\\r");
- continue;
- case '\"':
- retval.append("\\\"");
- continue;
- case '\'':
- retval.append("\\\'");
- continue;
- case '\\':
- retval.append("\\\\");
- continue;
- default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
- } else {
- retval.append(ch);
- }
- continue;
- }
- }
- return retval.toString();
- }
-
- /**
- * Returns a detailed message for the Error when it is thrown by the
- * token manager to indicate a lexical error.
- * Parameters :
- * EOFSeen : indicates if EOF caused the lexicl error
- * curLexState : lexical state in which this error occured
- * errorLine : line number when the error occured
- * errorColumn : column number when the error occured
- * errorAfter : prefix that was seen before this error occured
- * curchar : the offending character
- * Note: You can customize the lexical error message by modifying this method.
- */
- protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
- return("Lexical error at line " +
- errorLine + ", column " +
- errorColumn + ". Encountered: " +
- (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
- "after : \"" + addEscapes(errorAfter) + "\"");
- }
-
- /**
- * You can also modify the body of this method to customize your error messages.
- * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
- * of end-users concern, so you can return something like :
- *
- * "Internal Error : Please file a bug report .... "
- *
- * from this method for such cases in the release version of your parser.
- */
- public String getMessage() {
- return super.getMessage();
- }
-
- /*
- * Constructors of various flavors follow.
- */
-
- public TokenMgrError() {
- }
-
- public TokenMgrError(String message, int reason) {
- super(message);
- errorCode = reason;
- }
-
- public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
- this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/message/AbstractBody.java b/emailcommon/src/org/apache/james/mime4j/message/AbstractBody.java
deleted file mode 100644
index d2647ec77..000000000
--- a/emailcommon/src/org/apache/james/mime4j/message/AbstractBody.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.message;
-
-
-/**
- * Abstract <code>Body</code> implementation providing the parent
- * functionality required by bodies.
- *
- *
- * @version $Id: AbstractBody.java,v 1.2 2004/10/02 12:41:11 ntherning Exp $
- */
-public abstract class AbstractBody implements Body {
- private Entity parent = null;
-
- /**
- * @see org.apache.james.mime4j.message.Body#getParent()
- */
- public Entity getParent() {
- return parent;
- }
-
- /**
- * @see org.apache.james.mime4j.message.Body#setParent(org.apache.james.mime4j.message.Entity)
- */
- public void setParent(Entity parent) {
- this.parent = parent;
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/message/BinaryBody.java b/emailcommon/src/org/apache/james/mime4j/message/BinaryBody.java
deleted file mode 100644
index bfc992a8f..000000000
--- a/emailcommon/src/org/apache/james/mime4j/message/BinaryBody.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.message;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-
-/**
- * Interface implemented by bodies containing binary data.
- *
- *
- * @version $Id: BinaryBody.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $
- */
-public interface BinaryBody extends Body {
-
- /**
- * Gets a <code>InputStream</code> which reads the bytes of the
- * body.
- *
- * @return the stream.
- * @throws IOException on I/O errors.
- */
- InputStream getInputStream() throws IOException;
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/message/Body.java b/emailcommon/src/org/apache/james/mime4j/message/Body.java
deleted file mode 100644
index 54b8948db..000000000
--- a/emailcommon/src/org/apache/james/mime4j/message/Body.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.message;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * Encapsulates the body of an entity (see RFC 2045).
- *
- *
- * @version $Id: Body.java,v 1.4 2004/10/04 15:36:43 ntherning Exp $
- */
-public interface Body {
-
- /**
- * Gets the parent of this body.
- *
- * @return the parent.
- */
- Entity getParent();
-
- /**
- * Sets the parent of this body.
- *
- * @param parent the parent.
- */
- void setParent(Entity parent);
-
- /**
- * Writes this body to the given stream in MIME message format.
- *
- * @param out the stream to write to.
- * @throws IOException on I/O errors.
- */
- void writeTo(OutputStream out) throws IOException;
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/message/BodyPart.java b/emailcommon/src/org/apache/james/mime4j/message/BodyPart.java
deleted file mode 100644
index 474030d7f..000000000
--- a/emailcommon/src/org/apache/james/mime4j/message/BodyPart.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.message;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-
-/**
- * Represents a MIME body part (see RFC 2045).
- *
- *
- * @version $Id: BodyPart.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $
- */
-public class BodyPart extends Entity {
-
- /**
- *
- * @see org.apache.james.mime4j.message.Entity#writeTo(java.io.OutputStream)
- */
- public void writeTo(OutputStream out) throws IOException {
- getHeader().writeTo(out);
- getBody().writeTo(out);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/message/Entity.java b/emailcommon/src/org/apache/james/mime4j/message/Entity.java
deleted file mode 100644
index 96f2a4875..000000000
--- a/emailcommon/src/org/apache/james/mime4j/message/Entity.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.message;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.apache.james.mime4j.field.ContentTransferEncodingField;
-import org.apache.james.mime4j.field.ContentTypeField;
-import org.apache.james.mime4j.field.Field;
-
-/**
- * MIME entity. An entity has a header and a body (see RFC 2045).
- *
- *
- * @version $Id: Entity.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $
- */
-public abstract class Entity {
- private Header header = null;
- private Body body = null;
- private Entity parent = null;
-
- /**
- * Gets the parent entity of this entity.
- * Returns <code>null</code> if this is the root entity.
- *
- * @return the parent or <code>null</code>.
- */
- public Entity getParent() {
- return parent;
- }
-
- /**
- * Sets the parent entity of this entity.
- *
- * @param parent the parent entity or <code>null</code> if
- * this will be the root entity.
- */
- public void setParent(Entity parent) {
- this.parent = parent;
- }
-
- /**
- * Gets the entity header.
- *
- * @return the header.
- */
- public Header getHeader() {
- return header;
- }
-
- /**
- * Sets the entity header.
- *
- * @param header the header.
- */
- public void setHeader(Header header) {
- this.header = header;
- }
-
- /**
- * Gets the body of this entity.
- *
- * @return the body,
- */
- public Body getBody() {
- return body;
- }
-
- /**
- * Sets the body of this entity.
- *
- * @param body the body.
- */
- public void setBody(Body body) {
- this.body = body;
- body.setParent(this);
- }
-
- /**
- * Determines the MIME type of this <code>Entity</code>. The MIME type
- * is derived by looking at the parent's Content-Type field if no
- * Content-Type field is set for this <code>Entity</code>.
- *
- * @return the MIME type.
- */
- public String getMimeType() {
- ContentTypeField child =
- (ContentTypeField) getHeader().getField(Field.CONTENT_TYPE);
- ContentTypeField parent = getParent() != null
- ? (ContentTypeField) getParent().getHeader().
- getField(Field.CONTENT_TYPE)
- : null;
-
- return ContentTypeField.getMimeType(child, parent);
- }
-
- /**
- * Determines the MIME character set encoding of this <code>Entity</code>.
- *
- * @return the MIME character set encoding.
- */
- public String getCharset() {
- return ContentTypeField.getCharset(
- (ContentTypeField) getHeader().getField(Field.CONTENT_TYPE));
- }
-
- /**
- * Determines the transfer encoding of this <code>Entity</code>.
- *
- * @return the transfer encoding.
- */
- public String getContentTransferEncoding() {
- ContentTransferEncodingField f = (ContentTransferEncodingField)
- getHeader().getField(Field.CONTENT_TRANSFER_ENCODING);
-
- return ContentTransferEncodingField.getEncoding(f);
- }
-
- /**
- * Determines if the MIME type of this <code>Entity</code> matches the
- * given one. MIME types are case-insensitive.
- *
- * @param type the MIME type to match against.
- * @return <code>true</code> on match, <code>false</code> otherwise.
- */
- public boolean isMimeType(String type) {
- return getMimeType().equalsIgnoreCase(type);
- }
-
- /**
- * Determines if the MIME type of this <code>Entity</code> is
- * <code>multipart/*</code>. Since multipart-entities must have
- * a boundary parameter in the <code>Content-Type</code> field this
- * method returns <code>false</code> if no boundary exists.
- *
- * @return <code>true</code> on match, <code>false</code> otherwise.
- */
- public boolean isMultipart() {
- ContentTypeField f =
- (ContentTypeField) getHeader().getField(Field.CONTENT_TYPE);
- return f != null && f.getBoundary() != null
- && getMimeType().startsWith(ContentTypeField.TYPE_MULTIPART_PREFIX);
- }
-
- /**
- * Write the content to the given outputstream
- *
- * @param out the outputstream to write to
- * @throws IOException
- */
- public abstract void writeTo(OutputStream out) throws IOException;
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/message/Header.java b/emailcommon/src/org/apache/james/mime4j/message/Header.java
deleted file mode 100644
index e9216a821..000000000
--- a/emailcommon/src/org/apache/james/mime4j/message/Header.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.message;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.james.mime4j.AbstractContentHandler;
-import org.apache.james.mime4j.MimeStreamParser;
-import org.apache.james.mime4j.field.ContentTypeField;
-import org.apache.james.mime4j.field.Field;
-import org.apache.james.mime4j.util.CharsetUtil;
-
-
-/**
- * The header of an entity (see RFC 2045).
- *
- *
- * @version $Id: Header.java,v 1.3 2004/10/04 15:36:44 ntherning Exp $
- */
-public class Header {
- private List<Field> fields = new LinkedList<Field>();
- private HashMap<String, List<Field>> fieldMap = new HashMap<String, List<Field>>();
-
- /**
- * Creates a new empty <code>Header</code>.
- */
- public Header() {
- }
-
- /**
- * Creates a new <code>Header</code> from the specified stream.
- *
- * @param is the stream to read the header from.
- */
- public Header(InputStream is) throws IOException {
- final MimeStreamParser parser = new MimeStreamParser();
- parser.setContentHandler(new AbstractContentHandler() {
- @Override
- public void endHeader() {
- parser.stop();
- }
- @Override
- public void field(String fieldData) {
- addField(Field.parse(fieldData));
- }
- });
- parser.parse(is);
- }
-
- /**
- * Adds a field to the end of the list of fields.
- *
- * @param field the field to add.
- */
- public void addField(Field field) {
- List<Field> values = fieldMap.get(field.getName().toLowerCase());
- if (values == null) {
- values = new LinkedList<Field>();
- fieldMap.put(field.getName().toLowerCase(), values);
- }
- values.add(field);
- fields.add(field);
- }
-
- /**
- * Gets the fields of this header. The returned list will not be
- * modifiable.
- *
- * @return the list of <code>Field</code> objects.
- */
- public List<Field> getFields() {
- return Collections.unmodifiableList(fields);
- }
-
- /**
- * Gets a <code>Field</code> given a field name. If there are multiple
- * such fields defined in this header the first one will be returned.
- *
- * @param name the field name (e.g. From, Subject).
- * @return the field or <code>null</code> if none found.
- */
- public Field getField(String name) {
- List<Field> l = fieldMap.get(name.toLowerCase());
- if (l != null && !l.isEmpty()) {
- return l.get(0);
- }
- return null;
- }
-
- /**
- * Gets all <code>Field</code>s having the specified field name.
- *
- * @param name the field name (e.g. From, Subject).
- * @return the list of fields.
- */
- public List<Field> getFields(String name) {
- List<Field> l = fieldMap.get(name.toLowerCase());
- return Collections.unmodifiableList(l);
- }
-
- /**
- * Return Header Object as String representation. Each headerline is
- * seperated by "\r\n"
- *
- * @return headers
- */
- @Override
- public String toString() {
- StringBuffer str = new StringBuffer();
- for (Iterator<Field> it = fields.iterator(); it.hasNext();) {
- str.append(it.next().toString());
- str.append("\r\n");
- }
- return str.toString();
- }
-
-
- /**
- * Write the Header to the given OutputStream
- *
- * @param out the OutputStream to write to
- * @throws IOException
- */
- public void writeTo(OutputStream out) throws IOException {
- String charString = ((ContentTypeField) getField(Field.CONTENT_TYPE)).getCharset();
-
- BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, CharsetUtil.getCharset(charString)),8192);
- writer.write(toString()+ "\r\n");
- writer.flush();
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/message/MemoryBinaryBody.java b/emailcommon/src/org/apache/james/mime4j/message/MemoryBinaryBody.java
deleted file mode 100644
index a44db4db1..000000000
--- a/emailcommon/src/org/apache/james/mime4j/message/MemoryBinaryBody.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.message;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.apache.commons.io.IOUtils;
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.util.TempPath;
-import org.apache.james.mime4j.util.TempStorage;
-
-
-/**
- * Binary body backed by a {@link org.apache.james.mime4j.util.TempFile}.
- *
- *
- * @version $Id: TempFileBinaryBody.java,v 1.2 2004/10/02 12:41:11 ntherning Exp $
- */
-class MemoryBinaryBody extends AbstractBody implements BinaryBody {
- private static Log log = LogFactory.getLog(MemoryBinaryBody.class);
-
- private Entity parent = null;
- private byte[] tempFile = null;
-
- /**
- * Use the given InputStream to build the TemporyFileBinaryBody
- *
- * @param is the InputStream to use as source
- * @throws IOException
- */
- public MemoryBinaryBody(InputStream is) throws IOException {
-
- TempPath tempPath = TempStorage.getInstance().getRootTempPath();
-
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- IOUtils.copy(is, out);
- out.close();
- tempFile = out.toByteArray();
- }
-
- /**
- * @see org.apache.james.mime4j.message.AbstractBody#getParent()
- */
- public Entity getParent() {
- return parent;
- }
-
- /**
- * @see org.apache.james.mime4j.message.AbstractBody#setParent(org.apache.james.mime4j.message.Entity)
- */
- public void setParent(Entity parent) {
- this.parent = parent;
- }
-
- /**
- * @see org.apache.james.mime4j.message.BinaryBody#getInputStream()
- */
- public InputStream getInputStream() throws IOException {
- return new ByteArrayInputStream(tempFile);
- }
-
- /**
- * @see org.apache.james.mime4j.message.Body#writeTo(java.io.OutputStream)
- */
- public void writeTo(OutputStream out) throws IOException {
- IOUtils.copy(getInputStream(),out);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/message/MemoryTextBody.java b/emailcommon/src/org/apache/james/mime4j/message/MemoryTextBody.java
deleted file mode 100644
index 71af6637c..000000000
--- a/emailcommon/src/org/apache/james/mime4j/message/MemoryTextBody.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.message;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-
-import org.apache.commons.io.IOUtils;
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.util.CharsetUtil;
-import org.apache.james.mime4j.util.TempPath;
-import org.apache.james.mime4j.util.TempStorage;
-
-
-/**
- * Text body backed by a {@link org.apache.james.mime4j.util.TempFile}.
- *
- *
- * @version $Id: TempFileTextBody.java,v 1.3 2004/10/25 07:26:46 ntherning Exp $
- */
-class MemoryTextBody extends AbstractBody implements TextBody {
- private static Log log = LogFactory.getLog(MemoryTextBody.class);
-
- private String mimeCharset = null;
- private byte[] tempFile = null;
-
- public MemoryTextBody(InputStream is) throws IOException {
- this(is, null);
- }
-
- public MemoryTextBody(InputStream is, String mimeCharset)
- throws IOException {
-
- this.mimeCharset = mimeCharset;
-
- TempPath tempPath = TempStorage.getInstance().getRootTempPath();
-
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- IOUtils.copy(is, out);
- out.close();
- tempFile = out.toByteArray();
- }
-
- /**
- * @see org.apache.james.mime4j.message.TextBody#getReader()
- */
- public Reader getReader() throws UnsupportedEncodingException, IOException {
- String javaCharset = null;
- if (mimeCharset != null) {
- javaCharset = CharsetUtil.toJavaCharset(mimeCharset);
- }
-
- if (javaCharset == null) {
- javaCharset = "ISO-8859-1";
-
- if (log.isWarnEnabled()) {
- if (mimeCharset == null) {
- log.warn("No MIME charset specified. Using " + javaCharset
- + " instead.");
- } else {
- log.warn("MIME charset '" + mimeCharset + "' has no "
- + "corresponding Java charset. Using " + javaCharset
- + " instead.");
- }
- }
- }
- /*
- if (log.isWarnEnabled()) {
- if (mimeCharset == null) {
- log.warn("No MIME charset specified. Using the "
- + "platform's default charset.");
- } else {
- log.warn("MIME charset '" + mimeCharset + "' has no "
- + "corresponding Java charset. Using the "
- + "platform's default charset.");
- }
- }
-
- return new InputStreamReader(tempFile.getInputStream());
- }*/
-
- return new InputStreamReader(new ByteArrayInputStream(tempFile), javaCharset);
- }
-
-
- /**
- * @see org.apache.james.mime4j.message.Body#writeTo(java.io.OutputStream)
- */
- public void writeTo(OutputStream out) throws IOException {
- IOUtils.copy(new ByteArrayInputStream(tempFile), out);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/message/Message.java b/emailcommon/src/org/apache/james/mime4j/message/Message.java
deleted file mode 100644
index 514307185..000000000
--- a/emailcommon/src/org/apache/james/mime4j/message/Message.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.message;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Stack;
-
-import org.apache.james.mime4j.BodyDescriptor;
-import org.apache.james.mime4j.ContentHandler;
-import org.apache.james.mime4j.MimeStreamParser;
-import org.apache.james.mime4j.decoder.Base64InputStream;
-import org.apache.james.mime4j.decoder.QuotedPrintableInputStream;
-import org.apache.james.mime4j.field.Field;
-import org.apache.james.mime4j.field.UnstructuredField;
-
-
-/**
- * Represents a MIME message. The following code parses a stream into a
- * <code>Message</code> object.
- *
- * <pre>
- * Message msg = new Message(new BufferedInputStream(
- * new FileInputStream("mime.msg")));
- * </pre>
- *
- *
- *
- * @version $Id: Message.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $
- */
-public class Message extends Entity implements Body {
-
- /**
- * Creates a new empty <code>Message</code>.
- */
- public Message() {
- }
-
- /**
- * Parses the specified MIME message stream into a <code>Message</code>
- * instance.
- *
- * @param is the stream to parse.
- * @throws IOException on I/O errors.
- */
- public Message(InputStream is) throws IOException {
- MimeStreamParser parser = new MimeStreamParser();
- parser.setContentHandler(new MessageBuilder());
- parser.parse(is);
- }
-
-
- /**
- * Gets the <code>Subject</code> field.
- *
- * @return the <code>Subject</code> field or <code>null</code> if it
- * doesn't exist.
- */
- public UnstructuredField getSubject() {
- return (UnstructuredField) getHeader().getField(Field.SUBJECT);
- }
-
- /**
- *
- * @see org.apache.james.mime4j.message.Entity#writeTo(java.io.OutputStream)
- */
- @Override
- public void writeTo(OutputStream out) throws IOException {
- getHeader().writeTo(out);
-
- Body body = getBody();
- if (body instanceof Multipart) {
- Multipart mp = (Multipart) body;
- mp.writeTo(out);
- } else {
- body.writeTo(out);
- }
- }
-
-
- private class MessageBuilder implements ContentHandler {
- private Stack<Object> stack = new Stack<Object>();
-
- public MessageBuilder() {
- }
-
- private void expect(Class c) {
- if (!c.isInstance(stack.peek())) {
- throw new IllegalStateException("Internal stack error: "
- + "Expected '" + c.getName() + "' found '"
- + stack.peek().getClass().getName() + "'");
- }
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#startMessage()
- */
- public void startMessage() {
- if (stack.isEmpty()) {
- stack.push(Message.this);
- } else {
- expect(Entity.class);
- Message m = new Message();
- ((Entity) stack.peek()).setBody(m);
- stack.push(m);
- }
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#endMessage()
- */
- public void endMessage() {
- expect(Message.class);
- stack.pop();
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#startHeader()
- */
- public void startHeader() {
- stack.push(new Header());
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#field(java.lang.String)
- */
- public void field(String fieldData) {
- expect(Header.class);
- ((Header) stack.peek()).addField(Field.parse(fieldData));
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#endHeader()
- */
- public void endHeader() {
- expect(Header.class);
- Header h = (Header) stack.pop();
- expect(Entity.class);
- ((Entity) stack.peek()).setHeader(h);
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#startMultipart(org.apache.james.mime4j.BodyDescriptor)
- */
- public void startMultipart(BodyDescriptor bd) {
- expect(Entity.class);
-
- Entity e = (Entity) stack.peek();
- Multipart multiPart = new Multipart();
- e.setBody(multiPart);
- stack.push(multiPart);
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#body(org.apache.james.mime4j.BodyDescriptor, java.io.InputStream)
- */
- public void body(BodyDescriptor bd, InputStream is) throws IOException {
- expect(Entity.class);
-
- String enc = bd.getTransferEncoding();
- if ("base64".equals(enc)) {
- is = new Base64InputStream(is);
- } else if ("quoted-printable".equals(enc)) {
- is = new QuotedPrintableInputStream(is);
- }
-
- Body body = null;
- if (bd.getMimeType().startsWith("text/")) {
- body = new MemoryTextBody(is, bd.getCharset());
- } else {
- body = new MemoryBinaryBody(is);
- }
-
- ((Entity) stack.peek()).setBody(body);
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#endMultipart()
- */
- public void endMultipart() {
- stack.pop();
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#startBodyPart()
- */
- public void startBodyPart() {
- expect(Multipart.class);
-
- BodyPart bodyPart = new BodyPart();
- ((Multipart) stack.peek()).addBodyPart(bodyPart);
- stack.push(bodyPart);
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#endBodyPart()
- */
- public void endBodyPart() {
- expect(BodyPart.class);
- stack.pop();
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#epilogue(java.io.InputStream)
- */
- public void epilogue(InputStream is) throws IOException {
- expect(Multipart.class);
- StringBuffer sb = new StringBuffer();
- int b;
- while ((b = is.read()) != -1) {
- sb.append((char) b);
- }
- ((Multipart) stack.peek()).setEpilogue(sb.toString());
- }
-
- /**
- * @see org.apache.james.mime4j.ContentHandler#preamble(java.io.InputStream)
- */
- public void preamble(InputStream is) throws IOException {
- expect(Multipart.class);
- StringBuffer sb = new StringBuffer();
- int b;
- while ((b = is.read()) != -1) {
- sb.append((char) b);
- }
- ((Multipart) stack.peek()).setPreamble(sb.toString());
- }
-
- /**
- * TODO: Implement me
- *
- * @see org.apache.james.mime4j.ContentHandler#raw(java.io.InputStream)
- */
- public void raw(InputStream is) throws IOException {
- throw new UnsupportedOperationException("Not supported");
- }
-
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/message/Multipart.java b/emailcommon/src/org/apache/james/mime4j/message/Multipart.java
deleted file mode 100644
index d83400097..000000000
--- a/emailcommon/src/org/apache/james/mime4j/message/Multipart.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.message;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.james.mime4j.field.ContentTypeField;
-import org.apache.james.mime4j.field.Field;
-import org.apache.james.mime4j.util.CharsetUtil;
-
-/**
- * Represents a MIME multipart body (see RFC 2045).A multipart body has a
- * ordered list of body parts. The multipart body also has a preamble and
- * epilogue. The preamble consists of whatever characters appear before the
- * first body part while the epilogue consists of whatever characters come
- * after the last body part.
- *
- *
- * @version $Id: Multipart.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $
- */
-public class Multipart implements Body {
- private String preamble = "";
- private String epilogue = "";
- private List<BodyPart> bodyParts = new LinkedList<BodyPart>();
- private Entity parent = null;
- private String subType = "alternative";
-
- /**
- * Creates a new empty <code>Multipart</code> instance.
- */
- public Multipart() {
- }
-
- /**
- * Gets the multipart sub-type. E.g. <code>alternative</code> (the default)
- * or <code>parallel</code>. See RFC 2045 for common sub-types and their
- * meaning.
- *
- * @return the multipart sub-type.
- */
- public String getSubType() {
- return subType;
- }
-
- /**
- * Sets the multipart sub-type. E.g. <code>alternative</code>
- * or <code>parallel</code>. See RFC 2045 for common sub-types and their
- * meaning.
- *
- * @param subType the sub-type.
- */
- public void setSubType(String subType) {
- this.subType = subType;
- }
-
- /**
- * @see org.apache.james.mime4j.message.Body#getParent()
- */
- public Entity getParent() {
- return parent;
- }
-
- /**
- * @see org.apache.james.mime4j.message.Body#setParent(org.apache.james.mime4j.message.Entity)
- */
- public void setParent(Entity parent) {
- this.parent = parent;
- for (Iterator<BodyPart> it = bodyParts.iterator(); it.hasNext();) {
- it.next().setParent(parent);
- }
- }
-
- /**
- * Gets the epilogue.
- *
- * @return the epilogue.
- */
- public String getEpilogue() {
- return epilogue;
- }
-
- /**
- * Sets the epilogue.
- *
- * @param epilogue the epilogue.
- */
- public void setEpilogue(String epilogue) {
- this.epilogue = epilogue;
- }
-
- /**
- * Gets the list of body parts. The list is immutable.
- *
- * @return the list of <code>BodyPart</code> objects.
- */
- public List<BodyPart> getBodyParts() {
- return Collections.unmodifiableList(bodyParts);
- }
-
- /**
- * Sets the list of body parts.
- *
- * @param bodyParts the new list of <code>BodyPart</code> objects.
- */
- public void setBodyParts(List<BodyPart> bodyParts) {
- this.bodyParts = bodyParts;
- for (Iterator<BodyPart> it = bodyParts.iterator(); it.hasNext();) {
- it.next().setParent(parent);
- }
- }
-
- /**
- * Adds a body part to the end of the list of body parts.
- *
- * @param bodyPart the body part.
- */
- public void addBodyPart(BodyPart bodyPart) {
- bodyParts.add(bodyPart);
- bodyPart.setParent(parent);
- }
-
- /**
- * Gets the preamble.
- *
- * @return the preamble.
- */
- public String getPreamble() {
- return preamble;
- }
-
- /**
- * Sets the preamble.
- *
- * @param preamble the preamble.
- */
- public void setPreamble(String preamble) {
- this.preamble = preamble;
- }
-
- /**
- *
- * @see org.apache.james.mime4j.message.Body#writeTo(java.io.OutputStream)
- */
- public void writeTo(OutputStream out) throws IOException {
- String boundary = getBoundary();
- List<BodyPart> bodyParts = getBodyParts();
-
- BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, CharsetUtil.getCharset(getCharset())),8192);
-
- writer.write(getPreamble() + "\r\n");
-
- for (int i = 0; i < bodyParts.size(); i++) {
- writer.write(boundary + "\r\n");
- bodyParts.get(i).writeTo(out);
- }
-
- writer.write(getEpilogue() + "\r\n");
- writer.write(boundary + "--" + "\r\n");
-
- }
-
- /**
- * Return the boundory of the parent Entity
- *
- * @return boundery
- */
- private String getBoundary() {
- Entity e = getParent();
- ContentTypeField cField = (ContentTypeField) e.getHeader().getField(
- Field.CONTENT_TYPE);
- return cField.getBoundary();
- }
-
- private String getCharset() {
- Entity e = getParent();
- String charString = ((ContentTypeField) e.getHeader().getField(Field.CONTENT_TYPE)).getCharset();
- return charString;
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/message/TempFileBinaryBody.java b/emailcommon/src/org/apache/james/mime4j/message/TempFileBinaryBody.java
deleted file mode 100644
index 9db1482f4..000000000
--- a/emailcommon/src/org/apache/james/mime4j/message/TempFileBinaryBody.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.message;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.apache.commons.io.IOUtils;
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.util.TempFile;
-import org.apache.james.mime4j.util.TempPath;
-import org.apache.james.mime4j.util.TempStorage;
-
-
-/**
- * Binary body backed by a {@link org.apache.james.mime4j.util.TempFile}.
- *
- *
- * @version $Id: TempFileBinaryBody.java,v 1.2 2004/10/02 12:41:11 ntherning Exp $
- */
-class TempFileBinaryBody extends AbstractBody implements BinaryBody {
- private static Log log = LogFactory.getLog(TempFileBinaryBody.class);
-
- private Entity parent = null;
- private TempFile tempFile = null;
-
- /**
- * Use the given InputStream to build the TemporyFileBinaryBody
- *
- * @param is the InputStream to use as source
- * @throws IOException
- */
- public TempFileBinaryBody(InputStream is) throws IOException {
-
- TempPath tempPath = TempStorage.getInstance().getRootTempPath();
- tempFile = tempPath.createTempFile("attachment", ".bin");
-
- OutputStream out = tempFile.getOutputStream();
- IOUtils.copy(is, out);
- out.close();
- }
-
- /**
- * @see org.apache.james.mime4j.message.AbstractBody#getParent()
- */
- public Entity getParent() {
- return parent;
- }
-
- /**
- * @see org.apache.james.mime4j.message.AbstractBody#setParent(org.apache.james.mime4j.message.Entity)
- */
- public void setParent(Entity parent) {
- this.parent = parent;
- }
-
- /**
- * @see org.apache.james.mime4j.message.BinaryBody#getInputStream()
- */
- public InputStream getInputStream() throws IOException {
- return tempFile.getInputStream();
- }
-
- /**
- * @see org.apache.james.mime4j.message.Body#writeTo(java.io.OutputStream)
- */
- public void writeTo(OutputStream out) throws IOException {
- IOUtils.copy(getInputStream(),out);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/message/TempFileTextBody.java b/emailcommon/src/org/apache/james/mime4j/message/TempFileTextBody.java
deleted file mode 100644
index b74e15d24..000000000
--- a/emailcommon/src/org/apache/james/mime4j/message/TempFileTextBody.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.message;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-
-import org.apache.commons.io.IOUtils;
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.util.CharsetUtil;
-import org.apache.james.mime4j.util.TempFile;
-import org.apache.james.mime4j.util.TempPath;
-import org.apache.james.mime4j.util.TempStorage;
-
-
-/**
- * Text body backed by a {@link org.apache.james.mime4j.util.TempFile}.
- *
- *
- * @version $Id: TempFileTextBody.java,v 1.3 2004/10/25 07:26:46 ntherning Exp $
- */
-class TempFileTextBody extends AbstractBody implements TextBody {
- private static Log log = LogFactory.getLog(TempFileTextBody.class);
-
- private String mimeCharset = null;
- private TempFile tempFile = null;
-
- public TempFileTextBody(InputStream is) throws IOException {
- this(is, null);
- }
-
- public TempFileTextBody(InputStream is, String mimeCharset)
- throws IOException {
-
- this.mimeCharset = mimeCharset;
-
- TempPath tempPath = TempStorage.getInstance().getRootTempPath();
- tempFile = tempPath.createTempFile("attachment", ".txt");
-
- OutputStream out = tempFile.getOutputStream();
- IOUtils.copy(is, out);
- out.close();
- }
-
- /**
- * @see org.apache.james.mime4j.message.TextBody#getReader()
- */
- public Reader getReader() throws UnsupportedEncodingException, IOException {
- String javaCharset = null;
- if (mimeCharset != null) {
- javaCharset = CharsetUtil.toJavaCharset(mimeCharset);
- }
-
- if (javaCharset == null) {
- javaCharset = "ISO-8859-1";
-
- if (log.isWarnEnabled()) {
- if (mimeCharset == null) {
- log.warn("No MIME charset specified. Using " + javaCharset
- + " instead.");
- } else {
- log.warn("MIME charset '" + mimeCharset + "' has no "
- + "corresponding Java charset. Using " + javaCharset
- + " instead.");
- }
- }
- }
- /*
- if (log.isWarnEnabled()) {
- if (mimeCharset == null) {
- log.warn("No MIME charset specified. Using the "
- + "platform's default charset.");
- } else {
- log.warn("MIME charset '" + mimeCharset + "' has no "
- + "corresponding Java charset. Using the "
- + "platform's default charset.");
- }
- }
-
- return new InputStreamReader(tempFile.getInputStream());
- }*/
-
- return new InputStreamReader(tempFile.getInputStream(), javaCharset);
- }
-
-
- /**
- * @see org.apache.james.mime4j.message.Body#writeTo(java.io.OutputStream)
- */
- public void writeTo(OutputStream out) throws IOException {
- IOUtils.copy(tempFile.getInputStream(), out);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/message/TextBody.java b/emailcommon/src/org/apache/james/mime4j/message/TextBody.java
deleted file mode 100644
index 4fe714466..000000000
--- a/emailcommon/src/org/apache/james/mime4j/message/TextBody.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.message;
-
-import java.io.IOException;
-import java.io.Reader;
-
-
-/**
- * Encapsulates the contents of a <code>text/*</code> entity body.
- *
- *
- * @version $Id: TextBody.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $
- */
-public interface TextBody extends Body {
-
- /**
- * Gets a <code>Reader</code> which may be used to read out the contents
- * of this body.
- *
- * @return the <code>Reader</code>.
- * @throws IOException on I/O errors.
- */
- Reader getReader() throws IOException;
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/util/CharsetUtil.java b/emailcommon/src/org/apache/james/mime4j/util/CharsetUtil.java
deleted file mode 100644
index 0fc267d3e..000000000
--- a/emailcommon/src/org/apache/james/mime4j/util/CharsetUtil.java
+++ /dev/null
@@ -1,1246 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.util;
-
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.IllegalCharsetNameException;
-import java.nio.charset.UnsupportedCharsetException;
-import java.util.HashMap;
-import java.util.TreeSet;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-
-/**
- * Utility class for working with character sets. It is somewhat similar to
- * the Java 1.4 <code>java.nio.charset.Charset</code> class but knows many
- * more aliases and is compatible with Java 1.3. It will use a simple detection
- * mechanism to detect what character sets the current VM supports. This will
- * be a sub-set of the character sets listed in the
- * <a href="http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html">
- * Java 1.5 (J2SE5.0) Supported Encodings</a> document.
- * <p>
- * The <a href="http://www.iana.org/assignments/character-sets">
- * IANA Character Sets</a> document has been used to determine the preferred
- * MIME character set names and to get a list of known aliases.
- * <p>
- * This is a complete list of the character sets known to this class:
- * <table>
- * <tr>
- * <td>Canonical (Java) name</td>
- * <td>MIME preferred</td>
- * <td>Aliases</td>
- * </tr>
- * <tr>
- * <td>ASCII</td>
- * <td>US-ASCII</td>
- * <td>ANSI_X3.4-1968 iso-ir-6 ANSI_X3.4-1986 ISO_646.irv:1991 ISO646-US us IBM367 cp367 csASCII ascii7 646 iso_646.irv:1983 </td>
- * </tr>
- * <tr>
- * <td>Big5</td>
- * <td>Big5</td>
- * <td>csBig5 CN-Big5 BIG-FIVE BIGFIVE </td>
- * </tr>
- * <tr>
- * <td>Big5_HKSCS</td>
- * <td>Big5-HKSCS</td>
- * <td>big5hkscs </td>
- * </tr>
- * <tr>
- * <td>Big5_Solaris</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp037</td>
- * <td>IBM037</td>
- * <td>ebcdic-cp-us ebcdic-cp-ca ebcdic-cp-wt ebcdic-cp-nl csIBM037 </td>
- * </tr>
- * <tr>
- * <td>Cp1006</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1025</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1026</td>
- * <td>IBM1026</td>
- * <td>csIBM1026 </td>
- * </tr>
- * <tr>
- * <td>Cp1046</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1047</td>
- * <td>IBM1047</td>
- * <td>IBM-1047 </td>
- * </tr>
- * <tr>
- * <td>Cp1097</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1098</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1112</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1122</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1123</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1124</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1140</td>
- * <td>IBM01140</td>
- * <td>CCSID01140 CP01140 ebcdic-us-37+euro </td>
- * </tr>
- * <tr>
- * <td>Cp1141</td>
- * <td>IBM01141</td>
- * <td>CCSID01141 CP01141 ebcdic-de-273+euro </td>
- * </tr>
- * <tr>
- * <td>Cp1142</td>
- * <td>IBM01142</td>
- * <td>CCSID01142 CP01142 ebcdic-dk-277+euro ebcdic-no-277+euro </td>
- * </tr>
- * <tr>
- * <td>Cp1143</td>
- * <td>IBM01143</td>
- * <td>CCSID01143 CP01143 ebcdic-fi-278+euro ebcdic-se-278+euro </td>
- * </tr>
- * <tr>
- * <td>Cp1144</td>
- * <td>IBM01144</td>
- * <td>CCSID01144 CP01144 ebcdic-it-280+euro </td>
- * </tr>
- * <tr>
- * <td>Cp1145</td>
- * <td>IBM01145</td>
- * <td>CCSID01145 CP01145 ebcdic-es-284+euro </td>
- * </tr>
- * <tr>
- * <td>Cp1146</td>
- * <td>IBM01146</td>
- * <td>CCSID01146 CP01146 ebcdic-gb-285+euro </td>
- * </tr>
- * <tr>
- * <td>Cp1147</td>
- * <td>IBM01147</td>
- * <td>CCSID01147 CP01147 ebcdic-fr-297+euro </td>
- * </tr>
- * <tr>
- * <td>Cp1148</td>
- * <td>IBM01148</td>
- * <td>CCSID01148 CP01148 ebcdic-international-500+euro </td>
- * </tr>
- * <tr>
- * <td>Cp1149</td>
- * <td>IBM01149</td>
- * <td>CCSID01149 CP01149 ebcdic-is-871+euro </td>
- * </tr>
- * <tr>
- * <td>Cp1250</td>
- * <td>windows-1250</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1251</td>
- * <td>windows-1251</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1252</td>
- * <td>windows-1252</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1253</td>
- * <td>windows-1253</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1254</td>
- * <td>windows-1254</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1255</td>
- * <td>windows-1255</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1256</td>
- * <td>windows-1256</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1257</td>
- * <td>windows-1257</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1258</td>
- * <td>windows-1258</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1381</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp1383</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp273</td>
- * <td>IBM273</td>
- * <td>csIBM273 </td>
- * </tr>
- * <tr>
- * <td>Cp277</td>
- * <td>IBM277</td>
- * <td>EBCDIC-CP-DK EBCDIC-CP-NO csIBM277 </td>
- * </tr>
- * <tr>
- * <td>Cp278</td>
- * <td>IBM278</td>
- * <td>CP278 ebcdic-cp-fi ebcdic-cp-se csIBM278 </td>
- * </tr>
- * <tr>
- * <td>Cp280</td>
- * <td>IBM280</td>
- * <td>ebcdic-cp-it csIBM280 </td>
- * </tr>
- * <tr>
- * <td>Cp284</td>
- * <td>IBM284</td>
- * <td>ebcdic-cp-es csIBM284 </td>
- * </tr>
- * <tr>
- * <td>Cp285</td>
- * <td>IBM285</td>
- * <td>ebcdic-cp-gb csIBM285 </td>
- * </tr>
- * <tr>
- * <td>Cp297</td>
- * <td>IBM297</td>
- * <td>ebcdic-cp-fr csIBM297 </td>
- * </tr>
- * <tr>
- * <td>Cp33722</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp420</td>
- * <td>IBM420</td>
- * <td>ebcdic-cp-ar1 csIBM420 </td>
- * </tr>
- * <tr>
- * <td>Cp424</td>
- * <td>IBM424</td>
- * <td>ebcdic-cp-he csIBM424 </td>
- * </tr>
- * <tr>
- * <td>Cp437</td>
- * <td>IBM437</td>
- * <td>437 csPC8CodePage437 </td>
- * </tr>
- * <tr>
- * <td>Cp500</td>
- * <td>IBM500</td>
- * <td>ebcdic-cp-be ebcdic-cp-ch csIBM500 </td>
- * </tr>
- * <tr>
- * <td>Cp737</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp775</td>
- * <td>IBM775</td>
- * <td>csPC775Baltic </td>
- * </tr>
- * <tr>
- * <td>Cp838</td>
- * <td>IBM-Thai</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp850</td>
- * <td>IBM850</td>
- * <td>850 csPC850Multilingual </td>
- * </tr>
- * <tr>
- * <td>Cp852</td>
- * <td>IBM852</td>
- * <td>852 csPCp852 </td>
- * </tr>
- * <tr>
- * <td>Cp855</td>
- * <td>IBM855</td>
- * <td>855 csIBM855 </td>
- * </tr>
- * <tr>
- * <td>Cp856</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp857</td>
- * <td>IBM857</td>
- * <td>857 csIBM857 </td>
- * </tr>
- * <tr>
- * <td>Cp858</td>
- * <td>IBM00858</td>
- * <td>CCSID00858 CP00858 PC-Multilingual-850+euro </td>
- * </tr>
- * <tr>
- * <td>Cp860</td>
- * <td>IBM860</td>
- * <td>860 csIBM860 </td>
- * </tr>
- * <tr>
- * <td>Cp861</td>
- * <td>IBM861</td>
- * <td>861 cp-is csIBM861 </td>
- * </tr>
- * <tr>
- * <td>Cp862</td>
- * <td>IBM862</td>
- * <td>862 csPC862LatinHebrew </td>
- * </tr>
- * <tr>
- * <td>Cp863</td>
- * <td>IBM863</td>
- * <td>863 csIBM863 </td>
- * </tr>
- * <tr>
- * <td>Cp864</td>
- * <td>IBM864</td>
- * <td>cp864 csIBM864 </td>
- * </tr>
- * <tr>
- * <td>Cp865</td>
- * <td>IBM865</td>
- * <td>865 csIBM865 </td>
- * </tr>
- * <tr>
- * <td>Cp866</td>
- * <td>IBM866</td>
- * <td>866 csIBM866 </td>
- * </tr>
- * <tr>
- * <td>Cp868</td>
- * <td>IBM868</td>
- * <td>cp-ar csIBM868 </td>
- * </tr>
- * <tr>
- * <td>Cp869</td>
- * <td>IBM869</td>
- * <td>cp-gr csIBM869 </td>
- * </tr>
- * <tr>
- * <td>Cp870</td>
- * <td>IBM870</td>
- * <td>ebcdic-cp-roece ebcdic-cp-yu csIBM870 </td>
- * </tr>
- * <tr>
- * <td>Cp871</td>
- * <td>IBM871</td>
- * <td>ebcdic-cp-is csIBM871 </td>
- * </tr>
- * <tr>
- * <td>Cp875</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp918</td>
- * <td>IBM918</td>
- * <td>ebcdic-cp-ar2 csIBM918 </td>
- * </tr>
- * <tr>
- * <td>Cp921</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp922</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp930</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp933</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp935</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp937</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp939</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp942</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp942C</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp943</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp943C</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp948</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp949</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp949C</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp950</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp964</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>Cp970</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>EUC_CN</td>
- * <td>GB2312</td>
- * <td>x-EUC-CN csGB2312 euccn euc-cn gb2312-80 gb2312-1980 CN-GB CN-GB-ISOIR165 </td>
- * </tr>
- * <tr>
- * <td>EUC_JP</td>
- * <td>EUC-JP</td>
- * <td>csEUCPkdFmtJapanese Extended_UNIX_Code_Packed_Format_for_Japanese eucjis x-eucjp eucjp x-euc-jp </td>
- * </tr>
- * <tr>
- * <td>EUC_JP_LINUX</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>EUC_JP_Solaris</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>EUC_KR</td>
- * <td>EUC-KR</td>
- * <td>csEUCKR ksc5601 5601 ksc5601_1987 ksc_5601 ksc5601-1987 ks_c_5601-1987 euckr </td>
- * </tr>
- * <tr>
- * <td>EUC_TW</td>
- * <td>EUC-TW</td>
- * <td>x-EUC-TW cns11643 euctw </td>
- * </tr>
- * <tr>
- * <td>GB18030</td>
- * <td>GB18030</td>
- * <td>gb18030-2000 </td>
- * </tr>
- * <tr>
- * <td>GBK</td>
- * <td>windows-936</td>
- * <td>CP936 MS936 ms_936 x-mswin-936 </td>
- * </tr>
- * <tr>
- * <td>ISCII91</td>
- * <td>?</td>
- * <td>x-ISCII91 iscii </td>
- * </tr>
- * <tr>
- * <td>ISO2022CN</td>
- * <td>ISO-2022-CN</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>ISO2022JP</td>
- * <td>ISO-2022-JP</td>
- * <td>csISO2022JP JIS jis_encoding csjisencoding </td>
- * </tr>
- * <tr>
- * <td>ISO2022KR</td>
- * <td>ISO-2022-KR</td>
- * <td>csISO2022KR </td>
- * </tr>
- * <tr>
- * <td>ISO2022_CN_CNS</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>ISO2022_CN_GB</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>ISO8859_1</td>
- * <td>ISO-8859-1</td>
- * <td>ISO_8859-1:1987 iso-ir-100 ISO_8859-1 latin1 l1 IBM819 CP819 csISOLatin1 8859_1 819 IBM-819 ISO8859-1 ISO_8859_1 </td>
- * </tr>
- * <tr>
- * <td>ISO8859_13</td>
- * <td>ISO-8859-13</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>ISO8859_15</td>
- * <td>ISO-8859-15</td>
- * <td>ISO_8859-15 Latin-9 8859_15 csISOlatin9 IBM923 cp923 923 L9 IBM-923 ISO8859-15 LATIN9 LATIN0 csISOlatin0 ISO8859_15_FDIS </td>
- * </tr>
- * <tr>
- * <td>ISO8859_2</td>
- * <td>ISO-8859-2</td>
- * <td>ISO_8859-2:1987 iso-ir-101 ISO_8859-2 latin2 l2 csISOLatin2 8859_2 iso8859_2 </td>
- * </tr>
- * <tr>
- * <td>ISO8859_3</td>
- * <td>ISO-8859-3</td>
- * <td>ISO_8859-3:1988 iso-ir-109 ISO_8859-3 latin3 l3 csISOLatin3 8859_3 </td>
- * </tr>
- * <tr>
- * <td>ISO8859_4</td>
- * <td>ISO-8859-4</td>
- * <td>ISO_8859-4:1988 iso-ir-110 ISO_8859-4 latin4 l4 csISOLatin4 8859_4 </td>
- * </tr>
- * <tr>
- * <td>ISO8859_5</td>
- * <td>ISO-8859-5</td>
- * <td>ISO_8859-5:1988 iso-ir-144 ISO_8859-5 cyrillic csISOLatinCyrillic 8859_5 </td>
- * </tr>
- * <tr>
- * <td>ISO8859_6</td>
- * <td>ISO-8859-6</td>
- * <td>ISO_8859-6:1987 iso-ir-127 ISO_8859-6 ECMA-114 ASMO-708 arabic csISOLatinArabic 8859_6 </td>
- * </tr>
- * <tr>
- * <td>ISO8859_7</td>
- * <td>ISO-8859-7</td>
- * <td>ISO_8859-7:1987 iso-ir-126 ISO_8859-7 ELOT_928 ECMA-118 greek greek8 csISOLatinGreek 8859_7 sun_eu_greek </td>
- * </tr>
- * <tr>
- * <td>ISO8859_8</td>
- * <td>ISO-8859-8</td>
- * <td>ISO_8859-8:1988 iso-ir-138 ISO_8859-8 hebrew csISOLatinHebrew 8859_8 </td>
- * </tr>
- * <tr>
- * <td>ISO8859_9</td>
- * <td>ISO-8859-9</td>
- * <td>ISO_8859-9:1989 iso-ir-148 ISO_8859-9 latin5 l5 csISOLatin5 8859_9 </td>
- * </tr>
- * <tr>
- * <td>JISAutoDetect</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>JIS_C6626-1983</td>
- * <td>JIS_C6626-1983</td>
- * <td>x-JIS0208 JIS0208 csISO87JISX0208 x0208 JIS_X0208-1983 iso-ir-87 </td>
- * </tr>
- * <tr>
- * <td>JIS_X0201</td>
- * <td>JIS_X0201</td>
- * <td>X0201 JIS0201 csHalfWidthKatakana </td>
- * </tr>
- * <tr>
- * <td>JIS_X0212-1990</td>
- * <td>JIS_X0212-1990</td>
- * <td>iso-ir-159 x0212 JIS0212 csISO159JISX02121990 </td>
- * </tr>
- * <tr>
- * <td>KOI8_R</td>
- * <td>KOI8-R</td>
- * <td>csKOI8R koi8 </td>
- * </tr>
- * <tr>
- * <td>MS874</td>
- * <td>windows-874</td>
- * <td>cp874 </td>
- * </tr>
- * <tr>
- * <td>MS932</td>
- * <td>Windows-31J</td>
- * <td>windows-932 csWindows31J x-ms-cp932 </td>
- * </tr>
- * <tr>
- * <td>MS949</td>
- * <td>windows-949</td>
- * <td>windows949 ms_949 x-windows-949 </td>
- * </tr>
- * <tr>
- * <td>MS950</td>
- * <td>windows-950</td>
- * <td>x-windows-950 </td>
- * </tr>
- * <tr>
- * <td>MS950_HKSCS</td>
- * <td></td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>MacArabic</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>MacCentralEurope</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>MacCroatian</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>MacCyrillic</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>MacDingbat</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>MacGreek</td>
- * <td>MacGreek</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>MacHebrew</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>MacIceland</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>MacRoman</td>
- * <td>MacRoman</td>
- * <td>Macintosh MAC csMacintosh </td>
- * </tr>
- * <tr>
- * <td>MacRomania</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>MacSymbol</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>MacThai</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>MacTurkish</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>MacUkraine</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>SJIS</td>
- * <td>Shift_JIS</td>
- * <td>MS_Kanji csShiftJIS shift-jis x-sjis pck </td>
- * </tr>
- * <tr>
- * <td>TIS620</td>
- * <td>TIS-620</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>UTF-16</td>
- * <td>UTF-16</td>
- * <td>UTF_16 </td>
- * </tr>
- * <tr>
- * <td>UTF8</td>
- * <td>UTF-8</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>UnicodeBig</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>UnicodeBigUnmarked</td>
- * <td>UTF-16BE</td>
- * <td>X-UTF-16BE UTF_16BE ISO-10646-UCS-2 </td>
- * </tr>
- * <tr>
- * <td>UnicodeLittle</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * <tr>
- * <td>UnicodeLittleUnmarked</td>
- * <td>UTF-16LE</td>
- * <td>UTF_16LE X-UTF-16LE </td>
- * </tr>
- * <tr>
- * <td>x-Johab</td>
- * <td>johab</td>
- * <td>johab cp1361 ms1361 ksc5601-1992 ksc5601_1992 </td>
- * </tr>
- * <tr>
- * <td>x-iso-8859-11</td>
- * <td>?</td>
- * <td></td>
- * </tr>
- * </table>
- *
- *
- * @version $Id: CharsetUtil.java,v 1.1 2004/10/25 07:26:46 ntherning Exp $
- */
-public class CharsetUtil {
- private static Log log = LogFactory.getLog(CharsetUtil.class);
-
- private static class Charset implements Comparable<Charset> {
- private String canonical = null;
- private String mime = null;
- private String[] aliases = null;
-
- private Charset(String canonical, String mime, String[] aliases) {
- this.canonical = canonical;
- this.mime = mime;
- this.aliases = aliases;
- }
-
- public int compareTo(Charset c) {
- return this.canonical.compareTo(c.canonical);
- }
- }
-
- private static Charset[] JAVA_CHARSETS = {
- new Charset("ISO8859_1", "ISO-8859-1",
- new String[] {"ISO_8859-1:1987", "iso-ir-100", "ISO_8859-1",
- "latin1", "l1", "IBM819", "CP819",
- "csISOLatin1", "8859_1", "819", "IBM-819",
- "ISO8859-1", "ISO_8859_1"}),
- new Charset("ISO8859_2", "ISO-8859-2",
- new String[] {"ISO_8859-2:1987", "iso-ir-101", "ISO_8859-2",
- "latin2", "l2", "csISOLatin2", "8859_2",
- "iso8859_2"}),
- new Charset("ISO8859_3", "ISO-8859-3", new String[] {"ISO_8859-3:1988", "iso-ir-109", "ISO_8859-3", "latin3", "l3", "csISOLatin3", "8859_3"}),
- new Charset("ISO8859_4", "ISO-8859-4",
- new String[] {"ISO_8859-4:1988", "iso-ir-110", "ISO_8859-4",
- "latin4", "l4", "csISOLatin4", "8859_4"}),
- new Charset("ISO8859_5", "ISO-8859-5",
- new String[] {"ISO_8859-5:1988", "iso-ir-144", "ISO_8859-5",
- "cyrillic", "csISOLatinCyrillic", "8859_5"}),
- new Charset("ISO8859_6", "ISO-8859-6", new String[] {"ISO_8859-6:1987", "iso-ir-127", "ISO_8859-6", "ECMA-114", "ASMO-708", "arabic", "csISOLatinArabic", "8859_6"}),
- new Charset("ISO8859_7", "ISO-8859-7",
- new String[] {"ISO_8859-7:1987", "iso-ir-126", "ISO_8859-7",
- "ELOT_928", "ECMA-118", "greek", "greek8",
- "csISOLatinGreek", "8859_7", "sun_eu_greek"}),
- new Charset("ISO8859_8", "ISO-8859-8", new String[] {"ISO_8859-8:1988", "iso-ir-138", "ISO_8859-8", "hebrew", "csISOLatinHebrew", "8859_8"}),
- new Charset("ISO8859_9", "ISO-8859-9",
- new String[] {"ISO_8859-9:1989", "iso-ir-148", "ISO_8859-9",
- "latin5", "l5", "csISOLatin5", "8859_9"}),
-
- new Charset("ISO8859_13", "ISO-8859-13", new String[] {}),
- new Charset("ISO8859_15", "ISO-8859-15",
- new String[] {"ISO_8859-15", "Latin-9", "8859_15",
- "csISOlatin9", "IBM923", "cp923", "923", "L9",
- "IBM-923", "ISO8859-15", "LATIN9", "LATIN0",
- "csISOlatin0", "ISO8859_15_FDIS"}),
- new Charset("KOI8_R", "KOI8-R", new String[] {"csKOI8R", "koi8"}),
- new Charset("ASCII", "US-ASCII",
- new String[] {"ANSI_X3.4-1968", "iso-ir-6",
- "ANSI_X3.4-1986", "ISO_646.irv:1991",
- "ISO646-US", "us", "IBM367", "cp367",
- "csASCII", "ascii7", "646", "iso_646.irv:1983"}),
- new Charset("UTF8", "UTF-8", new String[] {}),
- new Charset("UTF-16", "UTF-16", new String[] {"UTF_16"}),
- new Charset("UnicodeBigUnmarked", "UTF-16BE", new String[] {"X-UTF-16BE", "UTF_16BE", "ISO-10646-UCS-2"}),
- new Charset("UnicodeLittleUnmarked", "UTF-16LE", new String[] {"UTF_16LE", "X-UTF-16LE"}),
- new Charset("Big5", "Big5", new String[] {"csBig5", "CN-Big5", "BIG-FIVE", "BIGFIVE"}),
- new Charset("Big5_HKSCS", "Big5-HKSCS", new String[] {"big5hkscs"}),
- new Charset("EUC_JP", "EUC-JP",
- new String[] {"csEUCPkdFmtJapanese",
- "Extended_UNIX_Code_Packed_Format_for_Japanese",
- "eucjis", "x-eucjp", "eucjp", "x-euc-jp"}),
- new Charset("EUC_KR", "EUC-KR",
- new String[] {"csEUCKR", "ksc5601", "5601", "ksc5601_1987",
- "ksc_5601", "ksc5601-1987", "ks_c_5601-1987",
- "euckr"}),
- new Charset("GB18030", "GB18030", new String[] {"gb18030-2000"}),
- new Charset("EUC_CN", "GB2312", new String[] {"x-EUC-CN", "csGB2312", "euccn", "euc-cn", "gb2312-80", "gb2312-1980", "CN-GB", "CN-GB-ISOIR165"}),
- new Charset("GBK", "windows-936", new String[] {"CP936", "MS936", "ms_936", "x-mswin-936"}),
-
- new Charset("Cp037", "IBM037", new String[] {"ebcdic-cp-us", "ebcdic-cp-ca", "ebcdic-cp-wt", "ebcdic-cp-nl", "csIBM037"}),
- new Charset("Cp273", "IBM273", new String[] {"csIBM273"}),
- new Charset("Cp277", "IBM277", new String[] {"EBCDIC-CP-DK", "EBCDIC-CP-NO", "csIBM277"}),
- new Charset("Cp278", "IBM278", new String[] {"CP278", "ebcdic-cp-fi", "ebcdic-cp-se", "csIBM278"}),
- new Charset("Cp280", "IBM280", new String[] {"ebcdic-cp-it", "csIBM280"}),
- new Charset("Cp284", "IBM284", new String[] {"ebcdic-cp-es", "csIBM284"}),
- new Charset("Cp285", "IBM285", new String[] {"ebcdic-cp-gb", "csIBM285"}),
- new Charset("Cp297", "IBM297", new String[] {"ebcdic-cp-fr", "csIBM297"}),
- new Charset("Cp420", "IBM420", new String[] {"ebcdic-cp-ar1", "csIBM420"}),
- new Charset("Cp424", "IBM424", new String[] {"ebcdic-cp-he", "csIBM424"}),
- new Charset("Cp437", "IBM437", new String[] {"437", "csPC8CodePage437"}),
- new Charset("Cp500", "IBM500", new String[] {"ebcdic-cp-be", "ebcdic-cp-ch", "csIBM500"}),
- new Charset("Cp775", "IBM775", new String[] {"csPC775Baltic"}),
- new Charset("Cp838", "IBM-Thai", new String[] {}),
- new Charset("Cp850", "IBM850", new String[] {"850", "csPC850Multilingual"}),
- new Charset("Cp852", "IBM852", new String[] {"852", "csPCp852"}),
- new Charset("Cp855", "IBM855", new String[] {"855", "csIBM855"}),
- new Charset("Cp857", "IBM857", new String[] {"857", "csIBM857"}),
- new Charset("Cp858", "IBM00858",
- new String[] {"CCSID00858", "CP00858",
- "PC-Multilingual-850+euro"}),
- new Charset("Cp860", "IBM860", new String[] {"860", "csIBM860"}),
- new Charset("Cp861", "IBM861", new String[] {"861", "cp-is", "csIBM861"}),
- new Charset("Cp862", "IBM862", new String[] {"862", "csPC862LatinHebrew"}),
- new Charset("Cp863", "IBM863", new String[] {"863", "csIBM863"}),
- new Charset("Cp864", "IBM864", new String[] {"cp864", "csIBM864"}),
- new Charset("Cp865", "IBM865", new String[] {"865", "csIBM865"}),
- new Charset("Cp866", "IBM866", new String[] {"866", "csIBM866"}),
- new Charset("Cp868", "IBM868", new String[] {"cp-ar", "csIBM868"}),
- new Charset("Cp869", "IBM869", new String[] {"cp-gr", "csIBM869"}),
- new Charset("Cp870", "IBM870", new String[] {"ebcdic-cp-roece", "ebcdic-cp-yu", "csIBM870"}),
- new Charset("Cp871", "IBM871", new String[] {"ebcdic-cp-is", "csIBM871"}),
- new Charset("Cp918", "IBM918", new String[] {"ebcdic-cp-ar2", "csIBM918"}),
- new Charset("Cp1026", "IBM1026", new String[] {"csIBM1026"}),
- new Charset("Cp1047", "IBM1047", new String[] {"IBM-1047"}),
- new Charset("Cp1140", "IBM01140",
- new String[] {"CCSID01140", "CP01140",
- "ebcdic-us-37+euro"}),
- new Charset("Cp1141", "IBM01141",
- new String[] {"CCSID01141", "CP01141",
- "ebcdic-de-273+euro"}),
- new Charset("Cp1142", "IBM01142", new String[] {"CCSID01142", "CP01142", "ebcdic-dk-277+euro", "ebcdic-no-277+euro"}),
- new Charset("Cp1143", "IBM01143", new String[] {"CCSID01143", "CP01143", "ebcdic-fi-278+euro", "ebcdic-se-278+euro"}),
- new Charset("Cp1144", "IBM01144", new String[] {"CCSID01144", "CP01144", "ebcdic-it-280+euro"}),
- new Charset("Cp1145", "IBM01145", new String[] {"CCSID01145", "CP01145", "ebcdic-es-284+euro"}),
- new Charset("Cp1146", "IBM01146", new String[] {"CCSID01146", "CP01146", "ebcdic-gb-285+euro"}),
- new Charset("Cp1147", "IBM01147", new String[] {"CCSID01147", "CP01147", "ebcdic-fr-297+euro"}),
- new Charset("Cp1148", "IBM01148", new String[] {"CCSID01148", "CP01148", "ebcdic-international-500+euro"}),
- new Charset("Cp1149", "IBM01149", new String[] {"CCSID01149", "CP01149", "ebcdic-is-871+euro"}),
- new Charset("Cp1250", "windows-1250", new String[] {}),
- new Charset("Cp1251", "windows-1251", new String[] {}),
- new Charset("Cp1252", "windows-1252", new String[] {}),
- new Charset("Cp1253", "windows-1253", new String[] {}),
- new Charset("Cp1254", "windows-1254", new String[] {}),
- new Charset("Cp1255", "windows-1255", new String[] {}),
- new Charset("Cp1256", "windows-1256", new String[] {}),
- new Charset("Cp1257", "windows-1257", new String[] {}),
- new Charset("Cp1258", "windows-1258", new String[] {}),
- new Charset("ISO2022CN", "ISO-2022-CN", new String[] {}),
- new Charset("ISO2022JP", "ISO-2022-JP", new String[] {"csISO2022JP", "JIS", "jis_encoding", "csjisencoding"}),
- new Charset("ISO2022KR", "ISO-2022-KR", new String[] {"csISO2022KR"}),
- new Charset("JIS_X0201", "JIS_X0201", new String[] {"X0201", "JIS0201", "csHalfWidthKatakana"}),
- new Charset("JIS_X0212-1990", "JIS_X0212-1990", new String[] {"iso-ir-159", "x0212", "JIS0212", "csISO159JISX02121990"}),
- new Charset("JIS_C6626-1983", "JIS_C6626-1983", new String[] {"x-JIS0208", "JIS0208", "csISO87JISX0208", "x0208", "JIS_X0208-1983", "iso-ir-87"}),
- new Charset("SJIS", "Shift_JIS", new String[] {"MS_Kanji", "csShiftJIS", "shift-jis", "x-sjis", "pck"}),
- new Charset("TIS620", "TIS-620", new String[] {}),
- new Charset("MS932", "Windows-31J", new String[] {"windows-932", "csWindows31J", "x-ms-cp932"}),
- new Charset("EUC_TW", "EUC-TW", new String[] {"x-EUC-TW", "cns11643", "euctw"}),
- new Charset("x-Johab", "johab", new String[] {"johab", "cp1361", "ms1361", "ksc5601-1992", "ksc5601_1992"}),
- new Charset("MS950_HKSCS", "", new String[] {}),
- new Charset("MS874", "windows-874", new String[] {"cp874"}),
- new Charset("MS949", "windows-949", new String[] {"windows949", "ms_949", "x-windows-949"}),
- new Charset("MS950", "windows-950", new String[] {"x-windows-950"}),
-
- new Charset("Cp737", null, new String[] {}),
- new Charset("Cp856", null, new String[] {}),
- new Charset("Cp875", null, new String[] {}),
- new Charset("Cp921", null, new String[] {}),
- new Charset("Cp922", null, new String[] {}),
- new Charset("Cp930", null, new String[] {}),
- new Charset("Cp933", null, new String[] {}),
- new Charset("Cp935", null, new String[] {}),
- new Charset("Cp937", null, new String[] {}),
- new Charset("Cp939", null, new String[] {}),
- new Charset("Cp942", null, new String[] {}),
- new Charset("Cp942C", null, new String[] {}),
- new Charset("Cp943", null, new String[] {}),
- new Charset("Cp943C", null, new String[] {}),
- new Charset("Cp948", null, new String[] {}),
- new Charset("Cp949", null, new String[] {}),
- new Charset("Cp949C", null, new String[] {}),
- new Charset("Cp950", null, new String[] {}),
- new Charset("Cp964", null, new String[] {}),
- new Charset("Cp970", null, new String[] {}),
- new Charset("Cp1006", null, new String[] {}),
- new Charset("Cp1025", null, new String[] {}),
- new Charset("Cp1046", null, new String[] {}),
- new Charset("Cp1097", null, new String[] {}),
- new Charset("Cp1098", null, new String[] {}),
- new Charset("Cp1112", null, new String[] {}),
- new Charset("Cp1122", null, new String[] {}),
- new Charset("Cp1123", null, new String[] {}),
- new Charset("Cp1124", null, new String[] {}),
- new Charset("Cp1381", null, new String[] {}),
- new Charset("Cp1383", null, new String[] {}),
- new Charset("Cp33722", null, new String[] {}),
- new Charset("Big5_Solaris", null, new String[] {}),
- new Charset("EUC_JP_LINUX", null, new String[] {}),
- new Charset("EUC_JP_Solaris", null, new String[] {}),
- new Charset("ISCII91", null, new String[] {"x-ISCII91", "iscii"}),
- new Charset("ISO2022_CN_CNS", null, new String[] {}),
- new Charset("ISO2022_CN_GB", null, new String[] {}),
- new Charset("x-iso-8859-11", null, new String[] {}),
- new Charset("JISAutoDetect", null, new String[] {}),
- new Charset("MacArabic", null, new String[] {}),
- new Charset("MacCentralEurope", null, new String[] {}),
- new Charset("MacCroatian", null, new String[] {}),
- new Charset("MacCyrillic", null, new String[] {}),
- new Charset("MacDingbat", null, new String[] {}),
- new Charset("MacGreek", "MacGreek", new String[] {}),
- new Charset("MacHebrew", null, new String[] {}),
- new Charset("MacIceland", null, new String[] {}),
- new Charset("MacRoman", "MacRoman", new String[] {"Macintosh", "MAC", "csMacintosh"}),
- new Charset("MacRomania", null, new String[] {}),
- new Charset("MacSymbol", null, new String[] {}),
- new Charset("MacThai", null, new String[] {}),
- new Charset("MacTurkish", null, new String[] {}),
- new Charset("MacUkraine", null, new String[] {}),
- new Charset("UnicodeBig", null, new String[] {}),
- new Charset("UnicodeLittle", null, new String[] {})
- };
-
- /**
- * Contains the canonical names of character sets which can be used to
- * decode bytes into Java chars.
- */
- private static TreeSet<String> decodingSupported = null;
-
- /**
- * Contains the canonical names of character sets which can be used to
- * encode Java chars into bytes.
- */
- private static TreeSet<String> encodingSupported = null;
-
- /**
- * Maps character set names to Charset objects. All possible names of
- * a charset will be mapped to the Charset.
- */
- private static HashMap<String, Charset> charsetMap = null;
-
- static {
- decodingSupported = new TreeSet<String>();
- encodingSupported = new TreeSet<String>();
- byte[] dummy = new byte[] {'d', 'u', 'm', 'm', 'y'};
- for (int i = 0; i < JAVA_CHARSETS.length; i++) {
- try {
- String s = new String(dummy, JAVA_CHARSETS[i].canonical);
- decodingSupported.add(JAVA_CHARSETS[i].canonical.toLowerCase());
- } catch (UnsupportedOperationException e) {
- } catch (UnsupportedEncodingException e) {
- }
- try {
- "dummy".getBytes(JAVA_CHARSETS[i].canonical);
- encodingSupported.add(JAVA_CHARSETS[i].canonical.toLowerCase());
- } catch (UnsupportedOperationException e) {
- } catch (UnsupportedEncodingException e) {
- }
- }
-
- charsetMap = new HashMap<String, Charset>();
- for (int i = 0; i < JAVA_CHARSETS.length; i++) {
- Charset c = JAVA_CHARSETS[i];
- charsetMap.put(c.canonical.toLowerCase(), c);
- if (c.mime != null) {
- charsetMap.put(c.mime.toLowerCase(), c);
- }
- if (c.aliases != null) {
- for (int j = 0; j < c.aliases.length; j++) {
- charsetMap.put(c.aliases[j].toLowerCase(), c);
- }
- }
- }
-
- if (log.isDebugEnabled()) {
- log.debug("Character sets which support decoding: "
- + decodingSupported);
- log.debug("Character sets which support encoding: "
- + encodingSupported);
- }
- }
-
- /**
- * ANDROID: THE FOLLOWING SET OF STATIC STRINGS ARE COPIED FROM A NEWER VERSION OF MIME4J
- */
-
- /** carriage return - line feed sequence */
- public static final String CRLF = "\r\n";
-
- /** US-ASCII CR, carriage return (13) */
- public static final int CR = '\r';
-
- /** US-ASCII LF, line feed (10) */
- public static final int LF = '\n';
-
- /** US-ASCII SP, space (32) */
- public static final int SP = ' ';
-
- /** US-ASCII HT, horizontal-tab (9)*/
- public static final int HT = '\t';
-
- public static final java.nio.charset.Charset US_ASCII = java.nio.charset.Charset
- .forName("US-ASCII");
-
- public static final java.nio.charset.Charset ISO_8859_1 = java.nio.charset.Charset
- .forName("ISO-8859-1");
-
- public static final java.nio.charset.Charset UTF_8 = java.nio.charset.Charset
- .forName("UTF-8");
-
- /**
- * Returns <code>true</code> if the specified character is a whitespace
- * character (CR, LF, SP or HT).
- *
- * ANDROID: COPIED FROM A NEWER VERSION OF MIME4J
- *
- * @param ch
- * character to test.
- * @return <code>true</code> if the specified character is a whitespace
- * character, <code>false</code> otherwise.
- */
- public static boolean isWhitespace(char ch) {
- return ch == SP || ch == HT || ch == CR || ch == LF;
- }
-
- /**
- * Returns <code>true</code> if the specified string consists entirely of
- * whitespace characters.
- *
- * ANDROID: COPIED FROM A NEWER VERSION OF MIME4J
- *
- * @param s
- * string to test.
- * @return <code>true</code> if the specified string consists entirely of
- * whitespace characters, <code>false</code> otherwise.
- */
- public static boolean isWhitespace(final String s) {
- if (s == null) {
- throw new IllegalArgumentException("String may not be null");
- }
- final int len = s.length();
- for (int i = 0; i < len; i++) {
- if (!isWhitespace(s.charAt(i))) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Determines if the VM supports encoding (chars to bytes) the
- * specified character set. NOTE: the given character set name may
- * not be known to the VM even if this method returns <code>true</code>.
- * Use {@link #toJavaCharset(String)} to get the canonical Java character
- * set name.
- *
- * @param charsetName the characters set name.
- * @return <code>true</code> if encoding is supported, <code>false</code>
- * otherwise.
- */
- public static boolean isEncodingSupported(String charsetName) {
- return encodingSupported.contains(charsetName.toLowerCase());
- }
-
- /**
- * Determines if the VM supports decoding (bytes to chars) the
- * specified character set. NOTE: the given character set name may
- * not be known to the VM even if this method returns <code>true</code>.
- * Use {@link #toJavaCharset(String)} to get the canonical Java character
- * set name.
- *
- * @param charsetName the characters set name.
- * @return <code>true</code> if decoding is supported, <code>false</code>
- * otherwise.
- */
- public static boolean isDecodingSupported(String charsetName) {
- return decodingSupported.contains(charsetName.toLowerCase());
- }
-
- /**
- * Gets the preferred MIME character set name for the specified
- * character set or <code>null</code> if not known.
- *
- * @param charsetName the character set name to look for.
- * @return the MIME preferred name or <code>null</code> if not known.
- */
- public static String toMimeCharset(String charsetName) {
- Charset c = charsetMap.get(charsetName.toLowerCase());
- if (c != null) {
- return c.mime;
- }
- return null;
- }
-
- /**
- * Gets the canonical Java character set name for the specified
- * character set or <code>null</code> if not known. This should be
- * called before doing any conversions using the Java API. NOTE:
- * you must use {@link #isEncodingSupported(String)} or
- * {@link #isDecodingSupported(String)} to make sure the returned
- * Java character set is supported by the current VM.
- *
- * @param charsetName the character set name to look for.
- * @return the canonical Java name or <code>null</code> if not known.
- */
- public static String toJavaCharset(String charsetName) {
- Charset c = charsetMap.get(charsetName.toLowerCase());
- if (c != null) {
- return c.canonical;
- }
- return null;
- }
-
- public static java.nio.charset.Charset getCharset(String charsetName) {
- String defaultCharset = "ISO-8859-1";
-
- // Use the default chareset if given charset is null
- if(charsetName == null) charsetName = defaultCharset;
-
- try {
- return java.nio.charset.Charset.forName(charsetName);
- } catch (IllegalCharsetNameException e) {
- log.info("Illegal charset " + charsetName + ", fallback to " + defaultCharset + ": " + e);
- // Use default charset on exception
- return java.nio.charset.Charset.forName(defaultCharset);
- } catch (UnsupportedCharsetException ex) {
- log.info("Unsupported charset " + charsetName + ", fallback to " + defaultCharset + ": " + ex);
- // Use default charset on exception
- return java.nio.charset.Charset.forName(defaultCharset);
- }
-
- }
- /*
- * Uncomment the code below and run the main method to regenerate the
- * Javadoc table above when the known charsets change.
- */
-
- /*
- private static String dumpHtmlTable() {
- LinkedList l = new LinkedList(Arrays.asList(JAVA_CHARSETS));
- Collections.sort(l);
- StringBuffer sb = new StringBuffer();
- sb.append(" * <table>\n");
- sb.append(" * <tr>\n");
- sb.append(" * <td>Canonical (Java) name</td>\n");
- sb.append(" * <td>MIME preferred</td>\n");
- sb.append(" * <td>Aliases</td>\n");
- sb.append(" * </tr>\n");
-
- for (Iterator it = l.iterator(); it.hasNext();) {
- Charset c = (Charset) it.next();
- sb.append(" * <tr>\n");
- sb.append(" * <td>" + c.canonical + "</td>\n");
- sb.append(" * <td>" + (c.mime == null ? "?" : c.mime)+ "</td>\n");
- sb.append(" * <td>");
- for (int i = 0; c.aliases != null && i < c.aliases.length; i++) {
- sb.append(c.aliases[i] + " ");
- }
- sb.append("</td>\n");
- sb.append(" * </tr>\n");
- }
- sb.append(" * </table>\n");
- return sb.toString();
- }
-
- public static void main(String[] args) {
- System.out.println(dumpHtmlTable());
- }*/
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/util/PartialInputStream.java b/emailcommon/src/org/apache/james/mime4j/util/PartialInputStream.java
deleted file mode 100644
index a5ac0596d..000000000
--- a/emailcommon/src/org/apache/james/mime4j/util/PartialInputStream.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-
-package org.apache.james.mime4j.util;
-
-import java.io.InputStream;
-import java.io.IOException;
-
-public class PartialInputStream extends PositionInputStream {
- private final long limit;
-
- public PartialInputStream(InputStream inputStream, long offset, long length) throws IOException {
- super(inputStream);
- inputStream.skip(offset);
- this.limit = offset + length;
- }
-
- public int available() throws IOException {
- return Math.min(super.available(), getBytesLeft());
- }
-
- public int read() throws IOException {
- if (limit > position)
- return super.read();
- else
- return -1;
- }
-
- public int read(byte b[]) throws IOException {
- return read(b, 0, b.length);
- }
-
- public int read(byte b[], int off, int len) throws IOException {
- len = Math.min(len, getBytesLeft());
- return super.read(b, off, len); //To change body of overridden methods use File | Settings | File Templates.
- }
-
- public long skip(long n) throws IOException {
- n = Math.min(n, getBytesLeft());
- return super.skip(n); //To change body of overridden methods use File | Settings | File Templates.
- }
-
- private int getBytesLeft() {
- return (int)Math.min(Integer.MAX_VALUE, limit - position);
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/util/PositionInputStream.java b/emailcommon/src/org/apache/james/mime4j/util/PositionInputStream.java
deleted file mode 100644
index 9fcd21d0c..000000000
--- a/emailcommon/src/org/apache/james/mime4j/util/PositionInputStream.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-
-package org.apache.james.mime4j.util;
-
-import java.io.InputStream;
-import java.io.IOException;
-
-public class PositionInputStream extends InputStream {
-
- private final InputStream inputStream;
- protected long position = 0;
- private long markedPosition = 0;
-
- public PositionInputStream(InputStream inputStream) {
- this.inputStream = inputStream;
- }
-
- public long getPosition() {
- return position;
- }
-
- public int available() throws IOException {
- return inputStream.available();
- }
-
- public int read() throws IOException {
- int b = inputStream.read();
- if (b != -1)
- position++;
- return b;
- }
-
- public void close() throws IOException {
- inputStream.close();
- }
-
- public void reset() throws IOException {
- inputStream.reset();
- position = markedPosition;
- }
-
- public boolean markSupported() {
- return inputStream.markSupported();
- }
-
- public void mark(int readlimit) {
- inputStream.mark(readlimit);
- markedPosition = position;
- }
-
- public long skip(long n) throws IOException {
- final long c = inputStream.skip(n);
- position += c;
- return c;
- }
-
- public int read(byte b[]) throws IOException {
- final int c = inputStream.read(b);
- position += c;
- return c;
- }
-
- public int read(byte b[], int off, int len) throws IOException {
- final int c = inputStream.read(b, off, len);
- position += c;
- return c;
- }
-
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/util/SimpleTempStorage.java b/emailcommon/src/org/apache/james/mime4j/util/SimpleTempStorage.java
deleted file mode 100644
index 930e4db02..000000000
--- a/emailcommon/src/org/apache/james/mime4j/util/SimpleTempStorage.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.util;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Random;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-
-/**
- *
- * @version $Id: SimpleTempStorage.java,v 1.2 2004/10/02 12:41:11 ntherning Exp $
- */
-public class SimpleTempStorage extends TempStorage {
- private static Log log = LogFactory.getLog(SimpleTempStorage.class);
-
- private TempPath rootPath = null;
- private Random random = new Random();
-
- /**
- * Creates a new <code>SimpleTempStorageManager</code> instance.
- */
- public SimpleTempStorage() {
- rootPath = new SimpleTempPath(System.getProperty("java.io.tmpdir"));
- }
-
- private TempPath createTempPath(TempPath parent, String prefix)
- throws IOException {
-
- if (prefix == null) {
- prefix = "";
- }
-
- File p = null;
- int count = 1000;
- do {
- long n = Math.abs(random.nextLong());
- p = new File(parent.getAbsolutePath(), prefix + n);
- count--;
- } while (p.exists() && count > 0);
-
- if (p.exists() || !p.mkdirs()) {
- log.error("Unable to mkdirs on " + p.getAbsolutePath());
- throw new IOException("Creating dir '"
- + p.getAbsolutePath() + "' failed.");
- }
-
- return new SimpleTempPath(p);
- }
-
- private TempFile createTempFile(TempPath parent, String prefix,
- String suffix) throws IOException {
-
- if (prefix == null) {
- prefix = "";
- }
- if (suffix == null) {
- suffix = ".tmp";
- }
-
- File f = null;
-
- int count = 1000;
- synchronized (this) {
- do {
- long n = Math.abs(random.nextLong());
- f = new File(parent.getAbsolutePath(), prefix + n + suffix);
- count--;
- } while (f.exists() && count > 0);
-
- if (f.exists()) {
- throw new IOException("Creating temp file failed: "
- + "Unable to find unique file name");
- }
-
- try {
- f.createNewFile();
- } catch (IOException e) {
- throw new IOException("Creating dir '"
- + f.getAbsolutePath() + "' failed.");
- }
- }
-
- return new SimpleTempFile(f);
- }
-
- /**
- * @see org.apache.james.mime4j.util.TempStorage#getRootTempPath()
- */
- public TempPath getRootTempPath() {
- return rootPath;
- }
-
- private class SimpleTempPath implements TempPath {
- private File path = null;
-
- private SimpleTempPath(String path) {
- this.path = new File(path);
- }
-
- private SimpleTempPath(File path) {
- this.path = path;
- }
-
- /**
- * @see org.apache.james.mime4j.util.TempPath#createTempFile()
- */
- public TempFile createTempFile() throws IOException {
- return SimpleTempStorage.this.createTempFile(this, null, null);
- }
-
- /**
- * @see org.apache.james.mime4j.util.TempPath#createTempFile(java.lang.String, java.lang.String)
- */
- public TempFile createTempFile(String prefix, String suffix)
- throws IOException {
-
- return SimpleTempStorage.this.createTempFile(this, prefix, suffix);
- }
-
- /**
- * @see org.apache.james.mime4j.util.TempPath#createTempFile(java.lang.String, java.lang.String, boolean)
- */
- public TempFile createTempFile(String prefix, String suffix,
- boolean allowInMemory)
- throws IOException {
-
- return SimpleTempStorage.this.createTempFile(this, prefix, suffix);
- }
-
- /**
- * @see org.apache.james.mime4j.util.TempPath#getAbsolutePath()
- */
- public String getAbsolutePath() {
- return path.getAbsolutePath();
- }
-
- /**
- * Do nothing
- */
- public void delete() {
- }
-
- /**
- * @see org.apache.james.mime4j.util.TempPath#createTempPath()
- */
- public TempPath createTempPath() throws IOException {
- return SimpleTempStorage.this.createTempPath(this, null);
- }
-
- /**
- * @see org.apache.james.mime4j.util.TempPath#createTempPath(java.lang.String)
- */
- public TempPath createTempPath(String prefix) throws IOException {
- return SimpleTempStorage.this.createTempPath(this, prefix);
- }
-
- }
-
- private class SimpleTempFile implements TempFile {
- private File file = null;
-
- private SimpleTempFile(File file) {
- this.file = file;
- this.file.deleteOnExit();
- }
-
- /**
- * @see org.apache.james.mime4j.util.TempFile#getInputStream()
- */
- public InputStream getInputStream() throws IOException {
- return new BufferedInputStream(new FileInputStream(file));
- }
-
- /**
- * @see org.apache.james.mime4j.util.TempFile#getOutputStream()
- */
- public OutputStream getOutputStream() throws IOException {
- return new BufferedOutputStream(new FileOutputStream(file));
- }
-
- /**
- * @see org.apache.james.mime4j.util.TempFile#getAbsolutePath()
- */
- public String getAbsolutePath() {
- return file.getAbsolutePath();
- }
-
- /**
- * Do nothing
- */
- public void delete() {
- // Not implementated
- }
-
- /**
- * @see org.apache.james.mime4j.util.TempFile#isInMemory()
- */
- public boolean isInMemory() {
- return false;
- }
-
- /**
- * @see org.apache.james.mime4j.util.TempFile#length()
- */
- public long length() {
- return file.length();
- }
-
- }
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/util/TempFile.java b/emailcommon/src/org/apache/james/mime4j/util/TempFile.java
deleted file mode 100644
index f67e1e93e..000000000
--- a/emailcommon/src/org/apache/james/mime4j/util/TempFile.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * @version $Id: TempFile.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $
- */
-public interface TempFile {
- /**
- * Gets an <code>InputStream</code> to read bytes from this temporary file.
- * NOTE: The stream should NOT be wrapped in
- * <code>BufferedInputStream</code> by the caller. If the implementing
- * <code>TempFile</code> creates a <code>FileInputStream</code> or any
- * other stream which would benefit from being buffered it's the
- * <code>TempFile</code>'s responsibility to wrap it.
- *
- * @return the stream.
- * @throws IOException
- */
- InputStream getInputStream() throws IOException;
-
- /**
- * Gets an <code>OutputStream</code> to write bytes to this temporary file.
- * NOTE: The stream should NOT be wrapped in
- * <code>BufferedOutputStream</code> by the caller. If the implementing
- * <code>TempFile</code> creates a <code>FileOutputStream</code> or any
- * other stream which would benefit from being buffered it's the
- * <code>TempFile</code>'s responsibility to wrap it.
- *
- * @return the stream.
- * @throws IOException
- */
- OutputStream getOutputStream() throws IOException;
-
- /**
- * Returns the absolute path including file name of this
- * <code>TempFile</code>. The path may be <code>null</code> if this is
- * an in-memory file.
- *
- * @return the absolute path.
- */
- String getAbsolutePath();
-
- /**
- * Deletes this file as soon as possible.
- */
- void delete();
-
- /**
- * Determines if this is an in-memory file.
- *
- * @return <code>true</code> if this file is currently in memory,
- * <code>false</code> otherwise.
- */
- boolean isInMemory();
-
- /**
- * Gets the length of this temporary file.
- *
- * @return the length.
- */
- long length();
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/util/TempPath.java b/emailcommon/src/org/apache/james/mime4j/util/TempPath.java
deleted file mode 100644
index 3b55aa6db..000000000
--- a/emailcommon/src/org/apache/james/mime4j/util/TempPath.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.util;
-
-import java.io.IOException;
-
-/**
- *
- * @version $Id: TempPath.java,v 1.2 2004/10/02 12:41:11 ntherning Exp $
- */
-public interface TempPath {
- TempPath createTempPath() throws IOException;
- TempPath createTempPath(String prefix) throws IOException;
-
- /**
- * Creates a new temporary file. Wheter it will be be created in memory
- * or on disk is up to to the implementation.
- * The prefix will be empty and the suffix will be
- * <code>.tmp</code> if created on disk.
- *
- * @return the temporary file.
- */
- TempFile createTempFile() throws IOException;
-
- /**
- * Creates a new temporary file. Wheter it will be be created in memory
- * or on disk is up to to the implementation.
- * The prefix and suffix can be set by the user.
- *
- * @param prefix the prefix to use. <code>null</code> gives no prefix.
- * @param suffix the suffix to use. <code>null</code> gives
- * <code>.tmp</code>.
- * @return the temporary file.
- */
- TempFile createTempFile(String prefix, String suffix) throws IOException;
-
- /**
- * Creates a new temporary file. Wheter it will be be created in memory
- * or on disk can be specified using the <code>allowInMemory</code>
- * parameter. If the implementation doesn't support in-memory files
- * the new file will be created on disk.
- * The prefix and suffix can be set by the user.
- *
- * @param prefix the prefix to use. <code>null</code> gives no prefix.
- * @param suffix the suffix to use. <code>null</code> gives
- * <code>.tmp</code>.
- * @param allowInMemory if <code>true</code> the file MIGHT be created in
- * memory if supported by the implentation. If <code>false</code> the
- * file MUST be created on disk.
- * @return the temporary file.
- */
- TempFile createTempFile(String prefix, String suffix,
- boolean allowInMemory) throws IOException;
- String getAbsolutePath();
- void delete();
-}
diff --git a/emailcommon/src/org/apache/james/mime4j/util/TempStorage.java b/emailcommon/src/org/apache/james/mime4j/util/TempStorage.java
deleted file mode 100644
index 4d3be4746..000000000
--- a/emailcommon/src/org/apache/james/mime4j/util/TempStorage.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the *
- * "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, *
- * software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
- * KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations *
- * under the License. *
- ****************************************************************/
-
-package org.apache.james.mime4j.util;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-
-/**
- *
- * @version $Id: TempStorage.java,v 1.2 2004/10/02 12:41:11 ntherning Exp $
- */
-public abstract class TempStorage {
- private static Log log = LogFactory.getLog(TempStorage.class);
- private static TempStorage inst = null;
-
- static {
-
- String clazz = System.getProperty("org.apache.james.mime4j.tempStorage");
- try {
-
- if (inst != null) {
- inst = (TempStorage) Class.forName(clazz).newInstance();
- }
-
- } catch (Throwable t) {
- log.warn("Unable to create or instantiate TempStorage class '"
- + clazz + "' using SimpleTempStorage instead", t);
- }
-
- if (inst == null) {
- inst = new SimpleTempStorage();
- }
- }
-
- /**
- * Gets the root temporary path which should be used to
- * create new temporary paths or files.
- *
- * @return the root temporary path.
- */
- public abstract TempPath getRootTempPath();
-
- public static TempStorage getInstance() {
- return inst;
- }
-
- public static void setInstance(TempStorage inst) {
- if (inst == null) {
- throw new NullPointerException("inst");
- }
- TempStorage.inst = inst;
- }
-}
diff --git a/remove-exchange-support.sh b/remove-exchange-support.sh
deleted file mode 100755
index 2c08f02b6..000000000
--- a/remove-exchange-support.sh
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2010 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#
-# You can remove exchange by running this script.
-#
-
-set -e # fail fast
-
-# Step 0. Make sure we're in the right directory, and the user really wants it.
-
-if [[ ! -d src/com/android/email/ ]] ; then
- echo "Run the script in the root of the email source tree." 1>&2
- exit 1
-fi
-
-echo ""
-echo -n "Do you wish to remove exchange support from the email app? (y/N):"
-
-read answer
-if [[ "$answer" != y ]] ; then
- echo "Aborted." 1>&2
- exit 1
-fi
-
-
-# Step 1. Remove all Exchange related packages.
-
-rm -fr src/com/android/exchange/ \
- tests/src/com/android/exchange/
-
-
-# Step 2. Remove lines surrounded by START-EXCHANGE and END-EXCHANGE
-
-find . \( -name '*.java' -o -name '*.xml' -o -name 'Android.mk' \) -print0 |
- xargs -0 sed -i "" -e '/EXCHANGE-REMOVE-SECTION-START/,/EXCHANGE-REMOVE-SECTION-END/d'
-
-
-# Step 3. Remove all imports from com.android.exchange (and its subpackages).
-
-find . -name '*.java' -print0 |
- xargs -0 sed -i "" -e '/^import com\.android\.exchange/d'
-
-
-echo ""
-echo "Exchange support has been successfully removed."
-
-exit 0
diff --git a/res/drawable-hdpi/attachment_bg_holo.9.png b/res/drawable-hdpi/attachment_bg_holo.9.png
deleted file mode 100644
index 43983c5fe..000000000
--- a/res/drawable-hdpi/attachment_bg_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/btn_check_off_normal_holo_light.png b/res/drawable-hdpi/btn_check_off_normal_holo_light.png
deleted file mode 100644
index 351a4f088..000000000
--- a/res/drawable-hdpi/btn_check_off_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/btn_check_on_normal_holo_light.png b/res/drawable-hdpi/btn_check_on_normal_holo_light.png
deleted file mode 100644
index 4b4364c92..000000000
--- a/res/drawable-hdpi/btn_check_on_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/btn_maybe_off.png b/res/drawable-hdpi/btn_maybe_off.png
deleted file mode 100644
index f907a9dc1..000000000
--- a/res/drawable-hdpi/btn_maybe_off.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/btn_no_off.png.png b/res/drawable-hdpi/btn_no_off.png.png
deleted file mode 100644
index f88b5a725..000000000
--- a/res/drawable-hdpi/btn_no_off.png.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/btn_star_off_convo_holo_light.png b/res/drawable-hdpi/btn_star_off_convo_holo_light.png
deleted file mode 100644
index 8d0c6c29e..000000000
--- a/res/drawable-hdpi/btn_star_off_convo_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/btn_star_off_normal_email_holo_light.png b/res/drawable-hdpi/btn_star_off_normal_email_holo_light.png
deleted file mode 100644
index 5076fbf0d..000000000
--- a/res/drawable-hdpi/btn_star_off_normal_email_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/btn_star_on_convo_holo_light.png b/res/drawable-hdpi/btn_star_on_convo_holo_light.png
deleted file mode 100644
index 718186ae3..000000000
--- a/res/drawable-hdpi/btn_star_on_convo_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/btn_star_on_normal_email_holo_light.png b/res/drawable-hdpi/btn_star_on_normal_email_holo_light.png
deleted file mode 100644
index 3042cb75c..000000000
--- a/res/drawable-hdpi/btn_star_on_normal_email_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/btn_yes_off.png.png b/res/drawable-hdpi/btn_yes_off.png.png
deleted file mode 100644
index 94e14806b..000000000
--- a/res/drawable-hdpi/btn_yes_off.png.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/divider_horizontal_holo_light.9.png b/res/drawable-hdpi/divider_horizontal_holo_light.9.png
deleted file mode 100644
index 064cf07de..000000000
--- a/res/drawable-hdpi/divider_horizontal_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/expander_close_holo_light.9.png b/res/drawable-hdpi/expander_close_holo_light.9.png
deleted file mode 100644
index 2dd454837..000000000
--- a/res/drawable-hdpi/expander_close_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/expander_open_holo_light.9.png b/res/drawable-hdpi/expander_open_holo_light.9.png
deleted file mode 100644
index 7cec83ad5..000000000
--- a/res/drawable-hdpi/expander_open_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/gradient_bg_email_widget_holo.9.png b/res/drawable-hdpi/gradient_bg_email_widget_holo.9.png
deleted file mode 100644
index 0ed36dfa8..000000000
--- a/res/drawable-hdpi/gradient_bg_email_widget_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/header_bg_email_widget_holo.9.png b/res/drawable-hdpi/header_bg_email_widget_holo.9.png
deleted file mode 100644
index 6216ba3c3..000000000
--- a/res/drawable-hdpi/header_bg_email_widget_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/header_convo_view_sender_bg_holo.9.png b/res/drawable-hdpi/header_convo_view_sender_bg_holo.9.png
deleted file mode 100644
index bfc020e24..000000000
--- a/res/drawable-hdpi/header_convo_view_sender_bg_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_badge_attachment.png b/res/drawable-hdpi/ic_badge_attachment.png
deleted file mode 100644
index a3db7ef5d..000000000
--- a/res/drawable-hdpi/ic_badge_attachment.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_badge_forward_holo_light.png b/res/drawable-hdpi/ic_badge_forward_holo_light.png
deleted file mode 100644
index 1b2d54fa5..000000000
--- a/res/drawable-hdpi/ic_badge_forward_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_badge_invite_holo_light.png b/res/drawable-hdpi/ic_badge_invite_holo_light.png
deleted file mode 100644
index beb6c3024..000000000
--- a/res/drawable-hdpi/ic_badge_invite_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_badge_reply_forward_holo_light.png b/res/drawable-hdpi/ic_badge_reply_forward_holo_light.png
deleted file mode 100644
index e89b30114..000000000
--- a/res/drawable-hdpi/ic_badge_reply_forward_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_badge_reply_holo_light.png b/res/drawable-hdpi/ic_badge_reply_holo_light.png
deleted file mode 100644
index 1c0e82288..000000000
--- a/res/drawable-hdpi/ic_badge_reply_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_forward_holo_dark.png b/res/drawable-hdpi/ic_forward_holo_dark.png
deleted file mode 100644
index 1f1349df8..000000000
--- a/res/drawable-hdpi/ic_forward_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_list_combined_inbox.png b/res/drawable-hdpi/ic_list_combined_inbox.png
deleted file mode 100644
index a70ad8eed..000000000
--- a/res/drawable-hdpi/ic_list_combined_inbox.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_mailbox_collapsed_holo_light.png b/res/drawable-hdpi/ic_mailbox_collapsed_holo_light.png
deleted file mode 100644
index 2c395b800..000000000
--- a/res/drawable-hdpi/ic_mailbox_collapsed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_compose_normal_holo_light.png b/res/drawable-hdpi/ic_menu_compose_normal_holo_light.png
deleted file mode 100644
index b590822e4..000000000
--- a/res/drawable-hdpi/ic_menu_compose_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_mark_read_holo_light.png b/res/drawable-hdpi/ic_menu_mark_read_holo_light.png
deleted file mode 100644
index e2f898ce3..000000000
--- a/res/drawable-hdpi/ic_menu_mark_read_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_mark_unread_holo_light.png b/res/drawable-hdpi/ic_menu_mark_unread_holo_light.png
deleted file mode 100644
index d8d8f285b..000000000
--- a/res/drawable-hdpi/ic_menu_mark_unread_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_move_to_holo_light.png b/res/drawable-hdpi/ic_menu_move_to_holo_light.png
deleted file mode 100644
index 21a10b056..000000000
--- a/res/drawable-hdpi/ic_menu_move_to_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_refresh_holo_light.png b/res/drawable-hdpi/ic_menu_refresh_holo_light.png
deleted file mode 100644
index 8591b6973..000000000
--- a/res/drawable-hdpi/ic_menu_refresh_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_search_holo_light.png b/res/drawable-hdpi/ic_menu_search_holo_light.png
deleted file mode 100644
index dae6979ae..000000000
--- a/res/drawable-hdpi/ic_menu_search_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_send_disabled_holo_light.png b/res/drawable-hdpi/ic_menu_send_disabled_holo_light.png
deleted file mode 100644
index 24232e400..000000000
--- a/res/drawable-hdpi/ic_menu_send_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_send_holo_light.png b/res/drawable-hdpi/ic_menu_send_holo_light.png
deleted file mode 100644
index 95fc4fc2a..000000000
--- a/res/drawable-hdpi/ic_menu_send_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_send_normal_holo_light.png b/res/drawable-hdpi/ic_menu_send_normal_holo_light.png
deleted file mode 100644
index 0aa3651d1..000000000
--- a/res/drawable-hdpi/ic_menu_send_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_star_holo_light.png b/res/drawable-hdpi/ic_menu_star_holo_light.png
deleted file mode 100644
index 3051ead55..000000000
--- a/res/drawable-hdpi/ic_menu_star_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_star_off_holo_light.png b/res/drawable-hdpi/ic_menu_star_off_holo_light.png
deleted file mode 100644
index 257abf7c0..000000000
--- a/res/drawable-hdpi/ic_menu_star_off_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_trash_holo_light.png b/res/drawable-hdpi/ic_menu_trash_holo_light.png
deleted file mode 100644
index 47676f074..000000000
--- a/res/drawable-hdpi/ic_menu_trash_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_newer_arrow_disabled_holo_light.png b/res/drawable-hdpi/ic_newer_arrow_disabled_holo_light.png
deleted file mode 100644
index dc73d2e99..000000000
--- a/res/drawable-hdpi/ic_newer_arrow_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_newer_arrow_holo_light.png b/res/drawable-hdpi/ic_newer_arrow_holo_light.png
deleted file mode 100644
index 065bdd6e7..000000000
--- a/res/drawable-hdpi/ic_newer_arrow_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_older_arrow_disabled_holo_light.png b/res/drawable-hdpi/ic_older_arrow_disabled_holo_light.png
deleted file mode 100644
index 6a08afa30..000000000
--- a/res/drawable-hdpi/ic_older_arrow_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_older_arrow_holo_light.png b/res/drawable-hdpi/ic_older_arrow_holo_light.png
deleted file mode 100644
index 47cbf8676..000000000
--- a/res/drawable-hdpi/ic_older_arrow_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_remove_attachment_holo_light.png b/res/drawable-hdpi/ic_remove_attachment_holo_light.png
deleted file mode 100644
index fe4bd8998..000000000
--- a/res/drawable-hdpi/ic_remove_attachment_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_reply.png b/res/drawable-hdpi/ic_reply.png
deleted file mode 100644
index 0816a5129..000000000
--- a/res/drawable-hdpi/ic_reply.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_reply_all.png b/res/drawable-hdpi/ic_reply_all.png
deleted file mode 100644
index 0da72bb13..000000000
--- a/res/drawable-hdpi/ic_reply_all.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_reply_all_holo_dark.png b/res/drawable-hdpi/ic_reply_all_holo_dark.png
deleted file mode 100644
index 26bdd1868..000000000
--- a/res/drawable-hdpi/ic_reply_all_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_reply_holo_dark.png b/res/drawable-hdpi/ic_reply_holo_dark.png
deleted file mode 100644
index 41acf9d00..000000000
--- a/res/drawable-hdpi/ic_reply_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_show_images_holo_light.png b/res/drawable-hdpi/ic_show_images_holo_light.png
deleted file mode 100644
index c5ae5953f..000000000
--- a/res/drawable-hdpi/ic_show_images_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_spam_normal_holo_light.png b/res/drawable-hdpi/ic_spam_normal_holo_light.png
deleted file mode 100644
index 21a0fa639..000000000
--- a/res/drawable-hdpi/ic_spam_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/list_div_top_btm_email_widget_holo.9.png b/res/drawable-hdpi/list_div_top_btm_email_widget_holo.9.png
deleted file mode 100644
index 8c54379ef..000000000
--- a/res/drawable-hdpi/list_div_top_btm_email_widget_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/attachment_bg_holo.9.png b/res/drawable-mdpi/attachment_bg_holo.9.png
deleted file mode 100644
index 040bbd04d..000000000
--- a/res/drawable-mdpi/attachment_bg_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/btn_check_off_normal_holo_light.png b/res/drawable-mdpi/btn_check_off_normal_holo_light.png
deleted file mode 100644
index f1b9c7ace..000000000
--- a/res/drawable-mdpi/btn_check_off_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/btn_check_on_normal_holo_light.png b/res/drawable-mdpi/btn_check_on_normal_holo_light.png
deleted file mode 100644
index aede5316a..000000000
--- a/res/drawable-mdpi/btn_check_on_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/btn_maybe_off.png b/res/drawable-mdpi/btn_maybe_off.png
deleted file mode 100644
index 2a22a27ce..000000000
--- a/res/drawable-mdpi/btn_maybe_off.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/btn_no_off.png.png b/res/drawable-mdpi/btn_no_off.png.png
deleted file mode 100644
index 4e8590e46..000000000
--- a/res/drawable-mdpi/btn_no_off.png.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/btn_star_off_convo_holo_light.png b/res/drawable-mdpi/btn_star_off_convo_holo_light.png
deleted file mode 100644
index af65e65c6..000000000
--- a/res/drawable-mdpi/btn_star_off_convo_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/btn_star_off_normal_email_holo_light.png b/res/drawable-mdpi/btn_star_off_normal_email_holo_light.png
deleted file mode 100644
index 7c0d5ad90..000000000
--- a/res/drawable-mdpi/btn_star_off_normal_email_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/btn_star_on_convo_holo_light.png b/res/drawable-mdpi/btn_star_on_convo_holo_light.png
deleted file mode 100644
index 1c2997a1d..000000000
--- a/res/drawable-mdpi/btn_star_on_convo_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/btn_star_on_normal_email_holo_light.png b/res/drawable-mdpi/btn_star_on_normal_email_holo_light.png
deleted file mode 100644
index 23a63b46f..000000000
--- a/res/drawable-mdpi/btn_star_on_normal_email_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/btn_yes_off.png.png b/res/drawable-mdpi/btn_yes_off.png.png
deleted file mode 100644
index 0bad66971..000000000
--- a/res/drawable-mdpi/btn_yes_off.png.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/divider_horizontal_holo_light.9.png b/res/drawable-mdpi/divider_horizontal_holo_light.9.png
deleted file mode 100644
index 064cf07de..000000000
--- a/res/drawable-mdpi/divider_horizontal_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/expander_close_holo_light.9.png b/res/drawable-mdpi/expander_close_holo_light.9.png
deleted file mode 100644
index 2ea966809..000000000
--- a/res/drawable-mdpi/expander_close_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/expander_open_holo_light.9.png b/res/drawable-mdpi/expander_open_holo_light.9.png
deleted file mode 100644
index 28b9ec76f..000000000
--- a/res/drawable-mdpi/expander_open_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/gradient_bg_email_widget_holo.9.png b/res/drawable-mdpi/gradient_bg_email_widget_holo.9.png
deleted file mode 100644
index 8d319d1d7..000000000
--- a/res/drawable-mdpi/gradient_bg_email_widget_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/header_bg_email_widget_holo.9.png b/res/drawable-mdpi/header_bg_email_widget_holo.9.png
deleted file mode 100644
index 500cc4c41..000000000
--- a/res/drawable-mdpi/header_bg_email_widget_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/header_convo_view_sender_bg_holo.9.png b/res/drawable-mdpi/header_convo_view_sender_bg_holo.9.png
deleted file mode 100644
index 2afef3c34..000000000
--- a/res/drawable-mdpi/header_convo_view_sender_bg_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_badge_attachment.png b/res/drawable-mdpi/ic_badge_attachment.png
deleted file mode 100644
index 7ce9ecf30..000000000
--- a/res/drawable-mdpi/ic_badge_attachment.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_badge_forward_holo_light.png b/res/drawable-mdpi/ic_badge_forward_holo_light.png
deleted file mode 100644
index 7e801b8cd..000000000
--- a/res/drawable-mdpi/ic_badge_forward_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_badge_invite_holo_light.png b/res/drawable-mdpi/ic_badge_invite_holo_light.png
deleted file mode 100644
index febdc6dd7..000000000
--- a/res/drawable-mdpi/ic_badge_invite_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_badge_reply_forward_holo_light.png b/res/drawable-mdpi/ic_badge_reply_forward_holo_light.png
deleted file mode 100644
index c46ba10f4..000000000
--- a/res/drawable-mdpi/ic_badge_reply_forward_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_badge_reply_holo_light.png b/res/drawable-mdpi/ic_badge_reply_holo_light.png
deleted file mode 100644
index 7a7b07b8e..000000000
--- a/res/drawable-mdpi/ic_badge_reply_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_forward_holo_dark.png b/res/drawable-mdpi/ic_forward_holo_dark.png
deleted file mode 100644
index 0894ce5e3..000000000
--- a/res/drawable-mdpi/ic_forward_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_list_combined_inbox.png b/res/drawable-mdpi/ic_list_combined_inbox.png
deleted file mode 100644
index 1d3bde131..000000000
--- a/res/drawable-mdpi/ic_list_combined_inbox.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_mailbox_collapsed_holo_light.png b/res/drawable-mdpi/ic_mailbox_collapsed_holo_light.png
deleted file mode 100644
index 5b1a81593..000000000
--- a/res/drawable-mdpi/ic_mailbox_collapsed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_compose_normal_holo_light.png b/res/drawable-mdpi/ic_menu_compose_normal_holo_light.png
deleted file mode 100644
index 4f194f891..000000000
--- a/res/drawable-mdpi/ic_menu_compose_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_mark_read_holo_light.png b/res/drawable-mdpi/ic_menu_mark_read_holo_light.png
deleted file mode 100644
index 05294de50..000000000
--- a/res/drawable-mdpi/ic_menu_mark_read_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_mark_unread_holo_light.png b/res/drawable-mdpi/ic_menu_mark_unread_holo_light.png
deleted file mode 100644
index 21adb5e6c..000000000
--- a/res/drawable-mdpi/ic_menu_mark_unread_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_move_to_holo_light.png b/res/drawable-mdpi/ic_menu_move_to_holo_light.png
deleted file mode 100644
index 2ad591008..000000000
--- a/res/drawable-mdpi/ic_menu_move_to_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_refresh_holo_light.png b/res/drawable-mdpi/ic_menu_refresh_holo_light.png
deleted file mode 100644
index 362179827..000000000
--- a/res/drawable-mdpi/ic_menu_refresh_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_search_holo_light.png b/res/drawable-mdpi/ic_menu_search_holo_light.png
deleted file mode 100644
index 2769fd2a6..000000000
--- a/res/drawable-mdpi/ic_menu_search_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_send_disabled_holo_light.png b/res/drawable-mdpi/ic_menu_send_disabled_holo_light.png
deleted file mode 100644
index f013053b5..000000000
--- a/res/drawable-mdpi/ic_menu_send_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_send_holo_light.png b/res/drawable-mdpi/ic_menu_send_holo_light.png
deleted file mode 100644
index e90a8c1ba..000000000
--- a/res/drawable-mdpi/ic_menu_send_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_send_normal_holo_light.png b/res/drawable-mdpi/ic_menu_send_normal_holo_light.png
deleted file mode 100644
index 3275d70ae..000000000
--- a/res/drawable-mdpi/ic_menu_send_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_star_holo_light.png b/res/drawable-mdpi/ic_menu_star_holo_light.png
deleted file mode 100644
index e9ab7efc0..000000000
--- a/res/drawable-mdpi/ic_menu_star_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_star_off_holo_light.png b/res/drawable-mdpi/ic_menu_star_off_holo_light.png
deleted file mode 100644
index 15f58453e..000000000
--- a/res/drawable-mdpi/ic_menu_star_off_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_trash_holo_light.png b/res/drawable-mdpi/ic_menu_trash_holo_light.png
deleted file mode 100644
index 7e7c3fe8a..000000000
--- a/res/drawable-mdpi/ic_menu_trash_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_newer_arrow_disabled_holo_light.png b/res/drawable-mdpi/ic_newer_arrow_disabled_holo_light.png
deleted file mode 100644
index 4c24026f0..000000000
--- a/res/drawable-mdpi/ic_newer_arrow_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_newer_arrow_holo_light.png b/res/drawable-mdpi/ic_newer_arrow_holo_light.png
deleted file mode 100644
index 02d528909..000000000
--- a/res/drawable-mdpi/ic_newer_arrow_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_older_arrow_disabled_holo_light.png b/res/drawable-mdpi/ic_older_arrow_disabled_holo_light.png
deleted file mode 100644
index 1e5a11d93..000000000
--- a/res/drawable-mdpi/ic_older_arrow_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_older_arrow_holo_light.png b/res/drawable-mdpi/ic_older_arrow_holo_light.png
deleted file mode 100644
index 3b72b1329..000000000
--- a/res/drawable-mdpi/ic_older_arrow_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_remove_attachment_holo_light.png b/res/drawable-mdpi/ic_remove_attachment_holo_light.png
deleted file mode 100644
index 677c1ca19..000000000
--- a/res/drawable-mdpi/ic_remove_attachment_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_reply.png b/res/drawable-mdpi/ic_reply.png
deleted file mode 100644
index 55288fa96..000000000
--- a/res/drawable-mdpi/ic_reply.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_reply_all.png b/res/drawable-mdpi/ic_reply_all.png
deleted file mode 100644
index 4cb89d67f..000000000
--- a/res/drawable-mdpi/ic_reply_all.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_reply_all_holo_dark.png b/res/drawable-mdpi/ic_reply_all_holo_dark.png
deleted file mode 100644
index aa1f3cdd2..000000000
--- a/res/drawable-mdpi/ic_reply_all_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_reply_holo_dark.png b/res/drawable-mdpi/ic_reply_holo_dark.png
deleted file mode 100644
index 303b296a0..000000000
--- a/res/drawable-mdpi/ic_reply_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_show_images_holo_light.png b/res/drawable-mdpi/ic_show_images_holo_light.png
deleted file mode 100644
index 46c9e51f3..000000000
--- a/res/drawable-mdpi/ic_show_images_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_spam_normal_holo_light.png b/res/drawable-mdpi/ic_spam_normal_holo_light.png
deleted file mode 100644
index 5abe49320..000000000
--- a/res/drawable-mdpi/ic_spam_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/list_div_top_btm_email_widget_holo.9.png b/res/drawable-mdpi/list_div_top_btm_email_widget_holo.9.png
deleted file mode 100644
index 7d59de26c..000000000
--- a/res/drawable-mdpi/list_div_top_btm_email_widget_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/btn_check_off_normal_holo_light.png b/res/drawable-sw600dp-hdpi/btn_check_off_normal_holo_light.png
deleted file mode 100644
index 402bef332..000000000
--- a/res/drawable-sw600dp-hdpi/btn_check_off_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/btn_check_on_normal_holo_light.png b/res/drawable-sw600dp-hdpi/btn_check_on_normal_holo_light.png
deleted file mode 100644
index 0e49c5e9b..000000000
--- a/res/drawable-sw600dp-hdpi/btn_check_on_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/btn_star_off_normal_email_holo_light.png b/res/drawable-sw600dp-hdpi/btn_star_off_normal_email_holo_light.png
deleted file mode 100644
index 985ca74c9..000000000
--- a/res/drawable-sw600dp-hdpi/btn_star_off_normal_email_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/btn_star_on_normal_email_holo_light.png b/res/drawable-sw600dp-hdpi/btn_star_on_normal_email_holo_light.png
deleted file mode 100644
index f500c6754..000000000
--- a/res/drawable-sw600dp-hdpi/btn_star_on_normal_email_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/btn_check_off_normal_holo_light.png b/res/drawable-sw600dp-mdpi/btn_check_off_normal_holo_light.png
deleted file mode 100644
index f1b9c7ace..000000000
--- a/res/drawable-sw600dp-mdpi/btn_check_off_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/btn_check_on_normal_holo_light.png b/res/drawable-sw600dp-mdpi/btn_check_on_normal_holo_light.png
deleted file mode 100644
index aede5316a..000000000
--- a/res/drawable-sw600dp-mdpi/btn_check_on_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/btn_star_off_normal_email_holo_light.png b/res/drawable-sw600dp-mdpi/btn_star_off_normal_email_holo_light.png
deleted file mode 100644
index a4d414043..000000000
--- a/res/drawable-sw600dp-mdpi/btn_star_off_normal_email_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/btn_star_on_normal_email_holo_light.png b/res/drawable-sw600dp-mdpi/btn_star_on_normal_email_holo_light.png
deleted file mode 100644
index fb9324706..000000000
--- a/res/drawable-sw600dp-mdpi/btn_star_on_normal_email_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/btn_check_off_normal_holo_light.png b/res/drawable-sw600dp-xhdpi/btn_check_off_normal_holo_light.png
deleted file mode 100644
index 2863acf82..000000000
--- a/res/drawable-sw600dp-xhdpi/btn_check_off_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/btn_check_on_normal_holo_light.png b/res/drawable-sw600dp-xhdpi/btn_check_on_normal_holo_light.png
deleted file mode 100644
index 121986c2d..000000000
--- a/res/drawable-sw600dp-xhdpi/btn_check_on_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/btn_star_off_normal_email_holo_light.png b/res/drawable-sw600dp-xhdpi/btn_star_off_normal_email_holo_light.png
deleted file mode 100644
index e740d9bc0..000000000
--- a/res/drawable-sw600dp-xhdpi/btn_star_off_normal_email_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/btn_star_on_normal_email_holo_light.png b/res/drawable-sw600dp-xhdpi/btn_star_on_normal_email_holo_light.png
deleted file mode 100644
index c5154174e..000000000
--- a/res/drawable-sw600dp-xhdpi/btn_star_on_normal_email_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/attachment_bg_holo.9.png b/res/drawable-xhdpi/attachment_bg_holo.9.png
deleted file mode 100644
index b59af1df1..000000000
--- a/res/drawable-xhdpi/attachment_bg_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/btn_check_off_normal_holo_light.png b/res/drawable-xhdpi/btn_check_off_normal_holo_light.png
deleted file mode 100644
index d3809fa13..000000000
--- a/res/drawable-xhdpi/btn_check_off_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/btn_check_on_normal_holo_light.png b/res/drawable-xhdpi/btn_check_on_normal_holo_light.png
deleted file mode 100644
index 7e1bc8cba..000000000
--- a/res/drawable-xhdpi/btn_check_on_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/btn_maybe_off.png b/res/drawable-xhdpi/btn_maybe_off.png
deleted file mode 100644
index 59c7a4ad1..000000000
--- a/res/drawable-xhdpi/btn_maybe_off.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/btn_no_off.png.png b/res/drawable-xhdpi/btn_no_off.png.png
deleted file mode 100644
index c8bcae49b..000000000
--- a/res/drawable-xhdpi/btn_no_off.png.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/btn_star_off_convo_holo_light.png b/res/drawable-xhdpi/btn_star_off_convo_holo_light.png
deleted file mode 100644
index 8edd94cd3..000000000
--- a/res/drawable-xhdpi/btn_star_off_convo_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/btn_star_off_normal_email_holo_light.png b/res/drawable-xhdpi/btn_star_off_normal_email_holo_light.png
deleted file mode 100644
index 7129d0016..000000000
--- a/res/drawable-xhdpi/btn_star_off_normal_email_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/btn_star_on_convo_holo_light.png b/res/drawable-xhdpi/btn_star_on_convo_holo_light.png
deleted file mode 100644
index 1974ca690..000000000
--- a/res/drawable-xhdpi/btn_star_on_convo_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/btn_star_on_normal_email_holo_light.png b/res/drawable-xhdpi/btn_star_on_normal_email_holo_light.png
deleted file mode 100644
index d91c8bceb..000000000
--- a/res/drawable-xhdpi/btn_star_on_normal_email_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/btn_yes_off.png.png b/res/drawable-xhdpi/btn_yes_off.png.png
deleted file mode 100644
index 97d169b61..000000000
--- a/res/drawable-xhdpi/btn_yes_off.png.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/divider_horizontal_holo_light.9.png b/res/drawable-xhdpi/divider_horizontal_holo_light.9.png
deleted file mode 100644
index ce444863c..000000000
--- a/res/drawable-xhdpi/divider_horizontal_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/expander_close_holo_light.9.png b/res/drawable-xhdpi/expander_close_holo_light.9.png
deleted file mode 100644
index 333dd24db..000000000
--- a/res/drawable-xhdpi/expander_close_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/expander_open_holo_light.9.png b/res/drawable-xhdpi/expander_open_holo_light.9.png
deleted file mode 100644
index 67ed4c0a1..000000000
--- a/res/drawable-xhdpi/expander_open_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/gradient_bg_email_widget_holo.9.png b/res/drawable-xhdpi/gradient_bg_email_widget_holo.9.png
deleted file mode 100644
index b481cade3..000000000
--- a/res/drawable-xhdpi/gradient_bg_email_widget_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/header_bg_email_widget_holo.9.png b/res/drawable-xhdpi/header_bg_email_widget_holo.9.png
deleted file mode 100644
index fa411415d..000000000
--- a/res/drawable-xhdpi/header_bg_email_widget_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/header_convo_view_sender_bg_holo.9.png b/res/drawable-xhdpi/header_convo_view_sender_bg_holo.9.png
deleted file mode 100644
index 3f57a7bc6..000000000
--- a/res/drawable-xhdpi/header_convo_view_sender_bg_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_badge_attachment.png b/res/drawable-xhdpi/ic_badge_attachment.png
deleted file mode 100644
index 8376cdf6e..000000000
--- a/res/drawable-xhdpi/ic_badge_attachment.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_badge_forward_holo_light.png b/res/drawable-xhdpi/ic_badge_forward_holo_light.png
deleted file mode 100644
index 0f5a80a3d..000000000
--- a/res/drawable-xhdpi/ic_badge_forward_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_badge_invite_holo_light.png b/res/drawable-xhdpi/ic_badge_invite_holo_light.png
deleted file mode 100644
index b3f1c50a2..000000000
--- a/res/drawable-xhdpi/ic_badge_invite_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_badge_reply_forward_holo_light.png b/res/drawable-xhdpi/ic_badge_reply_forward_holo_light.png
deleted file mode 100644
index 79b07e0a4..000000000
--- a/res/drawable-xhdpi/ic_badge_reply_forward_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_badge_reply_holo_light.png b/res/drawable-xhdpi/ic_badge_reply_holo_light.png
deleted file mode 100644
index 3f69cc412..000000000
--- a/res/drawable-xhdpi/ic_badge_reply_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_forward_holo_dark.png b/res/drawable-xhdpi/ic_forward_holo_dark.png
deleted file mode 100644
index b36b81a05..000000000
--- a/res/drawable-xhdpi/ic_forward_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_list_combined_inbox.png b/res/drawable-xhdpi/ic_list_combined_inbox.png
deleted file mode 100644
index 11a61b895..000000000
--- a/res/drawable-xhdpi/ic_list_combined_inbox.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_mailbox_collapsed_holo_light.png b/res/drawable-xhdpi/ic_mailbox_collapsed_holo_light.png
deleted file mode 100644
index 132282e97..000000000
--- a/res/drawable-xhdpi/ic_mailbox_collapsed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_compose_normal_holo_light.png b/res/drawable-xhdpi/ic_menu_compose_normal_holo_light.png
deleted file mode 100644
index a2d821ae3..000000000
--- a/res/drawable-xhdpi/ic_menu_compose_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_mark_read_holo_light.png b/res/drawable-xhdpi/ic_menu_mark_read_holo_light.png
deleted file mode 100644
index cfd5e34e9..000000000
--- a/res/drawable-xhdpi/ic_menu_mark_read_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_mark_unread_holo_light.png b/res/drawable-xhdpi/ic_menu_mark_unread_holo_light.png
deleted file mode 100644
index f023cb023..000000000
--- a/res/drawable-xhdpi/ic_menu_mark_unread_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_move_to_holo_light.png b/res/drawable-xhdpi/ic_menu_move_to_holo_light.png
deleted file mode 100644
index fb136383c..000000000
--- a/res/drawable-xhdpi/ic_menu_move_to_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_refresh_holo_light.png b/res/drawable-xhdpi/ic_menu_refresh_holo_light.png
deleted file mode 100644
index 9b4a49d0a..000000000
--- a/res/drawable-xhdpi/ic_menu_refresh_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_search_holo_light.png b/res/drawable-xhdpi/ic_menu_search_holo_light.png
deleted file mode 100644
index 4c6aade68..000000000
--- a/res/drawable-xhdpi/ic_menu_search_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_send_disabled_holo_light.png b/res/drawable-xhdpi/ic_menu_send_disabled_holo_light.png
deleted file mode 100644
index b3143f63b..000000000
--- a/res/drawable-xhdpi/ic_menu_send_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_send_holo_light.png b/res/drawable-xhdpi/ic_menu_send_holo_light.png
deleted file mode 100644
index 9f4c7973c..000000000
--- a/res/drawable-xhdpi/ic_menu_send_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_send_normal_holo_light.png b/res/drawable-xhdpi/ic_menu_send_normal_holo_light.png
deleted file mode 100644
index 294f4769e..000000000
--- a/res/drawable-xhdpi/ic_menu_send_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_star_holo_light.png b/res/drawable-xhdpi/ic_menu_star_holo_light.png
deleted file mode 100644
index b69c03485..000000000
--- a/res/drawable-xhdpi/ic_menu_star_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_star_off_holo_light.png b/res/drawable-xhdpi/ic_menu_star_off_holo_light.png
deleted file mode 100644
index b7417f1b4..000000000
--- a/res/drawable-xhdpi/ic_menu_star_off_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_trash_holo_light.png b/res/drawable-xhdpi/ic_menu_trash_holo_light.png
deleted file mode 100644
index 203ba4c40..000000000
--- a/res/drawable-xhdpi/ic_menu_trash_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_newer_arrow_disabled_holo_light.png b/res/drawable-xhdpi/ic_newer_arrow_disabled_holo_light.png
deleted file mode 100644
index 6bde91450..000000000
--- a/res/drawable-xhdpi/ic_newer_arrow_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_newer_arrow_holo_light.png b/res/drawable-xhdpi/ic_newer_arrow_holo_light.png
deleted file mode 100644
index aba0e9b4a..000000000
--- a/res/drawable-xhdpi/ic_newer_arrow_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_older_arrow_disabled_holo_light.png b/res/drawable-xhdpi/ic_older_arrow_disabled_holo_light.png
deleted file mode 100644
index 6ef30a7b6..000000000
--- a/res/drawable-xhdpi/ic_older_arrow_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_older_arrow_holo_light.png b/res/drawable-xhdpi/ic_older_arrow_holo_light.png
deleted file mode 100644
index 0f220eac9..000000000
--- a/res/drawable-xhdpi/ic_older_arrow_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_remove_attachment_holo_light.png b/res/drawable-xhdpi/ic_remove_attachment_holo_light.png
deleted file mode 100644
index 587910522..000000000
--- a/res/drawable-xhdpi/ic_remove_attachment_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_reply.png b/res/drawable-xhdpi/ic_reply.png
deleted file mode 100644
index 01467a472..000000000
--- a/res/drawable-xhdpi/ic_reply.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_reply_all.png b/res/drawable-xhdpi/ic_reply_all.png
deleted file mode 100644
index 8761b7572..000000000
--- a/res/drawable-xhdpi/ic_reply_all.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_reply_all_holo_dark.png b/res/drawable-xhdpi/ic_reply_all_holo_dark.png
deleted file mode 100644
index 3852a1d29..000000000
--- a/res/drawable-xhdpi/ic_reply_all_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_reply_holo_dark.png b/res/drawable-xhdpi/ic_reply_holo_dark.png
deleted file mode 100644
index 6fccf467e..000000000
--- a/res/drawable-xhdpi/ic_reply_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_show_images_holo_light.png b/res/drawable-xhdpi/ic_show_images_holo_light.png
deleted file mode 100644
index 571bc57a9..000000000
--- a/res/drawable-xhdpi/ic_show_images_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_spam_normal_holo_light.png b/res/drawable-xhdpi/ic_spam_normal_holo_light.png
deleted file mode 100644
index 4edbfe06d..000000000
--- a/res/drawable-xhdpi/ic_spam_normal_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/list_div_top_btm_email_widget_holo.9.png b/res/drawable-xhdpi/list_div_top_btm_email_widget_holo.9.png
deleted file mode 100644
index 6934c5f0e..000000000
--- a/res/drawable-xhdpi/list_div_top_btm_email_widget_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/attachment_background.xml b/res/drawable/attachment_background.xml
deleted file mode 100644
index 559d33fa7..000000000
--- a/res/drawable/attachment_background.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_selected="true">
- <shape type="rectangle">
- <solid android:color="#ffffaf00" />
- <corners android:radius="8dp" />
- </shape>
- <stroke android:width="2dip" android:color="#ff000000" />
- </item>
-
- <item android:state_selected="false">
- <shape type="rectangle">
- <solid android:color="#ff444444" />
- <corners android:radius="8dp" />
- </shape>
- <stroke android:width="2dip" android:color="#ff000000" />
- </item>
-</selector>
diff --git a/res/drawable/menu_item_newer.xml b/res/drawable/menu_item_newer.xml
deleted file mode 100644
index 195c1be33..000000000
--- a/res/drawable/menu_item_newer.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="true" android:drawable="@drawable/ic_newer_arrow_holo_light" />
- <item android:state_enabled="false" android:drawable="@drawable/ic_newer_arrow_disabled_holo_light" />
-</selector>
diff --git a/res/drawable/menu_item_older.xml b/res/drawable/menu_item_older.xml
deleted file mode 100644
index 42dc10d47..000000000
--- a/res/drawable/menu_item_older.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="true" android:drawable="@drawable/ic_older_arrow_holo_light" />
- <item android:state_enabled="false" android:drawable="@drawable/ic_older_arrow_disabled_holo_light" />
-</selector>
diff --git a/res/layout-land/message_view_header_actions.xml b/res/layout-land/message_view_header_actions.xml
deleted file mode 100644
index 5c60d9c84..000000000
--- a/res/layout-land/message_view_header_actions.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <ImageButton
- android:id="@+id/favorite"
- style="@style/message_view_action_buttons"
- android:src="@drawable/btn_star_off_convo_holo_light"
- android:contentDescription="@string/favorite_action"
- />
- <ImageButton
- android:id="@+id/reply"
- style="@style/message_view_action_buttons"
- android:src="@drawable/ic_reply_holo_dark"
- android:contentDescription="@string/reply_action"
- />
- <ImageButton
- android:id="@+id/reply_all"
- style="@style/message_view_action_buttons"
- android:src="@drawable/ic_reply_all_holo_dark"
- android:contentDescription="@string/reply_all_action"
- />
-
- <ImageButton
- android:id="@+id/forward"
- style="@style/message_view_action_buttons"
- android:src="@drawable/ic_forward_holo_dark"
- android:contentDescription="@string/forward_action"
- />
-</merge>
diff --git a/res/layout-sw600dp-land/account_setup_exchange.xml b/res/layout-sw600dp-land/account_setup_exchange.xml
deleted file mode 100644
index 812e9bc60..000000000
--- a/res/layout-sw600dp-land/account_setup_exchange.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Exchange Setup - XL - landscape - see layout/ for small-screen version -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="@dimen/setup_padding_top"
- android:paddingLeft="@dimen/setup_padding_left"
- android:paddingRight="@dimen/setup_padding_right"
- >
-
- <!-- Headline and hairline divider -->
- <TextView
- android:id="@+id/headline"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_exchange_headline"
- android:textAppearance="@style/accountSetupHeadline" />
- <View
- android:id="@+id/top_divider"
- android:layout_below="@+id/headline"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
-
- <!-- Buttons on the right -->
- <Button
- android:id="@+id/previous"
- android:layout_below="@+id/top_divider"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/setup_buttons_padding_top"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/previous_action" />
- <Button
- android:id="@+id/next"
- android:layout_below="@+id/previous"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/setup_buttons_vertical_spacing"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/next_action" />
-
- <!-- Fragment on the left containing the setup info -->
- <FrameLayout
- android:layout_below="@+id/top_divider"
- android:layout_alignParentLeft="true"
- android:layout_toLeftOf="@+id/next"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="16dip"
- android:paddingRight="64dip"
- >
- <fragment
- android:id="@+id/setup_fragment"
- class="com.android.email.activity.setup.AccountSetupExchangeFragment"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- />
- </FrameLayout>
- </RelativeLayout>
-</ScrollView> \ No newline at end of file
diff --git a/res/layout-sw600dp-land/message_view_invitation.xml b/res/layout-sw600dp-land/message_view_invitation.xml
deleted file mode 100644
index f80593f2c..000000000
--- a/res/layout-sw600dp-land/message_view_invitation.xml
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- tablet -->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/invite_section"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@color/message_view_info_back_color"
- android:orientation="vertical"
- >
- <View
- android:layout_width="match_parent"
- style="@style/message_view_horizontal_divider"
- />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="64dip"
- android:orientation="horizontal"
- >
- <!-- TODO: The plan is to show a calendar icon here. -->
- <ImageView
- android:layout_width="64dip"
- android:layout_height="64dip"
- android:layout_weight="0"
- android:src="@null"
- android:visibility="gone"
- />
- <LinearLayout
- android:layout_width="200dip"
- android:layout_weight="1"
- android:layout_height="64dip"
- android:orientation="horizontal"
- android:divider="?android:attr/dividerVertical"
- android:showDividers="middle"
- android:dividerPadding="16dip"
- >
- <RelativeLayout
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:layout_weight="1"
- >
- <CheckBox
- android:id="@+id/accept"
- android:layout_width="104dip"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="32dip"
- android:text="@string/message_view_invite_accept"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:singleLine="true"
- android:ellipsize="end"
- />
- <CheckBox
- android:id="@+id/maybe"
- android:layout_width="104dip"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_toRightOf="@id/accept"
- android:layout_marginLeft="24dip"
- android:text="@string/message_view_invite_maybe"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:singleLine="true"
- android:ellipsize="end"
- />
- <CheckBox
- android:id="@+id/decline"
- android:layout_width="104dip"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_toRightOf="@id/maybe"
- android:layout_marginLeft="24dip"
- android:text="@string/message_view_invite_decline"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:singleLine="true"
- android:ellipsize="end"
- />
-
- <!-- "Going?" -->
- <TextView
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_above="@id/accept"
- android:layout_marginLeft="32dip"
- android:layout_marginRight="32dip"
- android:singleLine="true"
- android:ellipsize="end"
- android:text="@string/message_view_invite_text"
- android:textSize="18dip"
- android:textColor="@color/text_primary_color"
- android:gravity="left|bottom"
- />
-
- </RelativeLayout>
- <Button
- android:id="@+id/invite_link"
- android:layout_width="192dip"
- android:layout_height="match_parent"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- style="@android:style/Widget.Holo.Button.Borderless"
- android:padding="0dip"
- android:text="@string/message_view_invite_view"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:textStyle="bold"
- android:singleLine="true"
- android:ellipsize="end"
- android:gravity="center"
- />
- </LinearLayout>
- </LinearLayout>
- <View
- android:layout_width="match_parent"
- style="@style/message_view_horizontal_divider"
- />
-</LinearLayout>
diff --git a/res/layout-sw600dp-port/account_setup_exchange.xml b/res/layout-sw600dp-port/account_setup_exchange.xml
deleted file mode 100644
index 34ba39917..000000000
--- a/res/layout-sw600dp-port/account_setup_exchange.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Exchange Setup - XL - portrait - see layout/ for small-screen version -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true"
- >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="@dimen/setup_padding_top"
- android:paddingLeft="@dimen/setup_padding_left"
- android:paddingRight="@dimen/setup_padding_right"
- >
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- >
-
- <!-- Headline and hairline divider -->
- <TextView
- android:id="@+id/headline"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_exchange_headline"
- android:textAppearance="@style/accountSetupHeadline" />
- <View
- android:id="@+id/top_divider"
- android:layout_below="@+id/headline"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
-
- <!-- Fragment on the top containing the setup info -->
- <FrameLayout
- android:layout_below="@+id/top_divider"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="16dip"
- android:paddingRight="96dip"
- >
- <fragment
- android:id="@+id/setup_fragment"
- class="com.android.email.activity.setup.AccountSetupExchangeFragment"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- />
- </FrameLayout>
- </RelativeLayout>
-
- <!-- Buttons below -->
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/setup_buttons_padding_bottom"
- >
- <Button
- android:id="@+id/previous"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="@dimen/setup_buttons_padding_left"
- style="@style/accountSetupButton"
- android:text="@string/previous_action" />
- <Button
- android:id="@+id/next"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- android:layout_marginRight="@dimen/setup_buttons_padding_right"
- style="@style/accountSetupButton"
- android:text="@string/next_action" />
- </RelativeLayout>
- </LinearLayout>
-</ScrollView> \ No newline at end of file
diff --git a/res/layout-sw600dp-port/message_view_invitation.xml b/res/layout-sw600dp-port/message_view_invitation.xml
deleted file mode 100644
index eaf8d6374..000000000
--- a/res/layout-sw600dp-port/message_view_invitation.xml
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- tablet -->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/invite_section"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@color/message_view_info_back_color"
- android:orientation="vertical"
- >
- <View
- android:layout_width="match_parent"
- style="@style/message_view_horizontal_divider"
- />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="64dip"
- android:orientation="horizontal"
- >
- <!-- TODO: The plan is to show a calendar icon here. -->
- <ImageView
- android:layout_width="64dip"
- android:layout_height="64dip"
- android:layout_weight="0"
- android:src="@null"
- android:visibility="gone"
- />
- <LinearLayout
- android:layout_width="200dip"
- android:layout_weight="1"
- android:layout_height="64dip"
- android:orientation="horizontal"
- android:divider="?android:attr/dividerVertical"
- android:showDividers="middle"
- android:dividerPadding="16dip"
- >
- <RelativeLayout
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:layout_weight="1"
- >
- <CheckBox
- android:id="@+id/accept"
- android:layout_width="104dip"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:text="@string/message_view_invite_accept"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:singleLine="true"
- android:ellipsize="end"
- />
- <CheckBox
- android:id="@+id/maybe"
- android:layout_width="104dip"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_toRightOf="@id/accept"
- android:layout_marginLeft="8dip"
- android:text="@string/message_view_invite_maybe"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:singleLine="true"
- android:ellipsize="end"
- />
- <CheckBox
- android:id="@+id/decline"
- android:layout_width="104dip"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_toRightOf="@id/maybe"
- android:layout_marginLeft="8dip"
- android:text="@string/message_view_invite_decline"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:singleLine="true"
- android:ellipsize="end"
- />
-
- <!-- "Going?" -->
- <TextView
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_above="@id/accept"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:singleLine="true"
- android:ellipsize="end"
- android:text="@string/message_view_invite_text"
- android:textSize="18dip"
- android:textColor="@color/text_primary_color"
- android:gravity="left|bottom"
- />
-
- </RelativeLayout>
- <Button
- android:id="@+id/invite_link"
- android:layout_width="162dip"
- android:layout_height="match_parent"
- android:layout_marginLeft="8dip"
- android:layout_marginRight="8dip"
- style="@android:style/Widget.Holo.Button.Borderless"
- android:padding="0dip"
- android:text="@string/message_view_invite_view"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:textStyle="bold"
- android:singleLine="true"
- android:ellipsize="end"
- android:gravity="center"
- />
- </LinearLayout>
- </LinearLayout>
- <View
- android:layout_width="match_parent"
- style="@style/message_view_horizontal_divider"
- />
-</LinearLayout>
diff --git a/res/layout-sw600dp/account_setup_account_type.xml b/res/layout-sw600dp/account_setup_account_type.xml
index 0c2139aef..c6d8a6667 100644
--- a/res/layout-sw600dp/account_setup_account_type.xml
+++ b/res/layout-sw600dp/account_setup_account_type.xml
@@ -38,13 +38,13 @@
android:layout_below="@+id/headline"
android:layout_marginBottom="16dip"
android:layout_width="match_parent"
- android:layout_height="1px"
+ android:layout_height="1dp"
android:background="@color/account_setup_divider_color" />
<!-- Layout on the left containing the setup info -->
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/main_content"
+ android:id="@+id/accountTypes"
android:layout_below="@+id/top_divider"
android:layout_alignParentLeft="true"
android:layout_marginRight="64dip"
@@ -60,30 +60,6 @@
android:layout_marginLeft="16dip"
android:text="@string/account_setup_account_type_instructions"
android:textAppearance="@style/accountSetupInfoText" />
- <Button
- android:id="@+id/pop"
- android:layout_below="@+id/instructions"
- android:layout_alignParentLeft="true"
- android:layout_marginTop="@dimen/setup_buttons_vertical_spacing"
- android:layout_marginLeft="48dip"
- style="@style/accountSetupButton"
- android:text="@string/account_setup_account_type_pop_action" />
- <Button
- android:id="@+id/imap"
- android:layout_below="@+id/pop"
- android:layout_alignParentLeft="true"
- android:layout_marginTop="@dimen/setup_buttons_vertical_spacing"
- android:layout_marginLeft="48dip"
- style="@style/accountSetupButton"
- android:text="@string/account_setup_account_type_imap_action" />
- <Button
- android:id="@+id/exchange"
- android:layout_below="@+id/imap"
- android:layout_alignParentLeft="true"
- android:layout_marginTop="@dimen/setup_buttons_vertical_spacing"
- android:layout_marginLeft="48dip"
- style="@style/accountSetupButton"
- android:text="@string/account_setup_account_type_exchange_action" />
</RelativeLayout>
<!-- Previous button (can be below or to the right) -->
diff --git a/res/layout-sw600dp/account_setup_exchange_fragment.xml b/res/layout-sw600dp/account_setup_exchange_fragment.xml
deleted file mode 100644
index e99df3c4f..000000000
--- a/res/layout-sw600dp/account_setup_exchange_fragment.xml
+++ /dev/null
@@ -1,134 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Exchange server settings - tablet - see layout/ for phone UX variant -->
-<!-- This is used directly by the account setup activity, but during settings it is
- wrapped in an outer layout (account_settings_exchange_fragment) -->
-<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:stretchColumns="1" >
-
- <TableRow
- android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_exchange_username_label" />
- <EditText
- android:id="@+id/account_username"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@string/account_setup_exchange_username_label"
- android:inputType="textEmailAddress"
- android:imeOptions="actionDone" />
- </TableRow>
- <TableRow
- android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_incoming_password_label" />
- <EditText
- android:id="@+id/account_password"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@string/account_setup_incoming_password_label"
- android:inputType="textPassword"
- android:imeOptions="actionDone" />
- </TableRow>
- <TableRow
- android:paddingTop="16dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_exchange_server_label" />
- <!-- Note: we use inputType=textUri as the closest approximation to a server name -->
- <EditText
- android:id="@+id/account_server"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@string/account_setup_exchange_server_label"
- android:inputType="textUri"
- android:imeOptions="actionDone" />
- </TableRow>
- <!-- Note, this row is not a TableRow, and it will span the entire table - no columns -->
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="32dip"
- android:orientation="vertical" >
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
- <CheckBox
- android:id="@+id/account_ssl"
- android:layout_marginTop="16dip"
- android:layout_marginBottom="16dip"
- android:layout_marginLeft="32dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_exchange_ssl_label" />
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color" />
- <CheckBox
- android:id="@+id/account_trust_certificates"
- android:layout_marginTop="16dip"
- android:layout_marginBottom="16dip"
- android:layout_marginLeft="32dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/account_setup_exchange_trust_certificates_label"
- android:visibility="gone" />
- <View
- android:id="@+id/account_trust_certificates_divider"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color"
- android:visibility="gone" />
- <include
- android:id="@+id/client_certificate_selector"
- layout="@layout/client_certificate_selector"
- android:visibility="gone" />
- <View
- android:id="@+id/client_certificate_divider"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/account_setup_divider_color"
- android:visibility="gone" />
- </LinearLayout>
- <TableRow
- android:paddingTop="32dip" >
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginRight="16dip"
- android:text="@string/account_setup_exchange_device_id_label" />
- <!-- TODO - when adding back in styles, this should be slightly different (was "medium") -->
- <TextView
- android:id="@+id/device_id"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#ffbebebe" />
- </TableRow>
-</TableLayout>
-
diff --git a/res/layout-sw600dp/account_setup_incoming_fragment.xml b/res/layout-sw600dp/account_setup_incoming_fragment.xml
index 826ad2676..d9962266d 100644
--- a/res/layout-sw600dp/account_setup_incoming_fragment.xml
+++ b/res/layout-sw600dp/account_setup_incoming_fragment.xml
@@ -60,13 +60,13 @@
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginRight="16dip"
- android:text="@string/account_setup_incoming_pop_server_label" />
+ android:text="@string/account_setup_incoming_server_label" />
<!-- Note: we use inputType=textUri as the closest approximation to a server name -->
<EditText
android:id="@+id/account_server"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:contentDescription="@string/account_setup_incoming_pop_server_label"
+ android:contentDescription="@string/account_setup_incoming_server_label"
android:inputType="textUri"
android:imeOptions="actionDone" />
</TableRow>
@@ -98,6 +98,10 @@
android:inputType="number"
android:imeOptions="actionDone" />
</TableRow>
+ <include
+ android:id="@+id/client_certificate_selector"
+ layout="@layout/client_certificate_selector"
+ android:visibility="gone" />
<TableRow
android:paddingTop="16dip" >
<TextView
@@ -129,5 +133,21 @@
android:inputType="text"
android:imeOptions="actionDone" />
</TableRow>
+ <TableRow
+ android:id="@+id/device_id_section"
+ android:paddingTop="32dip"
+ android:visibility="gone" >
+ <TextView
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginRight="16dip"
+ android:text="@string/account_setup_exchange_device_id_label" />
+ <!-- TODO - when adding back in styles, this should be slightly different (was "medium") -->
+ <TextView
+ android:id="@+id/device_id"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="#ffbebebe" />
+ </TableRow>
</TableLayout>
diff --git a/res/layout-sw600dp/address_text_view.xml b/res/layout-sw600dp/address_text_view.xml
deleted file mode 100644
index c0ca115b4..000000000
--- a/res/layout-sw600dp/address_text_view.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<com.android.email.activity.AddressTextView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:inputType="textEmailAddress|textMultiLine"
- android:imeOptions="actionNext"
- style="@style/message_compose_header_field_value"/> \ No newline at end of file
diff --git a/res/layout-sw600dp/compose_area_buttons.xml b/res/layout-sw600dp/compose_area_buttons.xml
deleted file mode 100644
index 9c7ff2761..000000000
--- a/res/layout-sw600dp/compose_area_buttons.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<!-- For add attachments and +cc/bcc -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_height="match_parent"
- android:layout_width="wrap_content"
- style="@style/ComposeButtonColumn">
-
- <LinearLayout android:id="@+id/compose_buttons_spacer"
- android:layout_height="0dip"
- android:layout_width="match_parent"
- android:layout_weight="1" />
-
- <Button android:id="@+id/add_cc_bcc"
- android:text="@string/plus_cc_label"
- style="@style/ComposeButton"
- android:layout_marginLeft="16dip" />
-
- <ImageView android:id="@+id/add_attachment"
- android:text="@string/add_file_attachment"
- android:layout_width="32dip"
- android:layout_height="32dip"
- android:src="@drawable/ic_attachment_holo_light"
- android:clickable="true"
- android:layout_gravity="center_vertical|left"
- android:gravity="left"
- android:layout_marginLeft="14dip" />
-
-</LinearLayout> \ No newline at end of file
diff --git a/res/layout-sw600dp/message_compose.xml b/res/layout-sw600dp/message_compose.xml
deleted file mode 100644
index 0a6dc6781..000000000
--- a/res/layout-sw600dp/message_compose.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:fillViewport="true">
-
- <LinearLayout
- android:id="@+id/compose_scrollview"
- android:orientation="vertical"
- android:layout_width="@dimen/compose_scrollview_width"
- android:layout_height="match_parent"
- android:paddingTop="8dip"
- android:background="@android:color/white"
- android:layout_gravity="center_horizontal">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:paddingLeft="100dip">
-
- <LinearLayout android:id="@+id/content"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <!-- For the to, cc, bcc, and subject -->
- <LinearLayout android:id="@+id/wrapper"
- android:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_weight="1"
- android:layout_height="wrap_content">
-
- <include layout="@layout/compose_from"/>
-
- <include layout="@layout/compose_area_recipients"/>
-
- </LinearLayout>
-
- <include layout="@layout/compose_area_buttons"/>
-
- </LinearLayout>
-
- <!-- Attachments -->
- <LinearLayout android:id="@+id/attachment_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="8dip"
- android:orientation="vertical"
- android:visibility="gone"
- android:layout_marginRight="100dip"
- >
- <!--
- Empty container for storing attachments. We'll stick
- instances of message_compose_attachment.xml in here.
- -->
- <LinearLayout android:id="@+id/attachments"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- />
- </LinearLayout>
-
- <!-- Compose Area -->
- <FrameLayout android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginRight="100dip">
-
- <include layout="@layout/compose_body"/>
-
- </FrameLayout>
-
- <RelativeLayout android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginRight="100dip">
- <include layout="@layout/quoted_text"/>
- </RelativeLayout>
- <FrameLayout
- android:id="@+id/composearea_tap_trap_bottom"
- android:layout_weight="1"
- android:layout_height="0dip"
- android:layout_width="match_parent"
- android:clickable="true"/>
-
- </LinearLayout>
- </LinearLayout>
-</ScrollView> \ No newline at end of file
diff --git a/res/layout-sw600dp/message_view_attachment.xml b/res/layout-sw600dp/message_view_attachment.xml
deleted file mode 100644
index 77062169e..000000000
--- a/res/layout-sw600dp/message_view_attachment.xml
+++ /dev/null
@@ -1,129 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- tablet -->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="64dip"
- android:orientation="horizontal"
- android:background="@drawable/attachment_bg_holo"
- >
- <FrameLayout
- android:layout_width="64dip"
- android:layout_height="64dip"
- android:orientation="vertical"
- android:background="#e5e5e5"
- >
- <ImageView
- android:id="@+id/attachment_icon"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:src="@drawable/ic_attachment_holo_light"
- android:scaleType="center"
- />
- <ProgressBar
- android:id="@+id/progress"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="0dip"
- style="?android:attr/progressBarStyleHorizontal"
- android:max="100"
- android:visibility="invisible"
- />
- </FrameLayout>
- <LinearLayout
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:orientation="horizontal"
- android:divider="?android:attr/dividerVertical"
- android:showDividers="middle"
- android:dividerPadding="16dip"
- >
- <RelativeLayout
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:layout_gravity="center_vertical"
- android:layout_marginLeft="32dip"
- android:layout_marginRight="16dip"
- >
- <TextView
- android:id="@+id/attachment_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:textSize="18dip"
- android:textColor="#333333"
- android:singleLine="true"
- android:ellipsize="middle"
- />
- <TextView
- android:id="@+id/attachment_info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_below="@+id/attachment_name"
- android:textSize="14sp"
- android:textColor="@color/text_secondary_color"
- android:singleLine="true"
- />
- </RelativeLayout>
-
- <!-- Buttons -->
- <LinearLayout
- android:layout_width="224dip"
- android:layout_height="match_parent"
- android:layout_weight="0"
- android:orientation="horizontal"
- android:divider="?android:attr/dividerVertical"
- android:showDividers="middle"
- >
- <Button
- android:id="@+id/load"
- style="@style/Attachment.Button"
- android:text="@string/message_view_attachment_load_action"
- android:visibility="gone"
- />
- <Button
- android:id="@+id/cancel"
- style="@style/Attachment.Button"
- android:text="@string/message_view_attachment_cancel_action"
- android:visibility="gone"
- />
- <Button
- android:id="@+id/info"
- style="@style/Attachment.Button"
- android:text="@string/message_view_attachment_info_action"
- android:visibility="gone"
- />
- <Button
- android:id="@+id/open"
- style="@style/Attachment.Button"
- android:text="@string/message_view_attachment_view_action"
- android:visibility="gone"
- />
- <Button
- android:id="@+id/save"
- style="@style/Attachment.Button"
- android:text="@string/message_view_attachment_save_action"
- android:visibility="gone"
- />
- </LinearLayout>
- </LinearLayout>
-</LinearLayout>
diff --git a/res/layout-sw600dp/message_view_fragment.xml b/res/layout-sw600dp/message_view_fragment.xml
deleted file mode 100644
index e0bc2c9d4..000000000
--- a/res/layout-sw600dp/message_view_fragment.xml
+++ /dev/null
@@ -1,228 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- tablet -->
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@android:color/white"
- >
- <ProgressBar
- android:id="@+id/loading_progress"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- style="?android:attr/progressBarStyleLarge"
- />
- <com.android.email.view.NonLockingScrollView
- android:id="@+id/main_panel"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="16dip"
- android:paddingRight="16dip"
- android:orientation="vertical"
- >
-
- <!-- Subject -->
- <TextView
- android:id="@+id/subject"
- android:layout_width="match_parent"
- android:layout_height="48dip"
- android:gravity="center_vertical"
- style="@style/message_view_subject"
- />
-
- <View
- android:id="@+id/subject_divider"
- android:layout_marginBottom="16dip"
- android:layout_width="match_parent"
- style="@style/message_view_horizontal_divider"
- />
-
- <!-- Upper header. Outer container needed only since the relative layout
- params can't be passed in an include tag.-->
- <FrameLayout
- android:id="@+id/message_view_header_upper"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <include layout="@layout/message_view_header_upper" />
- </FrameLayout>
-
- <!-- Addresses, timestamp -->
- <FrameLayout
- android:id="@+id/message_view_subheader"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- >
- <include layout="@layout/message_view_subheader" />
- </FrameLayout>
-
- <View
- android:id="@+id/address_divider"
- android:layout_width="match_parent"
- style="@style/message_view_horizontal_divider"
- />
-
- <!-- The rest: tab + body + command buttons. -->
- <!-- Tabs + divider -->
- <LinearLayout
- android:id="@+id/message_tabs_section"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="40dip"
- android:layout_marginLeft="14dip"
- android:orientation="horizontal"
- >
- <Button
- android:id="@+id/show_message"
- android:layout_width="128dip"
- android:layout_height="match_parent"
- android:gravity="center"
- android:text="@string/message_view_show_message_action"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:singleLine="true"
- android:ellipsize="end"
- style="@android:style/Widget.Holo.Light.Tab"
- />
- <Button
- android:id="@+id/show_invite"
- android:layout_width="128dip"
- android:layout_height="match_parent"
- android:gravity="center"
- android:text="@string/message_view_show_invite_action"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:singleLine="true"
- android:ellipsize="end"
- style="@android:style/Widget.Holo.Light.Tab"
- />
- <Button
- android:id="@+id/show_attachments"
- android:layout_width="128dip"
- android:layout_height="match_parent"
- android:gravity="center"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:singleLine="true"
- android:ellipsize="end"
- style="@android:style/Widget.Holo.Light.Tab"
- />
- <!-- filler -->
- <View
- android:layout_width="0dip"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
- <Button
- android:id="@+id/show_pictures"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:gravity="center"
- style="?android:attr/borderlessButtonStyle"
- android:padding="0dip"
- android:text="@string/message_view_show_pictures_action"
- android:textSize="14dip"
- android:textColor="@color/text_ternary_color"
- android:drawableRight="@drawable/ic_show_images_holo_light"
- android:drawablePadding="8dip"
- />
- <Button
- android:id="@+id/always_show_pictures_button"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:gravity="center"
- style="?android:attr/borderlessButtonStyle"
- android:padding="0dip"
- android:text="@string/message_view_always_show_pictures_prompt"
- android:textSize="14dip"
- android:textColor="@color/text_ternary_color"
- android:drawableRight="@drawable/ic_show_images_holo_light"
- android:drawablePadding="8dip"
- android:visibility="gone"
- />
- <View
- android:layout_width="16dip"
- android:layout_height="0dip"
- />
- </LinearLayout>
- <View
- android:layout_width="match_parent"
- style="@style/message_view_horizontal_divider"
- />
- </LinearLayout>
-
- <!-- margin -->
- <View
- android:layout_width="0dip"
- android:layout_height="16dip"
- />
-
- <!-- content area - only one of them is visible at a time -->
- <!-- Message body -->
- <com.android.email.view.RigidWebView
- android:id="@+id/message_content"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@android:color/white"
- android:visibility="gone"
- />
-
- <!-- TODO: get rid of these useless _scroll elements now that
- they're no longer needed -->
- <!-- Invite: Even though this section is only for MessageViewFragment,
- Its visibility is controlled by MessageViewFragmentBase for simplicity.
- MessageFileViewFragment shouldn't touch this. -->
- <FrameLayout
- android:id="@+id/invite_scroll"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="gone"
- >
- <include layout="@layout/message_view_invitation" />
- </FrameLayout>
-
- <!-- Attachments -->
- <FrameLayout
- android:id="@+id/attachments_scroll"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="gone"
- >
- <LinearLayout
- android:id="@+id/attachments"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:divider="?android:attr/dividerHorizontal"
- android:showDividers="beginning|middle|end"
- />
- </FrameLayout>
- </LinearLayout>
- </com.android.email.view.NonLockingScrollView>
-</FrameLayout>
diff --git a/res/layout-sw600dp/message_view_header_actions.xml b/res/layout-sw600dp/message_view_header_actions.xml
deleted file mode 100644
index 983eac248..000000000
--- a/res/layout-sw600dp/message_view_header_actions.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <ImageButton
- android:id="@+id/reply"
- style="@style/message_view_action_buttons"
- android:src="@drawable/ic_reply_holo_dark"
- android:contentDescription="@string/reply_action"
- android:baselineAlignBottom="true"
- />
- <ImageButton
- android:id="@+id/reply_all"
- style="@style/message_view_action_buttons"
- android:src="@drawable/ic_reply_all_holo_dark"
- android:contentDescription="@string/reply_all_action"
- android:baselineAlignBottom="true"
- />
- <ImageButton
- android:id="@+id/forward"
- style="@style/message_view_action_buttons"
- android:src="@drawable/ic_forward_holo_dark"
- android:contentDescription="@string/forward_action"
- android:baselineAlignBottom="true"
- />
- <ImageButton
- android:id="@+id/favorite"
- style="@style/message_view_action_buttons"
- android:src="@drawable/btn_star_off_convo_holo_light"
- android:contentDescription="@string/favorite_action"
- android:baselineAlignBottom="true"
- />
-</merge>
-
diff --git a/res/layout-sw600dp/three_pane.xml b/res/layout-sw600dp/three_pane.xml
deleted file mode 100644
index 450844d9a..000000000
--- a/res/layout-sw600dp/three_pane.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Note the width of each pane is set by code at runtime. -->
-<com.android.email.activity.ThreePaneLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:splitMotionEvents="true"
- >
-
- <include layout="@layout/three_pane_collapsible_impl" />
-
-</com.android.email.activity.ThreePaneLayout>
-
diff --git a/res/layout-sw600dp/waiting_for_sync_message.xml b/res/layout-sw600dp/waiting_for_sync_message.xml
deleted file mode 100644
index 8c98c096d..000000000
--- a/res/layout-sw600dp/waiting_for_sync_message.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/waiting_for_sync_message"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:padding="16dip"
- >
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:textSize="32dip"
- android:text="@string/waitinf_for_sync_message_1"
- />
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:layout_marginTop="32dip"
- android:textSize="20dip"
- android:text="@string/waitinf_for_sync_message_2"
- />
- <ProgressBar
- style="?android:attr/progressBarStyleLarge"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginTop="32dip"
- />
-</LinearLayout>
diff --git a/res/layout-sw800dp-land/three_pane.xml b/res/layout-sw800dp-land/three_pane.xml
deleted file mode 100644
index ba0bb3166..000000000
--- a/res/layout-sw800dp-land/three_pane.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Note the width of each pane is set by code at runtime. -->
-<com.android.email.activity.ThreePaneLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:splitMotionEvents="true"
- >
-
- <include layout="@layout/three_pane_impl" />
-
-</com.android.email.activity.ThreePaneLayout>
-
-
diff --git a/res/layout-sw800dp-port b/res/layout-sw800dp-port
deleted file mode 100644
index f80593f2c..000000000
--- a/res/layout-sw800dp-port
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- tablet -->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/invite_section"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@color/message_view_info_back_color"
- android:orientation="vertical"
- >
- <View
- android:layout_width="match_parent"
- style="@style/message_view_horizontal_divider"
- />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="64dip"
- android:orientation="horizontal"
- >
- <!-- TODO: The plan is to show a calendar icon here. -->
- <ImageView
- android:layout_width="64dip"
- android:layout_height="64dip"
- android:layout_weight="0"
- android:src="@null"
- android:visibility="gone"
- />
- <LinearLayout
- android:layout_width="200dip"
- android:layout_weight="1"
- android:layout_height="64dip"
- android:orientation="horizontal"
- android:divider="?android:attr/dividerVertical"
- android:showDividers="middle"
- android:dividerPadding="16dip"
- >
- <RelativeLayout
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:layout_weight="1"
- >
- <CheckBox
- android:id="@+id/accept"
- android:layout_width="104dip"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="32dip"
- android:text="@string/message_view_invite_accept"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:singleLine="true"
- android:ellipsize="end"
- />
- <CheckBox
- android:id="@+id/maybe"
- android:layout_width="104dip"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_toRightOf="@id/accept"
- android:layout_marginLeft="24dip"
- android:text="@string/message_view_invite_maybe"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:singleLine="true"
- android:ellipsize="end"
- />
- <CheckBox
- android:id="@+id/decline"
- android:layout_width="104dip"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_toRightOf="@id/maybe"
- android:layout_marginLeft="24dip"
- android:text="@string/message_view_invite_decline"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:singleLine="true"
- android:ellipsize="end"
- />
-
- <!-- "Going?" -->
- <TextView
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_above="@id/accept"
- android:layout_marginLeft="32dip"
- android:layout_marginRight="32dip"
- android:singleLine="true"
- android:ellipsize="end"
- android:text="@string/message_view_invite_text"
- android:textSize="18dip"
- android:textColor="@color/text_primary_color"
- android:gravity="left|bottom"
- />
-
- </RelativeLayout>
- <Button
- android:id="@+id/invite_link"
- android:layout_width="192dip"
- android:layout_height="match_parent"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- style="@android:style/Widget.Holo.Button.Borderless"
- android:padding="0dip"
- android:text="@string/message_view_invite_view"
- android:textSize="14dip"
- android:textColor="@color/text_primary_color"
- android:textStyle="bold"
- android:singleLine="true"
- android:ellipsize="end"
- android:gravity="center"
- />
- </LinearLayout>
- </LinearLayout>
- <View
- android:layout_width="match_parent"
- style="@style/message_view_horizontal_divider"
- />
-</LinearLayout>
diff --git a/res/layout-v14/compose_area_recipients.xml b/res/layout-v14/compose_area_recipients.xml
deleted file mode 100644
index f46d44d61..000000000
--- a/res/layout-v14/compose_area_recipients.xml
+++ /dev/null
@@ -1,110 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/compose_recipients_wrapper"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <!-- To -->
-
- <LinearLayout android:id="@+id/to_content"
- style="@style/RecipientComposeFieldLayout">
- <LinearLayout android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:addStatesFromChildren="true"
- android:gravity="center_vertical"
- android:layout_gravity="center_vertical">
-
- <TextView style="@style/RecipientComposeHeading"
- android:text="@string/to"
- android:id="@+id/to_label"
- android:contentDescription="@string/to"/>
-
- <com.android.email.activity.ChipsAddressTextView
- android:id="@+id/to"
- style="@style/RecipientEditTextViewStyle"/>
-
- </LinearLayout>
-
- <View style="@style/RecipientComposeFieldSpacer"/>
- </LinearLayout>
-
-
- <RelativeLayout android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:id="@+id/cc_bcc_wrapper"
- android:layout_below="@id/to_content"
- android:visibility="gone">
-
- <LinearLayout style="@style/RecipientComposeFieldLayout"
- android:id="@+id/cc_content"
- android:layout_alignParentTop="true">
-
- <LinearLayout android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:addStatesFromChildren="true"
- android:gravity="center_vertical">
-
- <TextView
- style="@style/RecipientComposeHeading"
- android:text="@string/cc"
- android:id="@+id/cc_label"
- android:contentDescription="@string/cc"/>
-
- <com.android.email.activity.ChipsAddressTextView
- android:id="@+id/cc"
- style="@style/RecipientEditTextViewStyle"/>
- </LinearLayout>
-
- <View style="@style/RecipientComposeFieldSpacer"/>
- </LinearLayout>
-
- <LinearLayout style="@style/RecipientComposeFieldLayout"
- android:id="@+id/bcc_content"
- android:layout_below="@id/cc_content">
-
- <LinearLayout android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:addStatesFromChildren="true"
- android:gravity="center_vertical">
-
- <TextView style="@style/RecipientComposeHeading"
- android:text="@string/bcc"
- android:id="@+id/bcc_label"
- android:contentDescription="@string/bcc"/>
-
- <com.android.email.activity.ChipsAddressTextView
- android:id="@+id/bcc"
- style="@style/RecipientEditTextViewStyle"/>
-
- </LinearLayout>
-
- <View style="@style/RecipientComposeFieldSpacer"/>
- </LinearLayout>
-
- </RelativeLayout>
-
- <RelativeLayout style="@style/ComposeFieldLayout"
- android:layout_below="@id/cc_bcc_wrapper">
- <!-- Subject: localization cannot control what field pressing tab will bring the user to. This is controlled at runtime. -->
- <EditText android:id="@+id/subject"
- android:inputType="textEmailSubject|textAutoCorrect|textCapSentences|textImeMultiLine|textMultiLine"
- android:hint="@string/subject_hint"
- android:textColorHint="@color/compose_label_text"
- android:imeOptions="actionDone|flagNoExtractUi"
- style="@style/ComposeEditTextView" />
- </RelativeLayout>
-</RelativeLayout> \ No newline at end of file
diff --git a/res/layout/account_settings_exchange_fragment.xml b/res/layout/account_settings_exchange_fragment.xml
deleted file mode 100644
index b218cb3de..000000000
--- a/res/layout/account_settings_exchange_fragment.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Exchange server settings. This is a wrapper around the "exchange setup" fragment
- that adds scrollview & buttons and makes it more compatible with a 2-pane PreferenceActivity
- such as AccountSettingsXL. -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true"
- >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="@dimen/settings_fragment_padding_top"
- android:paddingLeft="@dimen/settings_fragment_padding_left"
- android:paddingRight="@dimen/settings_fragment_padding_right"
- >
-
- <!-- Fields entry -->
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <include
- layout="@layout/account_setup_exchange_fragment"
- />
- </FrameLayout>
-
- <!-- This spacer fills the viewport and moves the buttons to the bottom -->
- <View
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1" />
-
- <include layout="@layout/account_settings_buttons" />
- </LinearLayout>
-</ScrollView> \ No newline at end of file
diff --git a/res/layout/account_setup_account_type.xml b/res/layout/account_setup_account_type.xml
index 3e6ff5338..c6ff9725a 100644
--- a/res/layout/account_setup_account_type.xml
+++ b/res/layout/account_setup_account_type.xml
@@ -17,6 +17,7 @@
<!-- small -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/accountTypes"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
@@ -31,32 +32,4 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorPrimary"
/>
- <Button
- android:id="@+id/pop"
- android:text="@string/account_setup_account_type_pop_action"
- android:layout_height="wrap_content"
- android:layout_width="150sp"
- android:layout_marginTop="25dip"
- android:minWidth="@dimen/button_minWidth"
- android:layout_gravity="center_horizontal"
- />
- <Button
- android:id="@+id/imap"
- android:text="@string/account_setup_account_type_imap_action"
- android:layout_height="wrap_content"
- android:layout_width="150sp"
- android:layout_marginTop="25dip"
- android:minWidth="@dimen/button_minWidth"
- android:layout_gravity="center_horizontal"
- />
- <Button
- android:id="@+id/exchange"
- android:text="@string/account_setup_account_type_exchange_action"
- android:layout_height="wrap_content"
- android:layout_width="150sp"
- android:layout_marginTop="25dip"
- android:minWidth="@dimen/button_minWidth"
- android:layout_gravity="center_horizontal"
- android:visibility="gone"
- />
</LinearLayout>
diff --git a/res/layout/account_setup_exchange.xml b/res/layout/account_setup_exchange.xml
deleted file mode 100644
index 78549da24..000000000
--- a/res/layout/account_setup_exchange.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<ScrollView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="@dimen/setup_fragment_padding_top"
- android:paddingLeft="@dimen/setup_fragment_padding_left"
- android:paddingRight="@dimen/setup_fragment_padding_right" >
-
- <fragment
- android:id="@+id/setup_fragment"
- class="com.android.email.activity.setup.AccountSetupExchangeFragment"
- android:layout_alignParentTop="true"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
-
- <include layout="@layout/account_setup_buttons" />
-
- </LinearLayout>
-</ScrollView>
diff --git a/res/layout/account_setup_exchange_fragment.xml b/res/layout/account_setup_exchange_fragment.xml
deleted file mode 100644
index e792c561f..000000000
--- a/res/layout/account_setup_exchange_fragment.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Exchange server settings - default - see layout-xlarge/ for XL variant -->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:orientation="vertical" >
- <TextView
- android:text="@string/account_setup_exchange_username_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <EditText
- android:id="@+id/account_username"
- android:inputType="textEmailAddress"
- android:imeOptions="actionNext"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_exchange_username_label" />
- <TextView
- android:text="@string/account_setup_incoming_password_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <EditText
- android:id="@+id/account_password"
- android:inputType="textPassword"
- android:imeOptions="actionNext"
- android:layout_height="wrap_content"
- android:layout_width="match_parent" />
- <!-- This text may be changed in code if the server is IMAP, etc. -->
- <TextView
- android:text="@string/account_setup_exchange_server_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
- <!-- Note: we use inputType=textUri as the closest approximation to a server name -->
- <EditText
- android:id="@+id/account_server"
- android:inputType="textUri"
- android:imeOptions="actionDone"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_exchange_server_label" />
- <CheckBox
- android:id="@+id/account_ssl"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_exchange_ssl_label" />
- <CheckBox
- android:id="@+id/account_trust_certificates"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/account_setup_exchange_trust_certificates_label" />
- <include
- android:id="@+id/client_certificate_selector"
- layout="@layout/client_certificate_selector"
- android:visibility="gone" />
- <TextView
- android:text="@string/account_setup_exchange_device_id_label"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textColor="?android:attr/textColorPrimary" />
- <TextView
- android:id="@+id/device_id"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="#ffbebebe" />
-</LinearLayout>
diff --git a/res/layout/account_setup_incoming_fragment.xml b/res/layout/account_setup_incoming_fragment.xml
index 625e1fc8b..b5e5b48df 100644
--- a/res/layout/account_setup_incoming_fragment.xml
+++ b/res/layout/account_setup_incoming_fragment.xml
@@ -49,7 +49,7 @@
<!-- This text may be changed in code if the server is IMAP, etc. -->
<TextView
android:id="@+id/account_server_label"
- android:text="@string/account_setup_incoming_pop_server_label"
+ android:text="@string/account_setup_incoming_server_label"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:textAppearance="?android:attr/textAppearanceSmall"
@@ -60,7 +60,7 @@
android:id="@+id/account_server"
android:layout_height="wrap_content"
android:layout_width="match_parent"
- android:contentDescription="@string/account_setup_incoming_pop_server_label"
+ android:contentDescription="@string/account_setup_incoming_server_label"
android:inputType="textUri"
android:imeOptions="actionNext" />
<TextView
@@ -87,6 +87,10 @@
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:contentDescription="@string/account_setup_incoming_security_label" />
+ <include
+ android:id="@+id/client_certificate_selector"
+ layout="@layout/client_certificate_selector"
+ android:visibility="gone" />
<TextView
android:id="@+id/account_delete_policy_label"
android:text="@string/account_setup_incoming_delete_policy_label"
@@ -119,4 +123,22 @@
android:inputType="text"
android:imeOptions="actionDone" />
</LinearLayout>
+ <LinearLayout
+ android:id="@+id/device_id_section"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:visibility="gone">
+ <TextView
+ android:text="@string/account_setup_exchange_device_id_label"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:textColor="?android:attr/textColorPrimary" />
+ <TextView
+ android:id="@+id/device_id"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textColor="#ffbebebe" />
+ </LinearLayout>
</LinearLayout>
diff --git a/res/layout/action_bar_custom_view.xml b/res/layout/action_bar_custom_view.xml
deleted file mode 100644
index 423b546bd..000000000
--- a/res/layout/action_bar_custom_view.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!--
- Custom view set to the action bar.
-
- layout_width/height are set at runtime using ActionBar.setCustomView()
--->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/action_bar_custom_view"
- >
- <include
- android:id="@+id/account_spinner_container"
- layout="@layout/action_bar_spinner"
- android:visibility="gone"
- />
-</FrameLayout>
diff --git a/res/layout/action_bar_indeterminate_progress.xml b/res/layout/action_bar_indeterminate_progress.xml
deleted file mode 100644
index 87c7ecf1d..000000000
--- a/res/layout/action_bar_indeterminate_progress.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="64dip"
- android:layout_height="wrap_content"
- android:gravity="center"
- >
- <!-- 32dip = size of the refresh button -->
- <ProgressBar
- android:layout_width="32dip"
- android:layout_height="32dip"
- android:layout_gravity="center"
- style="?android:attr/indeterminateProgressStyle"
- />
-</FrameLayout>
diff --git a/res/layout/action_bar_search.xml b/res/layout/action_bar_search.xml
deleted file mode 100644
index e2cd96032..000000000
--- a/res/layout/action_bar_search.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<SearchView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/search_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="center_vertical"
- android:iconifiedByDefault="true"
- />
diff --git a/res/layout/action_bar_spinner.xml b/res/layout/action_bar_spinner.xml
deleted file mode 100644
index 35b83198e..000000000
--- a/res/layout/action_bar_spinner.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/AccountSwitchSpinnerItem"
- android:layout_height="match_parent"
- android:paddingLeft="0dip"
- android:layout_marginLeft="0dip">
-
- <TextView
- android:id="@+id/spinner_count"
- android:layout_alignParentRight="true"
- android:layout_marginLeft="4dp"
- style="@style/unreadCountActionBar" />
-
- <!-- This spacer is here just to soak up horizontal space. -->
- <!-- If this is omitted, the spinner triangle is too far from the text. -->
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_alignParentLeft="true"
- android:layout_toLeftOf="@id/spinner_count">
-
- <LinearLayout
- android:id="@+id/account_spinner"
- style="?android:attr/actionDropDownStyle"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:gravity="center_vertical">
- <TextView
- android:id="@+id/spinner_line_1"
- style="@style/action_bar_spinner_primary_text"
- android:singleLine="true"
- android:ellipsize="end"
- android:includeFontPadding="false"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:id="@+id/spinner_line_2"
- style="@android:style/TextAppearance.Holo.Widget.ActionBar.Subtitle"
- android:singleLine="true"
- android:ellipsize="end"
- android:includeFontPadding="false"
- android:layout_marginRight="4dp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </LinearLayout>
-
- </FrameLayout>
-
-</RelativeLayout> \ No newline at end of file
diff --git a/res/layout/action_bar_spinner_dropdown.xml b/res/layout/action_bar_spinner_dropdown.xml
deleted file mode 100644
index d39d1f164..000000000
--- a/res/layout/action_bar_spinner_dropdown.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!--
- The list items for the account spinner drop down.
- Popup width is set at runtime from @dimen/account_dropdown_dropdownwidth
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- style="?android:attr/spinnerDropDownItemStyle"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:gravity="center_vertical">
-
- <RelativeLayout
- android:layout_height="wrap_content"
- android:layout_width="0dip"
- android:layout_weight="1">
- <TextView
- android:id="@+id/display_name"
- android:singleLine="true"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:ellipsize="end"
- style="@android:style/TextAppearance.Holo.Widget.ActionBar.Title"/>
-
- <TextView
- android:id="@+id/email_address"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:ellipsize="end"
- android:layout_below="@id/display_name"
- android:layout_alignWithParentIfMissing="true"
- android:layout_centerVertical="true"
- style="@android:style/TextAppearance.Holo.Widget.ActionBar.Subtitle"/>
-
- </RelativeLayout>
- <RelativeLayout
- android:layout_height="wrap_content"
- android:layout_width="wrap_content">
- <View
- android:id="@+id/color_chip"
- android:layout_width="32dip"
- android:layout_height="6dip"
- android:layout_marginBottom="2dip"
- android:layout_alignParentTop="true"
- android:layout_marginLeft="8dip"
- android:background="@android:color/black"
- />
- <TextView
- android:id="@+id/unread_count"
- style="@style/unreadCount"
- android:layout_centerVertical="true" />
- </RelativeLayout>
-
-</LinearLayout>
-
diff --git a/res/layout/action_bar_spinner_dropdown_header.xml b/res/layout/action_bar_spinner_dropdown_header.xml
deleted file mode 100644
index 2f4aad9d7..000000000
--- a/res/layout/action_bar_spinner_dropdown_header.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/display_name"
- android:ellipsize="end"
- style="?android:attr/listSeparatorTextViewStyle" />
diff --git a/res/layout/compose_area_recipients.xml b/res/layout/compose_area_recipients.xml
deleted file mode 100644
index bac5e3864..000000000
--- a/res/layout/compose_area_recipients.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<!-- We must have unique ID's for the address fields in order to have the text
-automatically saved by framework.-->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/compose_recipients_wrapper"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <!-- To -->
-
- <LinearLayout android:id="@+id/to_content"
- style="@style/RecipientComposeFieldLayout">
- <LinearLayout android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:addStatesFromChildren="true"
- android:gravity="center_vertical"
- android:layout_gravity="center_vertical">
-
- <TextView style="@style/RecipientComposeHeading"
- android:text="@string/to"
- android:id="@+id/to_label"
- android:contentDescription="@string/to"/>
-
- <com.android.email.activity.AddressTextView
- android:id="@+id/to"
- style="@style/RecipientEditTextViewStyle"/>
-
- </LinearLayout>
-
- <View style="@style/RecipientComposeFieldSpacer"/>
- </LinearLayout>
-
-
- <RelativeLayout android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:id="@+id/cc_bcc_wrapper"
- android:layout_below="@id/to_content"
- android:visibility="gone">
-
- <LinearLayout style="@style/RecipientComposeFieldLayout"
- android:id="@+id/cc_content"
- android:layout_alignParentTop="true">
-
- <LinearLayout android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:addStatesFromChildren="true"
- android:gravity="center_vertical">
-
- <TextView
- style="@style/RecipientComposeHeading"
- android:text="@string/cc"
- android:id="@+id/cc_label"
- android:contentDescription="@string/cc"/>
-
- <com.android.email.activity.AddressTextView
- android:id="@+id/cc"
- style="@style/RecipientEditTextViewStyle"/>
- </LinearLayout>
-
- <View style="@style/RecipientComposeFieldSpacer"/>
- </LinearLayout>
-
- <LinearLayout style="@style/RecipientComposeFieldLayout"
- android:id="@+id/bcc_content"
- android:layout_below="@id/cc_content">
-
- <LinearLayout android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:addStatesFromChildren="true"
- android:gravity="center_vertical">
-
- <TextView style="@style/RecipientComposeHeading"
- android:text="@string/bcc"
- android:id="@+id/bcc_label"
- android:contentDescription="@string/bcc"/>
-
- <com.android.email.activity.AddressTextView
- android:id="@+id/bcc"
- style="@style/RecipientEditTextViewStyle"/>
-
- </LinearLayout>
-
- <View style="@style/RecipientComposeFieldSpacer"/>
- </LinearLayout>
-
- </RelativeLayout>
-
- <RelativeLayout style="@style/ComposeFieldLayout"
- android:layout_below="@id/cc_bcc_wrapper">
- <!-- Subject: localization cannot control what field pressing tab will bring the user to. This is controlled at runtime. -->
- <EditText android:id="@+id/subject"
- android:inputType="textEmailSubject|textAutoCorrect|textCapSentences|textImeMultiLine|textMultiLine"
- android:hint="@string/subject_hint"
- android:textColorHint="@color/compose_label_text"
- android:imeOptions="actionDone|flagNoExtractUi"
- style="@style/ComposeEditTextView" />
- </RelativeLayout>
-</RelativeLayout> \ No newline at end of file
diff --git a/res/layout/compose_body.xml b/res/layout/compose_body.xml
deleted file mode 100644
index 119cac74d..000000000
--- a/res/layout/compose_body.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/ComposeFieldLayout">
-
- <EditText android:id="@+id/body_text"
- style="@style/ComposeBodyStyle"
- android:hint="@string/body_hint"/>
-
-</RelativeLayout> \ No newline at end of file
diff --git a/res/layout/compose_from.xml b/res/layout/compose_from.xml
deleted file mode 100644
index 6c02ec3bc..000000000
--- a/res/layout/compose_from.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/ComposeFieldLayout"
- android:layout_height="48dip"
- android:layout_marginTop="4dip">
-
- <TextView android:id="@+id/from"
- android:layout_width="match_parent"
- android:singleLine="true"
- android:ellipsize="end"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:background="@android:color/transparent"
- android:layout_height="match_parent"
- android:layout_gravity="center_vertical"
- android:gravity="center_vertical" />
-
-</LinearLayout>
diff --git a/res/layout/debug.xml b/res/layout/debug.xml
index 6312ae2c0..de315553f 100644
--- a/res/layout/debug.xml
+++ b/res/layout/debug.xml
@@ -19,32 +19,24 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
- <TextView
- android:id="@+id/version"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/debug_version_fmt"
- />
<CheckBox
android:id="@+id/debug_logging"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/debug_enable_debug_logging_label"
/>
-<!-- EXCHANGE-REMOVE-SECTION-START -->
<CheckBox
- android:id="@+id/exchange_logging"
+ android:id="@+id/verbose_logging"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/debug_enable_exchange_logging_label"
+ android:text="@string/debug_enable_verbose_logging_label"
/>
<CheckBox
- android:id="@+id/exchange_file_logging"
+ android:id="@+id/file_logging"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/debug_enable_exchange_file_logging_label"
+ android:text="@string/debug_enable_file_logging_label"
/>
-<!-- EXCHANGE-REMOVE-SECTION-END -->
<Button
android:id="@+id/clear_webview_cache"
android:layout_width="wrap_content"
diff --git a/res/layout/email_activity_one_pane.xml b/res/layout/email_activity_one_pane.xml
deleted file mode 100644
index 7dc8cfe92..000000000
--- a/res/layout/email_activity_one_pane.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- >
-
- <!-- Error message goes over the normal view -->
- <TextView
- android:id="@+id/error_message"
- android:layout_width="match_parent"
- android:layout_height="@dimen/error_message_height"
- android:paddingLeft="8dip"
- android:paddingRight="8dip"
- android:gravity="left|center_vertical"
- android:singleLine="true"
- android:ellipsize="end"
- android:background="@color/error_bar_background"
- />
- <FrameLayout
- android:id="@+id/fragment_placeholder"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
-</LinearLayout>
diff --git a/res/layout/email_activity_two_pane.xml b/res/layout/email_activity_two_pane.xml
deleted file mode 100644
index 10735b6a2..000000000
--- a/res/layout/email_activity_two_pane.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- >
-
- <!-- Error message goes over the normal view -->
- <TextView
- android:id="@+id/error_message"
- android:layout_width="match_parent"
- android:layout_height="@dimen/error_message_height"
- android:paddingLeft="78dip"
- android:paddingRight="78dip"
- android:gravity="left|center_vertical"
- android:textSize="16dip"
- android:textColor="#000"
- android:singleLine="true"
- android:ellipsize="end"
- android:background="@color/error_bar_background"
- />
-
- <include
- android:id="@+id/three_pane"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- layout="@layout/three_pane"
- />
-</LinearLayout>
diff --git a/res/layout/mailbox_list_fragment.xml b/res/layout/mailbox_list_fragment.xml
deleted file mode 100644
index fd9219db7..000000000
--- a/res/layout/mailbox_list_fragment.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Wrap list_content in a frame layout to apply the top margin. -->
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
- <include layout="@android:layout/list_content" />
-</FrameLayout> \ No newline at end of file
diff --git a/res/layout/mailbox_list_header.xml b/res/layout/mailbox_list_header.xml
deleted file mode 100644
index 4bef0c5e6..000000000
--- a/res/layout/mailbox_list_header.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/display_name"
- android:layout_width="match_parent"
- android:ellipsize="end"
- style="?android:attr/listSeparatorTextViewStyle"
- android:layout_marginLeft="@dimen/mailbox_list_padding_left" />
diff --git a/res/layout/mailbox_list_item.xml b/res/layout/mailbox_list_item.xml
deleted file mode 100644
index d1c45b6a4..000000000
--- a/res/layout/mailbox_list_item.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- extends RelativeLayout -->
-<!--
- NOTE: Don't set padding for this.
- Background of this view will be changed by code for D&D, which resets padding.
--->
-<com.android.email.activity.MailboxListItem
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="48dip"
- android:background="?android:attr/activatedBackgroundIndicator"
- >
- <TextView
- android:id="@+id/message_count"
- android:layout_alignParentRight="true"
- android:layout_marginRight="@dimen/mailbox_list_padding_right"
- style="@style/unreadCount"
- />
- <RelativeLayout
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="@dimen/mailbox_list_padding_left"
- android:layout_toLeftOf="@id/message_count"
- >
- <ImageView
- android:id="@+id/folder_icon"
- android:layout_width="32dip"
- android:layout_height="32dip"
- android:layout_centerVertical="true"
- android:layout_marginRight="8dip"
- />
- <TextView
- android:id="@+id/mailbox_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/folder_icon"
- android:layout_centerVertical="true"
- android:ellipsize="end"
- android:singleLine="true"
- android:textSize="18dip"
- android:textColor="@color/text_color_primary_invertible"
- />
- </RelativeLayout>
- <!-- Color chips are shown only for account rows on combined view. -->
- <View
- android:id="@+id/color_chip"
- android:layout_width="32dip"
- android:layout_height="8dip"
- android:layout_marginLeft="@dimen/mailbox_list_padding_left"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:visibility="gone"
- />
- <ImageView
- android:id="@+id/folder_expanded_icon"
- android:layout_width="16dip"
- android:layout_height="16dip"
- android:layout_alignParentBottom="true"
- android:layout_alignParentRight="true"
- android:visibility="gone"
- />
-</com.android.email.activity.MailboxListItem>
diff --git a/res/layout/message_command_button_view.xml b/res/layout/message_command_button_view.xml
deleted file mode 100644
index b58142ee2..000000000
--- a/res/layout/message_command_button_view.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- extends LinearLayout -->
-<com.android.email.activity.MessageCommandButtonView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="64dip"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- android:paddingLeft="16dip"
- android:paddingRight="16dip"
- android:background="#fff"
- >
- <Button
- android:id="@+id/move_to_newer_button"
- android:text="@string/message_view_move_to_newer"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:minWidth="128dip"
- />
- <!-- Filler -->
- <View
- android:layout_height="0dip"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:visibility="invisible"
- />
- <TextView
- android:id="@+id/message_position"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:gravity="center"
- android:textSize="14dip"
- android:textColor="@color/text_secondary_color"
- android:singleLine="true"
- />
- <!-- Filler -->
- <View
- android:layout_height="0dip"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:visibility="invisible"
- />
- <Button
- android:id="@+id/move_to_older_button"
- android:text="@string/message_view_move_to_older"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:minWidth="128dip"
- />
-</com.android.email.activity.MessageCommandButtonView>
diff --git a/res/layout/message_compose.xml b/res/layout/message_compose.xml
deleted file mode 100644
index e2c035e7c..000000000
--- a/res/layout/message_compose.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- small -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="match_parent" android:layout_width="match_parent"
- android:orientation="vertical">
- <ScrollView android:layout_width="match_parent"
- android:layout_height="0dip" android:layout_weight="1"
- android:fillViewport="true"
- android:paddingLeft="16dip"
- android:paddingRight="16dip">
- <LinearLayout android:orientation="vertical"
- android:layout_width="match_parent" android:layout_height="wrap_content">
- <LinearLayout android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <!-- Not actually editable -->
- <include layout="@layout/compose_from"/>
-
- <include layout="@layout/compose_area_recipients"/>
-
- <!--
- Empty container for storing attachments. We'll stick
- instances of message_compose_attachment.xml in here.
- -->
- <LinearLayout android:id="@+id/attachments"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" />
- <!-- Dummy view to keep it compatible with the xlarge counterpart -->
- <View
- android:id="@+id/attachment_container"
- android:layout_width="0dip"
- android:layout_height="0dip"
- android:visibility="gone"
- />
- </LinearLayout>
- <include layout="@layout/compose_body"/>
- <!-- quoted text bar -->
- <include layout="@layout/quoted_text"/>
- </LinearLayout>
- </ScrollView>
-</LinearLayout>
diff --git a/res/layout/message_file_view.xml b/res/layout/message_file_view.xml
deleted file mode 100644
index 790f09a97..000000000
--- a/res/layout/message_file_view.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@android:color/white"
- >
- <fragment
- android:id="@+id/message_file_view_fragment"
- class="com.android.email.activity.MessageFileViewFragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- />
-</FrameLayout>
diff --git a/res/layout/message_list_fragment.xml b/res/layout/message_list_fragment.xml
deleted file mode 100644
index 97363abc9..000000000
--- a/res/layout/message_list_fragment.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!--
- The default ListFragment layout (include) + the "send outgoing message" button.
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
-
- <!-- Search header is dynamically inserted here for search results -->
-
- <include
- layout="@android:layout/list_content"
- android:id="@+id/list_panel"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
-
- <!-- Message list error overlays are dynamically inserted here -->
-
-</LinearLayout>
diff --git a/res/layout/message_list_item_footer.xml b/res/layout/message_list_item_footer.xml
deleted file mode 100644
index a4ecb8d11..000000000
--- a/res/layout/message_list_item_footer.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:gravity="center"
- android:orientation="horizontal">
- <ProgressBar
- android:id="@+id/progress"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- style="?android:attr/progressBarStyleSmall"
- android:paddingRight="10dip"
- android:visibility="gone"
- />
- <TextView
- android:id="@+id/main_text"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?android:attr/textColorPrimary"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- />
-</LinearLayout>
diff --git a/res/layout/message_list_item_normal.xml b/res/layout/message_list_item_normal.xml
deleted file mode 100644
index 188c080f6..000000000
--- a/res/layout/message_list_item_normal.xml
+++ /dev/null
@@ -1,125 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- This layout is used as a template to create a custom message item view
- in normal mode. To be able to get the correct measurements, every source field should
- be populated with data here. E.g:
- - Text View should set text to a random long string (android:text="@string/long_string")
- - Image View should set source to a specific asset -->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/message_list_item_normal"
- android:layout_width="match_parent"
- android:layout_height="@dimen/message_list_item_height_normal"
- android:orientation="horizontal">
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:paddingLeft="8dip"
- android:paddingRight="8dip"
- >
- <ImageView
- android:id="@+id/reply_state"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/replystate_margin_top"
- android:layout_marginLeft="@dimen/replystate_margin_left"
- android:layout_alignParentTop="true"
- android:src="@drawable/ic_badge_reply_holo_light"
- />
- <ImageView
- android:id="@+id/checkmark"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:src="@drawable/btn_check_on_normal_holo_light"
- android:layout_marginTop="@dimen/checkmark_margin_top"
- android:layout_below="@id/reply_state"
- />
- </RelativeLayout>
-
- <!-- No top padding, since the color chips have no padding -
- individual children should set their own top margins -->
- <RelativeLayout
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:orientation="vertical"
- android:paddingRight="16dip"
- >
- <View
- android:id="@+id/color_chip"
- android:layout_width="@dimen/message_list_item_color_tip_width"
- android:layout_height="@dimen/message_list_item_color_tip_height"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- />
- <ImageView
- android:id="@+id/star"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/star_margin_top"
- android:src="@drawable/btn_star_off_normal_email_holo_light" />
-
- <LinearLayout
- android:id="@+id/date_container"
- android:layout_width="80dip"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_marginTop="@dimen/date_margin_top"
- android:orientation="horizontal"
- >
- <!-- reserve enough vertical space for two icons -->
- <ImageView
- android:id="@+id/paperclip"
- android:layout_width="36dip"
- android:layout_height="16dip"
- android:layout_gravity="top"
- android:src="@drawable/ic_badge_attachment" />
- <TextView
- android:id="@+id/date"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="@dimen/date_font_size"
- android:text="@string/long_string"
- android:lines="1" />
- </LinearLayout>
-
- <TextView
- android:id="@+id/senders"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_toLeftOf="@+id/date_container"
- android:layout_marginTop="8dip"
- android:text="@string/long_string"
- android:textSize="@dimen/senders_font_size"
- android:lines="1" />
- <TextView
- android:id="@+id/subject"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_alignParentBottom="true"
- android:layout_toLeftOf="@+id/star"
- android:layout_marginBottom="8dip"
- android:text="@string/long_string"
- android:textSize="@dimen/subject_font_size"
- android:lines="2" />
- </RelativeLayout>
-</LinearLayout>
diff --git a/res/layout/message_list_item_wide.xml b/res/layout/message_list_item_wide.xml
deleted file mode 100644
index 01c06d7ee..000000000
--- a/res/layout/message_list_item_wide.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-
-<!-- This layout is used as a template to create custom message list item view
- in wide mode. To be able to get the correct measurements, every source field should
- be populated with data here. E.g:
- - Text View should set text to a random long string (android:text="@string/long_string")
- - Image View should set source to a specific asset -->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/message_list_item_wide"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal">
- <ImageView
- android:id="@+id/checkmark"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:layout_gravity="center_vertical"
- android:src="@drawable/btn_check_on_normal_holo_light" />
- <TextView
- android:id="@+id/senders"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="0.3"
- android:layout_gravity="center_vertical"
- android:text="@string/long_string"
- android:textSize="@dimen/wide_senders_font_size"
- android:lines="1" />
- <ImageView
- android:id="@+id/reply_state"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:layout_gravity="center_vertical"
- android:src="@drawable/ic_badge_reply_holo_light" />
- <TextView
- android:id="@+id/subject"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="0.7"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:layout_gravity="center_vertical"
- android:text="@string/long_string"
- android:textSize="@dimen/wide_subject_font_size"
- android:lines="2" />
- <RelativeLayout
- android:layout_width="144dip"
- android:layout_height="match_parent">
- <View
- android:id="@+id/color_chip"
- android:layout_width="@dimen/message_list_item_color_tip_width"
- android:layout_height="@dimen/message_list_item_color_tip_height"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- android:paddingTop="2dip" />
-
- <ImageView
- android:id="@+id/paperclip"
- android:layout_width="36dip"
- android:layout_height="16dip"
- android:layout_centerVertical="true"
- android:layout_marginRight="4dip"
- android:src="@drawable/ic_attachment_holo_light" />
-
- <TextView
- android:id="@+id/date"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:layout_alignParentRight="true"
- android:text="@string/long_string"
- android:lines="1" />
-
- </RelativeLayout>
- <ImageView
- android:id="@+id/star"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:layout_gravity="center_vertical"
- android:src="@drawable/btn_star_off_normal_email_holo_light" />
-</LinearLayout>
diff --git a/res/layout/message_list_search_header.xml b/res/layout/message_list_search_header.xml
deleted file mode 100644
index e1b398a47..000000000
--- a/res/layout/message_list_search_header.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/search_header"
- style="@style/search_header"
- android:gravity="center_vertical"
- android:background="#666"
- android:visibility="gone"
- >
- <TextView
- android:id="@+id/search_count"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:textColor="@android:color/white"
- />
- <TextView
- android:id="@+id/search_header_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:textColor="@android:color/white"
- />
-</RelativeLayout>
diff --git a/res/layout/message_list_warning.xml b/res/layout/message_list_warning.xml
deleted file mode 100644
index 80b865d7b..000000000
--- a/res/layout/message_list_warning.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!--
- The default ListFragment layout (include) + the "send outgoing message" button.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- android:orientation="vertical"
- android:gravity="center"
- >
-
- <ProgressBar style="?android:attr/progressBarStyleLarge"
- android:id="@+id/spinner"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
-
- <TextView
- android:id="@+id/message_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:layout_marginTop="4dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- />
-
- <TextView
- android:id="@+id/message_warning"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="32dip"
- android:layout_marginRight="32dip"
- android:layout_marginTop="4dip"
- android:textAppearance="?android:attr/textAppearanceSmall"
- />
-
-</LinearLayout>
diff --git a/res/layout/message_view_attachment.xml b/res/layout/message_view_attachment.xml
deleted file mode 100644
index eeb159252..000000000
--- a/res/layout/message_view_attachment.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- phone -->
-<!--
- TODO Remove the default visibility and always set them from code.
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:divider="?android:attr/dividerHorizontal"
- android:showDividers="middle"
- android:background="@drawable/attachment_bg_holo"
- >
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- >
- <FrameLayout
- android:id="@+id/attachment_container"
- android:layout_width="48dip"
- android:layout_height="48dip"
- android:background="#e5e5e5"
- >
- <ImageView
- android:id="@+id/attachment_icon"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:src="@drawable/ic_attachment_holo_light"
- android:scaleType="center"
- />
- <ProgressBar
- android:id="@+id/progress"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="0dip"
- style="?android:attr/progressBarStyleHorizontal"
- android:max="100"
- android:visibility="invisible"
- />
- </FrameLayout>
- <TextView
- android:id="@+id/attachment_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@+id/attachment_container"
- android:layout_marginLeft="16dip"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="#333333"
- android:singleLine="true"
- android:ellipsize="middle"
- />
- <TextView
- android:id="@+id/attachment_info"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_toRightOf="@+id/attachment_container"
- android:layout_below="@+id/attachment_name"
- android:layout_marginLeft="16dip"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="@color/text_secondary_color"
- android:singleLine="true"
- android:ellipsize="middle"
- />
- </RelativeLayout>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:divider="?android:attr/dividerVertical"
- android:showDividers="middle"
- android:dividerPadding="8dip"
- >
- <Button
- android:id="@+id/load"
- style="@style/Attachment.Button"
- android:text="@string/message_view_attachment_load_action"
- android:visibility="gone"
- />
- <Button
- android:id="@+id/cancel"
- style="@style/Attachment.Button"
- android:text="@string/message_view_attachment_cancel_action"
- android:visibility="gone"
- />
- <Button
- android:id="@+id/info"
- style="@style/Attachment.Button"
- android:text="@string/message_view_attachment_info_action"
- android:visibility="gone"
- />
- <Button
- android:id="@+id/save"
- style="@style/Attachment.Button"
- android:text="@string/message_view_attachment_save_action"
- android:visibility="gone"
- />
- <Button
- android:id="@+id/open"
- style="@style/Attachment.Button"
- android:text="@string/message_view_attachment_view_action"
- android:visibility="gone"
- />
- </LinearLayout>
-</LinearLayout>
diff --git a/res/layout/message_view_details.xml b/res/layout/message_view_details.xml
deleted file mode 100644
index ece3c6b4e..000000000
--- a/res/layout/message_view_details.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<TableLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_toLeftOf="@+id/show_details"
- android:paddingTop="14dp"
- android:paddingBottom="7dp"
- android:orientation="vertical"
- android:stretchColumns="2"
- android:shrinkColumns="2"
- >
- <TableRow
- android:id="@+id/date_row"
- >
- <TextView
- android:layout_column="1"
- android:text="@string/message_view_date_label"
- style="@style/message_details_label"
- />
-
- <!-- Put in some margin on the right to accomodate for the "hide
- details" icon -->
- <TextView
- android:id="@+id/date"
- style="@style/message_details_value"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginRight="32dip"
- />
- </TableRow>
- <TableRow
- android:id="@+id/to_row"
- >
- <TextView
- android:layout_column="1"
- android:text="@string/message_view_to_label"
- style="@style/message_details_label"
- />
- <TextView
- android:id="@+id/to"
- android:autoLink="email"
- style="@style/message_details_value_selectable"
- />
- </TableRow>
- <TableRow
- android:id="@+id/cc_row"
- >
- <TextView
- android:layout_column="1"
- android:text="@string/message_view_cc_label"
- style="@style/message_details_label"
- />
- <TextView
- android:id="@+id/cc"
- android:autoLink="email"
- style="@style/message_details_value_selectable"
- />
- </TableRow>
- <TableRow
- android:id="@+id/bcc_row"
- >
- <TextView
- android:layout_column="1"
- android:text="@string/message_view_bcc_label"
- style="@style/message_details_label"
- />
- <TextView
- android:id="@+id/bcc"
- android:autoLink="email"
- style="@style/message_details_value_selectable"
- />
- </TableRow>
-</TableLayout>
diff --git a/res/layout/message_view_fragment.xml b/res/layout/message_view_fragment.xml
deleted file mode 100644
index 966bf5602..000000000
--- a/res/layout/message_view_fragment.xml
+++ /dev/null
@@ -1,198 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- small -->
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@android:color/white"
- >
- <ProgressBar
- android:id="@+id/loading_progress"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- style="?android:attr/progressBarStyleLarge"
- />
- <com.android.email.view.NonLockingScrollView
- android:id="@+id/main_panel"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
- <TextView
- android:id="@+id/subject"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="8dip"
- android:layout_marginBottom="4dip"
- android:layout_marginLeft="8dip"
- android:layout_marginRight="8dip"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorSecondary"
- android:textStyle="bold"
- />
- <!-- Upper header area. -->
- <include layout="@layout/message_view_header_upper" />
-
- <!-- Addresses, timestamp, "show details" -->
- <FrameLayout
- android:id="@+id/message_view_subheader"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- >
- <include layout="@layout/message_view_subheader" />
- </FrameLayout>
-
- <!-- divider -->
- <View
- android:layout_width="match_parent"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- style="@style/message_view_horizontal_divider"
- />
-
- <LinearLayout
- android:id="@+id/message_tabs_section"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:orientation="vertical"
- >
- <Button
- android:id="@+id/show_pictures"
- style="?android:attr/borderlessButtonStyle"
- android:layout_width="wrap_content"
- android:layout_height="48dip"
- android:drawableLeft="@drawable/ic_show_images_holo_light"
- android:drawablePadding="8dip"
- android:text="@string/message_view_show_pictures_action"
- android:textAppearance="?android:attr/textAppearanceSmall"
- />
-
- <Button
- android:id="@+id/always_show_pictures_button"
- style="?android:attr/borderlessButtonStyle"
- android:layout_width="wrap_content"
- android:layout_height="48dip"
- android:drawableLeft="@drawable/ic_show_images_holo_light"
- android:drawablePadding="8dip"
- android:text="@string/message_view_always_show_pictures_prompt"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:visibility="gone" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- >
- <Button
- android:id="@+id/show_message"
- android:text="@string/message_view_show_message_action"
- android:layout_width="wrap_content"
- style="@style/message_view_tab"
- />
- <!--
- Even though the "invite" section is only for MessageViewFragment, it's managed
- by MessageViewFragmentBase for simplicity.
- -->
- <Button
- android:id="@+id/show_invite"
- android:text="@string/message_view_show_invite_action"
- android:layout_width="wrap_content"
- style="@style/message_view_tab"
- />
- <Button
- android:id="@+id/show_attachments"
- android:layout_width="wrap_content"
- style="@style/message_view_tab"
- />
- <View
- android:layout_width="0dip"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
- </LinearLayout>
- <View
- android:layout_width="match_parent"
- style="@style/message_view_horizontal_divider"
- />
- </LinearLayout>
- <!-- end of tab area -->
- <!--
- content area - only one of them is visible at a time.
- -->
- <com.android.email.view.RigidWebView
- android:id="@+id/message_content"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:background="@android:color/white"
- android:visibility="gone"
- />
-
- <!-- TODO: remove these useless scroll views. They are carry-over
- from an existing design and are no longer needed. -->
- <!--
- Even though the "invite" section is only for MessageViewFragment,
- Its visibility is controlled by MessageViewFragmentBase for simplicity.
- -->
- <ScrollView
- android:id="@+id/invite_scroll"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:paddingTop="16dip"
- android:paddingBottom="16dip"
- android:visibility="gone"
- >
- <!--
- Invite section - the views in it are controlled only by MessageViewFragment.
- MessageViewFragment shouldn't know what's inside it.
- -->
- <include layout="@layout/message_view_invitation" />
- </ScrollView>
- <ScrollView
- android:id="@+id/attachments_scroll"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:visibility="gone"
- >
- <LinearLayout
- android:id="@+id/attachments"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="4dip"
- android:background="@android:color/white"
- />
- </ScrollView>
- <!-- end of content area -->
- </LinearLayout>
- </com.android.email.view.NonLockingScrollView>
-</FrameLayout>
diff --git a/res/layout/message_view_header_actions.xml b/res/layout/message_view_header_actions.xml
deleted file mode 100644
index dd55e8122..000000000
--- a/res/layout/message_view_header_actions.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <ImageButton
- android:id="@+id/favorite"
- style="@style/message_view_action_buttons"
- android:src="@drawable/btn_star_off_convo_holo_light"
- android:contentDescription="@string/favorite_action"
- />
- <!-- Either reply or replyall will be set to gone in code depending on setting -->
- <ImageButton
- android:id="@+id/reply"
- style="@style/message_view_action_buttons"
- android:src="@drawable/ic_reply_holo_dark"
- android:contentDescription="@string/reply_action"
- />
- <ImageButton
- android:id="@+id/reply_all"
- style="@style/message_view_action_buttons"
- android:src="@drawable/ic_reply_all_holo_dark"
- android:contentDescription="@string/reply_all_action"
- />
- <ImageButton
- android:id="@+id/more"
- style="@android:style/Widget.Holo.ActionButton.Overflow"
- android:layout_width="48dip"
- android:layout_height="match_parent"
- />
-</merge>
diff --git a/res/layout/message_view_header_upper.xml b/res/layout/message_view_header_upper.xml
deleted file mode 100644
index c89bb8b1a..000000000
--- a/res/layout/message_view_header_upper.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Upper header area for a message view. This contains the message actions
- (e.g. reply, forward), and sender info -->
-<!-- Note the bottom padding is to compensate for the drop shadow in the asset -->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="@dimen/message_header_height"
- android:background="@drawable/header_convo_view_sender_bg_holo"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- >
- <QuickContactBadge
- android:id="@+id/badge"
- android:layout_width="@dimen/message_header_badge_width"
- android:layout_height="@dimen/message_header_badge_width"
- android:scaleType="centerCrop"
- />
- <View
- android:layout_width="1dip"
- android:layout_height="match_parent"
- android:background="@android:color/white"
- />
- <RelativeLayout
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:layout_marginLeft="@dimen/message_header_name_margin"
- >
- <TextView
- android:id="@+id/from_name"
- style="@style/message_header_sender_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
- <ImageView
- android:id="@+id/presence"
- android:src="@android:drawable/presence_offline"
- android:layout_below="@+id/from_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginRight="2dip"
- android:visibility="gone"
- />
- <TextView
- android:id="@+id/from_address"
- style="@style/message_header_sender_address"
- android:layout_below="@+id/from_name"
- android:layout_toRightOf="@+id/presence"
- android:layout_alignWithParentIfMissing="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="14dip"
- android:textColor="@color/text_secondary_color_inverse"
- android:singleLine="true"
- android:ellipsize="end"
- />
- </RelativeLayout>
- <include layout="@layout/message_view_header_actions" />
-</LinearLayout>
-
diff --git a/res/layout/message_view_invitation.xml b/res/layout/message_view_invitation.xml
deleted file mode 100644
index 5efc05b81..000000000
--- a/res/layout/message_view_invitation.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Non-xlarge -->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/invite_section"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:ellipsize="end"
- android:text="@string/message_view_invite_title"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:drawableLeft="@drawable/ic_badge_invite_holo_light"
- android:layout_marginLeft="12dip"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- />
-
- <Button
- android:id="@+id/invite_link"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:ellipsize="end"
- android:text="@string/message_view_invite_view"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:layout_marginRight="3dip"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- />
- </RelativeLayout>
-
- <!-- Divider -->
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="#ff808080"
- />
-
- <TextView
- android:id="@+id/invite_info"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_marginTop="4dip"
- android:layout_marginLeft="12dip"
- android:layout_marginRight="6dip"
- android:singleLine="true"
- android:ellipsize="end"
- android:text="@string/message_view_invite_text"
- android:textAppearance="?android:attr/textAppearanceSmall"
- />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="44dip"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- android:layout_marginLeft="12dip"
- android:layout_marginRight="6dip"
- >
-
- <TextView
- android:id="@+id/accept"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:layout_marginRight="6dip"
- android:text="@string/message_view_invite_accept"
- android:singleLine="true"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:drawableLeft="@drawable/btn_yes_off"
- android:gravity="center_vertical"
- android:focusable="true"
- />
-
- <TextView
- android:id="@+id/maybe"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:layout_marginRight="6dip"
- android:text="@string/message_view_invite_maybe"
- android:singleLine="true"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:drawableLeft="@drawable/btn_maybe_off"
- android:gravity="center_vertical"
- android:focusable="true"
- />
-
- <TextView
- android:id="@+id/decline"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@string/message_view_invite_decline"
- android:singleLine="true"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:drawableLeft="@drawable/btn_no_off"
- android:gravity="center_vertical"
- android:focusable="true"
- />
-
- </LinearLayout>
-</LinearLayout>
diff --git a/res/layout/message_view_subheader.xml b/res/layout/message_view_subheader.xml
deleted file mode 100644
index 026c92149..000000000
--- a/res/layout/message_view_subheader.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- The expandable list of recipient addressese and date information at
- the top of a message view -->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
- <!-- Collapsed version -->
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/sub_header_contents_collapsed"
- android:layout_width="match_parent"
- android:layout_height="48dip"
- android:gravity="center_vertical"
- >
- <!-- To, Cc, Bcc addresses -->
- <TextView
- android:id="@+id/addresses"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:layout_marginLeft="8dip"
- android:singleLine="true"
- android:ellipsize="end"
- style="@style/message_view_text"
- />
- <TextView
- android:id="@+id/datetime"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:singleLine="true"
- style="@style/message_view_text"
- />
- <!-- Set proper background to reflect selected state -->
- <ImageView
- android:id="@+id/show_details"
- android:src="@drawable/expander_open_holo_light"
- android:layout_width="wrap_content"
- android:layout_height="48dip"
- android:layout_marginLeft="4dip"
- android:scaleType="center"
- android:background="?android:attr/selectableItemBackground"
- />
- </LinearLayout>
-
- <!-- Expanded version -->
- <FrameLayout
- android:id="@+id/sub_header_contents_expanded"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="gone"
- >
-
- <include layout="@layout/message_view_details" />
-
- <!-- Overlay the collapse details icon.
- The height here needs to match the height of the collapsed subheader -->
- <ImageView
- android:id="@+id/show_details"
- android:src="@drawable/expander_close_holo_light"
- android:layout_width="wrap_content"
- android:layout_height="48dip"
- android:layout_marginLeft="4dip"
- android:scaleType="center"
- android:layout_gravity="right"
- />
- </FrameLayout>
-
-</merge>
-
diff --git a/res/layout/quoted_text.xml b/res/layout/quoted_text.xml
deleted file mode 100644
index 85b345589..000000000
--- a/res/layout/quoted_text.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/quoted_text_area"
- android:layout_height="wrap_content"
- android:layout_width="match_parent">
-
- <RelativeLayout android:layout_width="match_parent"
- android:layout_height="48dip"
- android:id="@+id/quoted_text_bar">
-
- <RelativeLayout android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:id="@+id/quoted_text_row"
- android:layout_alignParentLeft="true">
-
- <CheckBox android:id="@+id/include_quoted_text"
- android:layout_height="match_parent"
- android:layout_width="wrap_content"
- android:layout_alignParentLeft="true"
- android:gravity="center_vertical"
- android:contentDescription="@string/message_compose_quoted_text_label"/>
-
- <TextView
- android:text="@string/message_compose_quoted_text_label"
- android:textAllCaps="true"
- android:layout_height="match_parent"
- android:layout_width="wrap_content"
- android:layout_marginLeft="8dip"
- style="@style/QuotedTextHeaderStyle"
- android:layout_toRightOf="@+id/include_quoted_text"
- android:gravity="center_vertical|left"/>
- </RelativeLayout>
-
- </RelativeLayout>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="2dip"
- android:background="#babebe"
- android:layout_below="@id/quoted_text_bar"
- android:id="@+id/divider_bar" />
-
- <WebView android:id="@+id/quoted_text"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_below="@id/divider_bar" />
-
-</RelativeLayout>
diff --git a/res/layout/recipient_dropdown_item.xml b/res/layout/recipient_dropdown_item.xml
deleted file mode 100644
index dcae43ea7..000000000
--- a/res/layout/recipient_dropdown_item.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="50dip"
- android:orientation="horizontal"
- android:layout_centerVertical="true"
- android:layout_gravity="center_vertical">
- <TextView android:id="@+id/text1"
- android:textColor="?android:attr/textColorPrimary"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:gravity="center_vertical"
- android:paddingLeft="6dip"
- android:singleLine="true"
- android:ellipsize="end"
- />
- <TextView android:id="@+id/text2"
- android:textColor="?android:attr/textColorSecondary"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/text1"
- android:layout_centerVertical="true"
- android:gravity="center_vertical"
- android:paddingLeft="6dip"
- android:singleLine="true"
- android:ellipsize="end"
- />
-</RelativeLayout>
diff --git a/res/layout/recipient_dropdown_item_loading.xml b/res/layout/recipient_dropdown_item_loading.xml
deleted file mode 100644
index a1dd3f000..000000000
--- a/res/layout/recipient_dropdown_item_loading.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="50dip"
- android:orientation="horizontal"
- android:layout_centerVertical="true"
- android:layout_gravity="center_vertical">
- <TextView android:id="@+id/text1"
- android:textColor="?android:attr/textColorSecondary"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:gravity="center_vertical"
- android:paddingLeft="6dip"
- android:singleLine="true"
- android:ellipsize="end"
- />
- <ProgressBar android:id="@+id/progress_circular"
- style="?android:attr/progressBarStyleSmall"
- android:max="10000"
- android:layout_centerVertical="true"
- android:layout_alignParentRight="true"
- android:layout_marginLeft="6dip"
- android:layout_marginRight="6dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-</RelativeLayout>
diff --git a/res/layout/three_pane_collapsible_impl.xml b/res/layout/three_pane_collapsible_impl.xml
deleted file mode 100644
index e86da9091..000000000
--- a/res/layout/three_pane_collapsible_impl.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- ThreePaneLayout is based on LinearLayout with the orientation always horizontal -->
-
-<!-- Implementation of a three pane layout where in some modes, the left pane is
- collapsible. -->
-<!-- Note the width of each pane is set by code at runtime. -->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
- <FrameLayout
- android:id="@+id/left_pane"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- />
- <FrameLayout
- android:id="@+id/middle_pane"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- />
- <FrameLayout
- android:id="@+id/right_pane_with_fog"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- >
- <FrameLayout
- android:id="@+id/right_pane"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
- <include
- layout="@layout/message_command_button_view"
- android:id="@+id/message_command_buttons"
- />
- </LinearLayout>
- <!-- View to snatch all touch events. 100% transparent. -->
- <View
- android:id="@+id/fogged_glass"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@android:color/transparent"
- />
- </FrameLayout>
-</merge>
diff --git a/res/layout/three_pane_impl.xml b/res/layout/three_pane_impl.xml
deleted file mode 100644
index 7b2c46ffb..000000000
--- a/res/layout/three_pane_impl.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- ThreePaneLayout is based on LinearLayout with the orientation always horizontal -->
-
-<!-- Implementation of a three pane layout where two panes are always visible at
- any given time. -->
-<!-- Note the width of each pane is set by code at runtime. -->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
- <FrameLayout
- android:id="@+id/left_pane"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- />
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:orientation="vertical"
- >
- <FrameLayout
- android:id="@+id/middle_pane"
- android:layout_width="0dip"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
- <include
- layout="@layout/message_command_button_view"
- android:id="@+id/message_command_buttons"
- />
- </LinearLayout>
- <FrameLayout
- android:id="@+id/right_pane"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- />
-</merge>
diff --git a/res/layout/waiting_for_sync_message.xml b/res/layout/waiting_for_sync_message.xml
deleted file mode 100644
index a9d8aadf4..000000000
--- a/res/layout/waiting_for_sync_message.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/waiting_for_sync_message"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:padding="16dip"
- >
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center|top"
- >
- <ProgressBar
- android:id="@+id/progress"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:layout_marginRight="8dip"
- />
- <TextView
- android:id="@+id/title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@+id/progress"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:text="@string/waitinf_for_sync_message_1"
- />
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@+id/progress"
- android:layout_below="@+id/title"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:text="@string/waitinf_for_sync_message_2"
- />
- </RelativeLayout>
-</FrameLayout>
diff --git a/res/layout/widget.xml b/res/layout/widget.xml
deleted file mode 100644
index 397be4362..000000000
--- a/res/layout/widget.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginTop="6dip"
- android:layout_marginBottom="6dip"
- android:orientation="vertical">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="48dip"
- android:gravity="center_vertical"
- android:paddingLeft="8dip"
- android:paddingRight="8dip"
- android:orientation="horizontal"
- android:background="@drawable/header_bg_email_widget_holo">
- <ImageView
- android:id="@+id/widget_logo"
- android:layout_width="32dip"
- android:layout_height="32dip"
- android:layout_marginRight="8dip"
- android:src="@mipmap/ic_launcher_email" />
- <LinearLayout
- android:id="@+id/widget_header"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:orientation="vertical">
- <TextView
- android:id="@+id/widget_title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:text="@string/widget_all_mail"
- android:textColor="@color/widget_title_color"
- />
- <TextView
- android:id="@+id/widget_tap"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:text="@string/widget_other_views"
- android:textColor="@color/widget_title_color"
- />
- </LinearLayout>
- <!-- Note: We can't set "freezesText" on the widget_unread_count view, as the launcher can
- restore stale data over updated data. -->
- <TextView
- android:id="@+id/widget_count"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginRight="12dip"
- android:textSize="36sp"
- android:textStyle="bold"
- android:textColor="@color/widget_unread_color" />
- <ImageView
- android:id="@+id/widget_compose"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ic_menu_compose_normal_holo_light" />
- </LinearLayout>
- <ListView
- android:id="@+id/message_list"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:cacheColorHint="#00000000"
- android:background="@drawable/gradient_bg_email_widget_holo" />
-
- <!-- TODO: remove this tap to configure logic. It's obsolete. -->
- <TextView
- android:id="@+id/tap_to_configure"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="5dip"
- android:layout_marginRight="5dip"
- android:layout_weight="1"
- android:layout_gravity="fill"
- android:gravity="center"
- android:text="@string/widget_touch_to_configure"
- android:textSize="16sp"
- android:visibility="gone"/>
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/list_div_top_btm_email_widget_holo" />
-</LinearLayout>
diff --git a/res/layout/widget_list_item.xml b/res/layout/widget_list_item.xml
deleted file mode 100644
index b447f98b8..000000000
--- a/res/layout/widget_list_item.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/widget_message"
- android:layout_width="match_parent"
- android:layout_height="64sp"
- android:background="@drawable/conversation_unread_selector"
- >
- <ImageView
- android:id="@+id/color_chip"
- android:layout_width="32dip"
- android:layout_height="4dip"
- android:layout_marginRight="16dip"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- android:visibility="visible"
- />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:layout_centerVertical="true"
- android:orientation="vertical"
- >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- >
- <TextView
- android:id="@+id/widget_from"
- style="@style/widget_list_item"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:paddingRight="16dip"
- android:singleLine="true" />
- <!-- Use negative margins to align attachment icon with text -->
- <ImageView
- android:id="@+id/widget_invite"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="-4sp"
- android:src="@drawable/ic_badge_invite_holo_light" />
- <ImageView
- android:id="@+id/widget_attachment"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="-4sp"
- android:src="@drawable/ic_attachment_holo_light" />
- <TextView
- android:id="@+id/widget_date"
- style="@style/widget_list_item"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </LinearLayout>
- <TextView
- android:id="@+id/widget_subject"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- style="@style/widget_list_item"
- android:layout_marginTop="-4sp"
- android:maxLines="2"/>
- </LinearLayout>
-</RelativeLayout>
diff --git a/res/layout/widget_loading.xml b/res/layout/widget_loading.xml
deleted file mode 100644
index a25e32de0..000000000
--- a/res/layout/widget_loading.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="50dip"
- android:orientation="horizontal">
- <TextView
- android:id="@+id/loading_text"
- android:layout_height="fill_parent"
- android:layout_width="fill_parent"
- android:gravity="center"
- android:textColor="#60FFFFFF"
- android:textSize="20sp"
- android:shadowColor="#FF000000"
- android:shadowDx="0.0"
- android:shadowDy="1.0"
- android:shadowRadius="2.0" />
-</LinearLayout> \ No newline at end of file
diff --git a/res/menu-sw600dp/email_activity_options.xml b/res/menu-sw600dp/email_activity_options.xml
deleted file mode 100644
index 71aebb78c..000000000
--- a/res/menu-sw600dp/email_activity_options.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Email activity menu options for the tablet -->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:id="@+id/compose"
- android:orderInCategory="100"
- android:alphabeticShortcut="c"
- android:title="@string/compose_action"
- android:icon="@drawable/ic_menu_compose_normal_holo_light"
- android:showAsAction="ifRoom"
- />
- <item
- android:id="@+id/search"
- android:orderInCategory="200"
- android:alphabeticShortcut="s"
- android:title="@string/search_action"
- android:icon="@drawable/ic_menu_search_holo_light"
- android:showAsAction="ifRoom"
- />
-
- <!-- Message view options go here -->
-
- <item
- android:id="@+id/refresh"
- android:orderInCategory="1500"
- android:alphabeticShortcut="r"
- android:title="@string/refresh_action"
- android:icon="@drawable/ic_menu_refresh_holo_light"
- android:showAsAction="ifRoom"
- />
- <!-- Newer/older are not menu items on tablet, but we have them here to keep compatibility
- with the phone menu. -->
- <item
- android:id="@+id/newer"
- android:visible="false"
- />
- <item
- android:id="@+id/older"
- android:visible="false"
- />
- <item
- android:id="@+id/mailbox_settings"
- android:orderInCategory="2000"
- android:title="@string/mailbox_settings_action"
- android:icon="@android:drawable/ic_menu_preferences"
- />
- <item
- android:id="@+id/account_settings"
- android:orderInCategory="3000"
- android:title="@string/settings_action"
- android:icon="@android:drawable/ic_menu_preferences"
- />
-</menu>
diff --git a/res/menu-sw600dp/message_compose_option.xml b/res/menu-sw600dp/message_compose_option.xml
deleted file mode 100644
index 617c868bd..000000000
--- a/res/menu-sw600dp/message_compose_option.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:id="@+id/send"
- android:orderInCategory="1000"
- android:title="@string/send_action"
- android:showAsAction="ifRoom|withText"
- android:icon="@drawable/ic_menu_send_holo_light"
- android:alphabeticShortcut="s"
- />
- <item
- android:id="@+id/save"
- android:orderInCategory="1100"
- android:title="@string/save_draft_action"
- android:showAsAction="ifRoom"
- android:alphabeticShortcut="d"
- />
- <item
- android:id="@+id/discard"
- android:orderInCategory="1200"
- android:title="@string/discard_action"
- android:showAsAction="ifRoom"
- android:icon="@drawable/ic_menu_trash_holo_light"
- android:alphabeticShortcut="q"
- />
- <item
- android:id="@+id/show_quick_text_list_dialog"
- android:orderInCategory="1300"
- android:title="@string/show_quick_text_list_dialog_action"
- android:alphabeticShortcut="r"
- />
- <item
- android:id="@+id/settings"
- android:orderInCategory="2000"
- android:title="@string/settings_action"
- android:icon="@android:drawable/ic_menu_preferences"
- />
-</menu>
-
diff --git a/res/menu-sw600dp/message_view_fragment_option.xml b/res/menu-sw600dp/message_view_fragment_option.xml
deleted file mode 100644
index 41a60f13c..000000000
--- a/res/menu-sw600dp/message_view_fragment_option.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Message view menu options for the tablet -->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- Higher order options go here -->
- <item
- android:id="@+id/delete"
- android:orderInCategory="1000"
- android:title="@string/delete_action"
- android:icon="@drawable/ic_menu_trash_holo_light"
- android:showAsAction="ifRoom"
- />
- <item
- android:id="@+id/move"
- android:orderInCategory="1100"
- android:title="@string/move_action"
- android:icon="@drawable/ic_menu_move_to_holo_light"
- android:showAsAction="ifRoom"
- />
- <item
- android:id="@+id/mark_as_unread"
- android:orderInCategory="1200"
- android:title="@string/mark_as_unread_action"
- android:showAsAction="ifRoom"
- android:icon="@drawable/ic_menu_mark_unread_holo_light"
- />
-</menu>
diff --git a/res/menu/email_activity_options.xml b/res/menu/email_activity_options.xml
deleted file mode 100644
index 33ee507ef..000000000
--- a/res/menu/email_activity_options.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Email activity menu options for the phone -->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:id="@+id/compose"
- android:orderInCategory="100"
- android:alphabeticShortcut="c"
- android:title="@string/compose_action"
- android:icon="@drawable/ic_menu_compose_normal_holo_light"
- android:showAsAction="ifRoom"
- />
- <item
- android:id="@+id/search"
- android:orderInCategory="200"
- android:alphabeticShortcut="s"
- android:title="@string/search_action"
- android:icon="@drawable/ic_menu_search_holo_light"
- android:showAsAction="ifRoom"
- />
- <item
- android:id="@+id/show_all_mailboxes"
- android:orderInCategory="300"
- android:alphabeticShortcut="c"
- android:title="@string/mailbox_list_account_selector_show_all_folders"
- android:icon="@drawable/ic_menu_move_to_holo_light"
- android:showAsAction="ifRoom"
- />
- <item
- android:id="@+id/refresh"
- android:orderInCategory="400"
- android:alphabeticShortcut="r"
- android:title="@string/refresh_action"
- android:icon="@drawable/ic_menu_refresh_holo_light"
- android:showAsAction="ifRoom"
- />
- <!-- Note the order; we want to show them to the right of delete/move -->
- <item
- android:id="@+id/newer"
- android:orderInCategory="1500"
- android:icon="@drawable/menu_item_newer"
- android:showAsAction="always"
- android:visible="false"
- />
- <item
- android:id="@+id/older"
- android:orderInCategory="1600"
- android:icon="@drawable/menu_item_older"
- android:showAsAction="always"
- android:visible="false"
- />
- <item
- android:id="@+id/mailbox_settings"
- android:orderInCategory="2000"
- android:title="@string/mailbox_settings_action"
- android:icon="@android:drawable/ic_menu_preferences"
- />
- <item
- android:id="@+id/account_settings"
- android:orderInCategory="3000"
- android:title="@string/settings_action"
- android:icon="@android:drawable/ic_menu_preferences"
- />
-</menu>
diff --git a/res/menu/message_compose_option.xml b/res/menu/message_compose_option.xml
deleted file mode 100644
index d3b13f1e9..000000000
--- a/res/menu/message_compose_option.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:id="@+id/send"
- android:title="@string/send_action"
- android:showAsAction="ifRoom|withText"
- android:icon="@drawable/ic_menu_send_holo_light"
- android:alphabeticShortcut="s"
- />
- <item
- android:id="@+id/add_attachment"
- android:title="@string/add_file_attachment"
- />
- <item
- android:id="@+id/add_cc_bcc"
- android:title="@string/add_cc_bcc_menu"
- />
- <item
- android:id="@+id/save"
- android:title="@string/save_draft_action"
- android:alphabeticShortcut="d"
- />
- <item
- android:id="@+id/discard"
- android:title="@string/discard_action"
- android:icon="@drawable/ic_menu_trash_holo_light"
- android:alphabeticShortcut="q"
- />
- <item
- android:id="@+id/show_quick_text_list_dialog"
- android:title="@string/show_quick_text_list_dialog_action"
- android:alphabeticShortcut="r"
- />
- <item
- android:id="@+id/settings"
- android:title="@string/settings_action"
- android:icon="@android:drawable/ic_menu_preferences"
- />
-</menu>
diff --git a/res/menu/message_header_overflow_menu.xml b/res/menu/message_header_overflow_menu.xml
deleted file mode 100644
index 8ba33f1cc..000000000
--- a/res/menu/message_header_overflow_menu.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- Reply or replyall may be removed in code depending on setting and layout -->
- <item
- android:id="@+id/reply"
- android:title="@string/reply_action"
- />
- <item
- android:id="@+id/reply_all"
- android:title="@string/reply_all_action"
- />
- <item
- android:id="@+id/forward"
- android:title="@string/forward_action"
- />
-</menu>
-
diff --git a/res/menu/message_list_fragment_cab_options.xml b/res/menu/message_list_fragment_cab_options.xml
deleted file mode 100644
index 848dd0ce3..000000000
--- a/res/menu/message_list_fragment_cab_options.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/delete" android:title="@string/delete_action"
- android:icon="@drawable/ic_menu_trash_holo_light"
- android:showAsAction="always" />
- <item android:id="@+id/move" android:title="@string/move_action"
- android:icon="@drawable/ic_menu_move_to_holo_light"
- android:showAsAction="always" />
- <item android:id="@+id/mark_read" android:title="@string/read_action"
- android:icon="@drawable/ic_menu_mark_read_holo_light"
- android:showAsAction="always" />
- <item android:id="@+id/mark_unread" android:title="@string/unread_action"
- android:icon="@drawable/ic_menu_mark_unread_holo_light"
- android:showAsAction="always" />
- <item android:id="@+id/add_star" android:title="@string/set_star_action"
- android:icon="@drawable/ic_menu_star_holo_light"
- android:showAsAction="always" />
- <item android:id="@+id/remove_star" android:title="@string/remove_star_action"
- android:icon="@drawable/ic_menu_star_off_holo_light"
- android:showAsAction="always" />
-</menu>
diff --git a/res/menu/message_list_fragment_option.xml b/res/menu/message_list_fragment_option.xml
deleted file mode 100644
index df0796437..000000000
--- a/res/menu/message_list_fragment_option.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:id="@+id/send"
- android:orderInCategory="50"
- android:title="@string/message_list_send_pending_messages_action"
- android:showAsAction="ifRoom|withText"
- android:icon="@drawable/ic_menu_send_holo_light"
- />
-</menu>
diff --git a/res/menu/message_view_fragment_option.xml b/res/menu/message_view_fragment_option.xml
deleted file mode 100644
index 845c822dc..000000000
--- a/res/menu/message_view_fragment_option.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Message view menu options for the phone -->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:id="@+id/move"
- android:orderInCategory="1100"
- android:title="@string/move_action"
- android:icon="@drawable/ic_menu_move_to_holo_light"
- android:showAsAction="ifRoom"
- />
- <item
- android:id="@+id/delete"
- android:orderInCategory="1000"
- android:title="@string/delete_action"
- android:icon="@drawable/ic_menu_trash_holo_light"
- android:showAsAction="ifRoom"
- />
- <item
- android:id="@+id/mark_as_unread"
- android:orderInCategory="1200"
- android:title="@string/mark_as_unread_action"
- android:showAsAction="never"
- android:icon="@drawable/ic_menu_mark_unread_holo_light"
- />
-</menu>
diff --git a/res/menu/welcome.xml b/res/menu/welcome.xml
deleted file mode 100644
index 4f0cd47f2..000000000
--- a/res/menu/welcome.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Menu items for the "Welcome" screen when the user is waiting for initial
- sync -->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:id="@+id/account_settings"
- android:title="@string/settings_action"
- android:icon="@android:drawable/ic_menu_preferences"
- />
-</menu>
-
diff --git a/res/mipmap-hdpi/ic_launcher_email.png b/res/mipmap-hdpi/ic_launcher_email.png
deleted file mode 100644
index 2616df73a..000000000
--- a/res/mipmap-hdpi/ic_launcher_email.png
+++ /dev/null
Binary files differ
diff --git a/res/mipmap-mdpi/ic_launcher_email.png b/res/mipmap-mdpi/ic_launcher_email.png
deleted file mode 100644
index 545902704..000000000
--- a/res/mipmap-mdpi/ic_launcher_email.png
+++ /dev/null
Binary files differ
diff --git a/res/mipmap-xhdpi/ic_launcher_email.png b/res/mipmap-xhdpi/ic_launcher_email.png
deleted file mode 100644
index 91c768e45..000000000
--- a/res/mipmap-xhdpi/ic_launcher_email.png
+++ /dev/null
Binary files differ
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 18e47e5f7..885484053 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Lees e-posaanhegsels"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Laat hierdie program toe om jou e-pos-aanhegsels te lees."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Laat die program toe om jou e-pos se aanhegsels te lees."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Kry toegang tot e-posverskafferdata"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Gee hierdie program toegang tot jou e-posdatabasis, insluitend ontvangde boodskappe, gestuurde boodskappe, gebruikername en wagwoorde."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Laat die program toe om toegang te kry tot jou e-posdatabasis, insluitend ontvangde boodskappe, gestuurde boodskappe, gebruikername en wagwoorde."</string>
<string name="app_name" msgid="5815426892327290362">"E-pos"</string>
<string name="compose_title" msgid="427986915662706899">"Skryf"</string>
<string name="debug_title" msgid="5175710493691536719">"Ontfout"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Gedoen"</string>
<string name="create_action" msgid="3062715563215392251">"Skep nuwe"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Vee uit"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Geen vinnige antwoorde nie"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Geen vinnige reaksies nie."</string>
<string name="discard_action" msgid="6532206074859505968">"Gooi weg"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Stoor konsep"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Voer vinnige antwoord in"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Soek"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Rekeninginstellings"</string>
<string name="settings_action" msgid="6334807007967459412">"Instellings"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Sinkroniseeropsies"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Sinkroniseeropsies"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Merk as ongelees"</string>
<string name="move_action" msgid="3059189775933985898">"Skuif"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> het geskryf:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Sluit aangehaalde teks in"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Sluit teks in"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Jy moet ten minste een ontvanger byvoeg."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Voeg ten minste een ontvanger by."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Sekere e-posadresse is ongeldig."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Lêer te groot om aan te heg."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Voer vinnige antwoord in"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Gestoor"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stop"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Aanhegsel gestoor as <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Kon nie die aanhegsel stoor nie."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Let wel: Een of meer aanhegsels in jou aangestuurde boodskap sal afgelaai word voor dit gestuur word."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Kon nie aanhegsel stoor nie."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Een of meer aanhegsels in jou aangestuurde boodskap sal afgelaai word voor dit gestuur word."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Boodskap"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Nooi uit"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Kon een of meer aanhegsels nie aanstuur nie"</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Aanhegsel nie aangestuur nie"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g>-aanmelding het misluk"</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> se aanmelding is onsuksesvol."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Kan nie aanmeld nie"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Ouer"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Rekening-opstelling"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Voeg \'n Exchange-rekening by"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Voeg \'n Exchange ActiveSync-rekening by"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"E-posrekening"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Jy kan e-pos vir die meeste rekeninge in net \'n paar stappe opstel."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Jy kan \'n Exchange-rekening in net \'n paar stappe opstel."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Jy kan \'n Exchange ActiveSync-rekening in net \'n paar stappe opstel."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Jy kan jou rekening in net \'n paar stappe opstel."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-posadres"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Wagwoord"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Stuur e-pos by verstek vanaf hierdie rekening."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Stuur e-pos van hierdie rekening by verstek"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Handmatige opstelling"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Voer asseblief \'n geldige e-posadres en wagwoord in."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplikaatrekening"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Kontroleer tans inkomende bedienerinstellings…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Kontroleer tans uitgaande bedienerinstellings…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Rekening-opstelling"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Jou rekening is nou opgestel en e-pos is op pad!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Jou rekening is opgestel en die e-pos is op pad!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Gee hierdie rekening \'n naam (opsioneel)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Jou naam (staan op uitgaande boodskappe)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Hierdie veld kan nie leeg wees nie."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Inkomende bedienerinstellings"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Gebruikernaam"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Wagwoord"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3-bediener"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP-bediener"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Bediener"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Poort"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Sekuriteitstipe"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Geen"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-bediener"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Poort"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Sekuriteitstipe"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Vereis aanmelding."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Vereis aanmelding"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Gebruikernaam"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Wagwoord"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Rekening-opstelling"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Elke 15 minute"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Elke 30 minute"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Elke uur"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Stuur e-pos by verstek vanaf hierdie rekening."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Laat my weet wanneer ek e-pos kry."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sinkroniseer kontakte uit hierdie rekening."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sinkroniseer kalender vanaf hierdie rekening."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sinkroniseer e-pos vanaf hierdie rekening."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Stuur e-pos van hierdie rekening by verstek"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Laat my weet wanneer e-pos aankom"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sinkroniseer kontakte uit hierdie rekening"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sinkroniseer kalender uit hierdie rekening"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sinkroniseer e-pos uit hierdie rekening"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Laai aanhegsels outomaties af wanneer aan Wi-Fi gekoppel is"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Kon nie voltooi word nie"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dae om te sinkroniseer"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Een maand"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Alle"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Gebruik rekening se verstek"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Gebruikernaam of wagwoord verkeerd."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Gebruikernaam of wagwoord verkeerd."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Gebruikernaam of wagwoord verkeerd."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Gebruikernaam of wagwoord is verkeerd"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Kan nie veilig aan bediener koppel nie."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Kan nie veilig aan bediener koppel nie."\n"<xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Kliëntsertifikaat word vereis. Koppel aan bediener met kliëntsertifikaat?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Sertifikaat is ongeldig of ontoeganklik."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Die bediener het met \'n fout gereageer; kontroleer jou gebruikernaam en wagwoord en probeer weer."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"\'n Kliëntsertifikaat word vereis. Wil jy aan die bediener koppel met \'n kliëntsertifikaat?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Die sertifikaat is ongeldig of ontoeganklik."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Die bediener het gereageer met \'n foutboodskap. Kontroleer jou gebruikernaam en wagwoord, en herprobeer dan."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Kan nie aan bediener koppel nie."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Kan nie aan bediener koppel nie."\n"<xliff:g id="ERROR">%s</xliff:g>"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS vereis, maar nie deur bediener ondersteun nie."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"LET WEL: Deaktivering van die e-posprogram se magtiging om jou toestel te administreer, sal alle e-posrekeninge wat dit benodig, uitvee, asook hul e-posse, kontakte, kalendergebeure en ander data."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Sekuriteitsopdatering"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> vereis dat jy jou sekuriteitsinstellings opdateer."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Rekening \"<xliff:g id="ACCOUNT">%s</xliff:g>\" vereis opdatering van sekuriteitsinstellings."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Sekuriteitsopdatering vereis"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Rekening \"<xliff:g id="ACCOUNT">%s</xliff:g>\" kan nie gesinchroniseer word nie weens sekuriteitvereistes."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Rekening \"<xliff:g id="ACCOUNT">%s</xliff:g>\" vereis opdatering van sekuriteitsinstellings."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Rekening \"<xliff:g id="ACCOUNT">%s</xliff:g>\" het sy sekuriteitsinstellings verander; geen handeling deur die gebruiker is nodig nie."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Sekuriteitsopdatering vereis"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Sekuriteitsbeleide het verander"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Kan nie sekuriteitbeleid nakom nie"</string>
<string name="account_security_title" msgid="3511543138560418587">"Toestelsekuriteit"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Die bediener <xliff:g id="SERVER">%s</xliff:g> vereis dat jy dit toelaat om sekere sekuriteitskenmerke van jou Android-toestel afgeleë te beheer."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Redigeer details"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Jou skermslot se PIN of wagwoord het verval."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Wagwoord vir skermslot het verval"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Wagwoord vir skermslot verval"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Jy moet jou skermslot se PIN of wagwoord gou verander, anders gaan <xliff:g id="ACCOUNT">%s</xliff:g> se data uitgevee word. Wil jy dit nou verander?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Jy moet jou skermslot-PIN of -wagwoord binnekort verander, anders sal die data vir <xliff:g id="ACCOUNT">%s</xliff:g> uitgevee word. Wil jy dit nou verander?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Wagwoord vir skermslot het verval"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Die data vir <xliff:g id="ACCOUNT">%s</xliff:g> word van jou toestel afgevee. Jy kan dit teruglaai deur jou skermslot se PIN of wagwoord te verander. Wil jy dit nou verander?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Die data vir <xliff:g id="ACCOUNT">%s</xliff:g> word uit jou toestel gevee. Jy kan dit teruglaai deur jou skermslot-PIN of -wagwoord te verander. Wil jy dit nou verander?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Raak van ongestoorde veranderinge ontslae?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Kon nie aanmeld nie."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Die gebruikernaam of wagwoord vir <xliff:g id="ACCOUNT">%s</xliff:g> is verkeerd. Dateer hulle nou op?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Die gebruikernaam of wagwoord vir <xliff:g id="ACCOUNT">%s</xliff:g> is verkeerd. Wil jy dit nou opdateer?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Verstek rekening"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Stuur e-pos by verstek vanaf hierdie rekening"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Laai aanhegsels af"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Laai outomaties aanhegsels van onlangse boodskappe via Wi-Fi af"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"E-poskennisgewings"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Sinkroniseerfrekwensie, kennisgewings, ens."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Wys in statusbalk wanneer e-pos aankom"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Stuur berig wanneer e-pos aankom"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Kontroleer inkassie elke"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Inkomende instellings"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Gebruikernaam, wagwoord en ander instellings vir inkomende bediener"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Uitgaande instellings"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Gebruikernaam, wagwoord en ander instellings vir uitgaandebediener-instellings"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Beleide toegepas"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Geen"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nie-ondersteunde beleide"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Geen"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Probeer sinkroniseer"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Raak hier om hierdie rekening te sinkroniseer"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Rekeningnaam"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Jou naam"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Handtekening"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Vinnige reaksies"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Redigeer teks wat jy gereeld invoeg wanneer jy e-posse skryf"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Redigeer teks wat jy gereeld invoeg wanneer jy e-pos skryf"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Las teks by die boodskappe wat jy stuur"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Kennisgewingsinstellings"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Datagebruik"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Sekuriteitsbeleide"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Redigeer vinnige antwoord"</string>
<string name="save_action" msgid="1988862706623227093">"Stoor"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sinkroniseer kontakte"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sinkroniseer kontakte vir hierdie rekening"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sinkroniseer kalender"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sinkroniseer kalender vir hierdie rekening"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sinkroniseer kalender"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sinkroniseer kalendergebeurtenis uit hierdie rekening"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sinkroniseer e-pos"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sinkroniseer e-pos vir hierdie rekening"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibreer"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultate van <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Instellings"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Algemeen"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Algemene instellings"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Program"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Outovoortgaan"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Kies watter skerm moet wys nadat jy \'n boodskap uitgevee het"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Versteek merkblokkies"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Raak aan en hou om boodskappe uit lys te kies"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Bevestig voor uitvee"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Boodskappe"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Bevestig voor stuur"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Boodskappe"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Gaan voort na"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Nuwer boodskap"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Ouer boodskap"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Wag vir resultate"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Sommige bedieners neem \'n lang tyd."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Vouers"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Weier gebruik van die toestel se kamera"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Vereis toestelwagwoord"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Beperk die hergebruik van onlangse wagwoorde"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Vereis dat wagwoorde verval"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Vereis dat \'n ledige toestel sy skerm sluit"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Beperk die aantal kalendergebeurtenisse wat gesinchroniseer word"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Beperk die aantal e-posse wat gesinchroniseer word"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Dankie!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Klink vir my goed!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Ek sal dit later lees en jou antwoord."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Kom ons skeduleer \'n vergadering om dit te bespreek."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Agtergrond-sinkronisasie vir hierdie rekening is gedeaktiveer tydens swerwing."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Stuur tans antwoord..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Geen boodskappe nie."</string>
</resources>
diff --git a/res/values-af/uploader.xml b/res/values-af/uploader.xml
index 25ec5f0c2..904581f4c 100644
--- a/res/values-af/uploader.xml
+++ b/res/values-af/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Versteek details"</string>
<string name="menu_settings" msgid="5088116127086866634">"Instellings"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"%s opgelaai"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Rekening"</string>
<string name="upload" msgid="2615541458361216022">"Laai op"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 9564151a9..f38cbcd38 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"የኢሜይል ዓባሪዎችን አንብብ"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"ይህ መተግበሪያ የኢሜይል አባሪዎችህን እንዲያነብ ይፈቅዳል።"</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"የኢሜይል አባሪዎችህን እንዲያነብ ለመተግበሪያ ይፈቅዳል።"</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"የኢሜይል አቅራቢ ውሂብ ድረስ።"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"ይህ መተግበሪያ የኢሜይል የውሂብ ጎታህን፣ የደረሱ መልዕክቶች፣ የተላኩ መልዕክቶች፣ ተጠቃሚ ስሞች እና የይለፍ ቃሎችን ጨምሮ ለመድረስ ይፈቅዳል።"</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">" የኢሜይል የውሂብ ጎታህን፣ የደረሱ መልዕክቶች፣ የተላኩ መልዕክቶች፣ ተጠቃሚ ስሞች እና የይለፍ ቃሎችን ጨምሮ ለመድረስ ለመተግበሪያ ይፈቅዳል።"</string>
<string name="app_name" msgid="5815426892327290362">"ኢሜይል"</string>
<string name="compose_title" msgid="427986915662706899">"ፅሁፍ አዘጋጅ"</string>
<string name="debug_title" msgid="5175710493691536719">"አርም"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"ተከናውኗል"</string>
<string name="create_action" msgid="3062715563215392251">"አዲስ ፍጠር"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"ሰርዝ"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"ምንም ፈጣን ምላሾች የሉም"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"ምንም ፈጣን ምላሾች የሉም።"</string>
<string name="discard_action" msgid="6532206074859505968">"አስወግድ"</string>
<string name="save_draft_action" msgid="6413714270991417223">"ረቂቅ አስቀምጥ"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"ፈጣን ምላሽ አስገባ"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">" ፈልግ"</string>
<string name="account_settings_action" msgid="4494079183315085171">"መለያ ቅንብሮች"</string>
<string name="settings_action" msgid="6334807007967459412">"ቅንብሮች"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"አሳምር አማራጮች"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"የማመሳሰል አማራጮች"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"እንዳልተነበበ ምልክት አድርግ"</string>
<string name="move_action" msgid="3059189775933985898">"አንቀሳቅስ"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ካርቦን ቅጂ/ስውር ቅጂ"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>ፃፈ፡"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"የተጠቀሰ ጽሁፍ አካትት"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"ፅሁፍ አካት"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"ቢያንስ አንድ ተቀባይ ማከል አለብዎ።"</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"እባክህን ቢያንስ አንድ ተቀባይ አክል።"</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"አንዳንድ ኢሜይል አድራሻዎች ትክክል አይደሉም።"</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"የፋይል መጠንለማያያዝ በጣም ትልቅ ነው።"</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"ፈጣን ምላሽ አስገባ"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"ተቀምጧል"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"ቁም"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"አባሪ እንደ <xliff:g id="FILENAME">%s</xliff:g> ተቀምጧል።"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"ዓባሪውን ማስቀመጥ አልተቻለም::"</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"ማስታወሻ፡ በሚተላለፈው መልዕክትዎ ውስጥ አንድ ወይም ተጨማሪ አባሪዎች ከመላኩ አስቀድሞ ይወርዳሉ።"</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"ዓባሪውን ማስቀመጥ አልተቻለም።"</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"በሚተላለፈው መልዕክትህ ውስጥ አንድ ወይም ተጨማሪ አባሪዎች ከመላኩ አስቀድሞ ይወርዳሉ።"</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"መልዕክት"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"ጋብዝ"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"አንድ ወይም ከዛ በላይ ዓባሪዎችን ለማስተላለፍ አልተቻለም::"</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"አባሪ አልተላለፈም"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> በመለያ መግባት ተሰናክሏል::"</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> በመለያ መግባት አልተሳካም።"</string>
<string name="login_failed_title" msgid="7624349996212476176">"በመለያ መግባት አልተቻለም፡፡"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"የድሮ"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"መለያ አዘጋጅ"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"ተለዋጭ መለያ አክል"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Exchange ActiveSync መለያ አክል"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"የኢሜይል መለያ"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"በጥቂት እርምጃ ለአብዛኛው መለያዎች ኢሜይል ማዋቀር ትችላለህ።"</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"በጥቂት እርምጃ የልውውጥ መለያ ማዘጋጀት ትችላለህ።"</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"በጥቂት እርምጃዎች Exchange ActiveSync መለያ ማዘጋጀት ትችላለህ።"</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"መለያህን በጥቂት ደረጃዎች ብቻ ማዋቀር ትችላለህ።"</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"ኢሜይል አድራሻ"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"የይለፍ ቃል፡"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"ከዚህ መለያ በነባሪኢሜይል ላክ"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"ከዚህ መለያ በነባሪ ኢሜይል ላክ"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"በእጅ አዘጋጅ"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"እባክህ ትክክለኛ ኢሜይል አድራሻ እና ይለፍ ቃል ፃፍ።"</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"ተመሳሳይ መለያ"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"የገቢ አገልጋይ ቅንብሮች በመመልከት ላይ...."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"የወጪ አገልጋይ ቅንብሮች በመመልከት ላይ...."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"መለያ አዘጋጅ"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"መለያዎ ዝግጁ ነው፣ኢሜይልዎ መንገድ ላይ ነው!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"መለያህ ተዋቅሯል፣ ኢሜይልህም መንገድ ላይ ነው!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"ለዚሀመለያ ስም ስጥ(አማራጭ)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"ስምዎ(በወጪ መልዕክቶች ላይ አሳይቷል)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"ይህ መስክ ባዶ መሆን አይችልም።"</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"የገቢ አገልጋይ ቅንብሮች"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"የተጠቃሚ ስም"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"የይለፍ ቃል"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"የPOP3 አገልጋይ"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"የIMAP አገልጋይ"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"አገልጋይ"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"ወደብ"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"የደህንነትአይነት"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"አንዱም"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"የSMTP አገልጋይ"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"ወደብ"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"የደህንነትአይነት"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"ግባ ይጠበቃል።"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"ከፍቶ መግባት ይፈልጋል"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"የተጠቃሚ ስም"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"የይለፍ ቃል"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"መለያ አዘጋጅ"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"በየ15 ደቂቃዎቹ"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"በየ30 ደቂቃዎቹ"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"በየሰዓቱ"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"ከዚህ መለያ በነባሪኢሜይል ላክ"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"ኢሜይል ሲደርስ አሳውቀኝ።"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"ከዚህ መለያ ዕውቂያዎች አሳምር"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"ከዚህ መለያ የቀን አቆጣጠር አሳምር።"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"ከዚህ መለያ ኢሜይል አሳምር።"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"ከዚህ መለያ በነባሪ ኢሜይል ላክ"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"ኢሜይል ሲደርስ አሳውቀኝ"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"ከዚህ መለያ ዕውቂያዎች አመሳስል"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"ከዚህ መለያ የቀን አቆጣጠር አመሳስል"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"ከዚህ መለያ ኢሜይል አመሳስል"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"ወደ Wi-Fi ስትገናኝ አባሪዎችን በራስ ሰር አውርድ"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"ማጠናቀቅ አልተቻለም"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"ቀኖች አሳምር"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"አንድ ወር"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"ሁሉም"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"የመለያ ነባሪ ተጠቀም"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"ተጠቃሚ ስም ወይም ይለፍ ቃል ተሳስቷል።"</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"ተጠቃሚ ስም ወይም ይለፍ ቃል ተሳስቷል።"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"ተጠቃሚ ስም ወይም ይለፍ ቃል የተሳሳተ ነው።"</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"የተጠቃሚው ስም ወይም ይለፍ ቃል የተሳሳተ ነው። "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"ወደ አገልጋዩ በሰላም ማገናኘት አልተቻለም።"</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"ወደ አገልጋዩ በሰላም ማገናኘት አልተቻለም።"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"የደንበኛ የዕውቅና ማረጋገጫ ይጠበቃል። ከደንበኛ የዕውቅና ማረጋገጫ ጋር ወደ አገልጋይ ይገናኝ?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"የዕውቅና ማረጋገጫው ልክ ያልሆነ ወይም ተደራሽ ያልሆነ ነው::"</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"አገልጋዩ ከክስተት ጋር መልሷል፤ እባክህ የተጠቃሚ ስምህን እና የይለፍ ቃልህን ተመልከት እና እንደገና ሞክር።"</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"የተገልጋይ ሰርቲፊኬት ያስፈልጋል። በተገልጋይ ሰርቲፊኬት ወደ አገልጋይ መገናኘት ትፈልጋለህ?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"የዕውቅና ማረጋገጫው ልክ ያልሆነ ወይም ተደራሽ ያልሆነ ነው።"</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"አገልጋዩ ከስህተት ጋር መልሷል፤ የተጠቃሚ ስምህን እና የይለፍ ቃልህን ተመልከት እና እንደገና ሞክር።"</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"ወደ አገልጋይ መገናኘት አይቻልም።"</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"ወደ አገልጋዩ ማገናኘት አይችልም።"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS ይጠየቃል ነገር ግን በአገልጋይ አይደገፍም።"</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"ማስጠንቀቂያ፣ መሣሪያህን ለማስተዳደር የኢሜይል ትግበራዎችን ኃላፊነት ማቦዘን የሚጠይቁትን ሁሉ የኢሜይል መለያዎች ከኢሜይል፣ ዕውቂያዎች፣ ቀን መቁጠሪያ ክስተቶች፣ እና ሌላ ውሂብ ጋር አብሮ ይሰርዛል።"</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"ደህንነት ዝማኔ"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> የደህንነት ቅንጅቶችህን ማዘመን ይጠይቅሃል።"</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"መለያ \"<xliff:g id="ACCOUNT">%s</xliff:g> \" የደህንነት ቅንብሮችን ማዘመን ይጠይቃል።"</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"የደህንነት አዘምን ይጠበቃል"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"በደህንነት ጥያቄዎች ምክንያት መለያ «<xliff:g id="ACCOUNT">%s</xliff:g>» ሊመሳሰል አልቻለም።"</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"መለያ \"<xliff:g id="ACCOUNT">%s</xliff:g>\" የደህንነት ቅንብሮችን ማዘመን ይጠይቃል።"</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"መለያ<xliff:g id="ACCOUNT">%s</xliff:g> የደህንነት ቅንብሮቹን ለውጧል፤ምንም የተጠቃሚ እርምጃ አይጠበቅም፡፡"</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"የደህንነት አዘምን ይጠበቃል"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"የደህንነት ቋሚ መመሪያዎች ተለውጠዎል"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"የደህንነት ቋሚ መመሪያዎች ሊሟሉ አይችሉም"</string>
<string name="account_security_title" msgid="3511543138560418587">"የመሣሪያ ደህንነት"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"<xliff:g id="SERVER">%s</xliff:g> አገልጋይየAndroid መሣሪያዎ አንዳንድገፅታዎች በርቀት ለመቆጣጠር እንዲፈቅዱ ይጠይቃል። ይህን መለያ ጨርሰው ለማቀናበር ይፈልጋሉ?"</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"ዝርዝሮችን አርትዕ"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"የእርስዎ የማያመቆለፊያ PIN ወይም ይለፍ ቃል ጊዜው አልፏል።"</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"የማያ ቆልፍ ይለፍ ቃል ጊዜው አልፏል"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"የማያ ቆልፍ ይለፍ ቃል ጊዜው እያለፈነው"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"የማያ መቆለፊያዎንPIN ወይም ይለፍቃል በቅርቡ መለወጥ አለብዎ፣ ወይም የ <xliff:g id="ACCOUNT">%s</xliff:g> ውሂብ ይሰረዛል። አሁን ይለወጥ?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"በቅርቡ የማሳያህ ቆልፍ ፒን ወይም የይለፍ ቃል መለወጥ ያስፈልግሃል፤ አለበለዚያ የ<xliff:g id="ACCOUNT">%s</xliff:g> ውሂብ ይሰረዛል። አሁን እንዲለወጥ ትፈልጋለህ?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"የማያ ቆልፍ ይለፍ ቃል ጊዜው አልፏል"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"የ<xliff:g id="ACCOUNT">%s</xliff:g> ውሂብ ከመሣሪያዎ ላይ ተሰርዟል።የማያ መቆለፊያ PIN ወይም ይለፍቃል በመለወጥ እነበረበት መመለስ ይችላሉ። አሁን ይለወጥ?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"የ<xliff:g id="ACCOUNT">%s</xliff:g> ውሂብ ከመሳሪያህ ላይ እየተሰረዘ ነው። የማያ መቆለፊያ PIN ወይም ይለፍ ቃል በመለወጥ እነበረበት መመለስ ትችላለህ። አሁን መለወጥ ትፈልጋለህ?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"ያልተቀመጠ ለውጦችን ይወገዱ?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"በመለያ መግባት አልተቻለም፡፡"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">" የ<xliff:g id="ACCOUNT">%s</xliff:g> ተጠቃሚ ስም ወይም ይለፍቃል የተሳሳተ ነው። አሁን ይዘምኑ?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"የ<xliff:g id="ACCOUNT">%s</xliff:g> የተጠቃሚው ስም ወይም ይለፍ ቃል የተሳሳተ ነው። አሁን ልታዘምናቸው ትፈልጋለህ?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"ነባሪ መለያ"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"ከዚህ መለያ በነባሪኢሜይል ላክ"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"አባሪዎችን አውርድ"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"ራስሰር-አውርድ አባሪዎች ወደ በቅርብ ጊዜ በWi-Fi የተላኩ መልዕክቶች"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"የኢሜይል ማሳወቂያ"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"ድግግሞሽ፣ ማሳወቂያዎች፣ ወዘተ አሳምር።"</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"ኢሜይል ሲደርስ በሁኔታ አሞሌ ውስጥ አሳውቅ"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"ኢሜይል ሲመጣ ማሳወቂያ አሳይ"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"የገቢ መልዕክት ምልከታ ድግግሞሽ"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"የገቢ ቅንብሮች"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"የተጠቃሚ ስም፣ ይለፍቃል፣ እና ሌላ የገቢ አገልጋይ ቅንብሮች"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"የወጪ ቅንብሮች"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"የተጠቃሚ ስም፣ ይለፍቃል፣ እና ሌላ የወጪ አገልጋይ ቅንብሮች"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"ቋሚ መመሪያዎችን አስገድድ"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"ምንም"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"ያልተደገፉ ቋሚ መመሪያዎች"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"ምንም"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"ማመሳሰል ሞክር"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"ይህን መለያ ለማመሳሰል እዚጋ ንካ"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"የመለያ ስም"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"ስምዎ"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"ፊርማ"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"ፈጣን ምላሾች"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"ኢሜይል ሲያቀናብሩ በተደጋጋሚ የሚያስገቡትን ፅሁፍ አርትዕ ያድርጉ"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"ኢሜይል ስትጽፍ በተደጋጋሚ የምታስገባውን ፅሁፍ አርትዕ አድርግ"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"ወደ ሚልኩት መለልዕክቶች ፅሁፍ ይጨምሩ"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"የማሳወቂያ ቅንብሮች"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"የውሂብ አጠቃቀም"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"የደህንነት ቋሚ መመሪያዎች"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"ፈጣን ምላሽ አርትዕ"</string>
<string name="save_action" msgid="1988862706623227093">"አስቀምጥ"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"ዕውቂያዎች አሳምር"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"ለዚህ መለያ እውቂያዎች አሳምር"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"የቀን አቆጣጠር አሳምር"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"ለዚህ መለያ የቀን አቆጣጠር አሳምር"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"የቀን አቆጣጠር አሳምር"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"ለዚህ መለያ የቀን መቁጠሪያ ክስተት አመሳስል"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"ኢሜይል አመሳስል"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"ለዚህ መለያ ኢሜይል አሳምር"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"ንዘር"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g>ውጤቶች ከ<xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"ቅንብሮች"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"አጠቃላይ"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"ጠቅላላ ቅንብሮች"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"መተግበሪያ"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"ራስ- ላቅ"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"መልዕክት ከሰረዝክ በኋላ በየትኛው ማያ ለማሳየት እንደምትፈልግ ምረጥ።"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"ኣመልካች ሳጥኖች ደብቅ"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"በመልዕክቶች ዝርዝሮች ውስጥ ለመምረጥ ንካና ያዝ"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"ከመሰረዝህ በፊት አረጋግጥ"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"መልእክቶች"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"ከመላክህ በፊት አረጋግጥ"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"መልእክቶች"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"ለ የላቀ"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"በጣም አዲስ መልዕክት"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"በጣም የድሮ መልዕክት"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"ውጤቶችን በመጠበቅ ላይ"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"አንዳንድ አገልጋዮች ረጅም ጊዜ ሊወስዱ ይችላሉ።"</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"አቃፊዎች"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"የመሳሪያውን ካሜራ መጠቀምን አትፍቀድ"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"የመሳሪያ የይለፍ ቃል ጠይቅ"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"የቅርብ የይለፍ ቃሎችን ዳግመኛ መጠቀምን ከልክል"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"የይለፍ ቃሎች ጊዜያቸው እንዲያልፍባቸው ይፈልጋል"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"ስራ የፈታን መሳሪያ ማሳያውን እንዲቆልፍ ይጠብቃል"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"የሚመሳሰሉ የቀን መቁጠሪያ ክስተቶችን ቁጥር ወሰን አድርግ"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"የሚመሳሰሉ ኢሜይሎችን ቁጥር ወሰን አድርግ"</string>
+ <string name="quick_1" msgid="3426057697353380951">"እናመሰግናለን!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"ለኔ ጥሩ ይመስላል!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"በኋላ ይሄንን አነባለው እና ወደ አንተ እመለሳለሁ፡፡"</string>
+ <string name="quick_4" msgid="3988974084396883051">"ስብሰባ እናዘጋጅ እስቲ ይሄንን ለመወያየት፡፡"</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"ውጫዊ አገልግሎት በማድረግ ጊዜ የዳራ ማመሳሰል ለዚህ መለያ ቦዝኗል፡፡"</string>
+ <string name="confirm_response" msgid="5747902757569543165">"ምላሽ በመላክ ላይ..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"መልዕክቶች የሉም።"</string>
</resources>
diff --git a/res/values-am/uploader.xml b/res/values-am/uploader.xml
index 5a0c08e94..6ec5625af 100644
--- a/res/values-am/uploader.xml
+++ b/res/values-am/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"ዝርዝሮች ደብቅ"</string>
<string name="menu_settings" msgid="5088116127086866634">"ቅንብሮች"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"%s ተሰቅሏል"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"መለያ"</string>
<string name="upload" msgid="2615541458361216022">"ስቀል"</string>
<string name="ok" msgid="2516349681897895312">"እሺ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 896f6ab39..8dbb6e808 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"قراءة مرفقات البريد الإلكتروني"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"للسماح لهذا التطبيق بقراءة مرفقات البريد الإلكتروني."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"للسماح للتطبيق بقراءة مرفقات البريد الإلكتروني."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"الدخول إلى بيانات موفر البريد الإلكتروني"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"للسماح للتطبيق بالدخول إلى قاعدة بيانات بريدك الإلكتروني، بما في ذلك الرسائل المتلقاة والرسائل المرسلة وأسماء المستخدمين وكلمات المرور."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"للسماح للتطبيق بالدخول إلى قاعدة بيانات بريدك الإلكتروني، بما في ذلك الرسائل المستلمة والرسائل المرسلة وأسماء المستخدمين وكلمات المرور."</string>
<string name="app_name" msgid="5815426892327290362">"بريد"</string>
<string name="compose_title" msgid="427986915662706899">"إنشاء"</string>
<string name="debug_title" msgid="5175710493691536719">"تصحيح الأخطاء"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"تم"</string>
<string name="create_action" msgid="3062715563215392251">"إنشاء رد جديد"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"حذف"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"ليست هناك ردود سريعة"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"ليست هناك ردود سريعة."</string>
<string name="discard_action" msgid="6532206074859505968">"إلغاء"</string>
<string name="save_draft_action" msgid="6413714270991417223">"حفظ المسودة"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"إدراج رد سريع"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"بحث"</string>
<string name="account_settings_action" msgid="4494079183315085171">"إعدادات الحساب"</string>
<string name="settings_action" msgid="6334807007967459412">"الإعدادات"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"خيارات المزامنة"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"خيارات المزامنة"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"تعليمها بـ \"غير مقروءة\""</string>
<string name="move_action" msgid="3059189775933985898">"نقل"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+نسخة إلى/ مخفية"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> كتَب:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"إدراج النص المقتبس"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"تضمين نص"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"يلزم إضافة مستلم واحد على الأقل."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"أضف مستلمًا واحدًا على الأقل."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"بعض عناوين البريد الإلكتروني غير صالحة"</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"الملف كبير جدًا بحيث لا يمكن إرفاقه."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"إدراج رد سريع"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"تم الحفظ"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"إيقاف"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"تم حفظ المرفق باسم <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"تعذر حفظ المرفق."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"ملاحظة: هناك واحد أو أكثر من المرفقات في الرسالة المعاد توجيهها سيتم تنزيله قبل الإرسال."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"تعذر حفظ المرفق."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"سيتم تنزيل مرفق أو أكثر في الرسالة التي تمت إعادة توجيهها قبل الإرسال."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"الرسالة"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"دعوة"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"تتعذر إعادة توجيه واحد أو أكثر من المرفقات."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"لم تتم إعادة توجيه المرفق"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"أخفق تسجيل الدخول إلى <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"لم يتم تسجيل <xliff:g id="ACCOUNT_NAME">%s</xliff:g> بنجاح."</string>
<string name="login_failed_title" msgid="7624349996212476176">"تعذر تسجيل الدخول"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> بايت"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"أقدم"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"إعداد الحساب"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"إضافة حساب Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"إضافة حساب Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"حساب بريد إلكتروني"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"يمكنك إعداد البريد الإلكتروني لمعظم الحسابات من خلال اتباع خطوات قليلة."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"يمكنك إعداد حساب Exchange من خلال اتباع خطوات قليلة."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"يمكنك إعداد حساب Exchange ActiveSync من خلال اتباع خطوات قليلة."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"يمكنك إعداد حسابك من خلال اتباع خطوات قليلة."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"عنوان البريد الإلكتروني"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"كلمة المرور"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"إرسال الرسائل الإلكترونية من هذا الحساب افتراضيًا."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"إرسال البريد الإلكتروني من هذا الحساب افتراضيًا"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"إعداد يدوي"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"اكتب عنوان بريد إلكتروني وكلمة مرور صالحين."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"حساب متكرر"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"جارٍ فحص إعدادات خادم البريد الوارد…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"جارٍ فحص إعدادات خادم البريد الصادر…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"إعداد الحساب"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"تمّ إعداد حسابك، وستصلك رسالة إلكترونية قريبًا!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"تمّ إعداد حسابك، وستصلك رسالة إلكترونية بعد قليل."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"تسمية هذا الحساب (اختياري)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"الاسم (يظهر في الرسائل الصادرة)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"لا يمكن أن يكون هذا الحقل فارغًا."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"إعدادات خادم البريد الوارد"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"اسم المستخدم"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"كلمة المرور"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"خادم POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"خادم IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"الخادم"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"المنفذ"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"نوع الأمان"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"لا شيء"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"خادم SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"المنفذ"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"نوع الأمان"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"يلزم تسجيل الدخول."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"طلب تسجيل الدخول"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"اسم المستخدم"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"كلمة المرور"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"إعداد الحساب"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"كل 15 دقيقة"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"كل 30 دقيقة"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"كل ساعة"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"إرسال الرسائل الإلكترونية من هذا الحساب افتراضيًا."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"تنبيهي عند استلام رسالة إلكترونية."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"مزامنة جهات الاتصال من هذا الحساب."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"مزامنة التقويم من هذا الحساب أيضًا."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"مزامنة البريد الإلكتروني من هذا الحساب"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"إرسال البريد الإلكتروني من هذا الحساب افتراضيًا"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"تنبيهي عند استلام رسالة إلكترونية"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"مزامنة جهات الاتصال من هذا الحساب"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"مزامنة التقويم من هذا الحساب"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"مزامنة البريد الإلكتروني من هذا الحساب"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"تنزيل المرفقات تلقائيًا عند الاتصال بشبكة Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"تعذر الإنهاء"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"الأيام المطلوب مزامنتها"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"شهر واحد"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"الكل"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"استخدام الإعدادات الافتراضية للحساب"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"اسم المستخدم أو كلمة المرور غير صحيحة."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"اسم المستخدم أو كلمة المرور غير صحيحة."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"اسم المستخدم غير صحيح أو كلمة مرور غير صحيحة."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"اسم المستخدم غير صحيح أو كلمة المرور غير صحيحة."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"لا يمكن الاتصال بالخادم بأمان."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"لا يمكن الاتصال بالخادم بأمان."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"شهادة العميل مطلوبة. هل تريد الاتصال بالخادم باستخدام شهادة العميل؟"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"الشهادة غير صالحة أو لا يمكن الدخول إليها."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"لقد استجاب الخادم بخطأ. تحقق من اسم المستخدم وكلمة المرور ثم أعد المحاولة."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"يستلزم الأمر شهادة عميل. هل تريد الاتصال بالخادم باستخدام شهادة عميل؟"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"الشهادة غير صالحة أو يتعذر الدخول إليها."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"لقد استجاب الخادم بخطأ. تحقق من اسم المستخدم وكلمة المرور ثم أعد المحاولة."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"لا يمكن الاتصال بالخادم."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"لا يمكن الاتصال بالخادم."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"يلزم وجود TLS لكن لا يتيح الخادم استخدامه."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"تحذير: سيؤدي إلغاء تنشيط صلاحية تطبيق البريد الإلكتروني لإدارة الجهاز إلى حذف جميع حسابات البريد الإلكتروني التي تتطلب الصلاحية، وأيضًا حذف البريد الإلكتروني وجهات الاتصال وأحداث التقويم وغيرها من البيانات."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"تحديث أمني"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"يتطلب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" تحديث إعدادات الأمان."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"يتطلب الحساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" تحديث إعدادات الأمان."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"تحديث الأمان مطلوب"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"تتعذر مزامنة الحساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" بسبب متطلبات الأمان."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"يتطلب الحساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" تحديث إعدادات الأمان."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"غير الحساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" إعدادات الأمان له؛ ولا يلزم اتخاذ أي إجراء من قبل المستخدم."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"يلزم تحديث الأمان"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"لقد تغيرت سياسات الأمان"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"لا يمكن تلبية سياسات الأمان"</string>
<string name="account_security_title" msgid="3511543138560418587">"أمان الجهاز"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"يتطلب الخادم <xliff:g id="SERVER">%s</xliff:g> أن تسمح له بالتحكم في بعض ميزات الأمان في جهاز Android عن بعد."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"تعديل التفاصيل"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"لقد انتهت صلاحية رقم التعريف الشخصي (PIN) أو كلمة مرور لتأمين الشاشة."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"انتهت كلمة مرور تأمين الشاشة"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"ستنتهي صلاحية كلمة مرور تأمين الشاشة"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"يجب تغيير رقم التعريف الشخصي (PIN) أو كلمة المرور الخاصة بتأمين الشاشة قريبًا، أو سيتم محو بيانات <xliff:g id="ACCOUNT">%s</xliff:g>. هل تريد التغيير الآن؟"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"يلزمك تغيير رقم التعريف الشخصي لشاشة التأمين أو كلمة المرور قريبًا، وإلا فسيتم محو بيانات <xliff:g id="ACCOUNT">%s</xliff:g>. هل تريد تغييره الآن؟"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"انتهت كلمة مرور تأمين الشاشة"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"يتم حاليًا محو بيانات <xliff:g id="ACCOUNT">%s</xliff:g> من جهازك. ويمكنك استعادتها من خلال تغيير رقم التعريف الشخصي (PIN) أو كلمة مرور الخاصة بتأمين الشاشة. هل تريد التغيير الآن؟"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"تتم الآن إزالة بيانات <xliff:g id="ACCOUNT">%s</xliff:g> من جهازك. يمكنك استعادتها من خلال تغيير رقم التعريف الشخصي لشاشة التأمين أو كلمة المرور. هل تريد تغييره الآن؟"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"أتريد إلغاء أي تغييرات غير محفوظة؟"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"تعذر تسجيل الدخول"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"اسم المستخدم أو كلمة مرور <xliff:g id="ACCOUNT">%s</xliff:g> غير صحيحة. هل تريد التحديث الآن؟"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"اسم المستخدم أو كلمة المرور للحساب <xliff:g id="ACCOUNT">%s</xliff:g> غير صحيح؟. هل تريد تحديثهما الآن؟"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"الحساب الافتراضي"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"إرسال البريد الإلكتروني من هذا الحساب افتراضيًا"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"تنزيل المرفقات"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"تنزيل مرفقات الرسائل الأخيرة تلقائيًا عبر WiFi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"إشعارات البريد إلكتروني"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"معدل المزامنة والتنبيهات وما إلى ذلك"</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"التنبيه في شريط النظام عند استلام رسالة إلكترونية"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"إرسال إشعار عند وصول بريد إلكتروني"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"معدل الإطلاع على البريد الوارد"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"إعدادات البريد الوارد"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"اسم المستخدم وكلمة المرور وإعدادات خادم الوارد الأخرى"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"إعدادات البريد الصادر"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"اسم المستخدم وكلمة المرور وإعدادات خادم الصادر الأخرى"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"السياسات المطبقة"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"بلا"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"سياسات غير معتمدة"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"بلا"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"محاولة المزامنة"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"المس هنا لمزامنة الحساب"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"اسم الحساب"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"الاسم"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"التوقيع"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"الردود السريعة"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"تعديل النص الذي تدرجه بشكل متكرر عند إنشاء رسائل إلكترونية"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"تعديل النص الذي تدرجه بشكل متكرر عند إنشاء رسالة إلكترونية"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"إلحاق نص بالرسائل التي يتم إرسالها"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"إعدادات التنبيه"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"استخدام البيانات"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"سياسات الأمان"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"تعديل رد سريع"</string>
<string name="save_action" msgid="1988862706623227093">"حفظ"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"مزامنة جهات الاتصال"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"مزامنة جهات الاتصال لهذا الحساب"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"مزامنة التقويم"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"مزامنة التقويم لهذا الحساب"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"مزامنة التقويم"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"مزامنة حدث التقويم لهذا الحساب"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"مزامنة البريد الإلكتروني"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"مزامنة البريد الإلكتروني لهذا الحساب"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"اهتزاز"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> من النتائج من <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"الإعدادات"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"عامة"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"الإعدادات العامة"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"التطبيق"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"التقدم التلقائي"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"اختيار الشاشة التي تظهر بعد حذف رسالة"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"إخفاء مربعات الاختيار"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"في قوائم الرسائل، المس مع الاستمرار للتحديد"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"تأكيد قبل الحذف"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"الرسائل"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"تأكيد قبل الإرسال"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"الرسائل"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"التوجه إلى"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"رسالة أحدث"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"رسائل أقدم"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"في انتظار النتائج"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"قد يستغرق بعض الخوادم وقتًا طويلاً."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"المجلدات"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"عدم السماح لاستخدام كاميرا الجهاز"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"يلزم كلمة مرور الجهاز"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"تقييد إعادة استخدام كلمات المرور الأخيرة"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"يلزم انتهاء صلاحية كلمات المرور"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"يلزم جهاز بوضع الخمول لتأمين شاشته"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"تقييد عدد أحداث التقويم المتزامنة"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"تقييد عدد الرسائل الإلكترونية المتزامنة"</string>
+ <string name="quick_1" msgid="3426057697353380951">"شكرًا!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"يبدو جيدًا بالنسبة إليّ!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"سأقرأ هذا لاحقًا، وسأرد عليك."</string>
+ <string name="quick_4" msgid="3988974084396883051">"دعونا نعد اجتماعًا لمناقشة هذا الأمر."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"تم تعطيل المزامنة في الخلفية لهذا الحساب أثناء التجوال."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"جارٍ إرسال الرد..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"ليست هناك أية رسائل."</string>
</resources>
diff --git a/res/values-ar/uploader.xml b/res/values-ar/uploader.xml
index dae9b4c36..dd150b164 100644
--- a/res/values-ar/uploader.xml
+++ b/res/values-ar/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"إخفاء التفاصيل"</string>
<string name="menu_settings" msgid="5088116127086866634">"الإعدادات"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"تم تحميل %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"الحساب"</string>
<string name="upload" msgid="2615541458361216022">"تحميل"</string>
<string name="ok" msgid="2516349681897895312">"موافق"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 14a8c4ead..82f396082 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Чытаць далучаныя файлы ў электроннай пошце"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Дазваляе прыкладанням чытаць далучаныя файлы ў вашай электроннай пошце."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Дазваляе прыкладанням чытаць вашыя далучэнні да электронных лістоў."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Доступ да дадзеных пастаўшчыка паслуг электроннай пошты"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Дазваляе гэтаму прыкладанню атрымліваць доступ да базы дадзеных вашай электроннай пошты, у тым ліку да атрыманых і адпраўленых паведамленняў, імёнаў карыстальнікаў і пароляў."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Дазваляе прыкладанням атрымліваць доступ да базы дадзеных вашай электроннай пошты, у тым ліку да атрыманых і адпраўленых паведамленняў, імёнаў карыстальнікаў і пароляў."</string>
<string name="app_name" msgid="5815426892327290362">"Электронная пошта"</string>
<string name="compose_title" msgid="427986915662706899">"Напісаць"</string>
<string name="debug_title" msgid="5175710493691536719">"Адладка"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Зроблена"</string>
<string name="create_action" msgid="3062715563215392251">"Стварыць"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Выдаліць"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Няма хуткіх адказаў"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Хуткіх адказаў няма."</string>
<string name="discard_action" msgid="6532206074859505968">"Адхіліць"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Захаваць праект"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Уставіць хуткі адказ"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Пошук"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Налады ўліковага запісу"</string>
<string name="settings_action" msgid="6334807007967459412">"Налады"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Параметры сінхранізацыі"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Параметры сінхранізацыі"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Пазначыць як непрачытанае"</string>
<string name="move_action" msgid="3059189775933985898">"Перанесці"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Копія/УК"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"Карыстальнiк <xliff:g id="SENDER">%s</xliff:g> пісаў: "\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Уключыць цытаваны тэкст"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Уключыць тэкст"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Неабходна дадаць хаця б аднаго атрымальніка."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Дадайце хаця б аднаго атрымальнiка."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Некаторыя адрасы электроннай пошты несапраўдныя."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Файл занадта вялікі для далучэння."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Уставіць хуткі адказ"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Захавана"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Спыніць"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Укладанне захаванае як <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Немагчыма захаваць далучаны файл."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Нататка. Адно або некалькі ўкладанняў у перанапраўленным паведамленні будуць загружаныя перад адпраўкай."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Немагчыма захаваць далучэнне."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Адзін або некалькі далучаных файлаў у пераадрасаваным паведамленні будуць перад адпраўкай спампаваны."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Паведамленне"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Запрасіць"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Не атрымалася перанакiраваць адзін або некалькі далучаных файлаў."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Далуч. файлы не перасылаюцца"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Не атрымалася ўвайсцi ва ўлiковы запiс <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Няўдалы ўваход з уліковага запісу <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Не атрымалася ўвайсці"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> Б"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Старэйшы"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" ... "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Усталяванне ўліковага запісу"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Дадаць уліковы запіс Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Дадаць уліковы запіс Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Уліковы запіс электроннай пошты"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Вы можаце наладзіць электронную пошту для вялiкай колькасцi ўлiковых запiсаў усяго за некалькі крокаў."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Вы можаце наладзіць улiковы запiс Exchange ўсяго за некалькі крокаў."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Вы можаце наладзіць уліковы запіс Exchange ActiveSync усяго за некалькі крокаў."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Вы можаце зарэгістраваць свой уліковы запіс усяго за некалькі крокаў."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Адрас электроннай пошты"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Пароль"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Адпраўляць пошту з гэтага уліковага запісу па змаўчанні."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Адпраўляць пошту з гэтага ўліковага запісу па змаўчанні"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Самастойнае ўсталяванне"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Увядзіце правільны адрас электроннай пошты і пароль."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Дублікат уліковага запісу"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Праверка ўваходных налад сервера..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Праверка выходных налад сервера..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Усталяванне ўліковага запісу"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Ваш уліковы запіс створаны, электронная пошта адпраўленая"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Уліковы запіс створаны, электронная пошта адпраўляецца."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Дайце гэтаму ўліковаму запісу назву (не абавязкова)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Вашае імя (адлюстроўваецца на выходных паведамленнях)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Гэта поле не можа быць пустым"</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Уваходныя параметры сервера"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Імя карыстальніка"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Пароль"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3-сервер"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Сервер IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Сервер"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Порт"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Тып бяспекі"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Няма"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Сервер SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Порт"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Тып бяспекі"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Патрабаваць ўваход ў сістэму."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Патрабаваць уваход"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Імя карыстальніка"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Пароль"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Усталяванне ўліковага запісу"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Кожныя 15 хвілін"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Кожныя 30 хвілін"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Кожную гадзіну"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Адпраўляць пошту з гэтага ўліковага запісу па змаўчанні."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Паведамляць мне пры атрыманні паведамлення электроннай пошты."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Сінхранізаваць кантакты з гэтага ўліковага запісу."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Сінхранізаваць календар з гэтага ўліковага запісу."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Сінхранізацыя электроннай пошты з гэтага ўліковага запісу."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Адпраўляць пошту з гэтага ўліковага запісу па змаўчанні"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Паведамляць мне аб атрыманні электроннай пошты"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Сінхранізаваць кантакты з гэтага ўліковага запісу"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Сінхранізаваць каляндар з гэтага ўліковага запісу"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Сінхранізаваць электронную пошту з гэтага ўліковага запісу"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Аўтаматычна спампоўваць далучаныя файлы пры падключэнні да Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Не атрымалася скончыць"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Дні для сінхранізацыі"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Адзін месяц"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Усе"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Выкарыстоўваць параметры ўліковага запісу па змаўчанню"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Няправільнае імя карыстальніка ці пароль."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Няправільнае імя карыстальніка ці пароль. "\n" (<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Няправiльны пароль цi iмя карыстальнiка."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Імя карыстальніка ці пароль няправільныя."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Не атрымлiваецца ўсталяваць бяспечнае злучэнне з серверам."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Не атрымліваецца ўсталяваць бяспечнае злучэнне з серверам."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Патрабуецца сертыфікат кліента. Падключыцца да сервера з сертыфікатам кліента?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Сертыфікат несапраўдны або недаступны."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Сервер адказаў з памылкай; праверце свае імя карыстальніка і пароль і паспрабуйце яшчэ раз."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Патрабуецца сертыфікат кліента. Жадаеце падключыцца да сервера з сертыфікатам кліента?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Несапраўдны або недаступны сертыфікат."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Адказ сервера змяшчае памылку. Праверце сваe імя карыстальніка і пароль, а потым паспрабуйце яшчэ раз."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Немагчыма падключыцца да сервера."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Не атрымлiваецца падлучыцца да сервера."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS патрабуецца, але не падтрымліваецца серверам."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"УВАГА! Адключэнне кіравання прыкладаннем электроннай пошты, прызначаным для адміністравання вашай прылады, прывядзе да выдалення ўсiх уліковых запісаў электроннай пошты, якія яго патрабуюць, разам з электроннай поштай, кантактамі, мерапрыемствамi календара і іншымі дадзенымі."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Абнаўленне бяспекі"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Патрэбна абнавіць налады бяспекі ўлiковага запiсу <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Уліковы запіс \"<xliff:g id="ACCOUNT">%s</xliff:g>\" патрабуе абнаўлення налад бяспекі."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Абнавіце сістэму бяспекі"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Немагчыма сiнхранiзаваць улiковы запiс \"<xliff:g id="ACCOUNT">%s</xliff:g>\" з-за патрабаванняў бяспекі."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Уліковы запіс \"<xliff:g id="ACCOUNT">%s</xliff:g>\" патрабуе абнаўлення налад бяспекі."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Змянiлiся налады бяспекi для ўлiковага запiсу \"<xliff:g id="ACCOUNT">%s</xliff:g>\". Не патрабуюцца дзеяннi карыстальнiка."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Абнавіце сістэму бяспекі"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Правiлы бяспекі змяніліся"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Немагчыма выконваць правiлы бяспекі"</string>
<string name="account_security_title" msgid="3511543138560418587">"Бяспека прылады"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Сервер <xliff:g id="SERVER">%s</xliff:g> патрабуе дазволу аддалена кіраваць некаторымі функцыямі бяспекі вашай прылады Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Рэдагаваць дэталі"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Скончыўся тэрмін дзеяння вашага PIN-кода альбо пароля блакавання экрана."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Скончылася дзеянне пароля блак. экрана"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Заканчваецца дзеянне пароля блак. экрана"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Вы павінны змяніць свой ​​PIN-код альбо пароль блакавання экрана ў бліжэйшы час, у адваротным выпадку дадзеныя ўліковага запісу <xliff:g id="ACCOUNT">%s</xliff:g> будуць выдаленыя. Змяніць цяпер?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Вы павінны змяніць свой ​​PIN-код для блакiроўкi экрана або пароль у бліжэйшы час, iнакш дадзеныя для ўліковага запісу <xliff:g id="ACCOUNT">%s</xliff:g> будуць выдалены. Змяніць PIN-код зараз?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Скончылася дзеянне пароля блак. экрана"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Дадзеныя для ўліковага запісу <xliff:g id="ACCOUNT">%s</xliff:g> выдаляюцца з памяці прылады. Вы можаце аднавіць іх, змяніўшы ПІН-код альбо пароль блакавання экрана. Змяніць цяпер?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Дадзеныя для ўліковага запісу <xliff:g id="ACCOUNT">%s</xliff:g> выдаляюцца з памяці прылады. Вы можаце аднавіць іх пры змене PIN-кода для блакiроўкi экрана або пароля. Змяніць яго цяпер?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Скасаваць незахаваныя змяненні?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Не атрымалася ўвайсці"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Імя карыстальніка і пароль для ўваходу ва ўліковы запіс <xliff:g id="ACCOUNT">%s</xliff:g> не сапраўдныя. Абнавіць іх цяпер?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Імя карыстальніка і пароль для ўліковага запісу <xliff:g id="ACCOUNT">%s</xliff:g> няправільныя. Абнавіць іх зараз?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Уліковы запіс па змаўчанні"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Адпраўляць пошту з гэтага ўліковага запісу па змаўчанні"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Спампаваць далучэнні"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Аўтаматычнае спампаванне далучэнняў з апошніх паведамленняў праз Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Апавяшчэннi па электроннай пошце"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Сінхранізаваць частату, паведамленні і г. д."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Паведамляць аб атрыманні электроннага ліста ў сістэмным радку"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Дасылаць апавяшчэнне пры атрыманні электроннай пошты"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Частата праверкі ўваходных паведамленняў"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Уваходныя налады"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Імя карыстальніка, пароль і іншыя налады сервера ўвах. паведамл."</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Выходныя налады"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Імя карыстальніка, пароль і іншыя налады сервера вых. паведамл."</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Правiлы парушаны"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Няма"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Правiлы не падтрымліваюцца"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Няма"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Спроба сінхранізацыі"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Націсніце тут, каб сінхранізаваць гэты ўліковы запіс"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Назва уліковага запісу:"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Вашае імя"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Подпіс"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Хуткія адказы"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Змяніць тэкст, які часта ўстаўляецца пры напiсанні паведамлення"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Змяніць тэкст, які часта ўстаўляецца пры напiсанні паведамлення"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Дадаць тэкст у паведамленні, што вы адпраўляеце"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Налады апавяшчэнняў"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Выкарыстанне дадзеных"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Правiлы бяспекі"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Змяніць хуткі адказ"</string>
<string name="save_action" msgid="1988862706623227093">"Захаваць"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Сінхранізаваць кантакты"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Сінх. кантактаў для гэтага ўл. зап."</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Сінхр. каляндар"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Сінх. каляндар для гэтага ўл. зап."</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Сінхранізаваць каляндар"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Сінхр.. мерапр. для гэтага ўл. зап."</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Сінхранізаваць электронную пошту"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Сінхранізацыя электроннай пошты для гэтага ўліковага запісу"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Вібрацыя"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"Вынікі (<xliff:g id="RESULTS">%1$d</xliff:g>) з дамену <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Налады"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Агульныя"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Агульныя налады"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Прыкладанне"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Аўтаматычна рухацца наперад"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Выберыце экран, якi будзе паказвацца пасля выдалення паведамлення"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Схаваць палі"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Націсніце на паведамленне ў спісе i ўтрымлівайце яго, каб выбраць"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Пацвердзіць перад выдаленнем"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Паведамленні"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Пацвердзіць перад адпраўкай"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Паведамленні"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Пераход да"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Навейшае паведамленне"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Больш даўняе паведамленне"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Чаканне вынікаў"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Некаторыя серверы могуць заняць працяглы час."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Папкі"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Забараніць выкарыстанне камеры прылады"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Патрабаваць пароль прылады"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Абмежаваць паўторнае выкарыстанне апошніх пароляў"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Запытаць заканчэнне дзеяння пароля"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Патр. рэж. праст. прыл. для блак. экр."</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Абмежаванне колькасці сінхр. мерапр. календара"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Абмежаванне колькасці сінхр. паведамл. эл. пошты"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Дзякуй!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Гучыць нядрэнна!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Я прачытаю гэта пазней i звяжуся з вамi."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Давайце прызначым сустрэчу, каб абмеркаваць гэта."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Фонавая сінхранізацыя для гэтага ўліковага запісу адключана ў роўмінгу."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Адпраўка адказу..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Паведамленняў няма."</string>
</resources>
diff --git a/res/values-be/uploader.xml b/res/values-be/uploader.xml
index eef060d2e..f8aee8e6e 100644
--- a/res/values-be/uploader.xml
+++ b/res/values-be/uploader.xml
@@ -28,7 +28,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Схаваць падрабязнасці"</string>
<string name="menu_settings" msgid="5088116127086866634">"Налады"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Загружана %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Уліковы запіс"</string>
<string name="upload" msgid="2615541458361216022">"Загрузіць"</string>
<string name="ok" msgid="2516349681897895312">"ОК"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 682c96a2d..d9dca7a87 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Четене на прикачени файлове в имейла"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Разрешава на това приложение да чете прикачените файлове в имейла ви."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Разрешава на приложението да чете прикачените файлове в имейла ви."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Достъп до данни на доставчика на имейл"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Дава на това приложение достъп до базата от данни на имейла ви, включително получени и изпратени съобщения, потребителски имена и пароли."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Дава на приложението достъп до базата от данни на имейла ви, включително получени и изпратени съобщения, потребителски имена и пароли."</string>
<string name="app_name" msgid="5815426892327290362">"Имейл"</string>
<string name="compose_title" msgid="427986915662706899">"Ново съобщение"</string>
<string name="debug_title" msgid="5175710493691536719">"Отстраняване на грешки"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Готово"</string>
<string name="create_action" msgid="3062715563215392251">"Създаване на нов"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Изтриване"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Няма бързи отговори"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Няма бързи отговори."</string>
<string name="discard_action" msgid="6532206074859505968">"Отхвърляне"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Запазване на чернова"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Вмъкване на бърз отговор"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Търсене"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Настройки на профил"</string>
<string name="settings_action" msgid="6334807007967459412">"Настройки"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Опции за синхронизиране"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Опции за синхронизиране"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Непрочетено"</string>
<string name="move_action" msgid="3059189775933985898">"Местене"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Як/Ск"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> написа:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Включване на цитирания текст"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Включване на текста"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Трябва да добавите поне един получател."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Добавете поне един получател."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Някои имейл адреси са невалидни."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Файлът е твърде голям за прикачване."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Вмъкване на бърз отговор"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Запазено"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Стоп"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Запазен прикачен файл: <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Прикач. файл не бе запазен."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Забележка: Един или повече прикачени файла в препратеното ви съобщение ще бъдат изтеглени преди изпращане."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Прикач. файл не бе запазен."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Един или повече прикачени файла в препратеното ви съобщение ще бъдат изтеглени преди изпращане."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Съобщение"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Покана"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Един или повече прикачени файла не можаха да се препратят."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Прикаченото не бе препратено"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Не влязохте: <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Не успяхте да влезете в профила си <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Не можах да вляза в профила си"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> Б"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"По-стари"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Настройка на профила"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Добавяне на нов профил от Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Добавяне на нов профил от Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Имейл профил"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Можете да настроите имейла за повечето профили само с няколко стъпки."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Можете да настроите профил в Exchange само с няколко стъпки."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Можете да настроите профил в Exchange ActiveSync само с няколко стъпки."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Можете да настроите профила си само с няколко стъпки."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Имейл адрес"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Парола"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Изпращане на имейл от този профил по подразбиране."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Изпращане на имейл от този профил по подразбиране"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ръчна настройка"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Въведете валиден имейл адрес и парола."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Дублиращ профил"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Настройките на вх. сървър се проверяват..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Настройките на изх. сървър се проверяват..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Настройка на профила"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Профилът ви е настроен и имейлите са на път!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Профилът ви е настроен и имейлите са на път!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Именуване на този профил (незадължително)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Името ви (показвано в изходящи съобщения)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Това поле трябва да се попълни."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Настройки на входящия сървър"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Потребителско име"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Парола"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3 сървър"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP сървър"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Сървър"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Порт"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Вид защита"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Няма"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP сървър"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Порт"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Вид защита"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Изисква влизане в профил."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Изисква влизане в профил"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Потребителско име"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Парола"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Настройка на профила"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"На всеки 15 мин"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"На всеки 30 мин"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"На всеки час"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Изпращане на имейл от този профил по подразбиране."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Известие при пристигане на имейл."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Синхронизиране на контактите в този профил."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Синхронизиране на календара в този профил."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Синхрон на имейлите от този профил"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Изпращане на имейл от този профил по подразбиране"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Известие при получаване на имейл"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Синхронизиране на контактите в този профил"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Синхронизиране на календара в този профил"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Синхронизиране на имейлите от този профил"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Автоматично изтегляне на прикачените файлове при връзка с Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Не можа да завърши"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Дни за синхронизиране"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Един месец"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Всички"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Стандартното за профила"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Неправилно потребителско име или парола."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Неправилно потребителско име или парола."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Неправилно потребителско име или парола."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Неправилно потребителско име или парола."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Не може да се осъществи безопасна връзка със сървъра."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Не може да се осъществи безопасна връзка със сървъра."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Изисква се сертификат за клиентска програма. Да се установи ли връзка със сървъра чрез него?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Сертификатът е невалиден или недостъпен."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Сървърът отговори с грешка. Проверете потребителското име и паролата си и опитайте отново."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Изисква се сертификат за клиентска програма. Да се установи ли връзка със сървъра чрез него?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Сертификатът е невалиден или недостъпен."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Сървърът отговори с грешка. Проверете потребителското име и паролата си, след което опитайте отново."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Не може да се осъществи връзка със сървъра."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Не може да се осъществи връзка със сървъра."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"Изисква се TLS, но не се поддържа от сървъра."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"ПРЕДУПРЕЖДЕНИЕ: Деактивирането на възможността приложението Имейл да администрира устройството ви ще изтрие всички имейл адреси, които го изискват, заедно с имейлите, контактите, събитията от календара и други данни в тях."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Атуализация на защитата"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> изисква да актуализирате защитните си настройки."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Профилът „<xliff:g id="ACCOUNT">%s</xliff:g>“ изисква актуализация на защитните настройки."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Изисква се актуална защита"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Профилът „<xliff:g id="ACCOUNT">%s</xliff:g>“ не може да бъде синхронизиран поради изискванията за сигурност."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Профилът „<xliff:g id="ACCOUNT">%s</xliff:g>“ изисква актуализация на настройките за сигурност."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Настройките за сигурност на профила „<xliff:g id="ACCOUNT">%s</xliff:g>“ са променени. Не е необходимо действие от страна на потребителя."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Актуализирайте за сигурност"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Променени правила за сигурност"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Неизпълнени правила за сигурност"</string>
<string name="account_security_title" msgid="3511543138560418587">"Сигурност на устройството"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Сървърът <xliff:g id="SERVER">%s</xliff:g> изисква отдалечен контрол над някои от защитните функции на устройството ви с Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Редактиране на подробностите"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"PIN кодът или паролата за заключен екран изтече."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Паролата изтече"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Паролата за заключен екран изтича"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Трябва скоро да промените PIN кода или паролата си за заключен екран или данните за <xliff:g id="ACCOUNT">%s</xliff:g> ще бъдат изтрити. Искате ли да извършите промяната сега?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Трябва скоро да промените ПИН кода или паролата си за заключен екран или данните за <xliff:g id="ACCOUNT">%s</xliff:g> ще бъдат изтрити. Искате ли да извършите промяната сега?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Паролата за заключен екран изтече"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Данните за <xliff:g id="ACCOUNT">%s</xliff:g> се изтриват от устройството ви. Можете да ги възстановите, като промените PIN кода или паролата си за заключен екран. Искате ли да извършите промяната сега?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Данните за <xliff:g id="ACCOUNT">%s</xliff:g> се изтриват от устройството ви. Можете да ги възстановите, като промените ПИН кода или паролата си за заключен екран. Искате ли да извършите промяната сега?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Да се отхвърлят ли незапазените промени?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Не можах да вляза в профила си"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Потребителското име или паролата за <xliff:g id="ACCOUNT">%s</xliff:g> не са правилни. Искате ли да ги актуализирате сега?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Неправилно потребителско име или парола за <xliff:g id="ACCOUNT">%s</xliff:g>. Искате ли да ги актуализирате сега?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Основен профил"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Изпращане на имейл от този профил по подразбиране"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Изтегляне на прикачените файлове"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Автоизтегляне на прик. файлове към скорошни съобщения през Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Известия за имейл"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Честота на синхронизиране, известия и т.н."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Известие в системната лента при получаване на имейл"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Изпращане на известие при получаване на имейл"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Честота на проверяване за входяща поща"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Входящи настройки"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Потребителско име, парола и други настройки на входящия сървър"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Изходящи настройки"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Потребителско име, парола и други настройки на изходящия сървър"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Наложени правила"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Нито едно"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Неподдържани правила"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Нито едно"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Опит за синхронизиране"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Докоснете тук, за да синхронизирате този профил"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Име на профила"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Името ви"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Подпис"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Бързи отговори"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Редактиране на текст, който често вмъквате при писане на имейли"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Редактиране на текст, който често вмъквате при писане на имейл"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Прибавяне на текст към изпращаните от вас съобщения"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Настройки за известия"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Използване на данни"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Правила за сигурност"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Редактиране на бърз отговор"</string>
<string name="save_action" msgid="1988862706623227093">"Запазване"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Синхронизиране на контакти"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Синхр. на контактите за този профил"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Синхрон на календара"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Синхрон на календара за този профил"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Синхронизиране на календар"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Синхр. на календарно събитие за профила"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Синхрон на имейлите"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Синхрон на имейлите за този профил"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Вибриране"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> резултата от <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Настройки"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Общи"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Общи настройки"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Приложение"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Автоматично преминаване"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Изберете екран, който да се показва след изтриване на съобщение"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Квадратчета за отметка: Скриване"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"В списъците със съобщения докоснете и задръжте, за да изберете"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Потвърждаване преди изтриване"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Съобщения"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Потвърждаване преди изпращане"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Съобщения"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Преминаване към"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"По-ново съобщение"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"По-старо съобщение"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Резултатите се изчакват"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Някои сървъри може да отнемат много време."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Папки"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Забраняване на използването на камерата"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Изискване на парола за устройството"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Без повторно ползване на скорошни пароли"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Изискване паролите да изтичат"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Неактивно у-во за заключ. на екрана"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Ограничаване на броя синхрон. събития в календара"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Ограничаване на броя синхронизирани имейли"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Благодаря!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Звучи добре!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Ще прочета това по-късно и ще се свържа с Вас."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Нека да насрочим среща, за да обсъдим това."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Синхронизирането на заден план за този профил е деактивирано при роуминг."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Отговорът се изпраща..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Няма съобщения."</string>
</resources>
diff --git a/res/values-bg/uploader.xml b/res/values-bg/uploader.xml
index 1c38811e6..74ce71deb 100644
--- a/res/values-bg/uploader.xml
+++ b/res/values-bg/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Скриване на подробностите"</string>
<string name="menu_settings" msgid="5088116127086866634">"Настройки"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Качени: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Профил"</string>
<string name="upload" msgid="2615541458361216022">"Качване"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index c2cb7a512..3bf2bb50c 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Llegeix els fitxers adjunts al correu electrònic"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Permet que aquesta aplicació llegeixi els fitxers adjunts al correu electrònic."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permet que l\'aplicació llegeixi els fitxers adjunts al correu electrònic."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Accedeix a les dades del proveïdor de correu electrònic"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Permet que aquesta aplicació accedeixi a la base de dades del teu correu electrònic, inclosos els missatges rebuts, els missatges enviats, els noms d\'usuari i les contrasenyes."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permet que l\'aplicació accedeixi a la base de dades del teu correu electrònic, inclosos els missatges rebuts, els missatges enviats, els noms d\'usuari i les contrasenyes."</string>
<string name="app_name" msgid="5815426892327290362">"Correu electrònic"</string>
<string name="compose_title" msgid="427986915662706899">"Redacció"</string>
<string name="debug_title" msgid="5175710493691536719">"Depuració"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Fet"</string>
<string name="create_action" msgid="3062715563215392251">"Crea"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Suprimeix"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"No hi ha respostes ràpides"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"No hi ha respostes ràpides."</string>
<string name="discard_action" msgid="6532206074859505968">"Descarta"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Desa l\'esborrany"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Insereix resposta ràpida"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Cerca"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Configuració del compte"</string>
<string name="settings_action" msgid="6334807007967459412">"Configuració"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Opcions de sincronització"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Opcions de sincronització"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Marca com a no llegit"</string>
<string name="move_action" msgid="3059189775933985898">"Mou"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Cco"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> ha escrit:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Inclou el text citat"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Inclou text"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Heu d\'afegir com a mínim un destinatari."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Afegeix com a mínim un destinatari."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Algunes adreces electròniques no són vàlides."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"El fitxer és massa gran per adjuntar-lo."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Inserció d\'una resposta ràpida"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Desat"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Atura"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Fitxer adjunt desat com a <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"No s\'ha pogut desar el fitxer adjunt."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Nota: Un o més fitxers adjunts del teu missatge reenviat es baixaran abans de l\'enviament."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"No es pot desar fitxer adjunt."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Nota: Un o més fitxers adjunts del teu missatge reenviat es baixaran abans de l\'enviament."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Missatge"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Invitació"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"No s\'han pogut reenviar un o més fitxers adjunts."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"El fitxer adjunt no s\'ha reenviat"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"L\'inici de sessió de <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ha fallat."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Error en l\'inici de sessió a <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"No es pot iniciar la sessió"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Més antics"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Configuració del compte"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Afegeix un compte d\'Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Afegeix un compte d\'Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Compte de correu electrònic"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Pots configurar el correu electrònic per a la majoria de comptes en només uns quants passos."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Pots configurar un compte d\'Exchange en només uns quants passos."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Pots configurar un compte d\'Exchange ActiveSync en només uns quants passos."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Pots configurar el teu compte en només un quants passos."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Adreça electrònica"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Contrasenya"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Envia correu electrònic des d\'aquest compte de manera predeterminada."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Envia correu electrònic des d\'aquest compte de manera predeterminada"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configuració manual"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Escriu una adreça electrònica i una contrasenya vàlides."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Compte duplicat"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"S\'està comprovant la configuració del servidor d\'entrada…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"S\'està comprovant la configuració del servidor de sortida…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Configuració del compte"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"El compte s\'ha configurat i aviat rebre un correu electrònic."</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"El compte s\'ha configurat i aviat rebràs un correu electrònic."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Assigneu un nom al compte (opcional)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"El vostre nom (visualitzat als missatges de sortida)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Aquest camp no pot estar en blanc."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Configuració del servidor d\'entrada"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nom d\'usuari"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Contrasenya"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Servidor POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Servidor IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Servidor"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipus de seguretat"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Cap"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Servidor SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipus de seguretat"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Requereix l\'inici de sessió."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Requereix l\'inici de sessió"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nom d\'usuari"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Contrasenya"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Configuració del compte"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Cada 15 minuts"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Cada 30 minuts"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Cada hora"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Envia correu electrònic des d\'aquest compte de manera predeterminada."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Notifica\'m quan arribi correu electrònic nou."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sincronitza els contactes d\'aquest compte."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sincronitza el calendari d\'aquest compte."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sincronitza el correu electrònic d\'aquest compte."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Envia correu electrònic des d\'aquest compte de manera predeterminada"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Notifica\'m quan arribi un correu electrònic"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sincronitza els contactes d\'aquest compte"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sincronitza el calendari d\'aquest compte"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sincronitza el correu electrònic d\'aquest compte"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Baixa automàticament els fitxers adjunts en connectar-te a Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"No s\'ha pogut acabar"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dies per sincronitzar"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Un mes"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Tots"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Utilitza l\'opció predeterminada del compte"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Nom d\'usuari o contrasenya incorrectes."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Nom d\'usuari o contrasenya incorrectes."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"El nom d\'usuari o la contrasenya no són correctes."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"El nom d\'usuari o la contrasenya són incorrectes."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"No es pot establir una connexió segura amb el servidor."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"No es pot establir una connexió segura amb el servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Es necessita un certificat de client. Et vols connectar al servidor amb el certificat de client?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"El certificat no és vàlid o bé no s\'hi pot accedir."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"El servidor ha contestat amb un error. Comprova el nom d\'usuari i la contrasenya i torna-ho a provar."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Es necessita un certificat de client. Et vols connectar al servidor amb un certificat de client?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"El certificat no és vàlid o no s\'hi pot accedir."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"El servidor ha contestat amb un error. Comprova el nom d\'usuari i la contrasenya i torna-ho a provar."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"No es pot establir la connexió amb el servidor."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"No es pot connectar amb el servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS necessari, però no compatible amb el servidor."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"ADVERTIMENT: Desactivar l\'autoritat de l\'aplicació de correu electrònic per administrar el dispositiu suprimirà tots els comptes de correu electrònic que ho requereixin, juntament amb els correus electrònics, els contactes, els esdeveniments de calendari i altres dades."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Actualització de seguretat"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> necessita que actualitzis la configuració de seguretat."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Cal actualitzar la configuració de seguretat del compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Cal fer una actualització de seguretat"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"El compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\" no es pot sincronitzar a causa de requisits de seguretat."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Cal actualitzar la configuració de seguretat del compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"El compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ha canviat la configuració de seguretat; no es requereix cap acció de l\'usuari."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Cal actualització de seguretat"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Les polítiques de seguretat han canviat"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"No es compleixen polít. segur."</string>
<string name="account_security_title" msgid="3511543138560418587">"Seguretat del dispositiu"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"El servidor <xliff:g id="SERVER">%s</xliff:g> requereix que li permetis controlar de manera remota algunes funcions de seguretat del dispositiu Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Edita\'n els detalls"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"La contrasenya o el PIN de bloqueig de pantalla ha caducat."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"La contrasenya de bloqueig de pantalla ha caducat"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"La contrasenya de bloqueig de pantalla està a punt de caducar"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Has de canviar la contrasenya o el PIN de bloqueig de pantalla aviat. Si no ho fas, s\'esborraran les dades de <xliff:g id="ACCOUNT">%s</xliff:g>. Vols fer el canvi ara?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Has de canviar la contrasenya o el PIN de bloqueig de pantalla aviat. Si no ho fas, s\'esborraran les dades de <xliff:g id="ACCOUNT">%s</xliff:g>. Vols fer el canvi ara?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"La contrasenya de bloqueig de pantalla ha caducat"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Les dades de <xliff:g id="ACCOUNT">%s</xliff:g> s\'estan esborrant del dispositiu. Pots restaurar-les si canvies la contrasenya o el PIN de bloqueig de pantalla. Vols fer el canvi ara?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Les dades de <xliff:g id="ACCOUNT">%s</xliff:g> s\'estan esborrant del dispositiu. Pots restaurar-les si canvies la contrasenya o el PIN de bloqueig de pantalla. Vols fer el canvi ara?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Vols descartar els canvis no desats?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"No es pot iniciar la sessió"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"El nom d\'usuari o la contrasenya de <xliff:g id="ACCOUNT">%s</xliff:g> són incorrectes. Vols actualitzar-los ara?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"El nom d\'usuari o la contrasenya de <xliff:g id="ACCOUNT">%s</xliff:g> no són correctes. Vols actualitzar-los ara?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Compte predeterminat"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Envia correu electrònic des d\'aquest compte de manera predeterminada"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Baixada de fitxers adjunts"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Baixa automàtic. fitxers adjunts de missatges recents per Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Notificacions de correu electrònic"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Freqüència de sincronització, notificacions, etc."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Notifica a la barra del sistema quan arribi un correu electrònic"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Envia una notificació quan arribi un correu electrònic"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Freqüència de comprovació de la safata d\'entrada"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Configuració d\'entrada"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nom d\'usuari, contrasenya i altres opcions de configuració del servidor d\'entrada"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Configuració de sortida"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nom d\'usuari, contrasenya i altres opcions de configuració del servidor de sortida"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Polítiques aplicades"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Cap"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Polítiques no compatibles"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Cap"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Intenta la sincronització"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Toca aquí per sincronitzar aquest compte"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Nom del compte"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"El vostre nom"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Signatura"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Respostes ràpides"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Edita text que insereixes sovint en redactar correu electrònic"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edita text que insereixes sovint en redactar correus electrònics"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Annexa text als missatges que envieu"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Configuració de notificacions"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Ús de dades"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Polítiques de seguretat"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Edita una resposta ràpida"</string>
<string name="save_action" msgid="1988862706623227093">"Desa"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronitza els contactes"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincr. contactes d\'aquest compte"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sincronitza el calendari"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sincr. calendari p. aq. compte"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronitza el calendari"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sincr. esdev. calend. per al compte"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincronitza el correu electrònic"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincr. miss. correu d\'aquest compte"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibra"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultats de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Configuració"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"General"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Configuració general"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Aplicació"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avança automàticament"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Selecciona quina pantalla s\'ha de mostrar després de suprimir un missatge"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Amaga les caselles de selecció"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"En les llistes de missatges, toca i mantén premut per seleccionar"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirma abans de suprimir"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Missatges"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirma abans d\'enviar"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Missatges"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Vés a"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Missatge més recent"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Missatge més antic"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"S\'estan esperant els resultats"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Alguns servidors poden trigar molt."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Carpetes"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"No permetis l\'ús de la càmera del dispositiu"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Requereix la contrasenya del dispositiu"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Restringeix la reutilització de contrasenyes recents"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Requereix que les contrasenyes caduquin"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Requereix un dispositiu absent per bloquejar-ne la pantalla"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Limita el nombre d\'esdev. calendari sincronitzats"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Limita el nombre de correus electr. sincronitzats"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Gràcies."</string>
+ <string name="quick_2" msgid="4188036352885736617">"Em sembla molt bé."</string>
+ <string name="quick_3" msgid="8061819976353395585">"Ho llegiré més tard i et respondré."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Organitzem una reunió per parlar-ne."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"La sincronització de fons per a aquest compte està desactivada en itinerància."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"S\'està enviant la resposta..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"No hi ha missatges."</string>
</resources>
diff --git a/res/values-ca/uploader.xml b/res/values-ca/uploader.xml
index 13b33af96..8e251c9c6 100644
--- a/res/values-ca/uploader.xml
+++ b/res/values-ca/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Amaga els detalls"</string>
<string name="menu_settings" msgid="5088116127086866634">"Configuració"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Penjats: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Compte"</string>
<string name="upload" msgid="2615541458361216022">"Penja"</string>
<string name="ok" msgid="2516349681897895312">"D\'acord"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index ba3fbd34c..0ecc4b5bc 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -17,11 +17,11 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Číst přílohy e-mailů"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Umožňuje této aplikaci číst přílohy e-mailů."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Umožňuje této aplikaci číst přílohy vašich e-mailů."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Přístup k datům poskytovatele e-mailu"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Povoluje této aplikaci přístup do databáze e-mailů, včetně přijatých a odeslaných zpráv, uživatelských jmen a hesel."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Povoluje aplikaci přístup do databáze e-mailů, a to včetně přijatých a odeslaných zpráv, uživatelských jmen a hesel."</string>
<string name="app_name" msgid="5815426892327290362">"E-mail"</string>
- <string name="compose_title" msgid="427986915662706899">"Napsat"</string>
+ <string name="compose_title" msgid="427986915662706899">"Nová zpráva"</string>
<string name="debug_title" msgid="5175710493691536719">"Ladit"</string>
<string name="next_action" msgid="3931301986364184415">"Další"</string>
<string name="okay_action" msgid="8365197396795675617">"OK"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Hotovo"</string>
<string name="create_action" msgid="3062715563215392251">"Vytvořit novou"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Smazat"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Žádné rychlé odpovědi"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Žádné rychlé odpovědi."</string>
<string name="discard_action" msgid="6532206074859505968">"Zahodit"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Uložit koncept"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Vložit rychlou odpověď"</string>
@@ -46,11 +46,11 @@
<string name="remove_star_action" msgid="6689770999647007163">"Odebrat hvězdičku"</string>
<string name="refresh_action" msgid="5951383001436708175">"Aktualizovat"</string>
<string name="add_account_action" msgid="8835736309476033727">"Přidat účet"</string>
- <string name="compose_action" msgid="4045702519637388045">"Napsat"</string>
+ <string name="compose_action" msgid="4045702519637388045">"Nová zpráva"</string>
<string name="search_action" msgid="6325101454876682308">"Hledat"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Nastavení účtu"</string>
<string name="settings_action" msgid="6334807007967459412">"Nastavení"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Možnosti synchronizace"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Možnosti synchronizace"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Označit jako nepřečtené"</string>
<string name="move_action" msgid="3059189775933985898">"Přesunout"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Kopie/skrytá"</string>
@@ -128,12 +128,12 @@
<string name="cc" msgid="7017720927911078193">"Kopie"</string>
<string name="bcc" msgid="3098643138241111579">"Skrytá kopie"</string>
<string name="subject_hint" msgid="7253964583324677128">"Předmět"</string>
- <string name="body_hint" msgid="4279864165439577668">"Napsat e-mail"</string>
+ <string name="body_hint" msgid="4279864165439577668">"Napsat zprávu"</string>
<string name="message_compose_fwd_header_fmt" msgid="5181300290654579434">\n\n"-------- Původní zpráva --------"\n"Předmět: <xliff:g id="SUBJECT">%1$s</xliff:g>"\n"Odesílatel: <xliff:g id="SENDER">%2$s</xliff:g>"\n"Komu: <xliff:g id="TO">%3$s</xliff:g>"\n"Kopie: <xliff:g id="CC_0">%4$s</xliff:g>"\n\n</string>
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>napsal/a:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Zahrnout text v uvozovkách"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Zahrnout text"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Je třeba přidat nejméně jednoho příjemce."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Přidejte alespoň jednoho příjemce."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Některé e-mailové adresy jsou neplatné."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Soubor nelze připojit, protože je příliš velký."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Vložit rychlou odpověď"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Uloženo"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Zastavit"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Příloha uložena jako <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Přílohu nelze uložit."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Poznámka: Jedna či více příloh v přeposílané zprávě bude před odesláním stažena."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Přílohu se nepodařilo uložit."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Jedna či více příloh v přeposílané zprávě bude před odesláním stažena."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Zpráva"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Pozvánka"</string>
<plurals name="message_view_show_attachments_action">
@@ -185,7 +185,7 @@
<string name="attachment_info_policy" msgid="3560422300127587508">"Tuto přílohu nelze uložit ani otevřít kvůli zásadám zabezpečení účtu."</string>
<string name="attachment_info_wifi_only" msgid="1481120960014563617">"Tato příloha je příliš velká, aby ji bylo možné stáhnout pomocí mobilní sítě. Můžete ji stáhnout při příštím připojení k síti Wi-Fi."</string>
<string name="attachment_info_no_intent" msgid="8139209405745777924">"Nemáte nainstalovanou žádnou aplikaci, která by dokázala tuto přílohu otevřít. Zkuste příslušnou aplikaci stáhnout ze služby Android Market."</string>
- <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Tato příloha je aplikace. Chcete-li ji nainstalovat, zaškrtněte nejdříve v části Nastavení &gt; Aplikace možnost Neznámé zdroje."</string>
+ <string name="attachment_info_sideload_disabled" msgid="3270731101769840006">"Tato příloha je aplikace. Chcete-li ji nainstalovat, zaškrtněte nejdříve v sekci Nastavení &gt; Aplikace možnost Neznámé zdroje."</string>
<string name="attachment_info_apk_install_disabled" msgid="2817790592227462682">"Aplikace nelze instalovat přímo z e-mailu. Nejdříve aplikaci uložte a poté ji nainstalujte pomocí aplikace Stahování."</string>
<string name="attachment_not_found" msgid="7155322700141145123">"Přílohu nelze stáhnout."</string>
<string name="message_decode_error" msgid="5016042255170947834">"Při dekódování zprávy došlo k chybě."</string>
@@ -199,7 +199,7 @@
<item quantity="one" msgid="710742672464447084">"Zpráva byla smazána."</item>
<item quantity="other" msgid="6574961322865652255">"Zprávy byly smazány."</item>
</plurals>
- <string name="message_discarded_toast" msgid="3891461729325584026">"Zpráva byla zrušena."</string>
+ <string name="message_discarded_toast" msgid="3891461729325584026">"Zpráva byla zahozena."</string>
<string name="message_saved_toast" msgid="8443125659172627665">"Zpráva byla uložena jako koncept."</string>
<string name="message_view_display_attachment_toast" msgid="7714482237896346836">"Přílohu nelze zobrazit."</string>
<string name="message_view_load_attachment_failed_toast" msgid="8605967295095023587">"Přílohu <xliff:g id="FILENAME">%s</xliff:g> nelze načíst."</string>
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Nepodařilo se přeposlat jednu nebo více příloh."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Příloha nebyla přeposlána"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Přihlášení selhalo: <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Přihlášení k účtu <xliff:g id="ACCOUNT_NAME">%s</xliff:g> se nezdařilo."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Přihlášení se nezdařilo."</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Starší"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Nastavení účtu"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Přidat účet Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Přidat účet Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"E-mailový účet"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Většinu e-mailových účtů můžete nakonfigurovat v několika snadných krocích."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Účet Exchange můžete nakonfigurovat v několika snadných krocích."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Účet služby Exchange ActiveSync můžete nakonfigurovat v několika snadných krocích."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Účet můžete nakonfigurovat v několika snadných krocích."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-mailová adresa"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Heslo"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Ve výchozím nastavení odesílat e-maily z tohoto účtu."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Použít tento účet jako výchozí pro odesílání e-mailů"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ruční nastavení"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Zadejte platnou e-mailovou adresu a heslo."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplicitní účet"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Kontrola nastavení serveru příchozí pošty..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Kontrola nastavení serveru odchozí pošty..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Nastavení účtu"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Váš účet je nastaven, e-mail je na cestě!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Váš účet je nastaven, e-mail je na cestě!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Pojmenovat tento účet (nepovinné)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Vaše jméno (zobrazované na odchozích zprávách)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Toto pole nesmí být prázdné."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Nastavení serveru příchozí pošty"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Uživatelské jméno"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Heslo"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Server POP"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Server IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Typ zabezpečení"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Žádný"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Server SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Typ zabezpečení"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Požadovat přihlášení"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Vyžadovat přihlášení"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Uživatelské jméno"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Heslo"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Nastavení účtu"</string>
@@ -290,7 +285,7 @@
<string name="account_setup_exchange_ssl_label" msgid="6704105469083211236">"Použít zabezpečené připojení (SSL)"</string>
<string name="account_setup_exchange_trust_certificates_label" msgid="6232880757633882678">"Přijímat všechny certifikáty protokolu SSL"</string>
<string name="account_setup_exchange_certificate_title" msgid="8473793588405277962">"Certifikát klienta"</string>
- <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Zvolit"</string>
+ <string name="account_setup_exchange_select_certificate" msgid="1536103662037268683">"Vybrat"</string>
<string name="account_setup_exchange_use_certificate" msgid="8690682770083161349">"Použít klientský certifikát"</string>
<string name="account_setup_exchange_remove_certificate" msgid="5633249155510301766">"Odebrat"</string>
<string name="account_setup_exchange_no_certificate" msgid="1119542961954780872">"Žádný"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Každých 15 minut"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Každých 30 minut"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Každou hodinu"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Ve výchozím nastavení odesílat e-maily z tohoto účtu."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Upozornit mě na příchod e-mailu"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Synchronizovat kontakty z tohoto účtu."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Synchronizovat kalendář z tohoto účtu."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Synchronizovat e-mail z tohoto účtu."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Použít tento účet jako výchozí pro odesílání e-mailů"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Upozornit mě na příchod e-mailu"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synchronizovat kontakty z tohoto účtu"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synchronizovat kalendář z tohoto účtu"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synchronizovat e-mail z tohoto účtu"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Během připojení k síti Wi-Fi automaticky stahovat přílohy"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nelze dokončit"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Počet dní k synchronizaci"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Jeden měsíc"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Vše"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Použít výchozí nastavení účtu"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Uživatelské jméno nebo heslo není správné"</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Uživatelské jméno nebo heslo není správné."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Uživatelské jméno nebo heslo jsou nesprávné."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Uživatelské jméno nebo heslo jsou nesprávné."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nelze se bezpečně připojit k serveru."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nelze se bezpečně připojit k serveru."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Je vyžadován certifikát klienta. Chcete se připojit k serveru pomocí certifikátu klienta?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Certifikát je neplatný nebo nedostupný."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Server odpověděl chybou. Zkontrolujte prosím uživatelské jméno a heslo a zkuste to znovu."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Je vyžadován certifikát klienta. Chcete se k serveru připojit pomocí certifikátu klienta?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certifikát je neplatný nebo nedostupný."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Server odpověděl chybou. Zkontrolujte prosím uživatelské jméno a heslo a zkuste to znovu."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nelze se připojit k serveru."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Nelze se připojit k serveru."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"Služba TLS je požadována, ale není podporována na serveru."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"UPOZORNĚNÍ: Deaktivujete-li oprávnění aplikace E-mail spravovat toto zařízení, budou smazány všechny účty aplikace E-mail, které toto oprávnění vyžadují. Společně s těmito účty budou smazány i všechny jejich e-maily, kontakty, události v kalendářích a další údaje."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Aktualizace zabezpečení"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Účet <xliff:g id="ACCOUNT">%s</xliff:g> vyžaduje aktualizaci nastavení zabezpečení."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Účet <xliff:g id="ACCOUNT">%s</xliff:g> požaduje aktualizaci nastavení zabezpečení."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Je třeba aktualizovat zabezp."</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Účet „<xliff:g id="ACCOUNT">%s</xliff:g>“ nelze synchronizovat z důvodu požadavků na zabezpečení."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Účet <xliff:g id="ACCOUNT">%s</xliff:g> požaduje aktualizaci nastavení zabezpečení."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Nastavení zabezpečení účtu <xliff:g id="ACCOUNT">%s</xliff:g> byla změněna. Uživatel nemusí provádět žádnou akci."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Je třeba aktualizovat zabezp."</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Zásady zabezpečení se změnily"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Nelze splnit zásady zabezp."</string>
<string name="account_security_title" msgid="3511543138560418587">"Zabezpečení zařízení"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Server <xliff:g id="SERVER">%s</xliff:g> žádá o povolení, aby mohl vzdáleně ovládat některé funkce zabezpečení v zařízení Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Upravit podrobnosti"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Platnost kódu PIN nebo hesla pro uzamčení obrazovky vypršela."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Platnost hesla pro uzamčení obrazovky vypršela"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Heslo zámku obrazovky brzy vyprší"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Brzy bude třeba změnit kód PIN nebo heslo pro uzamčení obrazovky. Pokud tak neučiníte, budou data účtu <xliff:g id="ACCOUNT">%s</xliff:g> vymazána. Chcete nyní změnit kód PIN nebo heslo?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Je nutné, abyste si brzy změnili kód PIN nebo heslo pro uzamčení obrazovky, jinak dojde k vymazání údajů účtu <xliff:g id="ACCOUNT">%s</xliff:g>. Chcete tuto změnu provést hned?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Platnost hesla zámku obrazovky vypršela"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Ze zařízení jsou mazána data účtu <xliff:g id="ACCOUNT">%s</xliff:g>. Data můžete obnovit změnou kódu PIN nebo hesla pro uzamčení obrazovky."</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Ze zařízení jsou mazány údaje účtu <xliff:g id="ACCOUNT">%s</xliff:g>. Můžete je obnovit změnou kódu PIN nebo hesla pro uzamčení obrazovky. Chcete tuto změnu provést hned?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Zahodit neuložené změny?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Přihlášení se nezdařilo."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Uživatelské jméno nebo heslo pro účet <xliff:g id="ACCOUNT">%s</xliff:g> je nesprávné. Chcete údaje aktualizovat?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Uživatelské jméno nebo heslo k účtu <xliff:g id="ACCOUNT">%s</xliff:g> je nesprávné. Chcete je aktualizovat?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Výchozí účet"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Ve výchozím nastavení odesílat e-maily z tohoto účtu"</string>
- <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Stáhnout přílohy"</string>
+ <string name="account_settings_default_summary" msgid="1531901438624688482">"Použít tento účet jako výchozí pro odesílání e-mailů"</string>
+ <string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Stahovat přílohy"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Automaticky stahovat přílohy posledních zpráv pomocí sítě Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"E-mailová upozornění"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Frekvence synchronizace, oznámení apod."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Oznámit příchod e-mailu na systémové liště"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Zaslat upozornění, když přijde e-mail"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Četnost kontroly doručené pošty"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Nastavení příchozí pošty"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Uživatelské jméno, heslo a jiná nastavení serveru příchozí pošty"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Nastavení odchozí pošty"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Uživatelské jméno, heslo a jiná nastavení serveru odchozí pošty"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Vynucené zásady"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Žádné"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Zásady, které nejsou podporované"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Žádné"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Pokusit se synchronizovat"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Pokud chcete účet synchronizovat, dotkněte se tohoto tlačítka"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Název účtu"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Vaše jméno"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Podpis"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Rychlé odpovědi"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Upravit text, který při psaní e-mailů často vkládáte"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Upravit text, který při psaní e-mailů často vkládáte"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Připojit text k odesílaným zprávám"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Nastavení upozornění"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Využití dat"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Zásady zabezpečení"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Upravit rychlou odpověď"</string>
<string name="save_action" msgid="1988862706623227093">"Uložit"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synchronizovat kontakty"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synchronizovat kontakty pro tento účet"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Synchronizovat kalendář"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Synchronizovat kalendář pro tento účet"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synchronizovat kalendář"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synch. udál. kalend. pro tento účet"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synchronizovat e-maily"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synchronizovat e-mail pro tento účet"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrace"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"Počet výsledků: <xliff:g id="RESULTS">%1$d</xliff:g> z webu <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Nastavení"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Obecné"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Obecná nastavení"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Aplikace"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automaticky pokračovat"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Vyberte, kterou obrazovku chcete zobrazit po smazání zprávy."</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Skrýt zaškrtávací políčka"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"V seznamu zpráv provedete výběr klepnutím s podržením."</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Před smazáním potvrdit"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Zprávy"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Před odesláním potvrdit"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Zprávy"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Pokračovat na"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Novější zpráva"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Starší zpráva"</string>
@@ -446,8 +458,8 @@
<string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Velmi velký"</string>
<string name="general_preference_reply_all_label" msgid="7806833609810003510">"Odpovědět všem"</string>
<string name="general_preference_reply_all_summary" msgid="9191932552604733245">"Nastavit volbu Odpovědět všem jako výchozí volbu odpovídání na zprávy"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Dotazovat se na zobrazování obrázků"</string>
- <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Obrázky ve zprávách se automaticky nezobrazí"</string>
+ <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Dotaz na zobrazování obrázků"</string>
+ <string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Obrázky ve zprávách se nebudou zobrazovat automaticky"</string>
<string name="trusted_senders_cleared" msgid="4762002183756251723">"Nastavení Zobrazit obrázky bylo smazáno."</string>
<string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Čekání na synchronizaci"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Čekání na výsledky"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Některým serverům může tento proces trvat dlouho."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Složky"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Zakázat používání fotoaparátu v zařízení"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Požadovat heslo zařízení"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Omezit opětovné použití nedávných hesel"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Požadovat omezenou platnost hesel"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Při nečinnosti zamknout obrazovku"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Omezit počet synchronizovaných událostí kalendáře"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Omezit počet synchronizovaných e-mailů"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Díky!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"To zní dobře!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Přečtu si to později a ozvu se."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Můžeme si dohodnout schůzku, abychom to prodiskutovali."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Synchronizace na pozadí je v tomto účtu při roamingu zakázána."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Odesílání odpovědi..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Žádné zprávy."</string>
</resources>
diff --git a/res/values-cs/uploader.xml b/res/values-cs/uploader.xml
index 0ce8a868f..f15f9879d 100644
--- a/res/values-cs/uploader.xml
+++ b/res/values-cs/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Skrýt podrobnosti"</string>
<string name="menu_settings" msgid="5088116127086866634">"Nastavení"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Nahráno: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Účet"</string>
<string name="upload" msgid="2615541458361216022">"Nahrát"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 5427439fd..920742b27 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Læs vedhæftede filer i e-mails"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Tillader, at denne applikation læser vedhæftede filer i dine e-mails."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Tillader, at appen kan læse vedhæftede filer i dine e-mails."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Få adgang til data om e-mailudbyder"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Tillader, at denne applikation får adgang til din e-maildatabase, f.eks. modtagne beskeder, sendte beskeder, brugernavne og adgangskoder."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Tillader, at denne app kan få adgang til din e-maildatabase, f.eks. modtagne beskeder, sendte beskeder, brugernavne og adgangskoder."</string>
<string name="app_name" msgid="5815426892327290362">"E-mail"</string>
<string name="compose_title" msgid="427986915662706899">"Skriv"</string>
<string name="debug_title" msgid="5175710493691536719">"Fejlretning"</string>
@@ -33,10 +33,10 @@
<string name="delete_action" msgid="8421026208288857155">"Slet"</string>
<string name="forward_action" msgid="669174181042344116">"Videresend"</string>
<string name="favorite_action" msgid="4664259801498253756">"Stjernemarker"</string>
- <string name="done_action" msgid="7497990549515580249">"Udfør"</string>
+ <string name="done_action" msgid="7497990549515580249">"Færdig"</string>
<string name="create_action" msgid="3062715563215392251">"Opret nyt"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Slet"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Ingen hurtige svar"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Ingen hurtige svar."</string>
<string name="discard_action" msgid="6532206074859505968">"Kassér"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Gem kladde"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Indsæt hurtigt svar"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Søg"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Indstillinger for konto"</string>
<string name="settings_action" msgid="6334807007967459412">"Indstillinger"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Indstillinger for synkronisering"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Muligheder for synkronisering"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Markér som ulæst"</string>
<string name="move_action" msgid="3059189775933985898">"Flyt"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> skrev:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Inkluder citeret tekst"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Medtag tekst"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Du skal tilføje mindst en modtager."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Tilføj mindst én modtager."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Nogle e-mailadresser er ugyldige."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Filen er for stor til at vedhæfte."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Indsæt hurtigt svar"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Gemt"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stop"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Vedhæftelse gemmes som <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Vedhæftning kunne ikke gemmes."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Bemærk: En eller flere vedhæftede filer i din videresendte besked downloades før afsendelse."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Vedhæftning kunne ikke gemmes"</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"En eller flere vedhæftede filer i din videresendte besked downloades før afsendelse."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Besked"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Inviter"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"En eller flere vedhæftede filer kunne ikke videresendes."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Vedhæftet fil er ikke sendt"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> kunne ikke logge ind."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> kunne ikke logge ind."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Login mislykkedes"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> b"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Ældre"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Kontoindstillinger"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Tilføj en Exchange-konto"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Tilføj en Exchange ActiveSync-konto"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"E-mailkonto"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Du kan nemt konfigurere e-mail for de fleste konti."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Du kan nemt konfigurere en Exchange-konto."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Du kan nemt konfigurere en Exchange ActiveSync-konto."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Du kan nemt og hurtigt oprette din konto."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-mailadresse"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Adgangskode"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Send e-mail fra denne konto som standard."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Send e-mail fra denne konto som standard"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuel opsætning"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Indtast en gyldig e-mailadresse og adgangskode."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dobbeltforekomst af konto"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Kontrollerer indstillinger for indgående server ..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Kontrollerer indstillinger for udgående server ..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Kontoindstillinger"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Din konto er oprettet, og der er e-mail på vej."</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Din konto er konfigureret, og der er e-mail på vej."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Giv kontoen et navn (valgfrit)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Dit navn (vist på udgående beskeder)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Dette felt må ikke være tomt."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Indstillinger for indgående server"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Brugernavn"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Adgangskode"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3-server"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP-server"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Sikkerhedstype"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ingen"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-server"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Sikkerhedstype"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Kræver login"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Kræv login"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Brugernavn"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Adgangskode"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Kontoindstillinger"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Hvert 15. minut"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Hvert 30. minut"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Hver time"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Send e-mail fra denne konto som standard."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Underret mig, når der kommer e-mail."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Synkroniser kontaktpersoner fra denne konto."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Synkroniser kalender fra denne konto."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Synkroniser e-mail fra denne konto."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Send e-mail fra denne konto som standard"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Giv mig besked ved nye e-mails"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synkroniser kontaktpersoner fra denne konto"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synkroniser kalender fra denne konto"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synkroniser e-mails fra denne konto"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Download vedhæftede filer automatisk, når forbundet til Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Kunne ikke afsluttes"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dage, der skal synkroniseres"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"En måned"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Alle"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Anvend kontostandarden"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Brugernavn eller adgangskode er forkert."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Brugernavn eller adgangskode er forkert."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Brugernavn eller adgangskode er forkert."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Brugernavn eller adgangskode er forkert."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Der kan ikke oprettes en sikker forbindelse til serveren."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Der kan ikke oprettes en sikker forbindelse til serveren."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Klientcertifikat kræves. Vil du oprette forbindelse til serveren med et klientcertifikat?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Certifikatet er ugyldigt eller ikke tilgængeligt."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Serveren reagerede med en fejl. Kontroller dit brugernavn og din adgangskode, og prøv igen."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Der kræves et klientcertifikat. Vil du oprette forbindelse til serveren med et klientcertifikat?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certifikatet er ugyldigt eller ikke tilgængeligt."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Serveren reagerede med en fejl. Kontroller dit brugernavn og din adgangskode, og prøv igen."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Der kan ikke oprettes forbindelse til serveren."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Der kan ikke oprettes forbindelse til serveren."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS er påkrævet, men understøttes ikke af serveren."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"ADVARSEL! Hvis du deaktiverer appen E-mails tilladelse til at administrere din enhed, slettes alle konti i E-mail, der kræver dette, sammen med alle e-mails, kontaktpersoner, kalenderbegivenheder og andre data på disse konti."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Sikkerhedsopdatering"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> kræver, at du opdaterer dine sikkerhedsindstillinger."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Kontoen \"<xliff:g id="ACCOUNT">%s</xliff:g>\" kræver opdatering af sikkerhedsindstillingerne."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Sikkerhedsopdatering kræves"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Kontoen \"<xliff:g id="ACCOUNT">%s</xliff:g>\" kan ikke synkroniseres på grund af sikkerhedskravene."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Kontoen \"<xliff:g id="ACCOUNT">%s</xliff:g>\" kræver opdatering af sikkerhedsindstillingerne."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Kontoen \"<xliff:g id="ACCOUNT">%s</xliff:g>\" har skiftet sikkerhedsindstillinger. Ingen brugerhandling er påkrævet."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Sikkerhedsopdatering kræves"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Sikkerhedpolitikker er ændret"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Politikker kan ikke opfyldes"</string>
<string name="account_security_title" msgid="3511543138560418587">"Enhedssikkerhed"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Serveren <xliff:g id="SERVER">%s</xliff:g> kræver, at du giver den tilladelse til eksternt at kontrollere nogle af Android-enhedens sikkerhedsfunktioner."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Rediger detaljer"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Pinkoden eller adgangskoden til skærmlåsen er udløbet."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Skærmlåskoden er udløbet"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Skærmlåskoden er ved at udløbe"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Du skal snart ændre skærmlåsens pinkode eller adgangskode, ellers vil dataene på <xliff:g id="ACCOUNT">%s</xliff:g> blive slettet. Vil du ændre den nu?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Du skal ændre pinkoden eller adgangskoden til din skærmlås snart, ellers vil data for <xliff:g id="ACCOUNT">%s</xliff:g> vil blive slettet. Vil du ændre dette nu?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Skærmlåskoden er udløbet"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Dataene for <xliff:g id="ACCOUNT">%s</xliff:g> slettes på din enhed. Du kan gendanne dem ved at ændre skærmlåsens pinkode eller adgangskode. Vil du ændre den nu?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Dataene for <xliff:g id="ACCOUNT">%s</xliff:g> er ved at blive slettet fra enheden. Du kan gendanne dem ved at ændre skærmlåsens pinkode eller adgangskode. Vil du ændre dette nu?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Vil du kassere ændringer, som ikke er gemt?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Login mislykkedes"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Brugernavn eller adgangskode for <xliff:g id="ACCOUNT">%s</xliff:g> er forkert. Vil du opdatere dem nu?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Brugernavn eller adgangskode for <xliff:g id="ACCOUNT">%s</xliff:g> er forkert. Vil du opdatere dem nu?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Standardkonto"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Send e-mail fra denne konto som standard"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Download vedhæftede filer"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Download autom. vedhæftede filer i de seneste beskeder via Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"E-mail-beskeder"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Synkroniseringsinterval, meddelelser osv."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Underret i statuslinjen, når der kommer e-mail"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Send en meddelelse ved nye e-mails"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Kontrolfrekvens for indbakke"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Indgående indstillinger"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Brugernavn, adgangskode og indstillinger for indgående server"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Udgående indstillinger"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Brugernavn, adgangskode og indstillinger for udgående server"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Politikker håndhævet"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ingen"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Ikke-understøttede politikker"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ingen"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Forsøg synkronisering"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Tryk her for at synkronisere denne konto"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Kontonavn"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Dit navn"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Signatur"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Hurtige svar"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Rediger tekst, du ofte indsætter, når du skriver e-mails"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Rediger tekst, som du ofte indsætter, når du skriver e-mails"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Vedhæft tekst til beskeder, du sender"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Indstillinger for underretninger"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Dataforbrug"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Sikkerhedspolitikker"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Rediger hurtigt svar"</string>
<string name="save_action" msgid="1988862706623227093">"Gem"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synkroniser kontaktpersoner"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synkroniser kontaktpersoner til denne konto"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Synkroniser kalender"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Synkroniser kalender for denne konto"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synkroniser kalender"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synkroniser begivenhed for konto"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synkroniser e-mails"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synkroniser e-mail for denne konto"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibration"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultater fra <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Indstillinger"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Generelt"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Generelle indstillinger"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Applikation"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Gå automatisk frem"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Vælg, hvilken skærm der skal vises, når du har slettet en besked"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Skjul afkrydsningsfelter"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Tryk og holde nede for at vælge på lister over samtaler"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Bekræft før sletning"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Meddelelser"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Bekræft før afsendelse"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Meddelelser"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Gå frem til"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Nyere besked"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Ældre besked"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Venter på resultater"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Nogle servere kan være langsomme."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mapper"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Tillad ikke brug af enheden kamera"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Kræv adgangskode for enheden"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Begræns genbrug af seneste adgangskoder"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Kræv, at adgangskoder udløber"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Kræv, at en inaktiv enheds skærm låses"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Begræns antallet af synkron. kalenderbegivenheder"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Begræns antallet af synkroniserede e-mails"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Tak!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Det passer mig fint!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Jeg læser dette senere og vender tilbage til dig."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Lad os holde et møde for at diskutere dette."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Baggrundssynkronisering for denne konto deaktiveres under roaming."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Sender svar..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Ingen meddelelser."</string>
</resources>
diff --git a/res/values-da/uploader.xml b/res/values-da/uploader.xml
index cc8f0e854..f2a6f1aa6 100644
--- a/res/values-da/uploader.xml
+++ b/res/values-da/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Skjul detaljer"</string>
<string name="menu_settings" msgid="5088116127086866634">"Indstillinger"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Uploadet %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Konto"</string>
<string name="upload" msgid="2615541458361216022">"Upload"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
@@ -105,7 +105,7 @@
<string name="preference_title_videos_upload_connectivity" msgid="4029897303763182477">"Betingelser for upload"</string>
<string name="preference_title_videos_upload_connectivity_summary" msgid="2228943790654186152">"Billedernes forbindelsesindstillinger bruges i øjeblikket."</string>
<string name="preference_mobile_data_usage_for_photos_only" msgid="8047534381344601018">"Kun billeder via mobilnetværk"</string>
- <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Billeder og videoer via mobilnetværk"</string>
+ <string name="preference_mobile_data_usage_for_all_media" msgid="4228623171763750182">"Fotos og videoer via mobilnetværk"</string>
<string name="preference_mobile_data_usage_never" msgid="4887062654163669480">"Kun billeder og videoer via Wi-Fi"</string>
<string name="preference_category_title_about" msgid="3001183168471659844">"Om"</string>
<string name="preference_title_camera_sync_version" msgid="1590760570503808392">"Øjebl. upload-v."</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 96b6a5ddc..bf41f33be 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"E-Mail-Anhänge lesen"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Ermöglicht der App, Ihre E-Mail-Anhänge zu lesen"</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Ermöglicht der App, Ihre E-Mail-Anhänge zu lesen"</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Auf Daten des E-Mail-Anbieters zugreifen"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Ermöglicht der App, auf Ihre E-Mail-Datenbank zuzugreifen, einschließlich erhaltener Nachrichten, gesendeter Nachrichten, Nutzernamen und Passwörtern."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Ermöglicht der App, auf Ihre E-Mail-Datenbank zuzugreifen, einschließlich empfangener und gesendeter Nachrichten, Nutzernamen sowie Passwörtern"</string>
<string name="app_name" msgid="5815426892327290362">"E-Mail"</string>
<string name="compose_title" msgid="427986915662706899">"Schreiben"</string>
<string name="debug_title" msgid="5175710493691536719">"Fehler suchen"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Fertig"</string>
<string name="create_action" msgid="3062715563215392251">"Neue erstellen"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Löschen"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Keine Kurzantworten"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Keine Kurzantworten"</string>
<string name="discard_action" msgid="6532206074859505968">"Verwerfen"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Speichern"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Kurzantwort einfügen"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Suche"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Kontoeinstellungen"</string>
<string name="settings_action" msgid="6334807007967459412">"Einstellungen"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Synchronisierungsoptionen"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Synchronisierungsoptionen"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Als ungelesen markieren"</string>
<string name="move_action" msgid="3059189775933985898">"Verschieben"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> schrieb:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Zitierten Text einfügen"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Text einfügen"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Sie müssen mindestens einen Empfänger hinzufügen."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Fügen Sie mindestens einen Empfänger hinzu."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Einige E-Mail-Adressen sind ungültig."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Dateianhang zu groß"</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Kurzantwort einfügen"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Gespeichert"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stoppen"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Anhang als <xliff:g id="FILENAME">%s</xliff:g> gespeichert."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Anhang nicht gespeichert"</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Hinweis: Mindestens ein Anhang in Ihrer weitergeleiteten Nachricht wird vor dem Senden heruntergeladen."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Speichern nicht möglich"</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Mindestens ein Anhang in Ihrer weitergeleiteten Nachricht wird vor dem Senden heruntergeladen."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Nachricht"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Einladen"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Mindestens ein Anhang wurde nicht weitergeleitet."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Anhang nicht weitergeleitet"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Fehler beim Anmelden in <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Anmeldung in <xliff:g id="ACCOUNT_NAME">%s</xliff:g> erfolglos"</string>
<string name="login_failed_title" msgid="7624349996212476176">"Anmeldung nicht möglich"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Älter"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" - "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Kontoeinrichtung"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Exchange-Konto hinzufügen"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Exchange ActiveSync-Konto hinzufügen"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"E-Mail-Konto"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Sie können die E-Mail-Funktion für die meisten Konten in wenigen Schritten einrichten."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Sie können ein Exchange-Konto in wenigen Schritten einrichten."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Sie können ein Exchange ActiveSync-Konto in wenigen Schritten einrichten."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Sie können Ihr Konto in wenigen Schritten einrichten."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-Mail-Adresse"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Passwort"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"E-Mails standardmäßig von diesem Konto senden"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"E-Mails standardmäßig von diesem Konto senden"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuell einrichten"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Geben Sie eine gültige E-Mail-Adresse und ein gültiges Passwort ein."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dupliziertes Konto"</string>
@@ -250,9 +246,9 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Einstellungen des Eingangsservers werden überprüft..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Einstellungen des Ausgangsservers werden überprüft..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Kontoeinrichtung"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Ihr Konto ist nun eingerichtet."</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Das Konto ist jetzt eingerichtet und die E-Mail ist unterwegs."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Konto benennen (optional)"</string>
- <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Ihr Name (wird bei ausgehenden Nachrichten angezeigt)"</string>
+ <string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Ihr Name (wird bei ausgehenden E-Mails angezeigt)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Dieses Feld darf nicht leer sein."</string>
<string name="account_setup_account_type_title" msgid="7156551693961182124">"Kontoeinrichtung"</string>
<string name="account_setup_account_type_headline" msgid="3574102329184831086">"Kontotyp"</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Einstellungen des Eingangsserver"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nutzername"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Passwort"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3-Server"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP-Server"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Sicherheitstyp"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Keine"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-Server"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Sicherheitstyp"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Anmeldung erforderlich"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Anmeldung erforderlich"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nutzername"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Passwort"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Kontoeinrichtung"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Alle 15 Minuten"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Alle 30 Minuten"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Stündlich"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"E-Mails standardmäßig von diesem Konto senden"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Benachrichtigung bei E-Mail-Eingang"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Kontakte dieses Kontos synchronisieren"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Kalender dieses Kontos synchronisieren"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"E-Mails dieses Kontos synchronisieren"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"E-Mails standardmäßig von diesem Konto senden"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Bei neuer E-Mail benachrichtigen"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Kontakte dieses Kontos synchronisieren"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Kalender dieses Kontos synchronisieren"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"E-Mails dieses Kontos synchronisieren"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Anhänge bei WLAN-Verbindung automatisch herunterladen"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Fertigstellen nicht möglich"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Zu synchronisierende Tage"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Ein Monat"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Alle"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Kontostandard verwenden"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Nutzername oder Passwort falsch"</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Nutzername/Password falsch"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nutzername oder Passwort ist falsch."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nutzername oder Passwort ist falsch."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Keine sichere Verbindung zum Server möglich"</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Keine sichere Verbindung zum Server möglich."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Client-Zertifikat ist erforderlich. Verbindung zu einem Server mit Client-Zertifikat herstellen?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Zertifikat ist ungültig oder nicht aufrufbar."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Der Server hat einen Fehler zurückgegeben. Bitte überprüfen Sie Ihren Nutzernamen und Ihr Passwort und versuchen Sie es erneut."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Ein Client-Zertifikat ist erforderlich. Möchten Sie mit einem Client-Zertifikat eine Verbindung zum Server herstellen?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Das Zertifikat ist ungültig oder nicht aufrufbar."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Der Server hat einen Fehler zurückgegeben. Bitte überprüfen Sie Ihren Nutzernamen und Ihr Passwort und versuchen Sie es erneut."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Derzeit kann keine Verbindung zum Server hergestellt werden."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Keine Verbindung zum Server möglich."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS erforderlich aber nicht von Server unterstützt"</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"Warnung: Wenn Sie die Berechtigung der E-Mail-App zur Verwaltung Ihres Geräts deaktivieren, werden alle E-Mail-Konten, die diese Berechtigung benötigen, mit allen zugehörigen E-Mails, Kontakten, Terminen und anderen Daten gelöscht."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Sicherheitsupdate"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> erfordert, dass Sie Ihre Sicherheitseinstellungen aktualisieren."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Das Konto \"<xliff:g id="ACCOUNT">%s</xliff:g>\" erfordert eine Aktualisierung der Sicherheitseinstellungen."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Sicherheitsupdate erforderlich"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Das Konto \"<xliff:g id="ACCOUNT">%s</xliff:g>\" kann aufgrund von Sicherheitsanforderungen nicht synchronisiert werden."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Für das Konto \"<xliff:g id="ACCOUNT">%s</xliff:g>\" müssen die Sicherheitseinstellungen aktualisiert werden."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Die Sicherheitseinstellungen des Kontos \"<xliff:g id="ACCOUNT">%s</xliff:g>\" haben sich geändert. Es sind keine Maßnahmen durch den Nutzer erforderlich."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Sicherheitsupdate erforderlich"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Richtlinien wurden geändert."</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Richtlinien nicht einzuhalten"</string>
<string name="account_security_title" msgid="3511543138560418587">"Gerätesicherheit"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Der Server <xliff:g id="SERVER">%s</xliff:g> fordert die Erlaubnis zur Remote-Steuerung einiger Sicherheitsfunktionen auf Ihrem Android-Gerät an."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Details bearbeiten"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Ihre PIN bzw. Ihr Passwort zum Sperren des Bildschirms ist abgelaufen."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Sperr-Passwort abgelaufen"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Passwort für Bildschirmsperre läuft ab"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Sie müssen Ihre PIN bzw. Ihr Passwort zum Sperren des Bildschirms bald ändern, sonst werden die Daten für <xliff:g id="ACCOUNT">%s</xliff:g> gelöscht. Jetzt ändern?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Sie müssen Ihre PIN für die Display-Sperre bald ändern, da sonst die Daten für <xliff:g id="ACCOUNT">%s</xliff:g> gelöscht werden. Möchten Sie sie jetzt ändern?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Sperr-Passwort abgelaufen"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Die Daten für <xliff:g id="ACCOUNT">%s</xliff:g> werden von Ihrem Gerät gelöscht. Sie können sie wiederherstellen, indem Sie Ihre PIN bzw. Ihr Passwort zum Sperren des Bildschirms ändern. Jetzt ändern?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Die Daten für <xliff:g id="ACCOUNT">%s</xliff:g> werden von Ihrem Gerät gelöscht. Sie können die Daten wiederherstellen, indem Sie Ihre PIN für die Display-Sperre oder Ihr Passwort ändern. Möchten Sie die PIN oder das Passwort jetzt ändern?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Nicht gespeicherte Änderungen verwerfen?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Anmeldung nicht möglich"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Der Nutzername oder das Passwort für <xliff:g id="ACCOUNT">%s</xliff:g> ist falsch. Jetzt aktualisieren?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Nutzername oder Kennwort für <xliff:g id="ACCOUNT">%s</xliff:g> ist falsch. Möchten Sie die Daten jetzt ändern?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Standardkonto"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"E-Mails standardmäßig von diesem Konto senden"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Anhänge herunterladen"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Anhänge neuer Nachrichten automatisch über WLAN herunterladen"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"E-Mail-Benachrichtigung"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Synchronisierungshäufigkeit, Benachrichtigungen usw."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Bei E-Mail-Eingang Benachrichtigung in der Systemleiste"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Bei neuen E-Mails benachrichtigen"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Häufigkeit des E-Mail-Abrufs"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Eingehende Nachrichten"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nutzername, Passwort und andere Einstellungen für Eingangsserver"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Ausgehende Nachrichten"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nutzername, Passwort und andere Einstellungen für Ausgangsserver"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Richtlinien durchgesetzt"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Keine"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nicht unterstützte Richtlinien"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Keine"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Synchronisieren"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Hier berühren, um dieses Konto zu synchronisieren"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Kontoname"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Mein Name"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Signatur"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Kurzantworten"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Bearbeiten Sie beim Verfassen von E-Mails oft eingefügten Text."</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Häufig in neue E-Mails eingefügten Text bearbeiten"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Text an ausgehende Nachrichten anhängen"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Benachrichtigungseinstellungen"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Datenverbrauch"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Sicherheitsrichtlinien"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Kurzantwort bearbeiten"</string>
<string name="save_action" msgid="1988862706623227093">"Speichern"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Kontakte synchr."</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Kontakte dieses Kontos synchronisieren"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Kalender synchronisieren"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Kalender dieses Kontos synchronisieren"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Kalender synchr"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Termin für dieses Kontos synchronisieren"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"E-Mails synchr."</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"E-Mails dieses Kontos synchronisieren"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibration"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> Ergebnisse von <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Einstellungen"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Allgemein"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Allgemeine Einstellungen"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"App"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatisch fortfahren"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Was soll nach dem Löschen einer Nachricht angezeigt werden?"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Kontrollkästchen ausblenden"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"In Nachrichtenlisten zum Auswählen berühren und halten"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Vor dem Löschen bestätigen"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Nachrichten"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Vor dem Senden bestätigen"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Nachrichten"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Weiter zu"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"neuerer Nachricht"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"älterer Nachricht"</string>
@@ -446,18 +458,18 @@
<string name="general_preference_text_zoom_huge" msgid="4270503132355963031">"Sehr groß"</string>
<string name="general_preference_reply_all_label" msgid="7806833609810003510">"Allen antworten"</string>
<string name="general_preference_reply_all_summary" msgid="9191932552604733245">"\"Allen antworten\" als Standard für die E-Mail-Beantwortung festlegen"</string>
- <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Anzeige der Bilder anfordern"</string>
+ <string name="general_preferences_clear_trusted_senders_title" msgid="507988226277210305">"Fragen, bevor Bilder angezeigt werden"</string>
<string name="general_preferences_clear_trusted_senders_summary" msgid="2648501128162793879">"Bilder in E-Mails werden nicht automatisch angezeigt."</string>
<string name="trusted_senders_cleared" msgid="4762002183756251723">"\"Bilder anzeigen\" gelöscht"</string>
<string name="position_of_count" msgid="7989353140376877792">"<xliff:g id="ID_1">%1$d</xliff:g> von <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="waitinf_for_sync_message_1" msgid="1393719303955128036">"Warten auf Synchronisierung"</string>
- <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Ihre E-Mail wird in Kürze angezeigt."</string>
+ <string name="waitinf_for_sync_message_2" msgid="5656175205790694016">"Ihre E-Mails werden gleich angezeigt."</string>
<string name="widget_other_views" msgid="4988574907386539499">"Symbol zum Wechseln berühren."</string>
<string name="widget_all_mail" msgid="4352573990283094963">"Kombinierter Posteingang"</string>
<string name="widget_unread" msgid="4404711399009077833">"Ungelesen"</string>
<string name="widget_starred" msgid="8290352707134011791">"Markiert"</string>
<string name="widget_loading" msgid="2340962056927255554">"Wird geladen…"</string>
- <string name="widget_touch_to_configure" msgid="7062039013915225323">"Zum Einrichten berühren."</string>
+ <string name="widget_touch_to_configure" msgid="7062039013915225323">"Zum Einrichten berühren"</string>
<string name="widget_no_accounts" msgid="2412482205591224408">"Sie haben noch kein E-Mail-Konto eingerichtet."</string>
<string name="more_than_999" msgid="8704425397397918798">"999+"</string>
<string name="search_hint" msgid="2200412192574686497">"In E-Mails suchen"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Warten auf Ergebnisse"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Bei einigen Servern benötigen Sie möglicherweise etwas mehr Geduld."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Ordner"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Verwendung der Kamera nicht zulassen"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Geräte-Passwort erforderlich"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Einsatz der letzten Passw. beschränken"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Ablaufen von Passwörtern erforderlich"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Bildschirmsperre für inaktives Gerät"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Anzahl synchronisierter Kalendereinträge begrenzen"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Anzahl synchronisierter E-Mails begrenzen"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Vielen Dank!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Hört sich gut an!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Ich lese die Nachricht später und melde mich dann."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Wir können das am besten bei einem Meeting besprechen."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Die Hintergrundsynchronisierung ist für dieses Konto während des Roamings deaktiviert."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Antwort wird gesendet..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Keine Nachrichten"</string>
</resources>
diff --git a/res/values-de/uploader.xml b/res/values-de/uploader.xml
index c8a6f2114..3bb1deacf 100644
--- a/res/values-de/uploader.xml
+++ b/res/values-de/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Details ausblenden"</string>
<string name="menu_settings" msgid="5088116127086866634">"Einstellungen"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Hochgeladen: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Konto"</string>
<string name="upload" msgid="2615541458361216022">"Hochladen"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 713c47cb4..ab55054e9 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Ανάγνωση επισυνάψεων μηνύματος ηλεκτρονικού ταχυδρομείου"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Επιτρέπει σε αυτήν την εφαρμογή την ανάγνωση των επισυνάψεων μηνυμάτων ηλεκτρονικού ταχυδρομείου."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Επιτρέπει στην εφαρμογή την ανάγνωση των συνημμένων ηλεκτρονικού ταχυδρομείου."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Πρόσβαση στα δεδομένα παρόχου ηλεκτρονικού ταχυδρομείου"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Επιτρέπει στην εφαρμογή να έχει πρόσβαση στη βάση δεδομένων του ηλεκτρονικού ταχυδρομείου σας, συμπεριλαμβανομένων των ληφθέντων μηνυμάτων, των απεσταλμένων, των ονομάτων χρηστών και των κωδικών πρόσβασης."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Επιτρέπει στην εφαρμογή την πρόσβαση στη βάση δεδομένων του ηλεκτρονικού ταχυδρομείου σας, συμπεριλαμβανομένων των ληφθέντων μηνυμάτων, των απεσταλμένων, των ονομάτων χρηστών και των κωδικών πρόσβασης."</string>
<string name="app_name" msgid="5815426892327290362">"Μήνυμα ηλεκτρονικού ταχυδρομείου"</string>
<string name="compose_title" msgid="427986915662706899">"Σύνταξη"</string>
<string name="debug_title" msgid="5175710493691536719">"Εντοπισμός σφαλμάτων"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Τέλος"</string>
<string name="create_action" msgid="3062715563215392251">"Δημιουργία νέου"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Διαγραφή"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Δεν υπάρχουν γρήγορες απαντήσεις"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Δεν υπάρχουν γρήγορες απαντήσεις."</string>
<string name="discard_action" msgid="6532206074859505968">"Απόρριψη"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Αποθ. πρόχειρου"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Εισαγωγή γρήγ. απάντησης"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Αναζήτηση"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Ρυθμίσεις λογαριασμού"</string>
<string name="settings_action" msgid="6334807007967459412">"Ρυθμίσεις"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Επιλογές συγχρονισμού"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Επιλογές συγχρονισμού"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Επισήμανση ως μη αναγνωσμένα"</string>
<string name="move_action" msgid="3059189775933985898">"Μετακίνηση"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Κοιν./Κρ.κοιν."</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"Ο χρήστης <xliff:g id="SENDER">%s</xliff:g> έγραψε:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Συμπερίληψη του αναφερόμενου κειμένου"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Συμπερίληψη κειμένου"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Πρέπει να προσθέσετε τουλάχιστον έναν παραλήπτη."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Προσθέστε τουλάχιστον έναν παραλήπτη."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Ορισμένες διευθύνσεις ηλεκτρονικού ταχυδρομείου δεν είναι έγκυρες."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Πολύ μεγάλο αρχείο για επισύναψη."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Εισαγάγετε γρήγορη απάντηση"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Αποθηκεύτ."</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Διακοπή"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Αποθήκευση επισύναψης ως <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Σφάλμα αποθήκευσης επισύναψης."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Σημείωση: Μία ή περισσότερες επισυνάψεις στο προωθημένο μήνυμά σας θα ληφθούν πριν την αποστολή."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Αδύν. η αποθ. του συνημμένου."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Ένα ή περισσότερα συνημμένα στο προωθημένο μήνυμά σας θα ληφθούν πριν την αποστολή."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Μήνυμα"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Πρόσκληση"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Δεν ήταν δυνατή η προώθηση μίας ή περισσότερων επισυνάψεων."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Η επισύναψη δεν προωθήθηκε"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Αποτυχία σύνδεσης <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Η σύνδεση στον λογαριασμό <xliff:g id="ACCOUNT_NAME">%s</xliff:g> δεν ήταν επιτυχής."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Δεν ήταν δυνατή η σύνδεση"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Παλαιότερα"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Ρύθμιση λογαριασμού"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Προσθήκη λογαριασμού Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Προσθήκη λογαριασμού Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Λογαριασμός ηλεκτρονικού ταχυδρομείου"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Μπορείτε να δημιουργήσετε ηλεκτρονικό ταχυδρομείο για τους περισσότερους λογαριασμούς σε λίγα μόλις βήματα."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Μπορείτε να δημιουργήσετε έναν λογαριασμό Exchange σε λίγα μόλις βήματα."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Μπορείτε να δημιουργήσετε έναν λογαριασμό Exchange ActiveSync σε λίγα μόλις βήματα."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Μπορείτε να ρυθμίσετε τον λογαριασμό σας σε λίγα μόλις βήματα."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Διεύθυνση ηλεκτρονικού ταχυδρομείου"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Κωδικός πρόσβασης"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου από αυτόν τον λογαριασμό από προεπιλογή."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου από αυτόν τον λογαριασμό από προεπιλογή"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Μη αυτόματη ρύθμιση"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Πληκτρολογήστε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου και έναν έγκυρο κωδικό πρόσβασης."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Διπλότυπος λογαριασμός"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Έλεγχος ρυθμίσεων διακομιστή εισερχομένων..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Έλεγχος ρυθμίσεων διακομιστή εξερχομένων..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Ρύθμιση λογαριασμού"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Ο λογαριασμός σας ρυθμίστηκε και γίνεται λήψη μηνυμάτων ηλεκτρονικού ταχυδρομείου!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Ο λογαριασμός σας ρυθμίστηκε και γίνεται λήψη μηνυμάτων ηλεκτρονικού ταχυδρομείου!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Δώστε σε αυτόν τον λογαριασμό ένα όνομα (προαιρετικό)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Το όνομά σας (προβάλλεται στα εξερχόμενα μηνύματα)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Αυτό το πεδίο δεν μπορεί να είναι κενό."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Ρυθμίσεις διακομιστή εισερχομένων"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Όνομα χρήστη"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Κωδικός πρόσβασης"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Διακομιστής POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Διακομιστής IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Διακομιστής"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Θύρα"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Τύπος ασφάλειας"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Καμία"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Διακομιστής SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Θύρα"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Τύπος ασφάλειας"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Να απαιτείται σύνδεση."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Να απαιτείται σύνδεση"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Όνομα χρήστη"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Κωδικός πρόσβασης"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Ρύθμιση λογαριασμού"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Κάθε 15 λεπτά"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Κάθε 30 λεπτά"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Κάθε ώρα"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου από αυτόν τον λογαριασμό από προεπιλογή."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Να ειδοποιούμαι κατά τη λήψη μηνύματος ηλεκτρονικού ταχυδρομείου."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Συγχρονισμός επαφών από αυτόν τον λογαριασμό."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Συγχρονισμός ημερολογίου από αυτόν τον λογαριασμό."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Συγχρονισμός μηνυμάτων ηλεκτρονικού ταχυδρομείου από αυτόν τον λογαριασμό."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου από αυτόν τον λογαριασμό από προεπιλογή"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Να ειδοποιούμαι κατά τη λήψη μηνύματος ηλεκτρονικού ταχυδρομείου"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Συγχρονισμός επαφών από αυτόν τον λογαριασμό"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Συγχρονισμός ημερολογίου από αυτόν τον λογαριασμό"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Συγχρονισμός ηλεκτρονικού ταχυδρομείου από αυτόν τον λογαριασμό"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Αυτόματη λήψη συνημμένων κατά τη σύνδεση σε δίκτυο Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Αδυναμία ολοκλήρωσης"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Ημέρες για συγχρονισμό"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Ένας μήνας"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Όλες"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Χρήση των προεπιλογών του λογαριασμού"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Λάθος όνομα χρήστη ή κωδικός πρόσβασης."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Λάθος όνομα χρήστη ή κωδικός πρόσβασης."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Λάθος όνομα χρήστη ή κωδικός πρόσβασης."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Το όνομα χρήστη ή ο κωδικός πρόσβασης είναι λάθος."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Δεν είναι δυνατή η ασφαλής σύνδεση με τον διακομιστή."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Δεν είναι δυνατή η ασφαλής σύνδεση με τον διακομιστή."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Απαιτείται πιστοποιητικό πελάτη. Να γίνει σύνδεση στο διακομιστή με χρήση πιστοποιητικού πελάτη;"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Το πιστοποιητικό δεν είναι έγκυρο ή δεν είναι δυνατή η πρόσβαση σε αυτό."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Ο διακομιστής απάντησε με σφάλμα. Ελέγξτε το όνομα χρήστη και τον κωδικό πρόσβασης και δοκιμάστε ξανά."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Απαιτείται πιστοποιητικό προγράμματος-πελάτη. Θέλετε να συνδεθείτε στο διακομιστή με ένα πιστοποιητικό προγράμματος-πελάτη;"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Το πιστοποιητικό δεν είναι έγκυρο ή δεν είναι δυνατή η πρόσβαση σε αυτό."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Ο διακομιστής ανταποκρίθηκε με σφάλμα. Ελέγξτε το όνομα χρήστη και τον κωδικό πρόσβασης και δοκιμάστε ξανά."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Δεν είναι δυνατή η σύνδεση με τον διακομιστή."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Δεν είναι δυνατή η σύνδεση με τον διακομιστή."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"Το TLS απαιτείται αλλά δεν υποστηρίζεται από τον διακομιστή."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η απενεργοποίηση της αρμοδιότητας της εφαρμογής ηλεκτρονικού ταχυδρομείου να διαχειρίζεται τη συσκευή σας, θα διαγράψει όλους τους λογαριασμούς ηλεκτρονικού ταχυδρομείου στους οποίους είναι απαραίτητη, καθώς και τα μηνύματα ηλεκτρονικού ταχυδρομείου, τις επαφές, τα συμβάντα ημερολογίου και άλλα δεδομένα."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Ενημέρωση ασφάλειας"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Ο λογαριασμός <xliff:g id="ACCOUNT">%s</xliff:g> απαιτεί την ενημέρωση των ρυθμίσεων ασφαλείας."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Από το λογαριασμό \"<xliff:g id="ACCOUNT">%s</xliff:g>\" απαιτείται ενημέρωση ρυθμίσεων ασφαλείας."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Απαιτείται ενημέρωση ασφαλείας"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Δεν είναι δυνατός ο συγχρονισμός του Λογαριασμού \"<xliff:g id="ACCOUNT">%s</xliff:g>\" λόγω απαιτήσεων ασφαλείας."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Η ενημέρωση των ρυθμίσεων ασφαλείας είναι απαραίτητη για τον λογαριασμό \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Άλλαξαν οι ρυθμίσεις ασφαλείας για τον Λογαριασμό \"<xliff:g id="ACCOUNT">%s</xliff:g>\". Δεν απαιτείται ενέργεια χρήστη."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Απαιτείται ενημέρωση ασφαλείας"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Οι πολιτικές ασφαλείας άλλαξαν"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Δεν είναι δυνατή η συμμόρφωση με τις πολιτικές ασφαλείας"</string>
<string name="account_security_title" msgid="3511543138560418587">"Ασφάλεια συσκευής"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Ο διακομιστής <xliff:g id="SERVER">%s</xliff:g> χρειάζεται την άδειά σας για να πραγματοποιήσει απομακρυσμένο έλεγχο ορισμένων λειτουργιών ασφαλείας της συσκευής σας Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Επεξεργασία λεπτομερειών"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Το PIN ή ο κωδικός πρόσβασης κλειδώματος οθόνης έχουν λήξει."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Ο κωδ. κλειδ. οθόνης έληξε"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Λήγει ο κωδικός κλειδώματος οθόνης"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Πρέπει να αλλάξετε σύντομα το PIN ή τον κωδικό πρόσβασης κλειδώματος οθόνης, διαφορετικά τα δεδομένα του λογαριασμού <xliff:g id="ACCOUNT">%s</xliff:g> θα διαγραφούν. Θέλετε να το αλλάξετε τώρα;"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Θα πρέπει να αλλάξετε σύντομα το PIN ή τον κωδικό πρόσβασης της οθνόνης κλειδώματος, διαφορετικά τα δεδομένα του λογαριασμού <xliff:g id="ACCOUNT">%s</xliff:g> θα διαγραφούν. Θέλετε να το αλλάξετε τώρα;"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Ο κωδικός κλειδώματος οθόνης έληξε"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Τα δεδομένα του λογαριασμού <xliff:g id="ACCOUNT">%s</xliff:g> διαγράφονται από τη συσκευή σας. Μπορείτε να τα επαναφέρετε αλλάζοντας το PIN ή τον κωδικό πρόσβασης κλειδώματος οθόνης. Θέλετε να τα αλλάξετε τώρα;"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Γίνεται διαγραφή των δεδομένων του λογαριασμού <xliff:g id="ACCOUNT">%s</xliff:g> από τη συσκευή σας. Μπορείτε να τα επαναφέρετε αλλάζοντας το PIN ή τον κωδικό πρόσβασης της οθόνης κλειδώματος. Θέλετε να το αλλάξετε τώρα;"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Απόρριψη μη αποθηκευμένων αλλαγών;"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Δεν ήταν δυνατή η σύνδεση"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Το όνομα χρήστη ή ο κωδικός πρόσβασης για τον λογαριασμό <xliff:g id="ACCOUNT">%s</xliff:g> είναι λανθασμένα. Θέλετε να τα ενημερώσετε τώρα;"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Το όνομα χρήστη ή ο κωδικός πρόσβασης του λογαριασμού <xliff:g id="ACCOUNT">%s</xliff:g> είναι λάθος. Θέλετε να τα ενημερώσετε τώρα;"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Προεπιλεγμένος λογαριασμός"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου από αυτόν τον λογαριασμό από προεπιλογή"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Λήψη συνημμένων"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Αυτόματη λήψη συνημμένων πρόσφατων μηνυμάτων μέσω Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Ειδοποιήσεις μηνυμάτων ηλεκτρονικού ταχυδρομείου"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Συχνότητα συγχρονισμού, ειδοποιήσεις, κτλ."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Εμφάνιση ειδοποίησης στη γραμμή συστήματος κατά τη λήψη μηνύματος ηλεκτρονικού ταχυδρομείου"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Αποστολή ειδοποίησης κατά τη λήψη μηνύματος ηλεκτρονικού ταχυδρομείου"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Συχνότητα ελέγχου εισερχομένων"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Ρυθμίσεις εισερχομένων"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Όνομα χρήστη, κωδ. πρόσβ. και άλλες ρυθμίσεις διακομιστή εισερχ."</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Ρυθμίσεις εξερχομένων"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Όνομα χρήστη, κωδ. πρόσβ. και άλλες ρυθμίσεις διακομιστή εξερχ."</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Εφαρμογή πολιτικών"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Κ"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Πολιτικές που δεν υποστηρίζονται"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Κανένα"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Προσπάθεια συγχρονισμού"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Αγγίξτε εδώ για να συγχρονίσετε αυτόν τον λογαριασμό"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Όνομα λογαριασμού"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Το όνομά σας"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Υπογραφή"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Γρήγορες απαντήσεις"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Επεξ. κειμένου που εισάγετε συχνά κατά τη σύνταξη μην. ηλ. ταχ."</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Επεξ. κειμένου που εισάγετε συχνά κατά τη σύνταξη μην. ηλ. ταχ."</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Προσάρτηση κειμένου στα μηνύματα που αποστέλλετε"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Ρυθμίσεις ειδοποιήσεων"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Χρήση δεδομένων"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Πολιτικές ασφαλείας"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Επεξεργασία γρήγορης απάντησης"</string>
<string name="save_action" msgid="1988862706623227093">"Αποθήκευση"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Συγχρονισμός επαφών"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Συγχρονισμός επαφών για αυτόν τον λογαριασμό"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Συγχρονισμός Ημερολογίου"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Συγχρονισμός ημερολογίου για αυτόν τον λογαριασμό"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Συγχρονισμός ημερολογίου"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Συγχρον. συμβ. ημερολ. λογαριασμού"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Συγχρονισμός ηλεκτρονικού ταχυδρομείου"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Συγχρονισμός μηνυμάτων ηλεκτρονικού ταχυδρομείου για αυτόν τον λογαριασμό"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Δόνηση"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> αποτελέσματα από <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Ρυθμίσεις"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Γενικές"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Γενικές ρυθμίσεις"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Εφαρμογή"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Αυτόματη συνέχιση"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Επιλογή οθόνης που εμφανίζεται μετά τη διαγραφή ενός μηνύματος"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Απόκρυψη πλαισίων ελέγχου"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Σε λίστες μηνυμάτων, πατήστε παρατεταμένα για να επιλέξετε"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Επιβεβαίωση πριν από τη διαγραφή"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Μηνύματα"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Επιβεβαίωση πριν την αποστολή"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Μηνύματα"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Συνέχιση σε"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Πιο πρόσφατο μήνυμα"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Παλαιότερο μήνυμα"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Αναμονή για αποτελέσματα"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Ορισμένοι διακομιστές ενδέχεται να χρειαστούν αρκετό χρόνο."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Φάκελοι"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Να μην επιτρ. η χρήση της κάμ. της συσκ."</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Απαιτείται κρυπτογράφηση συσκευής"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Περιορισμός της χρήσης πρόσφατων κωδικών"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Απαιτείται η λήξη των κωδικών πρόσβασης"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Απαιτείται αδρ. συσκ. για κλείδ. οθόνης."</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Περιορισμός αριθμού συγχρον. συμβάντων ημερολογίου"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Περιορισμός αριθμού συγχρον. μηνυμ. ηλ. ταχυδρομ."</string>
+ <string name="quick_1" msgid="3426057697353380951">"Ευχαριστούμε!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Καλή ιδέα!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Θα το διαβάσω αργότερα και θα επικοινωνήσω μαζί σου."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Ας κανονίσουμε μία συνάντηση για να συζητήσουμε αυτό το θέμα."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Ο συγχρονισμός στο παρασκήνιο για αυτόν το λογαριασμό είναι απενεργοποιημένος κατά την περιαγωγή."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Αποστολή απάντησης..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Δεν υπάρχουν μηνύματα."</string>
</resources>
diff --git a/res/values-el/uploader.xml b/res/values-el/uploader.xml
index 5cc8922ec..62e6b7ab6 100644
--- a/res/values-el/uploader.xml
+++ b/res/values-el/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Απόκρυψη λεπτομερειών"</string>
<string name="menu_settings" msgid="5088116127086866634">"Ρυθμίσεις"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Μεταφορτώθηκαν %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Λογαριασμός"</string>
<string name="upload" msgid="2615541458361216022">"Μεταφόρτωση"</string>
<string name="ok" msgid="2516349681897895312">"ΟΚ"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 7ba128b08..0ea8508d4 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Read email attachments"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Allows this application to read your email attachments."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Allows the app to read your email attachments."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Access email provider data"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Allows this application to access your email database, including received messages, sent messages, usernames and passwords."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Allows the app to access your email database, including received messages, sent messages, usernames and passwords."</string>
<string name="app_name" msgid="5815426892327290362">"Email"</string>
<string name="compose_title" msgid="427986915662706899">"Compose"</string>
<string name="debug_title" msgid="5175710493691536719">"Debug"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Done"</string>
<string name="create_action" msgid="3062715563215392251">"Create new"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Delete"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"No quick responses"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"No quick responses."</string>
<string name="discard_action" msgid="6532206074859505968">"Discard"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Save draft"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Insert quick response"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Search"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Account settings"</string>
<string name="settings_action" msgid="6334807007967459412">"Settings"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Sync options"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Sync options"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Mark as unread"</string>
<string name="move_action" msgid="3059189775933985898">"Move"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> wrote:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Include quoted text"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Include text"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"You must add at least one recipient."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Add at least one recipient."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Some email addresses are invalid."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"File too large to attach."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Insert quick response"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Saved"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stop"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Attachment saved as <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Couldn\'t save the attachment."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Note: One or more attachments in your forwarded message will be downloaded prior to sending."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Couldn\'t save attachment."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"One or more attachments in your forwarded message will be downloaded prior to sending."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Message"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Invite"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Could not forward one or more attachments"</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Attachment not forwarded"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> sign-in failed."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> sign-in unsuccessful."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Couldn\'t sign in"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Older"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Account setup"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Add an Exchange account"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Add an Exchange ActiveSync account"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Email account"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"You can set up email for most accounts in just a few steps."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"You can set up an Exchange account in just a few steps."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"You can set up an Exchange ActiveSync account in just a few steps."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"You can set up your account in just a few steps."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Email address"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Password"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Send email from this account by default."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Send emails from this account by default"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manual setup"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Type a valid email address and password."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplicate Account"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Checking incoming server settings…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Checking outgoing server settings…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Account setup"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Your account is set up and email is on its way!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Your account is set up and emails are on their way!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Give this account a name (optional)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Your name (displayed on outgoing messages)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"This field can\'t be blank."</string>
@@ -261,14 +257,13 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Incoming server settings"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Username"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Password"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3 server"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP server"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Security type"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"None"</string>
<string name="account_setup_incoming_security_ssl_trust_certificates_label" msgid="6151855090123117538">"SSL/TLS (Accept all certificates)"</string>
<string name="account_setup_incoming_security_ssl_label" msgid="2798501138420163861">"SSL/TLS"</string>
- <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (accept all certificates)"</string>
+ <string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS (Accept all certificates)"</string>
<string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
<string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"Delete email from server"</string>
<string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"Never"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP server"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Security type"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Require sign-in."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Require sign-in"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Username"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Password"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Account setup"</string>
@@ -305,29 +300,29 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Every 15 minutes"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Every 30 minutes"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Every hour"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Send email from this account by default."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Notify me when email arrives."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sync contacts from this account."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sync calendar from this account."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sync email from this account."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Send emails from this account by default"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Notify me when emails arrive"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sync contacts from this account"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sync calendar from this account"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sync emails from this account"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Automatically download attachments when connected to Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Couldn\'t finish"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Days to sync"</string>
<string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automatic"</string>
<string name="account_setup_options_mail_window_1day" msgid="3965715241135811407">"One day"</string>
<string name="account_setup_options_mail_window_3days" msgid="736181102295878114">"Three days"</string>
- <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"one week"</string>
+ <string name="account_setup_options_mail_window_1week" msgid="5639718031108023741">"One week"</string>
<string name="account_setup_options_mail_window_2weeks" msgid="4567049268124213035">"Two weeks"</string>
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"One month"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"All"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Use account\'s default"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Username or password incorrect."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Username or password incorrect."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Your username or password is incorrect."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Username or password is incorrect."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Can\'t safely connect to server."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Can\'t safely connect to server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Client certificate is required. Connect to server with client certificate?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Certificate is invalid or inaccessible."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"The server responded with an error. Check your username and password and then try again."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"A client certificate is required. Do you want to connect to the server with a client certificate?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"The certificate is invalid or inaccessible."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"The server responded with an error. Check your username and password, then try again."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Can\'t connect to server."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Can\'t connect to server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS required but not supported by server."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"WARNING: Deactivating the Email app\'s authority to administer your device will delete all email accounts that require it, along with their email, contacts, calendar events and other data."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Security update"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> requires you to update your security settings."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Account \"<xliff:g id="ACCOUNT">%s</xliff:g>\" requires security settings update."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Security update required"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Account \"<xliff:g id="ACCOUNT">%s</xliff:g>\" can\'t be synced due to security requirements."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Account \"<xliff:g id="ACCOUNT">%s</xliff:g>\" requires a security-settings update."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Account \"<xliff:g id="ACCOUNT">%s</xliff:g>\" has changed its security settings; no user action is required."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Security update required"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Security policies have changed"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Security policies can\'t be met"</string>
<string name="account_security_title" msgid="3511543138560418587">"Device Security"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"The server <xliff:g id="SERVER">%s</xliff:g> requires that you allow it to remotely control some security features of your Android device."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Edit details"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Your lock-screen PIN or password has expired."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Lock-screen password expired"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Lock-screen password expiring"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"You must change your lock-screen PIN or password soon or the data for <xliff:g id="ACCOUNT">%s</xliff:g> will be erased. Change it now?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"You need to change your lock screen PIN or password soon or the data for <xliff:g id="ACCOUNT">%s</xliff:g> will be erased. Do you want to change it now?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Lock-screen password expired"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"The data for <xliff:g id="ACCOUNT">%s</xliff:g> is being erased from your device. You can restore it by changing your lock-screen PIN or password. Change it now?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"The data for <xliff:g id="ACCOUNT">%s</xliff:g> is being erased from your device. You can restore it by changing your lock screen PIN or password. Do you want to change it now?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Discard unsaved changes?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Couldn\'t sign in"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"The username or password for <xliff:g id="ACCOUNT">%s</xliff:g> is incorrect. Update them now?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"The username or password for <xliff:g id="ACCOUNT">%s</xliff:g> is incorrect. Do you want to update them now?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Default account"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Send email from this account by default"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Download attachments"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Auto-download attachments to recent messages via Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Email notifications"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Sync frequency, notifications, etc."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Notify in System bar when emails arrive"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Send notification when emails arrive"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Inbox check frequency"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Incoming settings"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Username, password and other incoming server settings"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Outgoing settings"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Username, password and other outgoing server settings"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Policies enforced"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"None"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Unsupported policies"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"None"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Attempt sync"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Touch here to sync this account"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Account name"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Your name"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Signature"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Quick responses"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Edit text that you frequently insert when composing emails"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edit text that you frequently insert when composing emails"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Append text to messages that you send"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Notification settings"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Data usage"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Security policies"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Edit quick response"</string>
<string name="save_action" msgid="1988862706623227093">"Save"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sync contacts"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sync contacts for this account"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sync Calendar"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sync calendar for this account"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sync calendar"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sync calendar event for this account"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sync Email"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sync email for this account"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrate"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> results from <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Settings"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"General"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"General settings"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Application"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Auto-advance"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Select which screen to show after you delete a message"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Hide checkboxes"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"In lists of messages, touch and hold to select"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirm before deleting"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Messages"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirm before sending"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Messages"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Advance to"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Newer message"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Older message"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Waiting for results"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Some servers may take a long time."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Folders"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Disallow use of the device\'s camera"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Require device password"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Restrict the reuse of recent passwords"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Require passwords to expire"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Require an idle device to lock its screen"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Limit the number of calendar events synced"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Limit the number of emails synced"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Thanks!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Sounds good to me!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"I\'ll read this later and get back to you."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Let\'s set up a meeting to discuss this."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Background sync for this account is disabled while roaming."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Sending response..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"No messages."</string>
</resources>
diff --git a/res/values-en-rGB/uploader.xml b/res/values-en-rGB/uploader.xml
index 17bcf9267..884d92385 100644
--- a/res/values-en-rGB/uploader.xml
+++ b/res/values-en-rGB/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Hide Details"</string>
<string name="menu_settings" msgid="5088116127086866634">"Settings"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Uploaded %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Account"</string>
<string name="upload" msgid="2615541458361216022">"Upload"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 69b35adf1..87cf7e199 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Leer archivos adjuntos de correo"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Permite a esta aplicación leer los archivos adjuntos de tus correos electrónicos."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permite a la aplicación leer los archivos adjuntos de tu correo."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Acceder a los datos del proveedor de correo"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Permite que la aplicación acceda a la base de datos de tu correo, como mensajes recibidos, mensajes enviados, nombres de usuario y contraseñas."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permite que la aplicación acceda a la base de datos de tu correo, como mensajes recibidos, mensajes enviados, nombres de usuario y contraseñas."</string>
<string name="app_name" msgid="5815426892327290362">"Correo"</string>
<string name="compose_title" msgid="427986915662706899">"Redactar"</string>
<string name="debug_title" msgid="5175710493691536719">"Depurar"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Finalizado"</string>
<string name="create_action" msgid="3062715563215392251">"Crear una nueva respuesta rápida"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Eliminar"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"No hay respuestas rápidas."</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"No hay respuestas rápidas."</string>
<string name="discard_action" msgid="6532206074859505968">"Descartar"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Guardar borrador"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Insertar respuesta rápida"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Buscar"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Configuración de la cuenta"</string>
<string name="settings_action" msgid="6334807007967459412">"Configuración"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Opciones de sincronización"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Opciones de sincronización"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Marcar como no leídos"</string>
<string name="move_action" msgid="3059189775933985898">"Mover"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ CC/CCO"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> escribió:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Incluir el texto citado"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Incluir texto"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Debes agregar al menos un destinatario."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Agrega al menos un destinatario."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Algunas direcciones de correo no son válidas."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"El archivo es demasiado grande para adjuntarlo."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Insertar respuesta rápida"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Guardado"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Detener"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Archivo adj guardado como <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"No se pudo guardar el archivo adjunto."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Nota: Se descargarán uno o más archivos adjuntos de tu mensaje reenviado antes de enviar."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Error al guardar el adjunto"</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Se descargarán uno o más archivos adjuntos de tu mensaje reenviado antes de enviar."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Mensaje"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Invitar"</string>
<plurals name="message_view_show_attachments_action">
@@ -165,7 +165,7 @@
<string name="message_view_always_show_pictures_button" msgid="6523810929103546865">"Mostrar siempre"</string>
<string name="message_view_always_show_pictures_prompt" msgid="7685500276479967959">"Mostrar siempre las imágenes de este remitente"</string>
<string name="message_view_always_show_pictures_confirmation" msgid="6838463134312859448">"Las imágenes de este remitente se mostrarán automáticamente."</string>
- <string name="message_view_invite_view" msgid="5521032519960111675">"Ver en Calendario"</string>
+ <string name="message_view_invite_view" msgid="5521032519960111675">"Ver en Calendar"</string>
<string name="message_view_invite_title" msgid="3418949733434713805">"Invitación de calendario"</string>
<string name="message_view_invite_text" msgid="1212799906603873708">"¿Vas?"</string>
<string name="message_view_invite_accept" msgid="744546668021679819">" Sí"</string>
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"No se pudieron enviar uno o más adjuntos."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"No se reenvió el archivo adjunto"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Error al acceder a <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Acceso a <xliff:g id="ACCOUNT_NAME">%s</xliff:g> sin éxito"</string>
<string name="login_failed_title" msgid="7624349996212476176">"No se ha podido acceder."</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Antiguos"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Configuración de la cuenta"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Agregar una cuenta de Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Agregar una cuenta de Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Cuenta de correo"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Puedes configurar el correo de la mayoría de las cuentas en pocos pasos."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Puedes configurar una cuenta de Exchange en solo unos pasos."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Puedes configurar una cuenta de Exchange ActiveSync en pocos pasos."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Puedes configurar tu cuenta en pocos pasos."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Dirección de correo"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Contraseña"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Enviar mensaje de correo desde esta cuenta de forma predeterminada."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Enviar correo desde esta cuenta de forma predeterminada"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configuración manual"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Escribe una dirección de correo y contraseña válidas."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Cuenta duplicada"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Comprobando configuración del servidor entrante…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Comprobando configuración del servidor saliente…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Configuración de la cuenta"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Se ha configurado tu cuenta, ¡y el correo está en camino!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Se ha configurado tu cuenta y el correo está en camino."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Asigna un nombre a esta cuenta (opcional)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Tu nombre (mostrado en mensajes salientes)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Este campo no puede estar vacío."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Configuración del servidor de entrada"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nombre de usuario"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Contraseña"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Servidor POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Servidor IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Servidor"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Puerto"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipo de seguridad"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ninguno"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Servidor SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Puerto"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipo de seguridad"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Requiere inicio de sesión."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Requiere acceso"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nombre de usuario"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Contraseña"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Configuración de la cuenta"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Cada 15 minutos"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Cada 30 minutos"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Cada hora"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Enviar mensaje de correo desde esta cuenta de forma predeterminada."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Notificarme cuando llegue un mensaje de correo."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sincronizar contactos desde esta cuenta"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sincroniza el calendario desde esta cuenta"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sincronizar el correo desde esta cuenta"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Enviar correo desde esta cuenta de forma predeterminada"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Avisarme cuando llegue un correo"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sincronizar contactos desde esta cuenta"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sincronizar el calendario desde esta cuenta"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sincronizar el correo desde esta cuenta"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Descargar los archivos adjuntos automáticamente al conectarte a Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"No se pudo terminar"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Período de sincronización"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Un mes"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Todos"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Utilizar la configuración predeterminada de la cuenta."</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Nombre de usuario o contraseña incorrecta."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Nombre de usuario o contraseña incorrecta."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"El nombre de usuario o la contraseña son incorrectos."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nombre de usuario o contraseña incorrectos "\n" (<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"No se puede conectar de forma segura al servidor."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"No se puede conectar de forma segura al servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Se requiere un certificado de cliente. ¿Deseas conectarte al servidor con un certificado de cliente?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Certificado no válido o inaccesible."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"El servidor ha devuelto un error. Verifica tu nombre de usuario y contraseña e inténtalo de nuevo."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Se necesita un certificado de cliente. ¿Quieres conectarte al servidor con un certificado de cliente?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"El certificado no es válido o es inaccesible."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"El servidor ha devuelto un error. Verifica tu nombre de usuario y contraseña e inténtalo de nuevo."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"No se puede conectar al servidor."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"No se puede conectar al servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"Se requiere TLS pero el servidor no la admite."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"ADVERTENCIA: si desactivas la autoridad de la aplicación de correo para administrar tu dispositivo, se eliminarán todas las cuentas de correo que la requieran, así como sus mensajes, contactos, eventos de calendario y otros datos."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Actualización de seguridad"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> requiere que actualices tu configuración de seguridad."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"La cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" requiere que se actualice la configuración de seguridad."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Se requiere actualizar Seguridad"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"No se puede sincronizar la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" debido a diferentes requisitos de seguridad."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Debe actualizarse la configuración de seguridad de la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Se modificó la configuración de seguridad de la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\". El usuario no debe tomar ninguna medida."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Act. de seguridad requerida"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Políts. seguridad modificadas"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Falta en políts. de seguridad"</string>
<string name="account_security_title" msgid="3511543138560418587">"Seguridad del dispositivo"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"El servidor <xliff:g id="SERVER">%s</xliff:g> requiere tu permiso para controlar de forma remota algunas funciones de seguridad en tu dispositivo Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Editar detalles"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Tu PIN o contraseña de bloqueo de pantalla expiró."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"La contraseña de bloqueo de pantalla expiró"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"La contraseña de bloqueo de pantalla expiró"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Debes cambiar su PIN o contraseña de bloqueo de pantalla pronto, o se eliminarán los datos de <xliff:g id="ACCOUNT">%s</xliff:g>. ¿Deseas cambiarla ahora?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Debes cambiar el PIN o la contraseña de la pantalla de bloqueo lo antes posible o se eliminarán los datos de <xliff:g id="ACCOUNT">%s</xliff:g>. ¿Quieres cambiarlos ahora?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"La contraseña de bloqueo de pantalla expiró"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Los datos de <xliff:g id="ACCOUNT">%s</xliff:g> se eliminarán de su dispositivo. Puedes restaurarlo al cambiar tu PIN o contraseña de bloqueo de pantalla. ¿Deseas cambiarla ahora?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Los datos de <xliff:g id="ACCOUNT">%s</xliff:g> se eliminarán de su dispositivo. Puedes restaurarlo al cambiar tu PIN o tu contraseña de bloqueo de pantalla. ¿Deseas cambiarlos ahora?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"¿Descartar cambios sin guardar?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"No se pudo acceder"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"El nombre de usuario o la contraseña de <xliff:g id="ACCOUNT">%s</xliff:g>no es correcta. ¿Deseas actualizarlos ahora?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"El nombre de usuario o la contraseña de <xliff:g id="ACCOUNT">%s</xliff:g> son incorrectos. ¿Quieres actualizarlos ahora?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Cuenta predeterminada"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Enviar mensaje de correo desde esta cuenta de forma predeterminada"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Descargar archivos adjuntos"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Descarga automática por Wi-Fi de los adjuntos de msjs. recientes"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Notificaciones de correo"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Frecuencia de sincronización, notificaciones, etc."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Notificar en la barra de estado cuando llegue un correo"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Enviar una notificación cuando llegue el correo"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frecuencia de verificación de bandeja de entrada"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Configuración del servidor entrante"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nombre de usuario, contraseña y otras configuraciones de servidor de entrada"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Configuración del servidor saliente"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nombre de usuario, contraseña y otras configuraciones de servidor de salida"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Políticas en vigencia"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ninguna"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Políticas incompatibles"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ninguna"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Sincronizar esta cuenta"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Toca para sincronizar esta cuenta."</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Nombre de la cuenta"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Tu nombre"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Firma"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Respuestas rápidas"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Edita el texto que a menudo insertas en los correos electrónicos que redactas."</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edita el texto que sueles usar al redactar correos electrónicos."</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Agrega texto a los mensajes que envíes"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Configuración de notificación"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Uso de datos"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Políticas de seguridad"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Editar respuesta rápida"</string>
<string name="save_action" msgid="1988862706623227093">"Guardar"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronizar contactos"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincronizar contactos de esta cuenta"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sincronizar calendario"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sincronizar el calendario de esta cuenta"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronizar calendario"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sincr. evento calen. de esta cuenta"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincronizar correo"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincronizar el correo de esta cuenta"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrar"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultados de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Configuración"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"General"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Configuración general"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Aplicación"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avance automático"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Selecciona la pantalla que se mostrará al eliminar un mensaje."</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ocultar casillas de verificación"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"En las listas de mensajes, mantén presionado para seleccionar."</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirmar antes de eliminar"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mensajes"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirmar antes de enviar"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mensajes"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Avanzar a"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mensaje más nuevo"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mensaje anterior"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Esperando los resultados..."</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Algunos servidores pueden tardar mucho tiempo."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Carpetas"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"No usar la cámara del dispositivo"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Requerir la contraseña del dispositivo"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Limitar la reutilización de contraseñas"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Forzar la caducidad de las contraseñas"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Bloquear pant. de dispositivo inactivo"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Limitar eventos del calendario que se sincronizan"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Limitar los correos que se sincronizan"</string>
+ <string name="quick_1" msgid="3426057697353380951">"¡Gracias!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Me parece bien."</string>
+ <string name="quick_3" msgid="8061819976353395585">"Lo leeré más adelante y me pondré en contacto contigo."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Vamos a convocar a una reunión para tratar esto."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Se ha inhabilitado la sincronización en segundo plano de esta cuenta en itinerancia."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Enviando respuesta..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"No hay mensajes."</string>
</resources>
diff --git a/res/values-es-rUS/uploader.xml b/res/values-es-rUS/uploader.xml
index b3d583920..5dda4d043 100644
--- a/res/values-es-rUS/uploader.xml
+++ b/res/values-es-rUS/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Ocultar detalles"</string>
<string name="menu_settings" msgid="5088116127086866634">"Configuración"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"%s cargados"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Cuenta"</string>
<string name="upload" msgid="2615541458361216022">"Cargar"</string>
<string name="ok" msgid="2516349681897895312">"Aceptar"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 3567f55a3..82e6b8577 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Leer archivos adjuntos de correos electrónicos"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Permite que la aplicación consulte los archivos adjuntos de los mensajes de correo."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permite que la aplicación consulte los archivos adjuntos de los correos electrónicos."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Acceder a los datos del proveedor de correo electrónico"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Permite que la aplicación acceda a la base de datos de tu correo electrónico, incluidos los mensajes recibidos, los mensajes enviados, los nombres de usuario y las contraseñas."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permite que la aplicación acceda a la base de datos de tu correo electrónico, incluidos los mensajes recibidos, los mensajes enviados, los nombres de usuario y las contraseñas."</string>
<string name="app_name" msgid="5815426892327290362">"Correo"</string>
<string name="compose_title" msgid="427986915662706899">"Redactar"</string>
<string name="debug_title" msgid="5175710493691536719">"Depurar"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Listo"</string>
<string name="create_action" msgid="3062715563215392251">"Crear nueva"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Eliminar"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"No hay respuestas rápidas"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"No hay respuestas rápidas."</string>
<string name="discard_action" msgid="6532206074859505968">"Descartar"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Guardar borrador"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Usar respuesta rápida"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Búsqueda"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Ajustes de la cuenta"</string>
<string name="settings_action" msgid="6334807007967459412">"Ajustes"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Opciones de sincronización"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Opciones de sincronización"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Marcar como no leído"</string>
<string name="move_action" msgid="3059189775933985898">"Mover"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ CC/CCO"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> wrote:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Incluir texto citado"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Incluir texto"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Debes especificar, al menos, un destinatario."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Añade al menos un destinatario."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Algunas direcciones de correo electrónico no son válidas."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"El archivo es demasiado grande para adjuntarlo."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Usar respuesta rápida"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Guardado"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Detener"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Adjunto guardado como <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Error al guardar archivo adjunto"</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Nota: uno o varios de los archivos adjuntos del mensaje reenviado se descargarán antes de enviarse."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Error al guardar el adjunto"</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Uno o varios de los archivos adjuntos del mensaje reenviado se descargarán antes de enviarse."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Mensaje"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Invitación"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Error al enviar uno o varios archivos adjuntos"</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Archivo adjunto no reenviado"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Error al iniciar sesión en <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Error al iniciar sesión en <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="login_failed_title" msgid="7624349996212476176">"Error al iniciar sesión"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,16 +232,12 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Anterior"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" : "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Configuración de cuenta"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Añadir una cuenta de Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Añadir una cuenta de Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Cuenta de correo electrónico"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Puedes configurar el correo electrónico para la mayoría de las cuentas en pocos pasos."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Puedes configurar una cuenta de Exchange en pocos pasos."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Puedes configurar una cuenta de Exchange ActiveSync en pocos pasos."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Puedes configurar tu cuenta en pocos pasos."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Dirección de correo electrónico"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Contraseña"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Enviar correo electrónico desde esta cuenta de forma predeterminada"</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Conf. manual"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Enviar correo desde esta cuenta de forma predeterminada"</string>
+ <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Config. manual"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Introduce una dirección de correo electrónico y una contraseña válidas."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Cuenta duplicada"</string>
<string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Ya estás usando este nombre de usuario para la cuenta \"<xliff:g id="DUPLICATE">%s</xliff:g>\"."</string>
@@ -250,8 +246,8 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Comprobando la configuración del servidor de entrada..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Comprobando la configuración del servidor de salida..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Configuración de cuenta"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Tu cuenta ya está configurada y en breve verás tu correo"</string>
- <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Asignar un nombre a esta cuenta (opcional)"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Tu cuenta ya está configurada y en breve verás tu correo."</string>
+ <string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Asigna un nombre a esta cuenta (opcional)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Tu nombre (aparece en los mensajes enviados)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Este campo no puede estar vacío."</string>
<string name="account_setup_account_type_title" msgid="7156551693961182124">"Configuración de cuenta"</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Ajustes del servidor de entrada"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nombre de usuario"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Contraseña"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Servidor POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Servidor IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Servidor"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Puerto"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipo de seguridad"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ninguno"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Servidor SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Puerto"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipo de seguridad"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Acceso obligatorio"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Solicitar inicio de sesión"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nombre de usuario"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Contraseña"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Configuración de cuenta"</string>
@@ -297,7 +292,7 @@
<string name="account_setup_exchange_device_id_label" msgid="1646827333223157658">"ID del dispositivo móvil"</string>
<string name="account_setup_options_title" msgid="9016600767888846051">"Ajustes de la cuenta"</string>
<string name="account_setup_options_headline" msgid="4181274232835368085">"Opciones de cuenta"</string>
- <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Comprobar si hay mensajes nuevos"</string>
+ <string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"Comprobar mensajes nuevos"</string>
<string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"Nunca"</string>
<string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"Comprobación automática"</string>
<string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"Cada 5 minutos"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Cada 15 minutos"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Cada 30 minutos"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Cada hora"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Enviar correo electrónico desde esta cuenta de forma predeterminada"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Notificarme cuando llegue un correo electrónico"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sincronizar contactos desde esta cuenta"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sincronizar calendario desde esta cuenta"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sincronizar mensajes de correo procedentes de esta cuenta"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Enviar correo desde esta cuenta de forma predeterminada"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Notificarme cuando llegue un correo"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sincronizar contactos de esta cuenta"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sincronizar calendario de esta cuenta"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sincronizar correo de esta cuenta"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Descargar adjuntos automáticamente al conectar a una red WiFi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Error al completar la configuración"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Días para sincronizar"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Un mes"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Todo"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Predeterminada de cuenta"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Nombre de usuario o contraseña incorrecta"</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Nombre de usuario o contraseña incorrecta"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nombre de usuario o contraseña incorrectos"</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nombre de usuario o contraseña incorrectos"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"No se puede establecer conexión de forma segura con el servidor."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"No se puede establecer conexión de forma segura con el servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Se requiere un certificado de cliente. ¿Quieres conectarte al servidor con un certificado de cliente?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"El certificado no es válido o no se puede acceder a él."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"El servidor ha devuelto un error. Comprueba tu nombre de usuario y tu contraseña y vuelve a intentarlo."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Se necesita un certificado de cliente. ¿Quieres conectarte al servidor con un certificado de cliente?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"El certificado no es válido o no se puede acceder a él."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"El servidor ha devuelto un error. Comprueba tu nombre de usuario y tu contraseña y vuelve a intentarlo."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"No se puede establecer conexión con el servidor."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"No se puede establecer conexión con el servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"El protocolo TLS es obligatorio, pero el servidor no lo admite."</string>
@@ -343,50 +338,61 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"ADVERTENCIA: si desactivas el permiso de la aplicación Correo para administrar tu dispositivo, se eliminarán todas las cuentas de esta aplicación que requieran su uso, así como las direcciones de correo electrónico, los contactos, los eventos de calendario y otro tipo de datos."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Actualización de seguridad"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> requiere que actualices la configuración de seguridad."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Es necesario actualizar la configuración de seguridad de la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Actualización seguridad necesaria"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Los requisitos de seguridad de la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" no permiten su sincronización."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Es necesario actualizar la configuración de seguridad de la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Se ha modificado la configuración de seguridad de la cuenta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" (no es necesaria la intervención del usuario)."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Actualización seguridad necesaria"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Políticas de seguridad modificadas"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Error al cumplir políticas seguridad"</string>
<string name="account_security_title" msgid="3511543138560418587">"Seguridad del dispositivo"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Es necesario que permitas que el servidor <xliff:g id="SERVER">%s</xliff:g> controle de forma remota algunas funciones de seguridad de tu dispositivo Android."</string>
- <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Editar detalles"</string>
+ <string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Aceptar"</string>
<string name="password_expire_warning_ticker_fmt" msgid="2459977229180023773">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" requiere que modifiques la contraseña o el PIN de la pantalla de bloqueo."</string>
<string name="password_expire_warning_content_title" msgid="7174669014074849304">"Contraseña bloqueo pantalla va a caducar"</string>
<string name="password_expired_ticker" msgid="4230570412974108968">"La contraseña o el PIN de la pantalla de bloqueo ha caducado."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Contraseña bloqueo caducada"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Contraseña bloqueo pantalla va a caducar"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Deberás modificar la contraseña o el PIN de la pantalla de bloqueo en breve o se borrarán los datos de <xliff:g id="ACCOUNT">%s</xliff:g>. ¿Quieres cambiarla ahora?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Debes cambiar la contraseña o el PIN de la pantalla de bloqueo lo antes posible para que no se borren los datos de <xliff:g id="ACCOUNT">%s</xliff:g>. ¿Quieres hacerlo ahora?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Contraseña bloqueo caducada"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Los datos de <xliff:g id="ACCOUNT">%s</xliff:g> se están borrando del dispositivo. Para restaurarlos, modifica la contraseña o el PIN de la pantalla de bloqueo. ¿Quieres cambiarlos ahora?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Los datos de <xliff:g id="ACCOUNT">%s</xliff:g> se están borrando del dispositivo. Para restaurarlos, modifica la contraseña o el PIN de la pantalla de bloqueo. ¿Quieres hacerlo ahora?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"¿Quieres descartar los cambios no guardados?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Error al iniciar sesión"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"El nombre de usuario o la contraseña de <xliff:g id="ACCOUNT">%s</xliff:g> son incorrectos. ¿Quieres actualizarlos ahora?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"El nombre de usuario o la contraseña de <xliff:g id="ACCOUNT">%s</xliff:g> son incorrectos. ¿Quieres actualizarlos ahora?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Cuenta predeterminada"</string>
- <string name="account_settings_default_summary" msgid="1531901438624688482">"Enviar correo electrónico desde esta cuenta de forma predeterminada"</string>
+ <string name="account_settings_default_summary" msgid="1531901438624688482">"Enviar correo desde esta cuenta de forma predeterminada"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Descargar adjuntos"</string>
- <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Descarga automática de adjuntos de mensajes recientes por Wi-Fi"</string>
+ <string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Descargar automáticamente adjuntos de correos recientes por Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Notificaciones de correo"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Frecuencia de sincronización, notificaciones, etc."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Notificar en barra del sistema cuando llegue un correo electrónico"</string>
- <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Comprobar si hay mensajes nuevos"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Enviar notificación cuando llegue un correo electrónico"</string>
+ <string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Comprobar mensajes nuevos"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Ajustes de entrada"</string>
- <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nombre usuario, contraseña y otros ajustes servidor de entrada"</string>
+ <string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nombre de usuario, contraseña y otros ajustes del servidor de entrada"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Ajustes de salida"</string>
- <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nombre usuario, contraseña y otros ajustes servidor de salida"</string>
+ <string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nombre de usuario, contraseña y otros ajustes del servidor de salida"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Políticas aplicadas"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ninguno"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Políticas no admitidas"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ninguno"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Intentar sincronización"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Toca para sincronizar esta cuenta."</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Nombre de cuenta"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Tu nombre"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Firma"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Respuestas rápidas"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Edita texto que suelas usar en mensajes de correo electrónico."</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Texto que sueles usar en tus correos"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Añadir texto al final de los mensajes enviados"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Ajustes de notificaciones"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Uso de datos"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Políticas de seguridad"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Editar respuesta rápida"</string>
<string name="save_action" msgid="1988862706623227093">"Guardar"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronizar contactos"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincronizar contactos de esta cuenta"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sincronizar calendario"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sincronizar calendario de esta cuenta"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronizar calendario"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sincronizar eventos de calendario para esta cuenta"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincronizar correo"</string>
- <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincronizar mensajes de correo electrónico de esta cuenta"</string>
+ <string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincronizar correo de esta cuenta"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrar"</string>
<string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"Vibrar también cuando llegue un mensaje"</string>
<string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"Siempre"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultados de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Ajustes"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"General"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Ajustes generales"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Aplicación"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avance automático"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Selecciona la pantalla que se mostrará después de eliminar el mensaje"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ocultar casillas de verificación"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"En las listas de mensajes, mantener pulsado para seleccionar"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirmar para eliminar"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mensajes"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirmar para enviar"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mensajes"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Ir a"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mensaje más reciente"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mensaje anterior"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Esperando resultados"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Algunos servidores pueden tardar mucho tiempo."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Carpetas"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"No permitir usar cámara del dispositivo"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Solicitar contraseña del dispositivo"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Restringir nuevo uso contraseñas recientes"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Forzar vencimiento de contraseñas"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Dispositivo inactivo necesario para bloqueo"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Limitar número de eventos que se sincronizan"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Limitar número de correos que se sincronizan"</string>
+ <string name="quick_1" msgid="3426057697353380951">"¡Gracias!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Me parece bien, ¡gracias!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Lo leeré más tarde y te enviaré una respuesta."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Vamos a reunirnos para hablar de este tema."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Se ha inhabilitado la sincronización en segundo plano de esta cuenta en itinerancia."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Enviando respuesta..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"No hay ningún mensaje."</string>
</resources>
diff --git a/res/values-es/uploader.xml b/res/values-es/uploader.xml
index fb6ff2ae0..c706c4aa9 100644
--- a/res/values-es/uploader.xml
+++ b/res/values-es/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Ocultar detalles"</string>
<string name="menu_settings" msgid="5088116127086866634">"Ajustes"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Subido el: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Cuenta"</string>
<string name="upload" msgid="2615541458361216022">"Subir"</string>
<string name="ok" msgid="2516349681897895312">"Aceptar"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 8ba8c1969..1e73f8840 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Loe meili manuseid"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Võimaldab sellel rakendusel lugeda teie meilimanuseid."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Võimaldab rakendusel lugeda teie meilisõnumite manuseid."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Juurdepääs e-posti teenusepakkuja andmetele"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Lubab sellel rakendusel juurde pääseda teie e-posti andmebaasile, sh vastuvõetud sõnumitele, saadetud sõnumitele, kasutajanimedele ja paroolidele."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Võimaldab rakendusel pääseda teie meiliandmebaasi, sealhulgas vastuvõetud ja saadetud sõnumite, kasutajanimede ning paroolide juurde."</string>
<string name="app_name" msgid="5815426892327290362">"E-post"</string>
<string name="compose_title" msgid="427986915662706899">"Koostamine"</string>
<string name="debug_title" msgid="5175710493691536719">"Silumine"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Valmis"</string>
<string name="create_action" msgid="3062715563215392251">"Loo uus"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Kustuta"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Kiireid vastuseid pole"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Kiirvastuseid pole."</string>
<string name="discard_action" msgid="6532206074859505968">"Loobu"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Salvesta mustand"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Sisesta kiirvastus"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Otsing"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Konto seaded"</string>
<string name="settings_action" msgid="6334807007967459412">"Seaded"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Sünkroonimisvalikud"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Sünkroonimisvalikud"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Märgi mitteloetuks"</string>
<string name="move_action" msgid="3059189775933985898">"Teisalda"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ koopia/pimek."</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> kirjutas:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Osundatud teksti lisamine"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Lisa tekst"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Peate lisama vähemalt ühe saaja."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Lisage vähemalt üks saaja."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Mõned e-posti aadressid on kehtetud."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Fail on manustamiseks liiga suur."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Kiirvastuse sisestamine"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Salvestatud"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Peata"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Manus salvestatakse nimega <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Ei saanud manust salvestada."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Märkus: üks või mitu manust edastatud sõnumis laaditakse enne saatmist alla."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Manust ei saanud salvestada."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Vähemalt üks edastatava sõnumi manus laaditakse enne saatmist alla."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Sõnum"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Kutsu"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Ühe või mitme manuse edastamine ebaõnnestus."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Manust ei edastatud"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Kasutaja <xliff:g id="ACCOUNT_NAME">%s</xliff:g> sisselogimine ebaõnnestus."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Kontole <xliff:g id="ACCOUNT_NAME">%s</xliff:g> sisselogimine ebaõnnestus."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Sisselogimine ebaõnnestus"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Vanemad"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Konto seadistamine"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Lisage Exchange\'i konto"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Exchange ActiveSynci konto lisamine"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Meilikonto"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Saate enamiku kontode e-posti seadistada vaid mõne sammuga."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Exchange\'i konto saate seadistada vaid mõne sammuga."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Exchange ActiveSynci konto saate seadistada vaid mõne sammuga."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Seadistage oma konto vaid mõne sammuga."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-posti aadress"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Parool"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Saada meilid vaikimisi sellelt kontolt."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Saada meilid vaikimisi sellelt kontolt"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Seadista käsitsi"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Sisestage kehtiv e-posti aadress ja parool."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplikaatkonto"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Sissetuleva serveri seadete kontrollimine ..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Väljuva serveri seadete kontrollimine ..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Konto seadistamine"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Teie konto on seadistatud ja e-post on loomisel."</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Teie konto on seadistatud ja meilid on tulekul."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Anna sellele kontole nimi (valikuline)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Teie nimi (kuvatakse väljuvates sõnumites)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"See väli ei tohi tühi olla."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Sissetuleva serveri seaded"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Kasutajanimi"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Parool"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3-server"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP-server"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Turvalisuse tüüp"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Puudub"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-server"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Turvalisuse tüüp"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Nõua sisselogimist."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Sisselogimine on nõutav"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Kasutajanimi"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Parool"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Konto seadistamine"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Iga 15 minuti järel"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Iga 30 minuti järel"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Kord tunnis"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Saada meilid vaikimisi sellelt kontolt."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Teavita mind meili saabumisest."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sünkrooni selle konto kontaktid."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sünkrooni selle konto kalender."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sünkrooni selle konto meil."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Saada meilid vaikimisi sellelt kontolt"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Teavita mind meili saabumisest"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sünkrooni selle konto kontaktid"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sünkrooni selle konto kalender"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sünkrooni selle konto meilid"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Manuste automaatne allalaadimine WiFi-ühenduse olemasolul"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Ei saanud lõpetada"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Päevi sünkroonimiseks"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Üks kuu"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Kõik"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Konto vaikeseade kasutam."</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Kasutajanimi või parool on vale."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Kasutajanimi või parool on vale."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Kasutajanimi või parool on vale."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Kasutajanimi või parool on vale."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Serveriga ei saa turvaliselt ühendust."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Serveriga ei saa turvaliselt ühendust."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Vajalik on kliendi sertifikaat. Kas soovite kliendi sertifikaadiga luua ühenduse serveriga?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Sertifikaat on kehtetu või juurdepääsmatu."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Server saatis veateate. Kontrollige kasutajanime ja parooli ning proovige uuesti."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Kliendi sertifikaat on nõutav. Kas soovite luua ühenduse serveriga kliendi sertifikaadi abil?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sertifikaat on kehtetu või juurdepääsmatu."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Server saatis veateate. Kontrollige kasutajanime ja parooli ning proovige uuesti."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Serveriga ei saa ühendust."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Serveriga ei saa ühendust."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS on vajalik, kuid server ei toeta seda."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"HOIATUS: meilirakenduse volituse inaktiveerimine seadme haldamiseks kustutab kõik meilikontod, mis seda nõuavad, sh nende meilid, kontaktid, kalendrisündmused ja muud andmed."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Turvavärskendus"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> nõuab, et värskendaksite oma turvaseadeid."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Konto „<xliff:g id="ACCOUNT">%s</xliff:g>” vajab turvaseadete värskendamist."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Vaja on turvavärskendust"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Kontot „<xliff:g id="ACCOUNT">%s</xliff:g>” ei saa turvanõuete tõttu sünkroonida."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Konto „<xliff:g id="ACCOUNT">%s</xliff:g>” vajab turvaseadete värskendamist."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Konto „<xliff:g id="ACCOUNT">%s</xliff:g>” muutis turvaseadeid. Kasutaja ei pea midagi tegema."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Nõutav turvavärskendus"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Turvaeeskirjad on muutunud"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Turbe-eeskirju ei saa täita"</string>
<string name="account_security_title" msgid="3511543138560418587">"Seadme turvalisus"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Server <xliff:g id="SERVER">%s</xliff:g> nõuab mõnede teie Android-seadme turvafunktsioonide kaugjuhtimise lubamist."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Muuda üksikasju"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Teie ekraaniluku PIN-kood või parool on aegunud."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Ekraaniluku parool on aegunud"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Ekraaniluku parool on aegumas"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Peate ekraaniluku PIN-koodi või parooli varsti muutma või konto <xliff:g id="ACCOUNT">%s</xliff:g> andmed kustutatakse. Kas muuta kohe?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Teil tuleb varsti lukustuskuva PIN-koodi või parooli muuta, vastasel korral kustutatakse konto <xliff:g id="ACCOUNT">%s</xliff:g> andmed. Kas soovite kohe muuta?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Ekraaniluku parool on aegunud"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Konto <xliff:g id="ACCOUNT">%s</xliff:g> andmeid kustutatakse seadmest. Taastada saate, muutes ekraaniluku PIN-koodi või parooli. Kas muuda seda kohe?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Konto <xliff:g id="ACCOUNT">%s</xliff:g> andmed kustutatakse teie seadmest. Taastamiseks muutke oma lukustuskuva PIN-koodi või parooli. Kas soovite kohe muuta?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Kas loobute salvestamata muudatustest?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Sisselogimine ebaõnnestus"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Konto <xliff:g id="ACCOUNT">%s</xliff:g> kasutajanimi või parool on vale. Kas värskendada praegu?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Konto <xliff:g id="ACCOUNT">%s</xliff:g> kasutajanimi või parool on vale. Kas soovite neid kohe värskendada?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Vaikekonto"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Saada meilid vaikimisi sellelt kontolt"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Manuste allalaadimine"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Hiljutiste sõnumite manuste automaatne allalaadimine WiFi kaudu"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Meiliteatised"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Sünkroonimise sagedus, teatised jne."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Teavita süsteemiribal, kui saabub meil"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Saada teatis meili saabumisel"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Postkasti kontrollimise sagedus"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Sissetulevate seaded"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Kasutajanimi, parool ja muud sissetuleva posti serveri seaded"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Väljuvad seaded"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Kasutajanimi, parool ja muud väljamineva posti serveri seaded"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Eeskirjad on jõustatud"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Puudub"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Toeta eeskirjad"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Puudub"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Proovi sünkroonida"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Konto sünkroonimiseks puudutage siin"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Konto nimi"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Teie nimi"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Allkiri"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Kiirvastused"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Muuda teksti, mida sageli sisestate meilide koostamisel"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Muutke teksti, mida meilide koostamisel sageli sisestate"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Lisa saadetavatele sõnumitele tekst"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Teadistusseaded"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Andmete kasutamine"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Turvaeeskirjad"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Kiirvastuse muutmine"</string>
<string name="save_action" msgid="1988862706623227093">"Salvesta"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sünkrooni kontaktid"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Konto kontaktide sünkroonimine"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sünkrooni kalender"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Konto kalendri sünkroonimine"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sünkrooni kalender"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sünkrooni konto kalendri sündmused"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sünkrooni meil"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Konto meili sünkroonimine"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibreering"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> tulemust domeenilt <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Seaded"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Üldine"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Üldseaded"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Rakendus"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automaatne edasiminek"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Valige, millist ekraani pärast sõnumi kustutamist kuvada"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Peida märkeruudud"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Sõnumite loendis peab valimiseks üksust puudutama ja all hoidma"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Kinnitamine enne kustutamist"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Sõnumid"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Kinnitamine enne saatmist"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Sõnumid"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Edasiminek"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Uuem sõnum"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Vanem sõnum"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Tulemuste ootamine"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Mõnede serverite vastust tuleb kaua oodata."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Kaustad"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Keela seadme kaamera kasutamine"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Nõua seadme parooli"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Piira hiljutiste paroolide taaskasutamist"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Paroolide aegumise nõue"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Nõua jõudeolekus seadme ekraanilukustust"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Piirab sünkroonitavate kalendrisündmuste arvu"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Piirab sünkroonitavate meilide arvu"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Aitäh!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Mulle sobib!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Loen seda hiljem ja võtan siis ühendust."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Lepime kokku kohtumise, et seda arutada."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Taustsünkroonimine on sellel kontol rändluse ajal keelatud."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Vastuse saatmine ..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Sõnumeid pole."</string>
</resources>
diff --git a/res/values-et/uploader.xml b/res/values-et/uploader.xml
index a13e3197d..f42e288a5 100644
--- a/res/values-et/uploader.xml
+++ b/res/values-et/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Peida üksikasjad"</string>
<string name="menu_settings" msgid="5088116127086866634">"Seaded"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Üles laaditud %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Konto"</string>
<string name="upload" msgid="2615541458361216022">"Laadi üles"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index ec176ecdd..f291c4b25 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"خواندن پیوستهای ایمیل"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"به این برنامه اجازه می‌دهد پیوستهای ایمیل شما را بخواند."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"به برنامه اجازه می‌دهد پیوست‌های ایمیل شما را بخواند."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"دسترسی به داده‌های ارائه‌کننده ایمیل"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"به این برنامه کاربردی اجازه می‌دهد به پایگاه داده ایمیل شما، شامل پیام‌های دریافتی، پیام‌های ارسالی، نام‌های کاربری و گذرواژه‌ها دسترسی داشته باشد."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"به برنامه کاربردی اجازه می‌دهد به پایگاه داده ایمیل شما، شامل پیام‌های دریافتی، پیام‌های ارسالی، نام‌های کاربری و گذرواژه‌ها دسترسی داشته باشد."</string>
<string name="app_name" msgid="5815426892327290362">"ایمیل"</string>
<string name="compose_title" msgid="427986915662706899">"نگاشتن"</string>
<string name="debug_title" msgid="5175710493691536719">"رفع خطا"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"انجام شد"</string>
<string name="create_action" msgid="3062715563215392251">"ایجاد مورد جدید"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"حذف"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"پاسخ سریعی وجود ندارد"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"پاسخ سریعی وجود ندارد."</string>
<string name="discard_action" msgid="6532206074859505968">"صرفنظر"</string>
<string name="save_draft_action" msgid="6413714270991417223">"ذخیره پیش نویس"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"درج پاسخ سریع"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"جستجو"</string>
<string name="account_settings_action" msgid="4494079183315085171">"تنظیمات حساب"</string>
<string name="settings_action" msgid="6334807007967459412">"تنظیمات"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"گزینه‌های همگام‌سازی"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"گزینه‌های همگام‌سازی"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"علامت گذاری بعنوان خوانده نشده"</string>
<string name="move_action" msgid="3059189775933985898">"انتقال"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ گیرنده کپی/گیرنده مخفی"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> نوشت:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"شامل نوشتار نقل قول شده"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"شامل متن"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"باید حداقل یک گیرنده اضافه کنید."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"حداقل یک گیرنده اضافه کنید."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"برخی از آدرس های ایمیل نامعتبر هستند."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"فایل خیلی بزرگ است و پیوست نمی شود"</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"درج پاسخ سریع"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"ذخیره شد"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"توقف"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"پیوست به عنوان <xliff:g id="FILENAME">%s</xliff:g> ذخیره شد."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"نمی‌توان پیوست را ذخیره کرد."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"توجه: یک یا چند پیوست در پیام هدایت شده شما قبل از ارسال دانلود می شود."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"پیوست ذخیره نشد."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"یک یا چند پیوست در پیام هدایت شده شما قبل از ارسال دانلود خواهد شد."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"پیام"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"دعوت کردن"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"یک یا چند پیوست باز ارسال نشد."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"پیوست هدایت نشد"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"ورود به سیستم <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ناموفق بود."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"ورود به سیستم <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ناموفق بود."</string>
<string name="login_failed_title" msgid="7624349996212476176">"ورود به سیستم ممکن نیست"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> بایت"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"قدیمی تر"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" -- "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"تنظیم حساب"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"افزودن یک حساب Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"افزودن یک حساب Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"حساب ایمیل"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"می‌توانید فقط با انجام چند مرحله، ایمیل را برای اکثر حساب‌ها تنظیم کنید."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"شما می‌توانید فقط با انجام چند مرحله یک حساب Exchange تنظیم کنید."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"می‌توانید فقط با انجام چند مرحله، یک حساب Exchange ActiveSync تنظیم کنید."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"شما می‌توانید حساب خود را فقط در چند مرحله تنظیم کنید."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"آدرس ایمیل"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"رمز ورود"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"ارسال ایمیل از این حساب به صورت پیش فرض."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"ارسال ایمیل از این حساب به صورت پیش‌فرض"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"تنظیم دستی"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"یک آدرس ایمیل و گذرواژه معتبر تایپ کنید."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"حساب تکراری"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"در حال بررسی تنظیمات سرور ورودی..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"در حال بررسی تنظیمات سرور خروجی..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"تنظیم حساب"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"حساب شما تنظیم شد و ایمیل در راه است!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"حساب شما تنظیم شد و ایمیل در راه است!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"نامی به این حساب اختصاص دهید (اختیاری)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"نام شما (در پیام های خروجی نمایش داده می شود)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"این قسمت نمی‌تواند خالی باشد."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"تنظیمات سرور ورودی"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"نام کاربری"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"رمز ورود"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"سرور POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"سرور IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"سرور"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"درگاه"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"نوع امنیت"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"هیچکدام"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"سرور SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"درگاه"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"نوع امنیت"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"باید به سیستم وارد شوید."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"ورود به سیستم لازم است"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"نام کاربری"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"رمز ورود"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"تنظیم حساب"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"هر 15 دقیقه"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"هر 30 دقیقه"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"هر ساعت"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"ارسال ایمیل از این حساب به صورت پیش فرض."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"ورود ایمیل به من اعلان شود."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"همگام سازی مخاطبین از این حساب."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"همگام سازی تقویم از این حساب."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"ایمیل را از این حساب همگام سازی کنید."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"ارسال ایمیل از این حساب به صورت پیش‌فرض"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"ورود ایمیل به من اعلان شود"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"همگام سازی مخاطبین از این حساب"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"همگام‌سازی تقویم از این حساب"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"همگام‌سازی ایمیل از این حساب"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"دانلود خودکار پیوست ها هنگام اتصال به Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"پایان نیافت"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"روزهای همگام‌سازی"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"یک ماه"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"همه"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"استفاده از پیش فرض حساب"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"نام کاربری یا رمز ورود نادرست است."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"نام کاربری یا رمز ورود نادرست است. "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"نام کاربری یا گذرواژه شما اشتباه است."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"نام کاربری یا گذرواژه نادرست است."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"اتصال امن به سرور امکان‌پذیر نیست."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"اتصال امن به سرور امکان‌پذیر نیست."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"گواهی سرویس‌ گیرنده مورد نیاز است. اتصال به سرور با گواهی سرویس‌ گیرنده؟"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"گواهینامه نامعتبر است و یا غیر قابل‌دسترسی است."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"سرور با یک خطا پاسخ داد. لطفاً نام کاربری و گذرواژه خود را بررسی کرده و دوباره امتحان کنید."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"به گواهینامه کلاینت نیاز دارد. آیا می‌خواهید با گواهینامه کلاینت به سرور متصل شوید؟"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"گواهینامه نامعتبر است و یا غیرقابل دسترس است."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"سرور با یک خطا پاسخ داد. نام کاربری و گذرواژه خود را بررسی کرده و دوباره امتحان کنید."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"اتصال به سرور امکان‌پذیر نیست."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"اتصال به سرور امکان‌پذیر نیست."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS لازم است اما توسط سرور پشتیبانی نمی شود."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"اخطار: غیرفعال کردن اختیار برنامه ایمیل برای سرپرستی دستگاه شما، همه حساب‌های ایمیلی که به آن احتیاج دارند، به همراه ایمیل، مخاطبین، رویدادهای تقویم و سایر داده‌های آنها را حذف می‌کند."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"به‌روزرسانی امنیتی"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> از شما می‌خواهد تنظیمات امنیتی خود را به‌روزرسانی کنید."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"تنظیمات امنیتی حساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" باید به روزرسانی شود."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"به روزرسانی امنیتی لازم است"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"به دلایل امنیتی، امکان همگام‌سازی حساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" وجود ندارد."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"تنظیمات امنیتی حساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" باید به‌روزرسانی شود."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"حساب \"<xliff:g id="ACCOUNT">%s</xliff:g>\" تنظیمات امنیتی خود را تغییر داده است؛ نیازی به انجام هیچ کاری از طرف کاربر نیست."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"به‌روزرسانی امنیتی لازم است"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"خط‌مشی‌های امنیتی تغییر کرده‌اند"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"از خط‌مشی‌های امنیتی تبعیت نمی‌شود"</string>
<string name="account_security_title" msgid="3511543138560418587">"امنیت دستگاه"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"سرور <xliff:g id="SERVER">%s</xliff:g> از شما می خواهد که به آن اجازه دهید برخی از ویژگی های امنیتی دستگاه Android شما را از راه دور کنترل کند."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"ویرایش جزئیات"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"کد پین یا رمز ورود قفل صفحه منقضی شده است."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"رمز ورود قفل صفحه منقضی شده است"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"رمز ورود قفل صفحه در حال انقضا"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"شما باید به زودی کد پین یا رمز ورود قفل صفحه را تغییر دهید، در غیر این صورت داده های <xliff:g id="ACCOUNT">%s</xliff:g> پاک می شود. اکنون تغییر می دهید؟"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"باید پین قفل صفحه یا گذرواژه خود را سریع تغییر دهید، در غیر اینصورت داده‌های <xliff:g id="ACCOUNT">%s</xliff:g> پاک خواهد شد . آیا می‌خواهید اکنون آن‌ را تغییر دهید؟"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"رمز ورود قفل صفحه منقضی شده است"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"داده های <xliff:g id="ACCOUNT">%s</xliff:g> از دستگاه شما حذف می شوند. می توانید با تغییر کد پین یا رمز ورود صفحه قفل خود آنها را بازیابی کنید. اکنون آنرا تغییر می دهید؟"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"داده‌های <xliff:g id="ACCOUNT">%s</xliff:g> درحال پاک شدن از دستگاه شما است. با تغییر دادن پین صفحه قفل یا گذرواژه خود می‌توانید آنها را بازگردانید. آیا می‌خواهید هم اکنون آن‌ را تغییر دهید؟"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"از تغییرات ذخیره نشده صرفنظر شود؟"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"ورود به سیستم ممکن نیست"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"نام کاربری یا رمز ورود <xliff:g id="ACCOUNT">%s</xliff:g> نادرست است. اکنون آنها را به روزرسانی می کنید؟"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"نام کاربری یا گذرواژه <xliff:g id="ACCOUNT">%s</xliff:g> نادرست است. آیا می‌خواهید هم اکنون آنها را به‌روز کنید؟"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"حساب پیش فرض"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"ارسال ایمیل از این حساب به صورت پیش فرض"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"دانلود پیوست‌ها"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"دانلود خودکار پیوست‌ها به پیامهای اخیر از طریق Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"اعلان های ایمیل"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"تکرار همگام سازی، اعلان ها، موارد دیگر"</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"ورود ایمیل در نوار سیستم اعلام شود"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"ارسال اعلان هنگام ورود ایمیل"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"دفعات بررسی صندوق دریافت"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"تنظیمات ورودی"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"نام کاربری، رمز ورود و سایر تنظیمات سرور ورودی"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"تنظیمات خروجی"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"نام کاربری، رمز ورود و سایر تنظیمات سرور خروجی"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"خط‌مشی‌های اعمال شده"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"هیچکدام"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"خط مشی‌های پشتیبانی نشده"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"هیچکدام"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"تلاش برای همگام‌سازی"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"برای همگام‌سازی این حساب اینجا را لمس کنید"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"نام حساب"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"نام شما"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"امضا"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"پاسخ‌های سریع"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"متنی را که غالباً هنگام نوشتن ایمیل ها درج می کنید، ویرایش کنید"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"ویرایش متنی که غالباً هنگام نوشتن ایمیل درج می‌کنید"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"افزودن متن به پیام هایی که ارسال می کنید"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"تنظیمات اعلان"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"مصرف داده"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"خط‌مشی‌های امنیتی"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"ویرایش پاسخ سریع"</string>
<string name="save_action" msgid="1988862706623227093">"ذخیره"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"همگام سازی مخاطبین"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"همگام سازی مخاطبین برای این حساب"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"همگام سازی تقویم"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"همگام سازی تقویم برای این حساب"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"همگام سازی تقویم"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"همگام‌‌سازی رویداد تقویم برای این حساب"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"همگام‌سازی ایمیل"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"همگام سازی ایمیل برای این حساب"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"لرزش"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> نتیجه از <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"تنظیمات"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"عمومی"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"تنظیمات کلی"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"برنامه کاربردی"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"پیشرفته خودکار"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"انتخاب کنید بعد از حذف یک پیام، چه صفحه‌ای نشان داده شود"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"پنهان کردن کادرهای تأیید"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"در لیست پیام‌ها، برای انتخاب کردن، لمس کرده و نگهدارید"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"تأیید قبل از حذف"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"پیام‌ها"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"تأیید قبل از ارسال"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"پیام‌ها"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"پیشروی به"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"پیام جدیدتر"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"پیام قدیمی تر"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"در انتظار نتایج"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"در بعضی از سرورها ممکن است زمان طولانی شود."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"پوشه ها"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"استفاده از دوربین دستگاه مجاز نیست"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"گذرواژه دستگاه لازم است"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"استفاده مجدد از گذرواژه‌های اخیر محدود است"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"گذرواژه‌ها باید منقضی شوند"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"برای قفل کردن صفحه خود یک دستگاه آماده به کار لازم است"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"محدود کردن تعداد رویدادهای همگام‌سازی شده تقویم"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"محدود کردن تعداد ایمیل‌های همگام‌سازی شده"</string>
+ <string name="quick_1" msgid="3426057697353380951">"متشکریم!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"به نظرم خوب است!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"بعداً این را میخوانم و به شما اطلاع میدهم."</string>
+ <string name="quick_4" msgid="3988974084396883051">"بیایید یک جلسه تشکیل بدهیم و درباره آن گفتگو کنیم."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"هنگام رومینگ، همگام‌سازی پس‌زمینه برای این حساب غیرفعال است."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"در حال ارسال پاسخ…"</string>
+ <string name="no_conversations" msgid="5559527390337162819">"پیامی موجود نیست."</string>
</resources>
diff --git a/res/values-fa/uploader.xml b/res/values-fa/uploader.xml
index f4657da3a..2fdb77ec7 100644
--- a/res/values-fa/uploader.xml
+++ b/res/values-fa/uploader.xml
@@ -30,7 +30,7 @@
<!-- String.format failed for translation -->
<!-- no translation found for format_date_uploaded (803752037646090928) -->
<skip />
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"حساب"</string>
<string name="upload" msgid="2615541458361216022">"آپلود"</string>
<string name="ok" msgid="2516349681897895312">"تأیید"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 8688190f5..9afe48f71 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Lue sähköpostiliitteitä"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Antaa sovelluksen lukea sähköpostiliitteitä."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Antaa sovelluksen lukea sähköpostiliitteitä."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Käytä sähköpostintarjoajan tietoja"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Antaa sovelluksen käyttää sähköpostitietokantaasi, mukaan lukien vastaanotettuja viestejä, lähetettyjä viestejä, käyttäjänimiä ja salasanoja."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Antaa sovelluksen käyttää sähköpostitietokantaasi, mukaan lukien vastaanotetut viestit, lähetetyt viestit, käyttäjänimet ja salasanat."</string>
<string name="app_name" msgid="5815426892327290362">"Sähköposti"</string>
<string name="compose_title" msgid="427986915662706899">"Viestin kirjoitus"</string>
<string name="debug_title" msgid="5175710493691536719">"Virheenjäljitys"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Valmis"</string>
<string name="create_action" msgid="3062715563215392251">"Luo uusi"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Poista"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Ei pikavastauksia"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Ei pikavastauksia."</string>
<string name="discard_action" msgid="6532206074859505968">"Hylkää"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Tallenna luonnos"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Lisää pikavastaus"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Haku"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Tilin asetukset"</string>
<string name="settings_action" msgid="6334807007967459412">"Asetukset"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Synkronointiasetukset"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Synkronointiasetukset"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Merkitse lukemattomaksi"</string>
<string name="move_action" msgid="3059189775933985898">"Siirrä"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Kopio/piilok."</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> kirjoitti:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Lisää lainattu teksti"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Liitä teksti mukaan"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Vähintään yksi vastaanottaja on lisättävä."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Lisää vähintään yksi vastaanottaja."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Kaikki sähköpostiosoitteet eivät kelpaa."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Tiedosto on liian suuri liitettäväksi."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Lisää pikavastaus"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Tallennettu"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Lopeta"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Liite tallennettu nimellä <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Liitettä ei voitu tallentaa."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Huomaa: vähintään yksi edelleen lähetettävän viestisi liitteistä ladataan ennen lähettämistä."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Liitetied. tall. epäonnistui."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Vähintään yksi edelleen lähetettävän viestisi liitteistä ladataan ennen lähettämistä."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Viesti"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Kutsu"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Vähintään yhden liitteen edelleenlähettäminen epäonnistui."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Liitettä ei lähetetty edelleen"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Kirjautuminen tiliin <xliff:g id="ACCOUNT_NAME">%s</xliff:g> epäonnistui."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Kirjautuminen tiliin <xliff:g id="ACCOUNT_NAME">%s</xliff:g> epäonnistui."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Kirjautuminen ei onnistu"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> t"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Vanhemmat"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Tilin asetukset"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Lisää Exchange-tili"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Lisää Exchange ActiveSync -tili"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Sähköpostitili"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Voit määrittää useimpien sähköpostitilien asetukset helposti."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Voit määrittää Exchange-tilin asetukset helposti."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Voit määrittää Exchange ActiveSync -tilin asetukset helposti."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Tilisi asetuksien määrittäminen käy helposti muutaman vaiheen kautta."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Sähköpostiosoite"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Salasana"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Lähetä sähköposti oletuksena tältä tililtä."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Lähetä sähköposti oletuksena tältä tililtä"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuaalinen määritys"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Anna kelvollinen sähköpostiosoite ja salasana."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Päällekkäiset tilit"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Tarkistetaan saapuvan postin palvelimen asetuksia…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Tarkistetaan lähtevän postin palvelimen asetuksia…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Tilin asetukset"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Tili on määritetty ja sähköposteja noudetaan."</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Tili on määritetty ja sähköposteja noudetaan."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Anna tilille nimi (valinnainen)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Oma nimi (näytetään lähtevissä viesteissä)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Kenttä ei voi olla tyhjä."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Saapuvan postin palvelimen asetukset"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Käyttäjänimi"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Salasana"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3-palvelin"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP-palvelin"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Palvelin"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Portti"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Suojaustyyppi"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ei mitään"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-palvelin"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Portti"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Suojaustyyppi"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Edellytä kirjautumista."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Vaadi kirjautuminen"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Käyttäjänimi"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Salasana"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Tilin asetukset"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"15 minuutin välein"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"30 minuutin välein"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Tunnin välein"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Lähetä sähköposti oletuksena tältä tililtä."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Ilmoita saapuvasta sähköpostista."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Synkronoi tämän tilin yhteystiedot."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Synkronoi tämän tilin kalenteri."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Synkronoi tämän tilin lähetetyt sähköpostit."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Lähetä sähköposti oletuksena tältä tililtä"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Ilmoita saapuvasta sähköpostista"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synkronoi tämän tilin yhteystiedot"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synkronoi tämän tilin kalenteri"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synkronoi tämän tilin sähköpostit"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Lataa liitteet automaattisesti wifi-yhteyden ollessa käytössä."</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Ei onnistunut"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Synkronoitavien päivien määrä"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Yksi kuukausi"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Kaikki"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Käytä tilin oletusta"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Virheellinen käyttäjänimi tai salasana."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Virheellinen käyttäjänimi tai salasana."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Käyttäjänimi tai salasana on virheellinen."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Käyttäjänimi tai salasana on virheellinen."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Palvelimeen ei voi muodostaa suojattua yhteyttä."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Palvelimeen ei voi muodostaa suojattua yhteyttä."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Asiakasvarmenne vaaditaan. Yhdistetäänkö asiakasvarmenteelliseen palvelimeen?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Varmenne ei kelpaa tai ole käytettävissä."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Palvelin lähetti virheilmoituksen. Tarkista käyttäjänimesi ja salasanasi ja yritä uudelleen."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Asiakasvarmenne vaaditaan. Haluatko yhdistää palvelimeen asiakasvarmenteen avulla?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Varmenne ei kelpaa tai ole käytettävissä."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Palvelin lähetti virheilmoituksen. Tarkista käyttäjänimesi ja salasanasi ja yritä uudelleen."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Palvelimeen ei voi muodostaa yhteyttä."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Palvelimeen ei voi muodostaa yhteyttä."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS vaaditaan, mutta palvelin ei tue sitä."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"VAROITUS: jos poistat sähköpostisovellukselta oikeuden hallinnoida laitettasi, myös kaikki sovellukseen liittyvät sähköpostitilit sekä niiden sähköpostit, yhteystiedot, kalenteritapahtumat ja muut tiedot poistetaan."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Tietoturvapäivitys"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> pyytää sinua päivittämään suojausasetuksesi."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Tili \"<xliff:g id="ACCOUNT">%s</xliff:g>\" edellyttää, että suojausasetukset päivitetään."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Suojauspäivitys tarvitaan"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Tiliä <xliff:g id="ACCOUNT">%s</xliff:g> ei voi synkronoida suojausvaatimusten vuoksi."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Tili \"<xliff:g id="ACCOUNT">%s</xliff:g>\" edellyttää, että suojausasetukset päivitetään."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Tili \"<xliff:g id="ACCOUNT">%s</xliff:g>\" muutti suojausasetuksiaan. Käyttäjältä ei vaadita toimia."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Suojauspäivitys tarvitaan"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Suojauskäytännöt muuttuneet"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Ei vastaa suojauskäytäntöjä"</string>
<string name="account_security_title" msgid="3511543138560418587">"Laitteen suojaus"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Palvelin <xliff:g id="SERVER">%s</xliff:g> vaatii, että sen sallitaan hallita joitakin Android-laitteen suojaustoiminnoista."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Muokkaa tietoja"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Ruudunlukituksen PIN-koodi tai salasana on vanhentunut."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Ruudunlukituksen salasana vanhentunut"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Ruudunlukituksen salasana vanhentuu pian"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Ruudunlukituksen PIN-koodi tai salasana tulee vaihtaa pian, tai tilin <xliff:g id="ACCOUNT">%s</xliff:g> tiedot poistetaan. Vaihdetaanko koodi nyt?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Ruudunlukituksen PIN-koodi tai salasana tulee vaihtaa pian, tai tilin <xliff:g id="ACCOUNT">%s</xliff:g> tiedot poistetaan. Haluatko vaihtaa koodin nyt?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Ruudunlukituksen salasana vanhentunut"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Tilin <xliff:g id="ACCOUNT">%s</xliff:g> tietoja poistetaan laitteeltasi. Voit palauttaa tilin vaihtamalla ruudunlukituksen PIN-koodin tai salasanan. Vaihdetaanko koodi nyt?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Tilin <xliff:g id="ACCOUNT">%s</xliff:g> tietoja poistetaan laitteeltasi. Voit palauttaa tilin vaihtamalla ruudunlukituksen PIN-koodin tai salasanan. Haluatko vaihtaa koodin nyt?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Hylätäänkö tallentamattomat muutokset?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Kirjautuminen ei onnistu."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Tilin <xliff:g id="ACCOUNT">%s</xliff:g> käyttäjänimi tai salasana on virheellinen. Päivitetäänkö?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Tilin <xliff:g id="ACCOUNT">%s</xliff:g> käyttäjänimi tai salasana on virheellinen. Haluatko päivittää ne nyt?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Oletustili"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Lähetä sähköposti oletuksena tältä tililtä"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Lataa liitetiedostoja"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Lataa viimeaikaisten viestien liitteet wifi-yhteyden kautta."</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Sähköposti-ilmoitukset"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Synkronoinnin tiheys, ilmoitukset jne."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Ilmoita tilarivissä, kun sähköpostiviesti saapuu"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Lähetä ilmoitus, kun sähköpostiviesti saapuu"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Uusien viestien tarkistustiheys"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Saapuvan postin asetukset"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Käyttäjänimi, salasana ja muut tulevat palvelimen asetukset"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Lähtevän postin asetukset"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Käyttäjänimi, salasana ja muut lähtevät palvelimen asetukset"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Käytännöt otettu käyttöön"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ei mitään"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Käytäntöjä ei tueta"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ei mitään"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Yritä synkronointia"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Synkronoi tili koskettamalla tätä"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Tilin nimi"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Oma nimi"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Allekirjoitus"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Pikavastaukset"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Muokkaa tekstiä, jota lisäät usein sähköpostiviesteihin"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Muokkaa tekstiä, jota lisäät usein sähköpostiviesteihin"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Liitä lähettämiisi viesteihin teksti"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Ilmoitusasetukset"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Tiedonsiirto"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Suojauskäytännöt"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Muokkaa pikavastausta"</string>
<string name="save_action" msgid="1988862706623227093">"Tallenna"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synkronoi yhteystiedot"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synkronoi tämän tilin yhteystiedot"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Synkronoi Kalenteri"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Synkronoi tämän tilin kalenteri"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synkronoi kalenteri"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synkronoi tilin kalenteritapahtuma"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synkronoi sähköposti"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synkronoi tämän tilin sähköpostit"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Värinä"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> tulosta osoitteella <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Asetukset"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Yleiset"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Yleiset asetukset"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Sovellus"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automaattinen siirtyminen"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Valitse, mikä ruutu näytetään viestin poistamisen jälkeen"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Piilota valintaruudut"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Valitse viesti luettelosta koskettamalla pitkään."</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Vahvista ennen poistamista"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Viestit"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Vahvista ennen lähettämistä"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Viestit"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Siirry ruutuun"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Uudempi viesti"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Vanhempi viesti"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Odotetaan tuloksia"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Joidenkin palvelimien vastaus voi kestää kauan."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Kansiot"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Älä salli laitteen kameran käyttöä"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Vaadi laitteen salasana"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Rajoita viim. salasanojen uud.käyttöä"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Vaadi salasanojen vanhenemista"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Käyttämättömän laitteen lukittava ruutu"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Rajoita synkronoitavien kalenteritap. lukumäärää"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Rajoita synkronoitavien sähköpostien lukumäärää"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Kiitos!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Kuulostaa hyvältä!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Luen tämän myöhemmin ja palaan asiaan."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Järjestetään tapaaminen ja keskustellaan asiasta."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Tämän tilin taustasynkronointi on pois käytöstä roaming-tilassa."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Lähetetään vastaus..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Ei viestejä."</string>
</resources>
diff --git a/res/values-fi/uploader.xml b/res/values-fi/uploader.xml
index 8ca406f22..170571733 100644
--- a/res/values-fi/uploader.xml
+++ b/res/values-fi/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Piilota tiedot"</string>
<string name="menu_settings" msgid="5088116127086866634">"Asetukset"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Ladattu %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Tili"</string>
<string name="upload" msgid="2615541458361216022">"Lataa"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index d6c4e9478..d5ae8a1fd 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Lire les pièces jointes"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Permet à cette application de lire les pièces jointes aux e-mails."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permet à l\'application de lire les pièces jointes aux e-mails."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Accéder aux données du fournisseur de messagerie"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Permet à cette application d\'accéder à votre base de données de messagerie, y compris aux messages reçus et envoyés, aux noms d\'utilisateur et aux mots de passe."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permet à l\'application d\'accéder à la base de données de votre messagerie, y compris aux messages reçus et envoyés, aux noms d\'utilisateur et aux mots de passe."</string>
<string name="app_name" msgid="5815426892327290362">"E-mail"</string>
<string name="compose_title" msgid="427986915662706899">"Nouveau message"</string>
<string name="debug_title" msgid="5175710493691536719">"Débogage"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"OK"</string>
<string name="create_action" msgid="3062715563215392251">"Créer"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Supprimer"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Aucune réponse rapide"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Aucune réponse rapide"</string>
<string name="discard_action" msgid="6532206074859505968">"Supprimer"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Enregistrer"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Insérer la réponse rapide"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Rechercher"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Paramètres du compte"</string>
<string name="settings_action" msgid="6334807007967459412">"Paramètres"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Options de synchronisation"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Options de synchronisation"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Marquer comme non lu"</string>
<string name="move_action" msgid="3059189775933985898">"Déplacer"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Cci"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> a écrit :"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Inclure le texte des messages précédents"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Inclure le texte"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Vous devez ajouter au moins un destinataire."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Ajoutez au moins un destinataire."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Certaines adresses e-mail sont incorrectes."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Impossible de joindre le fichier, car il est trop volumineux."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Insérer une réponse rapide"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Enregistré"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Arrêter"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"PJ enregistrée sous <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Impossible enreg. pièce jointe."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Remarque : Une ou plusieurs pièces jointes du message que vous transférez vont être téléchargées avant l\'envoi."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Impossible enreg. pièce jointe."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Une ou plusieurs pièces jointes au message que vous transférez vont être téléchargées avant l\'envoi."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Message"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Inviter"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Impossible de transférer une ou plusieurs pièces jointes."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Pièce jointe non transférée"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Échec de la connexion au compte <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Échec de la connexion au compte <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Impossible de se connecter"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> O"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Précédents"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Configurer un compte"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Ajouter un compte Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Ajouter un compte Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Compte de messagerie"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Vous pouvez configurer une messagerie pour la plupart des comptes en quelques étapes seulement."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Vous pouvez configurer un compte Exchange en quelques étapes seulement."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Vous pouvez configurer un compte Exchange ActiveSync en quelques étapes seulement."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Vous pouvez configurer votre compte en quelques étapes seulement."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Adresse e-mail"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Mot de passe"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Par défaut, envoyer les e-mails avec ce compte"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Par défaut, envoyer les e-mails avec ce compte"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configuration manuelle"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Saisissez une adresse e-mail et un mot de passe corrects."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dupliquer le compte"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Vérification des paramètres de serveur entrant…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Vérification des paramètres de serveur sortant…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Configuration du compte"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Votre compte est configuré et votre messagerie a été activée !"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Votre compte est configuré et votre messagerie est activée !"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Nom du compte (facultatif)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Votre nom (affiché sur les messages sortants)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Ce champ est obligatoire."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Paramètres du serveur entrant"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nom d\'utilisateur"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Mot de passe"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Serveur POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Serveur IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Serveur"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Type de sécurité"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Aucun"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Serveur SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Type de sécurité"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Connexion obligatoire."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Exiger une connexion"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nom d\'utilisateur"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Mot de passe"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Configuration du compte"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Toutes les 15 minutes"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Toutes les 30 minutes"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Toutes les heures"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Par défaut, envoyer les e-mails avec ce compte"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Afficher une notification lors de la réception d\'un e-mail"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Synchroniser les contacts issus de ce compte"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Synchroniser l\'agenda à partir de ce compte"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Synchroniser les e-mails à partir de ce compte"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Par défaut, envoyer les e-mails avec ce compte"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"M\'avertir lors de la réception d\'un e-mail"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synchroniser les contacts de ce compte"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synchroniser l\'agenda de ce compte"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synchroniser les e-mails de ce compte"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Télécharger automatiquement les pièces jointes une fois connecté au Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Impossible de terminer"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Jours à synchroniser"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Un mois"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Tous"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Utiliser paramètres défaut"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Nom d\'utilisateur ou mot de passe incorrect."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Nom d\'utilisateur ou mot de passe incorrect."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nom d\'utilisateur ou mot de passe incorrect."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Le nom d\'utilisateur ou le mot de passe est incorrect."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Impossible d\'établir une connexion sécurisée avec le serveur."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Impossible d\'établir une connexion sécurisée avec le serveur."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Certificat client requis. Voulez-vous vous connecter au serveur avec le certificat client ?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Le certificat n\'est pas valide ou est inaccessible."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Erreur du serveur. Veuillez vérifier votre nom d\'utilisateur et votre mot de passe, puis réessayer."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Certificat client requis. Voulez-vous vous connecter au serveur avec un certificat client ?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Le certificat est invalide ou inaccessible."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Erreur du serveur. Veuillez vérifier votre nom d\'utilisateur et votre mot de passe, puis réessayer."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Impossible de se connecter au serveur."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Impossible de se connecter au serveur."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"Protocole TLS requis mais non pris en charge par le serveur."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"AVERTISSEMENT : Si vous désactivez la gestion de votre appareil par l\'application E-mail, tous les comptes de messagerie qui y sont associés seront supprimés, de même que leurs données (e-mails, contacts, événements d\'agenda, etc.)."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Mise à jour de sécurité"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> nécessite la mise à jour de vos paramètres de sécurité."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Le compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\" nécessite une mise à jour de ses paramètres de sécurité."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Mise à jour de sécurité requise"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Impossible de synchroniser le compte <xliff:g id="ACCOUNT">%s</xliff:g> en raison des exigences de sécurité."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Les paramètres de sécurité du compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\" doivent être mis à jour."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Les paramètres de sécurité du compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ont été modifiés. Aucune action de votre part n\'est requise."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Mise à jour de sécurité requise"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Règles de sécurité modifiées"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Imposs. appliquer règles sécu"</string>
<string name="account_security_title" msgid="3511543138560418587">"Sécurité de l\'appareil"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Vous devez autoriser le serveur <xliff:g id="SERVER">%s</xliff:g> à contrôler à distance certaines fonctionnalités de sécurité de votre mobile Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Modifier les infos"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Le code PIN ou le mot de passe de verrouillage de votre écran a expiré."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Mot de passe verrou. expiré"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Expiration mot de passe de verrouillage"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Vous devrez bientôt modifier le code PIN ou le mot de passe de verrouillage de votre écran, faute de quoi les données du compte <xliff:g id="ACCOUNT">%s</xliff:g> seront effacées. Modifier maintenant ?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Vous allez bientôt devoir modifier le code PIN ou le mot de passe de verrouillage de l\'écran, faute de quoi les données de <xliff:g id="ACCOUNT">%s</xliff:g> vont être effacées. Voulez-vous le modifier maintenant ?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Le mot de passe de verrouillage de votre écran a expiré."</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Les données du compte <xliff:g id="ACCOUNT">%s</xliff:g> sont en cours d\'effacement de votre appareil. Vous pouvez les restaurer en modifiant le code PIN ou le mot de passe de verrouillage de votre écran. Le modifier maintenant ?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Les données de <xliff:g id="ACCOUNT">%s</xliff:g> sont en cours d\'effacement de votre appareil. Vous pouvez les restaurer en modifiant le code PIN ou le mot de passe de verrouillage de l\'écran. Voulez-vous le modifier maintenant ?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Annuler les modifications non enregistrées ?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Impossible de se connecter."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Le nom d\'utilisateur ou le mot de passe du compte <xliff:g id="ACCOUNT">%s</xliff:g> est incorrect. Mettre à jour maintenant ?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Le nom d\'utilisateur ou le mot de passe de <xliff:g id="ACCOUNT">%s</xliff:g> est incorrect. Voulez-vous les mettre à jour maintenant ?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Compte par défaut"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Par défaut, envoyer les e-mails avec ce compte"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Télécharger les pièces jointes"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Téléch. auto des pièces jointes aux messages récents via Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Notifications"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Fréquence de synchronisation, notifications, etc."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Afficher une notification dans la barre système à la réception d\'e-mails"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Envoyer une notification en cas de nouvel e-mail"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Fréquence de consultation de la boîte de réception"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Paramètres de réception"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nom d\'utilisateur, mot de passe et autres param. serveur entrant"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Paramètres d\'envoi"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nom d\'utilisateur, mot de passe et autres param. serveur sortant"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Règles appliquées"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Aucun"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Règles non compatibles"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Aucun"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Synchroniser (tentative)"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Appuyer ici pour synchroniser ce compte"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Nom du compte"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Votre nom"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Signature"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Réponses rapides"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Modifier texte fréquemment inséré lors de la rédaction d\'e-mails"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Modifier texte fréquemment inséré lors de la rédaction d\'e-mails"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Ajouter un texte aux messages envoyés"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Paramètres de notification"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Consommation des données"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Règles de sécurité"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Modifier une réponse rapide"</string>
<string name="save_action" msgid="1988862706623227093">"Enregistrer"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synchroniser les contacts"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synchroniser les contacts pour ce compte"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Synchroniser l\'agenda"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Synchroniser l\'agenda pour ce compte"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synchroniser l\'agenda"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synchro événement agenda pour ce compte"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synchr. messagerie"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synchroniser les e-mails pour ce compte"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibreur"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> résultats de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Paramètres"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Paramètres généraux"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Paramètres généraux"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Application"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avancer automatiquement"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Sélectionner écran à afficher après la suppression d\'un message"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Masquer les cases à cocher"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Dans les listes de messages, maintenir enfoncé pour sélectionner"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirmer avant suppression"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Messages"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirmer avant envoi"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Messages"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Afficher"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Message suivant"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Message précédent"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"En attente des résultats..."</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Cette opération peut prendre du temps avec certains serveurs."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Dossiers"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Interdire utilisation de l\'appareil photo"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Exiger un mot de passe pour l\'appareil"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Restreindre réutil. mots de passe récents"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Exiger l\'expiration des mots de passe"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Exiger verrouillage appareils inactifs"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Limiter nombre d\'événements d\'agenda synchronisés"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Limiter le nombre d\'e-mails synchronisés"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Merci !"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Cela me convient."</string>
+ <string name="quick_3" msgid="8061819976353395585">"Je lirai cela plus tard, et je vous recontacterai."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Organisons une réunion pour en discuter."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"La synchronisation en arrière-plan pour ce compte est désactivée en itinérance."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Envoi de la réponse en cours..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Aucun message"</string>
</resources>
diff --git a/res/values-fr/uploader.xml b/res/values-fr/uploader.xml
index 42de0bc5d..f3e16a1fc 100644
--- a/res/values-fr/uploader.xml
+++ b/res/values-fr/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Masquer les détails"</string>
<string name="menu_settings" msgid="5088116127086866634">"Paramètres"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Transféré le %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Compte"</string>
<string name="upload" msgid="2615541458361216022">"Transférer"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index f087b1195..3abaf1ca3 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"ईमेल अनुलग्‍नक पढ़ें"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"इस एप्‍लिकेशन को आपके ईमेल अनुलग्‍नक पढ़ने देता है."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"एप्लिकेशन को आपके ईमेल अनुलग्नक पढ़ने देता है."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"ईमेल प्रदाता के डेटा तक पहुंचें"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"इस एप्‍लिकेशन को प्राप्‍त संदेशों, भेजे गए संदेशों, उपयोगकर्ता नाम और पासवर्ड सहित आपके ईमेल डेटाबेस में पहुंच देता है."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"इस एप्‍लिकेशन को प्राप्‍त संदेशों, भेजे गए संदेशों, उपयोगकर्ता नाम और पासवर्ड सहित आपके ईमेल डेटाबेस में पहुंच देता है."</string>
<string name="app_name" msgid="5815426892327290362">"ईमेल"</string>
<string name="compose_title" msgid="427986915662706899">"लिखें"</string>
<string name="debug_title" msgid="5175710493691536719">"डीबग करें"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"पूर्ण"</string>
<string name="create_action" msgid="3062715563215392251">"नया बनाएं"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"हटाएं"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"कोई त्वरित प्रतिसाद नहीं"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"कोई त्वरित प्रतिसाद नहीं."</string>
<string name="discard_action" msgid="6532206074859505968">"छोड़ें"</string>
<string name="save_draft_action" msgid="6413714270991417223">"ड्राफ़्ट सहेजें"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"त्वरित प्रतिसाद शामिल करें"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"खोज"</string>
<string name="account_settings_action" msgid="4494079183315085171">"खाता सेटिंग"</string>
<string name="settings_action" msgid="6334807007967459412">"सेटिंग"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"समन्वयन विकल्‍प"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"समन्वयन विकल्‍प"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"बिना पढ़ी के रूप में चिह्नित करें"</string>
<string name="move_action" msgid="3059189775933985898">"ले जाएं"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"Cc/Bcc जोड़ें"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> ने लिखा:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"उद्धरित पाठ शामिल करें"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"पाठ शामिल करें"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"आपको कम से कम एक प्राप्तकर्ता जोड़ना चाहिए."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"कम से कम एक प्राप्तकर्ता जोड़ें."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"कुछ ईमेल पते अमान्‍य हैं."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"अनुलग्न करने के लिए फ़ाइल बहु‍त बड़ी है."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"त्वरित प्रतिसाद सम्मिलित करें"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"सहेजा गया"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"रोकें"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"अनुलग्‍नक को <xliff:g id="FILENAME">%s</xliff:g> के रूप में सहेजा गया है."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"अनुलग्‍नक सहेजा नहीं जा सका."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"ध्यान दें: आपके द्वारा अग्रेषित संदेश में एक या एक से अधिक अनुलग्‍नक भेजने से पहले डाउनलोड किए जाएंगे."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"अनुलग्‍नक सहेजा नहीं जा सका."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"आपके द्वारा अग्रेषित संदेश को भेजने से पहले उसके एक या अधिक अनुलग्‍नक डाउनलोड किए जाएंगे."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"संदेश"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"आमंत्रित करें"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"एक या अधिक अनुलग्‍नक अग्रेषित नहीं किए जा सके."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"अनुलग्‍नक अग्रेषित नहीं किया गया"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> साइन इन विफल."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> में साइन इन करना विफल रहा."</string>
<string name="login_failed_title" msgid="7624349996212476176">"साइन इन नहीं हो सका"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"इससे पुराना"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"खाता सेटअप"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Exchange खाता जोडें"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Exchange ActiveSync खाता जोडें"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"ईमेल खाता"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"आप बस कुछ ही चरणों में अधिकांश खातों के लिए ईमेल सेट कर सकते हैं."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"आप बस कुछ ही चरणों में Exchange खाता सेट कर सकते हैं."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"आप बस कुछ ही चरणों में Exchange ActiveSync खाता सेट कर सकते हैं."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"आप बस कुछ ही चरणों में अपना खाता सेट कर सकते हैं."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"ईमेल पता"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"पासवर्ड"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"डिफ़ॉल्‍ट रूप से इस खाते से ईमेल भेजें."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"डिफ़ॉल्‍ट रूप से, इस खाते से ईमेल भेजें"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"मैन्‍युअल सेटअप"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"कोई मान्‍य ईमेल पता और पासवर्ड लिखें."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"डुप्‍लिकेट खाता"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"इनकमिंग सर्वर सेटिंग जांच रहा है…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"आउटगोइंग सर्वर सेटिंग जांच रहा है…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"खाता सेटअप"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"आपका खाता सेट हो गया है, और शीघ्र ही ईमेल मिलने वाला है!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"आपका खाता सेट हो गया है और शीघ्र ही ईमेल मिलने वाला है!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"इस खाते को कोई नाम दें (वैकल्पिक)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"आपका नाम (आउटगोइंग संदेशों में प्रदर्शित)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"यह फ़ील्ड रिक्त नहीं हो सकती."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"इनकमिंग सर्वर सेटिंग"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"उपयोगकर्ता नाम"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"पासवर्ड"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP सर्वर"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP सर्वर"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"सर्वर"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"पोर्ट"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"सुरक्षा प्रकार"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"कोई नहीं"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP सर्वर"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"पोर्ट"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"सुरक्षा प्रकार"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"साइन-इन की आवश्‍यकता है."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"साइन इन आवश्यक"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"उपयोगकर्ता नाम"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"पासवर्ड"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"खाता सेटअप"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"प्रत्‍येक 15 मिनट"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"प्रत्‍येक 30 मिनट"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"प्रत्‍येक घंटा"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"डिफ़ॉल्‍ट रूप से इस खाते से ईमेल भेजें."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"ईमेल आने पर मुझे सूचित करें."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"संपर्कों को इस खाते से सिंक करें."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"इस खाते से कैलेंडर सिंक करें."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"इस खाते से ईमेल सिंक करें."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"डिफ़ॉल्‍ट रूप से, इस खाते से ईमेल भेजें"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"ईमेल आने पर मुझे सूचित करें"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"संपर्कों को इस खाते से समन्ववित करें"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"इस खाते से कैलेंडर समन्‍वयित करें"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"इस खाते से ईमेल समन्वयित करें"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Wi-Fi से कनेक्‍ट होने पर अनुलग्‍नकों को स्‍वचालित रूप से डाउनलोड करें"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"पूरा नहीं हो सका"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"समन्वयन के लिए दिन:"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"एक माह"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"सभी"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"खाते के डिफ़ॉल्ट का उपयोग करें"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"उपयोगकर्तानाम या पासवर्ड गलत है."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"उपयोगकर्ता नाम या पासवर्ड गलत है."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"उपयोगकर्ता नाम या पासवर्ड गलत है."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"उपयोगकर्ता नाम या पासवर्ड गलत है."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"सर्वर से सुरक्षित रूप से कनेक्‍ट नहीं हो सकता."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"सर्वर से सुरक्षित रूप से कनेक्‍ट नहीं हो सकता."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"क्‍लाइंट प्रमाणपत्र आवश्‍यक है. क्‍लाइंट प्रमाणपत्र वाले सर्वर से कनेक्‍ट करें?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"प्रमाणपत्र अमान्‍य है या उस पर पहुंचा नहीं जा सकता."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"सर्वर ने एक त्रुटि के साथ प्रतिसाद दिया. अपना उपयोगकर्ता नाम और पासवर्ड जांचें फिर पुन: प्रयास करें."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"एक क्लाइंट प्रमाणपत्र की आवश्यकता है. क्या आप क्लाइंट प्रमाणपत्र के साथ सर्वर से कनेक्ट होना चाहते हैं?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"प्रमाणपत्र अमान्‍य है या उस पर पहुंचा नहीं जा सकता."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"सर्वर ने एक त्रुटि के साथ प्रतिसाद दिया. अपना उपयोगकर्ता नाम और पासवर्ड जांचें फिर पुन: प्रयास करें."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"सर्वर से कनेक्‍ट नहीं हो सकता."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"सर्वर से कनेक्‍ट नहीं कर सकता."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS आवश्‍यक है लेकिन सर्वर द्वारा समर्थित नहीं है."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"चेतावनी: आपके उपकरण को प्रबंधित करने के लिए ईमेल एप्‍लिकेशन का प्राधिकार निष्क्रिय कर देने से उसके लिए आवश्यक सभी ईमेल खाते, उनके ईमेल, संपर्क, कैलेंडर ईवेंट, और अन्‍य डेटा सहित, हटा दिए जाएंगे."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"सुरक्षा अपडेट"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"आपको <xliff:g id="ACCOUNT">%s</xliff:g> के लिए अपनी सुरक्षा सेटिंग अपडेट करने की आवश्यकता है."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"खाते \"<xliff:g id="ACCOUNT">%s</xliff:g>\" को सुरक्षा सेटिंग अपडेट की आवश्‍यकता है."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"सुरक्षा अपडेट आवश्यक"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"सुरक्षा आवश्‍यकताओं के कारण खाता \"<xliff:g id="ACCOUNT">%s</xliff:g>\" समन्‍वयित नहीं किया जा सकता."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"खाते \"<xliff:g id="ACCOUNT">%s</xliff:g>\" को सुरक्षा सेटिंग अपडेट की आवश्‍यकता है."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" खाते ने अपनी सुरक्षा सेटिंग बदल दी है; किसी उपयोगकर्ता कार्यवाही की आवश्‍यकता नहीं."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"सुरक्षा अपडेट आवश्यक"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"सुरक्षा नीतियां बदल दी गई हैं"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"सुरक्षा नीतियां पूरी नहीं हो सकतीं"</string>
<string name="account_security_title" msgid="3511543138560418587">"उपकरण सुरक्षा"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"सर्वर <xliff:g id="SERVER">%s</xliff:g> के लिए यह आवश्‍यक है कि आप उसे अपने Android उपकरण की कुछ सुरक्षा सुविधाओं को दूरस्थ रूप से नियंत्रित करने दें."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"विवरण संपादित करें"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"आपकी स्‍क्रीन लॉक करें पिन या पासवर्ड की समय-सीमा समाप्त हो गई है."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"स्‍क्रीन लॉक करें पासवर्ड की समय-सीमा समाप्त"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"स्‍क्रीन लॉक करें पासवर्ड समाप्त होने वाला है"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"आपको जल्‍द ही अपनी स्‍क्रीन लॉक करें पिन या पासवर्ड बदल लेना चाहिए, अन्यथा <xliff:g id="ACCOUNT">%s</xliff:g> का डेटा मिटा दिया जाएगा. इसे अभी बदलें?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"आपको शीघ्र ही अपना लॉक स्क्रीन पिन या पासवर्ड को बदलना होगा, अन्यथा <xliff:g id="ACCOUNT">%s</xliff:g> का डेटा मिट जाएगा. क्या आप इसे अभी बदलना चाहते हैं?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"स्‍क्रीन लॉक करें पासवर्ड की समय-सीमा समाप्त हो गई है"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"<xliff:g id="ACCOUNT">%s</xliff:g> का डेटा आपके उपकरण से मिटाया जा रहा है. आप अपनी स्‍क्रीन लॉक करें पिन या पासवर्ड को बदलकर उसे पुनर्स्थापित कर सकते हैं. इसे अभी बदलें?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"<xliff:g id="ACCOUNT">%s</xliff:g> का डेटा आपके उपकरण से मिटाया जा रहा है. आप इसे अपने लॉक स्क्रीन पिन या पासवर्ड बदलकर पुनर्स्थापित कर सकते हैं. क्या आप इसे अभी बदलना चाहते हैं?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"न सहेजे गए परिवर्तनों को छोड़ें?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"साइन इन नहीं हो सका"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"<xliff:g id="ACCOUNT">%s</xliff:g> का उपयोगकर्ता नाम या पासवर्ड गलत है. उन्‍हें अभी अपडेट करें?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"<xliff:g id="ACCOUNT">%s</xliff:g> का उपयोगकर्ता नाम या पासवर्ड गलत है. क्या आप उन्हें अभी अपडेट करना चाहते हैं?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"डिफ़ॉल्‍ट खाता"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"डिफ़ॉल्‍ट रूप से, इस खाते से ईमेल भेजें"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"अनुलग्नकों को डाउनलोड करें"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"WiFi के माध्यम से हाल के संदेशों के अनुलग्नक स्वत: डाउनलोड करें"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"ईमेल सूचनाएं"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"आवृत्ति, सूचनाएं आदि सिंक करें."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"ईमेल आने पर सिस्‍टम बार में सूचित करें"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"ईमेल आने पर सूचना भेजें"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"इनबॉक्‍स देखने की आवृत्ति"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"इनकमिंग सेटिंग"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"उपयोगकर्ता नाम, पासवर्ड, और अन्‍य इनकमिंग सर्वर सेटिंग"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"आउटगोइंग सेटिंग"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"उपयोगकर्ता नाम, पासवर्ड, और अन्‍य आउटगोइंग सर्वर सेटिंग"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"नीतियां लागू की गईं"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"कोई नहीं"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"असमर्थित नीतियां"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"कोई नहीं"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"समन्‍वयन का प्रयास करें"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"इस खाते को समन्वयित करने के लिए यहां स्पर्श करें"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"खाता नाम"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"आपका नाम"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"हस्ताक्षर"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"त्वरित प्रतिसाद"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"वह पाठ संपादित करें जिसे आप अक्सर ईमेल लिखते समय शामिल करते हैं"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"वह पाठ संपादित करें जिसे आप अक्सर ईमेल लिखते समय शामिल करते हैं"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"आपके भेजे जाने वाले संदेशों में पाठ संशोधित करें"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"सूचना सेटिंग"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"डेटा उपयोग"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"सुरक्षा नीतियां"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"त्वरित प्रतिसाद संपादित करें"</string>
<string name="save_action" msgid="1988862706623227093">"सहेजें"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"संपर्कों को सिंक करें"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"इस खाते के लिए संपर्क सिंक करें"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"कैलेंडर सिंक करें"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"इस खाते के लिए कैलेंडर सिंक करें"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"कैलेंडर सिंक करें"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"इस खाता हेतु कैलें. इवेंट समन्व. करें"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"ईमेल समन्‍वयित करें"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"इस खाते के लिए ईमेल सिंक करें"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"कंपन"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="DOMAIN">%2$s</xliff:g> से <xliff:g id="RESULTS">%1$d</xliff:g> परिणाम"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"सेटिंग"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"सामान्य"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"सामान्य सेटिंग"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"एप्लिकेशन"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"स्वत: आगे"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"संदेश हटाने के बाद दिखाई जाने वाली स्‍क्रीन चुनें"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"चेकबॉक्‍स छुपाएं"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"संदेशों की सूचियों में, चयन करने के लिए स्‍पर्श करके रखें"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"हटाने से पहले पुष्‍टि करें"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"संदेश"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"भेजने से पहले पुष्‍टि करें"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"संदेश"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"इससे आगे"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"नया संदेश"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"पुराना संदेश"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"परिणामों की प्रतीक्षा कर रहा है"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"कुछ सर्वर को अधिक समय लग सकता है."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"फ़ोल्‍डर"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"उपकरण के कैमरे के उपयोग की अनुमति न दें"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"उपकरण पासवर्ड आवश्‍यक"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"हाल के पासवर्ड का पुन: उपयोग प्रतिबं. करें"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"पासवर्ड के लिए समय सीमा समाप्ति आवश्यक"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"स्क्रीन लॉक के लिए निष्क्रिय उपकरण चाहिए"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"समन्‍वयित कैलेंडर ईवेंट की संख्‍या सीमित करें"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"समन्‍वयित ईमेल की संख्‍या सीमित करें"</string>
+ <string name="quick_1" msgid="3426057697353380951">"धन्यवाद!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"मुझे अच्छा लगता है!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"मैं इसे बाद में पढ़ूंगा/पढ़ूगी और आपसे संपर्क करूंगा/करूंगी."</string>
+ <string name="quick_4" msgid="3988974084396883051">"आइए इस पर चर्चा करने के लिए कोई मीटिंग सेट करें."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"रोमिंग के दौरान इस खाते के लिए पृष्ठभूमि समन्‍वयन अक्षम है."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"प्रत्‍युत्तर भेज रहा है..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"कोई संदेश नहीं."</string>
</resources>
diff --git a/res/values-hi/uploader.xml b/res/values-hi/uploader.xml
index b06101ad4..ba69c8589 100644
--- a/res/values-hi/uploader.xml
+++ b/res/values-hi/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"विवरण छुपाएं"</string>
<string name="menu_settings" msgid="5088116127086866634">"सेटिंग"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"अपलोड किया गया %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"खाता"</string>
<string name="upload" msgid="2615541458361216022">"अपलोड करें"</string>
<string name="ok" msgid="2516349681897895312">"ठीक"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index f791a8eb8..15230b781 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Čitanje privitaka e-pošte"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Aplikaciji omogućuje čitanje privitaka vaše e-pošte."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Omogućuje aplikaciji da čita vaše privitke e-pošte."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Pristup podacima o davatelju usluge e-pošte"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Aplikaciji omogućuje pristup bazi podataka vaše e-pošte, uključujući primljene poruke, poslane poruke, korisnička imena i zaporke."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Aplikaciji omogućuje pristup podatkovnoj bazi vaše e-pošte, uključujući primljene poruke, poslane poruke, korisnička imena i zaporke."</string>
<string name="app_name" msgid="5815426892327290362">"E-pošta"</string>
<string name="compose_title" msgid="427986915662706899">"Stvori novu poruku"</string>
<string name="debug_title" msgid="5175710493691536719">"Otklanjanje pogrešaka"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Gotovo"</string>
<string name="create_action" msgid="3062715563215392251">"Izradi novi"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Izbriši"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Nema brzih odgovora"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nema brzih odgovora."</string>
<string name="discard_action" msgid="6532206074859505968">"Odbaci"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Spremanje skice"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Umetni brzi odgovor"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Pretraži"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Postavke računa"</string>
<string name="settings_action" msgid="6334807007967459412">"Postavke"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Opcije sinkronizacije"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Opcije sinkronizacije"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Označi kao nepročitano"</string>
<string name="move_action" msgid="3059189775933985898">"Premjesti"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Kop/skr.kop."</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> je napisao:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Obuhvati citirani tekst"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Uključi tekst"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Morate dodati barem jednog primatelja."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Dodajte barem jednog primatelja."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Neke adrese e-pošte nisu važeće."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Datoteka je prevelika za privitak."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Umetanje brzog odgovora"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Spremljeno"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Zaustavi"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Privitak spremljen kao <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Spremanje privitka neuspješno."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Bilješka: Jedan ili više privitaka u vašoj proslijeđenoj poruci preuzet će se prije slanja."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Privitak nije moguće spremiti."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Jedan ili više privitaka u proslijeđenoj poruci preuzet će se prije slanja."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Poruka"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Pozovi"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Jedan ili više privitaka nije bilo moguće proslijediti."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Privitak nije proslijeđen"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Neuspješna prijava na račun <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Prijava računa <xliff:g id="ACCOUNT_NAME">%s</xliff:g> neuspješna."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Neuspjela prijava"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Starije"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Postavljanje računa"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Dodaj Exchange račun"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Dodaj Exchange ActiveSync račun"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Račun e-pošte"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"E-poštu za većinu računa možete postaviti u samo nekoliko koraka."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Možete postaviti korisnički račun sustava Exchange u samo nekoliko koraka."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Račun sustava Exchange ActiveSync možete postaviti u samo nekoliko koraka."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Možete postaviti svoj korisnički račun u samo nekoliko koraka."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Adresa e-pošte"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Zaporka"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Šalji e-poštu s ovog računa prema zadanim postavkama."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Šalji e-poštu s ovog računa prema zadanim postavkama"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ručno postavljanje"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Upišite važeću adresu e-pošte i zaporku."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dvostruki račun"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Provjeravanje postavki dolaznog poslužitelja..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Provjeravanje postavki izlaznog poslužitelja..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Postavljanje računa"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Vaš je račun postavljen, a e-pošta stiže!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Vaš je račun postavljen, a e-pošta stiže!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Dodijelite ovom računu naziv (opcionalno)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Vaše ime (prikazano u izlaznim porukama)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Ovo polje ne može biti prazno."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Postavke dolaznog poslužitelja"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Korisničko ime"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Zaporka"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3 poslužitelj"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP poslužitelj"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Poslužitelj"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Vrsta sigurnosti"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ništa"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP poslužitelj"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Vrsta sigurnosti"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Zahtijevajte prijavu."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Potrebna je prijava"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Korisničko ime"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Zaporka"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Postavljanje računa"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Svakih 15 minuta"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Svakih 30 minuta"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Svaki sati"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Šalji e-poštu s ovog računa prema zadanim postavkama."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Obavijesti me kad stigne e-pošta."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sinkroniziraj i kontakte s ovog računa."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sinkroniziraj kalendar s ovog računa"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sink. e-poštu za ovaj račun."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Šalji e-poštu s ovog računa prema zadanim postavkama"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Obavijesti me kad stigne e-pošta"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sinkroniziraj kontakte s ovog računa."</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sinkroniziraj kalendar s ovog računa"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sinkroniziraj e-poštu s ovog računa"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Automatski preuzmi privitke za vrijeme povezanosti s Wi-Fi mrežom"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Završavanje nije bilo moguće"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dani za sinkronizaciju"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Jedan mjesec"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Sve"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Upotrijebi zadanu postavku računa"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Korisničko ime ili zaporka nisu točni."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Korisničko ime ili zaporka nisu točni."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Korisničko ime ili zaporka nisu ispravni."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Neispravno korisničko ime ili zaporka."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Sigurno povezivanje s poslužiteljem nije moguće."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Sigurno povezivanje s poslužiteljem nije moguće."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Potreban certifikat klijenta. Spojiti se na poslužitelj s certifikatom klijenta?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Certifikat je nevažeći ili nedostupan."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Poslužitelj je odgovorio pogreškom. Provjerite korisničko ime i zaporku i pokušajte ponovo."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Potrebna je klijentska potvrda. Želite li se povezati s poslužiteljem s klijentskom potvrdom?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Potvrda je neispravna ili nedostupna."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Poslužitelj je odgovorio s pogreškom. Provjerite korisničko ime i zaporku i pokušajte ponovo."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Povezivanje s poslužiteljem nije moguće."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Povezivanje s poslužiteljem nije moguće."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS je obavezan, ali ga poslužitelj ne podržava."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"UPOZORENJE: Deaktivacijom ovlasti aplikacije E-pošta za upravljanje uređajem izbrisat će se svi računi e-pošte koji traže tu ovlast, kao i e-pošta, kontakti, događaji kalendara i drugi podaci."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Sigurnosno ažuriranje"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Račun <xliff:g id="ACCOUNT">%s</xliff:g> zahtijeva da ažurirate svoje sigurnosne postavke."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Račun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" zahtijeva ažuriranje sigurnosnih postavki."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Potrebno sigurnosno ažuriranje"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Račun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" nije moguće sinkronizirati zbog sigurnosnih zahtjeva."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Račun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" zahtijeva ažuriranje sigurnosnih postavki."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Račun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" promijenio je sigurnosne postavke, korisnik ne mora poduzimati ništa."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Potrebno sigurnosno ažuriranje"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Promjena sigurnosnih pravila"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Nemoguće ispuniti sig. pravila"</string>
<string name="account_security_title" msgid="3511543138560418587">"Sigurnost uređaja"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Poslužitelj <xliff:g id="SERVER">%s</xliff:g> zahtijeva da mu omogućite daljinsko upravljanje nekim sigurnosnim značajkama vašeg Android uređaja."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Uredi pojedinosti"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"PIN ili zaporka za zaključavanje zaslona istekli su."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Istekla zap. za zaklj. zasl."</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Istječe zaporka za zaključavanje zaslona"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Uskoro morate promijeniti PIN ili zaporku za zaključavanje zaslona jer će inače podaci računa <xliff:g id="ACCOUNT">%s</xliff:g> biti izbrisani. Promijeniti sada?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Uskoro morate promijeniti svoj ​​PIN ili zaporku za zaključavanje zaslona ili će biti izbrisani podaci za račun <xliff:g id="ACCOUNT">%s</xliff:g>. Želite li to promijeniti sada?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Istekla zap. za zaklj. zasl."</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Brišu se podaci računa <xliff:g id="ACCOUNT">%s</xliff:g> s vašeg uređaja. Oporaviti ih možete promjenom PIN-a ili zaporke za zaključavanje zaslona. Promijeniti sada?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Podaci za račun <xliff:g id="ACCOUNT">%s</xliff:g> brišu se s vašeg uređaja. Možete ih vratiti promjenom PIN-a ili zaporke za zaključavanje. Želite li to promijeniti sada?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Odbaciti nespremljene promjene?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Neuspjela prijava"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Korisničko ime ili zaporka za <xliff:g id="ACCOUNT">%s</xliff:g> nisu točni. Ažurirati sada?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Netočno je korisničko ime ili zaporka za račun <xliff:g id="ACCOUNT">%s</xliff:g>. Želite li to ažurirati sada?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Zadani račun"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Šalji e-poštu s ovog računa prema zadanim postavkama"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Preuzimanje privitaka"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Automatsko preuzimanje privitaka uz nedavne poruke WiFi mrežom"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Obavijesti e-pošte"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Učestalost sinkronizacije, obavijesti itd."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Obavijesti u traci sustava kad stigne e-pošta"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Pošalji obavijest kada stigne e-pošta"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Učestalost provjeravanja e-pošte"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Dolazne postavke"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Korisničko ime, zaporka i ostale postavke dolaznog poslužitelja"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Odlazne postavke"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Korisničko ime, zaporka i ostale postavke odlaznog poslužitelja"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Pravila provedena"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ništa"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nepodržana pravila"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ništa"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Pokušaj sinkronizaciju"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Dodirnite ovdje za sinkronizaciju tog računa"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Naziv računa"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Vaše ime"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Potpis"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Brzi odgovori"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Uređivanje teksta koji često umećete prilikom pisanja e-pošte"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Uredite tekst koji često umećete prilikom pisanja e-pošte"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Dodajte tekst porukama koje šaljete"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Postavke obavijesti"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Potrošnja podataka"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Sigurnosna pravila"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Uredi brzi odgovor"</string>
<string name="save_action" msgid="1988862706623227093">"Spremi"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sinkroniziraj kontakte"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sink. kontakata za ovaj račun"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sink. Kalendar"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sink. kalendara za ovaj račun"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sinkroniziraj kalendar"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sink. kal. dog. za ovaj račun"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sink. e-pošte"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sink. e-pošte za ovaj račun"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibracija"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> rezultata sa <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Postavke"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Općenito"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Opće postavke"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Aplikacija"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatski prijeđi na sljedeće"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Odaberite zaslon za prikazivanje nakon brisanja poruke"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Sakrij potvrdne okvire"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Na popisima poruka dodirnite i držite da biste odabrali"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Potvrdite prije brisanja"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Poruke"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Potvrdite prije slanja"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Poruke"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Prijeđi na"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Novije poruke"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Starije poruke"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Čekaju se rezultati"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Nekim poslužiteljima može trebati više vremena."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mape"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Onemogući upotrebu fotoaparata uređaja"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Zahtijevaj zaporku uređaja"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Ograniči ponovnu upotrebu novijih zapor."</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Zahtijevaj istek zaporke"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Zahtijevaj zaključ. zaslona u mirovanju"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Ograniči broj sinkroniziranih događaja kalendara"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Ograniči broj sinkroniziranih poruka e-pošte"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Hvala!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Izvrsno!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Pročitat ću to kasnije i javiti vam se."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Hajdemo dogovoriti sastanak na kojem ćemo raspraviti o tome."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Pozadinska sinkronizacija za ovaj račun onemogućena je u roamingu."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Slanje odgovora..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Nema poruka."</string>
</resources>
diff --git a/res/values-hr/uploader.xml b/res/values-hr/uploader.xml
index e84da77f0..124e7f12b 100644
--- a/res/values-hr/uploader.xml
+++ b/res/values-hr/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Sakrij pojedinosti"</string>
<string name="menu_settings" msgid="5088116127086866634">"Postavke"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Preneseno %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Račun"</string>
<string name="upload" msgid="2615541458361216022">"Šalji"</string>
<string name="ok" msgid="2516349681897895312">"U redu"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 7d128b37c..1eee01171 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"E-mail mellékletek olvasása"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Lehetővé teszi az alkalmazás számára az e-mail mellékletek olvasását."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Lehetővé teszi az alkalmazás számára az e-mailek mellékleteinek olvasását."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Hozzáférés az e-mail szolgáltató adataihoz"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Lehetővé teszi, hogy az alkalmazás hozzáférjen az e-mail adatbázishoz, beleértve a fogadott és elküldött üzeneteket, a felhasználóneveket és a jelszavakat."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Lehetővé teszi az alkalmazás számára az e-mail adatbázisához, így a fogadott és elküldött üzenetekhez, a felhasználónevekhez és jelszavakhoz való hozzáférést."</string>
<string name="app_name" msgid="5815426892327290362">"E-mail"</string>
<string name="compose_title" msgid="427986915662706899">"Levélírás"</string>
<string name="debug_title" msgid="5175710493691536719">"Hibakeresés"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Kész"</string>
<string name="create_action" msgid="3062715563215392251">"Új létrehozása"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Törlés"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Nincsenek gyors válaszok"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nincsenek gyors válaszok."</string>
<string name="discard_action" msgid="6532206074859505968">"Elvetés"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Piszkozatmentés"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Gyors válasz beilleszt."</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Keresés"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Fiókbeállítások"</string>
<string name="settings_action" msgid="6334807007967459412">"Beállítások"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Szinkronizálási beállítások"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Szinkronizálási beállítások"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Megjelölés olvasatlanként"</string>
<string name="move_action" msgid="3059189775933985898">"Áthelyezés"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Másolatmezők"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> a következőt írta:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Idézett szöveg beillesztése"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Szöveggel együtt"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Legalább egy résztvevőt hozzá kell adnia."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Vegyen fel legalább egy címzettet."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Egyes e-mail címek érvénytelenek."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"A csatolni kívánt fájl túl nagy."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Gyors válasz beillesztése"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Elmentve"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Leállítás"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Melléklet elmentve: <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Nem sikerült a melléklet mentése."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Megjegyzés: a továbbított üzenet egy vagy több melléklete letöltésre kerül a küldés előtt."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"A melléklet mentése nem sikerült."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Küldés előtt továbbított üzenete egy vagy több melléklete letöltődik."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Üzenet"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Meghívás"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Egy vagy több melléklet nem továbbítható."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"A melléklet nincs továbbítva"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> bejelentkezése sikertelen volt."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"A(z) <xliff:g id="ACCOUNT_NAME">%s</xliff:g> fiókba való bejelentkezés sikertelen."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Sikertelen bejelentkezés"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Régebbiek"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Fiók beállítása"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Exchange-fiók hozzáadása"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Exchange ActiveSync-fiók hozzáadása"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"E-mail fiók"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"A legtöbb fiókhoz pár lépésben beállíthat egy e-mail címet."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Mindössze pár lépésben létrehozhat egy Exchange-fiókot."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Mindössze néhány lépésben létrehozhat egy Exchange ActiveSync-fiókot."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Mindössze néhány lépésben létrehozhatja fiókját."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-mail cím"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Jelszó"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"E-mailek küldése ebből a fiókból alapértelmezés szerint."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"E-mail küldése ebből a fiókból alapértelmezés szerint"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuális beállítás"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Írjon be egy érvényes e-mail címet és jelszót."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Már létező fiók"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Bejövő üzeneteket kezelő szerver beállításainak ellenőrzése..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Kimenő üzeneteket kezelő szerver beállításainak ellenőrzése..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Fiók beállítása"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"A fiók beállítása befejeződött, a levelezőprogram készen áll az e-mailek fogadására."</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"A fiók beállítása befejeződött, az e-mailek úton vannak."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Fiók elnevezése (opcionális)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Az Ön neve (a kimenő üzenetekben való megjelenítéshez)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Ez a mező nem lehet üres."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Bejövő üzenetek szerverének beállításai"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Felhasználónév"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Jelszó"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3-szerver"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP-szerver"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Szerver"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Biztonság típusa"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nincs"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-szerver"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Biztonság típusa"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Bejelentkezés szükséges."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Bejelentkezés szükséges"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Felhasználónév"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Jelszó"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Fiók beállítása"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"15 percenként"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"30 percenként"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Óránként"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"E-mail küldése ebből a fiókból alapértelmezés szerint"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Értesítés megjelenítése e-mail érkezésekor"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Névjegyek szinkronizálása ebben a fiókban."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Naptár szinkronizálása ebben a fiókban."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Az e-mailek szinkronizálása ebből a fiókból."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"E-mail küldése ebből a fiókból alapértelmezés szerint"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Értesítés megjelenítése e-mail érkezésekor"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Névjegyek szinkronizálása ebből a fiókból"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Naptár szinkronizálása ebből a fiókból"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Az e-mailek szinkronizálása ebből a fiókból"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Mellékletek automatikus letöltése Wi-Fi-kapcsolatnál"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nem sikerült befejezni"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Szinkronizálási időtartam"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Egy hónap"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Összes"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Alapbeállítás használata"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Helytelen felhasználónév vagy jelszó."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Helytelen felhasználónév vagy jelszó."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Helytelen felhasználónév vagy jelszó."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Helytelen felhasználónév vagy jelszó."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nem lehet biztonságos kapcsolatot létesíteni a szerverrel."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nem lehet biztonságos kapcsolatot létesíteni a szerverrel."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Ügyféltanúsítvány szükséges. Csatlakozzon ügyféltanúsítvánnyal rendelkező szerverhez?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Az igazolás érvénytelen vagy elérhetetlen."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"A szerver hibaüzenettel válaszolt. Ellenőrizze felhasználónevét és jelszavát, majd próbálja újra."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Klienstanúsítvány szükséges. Szeretne klienstanúsítvánnyal rendelkező szerverhez csatlakozni?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"A tanúsítvány érvénytelen vagy elérhetetlen."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"A szerver hibaüzenettel válaszolt. Ellenőrizze felhasználónevét és jelszavát, majd próbálja újra."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nem lehet kapcsolatot létesíteni a szerverrel."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Nem lehet kapcsolódni a szerverhez."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS szükséges, de a szerver nem támogatja."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"FIGYELMEZTETÉS: ha kikapcsolja az E-mail alkalmazás azon jogosultságát, hogy felügyelje az eszközt, akkor törli az összes olyan e-mail fiókot, amelyhez szükség van az alkalmazásra; a fiókokkal együtt pedig törli az e-maileket, a névjegyeket, a naptári eseményeket és más adatokat is."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Biztonsági frissítés"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> a biztonsági beállítások frissítését igényli."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Frissíteni kell a(z) \"<xliff:g id="ACCOUNT">%s</xliff:g>\" fiók biztonsági beállításait."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Biztonsági frissítés szükséges"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"A(z) \"<xliff:g id="ACCOUNT">%s</xliff:g>\" fiókot a biztonsági követelmények miatt nem lehet szinkronizálni."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Frissíteni kell a(z) \"<xliff:g id="ACCOUNT">%s</xliff:g>\" fiók biztonsági beállításait."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"A(z) \"<xliff:g id="ACCOUNT">%s</xliff:g>\" nevű fiók módosította a biztonsági beállításokat, nem szükséges felhasználói beavatkozás."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Biztonsági frissítés szükséges"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"A rendszabályok megváltoztak"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"A biztonsági házirend nem tartható be"</string>
<string name="account_security_title" msgid="3511543138560418587">"Eszközbiztonság"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"A(z) <xliff:g id="SERVER">%s</xliff:g> szerver engedélyt kér arra, hogy távolról vezérelhesse az Android-eszköz egyes biztonsági funkcióit."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Részletek szerkesztése"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"A képernyőzár PIN kódja vagy jelszava lejárt."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Képernyőzár jelszava lejárt"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Képernyőzár jelszava hamarosan lejár"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Hamarosan módosítani kell a képernyőzár PIN kódját vagy jelszavát, különben <xliff:g id="ACCOUNT">%s</xliff:g> adatait törli a készülék. Módosítja most?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Hamarosan módosítania kell a képernyőzár PIN-kódját vagy jelszavát, különben a(z) <xliff:g id="ACCOUNT">%s</xliff:g> fiók adatai törlődnek. Módosítja most?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Képernyőzár jelszava lejárt"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"<xliff:g id="ACCOUNT">%s</xliff:g> adatai törlésre kerülnek a készülékről. Visszaállíthatja a képernyőzár PIN kódjának vagy jelszavának módosításával. Módosítja most?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"<xliff:g id="ACCOUNT">%s</xliff:g> adatai törlésre kerülnek a készülékről. Visszaállíthatja a képernyőzár PIN-kódjának vagy jelszavának módosításával. Módosítja most?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Elveti a nem mentett módosításokat?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Sikertelen bejelentkezés"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"<xliff:g id="ACCOUNT">%s</xliff:g> felhasználóneve vagy jelszava helytelen. Frissíti most?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"A(z) <xliff:g id="ACCOUNT">%s</xliff:g> fiókhoz tartozó felhasználónév és jelszó helytelen. Szeretné frissíteni őket most?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Alapértelmezett fiók"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"E-mail küldése ebből a fiókból alapértelmezés szerint"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Mellékletek letöltése"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Mellékletek automatikus letöltése az üzenetekbe Wi-Fin keresztül"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"E-mail értesítések"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Szinkronizálási gyakoriság, értesítések stb."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Értesítés megjelenítése a Rendszersávon e-mailek érkezése esetén"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"E-mail érkezése esetén értesítés küldése"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Beérkező levelek ellenőrzésének gyakorisága"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Bejövő üzenetek beállításai"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Felhasználónév, jelszó és a beérkező szerver egyéb beállításai"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Kimenő üzenetek beállításai"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Felhasználónév, jelszó és a kimenő szerver beállításai"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Kényszerített rendszabályok"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Nincs"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nem támogatott rendszabályok"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Nincs"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Szinkronizálás megkísérlése"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"A fiók szinkronizálásához érintse meg itt"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Fióknév"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Az Ön neve"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Aláírás"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Gyors válaszok"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"E-mail íráskor gyakran beillesztett szöveg szerkesztése"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"E-mail írásakor gyakran beillesztett szöveg szerkesztése"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Szöveg hozzáfűzése az elküldendő üzenetekhez"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Értesítési beállítások"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Adathasználat"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Biztonsági rendszabályok"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Gyors válasz szerkesztése"</string>
<string name="save_action" msgid="1988862706623227093">"Mentés"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Névjegyek szinkronizálása"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"A fiók névjegyeinek szinkronizálása"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Naptár szinkr."</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"A fiók naptárának szinkronizálása"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Naptár szinkronizálása"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"A fiók naptárának szinkronizálása"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"E-mail szinkroniz."</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"A fiók e-mailjeinek szinkronizálása"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Rezgés"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> találat a(z) <xliff:g id="DOMAIN">%2$s</xliff:g> domainből"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Beállítások"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Általános"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Általános beállítások"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Alkalmazás"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatikus lépegetés"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Válassza ki, melyik képernyő jelenjen meg üzenet törlése után"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Jelölőnégyzetek elrejtése"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Kiválasztáshoz érintse meg, és tartsa lenyomva az üzenetlistában"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Megerősítés kérése törlés előtt"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Üzenetek"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Megerősítés kérése küldés előtt"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Üzenetek"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Továbblépés ide:"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Újabb üzenet"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Régebbi üzenet"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Várakozás a találatokra"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Egyes szervereknek több időre van szükségük."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mappák"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"A kamera használatának tiltása"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Eszközjelszó kötelező"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Előző jelszavak kizárása"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"A jelszavak kötelezően lejárnak"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Képernyőzároláshoz szükséges nyugalmi idő"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Szinkronizált naptáresemények számának korlátozása"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Szinkronizált e-mailek számának korlátozása"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Köszönjük!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Jól hangzik!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Később elolvasom és visszatérünk rá."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Szervezzünk egy találkozót a dolog megvitatására."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"A fiók háttérben zajló szinkronizálása le van tiltva barangolás közben."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Válasz küldése..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Nincsenek üzenetek."</string>
</resources>
diff --git a/res/values-hu/uploader.xml b/res/values-hu/uploader.xml
index 2560959c0..480cddbe6 100644
--- a/res/values-hu/uploader.xml
+++ b/res/values-hu/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Részletek elrejtése"</string>
<string name="menu_settings" msgid="5088116127086866634">"Beállítások"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"%s feltöltve"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Fiók"</string>
<string name="upload" msgid="2615541458361216022">"Feltöltés"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 83324bb9a..d2f7f2995 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Baca lampiran email"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Mengizinkan aplikasi membaca lampiran email Anda."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Memungkinkan apl membaca lampiran email Anda."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Akses data penyedia email"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Mengizinkan aplikasi ini mengakses basis data email Anda, termasuk pesan yang diterima, pesan yang dikirim, nama pengguna, dan sandi."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Mengizinkan apl mengakses basis data email Anda, termasuk pesan yang diterima, pesan yang dikirim, nama pengguna, dan sandi."</string>
<string name="app_name" msgid="5815426892327290362">"Email"</string>
<string name="compose_title" msgid="427986915662706899">"Tulis"</string>
<string name="debug_title" msgid="5175710493691536719">"Debug"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Selesai"</string>
<string name="create_action" msgid="3062715563215392251">"Buat baru"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Hapus"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Tidak ada tanggapan cepat"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Tidak ada tanggapan cepat."</string>
<string name="discard_action" msgid="6532206074859505968">"Buang"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Simpan draf"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Masukkan tanggapan cepat"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Telusuri"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Setelan akun"</string>
<string name="settings_action" msgid="6334807007967459412">"Setelan"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Opsi sinkronisasi"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Opsi sinkronisasi"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Tandai belum dibaca"</string>
<string name="move_action" msgid="3059189775933985898">"Pindahkan"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n" <xliff:g id="SENDER">%s</xliff:g> menulis:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Sertakan kutipan teks"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Sertakan teks"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Anda harus menambahkan setidaknya satu penerima."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Tambahkan setidaknya satu penerima."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Beberapa alamat email tidak valid."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"File terlalu besar untuk dilampirkan."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Masukkan tanggapan cepat"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Disimpan"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Hentikan"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Lampiran disimpan sebagai <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Tak dapat menyimpan lampiran."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Catatan: Satu atau beberapa lampiran dalam pesan yang diteruskan akan diunduh sebelum dikirim."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Tak dapat menyimpan lampiran."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Satu atau beberapa lampiran dalam pesan yang diteruskan akan diunduh sebelum dikirim."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Pesan"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Undang"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Tidak dapat meneruskan satu lampiran atau lebih."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Lampiran tidak diteruskan"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Gagal masuk <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Gagal masuk <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Tidak dapat masuk"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Lawas"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Penyiapan akun"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Tambah akun Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Tambahkan akun Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Akun email"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Anda dapat menyiapkan email untuk kebanyakan akun hanya dalam beberapa langkah."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Anda dapat menyiapkan akun Exchange hanya dalam beberapa langkah."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Anda dapat menyiapkan akun Exchange ActiveSync hanya dalam beberapa langkah."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Anda dapat menyiapkan akun hanya dalam beberapa langkah."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Alamat email"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Sandi"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Kirim email dari akun ini secara default."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Kirim email dari akun ini secara default"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Penyiapan manual"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Ketik alamat email dan sandi yang valid."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Akun rangkap"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Memeriksa setelan server masuk…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Memeriksa setelan server keluar…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Penyiapan akun"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Akun Anda sudah siap, dan email akan segera tiba!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Akun Anda sudah siap dan email akan segera tiba!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Beri nama akun ini (opsional)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Nama (yang ditampilkan pada pesan keluar)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Bidang ini tidak boleh kosong."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Setelan server masuk"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nama Pengguna"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Sandi"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Server POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Server IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Jenis keamanan"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Tak Satu Pun"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Server SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Jenis keamanan"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Harus masuk"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Harus masuk"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nama Pengguna"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Sandi"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Penyiapan akun"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Setiap 15 menit"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Setiap 30 menit"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Setiap jam"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Kirim email dari akun ini secara default."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Beri tahu saya ketika email tiba."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sinkronkan kontak dari akun ini."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sinkronkan kalender dari akun ini."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sinkronkan email dari akun ini."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Kirim email dari akun ini secara default"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Beri tahu saya ketika email tiba"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sinkronkan kontak dari akun ini"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sinkronkan kalender dari akun ini"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sinkronkan email dari akun ini"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Unduh lampiran secara otomatis ketika tersambung dengan Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Tidak dapat menyelesaikan"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Hari yang disinkronkan"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Satu bulan"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Semua"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Gunakan default akun"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Nama pengguna atau sandi salah."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Nama pengguna atau sandi salah."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nama pengguna atau sandi salah."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nama pengguna atau sandi salah."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Tidak dapat tersambung ke server dengan aman."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Tidak dapat tersambung ke server dengan aman."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Sertifikat klien diwajibkan. Sambungkan ke server dengan sertifikat klien?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Sertifikat tidak valid atau tidak dapat diakses."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Server merespons dengan kesalahan. Periksa nama pengguna dan sandi Anda lalu coba lagi."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Diperlukan sertifikat klien. Apakah Anda ingin menyambung ke server dengan sertifikat klien?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sertifikat tidak valid atau tidak dapat diakses."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Server menanggapi dengan kesalahan. Periksa nama pengguna dan sandi, lalu coba lagi."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Tidak dapat tersambung ke server."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Tidak dapat menyambung ke server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS diperlukan, tetapi tidak didukung oleh server."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"PERINGATAN: Menonaktifkan otoritas apl Email untuk mengatur perangkat Anda akan menghapus semua akun email yang memerlukannya, beserta email, kontak, acara kalender, dan data lainnya."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Pembaruan keamanan"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> mengharuskan Anda memperbarui setelan keamanan."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Akun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" memerlukan pembaruan setelan keamanan."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Pembaruan keamanan diperlukan"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Akun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" tidak dapat disinkronkan karena persyaratan keamanan."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Akun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" memerlukan pembaruan setelan keamanan."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Akun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" mengubah setelan keamanannya, tidak diperlukan tindakan pengguna."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Diperlukan pembaruan keamanan"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Kebijakan keamanan tlh diubah"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Kbijakan keamanan tak terpnuhi"</string>
<string name="account_security_title" msgid="3511543138560418587">"Keamanan perangkat"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Server <xliff:g id="SERVER">%s</xliff:g> meminta Anda mengizinkannya mengontrol beberapa fitur keamanan perangkat Android dari jarak jauh."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Edit detail"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"PIN atau sandi pengunci layar Anda kedaluwarsa."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Sandi pengunci layar kedaluwarsa"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Sandi pengunci layar akan kedaluwarsa"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Anda harus mengganti PIN atau sandi pengunci layar segera, atau data untuk<xliff:g id="ACCOUNT">%s</xliff:g> akan dihapus. Ganti sekarang?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Anda perlu segera mengganti PIN atau sandi pengunci layar. Bila tidak, data untuk <xliff:g id="ACCOUNT">%s</xliff:g> akan dihapus. Ganti sekarang?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Sandi pengunci layar kedaluwarsa"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Data untuk <xliff:g id="ACCOUNT">%s</xliff:g> sedang dihapus dari perangkat Anda. Anda dapat memulihkannya dengan mengganti PIN atau sandi pengunci layar. Ganti sekarang?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Data untuk <xliff:g id="ACCOUNT">%s</xliff:g> sedang dihapus dari perangkat. Anda dapat memulihkannya dengan mengganti PIN atau sandi pengunci layar. Ganti sekarang?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Buang perubahan yang tidak tersimpan?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Tidak dapat masuk"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Nama pengguna atau sandi untuk <xliff:g id="ACCOUNT">%s</xliff:g> salah. Mutakhirkan keduanya sekarang?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Nama pengguna atau sandi untuk <xliff:g id="ACCOUNT">%s</xliff:g> salah. Perbarui sekarang?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Akun default"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Kirim email dari akun ini secara default"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Unduh lampiran"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Unduh-otomatis lampiran pada pesan terbaru melalui WiFi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Pemberitahuan email"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Sinkronkan frekuensi, pemberitahuan, dll."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Beri tahukan dalam bilah Sistem ketika email tiba"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Mengirimkan pemberitahuan bila email tiba"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frekuensi pemeriksaan kotak masuk"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Setelan masuk"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nama pengguna, sandi, dan setelan server masuk lainnya"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Setelan keluar"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nama pengguna, sandi, dan setelan server keluar lainnya"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Kebijakan diberlakukan"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Tidak ada"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Kebijakan tidak didukung"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Tidak ada"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Coba sinkronisasi"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Sentuh di sini untuk menyinkronkan akun ini"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Nama akun"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Nama Anda"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Tanda tangan"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Tanggapan cepat"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Edit teks yang sering Anda masukkan ketika membuat email"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edit teks yang sering Anda masukkan ketika menulis email"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Menambahkan teks ke pesan yang Anda kirim"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Setelan pemberitahuan"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Penggunaan data"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Kebijakan keamanan"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Edit tanggapan cepat"</string>
<string name="save_action" msgid="1988862706623227093">"Simpan"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sinkronkan kontak"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sinkronkan kontak untuk akun ini"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sinkronkan Kalender"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sinkronkan kalender untuk akun ini"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sinkronkan kalender"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Snkronkan acr kalender utk akun ini"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sinkronkan email"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sinkronkan email untuk akun ini"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Getar"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> hasil dari <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Setelan"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Umum"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Setelan umum"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Aplikasi"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Maju otomatis"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Pilih layar mana yang akan ditampilkan stlh Anda menghapus pesan"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Sembunyikan kotak centang"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Pada daftar pesan, sentuh terus untuk memilih"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Konfirmasi sebelum menghapus"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Pesan"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Konfirmasi sebelum mengirim"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Pesan"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Majukan ke"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Pesan lebih anyar"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Pesan lawas"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Menunggu hasil"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Beberapa server mungkin membutuhkan waktu yang lama."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Folder"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Tolak penggunaan kamera perangkat"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Memerlukan sandi perangkat"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Batasi penggunaan ulang sandi terkini"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Mewajibkan sandi dapat kedaluwarsa"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Mnghrskan prgkt nganggur utk mngunci lyr"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Batasi jumlah acara kalender yang disinkronkan"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Batasi jumlah email yang disinkronkan"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Terima kasih!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Menurut saya itu bagus!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Saya akan membaca ini nanti dan mengabari Anda."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Mari kita adakan pertemuan untuk membahas masalah ini."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Sinkronisasi latar belakang untuk akun ini dinonaktifkan saat roaming."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Mengirim tanggapan..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Tidak ada pesan."</string>
</resources>
diff --git a/res/values-in/uploader.xml b/res/values-in/uploader.xml
index fa9c3be4e..67849039a 100644
--- a/res/values-in/uploader.xml
+++ b/res/values-in/uploader.xml
@@ -19,23 +19,23 @@
<string name="summary_subtitle_paused_retry_format" msgid="3851931944505090119">"mencoba ulang dalam %s"</string>
<string name="summary_menu_show_pending" msgid="658361192495996">"Tampilkan Unggahan yang Tertunda"</string>
<string name="summary_menu_show_finished" msgid="8544099132633066086">"Tampilkan Unggahan yang Sudah Selesai"</string>
- <string name="menu_view_online" msgid="6546633605818509942">"Lihat Secara Daring"</string>
+ <string name="menu_view_online" msgid="6546633605818509942">"Lihat Secara Online"</string>
<string name="menu_show_pending_items" msgid="8798191388238604213">"Tampilkan Unggahan yang Tertunda"</string>
<string name="menu_hide_pending_items" msgid="9216079748638469160">"Sembunyikan Unggahan yang Tertunda"</string>
<string name="menu_show_completed_items" msgid="4380487776635859783">"Tampilkan Detail"</string>
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Sembunyikan Detail"</string>
<string name="menu_settings" msgid="5088116127086866634">"Setelan"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Diunggah %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Akun"</string>
<string name="upload" msgid="2615541458361216022">"Unggah"</string>
- <string name="ok" msgid="2516349681897895312">"OK"</string>
+ <string name="ok" msgid="2516349681897895312">"Oke"</string>
<string name="cancel" msgid="1207103189404543868">"Batal"</string>
<string name="uploading_to" msgid="3986362895940069510">"Mengunggah ke "<b>"%s"</b></string>
<string name="uploading_for" msgid="1735961974624867111">" untuk "<b>"%s"</b></string>
<string name="destination_format" msgid="7472552212462849956">"%1$s \"%2$s\""</string>
<string name="toast_intent_error" msgid="6164928822619692280">"Inisiasi unggahan gagal."</string>
- <string name="toast_file_error" msgid="1315722681020841350">"Berkas tidak tersedia."</string>
+ <string name="toast_file_error" msgid="1315722681020841350">"File tidak tersedia."</string>
<string name="account_error" msgid="1904775271866104941">"Gagal mengambil informasi akun."</string>
<string name="toast_failed_auth" msgid="2196450105656960566">"Terjadi masalah saat masuk ke akun Anda."</string>
<string name="upload_state_queued" msgid="3990598443227105526"></string>
@@ -57,10 +57,10 @@
<string name="retry_in_2min" msgid="5845688527405283031">"2 menit"</string>
<string name="retry_in_5min" msgid="3153220715959570358">"5 menit"</string>
<string name="retry_no_data" msgid="630347885498641534">"Tidak ada sambungan data"</string>
- <string name="account_out_of_quota" msgid="1849612079678906607">"Kuota diska akun habis"</string>
- <string name="completed_no_file" msgid="6719715000947601844">"Berkas tidak ditemukan"</string>
- <string name="failed_bad_response" msgid="8357723053952213242">"Galat layanan"</string>
- <string name="failed_network_error" msgid="2531660472217573602">"Galat jaringan"</string>
+ <string name="account_out_of_quota" msgid="1849612079678906607">"Kuota disk akun habis"</string>
+ <string name="completed_no_file" msgid="6719715000947601844">"File tidak ditemukan"</string>
+ <string name="failed_bad_response" msgid="8357723053952213242">"Kesalahan layanan"</string>
+ <string name="failed_network_error" msgid="2531660472217573602">"Kesalahan jaringan"</string>
<string name="failed_server_auth" msgid="2428208784689362254">"Autentikasi gagal"</string>
<string name="manager_list_switcher_pending_format" msgid="3517166351274747172">"Unggahan yang tertunda [%d]"</string>
<string name="manager_list_switcher_completed_format" msgid="4700366545949687846">"Unggahan yang selesai [%d]"</string>
@@ -80,8 +80,8 @@
<string name="notify_resolved" msgid="8111194870485485674">"Unggahan selesai"</string>
<string name="notify_paused" msgid="3999817913227671338">"Unggahan dijeda"</string>
<string name="notify_activation_reminder" msgid="1639234651193843030">"Unggah Sekejap belum diaktifkan"</string>
- <string name="dialog_first_wifi" msgid="4318047428346248089">"Berkas berukuran besar akan diunggah melalui sambungan WiFi saja."</string>
- <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Memindai berkas..."</string>
+ <string name="dialog_first_wifi" msgid="4318047428346248089">"File berukuran besar akan diunggah melalui sambungan WiFi saja."</string>
+ <string name="dialog_sync_all_scanning" msgid="3175935645776839524">"Memindai file..."</string>
<string name="dialog_sync_all_preparing" msgid="1666557491871126684">"Menyiapkan <xliff:g id="PHOTOCOUNT">%1$d</xliff:g> foto dan <xliff:g id="VIDEOCOUNT">%2$d</xliff:g> video untuk diunggah..."</string>
<string name="dialog_sync_all_found_none" msgid="4066988191364416995">"Tidak ada foto/video tambahan yang perlu diunggah."</string>
<string name="dialog_sync_all_server_error" msgid="2177063494820815086">"Terjadi masalah saat berkomunikasi dengan server. Coba lagi nanti."</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 8e0d67cc8..1a4956a74 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Lettura allegati email"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Consente all\'applicazione di leggere i tuoi allegati email."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Consente all\'applicazione di leggere gli allegati email."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Accesso ai dati del provider di posta"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Consente a questa applicazione di accedere al database della tua posta, inclusi i messaggi ricevuti e inviati, i nomi utente e le password."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Consente all\'applicazione di accedere al database della tua posta, inclusi i messaggi ricevuti e inviati, i nomi utente e le password."</string>
<string name="app_name" msgid="5815426892327290362">"Email"</string>
<string name="compose_title" msgid="427986915662706899">"Scrivi"</string>
<string name="debug_title" msgid="5175710493691536719">"Debug"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Fine"</string>
<string name="create_action" msgid="3062715563215392251">"Crea nuova"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Elimina"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Nessuna risposta rapida"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nessuna risposta rapida."</string>
<string name="discard_action" msgid="6532206074859505968">"Elimina"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Salva bozza"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Inserisci risposta rapida"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Ricerca"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Impostazioni account"</string>
<string name="settings_action" msgid="6334807007967459412">"Impostazioni"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Opzioni di sincronizzazione"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Opzioni di sincronizzazione"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Segna come da leggere"</string>
<string name="move_action" msgid="3059189775933985898">"Sposta"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Ccn"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> ha scritto:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Includi testo citato"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Includi testo"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Devi aggiungere almeno un destinatario."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Aggiungi almeno un destinatario."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Alcuni indirizzi email non sono validi."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"File troppo grande. Impossibile allegarlo."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Inserisci risposta rapida"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Salvato"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Interrompi"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Allegato salvato come <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Impossibile salvare allegato."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Nota. Prima dell\'invio verranno scaricati uno o più allegati del messaggio inoltrato."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Impossibile salvare allegato."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Prima dell\'invio verranno scaricati uno o più allegati del messaggio inoltrato."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Messaggio"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Invito"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Impossibile inoltrare uno o più allegati."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Allegato non inoltrato"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Accesso a <xliff:g id="ACCOUNT_NAME">%s</xliff:g> non riuscito."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Accesso a <xliff:g id="ACCOUNT_NAME">%s</xliff:g> non riuscito."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Accesso non riuscito"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Meno recenti"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" - "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Impostazione account"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Aggiungi un account Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Aggiungi un account Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Account email"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Puoi configurare la posta elettronica per la maggior parte degli account con pochi passaggi."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Puoi configurare un account Exchange con pochi passaggi."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Puoi configurare un account Exchange ActiveSync con pochi passaggi."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Puoi configurare il tuo account in pochi passaggi."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Indirizzo email"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Password"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Invia email da questo account per impostazione predefinita."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Invia email da questo account per impostazione predefinita"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Config. manuale"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Digita un indirizzo email e una password validi."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Account duplicato"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Verifica impostazioni server della posta in arrivo..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Verifica impostazioni server posta in uscita…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Impostazione account"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Il tuo account è stato impostato e l\'email sarà presto disponibile."</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Il tuo account è stato impostato e l\'email sarà presto disponibile."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Assegna un nome all\'account (facoltativo)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Il tuo nome (visualizzato nei messaggi in uscita)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Questo campo non può essere vuoto."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Impostazioni server Posta in arrivo"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nome utente"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Password"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Server POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Server IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Porta"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipo di sicurezza"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nessuna"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Server SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Porta"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipo di sicurezza"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Richiedi accesso"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Richiedi accesso"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nome utente"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Password"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Impostazione account"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Ogni 15 minuti"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Ogni 30 minuti"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Ogni ora"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Invia email da questo account per impostazione predefinita."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Avvisami all\'arrivo di email."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sincronizza contatti da questo account."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sincronizza il calendario da questo account."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sincronizza le email da questo account."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Invia email da questo account per impostazione predefinita"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Avvisami all\'arrivo di email"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sincronizza contatti di questo account"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sincronizza calendario di questo account"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sincronizza email di questo account"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Scarica allegati automaticamente quando connesso a Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Impossibile completare"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Giorni da sincronizzare"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Un mese"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Tutto"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Usa imp. predefinite account"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Nome utente o password errata."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Nome utente o password errata."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Password o nome utente errato."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Password o nome utente errato."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Impossibile connettersi in modo sicuro al server."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Impossibile connettersi in modo sicuro al server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Certificato client richiesto. Connettersi al server con certificato client?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Certificato non valido o non accessibile."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Il server ha risposto con un errore. Controlla nome utente e password e riprova."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"È necessario un certificato client. Vuoi connetterti al server con un certificato client?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certificato non valido o non accessibile."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Il server ha risposto con un errore. Controlla nome utente e password e riprova."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Impossibile connettersi al server."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Impossibile connettersi al server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS richiesto ma non supportato dal server."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"AVVISO. La disattivazione dell\'autorità dell\'applicazione Email per l\'amministrazione del dispositivo comporterà l\'eliminazione di tutti gli account email che la richiedono, compresi i relativi messaggi email, contatti, eventi di calendario e altri dati."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Aggiornamento sicurezza"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> richiede l\'aggiornamento delle impostazioni di sicurezza."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"È richiesto l\'aggiornamento delle impostazioni di sicurezza per l\'account \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Aggiornamento sicurezza richiesto"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"L\'account \"<xliff:g id="ACCOUNT">%s</xliff:g>\" non può essere sincronizzato a causa di requisiti di sicurezza."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"È richiesto l\'aggiornamento delle impostazioni di sicurezza per l\'account \"<xliff:g id="ACCOUNT">%s</xliff:g>\"."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Impostazioni di sicurezza dell\'account \"<xliff:g id="ACCOUNT">%s</xliff:g>\" modificate; nessun intervento richiesto."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Aggiornamento sicurezza richiesto"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Criteri di sicurezza modificati"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Criteri sicurezza non rispettab."</string>
<string name="account_security_title" msgid="3511543138560418587">"Sicurezza dispositivo"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Il server <xliff:g id="SERVER">%s</xliff:g> richiede che tu consenta il controllo remoto di alcune funzionalità di sicurezza del tuo dispositivo Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Modifica dettagli"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Il PIN o la password di blocco dello schermo sono scaduti."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Password blocco schermo scaduta"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Password blocco schermo in scadenza"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Devi modificare il PIN o la password di blocco dello schermo a breve altrimenti i dati relativi a <xliff:g id="ACCOUNT">%s</xliff:g> verranno cancellati. Apportare la modifica ora?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Appena possibile devi cambiare il PIN o la password di blocco dello schermo; in caso contrario i dati di <xliff:g id="ACCOUNT">%s</xliff:g> verranno cancellati. Vuoi apportare la modifica ora?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Password blocco schermo scaduta"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"I dati relativi a <xliff:g id="ACCOUNT">%s</xliff:g> stanno per essere cancellati dal dispositivo. È possibile ripristinarli modificando il PIN o la password di blocco dello schermo. Apportare la modifica ora?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"I dati relativi a <xliff:g id="ACCOUNT">%s</xliff:g> stanno per essere cancellati dal dispositivo. È possibile ripristinarli modificando il PIN o la password di blocco dello schermo. Vuoi apportare la modifica ora?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Ignorare le modifiche non salvate?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Impossibile accedere"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Il nome utente o la password per <xliff:g id="ACCOUNT">%s</xliff:g> non sono corretti. Aggiornarli ora?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Password o nome utente di <xliff:g id="ACCOUNT">%s</xliff:g> errato. Vuoi aggiornarli ora?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Account predefinito"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Invia email da questo account per impostazione predefinita"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Scarica allegati"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Scarica automaticamente allegati messaggi recenti tramite Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Notifiche email"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Frequenza sincronizzazione, notifiche e altro."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Notifica sulla barra di sistema l\'arrivo di email"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Invia notifica all\'arrivo di email"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frequenza di controllo Posta in arrivo"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Impost. posta in arrivo"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nome utente, password e altre impostazioni server in entrata"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Impost. posta in uscita"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nome utente, password e altre impostazioni server in uscita"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Criteri applicati"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Nessuna"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Criteri non supportati"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Nessuna"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Tentativo di sincronizzazione"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Tocca qui per sincronizzare l\'account"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Nome account"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Nome"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Firma"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Risposte rapide"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Modifica il testo che inserisci spesso quando componi le email"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Modifica il testo che inserisci spesso quando scrivi email"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Aggiungi testo ai messaggi inviati"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Impostazioni notifiche"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Utilizzo dati"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Criteri di sicurezza"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Modifica risposta rapida"</string>
<string name="save_action" msgid="1988862706623227093">"Salva"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronizza contatti"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincronizza i contatti per questo account"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sincronizza calendario"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sincronizza il calendario per questo account"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronizza calendario"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sincron. evento calendario account"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincronizza email"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincronizza le email per questo account"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrazione"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> risultati da <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Impostazioni"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Generali"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Impostazioni generali"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Applicazione"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avanzamento automatico"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Seleziona schermata da visualizzare dopo eliminazione messaggio"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Nascondi caselle di controllo"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Negli elenchi di messaggi, tocca e tieni premuto per selezionare"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Conferma prima di eliminare"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Messaggi"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Conferma prima di inviare"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Messaggi"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Passa a"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Messaggio successivo"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Messaggio precedente"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"In attesa dei risultati"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Alcuni server possono richiedere molto tempo."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Cartelle"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Non consentire uso fotocamera dispositivo"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Richiedi password dispositivo"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Limita riutilizzo password recenti"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Richiedi scadenza password"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Richiedi dispos. inattivo per blocco schermo"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Limita numero di eventi calendario sincronizzati"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Limita numero di email sincronizzate"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Grazie."</string>
+ <string name="quick_2" msgid="4188036352885736617">"Per me va bene."</string>
+ <string name="quick_3" msgid="8061819976353395585">"Lo leggerò più tardi e ti farò sapere."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Organizziamo una riunione per discuterne."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Sincronizzazione dello sfondo per questo account disattivata durante il roaming."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Invio risposta in corso..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Nessun messaggio."</string>
</resources>
diff --git a/res/values-it/uploader.xml b/res/values-it/uploader.xml
index e1fa61b79..7441ef07c 100644
--- a/res/values-it/uploader.xml
+++ b/res/values-it/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Nascondi dettagli"</string>
<string name="menu_settings" msgid="5088116127086866634">"Impostazioni"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Data caricamento: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Account"</string>
<string name="upload" msgid="2615541458361216022">"Carica"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 83ecfd15b..d2727bfed 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"קרא קבצים מצורפים לדוא\"ל"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"מאפשר ליישום זה לקרוא את הקבצים המצורפים להודעות הדוא\"ל שלך."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"מאפשר ליישום לקרוא את הקבצים המצורפים לדוא\"ל."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"גש לנתוני ספק הדוא\"ל"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"מאפשר ליישום זה לגשת למסד הנתונים של הדוא\"ל שלך, כולל להודעות שהתקבלו, להודעות שנשלחו, לשמות משתמש ולסיסמאות."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"מאפשר ליישום לגשת למסד הנתונים של הדוא\"ל שלך, כולל להודעות שהתקבלו, להודעות שנשלחו, לשמות משתמש ולסיסמאות."</string>
<string name="app_name" msgid="5815426892327290362">"דוא\"ל"</string>
<string name="compose_title" msgid="427986915662706899">"חבר הודעה"</string>
<string name="debug_title" msgid="5175710493691536719">"ניקוי באגים"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"סיום"</string>
<string name="create_action" msgid="3062715563215392251">"צור חדש"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"מחק"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"אין תגובות מהירות"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"אין תגובות מהירות."</string>
<string name="discard_action" msgid="6532206074859505968">"מחק"</string>
<string name="save_draft_action" msgid="6413714270991417223">"שמור טיוטה"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"הוסף תגובה מהירה"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"חפש"</string>
<string name="account_settings_action" msgid="4494079183315085171">"הגדרות חשבון"</string>
<string name="settings_action" msgid="6334807007967459412">"הגדרות"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"אפשרויות סינכרון"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"אפשרויות סנכרון"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"סמן כלא נקרא"</string>
<string name="move_action" msgid="3059189775933985898">"העבר"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ עותק/עותק מוסתר"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> כתב:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"כלול טקסט מצוטט"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"כלול טקסט"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"עליך להוסיף נמען אחד לפחות."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"הוסף לפחות נמען אחד."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"חלק מכתובות הדוא\"ל אינן חוקיות."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"הקובץ גדול מדי ולא ניתן לצרף אותו."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"הוסף תגובה מהירה"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"נשמר"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"עצור"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"קובץ מצורף נשמר בשם <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"לא ניתן לשמור את הקובץ המצורף."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"הערה: המערכת תוריד קובץ מצורף אחד או יותר בהודעה שהעברת לפני השליחה."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"לא ניתן לשמור את הקובץ המצורף."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"המערכת תוריד קובץ מצורף אחד או יותר בהודעה שהעברת לפני השליחה."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"הודעה"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"הזמן"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"לא ניתן להעביר קובץ מצורף אחד או יותר."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"הקובץ המצורף לא הועבר"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"הכניסה ל-<xliff:g id="ACCOUNT_NAME">%s</xliff:g> נכשלה."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"הכניסה ל-<xliff:g id="ACCOUNT_NAME">%s</xliff:g> נכשלה."</string>
<string name="login_failed_title" msgid="7624349996212476176">"לא ניתן היה להיכנס"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"‎<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"ישן יותר"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"הגדרת חשבון"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"הוספת חשבון Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"הוסף חשבון Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"חשבון דוא\"ל"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"תוכל להגדיר דוא\"ל עבור רוב החשבונות במספר פעולות פשוטות."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"ניתן להגדיר חשבון Exchange במספר פעולות פשוטות."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"תוכל להגדיר חשבון Exchange ActiveSync במספר פעולות פשוטות."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"ניתן להגדיר את החשבון במספר פעולות פשוטות."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"כתובת דוא\"ל"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"סיסמה"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"שלח דוא\"ל מחשבון זה כברירת מחדל."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"שלח דוא\"ל מחשבון זה כברירת מחדל"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"הגדרה ידנית"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"הקלד כתובת דוא\"ל וסיסמה חוקיות."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"חשבון משוכפל"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"בודק הגדרות שרת דואר נכנס..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"בודק הגדרות שרת דואר יוצא..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"הגדרת חשבון"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"החשבון שלך הוגדר והדוא\"ל בדרך!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"החשבון שלך הוגדר והדוא\"ל בדרך!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"תן שם לחשבון זה (אופציונלי)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"שמך (מוצג בהודעות יוצאות)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"שדה זה לא יכול להיות ריק."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"הגדרות שרת דואר נכנס"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"שם משתמש"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"סיסמה"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"שרת POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"שרת IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"שרת"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"יציאה"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"סוג אבטחה"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"ללא"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"שרת SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"יציאה"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"סוג אבטחה"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"דרוש כניסה."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"דרושה כניסה"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"שם משתמש"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"סיסמה"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"הגדרת חשבון"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"כל 15 דקות"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"כל 30 דקות"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"כל שעה"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"שלח דוא\"ל מחשבון זה כברירת מחדל."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"הודע לי כשמגיע דוא\"ל."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"סנכרן אנשי קשר מחשבון זה."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"סנכרן את לוח השנה מחשבון זה."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"סנכרן דוא\"ל מחשבון זה."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"שלח דוא\"ל מחשבון זה כברירת מחדל"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"הודע לי כשמגיע דוא\"ל"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"סנכרן אנשי קשר מחשבון זה"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"סנכרן את לוח השנה מחשבון זה"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"סנכרן דוא\"ל מחשבון זה"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"הורד קבצים מצורפים באופן אוטומטי כאשר יש חיבור ל-Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"לא ניתן להשלים את הפעולה"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"ימים לסינכרון"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"חודש אחד"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"הכל"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"השתמש בברירת המחדל של החשבון"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"שם המשתמש או הסיסמה שגויים."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"שם המשתמש או הסיסמה שגויים."\n"‏(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"שם המשתמש או הסיסמה שגויים."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"שם המשתמש או הסיסמה שגויים. "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"לא ניתן להתחבר לשרת באופן בטוח."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"לא ניתן להתחבר לשרת באופן בטוח."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"נדרש אישור לקוח. להתחבר לשרת עם אישור לקוח?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"האישור אינו חוקי או שלא ניתן לגשת אליו."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"השרת הגיב עם שגיאה. בדוק את שם המשתמש והסיסמה ונסה שוב."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"דרוש אישרו לקוח. האם אתה רוצה להתחבר לשרת עם אישור לקוח?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"האישור אינו חוקי או שלא ניתן לגשת אליו."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"השרת הגיב עם שגיאה. בדוק את שם המשתמש והסיסמה ונסה שוב."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"לא ניתן להתחבר לשרת."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"לא ניתן להתחבר לשרת."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS נדרש אך אינו נתמך בשרת."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"אזהרה: השבתת ההרשאה של יישום הדוא\"ל לטפל במכשיר תגרום למחיקת כל חשבונות הדוא\"ל שמחייבים הרשאה זו, כולל הודעות הדוא\"ל, אנשי הקשר, האירועים בלוח השנה ונתונים אחרים."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"עדכון אבטחה"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> מחייב עדכון של הגדרות האבטחה שלך."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"החשבון \"<xliff:g id="ACCOUNT">%s</xliff:g>\" דורש עדכון של הגדרות אבטחה."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"נדרש עדכון אבטחה"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"לא ניתן לסנכרן את החשבון \"<xliff:g id="ACCOUNT">%s</xliff:g>\" עקב דרישות אבטחה."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"החשבון \"<xliff:g id="ACCOUNT">%s</xliff:g>\" דורש עדכון של הגדרות אבטחה."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"חשבון \"<xliff:g id="ACCOUNT">%s</xliff:g>\" שינה את הגדרות האבטחה שלו; לא נדרשת כל פעולה מצד המשתמש."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"נדרש עדכון אבטחה"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"מדיניות האבטחה השתנתה"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"לא ניתן לקיים את הוראות מדיניות האבטחה"</string>
<string name="account_security_title" msgid="3511543138560418587">"אבטחת המכשיר"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"השרת <xliff:g id="SERVER">%s</xliff:g> דורש שתאפשר לו שליטה מרחוק על תכונות אבטחה מסוימות במכשיר ה-Android שלך."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"ערוך פרטים"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"פג תוקף ה-PIN או הסיסמה של נעילת המסך שלך."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"פג תוקף הסיסמה של נעילת המסך"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"תוקף הסיסמה של נעילת המסך עומד לפוג"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"עליך לשנות את ה-PIN או הסיסמה של נעילת המסך בקרוב, אחרת הנתונים של <xliff:g id="ACCOUNT">%s</xliff:g> יימחקו. לשנות זאת כעת?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"עליך לשנות את ה-PIN או הסיסמה המשמשים לנעילת מסך, אחרת הנתונים של <xliff:g id="ACCOUNT">%s</xliff:g> יימחקו. האם ברצונך להשנות כעת?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"פג תוקף הסיסמה של נעילת המסך"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"הנתונים עבור <xliff:g id="ACCOUNT">%s</xliff:g> נמחקים מהמכשיר שלך. תוכל לשחזר אותם על ידי שינוי ה-PIN או הסיסמה של נעילת המסך. לשנות זאת כעת?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"הנתונים עבור <xliff:g id="ACCOUNT">%s</xliff:g> נמחקים מהמכשיר שלך. תוכל לשחזר אותם על ידי שינוי ה-PIN או הסיסמה של נעילת המסך. האם ברצונך לשנות כעת?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"למחוק שינויים שלא נשמרו?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"לא ניתן להיכנס"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"שם המשתמש או הסיסמה עבור <xliff:g id="ACCOUNT">%s</xliff:g> שגויים. לעדכן אותם כעת?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"שם המשתמש או הסיסמה עבור <xliff:g id="ACCOUNT">%s</xliff:g> שגוי. האם ברצונך לעדכן כעת?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"חשבון ברירת מחדל"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"שלח דוא\"ל מחשבון זה כברירת מחדל"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"הורד קבצים מצורפים"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"הורד באופן אוטומטי קבצים מצורפים להודעות שהתקבלו לאחרונה באמצעות WiFi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"התראות דוא\"ל"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"תדירות סינכרון, התראות וכדומה"</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"הצג הודעה בשורת המערכת כאשר מגיע דוא\"ל"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"שלח הודעה כשמגיע דוא\"ל"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"תדירות בדיקה של דואר נכנס"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"הגדרות דואר נכנס"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"שם משתמש, סיסמה והגדרות אחרות של שרת דואר נכנס"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"הגדרות דואר יוצא"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"שם משתמש, סיסמה והגדרות אחרות של שרת דואר יוצא"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"מדיניות שנאכפה"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"ללא"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"מדיניות לא נתמכת"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"ללא"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"נסה לסנכרן"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"גע כאן כדי לסנכרן חשבון זה"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"שם חשבון"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"השם שלך"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"חתימה"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"תגובות מהירות"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"ערוך טקסט שאתה מוסיף לעתים קרובות בזמן כתיבת הודעות דוא\"ל"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"ערוך טקסט שאתה מוסיף לעתים קרובות בזמן כתיבת דוא\"ל"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"צרף טקסט להודעות שאתה שולח"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"הגדרות התראה"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"שימוש בנתונים"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"מדיניות אבטחה"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"ערוך תגובה מהירה"</string>
<string name="save_action" msgid="1988862706623227093">"שמור"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"סנכרן אנשי קשר"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"סנכרן אנשי קשר בחשבון זה"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"סנכרן יומן"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"סנכרן יומן בחשבון זה"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"סנכרן יומן"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"סינכרון אירוע לוח שנה עבור חשבון זה"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"סנכרן דוא\"ל"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"סנכרן דוא\"ל בחשבון זה"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"רטט"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> תוצאות מ-<xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"הגדרות"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"כללי"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"הגדרות כלליות"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"יישום"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"התקדמות אוטומטית"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"בחר איזה מסך יוצג לאחר מחיקת הודעה"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"הסתר תיבות סימון"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"ברשימות של הודעות, גע והחזק כדי לבחור"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"אשר לפני מחיקה"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"הודעות"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"אשר לפני שליחה"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"הודעות"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"התקדם אל"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"הודעה חדשה יותר"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"הודעה ישנה יותר"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"ממתין לתוצאות"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"שרתים מסוימים עשויים לדרוש זמן רב."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"תיקיות"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"אל תאפשר שימוש במצלמה של המכשיר"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"נדרשת סיסמת מכשיר"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"הגבל את השימוש החוזר בסיסמאות אחרונות"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"נדרשת תפוגת סיסמאות"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"כפה נעילת מסך של מכשיר לא פעיל"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"הגבל את מספר אירועי לוח השנה המסונכרנים"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"הגבל את מספר פריטי הדוא\"ל המסונכרנים"</string>
+ <string name="quick_1" msgid="3426057697353380951">"תודה!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"נשמע לי טוב!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"אקרא את זה מאוחר יותר ואחזור אליך."</string>
+ <string name="quick_4" msgid="3988974084396883051">"בוא נקבע פגישה כדי לדון בנושא זה."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"סינכרון ברקע של חשבון זה מושבת בזמן נדידה."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"שולח תגובה..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"אין הודעות."</string>
</resources>
diff --git a/res/values-iw/uploader.xml b/res/values-iw/uploader.xml
index 712280bd1..4d34fdf06 100644
--- a/res/values-iw/uploader.xml
+++ b/res/values-iw/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"הסתר פרטים"</string>
<string name="menu_settings" msgid="5088116127086866634">"הגדרות"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"הועלה בתאריך %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"חשבון"</string>
<string name="upload" msgid="2615541458361216022">"העלה"</string>
<string name="ok" msgid="2516349681897895312">"אישור"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 4484762ef..8a89f8a07 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"メール添付ファイルの読み取り"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"メールの添付ファイルの読み取りをこのアプリケーションに許可します。"</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"メールの添付ファイルの読み取りをこのアプリに許可します。"</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"メールプロバイダのデータへのアクセス"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"このアプリケーションにメールデータベース(送受信したメッセージ、ユーザー名、パスワードを含む)へのアクセスを許可します。"</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"このアプリにメールデータベース(送受信したメッセージ、ユーザー名、パスワードを含む)へのアクセスを許可します。"</string>
<string name="app_name" msgid="5815426892327290362">"メール"</string>
<string name="compose_title" msgid="427986915662706899">"作成"</string>
<string name="debug_title" msgid="5175710493691536719">"デバッグ"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"完了"</string>
<string name="create_action" msgid="3062715563215392251">"新規作成"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"削除"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"クイック返信がありません"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"クイック返信がありません。"</string>
<string name="discard_action" msgid="6532206074859505968">"破棄"</string>
<string name="save_draft_action" msgid="6413714270991417223">"下書きを保存"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"クイック返信を挿入"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"検索"</string>
<string name="account_settings_action" msgid="4494079183315085171">"アカウントの設定"</string>
<string name="settings_action" msgid="6334807007967459412">"設定"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"同期オプション"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"同期オプション"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"未読にする"</string>
<string name="move_action" msgid="3059189775933985898">"移動"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"Cc/Bccを追加"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>: "\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"元のメッセージを挿入"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"元のメールを入れる"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"宛先を入力してください。"</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"宛先を入力してください。"</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"無効なメールアドレスがあります。"</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"添付ファイルが大きすぎます。"</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"クイック返信の挿入"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"保存済み"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"停止"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"添付ファイル<xliff:g id="FILENAME">%s</xliff:g>を保存しました。"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"添付ファイルを保存できません。"</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"注: 送信前に転送メッセージの添付ファイルがダウンロードされます。"</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"添付ファイルを保存できませんでした。"</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"送信前に転送メッセージの添付ファイルがダウンロードされます。"</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"メッセージ"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"招待"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"添付ファイルを転送できませんでした。"</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"添付ファイルを転送できません"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g>でログインできませんでした。"</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g>でログインできませんでした。"</string>
<string name="login_failed_title" msgid="7624349996212476176">"ログインできませんでした"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"前"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"アカウント設定"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Exchangeアカウントを追加"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Exchange ActiveSyncアカウントを追加"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"メールアカウント"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"ほとんどのアカウントのメールのセットアップは簡単な操作で完了します。"</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Exchangeアカウントのセットアップは簡単な操作で完了します。"</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Exchange ActiveSyncアカウントのセットアップは簡単な操作で完了します。"</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"アカウントのセットアップは簡単な操作で完了します。"</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"メールアドレス"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"パスワード"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"いつもこのアカウントでメールを送信"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"常にこのアカウントでメールを送信"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"手動セットアップ"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"有効なメールアドレスとパスワードを入力してください。"</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"重複するアカウント"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"受信サーバーの設定を確認中..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"送信サーバーの設定を確認中..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"アカウント設定"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"アカウントの設定が完了しました。"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"アカウントの設定が完了しました。"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"このアカウントに名前を付ける (省略可):"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"あなたの名前(送信メールに表示されます)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"このフィールドは必須です。"</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"受信サーバーの設定"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"ユーザー名"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"パスワード"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3サーバー"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAPサーバー"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"サーバー"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"ポート"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"セキュリティの種類"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"なし"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTPサーバー"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"ポート"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"セキュリティの種類"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"ログインが必要"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"ログインが必要"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"ユーザー名"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"パスワード"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"アカウント設定"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"15分毎"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"30分毎"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"1時間毎"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"いつもこのアカウントでメールを送信"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"メールの着信を知らせる"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"このアカウントから連絡先を同期します。"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"このアカウントからカレンダーを同期"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"このアカウントからメールを同期する"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"常にこのアカウントでメールを送信"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"メールの着信を知らせる"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"このアカウントから連絡先を同期"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"このアカウントからカレンダーを同期"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"このアカウントからメールを同期"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Wi-Fiへの接続時に添付ファイルを自動的にダウンロードする"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"完了できませんでした"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"同期する日数"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"1か月"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"すべて"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"アカウントのデフォルトを使用"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"ユーザー名かパスワードが間違っています。"</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"ユーザー名かパスワードが間違っています。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"ユーザー名またはパスワードが正しくありません。"</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"ユーザー名かパスワードが間違っています。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"サーバーへの安全な接続を確立できません。"</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"サーバーへの安全な接続を確立できません。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"クライアント証明書が必要です。クライアント証明書を使用してサーバーに接続しますか?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"証明書が無効か、証明書にアクセスできません。"</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"サーバーからエラーが返されました。ユーザー名とパスワードを確認してもう一度お試しください。"</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"クライアント証明書が必要です。クライアント証明書を使用してサーバーに接続しますか?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"証明書が無効か、証明書にアクセスできません。"</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"サーバーからエラーが返されました。ユーザー名とパスワードを確認してもう一度お試しください。"</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"サーバーに接続できません。"</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"サーバーに接続できません。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLSが必要ですがサーバーが対応していません。"</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"警告: メールアプリの端末管理権限を無効にすると、権限を必要とするすべてのメールアカウントが削除されます。また、そのアカウントのメール、連絡先、カレンダーの予定などのデータも削除されます。"</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"セキュリティの更新"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g>のセキュリティ設定を更新する必要があります。"</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"アカウント「<xliff:g id="ACCOUNT">%s</xliff:g>」でセキュリティ設定の更新が必要です。"</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"セキュリティの更新が必要です"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"アカウント「<xliff:g id="ACCOUNT">%s</xliff:g>」はセキュリティ要件により同期できません。"</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"アカウント「<xliff:g id="ACCOUNT">%s</xliff:g>」でセキュリティ設定の更新が必要です。"</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"アカウント「<xliff:g id="ACCOUNT">%s</xliff:g>」がセキュリティ設定を変更しました。ユーザーの操作は不要です。"</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"セキュリティの更新が必要です"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"ポリシーが変更されました"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"ポリシーを満たすことができません"</string>
<string name="account_security_title" msgid="3511543138560418587">"端末のセキュリティ"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Android搭載携帯のセキュリティ機能の一部に対するリモートコントロールをサーバー<xliff:g id="SERVER">%s</xliff:g>に許可する必要があります。"</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"設定を編集"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"ロック解除PINまたはパスワードの有効期限が切れました。"</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"ロック解除パスワードが期限切れ"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"ロック解除パスワードの有効期限が間近です"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"ロック解除PINまたはパスワードを変更しないと、まもなく「<xliff:g id="ACCOUNT">%s</xliff:g>」のデータが消去されます。今すぐ変更しますか?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"ロック解除PINまたはパスワードを変更しないと、まもなく<xliff:g id="ACCOUNT">%s</xliff:g>のデータが消去されます。今すぐ変更しますか?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"ロック解除パスワードが期限切れです"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"<xliff:g id="ACCOUNT">%s</xliff:g>のデータが端末から消去されます。ロック解除PINまたはパスワードを変更するとデータを元に戻すことができます。今すぐ変更しますか?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"<xliff:g id="ACCOUNT">%s</xliff:g>のデータが端末から消去されます。ロック解除PINまたはパスワードを変更するとデータを元に戻すことができます。今すぐ変更しますか?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"保存されていない変更を破棄しますか?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"ログインできませんでした"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"<xliff:g id="ACCOUNT">%s</xliff:g>のユーザー名またはパスワードが正しくありません。今すぐ更新しますか?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"<xliff:g id="ACCOUNT">%s</xliff:g>のユーザー名またはパスワードが正しくありません。今すぐ更新しますか?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"優先アカウントにする"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"いつもこのアカウントでメールを送信"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"添付ファイルのダウンロード"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Wi-Fi接続時に最近のメールの添付ファイルを自動的にダウンロード"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"メール着信通知"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"同期頻度、通知、その他"</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"メール受信: システムバーで通知"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"メールの着信時に通知を送信"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"受信トレイの確認頻度"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"受信設定"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"ユーザー名、パスワードなど受信サーバーを設定する"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"送信設定"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"ユーザー名、パスワードなど送信サーバーを設定する"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"適用済みポリシー"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"なし"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"未対応ポリシー"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"なし"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"同期する"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"アカウントを同期するにはこちらをタップします"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"アカウント名"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"名前"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"署名"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"クイック返信"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"メールの作成時に頻繁に挿入する文章を編集する"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"メールの作成時に頻繁に挿入する文章を編集する"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"送信メッセージに署名を付ける"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"通知設定"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"データ使用"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"セキュリティポリシー"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"クイック返信の編集"</string>
<string name="save_action" msgid="1988862706623227093">"保存"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"連絡先を同期"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"このアカウントの連絡先を同期"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"カレンダーを同期"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"このアカウントのカレンダーを同期"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"カレンダーを同期"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"このアカウントのカレンダーの予定を同期"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"メールを同期する"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"このアカウントのメールを同期"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"バイブレーション"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="DOMAIN">%2$s</xliff:g>からの結果: <xliff:g id="RESULTS">%1$d</xliff:g>件"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"設定"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"全般"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"全般設定"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"アプリケーション"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"自動表示"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"メッセージを削除した後に表示する画面を選択します"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"チェックボックスを表示しない"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"メッセージリストで押し続けて選択する"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"削除前に確認する"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"メッセージ"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"送信前に確認する"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"メッセージ"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"表示する画面:"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"新しいメッセージ"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"古いメッセージ"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"結果を待機中"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"サーバーによって時間がかかる場合があります。"</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"フォルダ"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"端末のカメラの使用を許可しない"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"端末のパスワードを必須とする"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"最近使用したパスワードの再使用を制限する"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"パスワードの有効期限を設定する"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"画面ロック前のアイドル時間を設定する"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"同期するカレンダーの予定の数を制限する"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"同期するメールの数を制限する"</string>
+ <string name="quick_1" msgid="3426057697353380951">"ありがとうございます。"</string>
+ <string name="quick_2" msgid="4188036352885736617">"良いと思います。"</string>
+ <string name="quick_3" msgid="8061819976353395585">"確認して折り返し連絡します。"</string>
+ <string name="quick_4" msgid="3988974084396883051">"この件についてミーティングを行いませんか。"</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"このアカウントのバックグラウンドでの同期は、ローミング中は無効です。"</string>
+ <string name="confirm_response" msgid="5747902757569543165">"出欠状況を送信しています..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"メッセージはありません。"</string>
</resources>
diff --git a/res/values-ja/uploader.xml b/res/values-ja/uploader.xml
index c3d7ec45f..bcd33ca87 100644
--- a/res/values-ja/uploader.xml
+++ b/res/values-ja/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"詳細を表示しない"</string>
<string name="menu_settings" msgid="5088116127086866634">"設定"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"アップロード済み: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"アカウント"</string>
<string name="upload" msgid="2615541458361216022">"アップロード"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 52383aee7..8303cfbab 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"이메일 첨부파일 읽기"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"애플리케이션이 이메일 첨부파일을 읽도록 허용합니다."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"앱이 이메일 첨부파일을 읽도록 허용합니다."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"이메일 제공업체 데이터 액세스"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"애플리케이션이 받은 메일, 보낸 메일, 사용자 이름 및 비밀번호를 포함하는 이메일 데이터베이스에 액세스하도록 합니다."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"앱이 받은 메일, 보낸 메일, 사용자 이름 및 비밀번호를 포함하는 이메일 데이터베이스에 액세스하도록 허용합니다."</string>
<string name="app_name" msgid="5815426892327290362">"이메일"</string>
<string name="compose_title" msgid="427986915662706899">"편지쓰기"</string>
<string name="debug_title" msgid="5175710493691536719">"디버그"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"완료"</string>
<string name="create_action" msgid="3062715563215392251">"새로 만들기"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"삭제"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"빠른 응답이 없습니다."</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"빠른 응답이 없습니다."</string>
<string name="discard_action" msgid="6532206074859505968">"삭제"</string>
<string name="save_draft_action" msgid="6413714270991417223">"임시보관함에 저장"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"빠른 응답 삽입"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"검색"</string>
<string name="account_settings_action" msgid="4494079183315085171">"계정 설정"</string>
<string name="settings_action" msgid="6334807007967459412">"설정"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"동기화 옵션"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"동기화 옵션"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"읽지않음으로 표시"</string>
<string name="move_action" msgid="3059189775933985898">"이동"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"참조/숨은참조 추가"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>님이 작성:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"받은메일 포함"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"받은메일 포함"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"받는 사람을 한 명 이상 추가해야 합니다."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"받는 사람을 한 명 이상 추가하세요."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"일부 이메일 주소가 올바르지 않습니다."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"파일이 너무 커서 첨부할 수 없습니다."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"빠른 응답 삽입"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"저장됨"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"중지"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"첨부파일을 <xliff:g id="FILENAME">%s</xliff:g>(으)로 저장했습니다."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"첨부파일을 저장할 수 없습니다."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"참고: 메일을 전달하기 전에 첨부파일을 다운로드합니다."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"첨부파일을 저장하지 못했습니다."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"전달된 메일에 하나 이상의 첨부파일을 다운로드한 다음 전송합니다."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"메일"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"초대"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"하나 이상의 첨부파일을 전달하지 못했습니다."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"첨부파일을 전달하지 못했습니다."</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g>에 로그인하지 못했습니다."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g>에 로그인하지 못했습니다."</string>
<string name="login_failed_title" msgid="7624349996212476176">"로그인하지 못했습니다."</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"이전"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"계정 설정"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Exchange 계정 추가"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Exchange ActiveSync 계정 추가"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"이메일 계정"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"대부분의 계정에 대해 간단하게 이메일을 설정할 수 있습니다."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Exchange 계정을 간단하게 설정할 수 있습니다."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Exchange ActiveSync 계정을 간단하게 설정할 수 있습니다."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"간단하게 계정을 설정할 수 있습니다."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"이메일 주소"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"비밀번호"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"기본적으로 이 계정에서 이메일 전송"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"이 계정에서 이메일 보냄(기본값)"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"수동 설정"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"올바른 이메일 주소와 비밀번호를 입력하세요."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"중복 계정"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"받는 서버 설정 확인 중..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"발신 서버 설정 확인 중..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"계정 설정"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"계정이 설정되었으며 이메일을 사용할 수 있습니다."</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"계정이 설정되었으며 이메일을 사용할 수 있습니다."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"계정 이름 지정(선택사항)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"이름(메일에 표시)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"이 입력란은 비워 둘 수 없습니다."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"수신 서버 설정"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"사용자 이름"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"비밀번호"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3 서버"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP 서버"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"서버"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"포트"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"보안 유형"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"없음"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP 서버"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"포트"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"보안 유형"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"로그인 필요"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"로그인 필요"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"사용자 이름"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"비밀번호"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"계정 설정"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"15분마다"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"30분마다"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"1시간마다"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"기본적으로 이 계정에서 이메일 전송"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"이메일이 오면 알림"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"이 계정에서 연락처를 동기화합니다."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"이 계정에서 캘린더를 동기화합니다."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"이메일 동기화"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"이 계정에서 이메일 보냄(기본값)"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"이메일이 오면 알림"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"이 계정에서 연락처 동기화"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"이 계정에서 캘린더 동기화"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"이 계정에서 이메일 동기화"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Wi-Fi에 연결되면 자동으로 첨부파일 다운로드"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"완료할 수 없음"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"동기화할 일 수"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"1달"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"전체"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"계정 기본값 사용"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"사용자 이름 또는 비밀번호가 잘못되었습니다."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"사용자 이름 또는 비밀번호가 잘못되었습니다."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"사용자 이름 또는 비밀번호가 잘못되었습니다."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"사용자 이름 또는 비밀번호가 잘못되었습니다."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"서버에 안전하게 연결할 수 없습니다."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"서버에 안전하게 연결할 수 없습니다."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"클라이언트 인증서가 필요합니다. 클라이언트 인증서로 서버에 연결하시겠습니까?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"인증서가 잘못되었거나 액세스할 수 없습니다."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"서버에서 오류를 발견했습니다. 사용자 이름과 비밀번호를 확인한 다음 다시 시도해 주세요."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"클라이언트 인증서가 필요합니다. 클라이언트 인증서로 서버에 연결하시겠습니까?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"인증서가 잘못되었거나 액세스할 수 없습니다."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"서버에서 오류를 발견했습니다. 사용자 이름과 비밀번호를 확인한 다음 다시 시도해 주세요."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"서버에 연결할 수 없습니다."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"서버에 연결할 수 없습니다."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS가 필요하지만 서버에서 지원하지 않습니다."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"경고: 이메일 앱의 기기 관리 권한을 비활성화하면 관련된 모든 이메일 계정 및 이메일, 주소록, 캘린더 일정 및 기타 데이터가 모두 삭제됩니다."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"보안 업데이트"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g>의 보안 설정을 업데이트해야 합니다."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"\'<xliff:g id="ACCOUNT">%s</xliff:g>\' 계정을 사용하려면 보안 설정을 업데이트해야 합니다."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"보안 업데이트가 필요합니다."</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"\'<xliff:g id="ACCOUNT">%s</xliff:g>\' 계정이 보안 요구사항으로 인해 동기화될 수 없습니다."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"\'<xliff:g id="ACCOUNT">%s</xliff:g>\' 계정의 보안 설정을 업데이트해야 합니다."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"\'<xliff:g id="ACCOUNT">%s</xliff:g>\' 계정의 보안 설정이 변경되었습니다. 사용자의 조치는 필요하지 않습니다."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"보안 업데이트 필요"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"보안 정책 변경됨"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"보안 정책을 준수할 수 없음"</string>
<string name="account_security_title" msgid="3511543138560418587">"기기 보안"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"<xliff:g id="SERVER">%s</xliff:g> 서버가 Android 기기의 몇 가지 보안 기능을 원격으로 제어할 수 있도록 해야 합니다."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"세부정보 수정"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"화면 잠금 PIN 또는 비밀번호가 만료되었습니다."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"화면 잠금 비밀번호가 만료되었습니다."</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"화면 잠금 비밀번호가 곧 만료될 예정입니다."</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"곧 화면 잠금 PIN 또는 비밀번호를 변경해야 하며, 변경하지 않으면 <xliff:g id="ACCOUNT">%s</xliff:g>의 데이터가 지워집니다. 지금 변경하시겠습니까?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"곧 화면 잠금 PIN 또는 비밀번호를 변경해야 하며, 변경하지 않으면 <xliff:g id="ACCOUNT">%s</xliff:g>의 데이터가 지워집니다. 지금 변경하시겠습니까?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"화면 잠금 비밀번호가 만료되었습니다."</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"<xliff:g id="ACCOUNT">%s</xliff:g>의 데이터가 기기에서 지워졌습니다. 화면 잠금 PIN 또는 비밀번호를 변경하면 데이터를 복구할 수 있습니다. 지금 변경하시겠습니까?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"<xliff:g id="ACCOUNT">%s</xliff:g>의 데이터가 기기에서 지워졌습니다. 화면 잠금 PIN 또는 비밀번호를 변경하면 데이터를 복구할 수 있습니다. 지금 변경하시겠습니까?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"저장되지 않은 변경사항을 삭제하시겠습니까?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"로그인하지 못했습니다."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"<xliff:g id="ACCOUNT">%s</xliff:g>의 사용자 이름 또는 비밀번호가 잘못되었습니다. 지금 업데이트하시겠습니까?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"<xliff:g id="ACCOUNT">%s</xliff:g>의 사용자 이름 또는 비밀번호가 잘못되었습니다. 지금 업데이트하시겠습니까?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"기본 계정"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"기본적으로 이 계정에서 이메일 전송"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"첨부파일 다운로드"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Wi-Fi를 통해 최근 메일의 첨부파일을 자동으로 다운로드합니다."</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"이메일 알림"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"빈도 및 알림 등을 동기화합니다."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"이메일이 오면 시스템 바에서 알림"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"이메일이 오면 알림을 보냄"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"받은편지함 확인 빈도"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"수신 설정"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"사용자 이름, 비밀번호 및 기타 받는 서버 설정"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"발신 설정"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"사용자 이름, 비밀번호 및 기타 보내는 서버 설정"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"적용 정책"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"선택 안함"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"지원되지 않는 정책"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"선택 안함"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"동기화 시도"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"이 계정을 동기화하려면 여기를 터치하세요."</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"계정 이름"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"이름"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"서명"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"빠른 응답"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"이메일을 작성할 때 자주 사용하는 텍스트 수정"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"이메일을 작성할 때 자주 사용하는 텍스트 수정"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"보내는 메일에 텍스트 첨부"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"알림 설정"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"데이터 사용"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"보안 정책"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"빠른 응답 수정"</string>
<string name="save_action" msgid="1988862706623227093">"저장"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"연락처 동기화"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"이 계정의 주소록을 동기화합니다."</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"캘린더 동기화"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"이 계정의 캘린더를 동기화합니다."</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"캘린더 동기화"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"이 계정의 캘린더 일정을 동기화합니다."</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"이메일 동기화"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"이 계정의 이메일을 동기화합니다."</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"진동"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="DOMAIN">%2$s</xliff:g>의 검색결과 <xliff:g id="RESULTS">%1$d</xliff:g>개"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"설정"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"일반"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"일반 설정"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"애플리케이션"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"자동 진행"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"메일을 삭제한 다음 표시할 화면 선택"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"확인란 숨기기"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"메일 목록에서 길게 눌러 선택"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"삭제하기 전에 확인"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"메일"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"보내기 전에 확인"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"메일"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"이동"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"다음 메일"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"이전 메일"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"결과를 기다리는 중"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"일부 서버는 시간이 오래 걸릴 수 있습니다."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"폴더"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"기기 카메라 사용 허용 안함"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"기기 비밀번호 필요"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"최근 사용한 비밀번호 재사용 제한"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"비밀번호 만료 필요"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"유휴 상태인 기기 화면 잠금 필요"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"동기화된 캘린더 일정의 개수 제한"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"동기화된 이메일의 개수 제한"</string>
+ <string name="quick_1" msgid="3426057697353380951">"감사합니다."</string>
+ <string name="quick_2" msgid="4188036352885736617">"좋습니다."</string>
+ <string name="quick_3" msgid="8061819976353395585">"나중에 읽어보고 연락 드리겠습니다."</string>
+ <string name="quick_4" msgid="3988974084396883051">"회의에서 얘기해 봅시다."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"계정 백그라운드 동기화가 로밍하는 동안 사용 중지됩니다."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"응답을 보내는 중..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"메시지가 없습니다."</string>
</resources>
diff --git a/res/values-ko/uploader.xml b/res/values-ko/uploader.xml
index adbc79f10..64dec285b 100644
--- a/res/values-ko/uploader.xml
+++ b/res/values-ko/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"세부정보 숨기기"</string>
<string name="menu_settings" msgid="5088116127086866634">"설정"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"업로드 날짜: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"계정"</string>
<string name="upload" msgid="2615541458361216022">"업로드"</string>
<string name="ok" msgid="2516349681897895312">"확인"</string>
diff --git a/res/values-land/styles.xml b/res/values-land/styles.xml
index d4fb81fc7..deb62c96e 100644
--- a/res/values-land/styles.xml
+++ b/res/values-land/styles.xml
@@ -23,23 +23,6 @@
<item name="android:ellipsize">end</item>
</style>
- <style name="action_bar_spinner_primary_text">
- <item name="android:includeFontPadding">false</item>
- <item name="android:textSize">14sp</item>
- <item name="android:textColor">@color/text_primary_color</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">end</item>
- </style>
-
- <style name="action_bar_spinner_secondary_text">
- <item name="android:includeFontPadding">false</item>
- <item name="android:textSize">12sp</item>
- <item name="android:textColor">@color/text_secondary_color</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">end</item>
- <item name="android:layout_marginTop">-2dip</item>
- </style>
-
<style name="message_view_action_buttons" parent="android:Widget.Holo.Button.Borderless">
<item name="android:layout_width">32dip</item>
<item name="android:layout_height">24dip</item>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index e97eab52f..cb741bcaa 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Skaityti el. laiškų priedus"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Leidžiama šiai programai skaityti el. laiškų priedus."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Leidžiama programai skaityti el. laiškų priedus."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Pasiekti el. pašto paslaugų teikėjo duomenis"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Leidžiama šiai programai pasiekti el. pašto duomenis, įskaitant gautus, išsiųstus pranešimus, naudotojų vardus ir slaptažodžius."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Leidžiama šiai programai pasiekti el. pašto duomenis, įskaitant gautus, išsiųstus pranešimus, naudotojų vardus ir slaptažodžius."</string>
<string name="app_name" msgid="5815426892327290362">"El. paštas"</string>
<string name="compose_title" msgid="427986915662706899">"Sukurti"</string>
<string name="debug_title" msgid="5175710493691536719">"Derinti"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Atlikta"</string>
<string name="create_action" msgid="3062715563215392251">"Sukurti naują"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Ištrinti"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Nėra greitų atsakymų"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nėra greitų atsakymų."</string>
<string name="discard_action" msgid="6532206074859505968">"Atmesti"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Išsaug. juodraš."</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Įterpti greitą atsaką"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Ieškoti"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Paskyros nustatymai"</string>
<string name="settings_action" msgid="6334807007967459412">"Nustatymai"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Sinchronizavimo parinktys"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Sinchronizavimo parinktys"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Pažymėti kaip neskaitytą"</string>
<string name="move_action" msgid="3059189775933985898">"Perkelti"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ kop. / nemat. kop."</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> rašė:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Įtraukti cituojamą tekstą"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Įtraukti tekstą"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Turite pridėti bent vieną gavėją."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Pridėkite bent vieną gavėją."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Kai kurie el. pašto adresai neteisingi."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Failas per didelis, kad būtų pridėtas."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Įterpti greitą atsaką"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Išsaugota"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Sustabdyti"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Priedas išsaugotas kaip <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Nepavyko išsaugoti priedo."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Pastaba: prieš siunčiant bus atsisiųstas mažiausiai vienas priedas persiųstame pranešime."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Nepavyko išsaugoti priedo."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Prieš siunčiant persiųstame pranešime bus atsisiųstas mažiausiai vienas priedas."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Pranešimas"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Pakviesti"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Nepavyko persiųsti mažiausiai vieno priedo."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Priedas nepersiųstas"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Įvyko prisijungimo prie „<xliff:g id="ACCOUNT_NAME">%s</xliff:g>“ klaida."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Nepavyko prisijungti prie <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Nepavyko prisijungti"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Senesnis"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Paskyros sąranka"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Pridėti „Exchange“ paskyrą"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Pridėti „Exchange ActiveSync“ paskyrą"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"El. pašto paskyra"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Daugelyje paskyrų galite nustatyti el. paštą atlikę vos kelis veiksmus."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Galite nustatyti „Exchange“ paskyrą atlikę vos kelis veiksmus."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Galite nustatyti „Exchange ActiveSync“ paskyrą atlikę vos kelis veiksmus."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Galite nustatyti paskyrą atlikę vos kelis veiksmus."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"El. pašto adresas"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Slaptažodis"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Pagal numatytuosius nustatymus siųsti el. laišką iš šios paskyros."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Pagal numatytuosius nustatymus siųsti el. laišką iš šios paskyros"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Neaut. nustat."</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Įveskite galiojantį el. pašto adresą ir slaptažodį."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Kopijuoti paskyrą"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Tikrinami gaunamų laiškų serverio nustatymai..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Tikrinami siunčiamo serverio nustatymai..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Paskyros sąranka"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Paskyra nustatyta ir išsiųstas el. laiškas!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Paskyra nustatyta, el. laiškas išsiųstas!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Suteikti šiai paskyrai pavadinimą (pasirenkama)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Jūsų vardas ir pavardė (pateikiami siunčiamuose pranešimuose)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Šis laukas negali būti tuščias."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Gaunamų laiškų serverio nustatymai"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Naudotojo vardas"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Slaptažodis"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3 serveris"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP serveris"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Serveris"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Prievadas"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Saugos tipas"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nėra"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP serveris"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Prievadas"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Saugos tipas"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Reikalauti prisijungti."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Reikalauti prisijungti"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Naudotojo vardas"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Slaptažodis"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Paskyros sąranka"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Kas 15 min."</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Kas 30 min."</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Kas valandą"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Pagal numatytuosius nustatymus siųsti el. laišką iš šios paskyros."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Pranešti man, kai gausiu el. laišką."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sinchronizuoti šios paskyros adresatus."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sinchronizuoti šios paskyros kalendorių."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sinchronizuoti el. paštą iš šios paskyros."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Pagal numatytuosius nustatymus siųsti el. laišką iš šios paskyros"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Pranešti, kai gausiu el. laišką"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sinchronizuoti šios paskyros kontaktus"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sinchronizuoti šios paskyros kalendorių"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sinchronizuoti šios paskyros el. paštą"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Automatiškai atsisiųsti priedus, kai prisijungiama prie „Wi-Fi“"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nepavyko užbaigti"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Sinchronizuojamų dienų skaičius"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Vienas mėnuo"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Visas"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Naudoti num. pask. nust."</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Neteisingas naudotojo vardas ar slaptažodis."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Neteisingas naudotojo vardas ar slaptažodis."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Neteisingas naudotojo vardas ar slaptažodis."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Neteisingas naudotojo vardas ar slaptažodis."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nepavyksta saugiai prisijungti prie serverio."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nepavyksta saugiai prisijungti prie serverio."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Reikia kliento sertifikato. Prisijungti prie serverio naudojant kliento sertifikatą?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Sertifikatas negalioja arba nepasiekiamas."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Serveris atsakė pateikdamas klaidą. Patikrinkite naudotojo vardą bei slaptažodį ir bandykite dar kartą."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Reikalingas kliento sertifikatas. Ar norite prie serverio prisijungti naudodami kliento sertifikatą?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sertifikatas netinkamas ar nepasiekiamas."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Serveris atsakė pateikdamas klaidą. Patikrinkite naudotojo vardą bei slaptažodį ir bandykite dar kartą."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nepavyksta prisijungti prie serverio."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Negalima prisijungti prie serverio."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"Reikalingas TLS, bet jo nepalaiko serveris."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"ĮSPĖJIMAS: išaktyvinus el. pašto programos leidimą administruoti įrenginį, bus ištrintos visos el. pašto paskyros, kurioms jis reikalingas, įskaitant el. laiškus, kontaktus, kalendoriaus įvykius ir kitus duomenis."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Saugos naujinys"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"„<xliff:g id="ACCOUNT">%s</xliff:g>“ reikia atnaujinti saugos nustatymus."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Reikalingas paskyros „<xliff:g id="ACCOUNT">%s</xliff:g>“ saugos nustatymų atnaujinimas."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Būtina atnaujinti saugumą"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Paskyros „<xliff:g id="ACCOUNT">%s</xliff:g>“ negalima sinchronizuoti dėl saugos reikalavimų."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Reikalingas „<xliff:g id="ACCOUNT">%s</xliff:g>“ paskyros saugos nustatymų atnaujinimas."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Pasikeitė paskyros „<xliff:g id="ACCOUNT">%s</xliff:g>“ saugos nustatymai. Nereikia imtis jokių veiksmų."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Reikalingas saugos atnaujinimas"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Pakeista saugos politika"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Neįman. atitikti saugos polit."</string>
<string name="account_security_title" msgid="3511543138560418587">"Įrenginio sauga"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Serveris „<xliff:g id="SERVER">%s</xliff:g>“ reikalauja leisti jam nuotoliniu būdu valdyti kai kurias „Android“ įrenginio saugos funkcijas."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Redaguoti išsamią informaciją"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Baigėsi ekrano užrakto PIN kodo ar slaptažodžio galiojimo laikas."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Baig. ekr. užr. slapt. galioj. laikas"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Baigiasi ekr. užr. slapt. galioj. laikas"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Būtina greitai pakeisti ekrano užrakto PIN kodą ar slaptažodį, nes bus ištrinti „<xliff:g id="ACCOUNT">%s</xliff:g>“ duomenys. Pakeisti dabar?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Būtinai reikia greitu metu pakeisti ekrano užrakinimo PIN kodą ar slaptažodį, nes bus ištrinti „<xliff:g id="ACCOUNT">%s</xliff:g>“ duomenys. Ar norite jį pakeisti dabar?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Baig. ekr. užr. slapt. galioj. laikas"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Iš jūsų įrenginio ištrinami „<xliff:g id="ACCOUNT">%s</xliff:g>“ duomenys. Atkurti juos galite pakeisdami ekrano užrakto PIN kodą ar slaptažodį. Pakeisti dabar?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Iš įrenginio ištrinami „<xliff:g id="ACCOUNT">%s</xliff:g>“ duomenys. Galite juos atkurti pakeisdami ekrano užrakinimo PIN kodą ar slaptažodį. Ar norite pakeisti jį dabar?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Atmesti neišsaugotus pakeitimus?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Nepavyko prisijungti"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"„<xliff:g id="ACCOUNT">%s</xliff:g>“ naudotojo vardas ar slaptažodis neteisingas. Atnaujinti juos dabar?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Neteisingas „<xliff:g id="ACCOUNT">%s</xliff:g>“ naudotojo vardas ar slaptažodis. Ar norite atnaujinti juos dabar?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Numatytoji paskyra"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Pagal numatytuosius nustatymus siųsti el. laišką iš šios paskyros"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Atsisiųsti priedus"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Automatiškai atsis. naujausių pranešimų priedai per „Wi-Fi“"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"El. pašto pranešimai"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Sinchronizavimo dažnumas, pranešimai ir kt."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Kai atsiunčiamas el. laiškas, pranešti sistemos juostoje"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Siųsti pranešimą, kai gaunamas el. laiškas"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Gautųjų tikrinimo dažnumas"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Gaunamų laiškų nustatymai"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Naudotojo vardas, slaptažodis ir kiti gavimo serverio nustatymai"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Siunčiamų laiškų nustatymai"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Naudotojo vardas, slaptažodis ir kiti siuntimo serv. nustatymai"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Vykdoma politika"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Nėra"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nepalaikoma politika"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Nėra"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Bandyti sinchronizuoti"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Jei norite sinchronizuoti šią paskyrą, palieskite čia"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Paskyros pavadinimas"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Jūsų vardas ir pavardė"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Parašas"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Greiti atsakai"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Redaguokite tekstą, kurį dažnai įterpiate kurdami el. laiškus"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Redaguokite tekstą, kurį dažnai įterpiate kurdami el. laišką"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Priskirti tekstą prie siunčiamų pranešimų"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Įspėjimų nustatymai"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Duomenų naudojimas"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Saugos politika"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Redaguoti greitą atsaką"</string>
<string name="save_action" msgid="1988862706623227093">"Išsaugoti"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sinchronizuoti adresatus"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sinchron. šios paskyros kontaktus"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sinchron. Kalendorių"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sinchron. šios paskyros kalendorių"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sinchronizuoti kalendorių"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sinchron. šios paskyros kalendorių"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sinchron. el. paštą"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sinchron. šios paskyros el. paštą"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibruoti"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> rezultatai (-ų) iš <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Nustatymai"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Bendra"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Bendrieji nustatymai"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Programa"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatinis perėjimas"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Pasirinkite, kurį ekraną rodyti ištrynus pranešimą"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Slėpti žymimuosius laukelius"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Jei norite pasirinkti, pranešimų sąraš. palieskite ir laikykite"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Patvirtinti prieš ištrinant"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Pranešimai"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Patvirtinti prieš siunčiant"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Pranešimai"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Pereiti į"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Naujesnis pranešimas"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Senesnis pranešimas"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Laukiama rezultatų"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Kai kurie serveriai gali ilgai užtrukti."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Aplankai"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Neleisti naudoti įrenginio fotoaparato"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Reikalauti įrenginio slaptažodžio"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Riboti naujausių slapt. pakart. panaud."</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Reikalauti slaptaž. galiojimo pabaigos"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Užrakinti ekraną nenaudojant įrenginio"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Riboti sinchron. kalendoriaus įvykių skaičių"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Riboti sinchronizuojamų el. laiškų skaičių"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Ačiū!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Skamba gerai!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Perskaitysiu vėliau ir jums atsakysiu."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Aptarkime tai susitikę."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Foninis šios paskyros sinchronizavimas neleidžiamas perduodant duomenis tarptinkliniu ryšiu."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Siunčiamas atsakymas..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Pranešimų nėra."</string>
</resources>
diff --git a/res/values-lt/uploader.xml b/res/values-lt/uploader.xml
index d1a65c669..281fd8cf6 100644
--- a/res/values-lt/uploader.xml
+++ b/res/values-lt/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Slėpti išsamią informaciją"</string>
<string name="menu_settings" msgid="5088116127086866634">"Nustatymai"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Įkelta %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Paskyra"</string>
<string name="upload" msgid="2615541458361216022">"Įkelti"</string>
<string name="ok" msgid="2516349681897895312">"Gerai"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 10985e5d8..bc6b9b980 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Lasīt e-pasta ziņojumu pielikumus"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Nodrošina šai lietojumprogrammai lasīšanas piekļuvi e-pasta ziņojumu pielikumiem."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Ļauj lietotnei lasīt e-pasta ziņojumu pielikumus."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Piekļūt e-pasta pakalpojumu sniedzēja datiem"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Ļauj lietojumprogrammai piekļūt jūsu e-pasta datu bāzei, tostarp saņemtajiem ziņojumiem, nosūtītajiem ziņojumiem, lietotājvārdiem un parolēm."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Ļauj lietotnei piekļūt jūsu e-pasta datu bāzei, tostarp saņemtajiem ziņojumiem, nosūtītajiem ziņojumiem, lietotājvārdiem un parolēm."</string>
<string name="app_name" msgid="5815426892327290362">"E-pasts"</string>
<string name="compose_title" msgid="427986915662706899">"E-pasta ziņojuma rakstīšana"</string>
<string name="debug_title" msgid="5175710493691536719">"Atkļūdot"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Gatavs"</string>
<string name="create_action" msgid="3062715563215392251">"Izveidot jaunu"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Dzēst"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Nav ātro atbilžu."</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nav ātro atbilžu."</string>
<string name="discard_action" msgid="6532206074859505968">"Atmest"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Saglabāt melnr."</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Ievietot ātro atbildi"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Meklēt"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Konta iestatījumi"</string>
<string name="settings_action" msgid="6334807007967459412">"Iestatījumi"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Sinhronizācijas opcijas"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Sinhronizācijas opcijas"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Atzīmēt kā nelasītu"</string>
<string name="move_action" msgid="3059189775933985898">"Pārvietot"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Kopija/d. kop."</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> rakstīja:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Citēta teksta iekļaušana"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Iekļaut tekstu"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Jāpievieno vismaz viens adresāts."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Pievienojiet vismaz vienu adresātu."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Dažas e-pasta adreses nav derīgas."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Failu nevar pievienot, jo tas ir pārāk liels."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Ātrās atbildes ievietošana"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Saglabāts"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Apturēt"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Pielikums saglabāts kā <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Nevarēja saglabāt pielikumu."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Piezīme. Viens vai vairāki pārsūtītā ziņojuma pielikumi pirms sūtīšanas tiks lejupielādēti."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Nevarēja saglabāt pielikumu."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Viens vai vairāki pārsūtītā ziņojuma pielikumi pirms sūtīšanas tiks lejupielādēti."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Ziņojums"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Uzaicināt"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Nevarēja pārsūtīt vienu vai vairākus pielikumus."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Pielikums netika nosūtīts."</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Neizdevās pierakstīties kontā <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Neizdevās pierakstīties kontā <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Nevarēja pierakstīties"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,16 +232,12 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Vecāki"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Konta iestatīšana"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Exchange konta pievienošana"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Pievienot Exchange ActiveSync kontu"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"E-pasta konts"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"E-pasts atbalsts lielāko daļu populārāko pasta klientu."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Varat iestatīt Exchange kontu, veicot tikai dažas darbības."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Varat iestatīt Exchange ActiveSync kontu, veicot tikai dažas darbības."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Varat iestatīt savu kontu, veicot tikai dažas darbības."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-pasta adrese"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Parole"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Pēc noklusējuma sūtīt e-pastu no šī konta."</string>
- <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuāla iestatīšana"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Pēc noklusējuma sūtīt e-pasta ziņojumus no šī konta"</string>
+ <string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuāla iest."</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Ierakstiet derīgu e-pasta adresi un paroli."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dublikāta konts"</string>
<string name="account_duplicate_dlg_message_fmt" msgid="6447629283679935840">"Jūs jau izmantojat šo lietotājvārdu kontam <xliff:g id="DUPLICATE">%s</xliff:g>."</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Notiek servera ienākošo datu iestatījumu pārbaude..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Notiek servera izejošo datu iestatījumu pārbaude…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Konta iestatīšana"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Jūsu konts ir iestatīts, un ir nosūtīts e-pasta ziņojums."</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Jūsu konts ir izveidots, un ir nosūtīts e-pasta ziņojums."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Ievadiet konta nosaukumu (neobligāti)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Jūsu vārds (attēlots izejošajos ziņojumos)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Šis lauks nedrīkst būt tukšs."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Ienākošā servera iestatījumi"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Lietotājvārds"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Parole"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3 serveris"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP serveris"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Serveris"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Ports"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Drošības veids"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nav"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP serveris"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Ports"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Drošības veids"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Pieprasīt pierakstīšanos."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Pieprasīt pierakstīšanos"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Lietotājvārds"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Parole"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Konta iestatīšana"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Ik pēc 15 minūtēm"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Ik pēc 30 minūtēm"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Ik pēc stundas"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Pēc noklusējuma sūtīt e-pastu no šī konta."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Paziņot man, kad tiek saņemts jauns e-pasta ziņojums."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sinhronizēt kontaktpersonas no šī konta."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sinhronizēt šī konta kalendāru."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Šī konta e-pasta sinhronizācija."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Pēc noklusējuma sūtīt e-pasta ziņojumus no šī konta"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Paziņot man, kad tiek saņemts jauns e-pasta ziņojums"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sinhronizēt šī konta kontaktpersonas"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sinhronizēt šī konta kalendāru"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sinhronizēt šī konta e-pastu"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Automātiski lejupielādēt pielikumus, kad ir izveidots WiFi savienojums"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nevarēja pabeigt"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Sinhronizējamās dienas"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Viens mēnesis"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Visi"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Izmantot konta noklusēj."</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Lietotājvārds vai parole nav pareiza."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Lietotājvārds vai parole nav pareiza."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nepareizs lietotājvārds vai parole."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Lietotājvārds vai parole nav pareiza."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nevar izveidot drošu savienojumu ar serveri."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nevar izveidot drošu savienojumu ar serveri."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Ir nepieciešams klienta sertifikāts. Vai izveidot savienojumu ar serveri, izmantojot klienta sertifikātu?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Sertifikāts nav derīgs vai nav pieejams."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Serveris atgrieza kļūdu. Pārbaudiet lietotājvārdu un paroli un pēc tam mēģiniet vēlreiz."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Ir nepieciešams klienta sertifikāts. Vai vēlaties izveidot savienojumu ar serveri, izmantojot klienta sertifikātu?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sertifikāts nav derīgs vai nav pieejams."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Serveris atgrieza kļūdu. Pārbaudiet lietotājvārdu un paroli un pēc tam mēģiniet vēlreiz."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nevar izveidot savienojumu ar serveri."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Nevar izveidot savienojumu ar serveri."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"Protokols TLS ir obligāts, taču serveris to neatbalsta."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"BRĪDINĀJUMS: deaktivizējot lietotnes E-pasts tiesības administrēt jūsu ierīci, tiks dzēsti visi e-pasta konti, kuriem šī funkcionalitāte ir nepieciešama, kā arī šo kontu e-pasta ziņojumi, kontaktpersonas, kalendāra pasākumi un citi dati."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Drošības atjauninājums"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Kontam <xliff:g id="ACCOUNT">%s</xliff:g> ir jāatjaunina drošības iestatījumi."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Kontā “<xliff:g id="ACCOUNT">%s</xliff:g>” nepieciešams atjaunināt drošības iestatījumus."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Nepiecieš. droš. atjauninājums"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Kontu <xliff:g id="ACCOUNT">%s</xliff:g> nevar sinhronizēt drošības prasību dēļ."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Kontā <xliff:g id="ACCOUNT">%s</xliff:g> ir jāatjaunina drošības iestatījumi."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Kontā <xliff:g id="ACCOUNT">%s</xliff:g> ir mainīti drošības iestatījumi; lietotājam nav jāveic nekādas darbības."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Nepieciešams drošības atjaun."</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Droš. politikas ir mainītas."</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Netiek ievērota droš. politika"</string>
<string name="account_security_title" msgid="3511543138560418587">"Ierīces drošība"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Serveris <xliff:g id="SERVER">%s</xliff:g> pieprasa, lai jūs tam atļautu attālināti vadīt dažas jūsu Android ierīces drošības funkcijas."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Rediģēt datus"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Ekrāna bloķēšanas PIN vai paroles derīguma termiņš ir beidzies."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Ekr. bloķ. paroles term. b."</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Ekr. bloķ. paroles term. tuvojas beigām"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Jums drīzumā ir jāmaina ekrāna bloķēšanas PIN vai parole, pretējā gadījumā konta <xliff:g id="ACCOUNT">%s</xliff:g> dati tiks dzēsti. Vai mainīt tūlīt?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Jums drīzumā ir jāmaina ekrāna bloķēšanas PIN vai parole, citādi konta <xliff:g id="ACCOUNT">%s</xliff:g> dati tiks dzēsti. Vai vēlaties to mainīt tūlīt?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Ekrāna bloķēš. paroles termiņa beigas"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Konta <xliff:g id="ACCOUNT">%s</xliff:g> dati tiek dzēsti no šīs ierīces. Varat tos atjaunot, nomainot ekrāna bloķēšanas PIN vai paroli. Vai mainīt tūlīt?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Konta <xliff:g id="ACCOUNT">%s</xliff:g> dati tiek dzēsti no šīs ierīces. Tos var atjaunot, nomainot ekrāna bloķēšanas PIN vai paroli. Vai vēlaties to mainīt tūlīt?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Vai atmest nesaglabātās izmaiņas?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Nevarēja pierakstīties"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Konta <xliff:g id="ACCOUNT">%s</xliff:g> lietotājvārds un parole nav pareizi. Vai atjaunināt tos tūlīt?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Konta <xliff:g id="ACCOUNT">%s</xliff:g> lietotājvārds vai parole nav pareiza. Vai vēlaties tos atjaunināt tūlīt?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Noklusējuma konts"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Pēc noklusējuma sūtīt e-pasta ziņojumus no šī konta"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Lejupielādēt pielikumus"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Automātiski lejupielādēt jaunāko ziņojumu pielikumus Wi-Fi tīklā"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"E-pasta paziņojumi"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Sinhronizācijas biežums, paziņojumi u.c."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Rādīt paziņojumu statusa joslā, kad tiek saņemts e-pasta ziņojums"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Nosūtīt paziņojumu, kad tiek saņemts e-pasta ziņojums"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Iesūtnes pārbaudes biežums"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Ienākošo datu iestatījumi"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Lietotājvārds, parole u.c. ienākošā pasta servera iestatījumi"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Izejošo datu iestatījumi"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Lietotājvārds, parole un citi izejošā pasta servera iestatījumi"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Īstenotās politikas"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Nav"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Neatbalstītas politikas"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Nav"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Sinhronizēt"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Pieskarties šeit, lai sinhronizētu šo kontu"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Konta nosaukums"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Jūsu vārds"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Paraksts"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Ātrās atbildes"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Rediģējiet tekstu, kuru bieži ievietojat e-pasta ziņojumos."</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Rediģēt tekstu, kuru bieži ievietojat e-pasta ziņojumos"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Pievienot tekstu nosūtītajiem ziņojumiem"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Paziņojumu iestatījumi"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Datu lietojums"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Drošības politikas"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Ātrās atbildes rediģēšana"</string>
<string name="save_action" msgid="1988862706623227093">"Saglabāt"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sinhronizēt kontaktpersonas"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sinhron. kontaktpersonas šim kontam"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sinhron. kalendāru"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sinhronizēt kalendāru šim kontam"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sinhronizēt kalendāru"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sinhr. šī konta kalendāra notikumus"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sinhronizēt e-pastu"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sinhronizēt e-pastu šim kontam"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrozvans"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> rezultāti no domēna <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Iestatījumi"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Vispārīgi"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Vispārīgi iestatījumi"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Lietojumprogramma"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automātiski pāriet"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Izvēlieties pēc ziņojuma dzēšanas parādāmo ekrānu"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Slēpt izvēles rūtiņas"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Ziņoj. sarakstos pieskarieties un turiet nospiestu, lai atlasītu"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Apstiprināt pirms dzēšanas"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Ziņojumi"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Apstiprināt pirms sūtīšanas"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Ziņojumi"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Pāriet uz"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Jauns ziņojums"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Vecāki ziņojumi"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Tiek gaidīti rezultāti"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Dažu serveru darbība var aizņemt ilgu laiku."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mapes"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Neatļaut ierīces kameras izmantošanu"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Pieprasīt ierīces paroli"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Ierobežot jaunāko paroļu atkārt. izmant."</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Pieprasīt paroļu derīguma term. beigas"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Bloķēt ierīc. ekr., kad tā ir dīkstāvē"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Ierobežot sinhronizēto kalendāra notikumu skaitu"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Ierobežot sinhronizēto e-pasta ziņojumu skaitu"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Paldies!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Esmu ar mieru!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Vēlāk izlasīšu šo ziņojumu un atbildēšu."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Norunāsim tikšanos, lai to pārrunātu."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Viesabonēšanas laikā fona sinhronizācija šajā kontā ir atspējota."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Notiek atbildes sūtīšana..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Nav ziņojumu."</string>
</resources>
diff --git a/res/values-lv/uploader.xml b/res/values-lv/uploader.xml
index d333de6d7..82b74dfa5 100644
--- a/res/values-lv/uploader.xml
+++ b/res/values-lv/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Slēpt informāciju"</string>
<string name="menu_settings" msgid="5088116127086866634">"Iestatījumi"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Augšupielādēts: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Konts"</string>
<string name="upload" msgid="2615541458361216022">"Augšupielādēt"</string>
<string name="ok" msgid="2516349681897895312">"Labi"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 96f65f02f..33ab41a3a 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Baca lampiran e-mel"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Membenarkan aplikasi ini membaca lampiran e-mel anda."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Membenarkan apl membaca lampiran e-mel anda."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Akses data pembekal e-mel"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Membenarkan aplikasi ini mengakses pangkalan data e-mel anda, termasuk mesej diterima, mesej dihantar, nama pengguna dan kata laluan."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Membenarkan apl ini mengakses pangkalan data e-mel anda, termasuk mesej diterima, mesej dihantar, nama pengguna dan kata laluan."</string>
<string name="app_name" msgid="5815426892327290362">"E-mel"</string>
<string name="compose_title" msgid="427986915662706899">"Karang"</string>
<string name="debug_title" msgid="5175710493691536719">"Nyahpepijat"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Selesai"</string>
<string name="create_action" msgid="3062715563215392251">"Buat baru"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Padam"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Tiada tindak balas cepat"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Tiada tindak balas cepat."</string>
<string name="discard_action" msgid="6532206074859505968">"Buang"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Simpan draf"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Sisipkan respons pantas"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Carian"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Tetapan akaun"</string>
<string name="settings_action" msgid="6334807007967459412">"Tetapan"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Pilihan segerak"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Pilihan segerak"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Tandakan belum dibaca"</string>
<string name="move_action" msgid="3059189775933985898">"Alih"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Sk/Skt"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> menulis:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Sertakan teks petikan"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Sertakan teks"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Anda mesti menambah sekurang-kurangnya satu penerima."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Tambahkan sekurang-kurangnya satu penerima."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Sesetengah alamat e-mel tidak sah."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Fail terlalu besar untuk dilampirkan."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Sisipkan respons pantas"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Disimpan"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Berhenti"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Lampiran disimpan sbg <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Tidak dapat menyimpan lampiran."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Nota: Satu atau lebih lampiran dalam mesej anda yang dikirim semula akan dimuat turun sebelum dihantar."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Tidak dapat menyimpan lampiran."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Satu atau lebih lampiran dalam mesej anda yang dikirim semula akan dimuat turun sebelum dihantar."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Mesej"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Jemput"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Tidak boleh mengirim semula satu atau lebih lampiran."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Lampiran tidak dikirim semula"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Log masuk <xliff:g id="ACCOUNT_NAME">%s</xliff:g> gagal."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> log masuk gagal."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Tidak dapat melog masuk"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Lebih lama"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Persediaan akaun"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Tambah akaun Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Tambah akaun Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Akaun e-mel"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Anda boleh membuat e-mel untuk kebanyakan akaun dalam hanya beberapa langkah."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Anda boleh membuat akaun Exchange dalam hanya beberapa langkah."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Anda boleh membuat akaun Exchange ActiveSync dalam hanya beberapa langkah."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Anda boleh membuat akaun anda dalam hanya beberapa langkah."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Alamat e-mel"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Kata laluan"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Hantarkan e-mel dari akaun ini secara lalainya."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Hantar e-mel daripada akaun ini secara lalai"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Persediaan manual"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Taipkan alamat e-mel dan kata laluan yang sah."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Akaun pendua"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Menyemak tetapan pelayan masuk..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Menyemak tetapan pelayan keluar..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Persediaan akaun"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Akaun anda sudah disediakan dan e-mel akan muncul sebentar lagi!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Akaun anda sudah disediakan dan e-mel akan muncul sebentar lagi!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Namakan akaun ini (pilihan)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Nama anda (dipaparkan pada mesej keluar)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Medan ini tidak boleh kosong."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Tetapan pelayan masuk"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nama pengguna"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Kata laluan"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Pelayan POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Pelayan IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Pelayan"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Jenis keselamatan"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Tiada"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Pelayan SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Jenis keselamatan"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Memerlukan log masuk."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Memerlukan log masuk"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nama pengguna"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Kata laluan"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Persediaan akaun"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Setiap 15 minit"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Setiap 30 minit"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Setiap jam"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Hantar e-mel dari akaun ini secara lalainya."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Beritahu saya apabila e-mel diterima."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Segerakkan kenalan daripada akaun ini."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Segerakkan kalendar dari akaun ini."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Segerakkan e-mel dari akaun ini."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Hantar e-mel daripada akaun ini secara lalai"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Beritahu saya apabila e-mel diterima"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Segerakkan kenalan daripada akaun ini"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Segerakkan kalendar dari akaun ini."</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Segerakkan e-mel dari akaun ini"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Muat turun lampiran secara automatik apabila disambungkan kepada Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Tidak boleh diselesaikan"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Hari untuk disegerakkan"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Satu bulan"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Semua"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Gunakan lalai akaun"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Nama pengguna atau kata laluan salah."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Nama pengguna atau kata laluan salah."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nama pengguna atau kata laluan salah."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nama pengguna atau kata laluan salah. "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Tidak boleh menyambung ke pelayan dengan selamat."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Tidak dapat menyambung ke pelayan dengan selamat."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Sijil klien diperlukan. Sambung ke pelayan dengan sijil klien?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Sijil adalah tidak sah atau tidak boleh diakses."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Pelayan memberi maklum balas dengan ralat. Semak nama pengguna dan kata laluan anda, kemudian cuba lagi."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Sijil klien diperlukan. Adakah anda mahu menyambung ke pelayan dengan sijil klien?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sijil itu adalah tidak sah atau tidak boleh diakses."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Pelayan memberi maklum balas dengan ralat. Semak nama pengguna dan kata laluan anda, kemudian cuba lagi."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Tidak dapat menyambung ke pelayan."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Tidak dapat menyambung ke pelayan."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS diperlukan tetapi tidak disokong oleh pelayan."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"AMARAN: Menyahaktifkan autoriti aplikasi E-mel untuk mentadbir peranti anda akan memadamkan semua akaun e-mel yang memerlukannya, bersama-sama dengan e-mel, kenalan, acara kalendar dan datanya yang lain."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Kemas kini keselamatan"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> memerlukan anda untuk mengemas kini tetapan keselamatan anda."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Akaun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" memerlukan kemas kini tetapan keselamatan."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Kemas kini keselamtn diperlukn"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Akaun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" tidak dapat disegerakkan kerana keperluan keselamatan."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Akaun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" memerlukan kemas kini tetapan keselamatan."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Akaun \"<xliff:g id="ACCOUNT">%s</xliff:g>\" telah mengubah tetapan keselamatannya, tidak tindakan pengguna diperlukan."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Kemas kini keselamatan diperlukan"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Dasar keselamatan telah berubah"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Dasar keselamatan tidak dapat dipenuhi"</string>
<string name="account_security_title" msgid="3511543138560418587">"Keselamatan peranti"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Pelayan <xliff:g id="SERVER">%s</xliff:g> menghendaki anda membenarkannya mengawal beberapa ciri keselamatan peranti Android anda secara jauh."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Edit butiran"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"PIN kunci skrin atau kata laluan anda telah tamat tempoh."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"K/lln knci skrn tlh tmt tmph"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Kata laluan kunci skrin akn tmt tempoh"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Anda harus menukar PIN kunci skrin atau kata laluan anda secepat mungkin atau data untuk <xliff:g id="ACCOUNT">%s</xliff:g> akan dipadamkan. Tukar sekarang?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Anda perlu menukar PIN atau kata laluan kunci skrin anda, atau data untuk <xliff:g id="ACCOUNT">%s</xliff:g> akan dipadamkan. Adakah anda mahu menukarnya sekarang?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Kata laluan kunci skrin telah tmt tempoh"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Data untuk <xliff:g id="ACCOUNT">%s</xliff:g> sedang dipadamkan dari peranti anda. Anda boleh memulihkannya dengan menukar PIN kunci skrin atau kata laluan anda. Tukar sekarang?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Data untuk <xliff:g id="ACCOUNT">%s</xliff:g> sedang dipadamkan dari peranti anda. Anda boleh memulihkannya dengan menukar PIN atau kata laluan kunci skrin anda. Adakah anda ingin menukarnya sekarang?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Buang perubahan yang belum disimpan?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Tidak dapat melog masuk"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Nama pengguna atau kata laluan untuk <xliff:g id="ACCOUNT">%s</xliff:g> tidak betul. Kemas kininya sekarang?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Nama pengguna atau kata laluan untuk <xliff:g id="ACCOUNT">%s</xliff:g> adalah tidak betul. Adakah anda mahu mengemaskininya sekarang?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Akaun lalai"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Hantar e-mel daripada akaun ini secara lalainya"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Muat turun lampiran"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Auto muat turun lampiran ke mesej terbaharu melalui Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Pemberitahuan e-mel"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Kekerapan penyegerakan, pemberitahuan, dsb."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Beritahu dalam bar Sistem apabila e-mel diterima"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Hantar pemberitahuan apabila e-mel tiba"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Kekerapan semak peti masuk"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Tetapan masuk"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nama pengguna, kata laluan dan tetapan pelayan masuk yang lain"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Tetapan keluar"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nama pengguna, kata laluan dan tetapan pelayan keluar yang lain"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Dasar yang dikuatkuasakan"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Tiada"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Dasar tidak disokong"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Tiada"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Cuba segerak"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Sentuh di sini untuk menyegerakkan akaun ini"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Nama akaun"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Nama anda"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Tandatangan"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Respons pantas"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Edit teks yang anda kerap sisipkan semasa mengarang e-mel"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edit teks yang anda kerap sisipkan semasa mengarang e-mel"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Lampirkan teks pada mesej yang anda hantarkan"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Tetapan pemberitahuan"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Penggunaan data"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Dasar keselamatan"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Edit respons pantas"</string>
<string name="save_action" msgid="1988862706623227093">"Simpan"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Segerakkan kenalan"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Segerakkan kenalan untuk akaun ini"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Segerak Kalendar"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Segerakkan kalendar untuk akaun ini"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Segerakkan kalendar"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Segerakkan acara kalendar untuk akaun ini"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Segerakkan e-mel"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Segerakkan e-mel untuk akaun ini"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Getar"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> hasil dari <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Tetapan"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Umum"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Tetapan umum"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Aplikasi"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Auto mara"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Pilih skrin mana mahu ditunjukkan selepas anda memadamkan mesej"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Sembunyikan kotak semak"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Dalam senarai mesej, sentuh dan tahan untuk memilih"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Sahkan sebelum memadam"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mesej"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Sahkan sebelum menghantar"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mesej"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Mara ke"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mesej lebih baru"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mesej lebih lama"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Menunggu hasil"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Sesetengah pelayan mungkin mengambil masa yang lama."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Folder"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Jgn benarkan penggunaan kamera peranti"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Perlukan kata laluan peranti"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Hadkan penggunaan semula kata laluan terbaru"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Memerlukan kata laluan untuk tamat"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Perlukan peranti yang melahu mengunci skrinnya"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Hadkan bilangan peristiwa kalendar yang disegerakkan"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Hadkan bilangan e-mel yang disegerakkan"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Terima kasih!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Saya setuju saja!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Saya akan baca ini nanti dan hubungi anda semula."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Mari adakan mesyuarat untuk membincangkannya."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Segerakkan latar belakang untuk akaun ini dilumpuhkan semasa perayauan."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Menghantar jawapan..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Tiada mesej."</string>
</resources>
diff --git a/res/values-ms/uploader.xml b/res/values-ms/uploader.xml
index 1b760de4b..3d1ce5ddf 100644
--- a/res/values-ms/uploader.xml
+++ b/res/values-ms/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Sembunyikan Butiran"</string>
<string name="menu_settings" msgid="5088116127086866634">"Tetapan"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Dimuat naik %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Akaun"</string>
<string name="upload" msgid="2615541458361216022">"Muat naik"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 4a3aa5188..8cc57b263 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Les e-postvedlegg"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Gir appen tilgang til å lese e-postvedleggene dine."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Lar appen lese e-postvedleggene dine."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Få tilgang til data om e-postleverandør"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Gir appen tilgang til e-postdatabasen, inklusivt mottatte og sendte meldinger samt brukernavn og passord."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Gir appen tilgang til e-postdatabasen, herunder mottatte meldinger, sendte meldinger, brukernavn og passord."</string>
<string name="app_name" msgid="5815426892327290362">"E-post"</string>
<string name="compose_title" msgid="427986915662706899">"Skriv e-post"</string>
<string name="debug_title" msgid="5175710493691536719">"Debug"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Ferdig"</string>
<string name="create_action" msgid="3062715563215392251">"Opprett ny"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Slett"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Ingen raske svar"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Ingen hurtigsvar."</string>
<string name="discard_action" msgid="6532206074859505968">"Forkast"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Lagre utkast"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Sett inn hurtigsvar"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Søk"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Kontoinnstillinger"</string>
<string name="settings_action" msgid="6334807007967459412">"Innstillinger"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Synkroniseringsalternativer"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Synkroniseringsalternativer"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Merk som ulest"</string>
<string name="move_action" msgid="3059189775933985898">"Flytt"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ kopi/blindkopi"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Inkluder sitert tekst"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Inkluder tekst"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Du må legge til minst én mottager."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Legg til minst én mottaker."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Noen e-postadresser er ugyldige."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Filen er for stor til å bli lagt ved."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Sett inn hurtigsvar"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Lagret"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stopp"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Vedlegget lagret som <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Kan ikke lagre vedlegget."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Merk: Ett eller flere vedlegg i den videresendte meldingen lastes ned før sending."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Vedlegget kunne ikke lagres."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Ett eller flere vedlegg i den videresendte e-posten blir lastet ned før du sender."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Melding"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Inviter"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Kunne ikke videresende ett eller flere vedlegg."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Vedlegget ble ikke videresendt"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Pålogging til <xliff:g id="ACCOUNT_NAME">%s</xliff:g> mislyktes."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Pålogging til <xliff:g id="ACCOUNT_NAME">%s</xliff:g> mislyktes."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Kunne ikke logge på"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Eldre"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Konfigurering av konto"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Legg til en Exchange-konto"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Legg til en Exchange ActiveSync-konto"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"E-postkonto"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Du kan konfigurere e-post for de fleste kontoer i bare noen få trinn."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Du kan konfigurere en Exchange-konto i løpet av bare noen få trinn."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Du kan konfigurere en Exchange ActiveSync-konto i løpet av bare noen få trinn."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Du kan konfigurere kontoen din i noen få trinn."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-postadresse"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Passord"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Bruk denne kontoen som standard for utgående e-post."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Send e-post fra denne kontoen som standard"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuelt oppsett"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Angi gyldig e-postadresse og passord."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplisert konto"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Sjekker tjenerinnstillinger for inngående e-post…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Sjekker tjenerinnstillinger for utgående e-post…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Konfigurering av konto"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Kontoen din er konfigurert, og e-post er på vei!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Kontoen din er konfigurert, og e-post er på vei."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Gi denne kontoen et navn (valgfritt)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Navnet ditt (vises i utgående meldinger)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Dette feltet må fylles ut."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Tjenerinnstillinger for innkommende e-postmelding"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Brukernavn"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Passord"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3-tjener"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP-tjener"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Tjener"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Sikkerhetstype"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ingen"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-tjener"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Sikkerhetstype"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Krev pålogging."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Krev pålogging"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Brukernavn"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Passord"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Konfigurering av konto"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Hvert 15. minutt"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Hvert 30. minutt"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Hver time"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Bruk denne kontoen som standard for utgående e-post."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Varsle når det kommer e-post."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Synkroniser kontakter fra denne kontoen."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Synkroniser kalendere fra denne kontoen."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Synkroniser e-postmeldinger fra denne kontoen."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Send e-post fra denne kontoen som standard"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Gi meg beskjed når jeg mottar e-postmeldinger"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synkroniser kontakter fra denne kontoen"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synkroniser kalender fra denne kontoen"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synkroniser e-postmeldinger fra denne kontoen"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Last ned vedlegg automatisk når tilkoblet til trådløst nettverk"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Kunne ikke fullføre"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Antall dager å synkronisere"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Én måned"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Alle"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Bruk kontostandard"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Feil brukernavn eller passord."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Feil brukernavn eller passord."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Brukernavnet eller passordet er feil."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Brukernavnet eller passordet er feil."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Kan ikke koble til tjeneren på en sikker måte."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Kan ikke koble til tjeneren på en sikker måte."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Klientsertifikat er nødvendig. Vil du koble til tjener med klientsertifikat?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Sertifikatet er ugyldig eller utilgjengelig."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Tjeneren svarte med en feil. Kontroller brukernavn og passord og prøv på nytt."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Et klientsertifikat er påkrevd. Vil du koble til tjeneren med et klientsertifikat?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sertifikatet er ugyldig eller utilgjengelig."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Tjeneren svarte med en feil. Kontroller brukernavn og passord, og prøv på nytt."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Kan ikke koble til tjeneren."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Kan ikke koble til tjeneren."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS påkrevd, men tjeneren støtter det ikke."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"ADVARSEL: Hvis du deaktiverer e-postappens rett til å administrere enheten, slettes alle e-postkontoene som krever appen sammen med e-poster, kontakter, kalenderaktiviteter og andre data."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Sikkerhetsoppdatering"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> krever at du oppdaterer sikkerhetsinnstillingene."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Kontoen «<xliff:g id="ACCOUNT">%s</xliff:g>» krever oppdatering av sikkerhetsinnstillingene."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Sikkerhetsoppdatering påkrevd"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Kontoen <xliff:g id="ACCOUNT">%s</xliff:g> kan ikke synkroniseres på grunn av sikkerhetskrav."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Kontoen «<xliff:g id="ACCOUNT">%s</xliff:g>» krever oppdatering av sikkerhetsinnstillingene."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Kontoen «<xliff:g id="ACCOUNT">%s</xliff:g>» har endret sikkerhetsinnstillinger. Du trenger ikke å foreta deg noe."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Sikkerhetsoppdatering påkrevd"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Sikkerh.retn.linjer er endret"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Sikkerhetsretningslinjene kan ikke følges"</string>
<string name="account_security_title" msgid="3511543138560418587">"Enhetssikkerhet"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Tjeneren <xliff:g id="SERVER">%s</xliff:g> krever at den kan kontrollere noen av sikkerhetsfunksjonene på Android-enheten utenfra."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Rediger detaljer"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Personlig kode eller passord for skjermlås er utløpt."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Passord for skjermlås utløpt"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Passord for skjermlås utløper"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Du må endre personlig kode eller passord for skjermlås snart, ellers slettes dataene for <xliff:g id="ACCOUNT">%s</xliff:g>. Vil du endre det nå?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Du må endre PIN-koden eller passordet for skjermlåsen snart, hvis ikke blir dataene for <xliff:g id="ACCOUNT">%s</xliff:g> slettet. Vil du endre dette nå?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Passord for skjermlås utløpt"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Dataene for <xliff:g id="ACCOUNT">%s</xliff:g> slettes fra enheten. Du kan gjenopprette dataene ved å endre personlig kode eller passord for skjermlåsing. Vil du endre dette nå?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Dataene for <xliff:g id="ACCOUNT">%s</xliff:g> slettes fra enheten. Du kan gjenopprette dem ved å endre PIN-kode eller passord til skjermlåsen. Vil du endre det nå?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Vil du forkaste endringer som ikke er lagret?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Kunne ikke logge på"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Brukernavn eller passord for <xliff:g id="ACCOUNT">%s</xliff:g> er feil. Vil du oppdatere nå?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Brukernavnet eller passordet til <xliff:g id="ACCOUNT">%s</xliff:g> er feil. Vil du oppdatere dette nå?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Standardkonto"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Bruk denne kontoen som standard for utgående e-post."</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Nedlasting av vedlegg"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Last ned vedlegg fra nye e-poster automatisk via Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Varsling om e-post"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Synkroniseringsfrekvens, varslinger m.m."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Gi beskjed i systemfeltet når nye e-postmeldinger kommer"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Gi meg beskjed når jeg mottar e-post"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frekvens for kontroll av innboks"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Inngående innstillinger"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Brukernavn, passord og andre innstillinger for innkommende tjener"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Utgående innstillinger"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Brukernavn, passord og andre innstillinger for utgående tjener"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Retningslinjer som håndheves"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ingen"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Retningslinjer som ikke støttes"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ingen"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Forsøk synkronisering"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Trykk her for å synkronisere denne kontoen"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Kontonavn"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Ditt navn"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Underskrift"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Hurtigsvar"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Rediger tekst som du ofte setter inn når du skriver e-poster"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Rediger tekst som du ofte skriver inn når du skriver e-post"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Legg til tekst i e-postmeldinger"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Innstillinger for varsling"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Databruk"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Sikkerhetsretningslinjer"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Rediger hurtigsvar"</string>
<string name="save_action" msgid="1988862706623227093">"Lagre"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synkroniser kontakter"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synkroniser kontakter fra denne kontoen"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Synkroniser kalender"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Synkroniser kalender fra denne kontoen"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synkroniser kalender"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synkroniser kalenderarrangement for denne kontoen"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synkroniser e-post"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synkroniser e-postmeldinger fra denne kontoen"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrering"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultater fra <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Innstillinger"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Generelt"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Generelle innstillinger"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"App"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Autoflytting"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Velg hvilken skjerm som skal vises når du sletter en melding"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Skjul avmerkingsruter"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Trykk og hold nede for å merke i e-postlister"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Bekreft før sletting"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"E-poster"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Bekreft før sending"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"E-poster"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Gå til"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Nyere melding"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Eldre melding"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Venter på resultater"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Noen tjenere kan ta lang tid."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mapper"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Ikke tillat bruk av enhetens kamera"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Krev enhetspassord"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Begrens gjenbruk av nylige passord"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Krev at passord utløper"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Krev at skjerm låses på inaktive enheter"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Begrens antallet synkroniserte kalenderhendelser"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Begrens antallet synkroniserte e-poster"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Takk!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Det høres bra ut!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Jeg skal lese dette senere og ta kontakt."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Jeg foreslår at vi avtaler et møte for å diskutere dette."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Bakgrunnssynkronisering for denne kontoen er deaktivert under streifing."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Sender svar ..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Ingen e-poster."</string>
</resources>
diff --git a/res/values-nb/uploader.xml b/res/values-nb/uploader.xml
index 0846aff57..0f154f6b9 100644
--- a/res/values-nb/uploader.xml
+++ b/res/values-nb/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Skjul detaljer"</string>
<string name="menu_settings" msgid="5088116127086866634">"Innstillinger"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Lastet opp %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Konto"</string>
<string name="upload" msgid="2615541458361216022">"Last opp"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index a8a48d465..8f25497fc 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"E-mailbijlagen lezen"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Staat deze app toe uw e-mailbijlagen te lezen."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Hiermee kan de app uw e-mailbijlagen lezen."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Gegevens e-mailprovider openen"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Hiermee geeft u deze app toegang tot uw e-maildatabase, inclusief ontvangen berichten, verzonden berichten, gebruikersnamen en wachtwoorden."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Hiermee geeft u deze app toegang tot uw e-maildatabase, inclusief ontvangen berichten, verzonden berichten, gebruikersnamen en wachtwoorden."</string>
<string name="app_name" msgid="5815426892327290362">"E-mail"</string>
<string name="compose_title" msgid="427986915662706899">"Opstellen"</string>
<string name="debug_title" msgid="5175710493691536719">"Foutopsporing"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Gereed"</string>
<string name="create_action" msgid="3062715563215392251">"Nieuwe maken"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Verwijderen"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Geen snelle reacties"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Geen snelle reacties."</string>
<string name="discard_action" msgid="6532206074859505968">"Weggooien"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Concept opslaan"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Snelle reactie invoegen"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Zoeken"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Accountinstellingen"</string>
<string name="settings_action" msgid="6334807007967459412">"Instellingen"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Synchronisatieopties"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Synchronisatieopties"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Markeren als ongelezen"</string>
<string name="move_action" msgid="3059189775933985898">"Verpl."</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>schreef:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Tekst uit oorspronkelijk bericht weergeven"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Tekst opnemen"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"U moet minstens één ontvanger toevoegen."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Voeg ten minste één ontvanger toe."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Sommige e-mailadressen zijn ongeldig."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Bestand is te groot om bij te voegen."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Snelle reactie invoegen"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Opgeslagen"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stoppen"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Bijlage opgeslagen als <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Kan de bijlage niet opslaan."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Opmerking: een of meer bijlagen in uw doorgestuurde bericht worden gedownload voordat het bericht wordt verzonden."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Kan bijlage niet opslaan."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Een of meer bijlagen in uw doorgestuurde bericht worden gedownload voordat het bericht wordt verzonden."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Bericht"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Uitnodigen"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Kan een of meer bijlagen niet doorsturen."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Bijlage niet doorgestuurd"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g>: aanmelden mislukt."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g>: aanmelden mislukt."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Kan niet aanmelden"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Ouder"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Accountinstellingen"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Een Exchange-account toevoegen"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Een Exchange ActiveSync-account toevoegen"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"E-mailaccount"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"U kunt e-mail voor de meeste accounts in slechts enkele stappen instellen."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"U kunt een Exchange-account in slechts enkele stappen instellen."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"U kunt een Exchange ActiveSync-account in slechts enkele stappen instellen."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"U kunt uw account in slechts enkele stappen instellen."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-mailadres"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Wachtwoord"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"E-mail standaard vanaf dit account verzenden"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"E-mail standaard vanaf dit account verzenden"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Handmatig instellen"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Typ een geldig e-mailadres en wachtwoord."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dubbel account"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Serverinstellingen inkomende e-mail controleren..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Serverinstellingen uitgaande e-mail controleren..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Accountinstellingen"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Uw account is ingesteld en er is e-mail onderweg."</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Uw account is ingesteld en er is e-mail onderweg."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Geef dit account een naam (optioneel)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Uw naam (wordt weergegeven in uitgaande berichten)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Dit veld mag niet leeg zijn."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Instellingen voor de inkomende server"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Gebruikersnaam"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Wachtwoord"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3-server"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP-server"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Poort"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Beveiligingstype"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Geen"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-server"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Poort"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Beveiligingstype"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Aanmelden vereist"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Aanmelding vereisen"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Gebruikersnaam"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Wachtwoord"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Accountinstellingen"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Elke 15 minuten"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Elke 30 minuten"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Elk uur"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"E-mail standaard vanaf dit account verzenden"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Stuur me een melding wanneer er e-mail binnenkomt."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Contacten van dit account synchroniseren."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Agenda van dit account synchroniseren."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"E-mail voor dit account synchroniseren."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"E-mail standaard vanaf dit account verzenden"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Stuur me een melding wanneer er e-mail binnenkomt"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Contacten van dit account synchroniseren"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Agenda van dit account synchroniseren"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"E-mail van dit account synchroniseren"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Bijlagen automatisch downloaden indien verbonden met Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Is niet voltooid"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dagen om te synchroniseren"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Eén maand"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Alles"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Accountstandaard gebruiken"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Gebruikersnaam of wachtwoord is onjuist."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Gebruikersnaam of wachtwoord is onjuist."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Gebruikersnaam of wachtwoord is onjuist."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Gebruikersnaam of wachtwoord is onjuist. "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Kan geen veilige verbinding met de server tot stand brengen."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Kan geen veilige verbinding met de server tot stand brengen."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Clientcertificaat is vereist. Met clientcertificaat verbinding maken met de server?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Certificaat is ongeldig of niet toegankelijk."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"De server heeft een fout geretourneerd. Controleer uw gebruikersnaam en wachtwoord en probeer het opnieuw."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Er is een client-certificaat vereist. Wilt u verbinding maken met de server met een client-certificaat?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Het certificaat is ongeldig of niet toegankelijk."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"De server heeft een fout geretourneerd. Controleer uw gebruikersnaam en wachtwoord en probeer het opnieuw."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Kan geen verbinding maken met de server."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Kan geen verbinding maken met de server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS is vereist maar wordt niet ondersteund door de server."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"WAARSCHUWING: als u de rechten van de app E-mail voor het beheren van uw apparaat uitschakelt, worden alle e-mailaccounts verwijderd waarvoor deze rechten vereist zijn, samen met de bijbehorende e-mails, contacten, agenda-afspraken en andere gegevens."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Beveiligingsupdate"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Voor <xliff:g id="ACCOUNT">%s</xliff:g> moet u uw beveiligingsinstellingen bijwerken."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Account \'<xliff:g id="ACCOUNT">%s</xliff:g>\' vereist een update van de beveiligingsinstellingen."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Beveiligingsupdate vereist"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Account \'<xliff:g id="ACCOUNT">%s</xliff:g>\' kan niet worden gesynchroniseerd wegens beveiligingsvereisten."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Account \'<xliff:g id="ACCOUNT">%s</xliff:g>\' vereist een update van de beveiligingsinstellingen."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"De beveiligingsinstellingen van het account \'<xliff:g id="ACCOUNT">%s</xliff:g>\' zijn gewijzigd, er is geen gebruikersactie vereist."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Beveiligingsupdate vereist"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Beveiligingsbeleid gewijzigd"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Beveil.-beleid niet voldaan"</string>
<string name="account_security_title" msgid="3511543138560418587">"Apparaatbeveiliging"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"De server <xliff:g id="SERVER">%s</xliff:g> vereist dat u de server toestemming geeft bepaalde beveiligingsfuncties van uw Android-apparaat extern te bedienen."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Details bewerken"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Uw PIN-code of wachtwoord voor schermvergrendeling is verlopen."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Wachtw. schermvergr. verlopen"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Wachtw. schermvergr. bijna verlopen"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"U moet uw PIN-code of wachtwoord voor schermvergrendeling binnenkort wijzigen, anders worden de gegevens voor <xliff:g id="ACCOUNT">%s</xliff:g> gewist. Nu wijzigen?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"U moet uw pincode of wachtwoord voor schermvergrendeling snel wijzigen, of de gegevens voor <xliff:g id="ACCOUNT">%s</xliff:g> worden gewist. Wilt u dit nu wijzigen?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Wachtwoord schermvergrendeling verlopen"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"De gegevens voor <xliff:g id="ACCOUNT">%s</xliff:g> worden gewist op uw apparaat. U kunt het account herstellen door uw PIN-code of wachtwoord voor schermvergrendeling te wijzigen. Nu wijzigen?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"De gegevens voor <xliff:g id="ACCOUNT">%s</xliff:g> worden gewist op uw apparaat. U kunt het account herstellen door uw pincode of wachtwoord voor schermvergrendeling te wijzigen. Nu wijzigen?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Niet-opgeslagen wijzigingen annuleren?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Kan niet aanmelden"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"De gebruikersnaam of het wachtwoord voor <xliff:g id="ACCOUNT">%s</xliff:g> is onjuist. Nu bijwerken?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"De gebruikersnaam of het wachtwoord voor <xliff:g id="ACCOUNT">%s</xliff:g> is onjuist. Wilt u deze nu bijwerken?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Standaardaccount"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"E-mail standaard vanaf dit account verzenden"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Bijlagen downloaden"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Bijlagen van recente berichten automatisch downloaden via wifi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Meldingen via e-mail"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Synchronisatiefrequentie, meldingen, enzovoort"</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Melding in de systeembalk wanneer er e-mail binnenkomt"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Melding sturen wanneer e-mail binnenkomt"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Controlefrequentie inbox"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Instellingen inkomende e-mail"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Gebruikersnaam, wachtwoord en andere inst. voor inkomende server"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Instellingen uitgaande e-mail"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Gebruikersnaam, wachtwoord en andere inst. voor uitgaande server"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Afgedwongen beleid"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Geen"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Niet-ondersteund beleid"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Geen"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Poging tot synchroniseren"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Raak dit aan om dit account te synchroniseren"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Accountnaam"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Uw naam"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Handtekening"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Snelle reacties"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Tekst bewerken die u vaak invoegt wanneer u e-mails opstelt"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Tekst bewerken die u vaak invoegt wanneer u e-mails opstelt"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Tekst toevoegen aan berichten die u verzendt"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Instellingen voor meldingen"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Gegevensgebruik"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Beveiligingsbeleid"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Snelle reactie bewerken"</string>
<string name="save_action" msgid="1988862706623227093">"Opslaan"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Contacten synchroniseren"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Contacten voor dit account synchroniseren"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Agenda synchroniseren"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Agenda voor dit account synchroniseren"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Agenda synchroniseren"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Agenda-afspraak voor dit account synchroniseren"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"E-mail synch."</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"E-mail voor dit account synchroniseren"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Trillen"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultaten van <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Instellingen"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Algemeen"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Algemene instellingen"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"App"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatisch doorgaan"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Het scherm selecteren dat wordt getoond na het verw. van bericht"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Selectievakjes verbergen"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Blijven aanraken in lijsten met berichten om te selecteren"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Bevestigen vóór verwijderen"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Berichten"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Bevestigen vóór verzenden"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Berichten"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Doorgaan naar"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Nieuwer bericht"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Ouder bericht"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Wachten op resultaten"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Het duurt soms langer voordat servers reageren."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mappen"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Gebruik van apparaatcamera niet toestaan"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Apparaatwachtwoord vereisen"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Hergebruik recente wachtwoorden beperken"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Vereisen dat wachtwoord verloopt"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Inactief apparaat vergrendelt scherm"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Aantal gesynchroniseerde agenda-afspraken beperken"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Aantal gesynchroniseerde e-mails beperken"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Hartelijk dank!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Dat lijkt me prima."</string>
+ <string name="quick_3" msgid="8061819976353395585">"Ik zal dit later lezen en kom er dan op terug."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Laten we een afspraak maken om dit te bespreken."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Achtergrondsynchronisatie voor dit account is uitgeschakeld tijdens roaming."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Reactie verzenden..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Geen berichten."</string>
</resources>
diff --git a/res/values-nl/uploader.xml b/res/values-nl/uploader.xml
index f2d6c8242..451f05e96 100644
--- a/res/values-nl/uploader.xml
+++ b/res/values-nl/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Details verbergen"</string>
<string name="menu_settings" msgid="5088116127086866634">"Instellingen"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Geüpload op %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Account"</string>
<string name="upload" msgid="2615541458361216022">"Uploaden"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 79e5e9103..443ebcf71 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Odczyt załączników do e-maili"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Zezwala aplikacji na odczyt załączników do e-maili."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Pozwala aplikacji na odczyt załączników do e-maili."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Dostęp do danych dostawcy poczty e-mail"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Zezwala aplikacji na dostęp do bazy danych poczty e-mail, w tym odebranych i wysłanych wiadomości, nazw użytkowników oraz haseł."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Zezwala aplikacji na dostęp do bazy danych e-maili, w tym odebranych i wysłanych wiadomości, nazw użytkowników oraz haseł."</string>
<string name="app_name" msgid="5815426892327290362">"Poczta"</string>
<string name="compose_title" msgid="427986915662706899">"Utwórz"</string>
<string name="debug_title" msgid="5175710493691536719">"Debuguj"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Gotowe"</string>
<string name="create_action" msgid="3062715563215392251">"Utwórz nową"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Usuń"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Brak szybkich odpowiedzi"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Brak szybkich odpowiedzi"</string>
<string name="discard_action" msgid="6532206074859505968">"Odrzuć"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Zapisz wersję roboczą"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Wstaw szybką odpowiedź"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Szukaj"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Ustawienia konta"</string>
<string name="settings_action" msgid="6334807007967459412">"Ustawienia"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Opcje synchronizacji"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Opcje synchronizacji"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Oznacz jako nieprzeczytane"</string>
<string name="move_action" msgid="3059189775933985898">"Przenieś"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ DW/UDW"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> napisał(a):"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Dołącz cytowany tekst"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Dołącz tekst"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Musisz dodać co najmniej jednego adresata."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Dodaj co najmniej jednego adresata."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Niektóre adresy e-mail są nieprawidłowe."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Plik jest zbyt duży do załączenia."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Wstaw szybką odpowiedź"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Zapisany"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Zatrzymaj"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Załącznik zapisany jako <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Nie można zapisać załącznika."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Uwaga: co najmniej jeden załącznik w przekazywanej wiadomości zostanie pobrany przed wysłaniem."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Nie można zapisać załącznika."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Co najmniej jeden załącznik w przekazywanej wiadomości zostanie pobrany przed wysłaniem."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Wiadomość"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Zaproś"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Co najmniej jednego załącznika nie można przekazać dalej."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Nie przekazano załącznika"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Nie udało się zalogować na konto <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Nie udało się zalogować na konto <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Nie można się zalogować"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Starsze"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Konfiguracja konta"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Dodaj konto Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Dodaj konto Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Konto e-mail"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Możesz skonfigurować pocztę e-mail dla większości kont w zaledwie kilku krokach."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Możesz skonfigurować konto Exchange w zaledwie kilku krokach."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Możesz skonfigurować konto Exchange ActiveSync w zaledwie kilku krokach."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Swoje konto możesz skonfigurować w zaledwie kilku krokach."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Adres e-mail"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Hasło"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Domyślnie wysyłaj wiadomości e-mail z tego konta"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Domyślnie wysyłaj e-maile z tego konta."</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Konfig. ręczna"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Wpisz prawidłowy adres e-mail i hasło."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Zduplikowane konto"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Sprawdzanie ustawień serwera poczty przychodzącej…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Sprawdzanie ustawień serwera poczty wychodzącej…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Konfiguracja konta"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Konto zostało skonfigurowane, a wiadomości e-mail są w drodze!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Konto zostało skonfigurowane, a e-maile są w drodze."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Nazwa konta (opcjonalnie)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Twoja nazwa (wyświetlana w wiadomościach wychodzących)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"To pole nie może być puste."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Ustawienia serwera poczty przychodzącej"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nazwa użytkownika"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Hasło"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Serwer POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Serwer IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Serwer"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Typ zabezpieczeń"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Brak"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Serwer SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Typ zabezpieczeń"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Wymagaj zalogowania się."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Wymagaj logowania."</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nazwa użytkownika"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Hasło"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Konfiguracja konta"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Co 15 minut"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Co 30 minut"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Co godzinę"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Domyślnie wysyłaj wiadomości e-mail z tego konta"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Powiadom mnie o odebranej poczcie e-mail."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Synchronizuj kontakty na tym koncie"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Synchronizuj kalendarz na tym koncie"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Synchronizuj wiadomości e-mail z tego konta"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Domyślnie wysyłaj wiadomości e-mail z tego konta."</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Powiadom mnie o odebranych e-mailach."</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synchronizuj kontakty na tym koncie."</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synchronizuj kalendarz na tym koncie."</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synchronizuj e-maile z tego konta."</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Automatycznie pobieraj załączniki, gdy połączono z siecią Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nie można zakończyć"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dni do synchronizacji"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Jeden miesiąc"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Wszystkie"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Użyj wartości domyślnej konta"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Nieprawidłowa nazwa użytkownika lub hasło."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Nieprawidłowa nazwa użytkownika lub hasło."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nieprawidłowa nazwa użytkownika lub hasło"</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nieprawidłowa nazwa użytkownika lub hasło"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nie można bezpiecznie połączyć się z serwerem."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nie można bezpiecznie połączyć się z serwerem."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Wymagany jest certyfikat klienta. Połączyć z serwerem przy jego użyciu?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Certyfikat jest nieważny lub niedostępny."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Serwer zgłosił błąd. Sprawdź nazwę użytkownika i hasło, a następnie spróbuj ponownie."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Certyfikat klienta jest wymagany. Czy chcesz się połączyć z serwerem za pomocą certyfikatu klienta?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certyfikat jest nieważny lub niedostępny."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Serwer zgłosił błąd. Sprawdź nazwę użytkownika i hasło, a następnie spróbuj ponownie."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nie można połączyć się z serwerem."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Nie można połączyć się z serwerem."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"Wymagane połączenie TLS nie jest obsługiwane przez serwer."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"OSTRZEŻENIE: cofnięcie Poczcie uprawnień do administrowania urządzeniem spowoduje usunięcie wszystkich kont e-mail, które ich wymagają, wraz z wiadomościami, kontaktami, wydarzeniami w kalendarzu i innymi danymi."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Aktualizacja zabezpieczeń"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Konto <xliff:g id="ACCOUNT">%s</xliff:g> wymaga aktualizacji ustawień zabezpieczeń."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Konto „<xliff:g id="ACCOUNT">%s</xliff:g>” wymaga aktualizacji ustawień zabezpieczeń."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Wymagana aktualizacja zabezp."</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Nie można zsynchronizować konta „<xliff:g id="ACCOUNT">%s</xliff:g>” ze względu na wymogi bezpieczeństwa."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Konto „<xliff:g id="ACCOUNT">%s</xliff:g>” wymaga aktualizacji ustawień zabezpieczeń."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Ustawienia zabezpieczeń konta „<xliff:g id="ACCOUNT">%s</xliff:g>” uległy zmianie. Nie jest wymagane podejmowanie działań przez użytkownika."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Wymagana aktualizacja zabezp."</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Zasady bezpieczeństwa uległy zmianie"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Nie można spełnić zasad bezp."</string>
<string name="account_security_title" msgid="3511543138560418587">"Zabezpieczenia urządzenia"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Serwer <xliff:g id="SERVER">%s</xliff:g> wymaga udzielenia zezwolenia na zdalną kontrolę niektórych funkcji zabezpieczeń tego urządzenia z systemem Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Edytuj szczegóły"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Kod PIN lub hasło ekranu blokady wygasły."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Hasło ekranu blokady wygasło"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Hasło ekranu blokady wkrótce wygaśnie"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Należy wkrótce zmienić kod PIN lub hasło ekranu blokady, albo dane konta <xliff:g id="ACCOUNT">%s</xliff:g> zostaną wymazane. Zmienić teraz?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Musisz wkrótce zmienić PIN lub hasło ekranu blokady. W przeciwnym razie dane konta <xliff:g id="ACCOUNT">%s</xliff:g> zostaną usunięte. Zmienić je teraz?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Hasło ekranu blokady wygasło"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Trwa wymazywanie z urządzenia danych konta <xliff:g id="ACCOUNT">%s</xliff:g>. Można je przywrócić, zmieniając kod PIN lub hasło ekranu blokady. Zmienić je teraz?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Trwa wymazywanie z urządzenia danych konta <xliff:g id="ACCOUNT">%s</xliff:g>. Można je przywrócić, zmieniając PIN lub hasło ekranu blokady. Zmienić je teraz?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Odrzucić niezapisane zmiany?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Nie można się zalogować"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Nazwa użytkownika lub hasło dla konta <xliff:g id="ACCOUNT">%s</xliff:g> są niepoprawne. Zaktualizować je teraz?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Nazwa użytkownika lub hasło dla konta <xliff:g id="ACCOUNT">%s</xliff:g> są nieprawidłowe. Chcesz je poprawić?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Domyślne konto"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Domyślnie wysyłaj wiadomości e-mail z tego konta"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Pobieraj załączniki"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Automatycznie pobieraj załączniki najnowszych wiadomości przez Wi-Fi."</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Powiadomienia e-mail"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Częstotliwość synchronizacji, powiadomienia itd."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Powiadamiaj na pasku systemu o otrzymaniu wiadomości e-mail"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Wyślij powiadomienie, gdy przychodzi e-mail."</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Sprawdzaj pocztę"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Poczta przychodząca"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Użytkownik, hasło i inne ustawienia serwera poczty przychodzącej"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Poczta wychodząca"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Użytkownik, hasło i inne ustawienia serwera poczty wychodzącej"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Egzekwowane zasady"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Brak"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nieobsługiwane zasady"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Brak"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Próba synchronizacji"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Dotknij tutaj, aby zsynchronizować to konto."</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Nazwa konta"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Imię i nazwisko"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Podpis"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Szybkie odpowiedzi"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Edytuj tekst, który często wstawiasz do wiadomości e-mail."</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edytuj tekst, który często wstawiasz do e-maili."</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Dołącz tekst do wysyłanych wiadomości"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Ustawienia powiadomień"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Wykorzystanie transmisji danych"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Zasady bezpieczeństwa"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Edytuj szybką odpowiedź"</string>
<string name="save_action" msgid="1988862706623227093">"Zapisz"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synchronizuj kontakty"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synchronizuj kontakty dla tego konta"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Synchronizuj kalendarz"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Synchronizuj kalendarz dla tego konta"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synchronizuj kalendarz"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synch. kalendarz dla tego konta."</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synchronizuj e-maile"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synchronizuj wiadomości e-mail dla tego konta"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Wibracje"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"Liczba wyników: <xliff:g id="RESULTS">%1$d</xliff:g> z <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Ustawienia"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Ogólne"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Ustawienia ogólne"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Aplikacja"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatyczne przechodzenie"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Wybierz ekran, który ma być pokazywany po usunięciu wiadomości."</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ukryj pola wyboru"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Dotknij i przytrzymaj, by wybrać pozycję na liście wiadomości"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Potwierdź usuwanie"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Wiadomości"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Potwierdź wysyłanie"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Wiadomości"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Przejdź do"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Nowsza wiadomość"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Starsza wiadomość"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Oczekiwanie na wyniki"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Niektóre serwery mogą zwracać wyniki po dłuższym czasie."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Foldery"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Nie zezwalaj na używanie aparatu"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Wymagaj hasła do urządzenia"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Nie zezwalaj na używanie poprzednich haseł"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Wymagaj, by hasła miały datę ważności"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Wymagaj blokowania ekranu nieużywanych urz."</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Ogranicz liczbę synchronizowanych wydarzeń z kalendarza"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Ogranicz liczbę synchronizowanych e-maili"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Dziękuję."</string>
+ <string name="quick_2" msgid="4188036352885736617">"Brzmi dobrze."</string>
+ <string name="quick_3" msgid="8061819976353395585">"Przeczytam to później i skontaktuję się."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Spotkajmy się, aby to omówić."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Synchronizacja w tle z tym kontem jest podczas roamingu wyłączona."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Wysyłanie odpowiedzi..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Brak wiadomości."</string>
</resources>
diff --git a/res/values-pl/uploader.xml b/res/values-pl/uploader.xml
index c4096831c..5c7a8ee58 100644
--- a/res/values-pl/uploader.xml
+++ b/res/values-pl/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Ukryj szczegóły"</string>
<string name="menu_settings" msgid="5088116127086866634">"Ustawienia"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Przesłano: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Konto"</string>
<string name="upload" msgid="2615541458361216022">"Prześlij"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 5df6f33dc..fc14a01d1 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Ler anexos de e-mail"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Permite que esta aplicação leia os seus anexos de e-mail."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permite à aplicação ler os anexos de e-mail."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Aceder a dados do fornecedor de e-mail"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Permite que esta aplicação aceda à base de dados do e-mail, incluindo às mensagens recebidas, mensagens enviadas, nomes de utilizadores e palavras-passe."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permite que a aplicação aceda à base de dados do e-mail, incluindo às mensagens recebidas, mensagens enviadas, nomes de utilizadores e palavras-passe."</string>
<string name="app_name" msgid="5815426892327290362">"E-mail"</string>
<string name="compose_title" msgid="427986915662706899">"Redigir"</string>
<string name="debug_title" msgid="5175710493691536719">"Depuração"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Concluído"</string>
<string name="create_action" msgid="3062715563215392251">"Criar nova"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Eliminar"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Sem respostas rápidas"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Sem respostas rápidas."</string>
<string name="discard_action" msgid="6532206074859505968">"Rejeitar"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Guardar rascunho"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Inserir resposta rápida"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Pesquisar"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Definições da conta"</string>
<string name="settings_action" msgid="6334807007967459412">"Configurações"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Opções de sincronização"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Opções de sincronização"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Marcar como não lida"</string>
<string name="move_action" msgid="3059189775933985898">"Mover"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> escreveu:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Incluir texto citado"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Incluir texto"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Tem de adicionar pelo menos um destinatário."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Adicione, pelo menos, um destinatário."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Alguns endereços de e-mail são inválidos."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Ficheiro demasiado grande para anexar."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Inserir resposta rápida"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Guardado"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Parar"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Anexo guardado como <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Impossível guardar anexo."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Nota: um ou mais anexos da mensagem que encaminhou serão transferidos antes do envio."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Não foi possível guardar o anexo."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Um ou mais anexos da mensagem que encaminhou serão transferidos antes do envio."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Mensagem"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Convidar"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Não foi possível encaminhar um ou mais anexos."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"O anexo não foi encaminhado"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Falha no início de sessão de <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Início de sessão de <xliff:g id="ACCOUNT_NAME">%s</xliff:g> sem êxito."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Impossível iniciar sessão"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Mais antigas"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Configuração da conta"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Adicionar uma conta do Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Adicionar uma conta do Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Conta de e-mail"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Pode configurar o e-mail para a maioria das contas em apenas alguns passos."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"É possível configurar uma conta do Exchange em apenas alguns passos."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Pode configurar uma conta Exchange ActiveSync em apenas alguns passos."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"É possível configurar a sua conta em apenas alguns passos."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Endereço de e-mail"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Palavra-passe"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Enviar e-mail a partir desta conta por predefinição."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Enviar e-mail a partir desta conta por predefinição"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configuração manual"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Introduza um endereço de e-mail e palavra-passe válidos."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Conta duplicada"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"A verificar definições do servidor de recepção..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"A verificar definições do servidor de envio..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Configuração da conta"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"A sua conta está configurada e o e-mail vai a caminho!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"A sua conta está configurada e o e-mail vai a caminho!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Dar um nome a esta conta (opcional)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"O seu nome (apresentado nas mensagens enviadas)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Este campo não pode estar em branco."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Definições do servidor de recepção"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nome de utilizador"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Palavra-passe"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Servidor POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Servidor IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Servidor"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Porta"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipo de segurança"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nenhuma"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Servidor SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Porta"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipo de segurança"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Solicitar início de sessão."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Requerer início de sessão"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nome de utilizador"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Palavra-passe"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Configuração da conta"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"De 15 em 15 minutos"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"De 30 em 30 minutos"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"De hora em hora"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Enviar e-mail a partir desta conta por predefinição."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Notificar-me quando chega e-mail."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sincronizar contactos a partir desta conta."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sincronizar o calendário a partir desta conta."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sincronizar e-mail a partir desta conta."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Enviar e-mail a partir desta conta por predefinição"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Receber notificação de e-mails novos"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sincronizar contactos a partir desta conta."</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sincronizar o calendário a partir desta conta."</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sincronizar e-mail a partir desta conta."</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Transferir automaticamente anexos quando ligado a uma rede Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Não foi possível concluir"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dias para sincronização"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Um mês"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Todas"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Utilizar predef. da conta"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Nome de utilizador ou palavra passe incorrectos."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Nome de utilizador ou palavra-passe incorretos."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"O nome de utilizador ou a palavra-passe estão incorretos."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"O nome de utilizador ou a palavra-passe estão incorretos."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Não é possível ligar ao servidor em segurança."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Não é possível ligar ao servidor em segurança."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Certificado de cliente necessário. Ligar ao servidor com o certificado de cliente?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Certificado inválido ou inacessível."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"O servidor respondeu com um erro. Verifique o nome de utilizador e a palavra-passe e tente novamente."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"É necessário um certificado de cliente. Pretende ligar ao servidor com um certificado de cliente?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"O certificado é inválido ou inacessível."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"O servidor respondeu com um erro. Verifique o nome de utilizador e a palavra-passe e tente novamente."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Não é possível ligar ao servidor."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Não é possível ligar ao servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS necessário mas não suportado pelo servidor."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"AVISO: a desativação da autorização da aplicação E-mail para administrar o aparelho eliminará todas as contas de e-mail que necessitam desta, juntamente com o respetivo e-mail, contactos, eventos de agenda e outros dados."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Atualização de segurança"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> requer a atualização das definições de segurança."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"A conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" requer a actualização das definições de segurança."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"É necessária uma atualização da segurança"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Não é possível sincronizar a conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" devido a requisitos de segurança."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"A conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" requer a atualização das definições de segurança."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"A conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" alterou as definições de segurança; não é necessária qualquer ação do utilizador."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Necessária atualiz. segurança"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Políticas segurança alteradas"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Impossível cumprir polít. seg."</string>
<string name="account_security_title" msgid="3511543138560418587">"Segurança do dispositivo"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"O servidor <xliff:g id="SERVER">%s</xliff:g> requer permissão para controlar remotamente algumas das funcionalidades de segurança do aparelho Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Editar detalhes"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"O seu PIN ou palavra-passe de bloqueio do ecrã expirou."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"A palavra-passe de bloq. do ecrã expirou"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Palavra-passe de bloq. do ecrã a expirar"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Tem de alterar em breve o PIN ou palavra-passe de bloqueio do ecrã ou os dados para <xliff:g id="ACCOUNT">%s</xliff:g> serão apagados. Quer alterar agora?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Tem de alterar o PIN ou a palavra-passe de bloqueio do ecrã ou os dados de <xliff:g id="ACCOUNT">%s</xliff:g> serão apagados. Pretende alterar agora?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"A palavra-passe de bloq. do ecrã expirou"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Os dados para <xliff:g id="ACCOUNT">%s</xliff:g> estão a ser apagados do seu aparelho. Pode restaurá-los alterando o PIN ou palavra-passe de bloqueio do ecrã. Alterar agora?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Os dados de <xliff:g id="ACCOUNT">%s</xliff:g> estão a ser apagados do aparelho. Pode restaurá-los alterando o PIN ou a palavra-passe de bloqueio do ecrã. Pretende alterar agora?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Rejeitar alterações não guardadas?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Não foi possível iniciar sessão."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"O nome de utilizador ou palavra-passe para <xliff:g id="ACCOUNT">%s</xliff:g> estão incorretos. Quer atualizá-los agora?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"O nome de utilizador ou a palavra-passe para <xliff:g id="ACCOUNT">%s</xliff:g> estão incorretos. Pretende atualizá-los agora?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Conta predefinida"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Enviar e-mail a partir desta conta por predefinição"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Transferir anexos"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Transferir automaticamente anexos de mensagens recentes p/ Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Notificações de e-mail"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Frequência da sincronização, notificações, etc."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Notificar na barra de sistema quando chegar e-mail"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Enviar notificação quando chegar um e-mail"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frequência de verificação de caixa de entrada"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Definições de recepção"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nome de utiliz., palavra-passe e outras def. do serv. de receção"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Definições de envio"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nome de utiliz., palavra-passe e outras def. do serv. de envio"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Políticas aplicadas"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Nenhum"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Políticas não suportadas"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Nenhum"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Tentar sincronizar"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Toque aqui para sincronizar esta conta"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Nome da conta"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"O seu nome"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Assinatura"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Respostas rápidas"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Editar o texto que insere frequentemente ao compor e-mails"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Editar o texto que insere frequentemente ao compor e-mails"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Acrescente texto às mensagens que enviar"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Definições de notificação"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Utilização de dados"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Políticas de segurança"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Editar resposta rápida"</string>
<string name="save_action" msgid="1988862706623227093">"Guardar"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronizar contactos"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincronizar contactos para esta conta"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sincronizar agenda"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sincronizar a agenda para esta conta"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronizar calendário"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sinc. evento do cal. p. esta conta"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincronizar e-mail"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincronizar e-mail para esta conta"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrar"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultados de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Configurações"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Geral"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Definições gerais"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Aplicação"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avanço automático"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Selecionar o ecrã a apresentar após eliminar uma mensagem"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ocultar caixas de verificação"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Em listas de mensagens, toque sem largar para selecionar"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirmar antes de eliminar"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mensagens"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirmar antes de enviar"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mensagens"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Avançar para"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mensagem mais recente"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mensagem mais antiga"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"A aguardar resultados"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Alguns servidores podem demorar algum tempo."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Pastas"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Não perm. utilização câmara do aparelho"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Solicitar palavra-passe do aparelho"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Limitar reutilização pal.-passe recentes"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Solicitar validade das palavras-passe"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Necessário apar. inat. para bloq. ecrã"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Limitar n.º de eventos de calendário sincronizados"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Limitar n.º de e-mails sincronizados"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Obrigado!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Parece-me bem!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Vou ler isto mais tarde e voltarei a contactá-lo."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Vamos marcar uma reunião para discutir isso."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"A sincronização em segundo plano desta conta está desativada quando está em roaming."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"A enviar a resposta..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Não tem mensagens."</string>
</resources>
diff --git a/res/values-pt-rPT/uploader.xml b/res/values-pt-rPT/uploader.xml
index fe226aa27..84218149c 100644
--- a/res/values-pt-rPT/uploader.xml
+++ b/res/values-pt-rPT/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Ocultar Detalhes"</string>
<string name="menu_settings" msgid="5088116127086866634">"Configurações"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Carregados: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Conta"</string>
<string name="upload" msgid="2615541458361216022">"fazer upload"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index faa774c5c..e53c76a1a 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Ler os anexos do e-mail"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Permite que este aplicativo leia os anexos do seu e-mail."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permite que o aplicativo leia seus anexos de e-mail."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Acessar dados do provedor de e-mail"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Permite que este aplicativo acesse o banco de dados do e-mail, incluindo mensagens recebidas e enviadas, nomes de usuário e senhas."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permite que o aplicativo acesse o banco de dados de seu e-mail, incluindo mensagens recebidas e enviadas, nomes de usuário e senhas."</string>
<string name="app_name" msgid="5815426892327290362">"E-mail"</string>
<string name="compose_title" msgid="427986915662706899">"Escrever"</string>
<string name="debug_title" msgid="5175710493691536719">"Depurar"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Concluído"</string>
<string name="create_action" msgid="3062715563215392251">"Criar nova"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Excluir"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Sem respostas rápidas"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nenhuma resposta rápida."</string>
<string name="discard_action" msgid="6532206074859505968">"Descartar"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Salvar rascunho"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Inserir resposta rápida"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Pesquisa"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Configurações da conta"</string>
<string name="settings_action" msgid="6334807007967459412">"Configurações"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Opções de sincronização"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Opções de sincronização"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Marcar como não lida"</string>
<string name="move_action" msgid="3059189775933985898">"Mover"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Cco"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> escreveu:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Incluir texto das mensagens anteriores"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Incluir texto"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Você deve adicionar pelo menos um destinatário."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Adicione pelo menos um destinatário."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Alguns endereços de e-mail são inválidos."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Arquivo muito grande para ser anexado."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Inserir resposta rápida"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Salvo"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Parar"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Anexo salvo como <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Não é possível salvar o anexo."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Obs.: um ou mais anexos de sua mensagem encaminhada serão carregados antes do envio."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Não foi possível salvar anexo."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Um ou mais anexos de sua mensagem encaminhada serão transferidos antes do envio."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Mensagem"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Convidar"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Não foi possível encaminhar todos os anexos."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Anexo não encaminhado"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Falha no login de <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Falha no login de <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Não foi possível fazer login"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> b"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Mais antigos"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Configuração da conta"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Adicionar uma conta do Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Adicionar uma conta do Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Conta de e-mail"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"É possível configurar o e-mail para a maioria das contas em apenas algumas etapas."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"É possível configurar uma conta do Exchange em apenas algumas etapas."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"É possível configurar uma conta do Exchange ActiveSync em apenas algumas etapas."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"É possível configurar uma conta em apenas algumas etapas."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Endereço de e-mail"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Senha"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Enviar e-mail desta conta por padrão."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Enviar e-mail desta conta por padrão"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configuração manual"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Digite um endereço de e-mail e senha válidos."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Conta duplicada"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Verificando as configurações de entrada do servidor..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Verificando as configurações de saída do servidor..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Configuração da conta"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Sua conta está configurada e o e-mail está a caminho!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Sua conta está configurada e o e-mail está a caminho!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Dar nome a esta conta (opcional)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Seu nome (exibido nas mensagens enviadas)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Este campo não pode ficar em branco."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Configurações de entrada do servidor"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nome de usuário"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Senha"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Servidor POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Servidor IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Servidor"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Porta"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipo de segurança"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nenhum"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Servidor SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Porta"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipo de segurança"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Requer login."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Exigir login"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nome de usuário"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Senha"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Configuração da conta"</string>
@@ -305,12 +300,12 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"A cada 15 minutos"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"A cada 30 minutos"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"De hora em hora"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Enviar e-mail desta conta por padrão."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Receber notificação quando chegar um e-mail"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sincronizar contatos desta conta."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sincronizar agenda desta conta."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sincronizar e-mail desta conta."</string>
- <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Fazer download de anexos automaticamente ao conectar ao Wi-Fi"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Enviar e-mail desta conta por padrão"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Receber notificação quando um e-mail chegar"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sincronizar contatos desta conta"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sincronizar agenda desta conta"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sincronizar e-mail desta conta."</string>
+ <string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Fazer o download de anexos automaticamente ao conectar ao Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Não foi possível concluir"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dias para sincronizar"</string>
<string name="account_setup_options_mail_window_auto" msgid="4188895354366183790">"Automático"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Um mês"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Todos"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Usar padrão da conta"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Nome de usuário ou senha incorretos."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Nome de usuário ou senha incorretos. "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Nome de usuário ou senha incorretos."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Nome de usuário ou senha estão incorretos."\n" (<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Não é possível se conectar ao servidor com segurança."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Não é possível se conectar ao servidor com segurança."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"O certificado do cliente é necessário. Conectar-se ao servidor com o certificado do cliente?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"O certificado é inválido ou inacessível."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"O servidor respondeu com um erro. Verifique seu nome de usuário e senha e tente novamente."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"É necessário um certificado de cliente. Deseja se conectar ao servidor com um certificado de cliente?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"O certificado é inválido ou inacessível."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"O servidor respondeu com um erro. Verifique seu nome de usuário e senha e tente novamente."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Não é possível se conectar ao servidor."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Não é possível se conectar ao servidor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS solicitado, mas não suportado pelo servidor."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"AVISO: ao desativar a autoridade do aplicativo de e-mail para administrar seu dispositivo, todas as contas de e-mail vinculadas serão excluídas, assim como e-mails, contatos, eventos da agenda e outros dados."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Atualização de segurança"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> solicita que você atualize suas configurações de segurança."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"A conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" requer a atualização das configurações de segurança."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Necessária atualização de segurança"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"A conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" não pode ser sincronizada devido a solicitações de segurança."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"A conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" exige a atualização das configurações de segurança."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"As configurações de segurança da conta \"<xliff:g id="ACCOUNT">%s</xliff:g>\" foram alteradas. Nenhuma ação do usuário é necessária."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Necessária atualiz. segurança"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Polít. segurança alteradas"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Polít. de seg. não podem ser cumpridas"</string>
<string name="account_security_title" msgid="3511543138560418587">"Segurança do dispositivo"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"O servidor <xliff:g id="SERVER">%s</xliff:g> requer a permissão de controle remoto de alguns recursos de segurança do seu dispositivo Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Editar detalhes"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Sua senha ou PIN da tela de bloqueio expirou."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Senha da tela de bloqueio expirada"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Senha da tela de bloqueio expirando"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"É necessário alterar sua senha ou PIN da tela de bloqueio, senão os dados de <xliff:g id="ACCOUNT">%s</xliff:g> serão apagados. Alterar agora?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"É necessário alterar o PIN ou a senha de sua tela de bloqueio logo, ou os dados da <xliff:g id="ACCOUNT">%s</xliff:g> serão apagados. Deseja mudar isso agora?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Senha da tela de bloqueio expirada"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Os dados de <xliff:g id="ACCOUNT">%s</xliff:g> estão sendo apagados de seu dispositivo. Você pode restaurá-los alterando sua senha ou PIN da tela de bloqueio. Alterar agora?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Os dados da <xliff:g id="ACCOUNT">%s</xliff:g> estão sendo apagados de seu dispositivo. Você pode restaurá-los alterando o PIN ou a senha de sua tela de bloqueio. Deseja mudar isso agora?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Descartar as alterações não salvas?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Não foi possível fazer login"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"O nome de usuário ou a senha de <xliff:g id="ACCOUNT">%s</xliff:g> estão incorretos. Atualizar agora?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"O nome de usuário ou senha da <xliff:g id="ACCOUNT">%s</xliff:g> está incorreto. Deseja atualizar agora?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Conta padrão"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Enviar e-mail desta conta por padrão"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Fazer download dos anexos"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Fazer download automát. dos anexos de mens. recentes via Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Notificações de e-mail"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Frequência de sincronização, notificações etc."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Notificar sobre chegada de e-mails na barra de sistema"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Enviar notificação quando chegarem e-mails"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frequência de verificação da caixa de entrada"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Configurações recebidas"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nome de usuário, senha e outras configurações do servidor de entrada"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Configurações enviadas"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nome de usuário, senha e outras configurações do servidor de saída"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Políticas aplicadas"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Nenhuma"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Políticas não suportadas"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Nenhuma"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Tentativa de sincronização"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Toque aqui para sincronizar esta conta"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Nome da conta"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Seu nome"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Assinatura"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Respostas rápidas"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Edite o texto que você costuma inserir ao compor e-mails"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Edite o texto que você costuma inserir ao compor e-mails"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Acrescentar texto às mensagens que você envia"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Configurações de notificação"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Uso de dados"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Políticas de segurança"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Editar resposta rápida"</string>
<string name="save_action" msgid="1988862706623227093">"Salvar"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronizar contatos"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincronizar contatos para esta conta"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sincronizar agenda"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sincronizar agenda para esta conta"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronizar agenda"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sinc. evento agenda p/ esta conta"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincronizar e-mail"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincronizar e-mail para esta conta"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrar"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultados de <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Configurações"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Geral"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Configurações gerais"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Aplicativo"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Avanço automático"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Selecione qual tela mostrar após a exclusão de uma mensagem"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ocultar caixas de seleção"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Nas listas de mensagens, a mantenha pressionada para selecionar"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirmar antes de excluir"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mensagens"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirmar antes de enviar"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mensagens"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Avançar até"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mensagem mais recente"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mensagem antiga"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Aguardando resultados"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Alguns servidores podem levar um longo tempo."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Pastas"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Desativar o uso da câmera do dispositivo"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Exigir senha para o dispositivo"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Restringir reutiliz. de senhas recentes"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Exigir que as senhas expirem"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Exigir dispositivo inativo p/ bloq. tela"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Limitar número de eventos de agenda sincronizados"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Limitar número de e-mails sincronizados"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Obrigado!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Parece uma boa ideia!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Lerei isso mais tarde e darei uma resposta a você."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Podemos marcar uma reunião para discutir isso."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"A sincronização em segundo plano para essa conta é desativada durante o roaming."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Enviando resposta..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Nenhuma mensagem."</string>
</resources>
diff --git a/res/values-pt/uploader.xml b/res/values-pt/uploader.xml
index bf9b37971..f23616485 100644
--- a/res/values-pt/uploader.xml
+++ b/res/values-pt/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Ocultar detalhes"</string>
<string name="menu_settings" msgid="5088116127086866634">"Configurações"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Enviado %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Conta"</string>
<string name="upload" msgid="2615541458361216022">"Enviar"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index 6327cd10a..ce5496385 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -18,11 +18,11 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for permission_read_attachment_label (9208086010625033590) -->
<skip />
- <!-- no translation found for permission_read_attachment_desc (6592948507403743153) -->
+ <!-- no translation found for permission_read_attachment_desc (3394721085306308972) -->
<skip />
<!-- no translation found for permission_access_provider_label (378256653525377586) -->
<skip />
- <!-- no translation found for permission_access_provider_desc (2221907862438022705) -->
+ <!-- no translation found for permission_access_provider_desc (6296566558584670348) -->
<skip />
<string name="app_name" msgid="5815426892327290362">"E-mail"</string>
<string name="compose_title" msgid="427986915662706899">"Nov messadi"</string>
@@ -44,7 +44,7 @@
<skip />
<!-- no translation found for delete_quick_response_action (3076922270182841978) -->
<skip />
- <!-- no translation found for quick_responses_empty_view (1693308598242828422) -->
+ <!-- no translation found for quick_responses_empty_view (3960050972306132367) -->
<skip />
<string name="discard_action" msgid="6532206074859505968">"Sbittar"</string>
<!-- no translation found for save_draft_action (6413714270991417223) -->
@@ -62,7 +62,7 @@
<string name="account_settings_action" msgid="4494079183315085171">"Parameters dal conto"</string>
<!-- no translation found for settings_action (6334807007967459412) -->
<skip />
- <!-- no translation found for mailbox_settings_action (8008375875310554776) -->
+ <!-- no translation found for menu_folder_options (2871906096248843471) -->
<skip />
<string name="mark_as_unread_action" msgid="3766298115778767554">"Marcar sco nunlegì"</string>
<!-- no translation found for move_action (3059189775933985898) -->
@@ -177,7 +177,8 @@
<skip />
<!-- no translation found for message_compose_include_quoted_text_checkbox_label (8165567368956050390) -->
<skip />
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Vus stuais agiuntar almain in destinatur."</string>
+ <!-- no translation found for message_compose_error_no_recipients (140299472517968199) -->
+ <skip />
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Tschertas adressas dad e-mail èn nuncorrectas."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"L\'agiunta è memia gronda."</string>
<!-- no translation found for message_compose_insert_quick_response_list_title (5314107302508728189) -->
@@ -206,9 +207,10 @@
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Fermar"</string>
<!-- no translation found for message_view_status_attachment_saved (8878790392556284868) -->
<skip />
- <!-- no translation found for message_view_status_attachment_not_saved (2433097334272991035) -->
+ <!-- no translation found for message_view_status_attachment_not_saved (4013475734255421939) -->
+ <skip />
+ <!-- no translation found for message_view_attachment_background_load (7906875687519445185) -->
<skip />
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Remartga: Ina u pliras agiuntas en Voss messadi renvià vegn(an) telechargiada(s) avant la spediziun."</string>
<!-- no translation found for message_view_show_message_action (5134222901019191436) -->
<skip />
<!-- no translation found for message_view_show_invite_action (8862797393776226777) -->
@@ -287,7 +289,7 @@
<skip />
<!-- no translation found for forward_download_failed_title (6139701848515572511) -->
<skip />
- <!-- no translation found for login_failed_ticker (5749227022559285302) -->
+ <!-- no translation found for login_failed_ticker (2169365211566829350) -->
<skip />
<!-- no translation found for login_failed_title (7624349996212476176) -->
<skip />
@@ -315,21 +317,16 @@
<skip />
<!-- no translation found for account_setup_basics_title (3578333196594678422) -->
<skip />
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Agiuntar in conto Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Agiuntar in conto Exchange ActiveSync"</string>
<!-- no translation found for account_setup_basics_headline (6726590205905464015) -->
<skip />
- <!-- no translation found for accounts_welcome (1491126253077950685) -->
- <skip />
- <!-- no translation found for accounts_welcome_exchange (4432917203403596617) -->
- <skip />
- <!-- no translation found for accounts_welcome_exchange_alternate (1319376442032224845) -->
+ <!-- no translation found for accounts_welcome (8337750045270269649) -->
<skip />
<!-- no translation found for account_setup_basics_email_label (3454164053624112047) -->
<skip />
<!-- no translation found for account_setup_basics_password_label (9133549799291519298) -->
<skip />
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Trametter ils e-mails tenor standard cun quest conto"</string>
+ <!-- no translation found for account_setup_basics_default_label (8896222991837026736) -->
+ <skip />
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configuraziun manuala"</string>
<!-- no translation found for account_setup_username_password_toast (3968270274727947460) -->
<skip />
@@ -344,7 +341,7 @@
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Ils parameters dil server da sortida vegnan controllads…"</string>
<!-- no translation found for account_setup_names_title (8483517350241119291) -->
<skip />
- <!-- no translation found for account_setup_names_headline (2413440250372658881) -->
+ <!-- no translation found for account_setup_names_headline (914858472109729140) -->
<skip />
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Dar in num al conto (facultativ)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Voss num (vegn mussà en messadis che sortan)"</string>
@@ -361,8 +358,8 @@
<skip />
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Num d\'utilisader"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Pled-clav"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Server POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Server IMAP"</string>
+ <!-- no translation found for account_setup_incoming_server_label (1480342966630002638) -->
+ <skip />
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tip da segirezza"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Nagin"</string>
@@ -386,7 +383,8 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Server SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tip da segirezza"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Annunzia obligatorica"</string>
+ <!-- no translation found for account_setup_outgoing_require_login_label (7779484127897397562) -->
+ <skip />
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Num d\'utilisader"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Pled-clav"</string>
<!-- no translation found for account_setup_exchange_title (396004732514751781) -->
@@ -421,11 +419,16 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Mintga 15 minutas"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Mintga 30 minutas"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Mintga ura"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"\"Trametter ils e-mails da quest conto, tenor standard.\""</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Mussar in avis cura ch\'in e-mail arriva"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sincronisar ils contacts da quest conto"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sincronisar il chalender da quest conto"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sincronisar ils e-mails da quest conto."</string>
+ <!-- no translation found for account_setup_options_default_label (2617227194283720914) -->
+ <skip />
+ <!-- no translation found for account_setup_options_notify_label (7046146571560728829) -->
+ <skip />
+ <!-- no translation found for account_setup_options_sync_contacts_label (276492345599531778) -->
+ <skip />
+ <!-- no translation found for account_setup_options_sync_calendar_label (3222151135467189411) -->
+ <skip />
+ <!-- no translation found for account_setup_options_sync_email_label (8585177128405004068) -->
+ <skip />
<!-- no translation found for account_setup_options_background_attachments_label (5247749298276451846) -->
<skip />
<!-- no translation found for account_setup_failed_dlg_title (9083263347962940552) -->
@@ -443,17 +446,19 @@
<skip />
<!-- no translation found for account_setup_options_mail_window_default (8321351926520165832) -->
<skip />
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Num d\'utilisader u pled-clav nuncorrect."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Num d\'utilisader u pled-clav nuncorrect."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <!-- no translation found for account_setup_failed_dlg_auth_message (426627755590431364) -->
+ <skip />
+ <!-- no translation found for account_setup_failed_dlg_auth_message_fmt (737111956772240007) -->
+ <skip />
<!-- no translation found for account_setup_failed_dlg_certificate_message (3836152264696108805) -->
<skip />
<!-- no translation found for account_setup_failed_dlg_certificate_message_fmt (2121921642915593041) -->
<skip />
- <!-- no translation found for account_setup_failed_certificate_required (1280569002588325367) -->
+ <!-- no translation found for account_setup_failed_certificate_required (2689944595775206006) -->
<skip />
- <!-- no translation found for account_setup_failed_certificate_inaccessible (7245835883180762722) -->
+ <!-- no translation found for account_setup_failed_certificate_inaccessible (3563840279690749547) -->
<skip />
- <!-- no translation found for account_setup_failed_check_credentials_message (222908719765968691) -->
+ <!-- no translation found for account_setup_failed_check_credentials_message (6531658092540248067) -->
<skip />
<!-- no translation found for account_setup_failed_dlg_server_message (4942810054116129684) -->
<skip />
@@ -483,8 +488,17 @@
<skip />
<!-- no translation found for account_security_dialog_content_fmt (8843806143923278214) -->
<skip />
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Il conto «<xliff:g id="ACCOUNT">%s</xliff:g>» basegna ina actualisaziun dals parameters da segirezza."</string>
- <!-- no translation found for security_notification_content_title (3352841884304076235) -->
+ <!-- no translation found for security_unsupported_ticker_fmt (5166579214529283975) -->
+ <skip />
+ <!-- no translation found for security_needed_ticker_fmt (2120499087897133665) -->
+ <skip />
+ <!-- no translation found for security_changed_ticker_fmt (2609435447352755285) -->
+ <skip />
+ <!-- no translation found for security_notification_content_update_title (2429762903228690154) -->
+ <skip />
+ <!-- no translation found for security_notification_content_change_title (443490921895642130) -->
+ <skip />
+ <!-- no translation found for security_notification_content_unsupported_title (7315219208043169233) -->
<skip />
<!-- no translation found for account_security_title (3511543138560418587) -->
<skip />
@@ -501,17 +515,17 @@
<skip />
<!-- no translation found for password_expire_warning_dialog_title (1687074175399798189) -->
<skip />
- <!-- no translation found for password_expire_warning_dialog_content_fmt (4595246020880351045) -->
+ <!-- no translation found for password_expire_warning_dialog_content_fmt (4293446611405084436) -->
<skip />
<!-- no translation found for password_expired_dialog_title (2186547998125938084) -->
<skip />
- <!-- no translation found for password_expired_dialog_content_fmt (5982207349002500211) -->
+ <!-- no translation found for password_expired_dialog_content_fmt (6538210092073931079) -->
<skip />
<!-- no translation found for account_settings_exit_server_settings (8006323251094711431) -->
<skip />
<!-- no translation found for account_settings_login_dialog_title (4024422579146302775) -->
<skip />
- <!-- no translation found for account_settings_login_dialog_content_fmt (3492735234999710234) -->
+ <!-- no translation found for account_settings_login_dialog_content_fmt (8849649646111167377) -->
<skip />
<string name="account_settings_default_label" msgid="3575963379680943640">"Conto predefinì"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Trametter ils e-mails tenor standard cun quest conto"</string>
@@ -521,7 +535,7 @@
<skip />
<string name="account_settings_notify_label" msgid="1630001017303007974">"Avis ad e-mails"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"\"Frequenza da sincronisaziun, avis, etc.\""</string>
- <!-- no translation found for account_settings_notify_summary (6301122709602752038) -->
+ <!-- no translation found for account_settings_notify_summary (8134339460923068254) -->
<skip />
<!-- no translation found for account_settings_mail_check_frequency_label (8271462919214560616) -->
<skip />
@@ -531,25 +545,40 @@
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Parameters da sortida"</string>
<!-- no translation found for account_settings_outgoing_summary (3572093624332724311) -->
<skip />
+ <!-- no translation found for account_settings_enforced_label (7429582254433588882) -->
+ <skip />
+ <!-- no translation found for account_settings_enforced_summary (8140860420440447771) -->
+ <skip />
+ <!-- no translation found for account_settings_unsupported_label (1954091071454235577) -->
+ <skip />
+ <!-- no translation found for account_settings_unsupported_summary (2107633813351863608) -->
+ <skip />
+ <!-- no translation found for account_settings_retry_label (1104680719299842829) -->
+ <skip />
+ <!-- no translation found for account_settings_retry_summary (2703599639846201913) -->
+ <skip />
<string name="account_settings_description_label" msgid="8894815221204511715">"Num dal conto"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Voss num"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Signatura"</string>
<!-- no translation found for account_settings_edit_quick_responses_label (3106019627675996480) -->
<skip />
- <!-- no translation found for account_settings_edit_quick_responses_summary (5284435342418252369) -->
+ <!-- no translation found for account_settings_edit_quick_responses_summary (8056686122888722591) -->
<skip />
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Agiuntar in text als messadis che sortan"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Parameters dad avis"</string>
<!-- no translation found for account_settings_data_usage (6669107430575866736) -->
<skip />
+ <!-- no translation found for account_settings_policies (6292833636418641840) -->
+ <skip />
<!-- no translation found for edit_quick_response_dialog (4322494050816995390) -->
<skip />
<!-- no translation found for save_action (1988862706623227093) -->
<skip />
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronisar ils contacts"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincronisar ils contacts per quest conto"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sincronisar il chalender"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sincronisar il chalender per quest conto"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronisar il chalender"</string>
+ <!-- no translation found for account_settings_sync_calendar_summary (7606340353079301703) -->
+ <skip />
<!-- no translation found for account_settings_sync_email_enable (3754115565685222477) -->
<skip />
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincronisar ils e-mails per quest conto"</string>
@@ -603,7 +632,7 @@
</plurals>
<!-- no translation found for settings_activity_title (5185915603716333904) -->
<skip />
- <!-- no translation found for header_label_general_preferences (9204600297009680176) -->
+ <!-- no translation found for header_label_general_preferences (8243724566056800991) -->
<skip />
<!-- no translation found for category_general_preferences (2742423840964045801) -->
<skip />
@@ -611,6 +640,18 @@
<skip />
<!-- no translation found for general_preference_auto_advance_summary (6483439980032715119) -->
<skip />
+ <!-- no translation found for general_preference_hide_checkboxes_label (2054599123778503930) -->
+ <skip />
+ <!-- no translation found for general_preference_hide_checkboxes_summary (141341137898712712) -->
+ <skip />
+ <!-- no translation found for general_preference_confirm_delete_label (1863245465244241907) -->
+ <skip />
+ <!-- no translation found for general_preference_confirm_delete_summary (6710240861010766643) -->
+ <skip />
+ <!-- no translation found for general_preference_confirm_send_label (4548277349553989930) -->
+ <skip />
+ <!-- no translation found for general_preference_confirm_send_summary (2695471027185506093) -->
+ <skip />
<!-- no translation found for general_preference_auto_advance_dialog_title (5405052109452503909) -->
<skip />
<!-- no translation found for general_preference_auto_advance_newer (1336720027570509885) -->
@@ -684,6 +725,32 @@
<skip />
<!-- no translation found for action_bar_mailbox_list_title (7484457755531286333) -->
<skip />
+ <!-- no translation found for policy_dont_allow_camera (5744573062306937302) -->
+ <skip />
+ <!-- no translation found for policy_require_password (7177274900480984702) -->
+ <skip />
+ <!-- no translation found for policy_password_history (5743544498302303181) -->
+ <skip />
+ <!-- no translation found for policy_password_expiration (1248123255253649199) -->
+ <skip />
+ <!-- no translation found for policy_screen_timeout (414869965358468080) -->
+ <skip />
+ <!-- no translation found for policy_calendar_age (627405158087482302) -->
+ <skip />
+ <!-- no translation found for policy_email_age (7144148367145424963) -->
+ <skip />
+ <!-- no translation found for quick_1 (3426057697353380951) -->
+ <skip />
+ <!-- no translation found for quick_2 (4188036352885736617) -->
+ <skip />
+ <!-- no translation found for quick_3 (8061819976353395585) -->
+ <skip />
+ <!-- no translation found for quick_4 (3988974084396883051) -->
+ <skip />
<!-- no translation found for require_manual_sync_message (7777357288642785955) -->
<skip />
+ <!-- no translation found for confirm_response (5747902757569543165) -->
+ <skip />
+ <!-- no translation found for no_conversations (5559527390337162819) -->
+ <skip />
</resources>
diff --git a/res/values-rm/uploader.xml b/res/values-rm/uploader.xml
index 1faf9ef95..1f6568e08 100644
--- a/res/values-rm/uploader.xml
+++ b/res/values-rm/uploader.xml
@@ -49,7 +49,7 @@
<skip />
<!-- no translation found for format_date_uploaded (803752037646090928) -->
<skip />
- <!-- no translation found for format_progress_percent (1420459750508777491) -->
+ <!-- no translation found for format_progress_percent (4347398038122210157) -->
<skip />
<!-- no translation found for account (5199161365824352613) -->
<skip />
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index dafedab69..1184495f4 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Citiţi ataşamentele e-mailurilor"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Permite aplicaţiei citirea ataşamentelor de e-mail."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Permite aplicaţiei citirea ataşamentelor de e-mail."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Accesaţi datele furnizorului de e-mail"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Permite acestei aplicaţii accesul la baza de date a adresei de e-mail, incluzând mesajele primite, mesajele trimise, numele de utilizatori şi parolele."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Permite aplicaţiei să acceseze baza de date a adresei de e-mail, incluzând mesajele primite, mesajele trimise, numele de utilizator şi parolele."</string>
<string name="app_name" msgid="5815426892327290362">"E-mail"</string>
<string name="compose_title" msgid="427986915662706899">"Scrieţi"</string>
<string name="debug_title" msgid="5175710493691536719">"Remediaţi erorile"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Terminat"</string>
<string name="create_action" msgid="3062715563215392251">"Creaţi unul nou"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Ştergeţi"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Nu există răspunsuri rapide"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Nu există răspunsuri rapide."</string>
<string name="discard_action" msgid="6532206074859505968">"Renunţaţi"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Salvaţi m. nef."</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Introd. un răspuns rapid"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Căutaţi"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Setările contului"</string>
<string name="settings_action" msgid="6334807007967459412">"Setări"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Opţiuni de sincronizare"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Opţiuni de sincronizare"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Marcaţi drept necitit"</string>
<string name="move_action" msgid="3059189775933985898">"Mutaţi"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> a scris:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Includeţi textul citat"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Includeţi textul"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Trebuie să adăugaţi cel puţin un destinatar."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Adăugaţi cel puţin un destinatar."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Unele adrese de e-mail sunt nevalide."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Fişierul este prea mare pentru a fi ataşat."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Introduceţi un răspuns rapid"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Salvat"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Opriţi"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Ataşament salvat ca <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Nu s-a salvat ataşamentul."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Notă: unul sau mai multe ataşamente din mesajul dvs. redirecţionat vor fi descărcate înainte de a fi trimise."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Ataşamentul nu s-a salvat."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Unul sau mai multe ataşamente din mesajul dvs. redirecţionat vor fi descărcate înainte de a fi trimise."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Mesaj"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Invitaţi"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Nu se pot redirecţiona unul sau mai multe ataşamente."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Ataşamentul nu a fost trimis"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Conectare eşuată la <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Conectare eşuată pentru <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Nu s-a putut conecta"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> O"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Mai vechi"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Configurare cont"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Adăugaţi un cont Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Adăugaţi un cont Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Cont de e-mail"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Puteţi configura e-mailul pentru cele mai multe conturi, urmând doar câţiva paşi."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Puteţi să configuraţi un cont Exchange urmând doar câţiva paşi."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Puteţi să configuraţi un cont Exchange ActiveSync urmând doar câţiva paşi."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Puteţi configura contul dvs. în doar câţiva paşi."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Adresă de e-mail"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Parolă"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Trimiteţi e-mailuri din acest cont în mod prestabilit."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Trimiteţi e-mailuri de pe acest cont în mod prestabilit"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Configurare manuală"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Introduceţi o adresă de e-mail şi o parolă valide."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Cont duplicat"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Se verifică setările pentru serverul mesajelor de intrare..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Se verifică setările serverului de mesaje de ieşire..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Configurare cont"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Contul este configurat, iar e-mailul funcţionează corect!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Contul este configurat, iar e-mailul funcţionează corect!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Daţi un nume acestui cont (opţional)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Numele dvs. (afişat în mesajele de trimitere)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Acest câmp nu poate rămâne necompletat."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Setări pentru serverul de mesaje de intrare"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Nume de utilizator"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Parolă"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Server POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Server IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Tipul de securitate"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Niciunul"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Server SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Tipul de securitate"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Solicitaţi conectarea."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Necesită conectare"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Nume de utilizator"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Parolă"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Configurare cont"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"La fiecare 15 minute"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"La fiecare 30 de minute"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"La fiecare oră"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Trimiteţi e-mailuri din acest cont"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Doresc să primesc notificare la primirea de e-mailuri."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Doresc sincronizarea agendei acestui cont."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sincronizaţi calendarul acestui cont."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sincron. e-mail din acest cont."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Trimiteţi e-mailuri de pe acest cont în mod prestabilit"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Doresc să fiu notificat(ă) la primirea de e-mailuri"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Doresc sincronizarea agendei acestui cont"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Doresc sincronizarea calendarului acestui cont"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Doresc sincronizarea mesajelor de e-mail din acest cont"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Doresc să se descarce automat ataşamentele când sunt conectat(ă) la Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nu s-a putut finaliza"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Zile pentru sincronizare"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"O lună"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Toate"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Setări prestabilite cont"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Nume de utilizator sau parolă incorectă."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Nume de utilizator sau parolă incorectă."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Numele de utilizator sau parola sunt incorecte."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Numele de utilizator sau parola sunt incorecte."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nu se poate conecta în siguranţă la server."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nu se poate conecta în siguranţă la server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Este necesar un certificat de client. Vă conectaţi la server cu un certificat de client?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Certificat nevalid sau inaccesibil."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Serverul a răspuns cu o eroare. Verificaţi numele de utilizator şi parola şi încercaţi din nou."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Este necesar un certificat de client. Doriţi să vă conectaţi la server cu un certificat de client?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certificat nevalid sau inaccesibil."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Serverul a răspuns cu o eroare. Verificaţi numele de utilizator şi parola şi încercaţi din nou."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nu se poate conecta la server."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Nu se poate conecta la server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS solicitat, dar neacceptat de către server."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"AVERTISMENT: dacă dezactivaţi autoritatea aplicaţiei E-mail de administrare a dispozitivului dvs. se şterg toate conturile de e-mail care au nevoie de aceasta, împreună cu e-mailurile, agenda, evenimentele din calendar şi alte date pe care aceste conturi le conţin."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Actualizare de securitate"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> vă solicită actualizarea setărilor dvs. de securitate."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Contul „<xliff:g id="ACCOUNT">%s</xliff:g>” necesită actualizarea setărilor de securitate."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Actual. de securitate necesară"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Contul „<xliff:g id="ACCOUNT">%s</xliff:g>” nu poate fi sincronizat din cauza cerinţelor de securitate."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Contul „<xliff:g id="ACCOUNT">%s</xliff:g>” necesită actualizarea setărilor de securitate."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Contul „<xliff:g id="ACCOUNT">%s</xliff:g>” şi-a schimbat setările de securitate. Nu este necesară nicio acţiune din partea utilizatorului."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Actualizare de securitate obligatorie"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Pol. securitate s-au schimbat"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Politici securitate nerespect."</string>
<string name="account_security_title" msgid="3511543138560418587">"Securitatea dispozitivului"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Serverul <xliff:g id="SERVER">%s</xliff:g> vă solicită permisiunea de a controla de la distanţă unele caracteristici de securitate ale dispozitivului dvs. Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Modificaţi detaliile"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Codul PIN sau parola de blocare a ecranului a expirat."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Parolă bloc. ecran. expirată"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Parola de blocare ecran expiră în curând"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Este necesar să modificaţi în curând codul PIN sau parola de blocare a ecranului. În caz contrar, datele pentru <xliff:g id="ACCOUNT">%s</xliff:g> vor fi şterse. Modificaţi acum?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Este necesar să modificaţi curând codul PIN sau parola ecranului de blocare; în caz contrar datele pentru <xliff:g id="ACCOUNT">%s</xliff:g> vor fi şterse. Modificaţi acum?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Parola de blocare ecran expirată"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Datele pentru <xliff:g id="ACCOUNT">%s</xliff:g> sunt şterse de pe dispozitiv, dar le puteţi restabili modificând codul PIN sau parola de blocare a ecranului. Modificaţi acum?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Datele pentru <xliff:g id="ACCOUNT">%s</xliff:g> sunt şterse de pe dispozitiv, dar le puteţi restabili modificând codul PIN sau parola de blocare a ecranului. Modificaţi acum?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Renunţaţi la modificările nesalvate?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Nu s-a putut conecta"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Numele de utilizator sau parola pentru <xliff:g id="ACCOUNT">%s</xliff:g> este incorectă. Le actualizaţi acum?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Numele de utilizator sau parola pentru <xliff:g id="ACCOUNT">%s</xliff:g> sunt incorecte. Doriţi să le actualizaţi acum?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Cont prestabilit"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Trimiteţi e-mailuri de pe acest cont în mod prestabilit"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Descărcaţi ataşamentele"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Descărcaţi în mod automat prin Wi-Fi ataşam. mesaj. recente"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Notificările de e-mail"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Frecvenţa sincronizării, notificări etc."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Doresc să fiu notificat(ă) în bara de sistem la primirea e-mailurilor"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Trimiteţi notificare la primire e-mail"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frecvenţa verificării mesajelor primite"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Setări pentru mesajele primite"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Nume utilizator, parolă şi alte setări pt. serverul de primire"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Setări pentru mesajele de trimitere"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Nume utilizator, parolă şi alte setări pt. server de trimitere"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Politicile puse în aplicare"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Niciunul"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Politici neacceptate"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Niciunul"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Încercaţi sincronizarea"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Atingeţi aici pentru a sincroniza acest cont"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Numele contului"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Numele dvs."</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Semnătura"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Răspunsuri rapide"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Editaţi textul introdus frecvent când scrieţi e-mailuri"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Editaţi textul introdus frecvent când scrieţi e-mailuri"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Adăugaţi text la mesajele trimise"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Setări pentru notificări"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Utilizarea datelor"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Politici de securitate"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Editaţi răspunsul rapid"</string>
<string name="save_action" msgid="1988862706623227093">"Salvaţi"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sincronizaţi persoanele din agendă"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sincron. agenda pt. acest cont"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sincron. Calendar"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sincron. calendarul pt. acest cont"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sincronizaţi calendarul"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sincron. evenim. calendar pt. cont"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sincroniz. e-mailul"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sincron. e-mail pt. acest cont"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrare"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> (de) rezultate din <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Setări"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Generale"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Setări generale"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Aplicaţie"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Înaintare automată"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Alegeţi ce ecran se afişează după ştergerea unui mesaj"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ascundeţi casetele de validare"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"În listele de mesaje, atingeţi şi ţineţi apăsat pentru a selecta"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Confirmaţi înainte de a şterge"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mesaje"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Confirmaţi înainte de a trimite"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mesaje"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Înaintaţi la"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mesaje mai noi"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mesaj mai vechi"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Se aşteaptă rezultatele"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Pentru unele servere poate fi necesar un interval mare de timp."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Dosare"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Nu permiteţi utilizarea camerei foto"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Solicitaţi parola dispozitivului"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Limitaţi reutilizarea parolelor recente"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Solicitaţi expirarea parolelor"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Disp. inactiv necesar pt. blocare ecran"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Limitare număr evenimente de calendar sincronizate"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Limitare număr de e-mailuri sincronizate"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Vă mulţumim!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Sună bine!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Voi citi mai târziu acest mesaj şi vă voi contacta."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Să stabilim o întâlnire pentru a discuta această acţiune."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Sincronizarea în fundal pentru acest cont este dezactivată în roaming."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Se trimite răspunsul..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Niciun mesaj."</string>
</resources>
diff --git a/res/values-ro/uploader.xml b/res/values-ro/uploader.xml
index b06fe413a..a3af219b1 100644
--- a/res/values-ro/uploader.xml
+++ b/res/values-ro/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Ascundeţi detaliile"</string>
<string name="menu_settings" msgid="5088116127086866634">"Setări"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Încărcat pe %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Cont"</string>
<string name="upload" msgid="2615541458361216022">"Încărcaţi"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 3fb838781..8de2baee4 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -16,10 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="permission_read_attachment_label" msgid="9208086010625033590">"Открывать прикрепленные файлы"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Приложение получит доступ к прикрепленным файлам в сообщениях эл. почты."</string>
+ <string name="permission_read_attachment_label" msgid="9208086010625033590">"Просмотр пересылаемых файлов"</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Приложение получит доступ к прикрепленным файлам в сообщениях электронной почты."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Доступ к данным сервиса эл. почты"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Приложение получит доступ к базе данных программы электронной почты, которая включает полученные и отправленные письма, имена пользователей и пароли."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Приложение получит доступ к базе данных электронной почты, которая содержит полученные и отправленные сообщения, имена пользователей и пароли."</string>
<string name="app_name" msgid="5815426892327290362">"Email"</string>
<string name="compose_title" msgid="427986915662706899">"Новое сообщение"</string>
<string name="debug_title" msgid="5175710493691536719">"Выполнить отладку"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Готово"</string>
<string name="create_action" msgid="3062715563215392251">"Создать"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Удалить"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Нет шаблонов SMS-ответов"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Нет шаблонов"</string>
<string name="discard_action" msgid="6532206074859505968">"Отменить"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Сохранить черновик"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Вставить быстрый ответ"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Поиск"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Настройки аккаунта"</string>
<string name="settings_action" msgid="6334807007967459412">"Настройки"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Параметры синхронизации"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Параметры синхронизации"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Отметить как непрочитанное"</string>
<string name="move_action" msgid="3059189775933985898">"Переместить"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"Добавить копию"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"Пользователь <xliff:g id="SENDER">%s</xliff:g> писал:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Включить цитируемый текст"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Включить исходный текст в ответ"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Добавьте хотя бы одного получателя."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Укажите получателя."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Некоторые адреса электронной почты являются недопустимыми."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Файл имеет слишком большой размер и не может быть приложен."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Вставка быстрого ответа"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Сохранено"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Стоп"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Вложение сохранено как <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Файл не сохранен."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Примечание. Несколько прикрепленных файлов в переадресованном сообщении будут загружены перед отправкой."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Файл не сохранен."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Один или несколько прикрепленных файлов в пересылаемом сообщении будут загружены перед отправкой."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Сообщение"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Пригласить"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Сбой при пересылке прикрепленных файлов."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Не удалось переслать вложение"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Ошибка авторизации <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Ошибка при входе в аккаунт <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Вход не выполнен"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> Б"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"След."</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Настройка аккаунта"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Добавить аккаунт Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Добавить аккаунт Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Ярлык Email"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Email поддерживает большинство популярных почтовых служб."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Настроить аккаунт Exchange очень просто."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Настроить аккаунт Exchange ActiveSync очень просто."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Настроить свой аккаунт очень просто."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Адрес электронной почты"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Пароль"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Сделать аккаунтом электронной почты по умолчанию для отправки сообщений."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"По умолчанию отправлять письма с этого адреса"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Вручную"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Введите действительный адрес электронной почты и пароль."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Копировать аккаунт"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Проверка настроек сервера входящих сообщений..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Проверка настроек сервера исходящих сообщений..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Настройка аккаунта"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Ваш аккаунт настроен, ждите сообщений!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Аккаунт добавлен!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Присвойте этому аккаунту название (по желанию)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Ваше имя (показывается в исходящих сообщениях)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Это поле должно быть заполнено."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Настройки сервера входящих сообщений"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Имя пользователя"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Пароль"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Сервер POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Сервер IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Сервер"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Порт"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Тип безопасности"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Нет"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Сервер SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Порт"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Тип безопасности"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Требовать входа в аккаунт."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Выполнять вход в систему"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Имя пользователя"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Пароль"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Настройка аккаунта"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Каждые 15 минут"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Каждые 30 минут"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Каждый час"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Сделать аккаунтом электронной почты по умолчанию для отправки сообщений."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Уведомлять при получении сообщения по электронной почте."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Синхронизировать контакты из этого аккаунта."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Синхронизировать календарь из этого аккаунта."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Синхронизировать почту из этого аккаунта"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"По умолчанию отправлять письма с этого адреса"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Показывать уведомление при получении новых писем"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Синхронизировать контакты из этого аккаунта"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Синхронизировать календарь из этого аккаунта"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Синхронизировать электронную почту из этого аккаунта"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Автоматически загружать прикрепленные файлы при подключении к Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Настройка не закончена"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Период синхронизации"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Один месяц"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Все"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Параметры по умолчанию"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Неверное имя пользователя или пароль."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Неверное имя пользователя или пароль."\n"<xliff:g id="ERROR">%s</xliff:g>"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Неверное имя пользователя или пароль."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Неверное имя пользователя или пароль."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Не удалось установить защищенное подключение к серверу."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Не удалось установить защищенное подключение к серверу."\n"<xliff:g id="ERROR">%s</xliff:g>"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Необходим сертификат клиента. Подключиться к серверу?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Сертификат недействителен или недоступен."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Ошибка сервера. Проверьте имя пользователя и пароль и повторите попытку."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Требуется сертификат клиента. Подключиться к серверу с таким сертификатом?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Сертификат недействителен или недоступен."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Ошибка сервера. Проверьте имя пользователя и пароль и повторите попытку."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Не удалось подключиться к серверу."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Не удалось подключиться к серверу."\n"<xliff:g id="ERROR">%s</xliff:g>"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS не поддерживается сервером."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"ВНИМАНИЕ! Отключение прав на администрирование вашего устройства для приложения Email приведет к удалению всех аккаунтов электронной почты, которые используют эти права. Кроме того, будут удалены все письма, контакты, календари и другие данные, связанные с этими аккаунтами."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Обновления безопасности"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Для аккаунта <xliff:g id="ACCOUNT">%s</xliff:g> требуется обновить настройки безопасности."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Аккаунт \"<xliff:g id="ACCOUNT">%s</xliff:g>\" требует обновления настроек безопасности."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Обновите систему безопасности"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Настройки безопасности не позволяют синхронизировать аккаунт <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"В аккаунте <xliff:g id="ACCOUNT">%s</xliff:g> требуется обновить настройки безопасности."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"В аккаунте <xliff:g id="ACCOUNT">%s</xliff:g> обновлены настройки безопасности. Ничего делать не нужно."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Обновите систему безопасности"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Политики безопасности изменены"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Политики не выполнены"</string>
<string name="account_security_title" msgid="3511543138560418587">"Безопасность устройства"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Серверу <xliff:g id="SERVER">%s</xliff:g> требуется разрешение на удаленное управление некоторыми функциями безопасности устройства Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Изменить сведения"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Срок действия вашего PIN-кода или пароля блокировки экрана истек."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Пароль блок. экрана устарел"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Истекает срок действия пароля"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Вам следует в ближайшее время изменить PIN-код или пароль блокировки экрана, иначе данные аккаунта <xliff:g id="ACCOUNT">%s</xliff:g> будут удалены. Изменить сейчас?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Скоро вам потребуется изменить PIN-код или пароль для блокировки экрана, иначе данные аккаунта <xliff:g id="ACCOUNT">%s</xliff:g> будут удалены. Изменить PIN-код или пароль сейчас?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Пароль блокировки экрана устарел"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Данные аккаунта <xliff:g id="ACCOUNT">%s</xliff:g> удаляются с вашего устройства. Вы можете восстановить их, изменив свой PIN-код или пароль блокировки экрана. Изменить его сейчас?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Данные аккаунта <xliff:g id="ACCOUNT">%s</xliff:g> удаляются с устройства. Вы можете восстановить их, изменив свой PIN-код или пароль блокировки экрана. Сделать это сейчас?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Отменить несохраненные изменения?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Не удалось войти в аккаунт."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Неверное имя пользователя или пароль аккаунта <xliff:g id="ACCOUNT">%s</xliff:g>. Обновить их сейчас?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Неверное имя пользователя или пароль для доступа в аккаунт <xliff:g id="ACCOUNT">%s</xliff:g>. Изменить их?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Аккаунт по умолчанию"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Сделать аккаунтом электронной почты по умолчанию для отправки сообщений"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Загружать прикрепленные файлы"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Автоматически загружать файлы из новых сообщений через Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Уведомления электронной почты"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Частота синхронизации, уведомления и другие настройки"</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"При получении почты показывать оповещение в строке состояния системы"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Показывать уведомление при получении новых писем"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Частота проверки папки \"Входящие\""</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Настройки входящих сообщений"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Имя пользователя, пароль и др. настройки сервера входящей почты"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Настройки исходящих сообщений"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Имя пользователя, пароль и др. настройки сервера исходящей почты"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Политики применены"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Нет"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Неподдерживаемые политики"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Нет"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Синхронизировать"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Нажмите, чтобы синхронизировать данные"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Название аккаунта"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Ваше имя"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Подпись"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Быстрые ответы"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Изменить текст, который часто используется в ваших письмах"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Использовать шаблоны для стандартных ответов"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Добавлять текст к отправляемым сообщениям"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Настройки уведомлений"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Использование данных"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Политики безопасности"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Изменить быстрый ответ"</string>
<string name="save_action" msgid="1988862706623227093">"Сохранить"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Синхронизировать контакты"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Синхронизировать контакты этого аккаунта"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Синхронизировать календарь"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Синхронизировать календарь этого аккаунта"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Синхронизировать календарь"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Синхронизация мероприятий"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Синхр. почту"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Синхронизировать почту этого аккаунта"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Вибросигнал"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"Кол-во результатов: <xliff:g id="RESULTS">%1$d</xliff:g> с <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Настройки"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Общие"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Общие настройки"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Приложение"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Автопереход"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Выберите экран для отображения после удаления цепочки писем"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Скрыть флажки"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Чтобы выбрать сообщение в списке, нажмите и удерживайте его."</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Подтверждать удаление"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Сообщения"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Подтверждать отправку"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Сообщения"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Переходить к"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Предыдущему сообщению"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Следующему сообщению"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Ожидание результатов"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Ожидание ответа от сервера может занять много времени."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Папки"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Запрещать использовать камеру"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Запрашивать пароль для разблокировки"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Запрещать использовать прежние пароли"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Ограничивать время действия паролей"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Блокировать экран при простое"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Ограничить число синхр. событий календаря"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Ограничить число синхр. сообщений эл. почты"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Спасибо!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Отличная идея!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Я отвечу позже."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Это нужно обсудить при встрече."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Для этого аккаунта отключена фоновая синхронизация в роуминге."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Отправка ответа…"</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Писем нет."</string>
</resources>
diff --git a/res/values-ru/uploader.xml b/res/values-ru/uploader.xml
index 08dbd9e8c..247ac0180 100644
--- a/res/values-ru/uploader.xml
+++ b/res/values-ru/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Скрыть подробности"</string>
<string name="menu_settings" msgid="5088116127086866634">"Настройки"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Загружено %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Аккаунт"</string>
<string name="upload" msgid="2615541458361216022">"Загрузить"</string>
<string name="ok" msgid="2516349681897895312">"ОК"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 0d62114e8..5f1815066 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Čítať e-mailové prílohy"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Umožňuje tejto aplikácii čítať prílohy vašich e-mailov."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Povoľuje aplikácii čítať prílohy vašich e-mailov."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Prístup k údajom poskytovateľa e-mailu"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Povoľuje tejto aplikácii prístup do databázy e-mailu, vrátane prijatých a odoslaných správ, používateľských mien a hesiel."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Povoľuje aplikácii prístup do databázy e-mailu vrátane prijatých a odoslaných správ, používateľských mien a hesiel."</string>
<string name="app_name" msgid="5815426892327290362">"Email"</string>
<string name="compose_title" msgid="427986915662706899">"Napísať správu"</string>
<string name="debug_title" msgid="5175710493691536719">"Ladiť"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Hotovo"</string>
<string name="create_action" msgid="3062715563215392251">"Vytvoriť novú"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Odstrániť"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Žiadne rýchle odpovede"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Žiadne rýchle odpovede."</string>
<string name="discard_action" msgid="6532206074859505968">"Zahodiť"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Uložiť koncept"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Vložiť rýchlu odpoveď"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Hľadať"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Nastavenia účtu"</string>
<string name="settings_action" msgid="6334807007967459412">"Nastavenia"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Možnosti synchronizácie"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Možnosti synchronizácie"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Označiť ako neprečítané"</string>
<string name="move_action" msgid="3059189775933985898">"Presunúť"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+Kópia/skr.kópia"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>napísal/a:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Zahrnúť citovaný text"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Zahrnúť text"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Musíte pridať aspoň jedného príjemcu."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Pridajte aspoň jedného príjemcu."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Niektoré e-mailové adresy sú neplatné."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Súbor nie je možné priložiť, pretože je príliš veľký."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Vložiť rýchlu odpoveď"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Uložené"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Zastaviť"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Príloha uložená ako <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Prílohu sa nepodarilo uložiť."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Poznámka: Pred odoslaním sa prevezme jedna alebo viac príloh zo správy posielanej ďalej."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Prílohu sa nepodarilo uložiť."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Pred odoslaním sa prevezme jedna alebo viacero príloh zo správy posielanej ďalej."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Správa"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Pozvať"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Nepodarilo sa poslať ďalej jednu alebo viac príloh."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Príloha nebola poslaná ďalej"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Prihlásenie do účtu <xliff:g id="ACCOUNT_NAME">%s</xliff:g> zlyhalo."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Prihlásenie do účtu <xliff:g id="ACCOUNT_NAME">%s</xliff:g> zlyhalo."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Prihlásenie sa nepodarilo"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Staršie"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Nastavenie účtu"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Pridať účet Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Pridať účet Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"E-mailový účet"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Väčšinu e-mailových účtov môžete nastaviť pomocou niekoľkých jednoduchých krokov."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Účet služby Exchange môžete nastaviť pomocou niekoľkých krokov."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Účet služby Exchange ActiveSync môžete nastaviť pomocou niekoľkých krokov."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Účet si môžete nastaviť pomocou niekoľkých krokov."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-mailová adresa"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Heslo"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"V predvolenom nastavení odosielať e-maily z tohto účtu."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"V predvolenom nastavení odosielať e-maily z tohto účtu"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ručné nastavenie"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Zadajte platnú e-mailovú adresu a heslo."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplikovať účet"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Kontrola nastavení servera prichádzajúcej pošty…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Kontrola nastavení servera odchádzajúcej pošty…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Nastavenie účtu"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Váš účet je nastavený, e-mail je na ceste!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Váš účet je nastavený a e-mail je na ceste!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Pomenovať tento účet (nepovinné)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Vaše meno (zobrazované na odchádzajúcich správach)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Toto pole nesmie byť prázdne."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Nastavenia servera prichádzajúcej pošty"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Používateľské meno"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Heslo"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Server POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Server IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Typ zabezpečenia"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Žiadne"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Server SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Typ zabezpečenia"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Požadovať prihlásenie"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Vyžadovať prihlásenie"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Používateľské meno"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Heslo"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Nastavenie účtu"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Každých 15 minút"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Každých 30 minút"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Každú hodinu"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"V predvolenom nastavení odosielať e-maily z tohto účtu."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Upozorniť ma na príchod e-mailu"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Synchronizovať kontakty z tohto účtu."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Synchronizovať kalendár z tohto účtu."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Synchronizovať e-mail z tohto účtu."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"V predvolenom nastavení odosielať e-maily z tohto účtu"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Upozorniť ma na príchod e-mailu"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synchronizovať kontakty z tohto účtu"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synchronizovať kalendár z tohto účtu"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synchronizovať e-mail z tohto účtu"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Automaticky preberať prílohy počas pripojenia k sieti Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Nepodarilo sa dokončiť"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Počet dní na synchronizáciu"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Jeden mesiac"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Všetky"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Použiť predv. nast. účtu"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Používateľské meno alebo heslo nie je správne."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Používateľské meno alebo heslo nie je správne."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Používateľské meno alebo heslo je nesprávne."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Používateľské meno alebo heslo je nesprávne."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Nepodarilo sa bezpečne pripojiť k serveru."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Nepodarilo sa bezpečne pripojiť k serveru."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Vyžaduje sa certifikát klienta. Pripojiť sa k serveru pomocou certifikátu klienta?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Certifikát je neplatný alebo neprístupný."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Server odpovedal s chybou. Skontrolujte používateľské meno a heslo a skúste to znova."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Vyžaduje sa certifikát klienta. Chcete sa pripojiť k serveru pomocou certifikátu klienta?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certifikát je neplatný alebo neprístupný."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Server odpovedal s chybou. Skontrolujte používateľské meno a heslo a skúste to znova."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Nepodarilo sa pripojiť k serveru."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Nepodarilo sa pripojiť k serveru."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"Vyžaduje sa služba TLS, ale server ju nepodporuje."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"UPOZORNENIE: Ak deaktivujete oprávnenie aplikácie E-mail spravovať toto zariadenie, budú odstránené všetky účty aplikácie E-mail, ktoré toto oprávnenie vyžadujú. Spoločne s týmito účtami budú odstránené aj všetky ich e-maily, kontakty, udalosti kalendára a ďalšie údaje."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Bezpečnostná aktualizácia"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Účet <xliff:g id="ACCOUNT">%s</xliff:g> vyžaduje, aby ste zmenili nastavenia zabezpečenia."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Účet <xliff:g id="ACCOUNT">%s</xliff:g> požaduje aktualizáciu nastavení zabezpečenia."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Vyžaduje sa bezpečnostná akt."</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Účet „<xliff:g id="ACCOUNT">%s</xliff:g>“ sa nedá synchronizovať z dôvodu požiadaviek zabezpečenia."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Účet „<xliff:g id="ACCOUNT">%s</xliff:g>“ vyžaduje aktualizáciu nastavení zabezpečenia."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Účet „<xliff:g id="ACCOUNT">%s</xliff:g>“ zmenil svoje nastavenia zabezpečenia. Od používateľa sa nevyžaduje žiadna akcia."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Vyžaduje sa bezp. aktualizácia"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Pravidlá zabezp. sa zmenili"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Prav. zabezp. sa nedajú splniť"</string>
<string name="account_security_title" msgid="3511543138560418587">"Zabezpečenie zariadenia"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Server <xliff:g id="SERVER">%s</xliff:g> vyžaduje povolenie, aby mohol vzdialene ovládať niektoré funkcie zabezpečenia vášho zariadenia so systémom Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Upraviť podrobnosti"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Platnosť kódu PIN alebo hesla na uzamknutie obrazovky vypršala."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Heslo na uzamknutie vypršalo"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Heslo na uzamknutie obr. čoskoro vyprší"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Čoskoro musíte zmeniť kód PIN alebo heslo na uzamknutie obrazovky, inak budú údaje účtu <xliff:g id="ACCOUNT">%s</xliff:g> vymazané. Chcete ho zmeniť teraz?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Váš kód PIN alebo heslo na uzamknutie obrazovky musíte čoskoro zmeniť, ináč budú údaje účtu <xliff:g id="ACCOUNT">%s</xliff:g> vymazané. Chcete ho zmeniť teraz?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Heslo na uzamknutie obrazovky vypršalo"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"V zariadení prebieha vymazanie údajov účtu <xliff:g id="ACCOUNT">%s</xliff:g>. Môžete ich obnoviť zmenou kódu PIN alebo hesla na uzamknutie obrazovky. Chcete to zmeniť teraz?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"V zariadení prebieha vymazanie údajov účtu <xliff:g id="ACCOUNT">%s</xliff:g>. Môžete ich obnoviť zmenou kódu PIN alebo hesla na uzamknutie obrazovky. Chcete to zmeniť teraz?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Zahodiť neuložené zmeny?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Prihlásenie sa nepodarilo"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Používateľské meno alebo heslo pre účet <xliff:g id="ACCOUNT">%s</xliff:g> je nesprávne. Chcete ich aktualizovať?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Používateľské meno alebo heslo pre účet <xliff:g id="ACCOUNT">%s</xliff:g> je nesprávne. Chcete ich aktualizovať?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Predvolený účet"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"V predvolenom nastavení odosielať e-maily z tohto účtu"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Preberať všetky prílohy"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Automaticky preberať prílohy najnovších správ prostredníctvom siete Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"E-mailové upozornenia"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Frekvencia synchronizácie, oznámení atď."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Zobraziť upozornenie na príchod e-mailu v systémovom paneli"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Poslať upozornenie na príchod e-mailu"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Frekvencia kontroly doručenej pošty"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Nastavenia prichádzajúcej pošty"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Používateľské meno, heslo a ďalšie nastavenia servera (prich.)"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Nastavenia odchádzajúcej pošty"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Používateľské meno, heslo a ďalšie nastavenia servera (odchádz.)"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Vynútené pravidlá"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Žiadne"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nepodporované pravidlá"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Žiadne"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Synchronizovať"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Ak chcete tento účet synchronizovať, dotknite sa tu"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Názov účtu"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Vaše meno"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Podpis"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Rýchle odpovede"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Upraviť text, ktorý často vkladáte pri písaní e-mailov."</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Upraviť text, ktorý často vkladáte pri písaní e-mailu"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Text pripojiť k odosielaným správam"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Nastavenia upozornení"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Spotreba dát"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Pravidlá zabezpečenia"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Upraviť rýchlu odpoveď"</string>
<string name="save_action" msgid="1988862706623227093">"Uložiť"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synchronizovať kontakty"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synchr. kontakty pre tento účet."</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Synchr. kalendár"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Synchr. kalendár pre tento účet"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synchronizovať kalendár"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synchr. udalosť kalendára pre účet"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synchroniz. e-mail"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synchr. e-mail pre tento účet"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrovať"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"Počet výsledkov z webu <xliff:g id="DOMAIN">%2$s</xliff:g>: <xliff:g id="RESULTS">%1$d</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Nastavenia"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Všeobecné"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Všeobecné nastavenia"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Aplikácia"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Automatický prechod"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Zvoľte obrazovku, ktorá sa zobrazí po odstránení správy"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Skryť začiarkavacie políčka"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"V zozname správ urobte výber dotknutím sa a podržaním"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Pred odstránením potvrdiť"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Správy"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Pred odoslaním potvrdiť"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Správy"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Pokračovať do"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Novšia správa"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Staršia správa"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Čakanie na výsledky"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Niektorým serverom môže tento proces trvať dlho."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Priečinky"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Zakázať použitie fotoaparátu zariadenia"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Vyžadovať heslo zariadenia"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Obmedziť opak. použitie nedávnych hesiel"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Vyžadovať časovo obmedz. platnosť hesiel"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Uzamk. obrazovky nečinného zariadenia"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Obmedziť počet synchroniz. udalostí kalendára"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Obmedziť počet synchronizovaných e-mailov"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Ďakujeme!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"To znie dobre!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Prečítam si to neskôr a dám vám vedieť."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Dohodnime si schôdzku a prediskutujme to."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Synchronizácia na pozadí je pre tento účet v roamingu zakázaná."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Prebieha odosielanie odpovede..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Žiadne správy."</string>
</resources>
diff --git a/res/values-sk/uploader.xml b/res/values-sk/uploader.xml
index ffbdfd627..a12915af4 100644
--- a/res/values-sk/uploader.xml
+++ b/res/values-sk/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Skryť podrobnosti"</string>
<string name="menu_settings" msgid="5088116127086866634">"Nastavenia"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Odovzdané: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Účet"</string>
<string name="upload" msgid="2615541458361216022">"Odovzdať"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 79fe3a6ef..a093a0001 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Branje e-poštnih prilog"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Programu omogoča branje e-poštnih prilog."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Dovoli temu programu branje e-poštnih prilog."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Dostop do podatkov e-poštnega ponudnika"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Temu programu omogoča dostop do vaše e-poštne podatkovne zbirke, vključno s prejetimi in poslanimi sporočili, uporabniškimi imeni in gesli."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Programu omogoča dostop do vaše e-poštne zbirke podatkov, vključno s prejetimi in poslanimi sporočili, uporabniškimi imeni in gesli."</string>
<string name="app_name" msgid="5815426892327290362">"E-pošta"</string>
<string name="compose_title" msgid="427986915662706899">"Novo"</string>
<string name="debug_title" msgid="5175710493691536719">"Odpravljanje napak"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Dokončano"</string>
<string name="create_action" msgid="3062715563215392251">"Ustvari nov"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Izbriši"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Ni hitrih odzivov"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Ni hitrih odzivov."</string>
<string name="discard_action" msgid="6532206074859505968">"Zavrzi"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Shrani osnutek"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Vstavi hiter odgovor"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Iskanje"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Nastavitve računa"</string>
<string name="settings_action" msgid="6334807007967459412">"Nastavitve"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Možnosti sinhronizacije"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Možnosti sinhronizacije"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Označi kot neprebrano"</string>
<string name="move_action" msgid="3059189775933985898">"Premakni"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Kp/Skp"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> je napisal:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Vključite citirano besedilo"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Vključi besedilo"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Dodati morate vsaj enega prejemnika."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Dodajte vsaj enega prejemnika."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Nekateri e-poštni naslovi niso veljavni."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Datoteke ni mogoče pripeti, ker je prevelika."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Vstavi hiter odgovor"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Shranjeno"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Ustavi"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Priloga je shranjena kot <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Priloge ni bilo mogoče shraniti."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Opomba: Ena ali več prilog v posredovanem sporočilu bo pred pošiljanjem prenesena iz strežnika."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Priloge ni mogoče shraniti."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Ena ali več prilog v posredovanem sporočilu bo pred pošiljanjem prenesena iz strežnika."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Sporočilo"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Povabi"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Ene ali več prilog ni bilo mogoče posredovati."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Priloga ni bila posredovana"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Prijava v račun <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ni uspela."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Prijava v <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ni uspela."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Prijava ni uspela"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Starejše"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Nastavitev računa"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Dodaj račun Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Dodaj račun Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"E-poštni račun"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"E-pošto lahko za večino računov nastavite z le nekaj koraki."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Račun za Exchange lahko nastavite v nekaj korakih."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Za nastavitev računa za Exchange ActiveSync je potrebno le nekaj korakov."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Račun lahko ustvarite v nekaj korakih."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-poštni naslov"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Geslo"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Privzeto pošiljaj e-pošto iz tega računa"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Privzeto pošiljaj e-pošto iz tega računa"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ročna nastavitev"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Vnesite veljaven e-poštni naslov in geslo."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Podvojeni račun"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Preverjanje nastavitev strežnika za dohodno pošto..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Preverjanje nastavitev strežnika za odhodno pošto..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Nastavitev računa"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Vaš račun je nastavljen, e-pošta je na poti."</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Vaš račun je pripravljen in e-pošta je poslana."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Poimenujte račun (neobvezno)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Vaše ime (prikazano v odhodnih sporočilih)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"To polje ne sme biti prazno."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Nastavitve strežnika za dohodno pošto"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Uporabniško ime"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Geslo"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Strežnik POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Strežnik IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Strežnik"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Vrata"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Vrsta varnosti"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Brez"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Strežnik SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Vrata"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Vrsta varnosti"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Potrebna je prijava."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Zahtevaj prijavo"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Uporabniško ime"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Geslo"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Nastavitev računa"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Vsakih 15 minut"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Vsakih 30 minut"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Vsako uro"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Privzeto pošiljaj e-pošto iz tega računa"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Obvesti me, ko prispe e-pošta"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sinhroniziraj stike iz tega računa."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sinhroniziraj koledar iz tega računa"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sinhroniziraj e-pošto iz tega računa"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Privzeto pošiljaj e-pošto iz tega računa"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Obvesti me o novi e-pošti"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Sinhroniziraj stike iz tega računa"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Sinhroniziraj koledar iz tega računa"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Sinhroniziraj e-pošto iz tega računa"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Samodejni prenos prilog, ko je na voljo povezava Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Ni mogoče končati"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dnevi za sinhronizacijo"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"En mesec"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Vse"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Uporabi privzeto v računu"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Nepravilno uporabniško ime ali geslo."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Nepravilno uporabniško ime ali geslo."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Uporabniško ime ali geslo ni pravilno."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Uporabniško ime ali geslo ni pravilno."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"S strežnikom se ni mogoče varno povezati."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"S strežnikom se ni bilo mogoče varno povezati."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Potrebujete potrdilo odjemalca. Želite povezavo s strežnikom vzpostaviti s potrdilom odjemalca?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Potrdilo je neveljavno ali nedostopno."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Strežnik je odgovoril z napako. Preverite uporabniško ime in geslo in poskusite znova."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Potrebno je potrdilo odjemalca. Ali se želite povezati s strežnikom s potrdilom odjemalca?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Potrdilo ni veljavno ali na voljo."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Strežnik je odgovoril z napako. Preverite uporabniško ime in geslo in poskusite znova."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Ni se mogoče povezati s strežnikom."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"S strežnikom se ni mogoče povezati."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"Zahtevan je bil TLS, vendar ga strežnik ne podpira."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"Opozorilo: Če onemogočite pravico e-poštnega programa za upravljanja naprave, boste izbrisali vse e-poštne račune, ki jo potrebujejo, skupaj z e-pošto, stiki, dogodki koledarja in drugimi podatki."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Varnostna posodobitev"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Za račun <xliff:g id="ACCOUNT">%s</xliff:g> morate posodobiti varnostne nastavitve."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Varnostne nastavitve računa »<xliff:g id="ACCOUNT">%s</xliff:g>« je treba posodobiti."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Potrebna je varnostna posodobitev"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Računa »<xliff:g id="ACCOUNT">%s</xliff:g>« zaradi varnostnih zahtev ni mogoče sinhronizirati."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Varnostne nastavitve za račun »<xliff:g id="ACCOUNT">%s</xliff:g>« je potrebno posodobiti."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Varnostne nastavitve za račun »<xliff:g id="ACCOUNT">%s</xliff:g>« so bile spremenjene. Uporabniku ni treba storiti nič."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Potrebna je varn. posodobitev"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Varn. pravilnik je spremenjen"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Ne ustreza varn. pravilnikom"</string>
<string name="account_security_title" msgid="3511543138560418587">"Varnost naprave"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Strežniku <xliff:g id="SERVER">%s</xliff:g> morate dovoliti, da na daljavo nadzira nekatere varnostne funkcije vaše naprave Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Urejanje podrobnosti"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"PIN ali geslo za zaklepanje zaslona sta potekla."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Geslo za zaklepanje zaslona je poteklo"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Geslo za zaklepanje zaslona bo poteklo"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"PIN ali geslo za zaklepanje zaslona morate kmalu spremeniti, sicer bodo podatki za <xliff:g id="ACCOUNT">%s</xliff:g> izbrisani. Ga želite spremeniti zdaj?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Čim prej spremenite PIN ali geslo za zaklepanje zaslona, sicer bodo podatki za <xliff:g id="ACCOUNT">%s</xliff:g> izbrisani. Ali ga želite spremeniti zdaj?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Geslo za zaklepanje zaslona je poteklo"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Podatki za <xliff:g id="ACCOUNT">%s</xliff:g> se brišejo iz naprave. Lahko jih obnovite tako, da spremenite PIN ali geslo za zaklepanje zaslona. Ga želite spremeniti?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Podatki za <xliff:g id="ACCOUNT">%s</xliff:g> bodo izbrisani iz naprave. Če jih želite obnoviti, spremenite PIN ali geslo za zaklepanje zaslona. Ali ga želite spremeniti zdaj?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Želite zavreči neshranjene spremembe?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Prijava ni uspela"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Uporabniško ime ali geslo za <xliff:g id="ACCOUNT">%s</xliff:g> je napačno. Ali ju želite posodobiti?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Ime ali geslo za <xliff:g id="ACCOUNT">%s</xliff:g> ni pravilno. Ali ga želite posodobiti zdaj?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Privzeti račun"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Privzeto pošiljaj e-pošto iz tega računa"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Prenesi priloge"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Samodejni prenos prilog k nedavnim sporočilom s povezavo Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"E-poštna obvestila"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Pogostost sinhronizacije, obvestila itd."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Ko pride e-pošta, obvesti v sistemski vrstici"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Pošlji obvestilo o novi e-pošti"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Pogostost preverjanja mape »Prejeto«"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Nastavitve dohodne pošte"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Uporabniško ime, geslo in druge nastavitve dohodnega strežnika"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Nastavitve odhodne pošte"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Uporabniško ime, geslo in druge nastavitve odhodnega strežnika"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Pravilniki so uveljavljeni"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Brez"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Nepodprti pravilniki"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Brez"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Poskusi sinhronizacijo"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Za sinhronizacijo računa se dotaknite tukaj"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Ime računa"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Vaše ime"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Podpis"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Hitri odgovori"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Uredite besedilo, ki ga pogosto vstavite, ko sestavljate e-pošto"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Uredite besedilo, ki ga pogosto vstavite v e-pošto"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Pripni besedilo k poslanim sporočilom"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Nastavitve obvestil"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Uporaba podatkov"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Varnostni pravilniki"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Uredi hiter odgovor"</string>
<string name="save_action" msgid="1988862706623227093">"Shrani"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sinhroniziranje stikov"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sinhroniziraj stike za ta račun"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sinhroniziraj koledar"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sinhroniziraj koledar za ta račun"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sinhroniziraj koledar"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sinhr. dogodek iz kol. za ta račun"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Sinhroniz. e-pošte"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sinhroniziraj e-pošto za ta račun"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibriranje"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> rezultatov iz <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Nastavitve"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Splošno"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Splošne nastavitve"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Program"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Samodejno napredovanje"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Izberite, kateri zaslon naj se prikaže po brisanju sporočila"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Skrij potrditvena polja"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Na seznamu sporočil se dotaknite želenega in ga pridržite, da ga izberete"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Potrditev pred brisanjem"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Sporočila"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Potrditev pred pošiljanjem"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Sporočila"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Naprej do"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Novejša sporočila"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Starejše sporočilo"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Čakanje na rezultate"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Odziv nekaterih strežnikov je lahko počasen."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mape"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Ne dovoli uporabe kamere naprave"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Zahtevaj geslo naprave"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Omeji vnovično uporabo nedavnih gesel"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Zahtevaj, da gesla potečejo"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Zahtevaj, da nedej. napr. zaklene zaslon"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Omejitev števila sinhroniziranih koledarskih dogodkov"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Omejitev števila sinhroniziranih e-poštnih sporočil"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Hvala!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Velja!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Trenutno nimam časa. Odgovorim pozneje."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Skličimo sestanek in se pogovorimo."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Sinhronizacija v ozadju je za ta račun med gostovanjem onemogočena."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Pošiljanje odgovora ..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Ni sporočil."</string>
</resources>
diff --git a/res/values-sl/uploader.xml b/res/values-sl/uploader.xml
index d7b659175..0e6e81344 100644
--- a/res/values-sl/uploader.xml
+++ b/res/values-sl/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Skrij podrobnosti"</string>
<string name="menu_settings" msgid="5088116127086866634">"Nastavitve"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Preneseno: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Račun"</string>
<string name="upload" msgid="2615541458361216022">"Prenesi"</string>
<string name="ok" msgid="2516349681897895312">"V redu"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 6f62415d4..5c102b53d 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Читање прилога из порука е-поште"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Омогућава овој апликацији да чита прилоге у порукама е-поште."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Омогућава апликацији да чита прилоге у порукама е-поште."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Приступ подацима о добављачу е-поште"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Омогућава овој апликацији да приступа бази података е-поште, укључујући примљене поруке, послате поруке, корисничка имена и лозинке."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Омогућава да ова апликација приступа бази података е-поште, укључујући примљене поруке, послате поруке, корисничка имена и лозинке."</string>
<string name="app_name" msgid="5815426892327290362">"Пошаљи е-поштом"</string>
<string name="compose_title" msgid="427986915662706899">"Нова порука"</string>
<string name="debug_title" msgid="5175710493691536719">"Отклањање грешака"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Готово"</string>
<string name="create_action" msgid="3062715563215392251">"Направи нови"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Избриши"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Нема брзих одговора"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Нема брзих одговора."</string>
<string name="discard_action" msgid="6532206074859505968">"Одбаци"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Сачувај недов. пор."</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Уметни брзи одговор"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Претрага"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Подешавања налога"</string>
<string name="settings_action" msgid="6334807007967459412">"Подешавања"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Опције синхронизације"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Опције синхронизације"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Означи као непрочитано"</string>
<string name="move_action" msgid="3059189775933985898">"Премести"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> је написао/ла:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Уврсти наведени текст"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Укључи текст"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Потребно је да додате бар једног примаоца."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Додајте најмање једног примаоца."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Поједине адресе е-поште су неважеће."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Датотека је превелика за прилог."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Уметање брзих одговора"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Сачувано"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Заустави"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Прилог је сачуван као <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Није могуће сачувати прилог."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Напомена: неки од прилога у прослеђеној поруци ће бити преузети пре слања."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Није могуће сачувати прилог."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Неки од прилога у прослеђеној поруци ће бити преузети пре слања."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Порука"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Позови"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Није могуће проследити један или више прилога."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Прилог није прослеђен"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Пријављивање на налог <xliff:g id="ACCOUNT_NAME">%s</xliff:g> није успело."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Пријављивање на налог <xliff:g id="ACCOUNT_NAME">%s</xliff:g> није успело."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Пријављивање није могуће"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Старије"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Подешавање налога"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Додавање Exchange налога"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Додајте Exchange ActiveSync налог"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Налог е-поште"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Можете да подесите е-пошту за већину налога у свега неколико корака."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Можете да подесите Exchange налог у свега неколико корака."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Можете да подесите Exchange ActiveSync налог у свега неколико корака."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Можете да подесите налог у свега неколико корака."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Адреса е-поште"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Лозинка"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Подразумевано шаљи поруке е-поште са овог налога."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Подразумевано шаљи е-пошту са овог налога"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ручно подешавање"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Унесите важећу адресу е-поште и лозинку."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Дуплирани налог"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"У току је провера подешавања сервера за долазну пошту…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"У току је провера подешавања одлазног сервера…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Подешавање налога"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Налог је подешен и е-пошта стиже!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Налог је подешен и е-пошта стиже!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Именујте овај налог (опционално)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Ваше име (приказано у одлазним порукама)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Ово поље не сме да буде празно."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Подешавања сервера за долазну пошту"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Корисничко име"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Лозинка"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3 сервер"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP сервер"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Сервер"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Порт"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Тип безбедности"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ништа"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP сервер"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Порт"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Тип безбедности"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Захтева пријављивање."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Захтевај пријављивање"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Корисничко име"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Лозинка"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Подешавање налога"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Сваких 15 минута"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Сваких 30 минута"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"На сваких сат времена"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Подразумевано шаљи поруке е-поште са овог налога."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Обавести ме о пријему поруке е-поште."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Синхронизуј контакте са овог налога."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Синхронизуј календар са овог налога."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Синхронизуј е-пошту са овог налога."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Подразумевано шаљи е-пошту са овог налога"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Обавести ме о пријему е-поште"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Синхронизуј контакте са овог налога"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Синхронизуј календар са овог налога"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Синхронизуј е-пошту са овог налога"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Аутоматски преузми прилоге када је успостављена веза са Wi-Fi мрежом"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Није могуће довршити"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Дани за синхронизацију"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Месец дана"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Све"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Користи подр. под. налога"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Корисничко име или лозинка нису тачни."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Корисничко име или лозинка нису тачни."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Корисничко име или лозинка су нетачни."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Корисничко име или лозинка нису тачни."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Безбедно повезивање са сервером није могуће."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Безбедно повезивање са сервером није могуће."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Потребан је сертификат клијента. Желите ли да се повежете са сервером помоћу сертификата клијента?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Сертификат је неважећи или недоступан."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Сервер је одговорио грешком. Проверите корисничко име и лозинку, а затим покушајте поново."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Сертификат клијента је обавезан. Да ли желите да се повежете са сервером са сертификатом клијента?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Сертификат је неважећи или недоступан."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Сервер је одговорио грешком. Проверите корисничко име и лозинку, а затим покушајте поново."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Повезивање са сервером није могуће."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Повезивање са сервером није могуће."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS је захтеван, али га сервер не подржава."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"УПОЗОРЕЊЕ: Деактивирањем овлашћења апликације Е-пошта за управљање уређајем избрисаћете све налоге е-поште који то·захтевају, заједно са адресом е-поште, контактима, догађајима календара и другим подацима."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Безбедносно ажурирање"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> захтева да ажурирате безбедносна подешавања."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Потребно је ажурирати безбедносна подешавања за налог „<xliff:g id="ACCOUNT">%s</xliff:g>“."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Потребно је безбедносно ажур."</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Налог „<xliff:g id="ACCOUNT">%s</xliff:g>“ не може да се синхронизује због безбедносних захтева."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Потребно је ажурирати безбедносна подешавања за налог „<xliff:g id="ACCOUNT">%s</xliff:g>“."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Промењена су безбедносна подешавања налога „<xliff:g id="ACCOUNT">%s</xliff:g>“; није потребна ниједна радња корисника."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Потребно је безбедн. ажурирање"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Безбедн. смернице су промењене"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Безбед. смернице нису испуњене"</string>
<string name="account_security_title" msgid="3511543138560418587">"Безбедност уређаја"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Сервер <xliff:g id="SERVER">%s</xliff:g> захтева да му омогућите удаљену контролу појединих безбедносних функција Android уређаја."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Измени детаље"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"PIN или лозинка за закључавање екрана су истекли."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Лозинка за екран је истекла"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Лозинка за закључавање екрана истиче"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Потребно је да ускоро промените PIN или лозинку за закључавање екрана или ће подаци за <xliff:g id="ACCOUNT">%s</xliff:g> бити избрисани. Желите ли да их промените сада?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Потребно је да ускоро промените PIN или лозинку за закључавање екрана или ће подаци за налог <xliff:g id="ACCOUNT">%s</xliff:g> бити избрисани. Да ли желите да их сада промените?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Лозинка за закључавање екрана је истекла"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Подаци за <xliff:g id="ACCOUNT">%s</xliff:g> се бришу са уређаја. Можете да их вратите уколико промените PIN или лозинку за закључавање екрана. Желите ли да их промените сада?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Подаци за налог <xliff:g id="ACCOUNT">%s</xliff:g> се бришу са уређаја. Можете да их вратите ако промените PIN или лозинку за закључавање екрана. Желите ли да их промените сада?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Желите ли да одбаците несачуване промене?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Пријављивање није могуће"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Корисничко име или лозинка за <xliff:g id="ACCOUNT">%s</xliff:g> су нетачни. Желите ли да их ажурирате сада?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Корисничко име или лозинка за налог <xliff:g id="ACCOUNT">%s</xliff:g> нису тачни. Да ли желите да их ажурирате сада?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Подразумевани налог"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Подразумевано шаљи поруке е-поште са овог налога"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Преузми прилоге"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Аутоматско преузимање прилога за недавне поруке преко Wi-Fi-ја"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Обавештења е-поштом"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Синхронизација учесталости, обавештења итд."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Обавештавање на системској траци када стигне порука е-поште"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Пошаљи обавештење када стигне е-пошта"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Учесталост провере пријемног сандучета"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Подешавања долазећих"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Корисничко име, лозинка и друга подешавања серв. долазне поште"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Подешавања одлазних"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Корисничко име, лозинка и друга подешавања серв. одлазне поште"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Примењене смернице"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Ниједно"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Неподржане смернице"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Ниједно"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Покушај да синхронизујеш"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Додирните овде да бисте синхронизовали налог"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Име налога"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Ваше име"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Потпис"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Брзи одговори"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Измените текст који често умећете при писању порука е-поште"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Измените текст који често умећете при писању е-поште"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Додајте текст порукама које шаљете"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Подешавања обавештења"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Коришћење података"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Безбедносне смернице"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Измена брзог одговора"</string>
<string name="save_action" msgid="1988862706623227093">"Сачувај"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Синхронизација контаката"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Синхронизуј контакте за овај налог"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Синхронизуј календар"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Синхронизуј календар за овај налог"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Синхронизација календара"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Синхр. дог. календара за овај налог"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Синхронизуј е-пошту"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Синхронизуј е-пошту за овај налог"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Вибрација"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> резултата са домена <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Подешавања"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Опште"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Општа подешавања"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Апликација"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Аутоматски пређи"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Избор екрана који желите да прикажете након брисања поруке"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Сакриј поља за потврду"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"На листама порука додирните и задржите да бисте изабрали"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Потврди пре брисања"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Поруке"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Потврди пре слања"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Поруке"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Пређи на"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Новија порука"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Старија порука"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Чека се на резултате"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Неким серверима је потребно доста времена."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Директоријуми"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Онемогући коришћење камере уређаја"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Захтевај лозинку за уређај"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Ограничи пон. коришћење недавних лозинки"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Захтевај да лозинке истекну"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Захтевај неакт. уређај за закљ. екрана"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Ограничи број синхронизованих догађаја календара"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Ограничи број синхронизованих порука е-поште"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Хвала!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Добра идеја!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Прочитаћу ово касније и јавити вам."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Хајде да организујемо састанак како бисмо о овоме разговарали."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Синхронизација у позадини за овај налог је онемогућена у ромингу."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Слање одговора..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Нема порука."</string>
</resources>
diff --git a/res/values-sr/uploader.xml b/res/values-sr/uploader.xml
index 43f162d7a..752d7d033 100644
--- a/res/values-sr/uploader.xml
+++ b/res/values-sr/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Сакриј детаље"</string>
<string name="menu_settings" msgid="5088116127086866634">"Подешавања"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Отпремљено %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Налог"</string>
<string name="upload" msgid="2615541458361216022">"Отпреми"</string>
<string name="ok" msgid="2516349681897895312">"Потврди"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 0df8f2b0b..ad491cae1 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Läs bilagor i e-postmeddelanden"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Tillåter att appen läser bilagor i e-postmeddelanden."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Tillåter att appen läser bilagor i e-postmeddelanden."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Använd data från e-postleverantören"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Tillåter att appen kommer åt e-postdatabasen med bland annat mottagna meddelanden, skickade meddelanden, användarnamn och lösenord."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Tillåter att appen kommer åt e-postdatabasen med bland annat mottagna meddelanden, skickade meddelanden, användarnamn och lösenord."</string>
<string name="app_name" msgid="5815426892327290362">"E-post"</string>
<string name="compose_title" msgid="427986915662706899">"Skriv"</string>
<string name="debug_title" msgid="5175710493691536719">"Felsökning"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Klar"</string>
<string name="create_action" msgid="3062715563215392251">"Skapa nytt"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Ta bort"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Inga snabba svar"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Inga snabba svar."</string>
<string name="discard_action" msgid="6532206074859505968">"Släng"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Spara utkast"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Infoga snabbsvar"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Sök"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Kontoinställningar"</string>
<string name="settings_action" msgid="6334807007967459412">"Inställningar"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Synkroniseringsalternativ"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Synkroniseringsalternativ"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Markera som oläst"</string>
<string name="move_action" msgid="3059189775933985898">"Flytta"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+kopia/heml kop"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> skrev:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Inkludera citerad text"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Inkludera text"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Du måste lägga till minst en mottagare."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Lägg till minst en mottagare."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Några av e-postadresserna är ogiltiga."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Filen är för stor för att bifogas."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Infoga snabbsvar"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Sparad"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Stoppa"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Bilagan har sparats som <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Det gick inte att spara bilagan."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Obs! En eller flera bilagor i det vidarebefordrade meddelandet hämtas innan de skickas."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Kunde inte spara bilagan."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"En eller flera bilagor i det vidarebefordrade meddelandet hämtas innan de skickas."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Meddelande"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Bjud in"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Det gick inte att vidarebefordra en eller flera bilagor."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Bilagan vidarebefordrades inte"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Inloggning på <xliff:g id="ACCOUNT_NAME">%s</xliff:g> misslyckades."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Det gick inte att logga in <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Det gick inte att logga in."</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Äldre"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Kontoinställningar"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Lägg till ett Exchange-konto"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Lägg till ett Exchange ActiveSync-konto"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"E-postkonto"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Du kan konfigurera e-post för de flesta konton med några få steg."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Du kan konfigurera ett Exchange-konto med några få steg."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Du kan konfigurera ett Exchange ActiveSync-konto med några få steg."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Du kan konfigurera ditt konto med några få steg."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-postadress"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Lösenord"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Skicka e-post från det här kontot som standard"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Skicka e-post från det här kontot som standard"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuell inställning"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Ange en giltig e-postadress och lösenord."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Dubblettkonto"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Kontrollerar inkommande serverinställningar…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Kontrollerar utgående serverinställningar…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Kontoinställningar"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Ditt konto är färdigt och snart kan du skicka och ta emot e-postmeddelanden."</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Ditt konto är färdigt och snart kan du skicka och ta emot e-postmeddelanden."</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Ge kontot ett namn (valfritt)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Ditt namn (visas för utgående meddelanden)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Fältet får inte vara tomt."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Inkommande serverinställningar"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Användarnamn"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Lösenord"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3-server"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP-server"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Säkerhetstyp"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Ingen"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP-server"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Säkerhetstyp"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Kräv inloggning"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Kräv inloggning"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Användarnamn"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Lösenord"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Kontoinställningar"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Var 15:e minut"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Var 30:e minut"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Varje timme"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Skicka e-post från det här kontot som standard"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Meddela mig när jag får e-post"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Synkronisera kontakter från det här kontot."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Synkronisera kalendrar från det här kontot."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Synkronisera e-post från det här kontot."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Skicka e-post från det här kontot som standard"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Meddela mig när jag får e-post"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Synkronisera kontakter från det här kontot"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Synkronisera kalendern från det här kontot"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Synkronisera e-post från det här kontot"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Hämta bilagor automatiskt när enheten är ansluten till Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Det gick inte att avsluta"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Dagar för synkronisering"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"En månad"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Alla"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Använd standardinställning"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Fel användarnamn eller lösenord."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Fel användarnamn eller lösenord."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Användarnamnet eller lösenordet är felaktigt."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Felaktigt användarnamn eller lösenord."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Det går inte att upprätta en säker anslutning till servern."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Det går inte att upprätta en säker anslutning till servern."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Klientcertifikat krävs. Vill du ansluta till servern med klientcertifikatet?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Certifikatet är ogiltigt eller otillgängligt."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Servern svarade med ett fel. Kontrollera ditt användarnamn och lösenord och försök igen."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Ett klientcertifikat måste anges. Vill du ansluta till servern med ett klientcertifikat?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Certifikatet är ogiltigt eller otillgängligt."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Servern svarade med ett fel. Kontrollera ditt användarnamn och lösenord och försök igen."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Det går inte att ansluta till servern."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Det går inte att ansluta till servern."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS krävs men stöds inte av servern."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"VARNING! Om du inaktiverar e-postappens behörighet att administrera enheten raderas alla e-postkonton som behöver behörigheten. Även e-post, kontakter, kalenderhändelser och andra data raderas."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Säkerhetsuppdatering"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Enligt <xliff:g id="ACCOUNT">%s</xliff:g> måste du uppdatera säkerhetsinställningarna."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Kontot \"<xliff:g id="ACCOUNT">%s</xliff:g>\" kräver att säkerhetsinställningarna uppdateras."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Säkerhetsuppdatering krävs"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Det går inte att synkronisera kontot <xliff:g id="ACCOUNT">%s</xliff:g> på grund av säkerhetskrav."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Säkerhetsinställningarna måste uppdateras för kontot <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Säkerhetsinställningarna ändrades för kontot <xliff:g id="ACCOUNT">%s</xliff:g>. Inga åtgärder krävs från användaren."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Säkerhetsuppdatering krävs"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Säkerhetspolicyer har ändrats"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Säkerhetspolicy kan ej följas"</string>
<string name="account_security_title" msgid="3511543138560418587">"Säkerhet för enhet"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Servern <xliff:g id="SERVER">%s</xliff:g> måste kunna fjärrkontrollera vissa säkerhetsfunktioner i din Android-enhet."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Redigera information"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"PIN-koden eller lösenordet till skärmlåset har gått ut."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Skärmlösenordet har gått ut"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Skärmlåslösenordet går ut inom kort"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Om du inte ändrar PIN-kod eller lösenord till skärmlåset inom kort raderas alla data för <xliff:g id="ACCOUNT">%s</xliff:g>. Vill du göra det nu?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Du måste ändra PIN-kod eller lösenord för skärmlåset snart, annars raderas data för kontot <xliff:g id="ACCOUNT">%s</xliff:g>. Vill du ändra nu?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Skärmlåslösenordet har gått ut"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Alla data för <xliff:g id="ACCOUNT">%s</xliff:g> tas bort från enheten. Du kan återställa dem genom att ändra PIN-koden eller lösenordet till skärmlåset. Vill du göra det nu?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Alla data för <xliff:g id="ACCOUNT">%s</xliff:g> tas bort från enheten. Du kan återställa dem genom att ändra PIN-koden eller lösenordet för skärmlåset. Vill du göra det nu?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Vill du ignorera ändringar som inte har sparats?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Det gick inte att logga in."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Du har angett ett felaktigt användarnamn eller lösenord for <xliff:g id="ACCOUNT">%s</xliff:g>. Vill du uppdatera dem nu?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Användarnamnet eller lösenordet för <xliff:g id="ACCOUNT">%s</xliff:g> är felaktigt. Vill du uppdatera dem nu?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Standardkonto"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Skicka e-post från det här kontot som standard"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Hämta bilagor"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Hämta automatiskt bilagor för de senaste meddelandena via Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"E-postaviseringar"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Synkroniseringsfrekvens, aviseringar osv."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Avisera i systemfältet vid e-postmeddelande"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Skicka meddelande när du får e-post"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Intervall för e-postkontroll"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Inkommande inställningar"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Användarnamn, lösenord och andra inkommande serverinställningar"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Utgående inställningar"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Användarnamn, lösenord och andra utgående serverinställningar"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Verkställda policyer"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Inga"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Policyer som inte stöds"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Inga"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Synkroniseringsförsök"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Tryck här för att synkronisera kontot"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Kontonamn"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Ditt namn"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Signatur"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Snabbsvar"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Redigera text som du ofta infogar när du skriver e-post"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Redigera text som du ofta infogar när du skriver e-post"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Lägg till text i meddelanden som du skickar"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Meddelandeinställningar"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Dataanvändning"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Säkerhetspolicyer"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Redigera snabbsvar"</string>
<string name="save_action" msgid="1988862706623227093">"Spara"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Synkronisera kontakter"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Synkronisera kontakter för det här kontot"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Synkronisera kalender"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Synkronisera kalendern för det här kontot"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Synkronisera kalender"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Synka kalenderhändelse för kontot"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Synkronisera e-post"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Synkronisera e-post för det här kontot"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Vibrera"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> resultat från <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Inställningar"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Allmänt"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Allmänna inställningar"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"App"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Flytta automatiskt"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Välj vilken skärm som ska visas när du tar bort ett meddelande"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Dölj kryssrutor"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"I samtalslistan trycker du länge om du vill markera"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Bekräfta innan du tar bort"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Meddelanden"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Bekräfta innan du skickar"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Meddelanden"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Flytta till"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Nyare meddelande"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Äldre meddelande"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Väntar på resultat"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Vissa servrar kan ta lång tid."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mappar"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Tillåt inte användning av kameran"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Kräv lösenord för enheten"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Begränsa återanvändning av lösenord"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Kräv att lösenord upphör att gälla"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Kräv låst skärm på inaktiva enheter"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Begränsa antalet kalenderhändelser som synkas"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Begränsa antalet e-postmeddelanden som synkas"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Tack!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Låter bra!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Jag läser detta senare och återkommer till dig."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Vi kan diskutera detta på ett möte."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Bakgrundssynkronisering för det här kontot har inaktiverats vid roaming."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Svaret skickas ..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Inga meddelanden."</string>
</resources>
diff --git a/res/values-sv/uploader.xml b/res/values-sv/uploader.xml
index af8cfcb6f..f3b3b1ee7 100644
--- a/res/values-sv/uploader.xml
+++ b/res/values-sv/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Dölj detaljer"</string>
<string name="menu_settings" msgid="5088116127086866634">"Inställningar"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Överförde %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Konto"</string>
<string name="upload" msgid="2615541458361216022">"Överför"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index d222eac17..76008819b 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Soma viambatisho vya barua pepe"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Inaruhusu programu hii kusoma viambatisho vyako vya barua pepe."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Inaruhusu programu kusoma viambatisho vya barua pepe yako."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Fikia data ya mtoa huduma wa barua pepe"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Huruhusu programu hii kufikia hifadhidata yako ya barua pepe, pamoja na ujumbe uliopokewa, ujumbe uliotumwa, majina ya mtumiaji na nenosiri."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Inaruhusu programu hii kufikia hifadhidata yako ya barua pepe, ikiwa ni pamoja na jumbe zilizopokewa, jumbe zilizotumwa, majina ya mtumiaji na manenosiri."</string>
<string name="app_name" msgid="5815426892327290362">"Barua pepe"</string>
<string name="compose_title" msgid="427986915662706899">"Tunga"</string>
<string name="debug_title" msgid="5175710493691536719">"Tatua"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Kwisha"</string>
<string name="create_action" msgid="3062715563215392251">"Unda mpya"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Futa"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Hakuna majibu ya haraka"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Hakuna majibu ya haraka."</string>
<string name="discard_action" msgid="6532206074859505968">"Tupa"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Hifadhi rasimu"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Ingiza jibu la haraka"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Tafuta"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Mipangilio ya akaunti"</string>
<string name="settings_action" msgid="6334807007967459412">"Mipangilio"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Chaguo za kusawazisha"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Chaguo za ulandanishi"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Tia alama kuwa haijasomwa"</string>
<string name="move_action" msgid="3059189775933985898">"Hamisha"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Nakala kwa/Nakala fiche kwa"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> aliandika:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Jumuisha maandishi yaliyonukuliwa"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Jumuisha maandishi"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Ni lazima uongeze angalau mpokeaji mmoja"</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Ongeza angalau mpokeaji mmoja."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Anwani zingine za barua pepe ni batili."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Faili ni kubwa sana kuambatishwa."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Ingiza majibu ya haraka"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Imehifadhiwa"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Simamisha"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Kiambatisho kimehifadhiwa kama <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Haikuweza kuhifadhi kiambatisho."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Zingatia: Moja au zaidi ya viambatisho katika ujumbe wako uliosambazwa vitapakuliwa kabla ya kutumwa."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Haikuweza kuhifadhi kiambatisho."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Kiambatisho kimoja au zaidi katika ujumbe wako uliosambazwa kitapakuliwa kabla ya kutumwa."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Ujumbe"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Alika"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Haikuweza kusambaza kiambatisho kimoja au zaidi."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Kiambatishho hakijasambazwa"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> ilishindwa kuingia."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Kuingia <xliff:g id="ACCOUNT_NAME">%s</xliff:g> hakujafaulu."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Haingeweza kuingia"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"B <xliff:g id="SIZE_IN_BYTES">%d</xliff:g>"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Nzee zaidi"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Usanidi wa akaunti"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Ongeza akaunti ya Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Ongeza akaunti ya Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Akaunti ya barua pepe"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Unaweza kusanidi barua pepe ya akaunti nyingi kwa hatua chache tu."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Unaweza kusanidi akaunti ya Exchange kwa hatua chache tu."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Unaweza kusanidi akaunti ya Exchange ActiveSync kwa hatua chache tu."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Unaweza kusanidi akaunti yako katika hatua chache tu."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Anwani ya barua pepe"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Nenosiri"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Tuma barua pepe kutoka kwa akaunti hii kama chaguo-msingi"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Tuma barua pepe kutoka kwa akaunti hii kama chaguo-msingi"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Usanidi wa mkono"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Tafadhali andika anwani na nenosiri halali ya barua pepe."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Akaunti Rudufu"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Inakagua mipangilio ya seva inayoingia..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Inakagua mipangilio ya seva inayotoka nje..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Usanidi wa akaunti"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Akaunti yako imesanidiwa, na barua pepe iko njiani!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Akaunti yako imesanidiwa, na barua pepe iko njiani!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Ipe akaunti hii jina (ya hiari)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Jina lako (linaloonyeshwa kwenye ujumbe unaotoka)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Uga hii haiwezi kuwa tupu."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Mipangilio ya seva ya kuingia"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Jina la mtumiaji"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Nenosiri"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Seva ya POP"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Seva ya IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Seva"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Mlango"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Aina ya usalama"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Hamna"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Seva ya SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Mlango"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Aina ya usalama"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Inahitaji uingie"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Inahitaji kuingia"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Jina la mtumiaji"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Nenosiri"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Usanidi wa akaunti"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Kila dakika 15"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Kila dakika 30"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Kila saa"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Tuma barua pepe kutoka kwa akaunti hii kama chaguo-msingi"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Niarifu wakati barua pepe inpoingia"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Sawazisha anwani kutoka kwa akaunti hii."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Sawazisha kalenda kutoka kwa akaunti hii."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Sawazisha barua pepe kutoka kwa akaunti hii."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Tuma barua pepe kutoka kwa akaunti hii kama chaguo-msingi"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Niarifu wakati barua pepe inapowasili"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Landanisha anwani kutoka kwa akaunti hii"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Landanisha kalenda kutoka kwa akaunti hii"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Landanisha barua pepe kutoka kwa akaunti hii"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Pakua viambatisho kiotomatiki wakati umeunganishwa kwenye mtandao-hewa"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Imeshindwa kumaliza"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Siku hadi Usawazishaji"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Mwezi mmoja"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Zote"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Tumia akaunti chaguo-msingi"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Jina la mtumiaji na nenosiri sio sahihi."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Jina la mtumiaji au nenosiri sio sahihi."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Jina la mtumiaji au nenosiri sio sahihi."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Jina la mtumiaji au nenosiri si sahihi."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Haiwezi kuunganisha kwa seva kwa usalama."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Haiwezi kuunganisha kwa seva kwa usalama."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Cheti cha mteja kinahitajika. Unganisha kwa seva na cheti cha mteja?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Cheti ni batili au hakiwezi kufikiwa."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Seva iliitikia na hitilafu; Kagua jina lako la mtumiaji na nenosiri na ujaribu tena."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Cheti cha mteja kinahitajika. Je, unataka kuunganisha kwenye seva na cheti cha mteja?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Cheti ni batili au hakiwezi kufikiwa."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Seva ilijibu na hitilafu. Kagua jina lako la mtumiaji na nenosiri, kisha ujaribu tena."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Haiwezi kuunganisha kwa seva."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Haiwezi kuunganisha kwa seva."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS inahitajika lakini haihimiliwi na seva."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"ILANI: Kuamilishua kibali cha programu ya Barua pepe ili kudhibiti kifaa chako itafuta akaunti zote za Barua pepe ambazo zinakihitaji, pamoja na barua pepe zake, anwani, matukio ya kalenda, na data nyingine."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Usasisho wa usalama"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> inahitaji usasihe mipangilio yako ya usallama."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Akaunti \"<xliff:g id="ACCOUNT">%s</xliff:g>\" inahitaji kusasisha mipangilio ya usalama."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Uboreshaji wa usalama unahitajika"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Akaunti \"<xliff:g id="ACCOUNT">%s</xliff:g>\" haiwezi kulandanishwa kwa sababu ya mahitaji ya usalama."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Akaunti \"<xliff:g id="ACCOUNT">%s</xliff:g>\" inahitaji kusasisha mipangilio ya usalama."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Akaunti \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ilibadilisha mipangilio yakeya usalama; hakunahatuaya usalama inayohitajika."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Uboreshaji wa usalama unahitajika"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Sera za kiusalama zimebadilishwa"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Sera za kiusalama haziwezi kufikiwa"</string>
<string name="account_security_title" msgid="3511543138560418587">"Usalama wa kifaa"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Seva <xliff:g id="SERVER">%s</xliff:g>inahitaji uiruhusu kudhibiti kwa umbali baadhi ya vipengele vya usalama vya simu yako."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Hariri maelezo"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"PIN au nenosiri lako la kufunga skrini yako limekwisha muda."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Nenosiri la kufunga skrini limekwisha muda"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Nenosiri la kufunga skrini linaisha muda"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Lazima ubadilishe PIN yako ya skrini au nenosiri hivi karibuni, ama data ya <xliff:g id="ACCOUNT">%s</xliff:g> itafutwa. Ibadilishe saa hii?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Unahitaji kubadilisha PIN au nenosiri la kifungio skrini chako hivi karibuni, au data ya <xliff:g id="ACCOUNT">%s</xliff:g> itafutwa. Je, unataka kuibadilisha sasa?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Nenosiri la kufunga skrini limekwisha muda"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Data ya <xliff:g id="ACCOUNT">%s</xliff:g> inafutwa kutoka kwenye kifaa chako. Unaweza kuirejesha kwa kubadilisha PIN au nenosiri lako la kufunga skrini. Ibadilishe sasa?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Data ya <xliff:g id="ACCOUNT">%s</xliff:g> inafutwa kutoka kwenye kifaa chako. Unaweza kuirejesha kwa kubadilisha PIN au nenosiri lako la kifungio skrini. Unataka kuibadilisha sasa?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Tupa mabadiliko yasiyohifadhiwa?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Haingeweza kuinga ndani"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Jina la mtumiaji au nenosiri la <xliff:g id="ACCOUNT">%s</xliff:g> si sahihi. Yasasishe saa hii?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Jina la mtumiaji au nenosiri la <xliff:g id="ACCOUNT">%s</xliff:g> sio sahihi. Je, unataka kusasisha sasa hivi?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Akaunti chaguo-msingi"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Tuma barua pepe kutoka kwa akaunti hii kwa chaguo-msingi"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Pakua viambatisho"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Pakua-otomatiki viambatisho kwa ujumbe wa hivi karibuni kupitia Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Arifa za barua pepe"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Mara za kusawazisha, kutuma arifa, n.k."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Arifu katika upau wa hali barua pepe inapofika"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Tuma arifa wakati barua pepe inafika"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Mazoea ya kukagua kikasha"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Mipangilio inayoingia"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Jina la mtumiaji, nenosiri, na mipangilio mingine ya seva inayoingia"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Mipangilio ya kutoka"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Jina la mmtumiaji, neneosiri na mipangilio mingine ya seva ya kutoka."</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Sera zimetekelezwa"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Hamna"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Sera zisizokubaliwa"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Hamna"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Jaribu usawazishi"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Gusa hapa ili kulandanisha akaunti hii"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Jina la akaunti"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Jina lako"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Sahihi"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Majibu ya haraka"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Hariri maandishi unayoyaingiza mara kwa mara unapoandika barua pepe"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Hariri maandishi unayoyaingiza mara kwa mara unapoandika barua pepe"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Ambatisha maandishi kwa ujumbe unaotuma"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Mipangilio ya Arifa"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Matumizi ya data"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Sera za kiusalama"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Hariri majibu ya haraka"</string>
<string name="save_action" msgid="1988862706623227093">"Hifadhi"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Sawazisha anwani"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sawazisha anwani za akaunti hii"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sawazisha Kalenda"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Sawazisha kalenda ya akaunti hii"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Sawazisha kalenda"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Landanisha tukio la kalenda la akaunti hii"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Landanisha barua pepe"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Sawazisha barua pepe za akaunti hii"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Tetema"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> matokeo <xliff:g id="DOMAIN">%2$s</xliff:g> kutoka"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Mipangilio"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Kawaida"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Mipangilio ya kawaida"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Programu"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Kioto mahiri"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Chagua skrini gani ya kuonyesha baada ya kufuta ujumbe"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ficha visanduku tiki"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Katika orodha ya jumbe, gusa na ushikilie ili uchague"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Thibitisha kabla ya kufuta"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Jumbe"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Thibitisha kabla ya kutuma"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Jumbe"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Mahiri katika"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Ujumbe mpya zaidi"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Ujumbe mzee zaidi"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Inasubiri matokeo"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Seva zingine zinaweza kuchukua muda mrefu."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Folda"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Usiruhusu matumizi ya kamera ya kifaa"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Zinahitaji nenosiri la kifaa"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Zuia matumizi mapya ya nywila ya hivi karibuni"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Inahitaji nywila kumalizika"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Inahitaji kifaa bwete ili kufunga skrini yake"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Wekea kikomo idadi ya matukio ya kalenda yanayolandanishwa"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Wekea kikomo idadi ya barua pepe zinazolandanishwa"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Asante!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Iko sawa kwangu!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Nitasoma hii baadaye na nitawasiliana na wewe."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Tupange mkutano wa kujadili hii."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Ulandanishi wa mandharinyuma ya akaunti hii imelemazwa wakati wa kuzurura."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Inatuma majibu..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Hakuna ujumbe."</string>
</resources>
diff --git a/res/values-sw/uploader.xml b/res/values-sw/uploader.xml
index 9544b3e40..42789ca3e 100644
--- a/res/values-sw/uploader.xml
+++ b/res/values-sw/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Ficha Maelezo"</string>
<string name="menu_settings" msgid="5088116127086866634">"Mipangilio"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Imepakia %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"Kishika nafasi<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Akaunti"</string>
<string name="upload" msgid="2615541458361216022">"Pakia"</string>
<string name="ok" msgid="2516349681897895312">"Sawa"</string>
diff --git a/res/values-sw600dp-land/dimensions.xml b/res/values-sw600dp-land/dimensions.xml
deleted file mode 100644
index c6af0287a..000000000
--- a/res/values-sw600dp-land/dimensions.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- tablet, landscape -->
-<resources>
- <dimen name="message_compose_field_label_width">120dip</dimen>
-
- <!-- width of mailbox list -->
- <dimen name="mailbox_list_width">304dip</dimen>
- <!-- width of the message list, on the message list + message view mode. -->
- <dimen name="message_list_width">428dip</dimen>
-
- <dimen name="action_bar_account_name_max_width">256dip</dimen>
- <dimen name="action_bar_mailbox_name_left_margin">32dip</dimen>
- <dimen name="action_bar_mailbox_name_max_width">256dip</dimen>
-
- <dimen name="widget_senders_font_size">14sp</dimen>
- <dimen name="widget_subject_font_size">14sp</dimen>
- <dimen name="widget_date_font_size">14sp</dimen>
-
- <!-- Account Setup Activities -->
- <dimen name="setup_padding_top">16dip</dimen>
- <dimen name="setup_padding_left">64dip</dimen>
- <dimen name="setup_padding_right">64dip</dimen>
-
-</resources>
diff --git a/res/values-sw600dp-land/styles.xml b/res/values-sw600dp-land/styles.xml
deleted file mode 100644
index f7e094e9a..000000000
--- a/res/values-sw600dp-land/styles.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- tablet, landscape -->
-
-<resources>
- <!-- Use fixed width in landscape -->
- <style name="message_compose_scroll">
- <item name="android:layout_width">800dip</item>
- </style>
-</resources>
diff --git a/res/values-sw600dp-port/dimensions.xml b/res/values-sw600dp-port/dimensions.xml
index fb405f032..c7a8c6a65 100644
--- a/res/values-sw600dp-port/dimensions.xml
+++ b/res/values-sw600dp-port/dimensions.xml
@@ -15,23 +15,6 @@
-->
<resources>
- <dimen name="message_compose_field_label_width">120dip</dimen>
-
- <!-- width of mailbox list -->
- <dimen name="mailbox_list_width">206dip</dimen>
- <!--
- width of the message list, on the message list + message view mode.
- (i.e. on portrait, it's the "expanded" message list.)
- -->
- <dimen name="message_list_width">440dip</dimen>
-
- <dimen name="action_bar_account_name_max_width">128dip</dimen>
- <dimen name="action_bar_mailbox_name_left_margin">16dip</dimen>
- <dimen name="action_bar_mailbox_name_max_width">128dip</dimen>
-
- <dimen name="widget_senders_font_size">14sp</dimen>
- <dimen name="widget_subject_font_size">14sp</dimen>
- <dimen name="widget_date_font_size">14sp</dimen>
<!-- Account Setup Activities -->
<dimen name="setup_padding_top">32dip</dimen>
diff --git a/res/values-sw600dp-port/styles.xml b/res/values-sw600dp-port/styles.xml
deleted file mode 100644
index bd312d4b5..000000000
--- a/res/values-sw600dp-port/styles.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- tablet, portrait -->
-
-<resources>
- <!-- Use fixed margin in portrait -->
- <style name="message_compose_scroll">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_marginLeft">16dip</item>
- <item name="android:layout_marginRight">16dip</item>
- </style>
-
- <style name="accountSetupTypePrevious" parent="@style/accountSetupButton">
- <item name="android:layout_alignParentBottom">true</item>
- <item name="android:layout_alignParentLeft">true</item>
- <item name="android:layout_marginBottom">48dip</item>
- <item name="android:layout_marginLeft">48dip</item>
- </style>
-
- <!-- Cancel/Done buttons on the account settings (server settings) fragments -->
- <style name="accountSettingsButton">
- <item name="android:layout_width">125sp</item>
- <item name="android:layout_height">48sp</item>
- <item name="android:textSize">18sp</item>
- </style>
-
-</resources>
diff --git a/res/values-sw600dp/bools.xml b/res/values-sw600dp/bools.xml
deleted file mode 100644
index 60275191d..000000000
--- a/res/values-sw600dp/bools.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <bool name="use_two_pane">true</bool>
-
- <!-- Reply/Reply All/Forward switcher in action bar -->
- <bool name="message_compose_action_tabs">true</bool>
-</resources>
diff --git a/res/values-sw600dp/colors.xml b/res/values-sw600dp/colors.xml
deleted file mode 100644
index 63d594385..000000000
--- a/res/values-sw600dp/colors.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <color name="message_view_fogged_glass_color">#00000000</color>
-</resources>
diff --git a/res/values-sw600dp/dimensions.xml b/res/values-sw600dp/dimensions.xml
index 24671b861..1ba14b685 100644
--- a/res/values-sw600dp/dimensions.xml
+++ b/res/values-sw600dp/dimensions.xml
@@ -16,17 +16,6 @@
<!-- tablet -->
<resources>
- <!-- Bottom padding used to compensate for the built in drop shadow in the
- asset. -->
- <dimen name="message_header_height">64dip</dimen>
- <dimen name="message_header_bottom_padding">4dip</dimen>
- <dimen name="message_header_badge_width">64dip</dimen>
- <dimen name="message_header_name_margin">16dip</dimen>
-
- <!-- hack around the fact that the checkbox below the reply state has a lot
- of padding built into the asset -->
- <dimen name="message_list_icon_padding_compensation">-6dip</dimen>
-
<!-- Account Setup Activities -->
<!-- inset distance for setup/settings buttons -->
<dimen name="setup_buttons_padding_left">16dip</dimen>
@@ -53,14 +42,12 @@
<dimen name="setup_item_inset_left">16dip</dimen>
<dimen name="setup_item_inset_right">64dip</dimen>
- <!-- Folder list items -->
- <dimen name="mailbox_list_padding_left">16dip</dimen>
- <dimen name="mailbox_list_padding_right">24dip</dimen>
- <dimen name="mailbox_list_count_margin_left">16dip</dimen>
+ <!-- Account Setup Activities -->
+ <dimen name="setup_padding_top">16dip</dimen>
+ <dimen name="setup_padding_left">64dip</dimen>
+ <dimen name="setup_padding_right">64dip</dimen>
<!-- Message list items -->
- <dimen name="replystate_margin_left">7dip</dimen>
- <dimen name="replystate_margin_top">10sp</dimen>
- <dimen name="checkmark_margin_top">4sp</dimen>
- <dimen name="star_margin_top">30sp</dimen>
+ <dimen name="replystate_margin_top">3sp</dimen>
+ <dimen name="replystate_margin_right">16dip</dimen>
</resources>
diff --git a/res/values-sw600dp/styles.xml b/res/values-sw600dp/styles.xml
index 21230f6ae..08c573fff 100644
--- a/res/values-sw600dp/styles.xml
+++ b/res/values-sw600dp/styles.xml
@@ -53,121 +53,8 @@
<item name="android:textSize">18sp</item>
</style>
- <!-- Message view -->
- <style name="message_view_horizontal_divider">
- <item name="android:layout_height">2dip</item>
- <item name="android:background">?android:attr/dividerHorizontal</item>
- </style>
-
- <style name="message_compose_horizontal_divider">
- <item name="android:layout_height">1dip</item>
- <item name="android:background">?android:attr/dividerHorizontal</item>
- </style>
- <style name="message_compose_header_field_container_no_tray" parent="PlainEditText">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:layout_gravity">center_vertical</item>
- <item name="android:orientation">horizontal</item>
- </style>
- <style name="message_compose_header_field_container" parent="@android:style/Widget.AutoCompleteTextView">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:paddingLeft">0dip</item>
- <item name="android:orientation">horizontal</item>
- <item name="android:addStatesFromChildren">true</item>
- <item name="android:focusable">false</item>
- <item name="android:focusableInTouchMode">false</item>
- </style>
- <style name="message_compose_header_field_label">
- <item name="android:layout_width">@dimen/message_compose_field_label_width</item>
- <item name="android:layout_height">48dip</item>
- <item name="android:layout_weight">0</item>
- <item name="android:gravity">center_vertical</item>
- <item name="android:paddingTop">0dip</item>
- <item name="android:paddingBottom">0dip</item>
- <item name="android:paddingLeft">16dip</item>
- <item name="android:paddingRight">16dip</item>
- <item name="android:ellipsize">end</item>
- <item name="android:singleLine">true</item>
- <item name="android:textSize">18dip</item>
- <item name="android:textColor">@color/text_secondary_color</item>
- </style>
- <style name="message_compose_header_field_value" parent="PlainEditText">
- <item name="android:layout_width">0dip</item>
- <item name="android:layout_height">48dip</item>
- <item name="android:layout_weight">1</item>
- <item name="android:gravity">center_vertical</item>
- <item name="android:paddingTop">0dip</item>
- <item name="android:paddingBottom">0dip</item>
- <item name="android:paddingLeft">0dip</item>
- <item name="android:paddingRight">0dip</item>
- <item name="android:textSize">18dip</item>
- <item name="android:textColor">@color/text_primary_color</item>
- <item name="android:singleLine">true</item>
- </style>
-
- <style name="message_view_action_buttons" parent="android:Widget.Holo.Button.Borderless">
- <item name="android:layout_width">56dip</item>
- <item name="android:layout_height">56dip</item>
- <item name="android:scaleType">center</item>
- </style>
-
- <style name="message_header_sender_name">
- <item name="android:textSize">18dip</item>
- <item name="android:textColor">@color/text_primary_color_inverse</item>
- <item name="android:textStyle">bold</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">end</item>
- </style>
-
- <style name="message_header_sender_address">
- <item name="android:textSize">14dip</item>
- <item name="android:textColor">@color/text_secondary_color_inverse</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">end</item>
- </style>
-
<style name="accountSetupTypePrevious" parent="@style/accountSetupButton">
<item name="android:layout_toRightOf">@+id/main_content"</item>
<item name="android:layout_alignParentRight">true</item>
</style>
-
- <style name="action_bar_spinner_primary_text">
- <item name="android:includeFontPadding">false</item>
- <item name="android:textSize">18sp</item>
- <item name="android:textColor">@color/text_primary_color</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">end</item>
- </style>
-
- <style name="action_bar_spinner_secondary_text">
- <item name="android:visibility">gone</item>
- </style>
-
- <style name="Attachment.Button" parent="@android:style/Widget.Holo.Button.Borderless">
- <item name="android:layout_width">0dip</item>
- <item name="android:layout_weight">1</item>
- <item name="android:layout_height">match_parent</item>
- <item name="android:layout_marginLeft">16dip</item>
- <item name="android:layout_marginRight">16dip</item>
- <item name="android:padding">0dip</item>
- <item name="android:textColor">@color/buttontext</item>
- <item name="android:textSize">14dip</item>
- <item name="android:textStyle">bold</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">end</item>
- <item name="android:gravity">center</item>
- <item name="android:textAllCaps">true</item>
- </style>
-
- <style name="message_list_item_normal">
- <item name="android:paddingLeft">0dip</item>
- <item name="android:paddingRight">0dip</item>
- </style>
-
- <style name="message_list_item_wide">
- <item name="android:paddingLeft">16dip</item>
- <item name="android:paddingRight">16dip</item>
- </style>
-
</resources>
diff --git a/res/values-sw800dp-land/dimen.xml b/res/values-sw800dp-land/dimen.xml
deleted file mode 100644
index 1b775848d..000000000
--- a/res/values-sw800dp-land/dimen.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- tablet, landscape -->
-<resources>
- <!-- Account Setup Activities -->
- <dimen name="setup_padding_top">16dip</dimen>
- <dimen name="setup_padding_left">128dip</dimen>
- <dimen name="setup_padding_right">128dip</dimen>
-</resources>
-
diff --git a/res/values-sw800dp-port/styles.xml b/res/values-sw800dp-port/styles.xml
deleted file mode 100644
index 8a61b9f56..000000000
--- a/res/values-sw800dp-port/styles.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- tablet, portrait -->
-
-<resources>
- <!-- Override previous button in really large tablets -->
- <style name="accountSetupTypePrevious" parent="@style/accountSetupButton">
- <item name="android:layout_toRightOf">@+id/main_content"</item>
- <item name="android:layout_alignParentRight">true</item>
- </style>
-
-</resources>
-
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index a7ccc7cd2..90044e0da 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"อ่านไฟล์แนบของอีเมล"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"อนุญาตให้แอปพลิเคชันนี้อ่านไฟล์แนบในอีเมลของคุณ"</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"อนุญาตให้แอปพลิเคชันนี้อ่านไฟล์แนบในอีเมลของคุณ"</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"เข้าถึงข้อมูลผู้ให้บริการอีเมล"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"อนุญาตให้แอปพลิเคชันนี้เข้าถึงฐานข้อมูลอีเมลของคุณ ซึ่งรวมถึงข้อความที่ได้รับ ข้อความที่ส่ง ชื่อผู้ใช้ และรหัสผ่าน"</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"อนุญาตให้แอปพลิเคชันนี้เข้าถึงฐานข้อมูลอีเมลของคุณ ซึ่งรวมถึงข้อความที่ได้รับ ข้อความที่ส่ง ชื่อผู้ใช้ และรหัสผ่าน"</string>
<string name="app_name" msgid="5815426892327290362">"อีเมล"</string>
<string name="compose_title" msgid="427986915662706899">"เขียน"</string>
<string name="debug_title" msgid="5175710493691536719">"ดีบัก"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"เสร็จสิ้น"</string>
<string name="create_action" msgid="3062715563215392251">"สร้างใหม่"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"ลบ"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"ไม่มีคำตอบด่วน"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"ไม่มีคำตอบด่วน"</string>
<string name="discard_action" msgid="6532206074859505968">"ยกเลิก"</string>
<string name="save_draft_action" msgid="6413714270991417223">"บันทึกร่างจดหมาย"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"ใส่คำตอบด่วน"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"ค้นหา"</string>
<string name="account_settings_action" msgid="4494079183315085171">"การตั้งค่าบัญชี"</string>
<string name="settings_action" msgid="6334807007967459412">"การตั้งค่า"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"ตัวเลือกการซิงค์"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"ตัวเลือกการซิงค์"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"ทำเครื่องหมายว่ายังไม่ได้อ่าน"</string>
<string name="move_action" msgid="3059189775933985898">"ย้าย"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ สำเนา/สำเนาลับ"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> เขียนว่า:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"รวมข้อความที่ยกมา"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"รวมข้อความ"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"คุณต้องเพิ่มผู้รับอย่างน้อยหนึ่งราย"</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"เพิ่มผู้รับอย่างน้อยหนึ่งราย"</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"ที่อยู่อีเมลบางที่อยู่ไม่ถูกต้อง"</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"ไฟล์ใหญ่เกินไปที่จะแนบ"</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"ใส่คำตอบด่วน"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"บันทึกแล้ว"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"หยุด"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"เอกสารแนบถูกบันทึกเป็น <xliff:g id="FILENAME">%s</xliff:g>"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"ไม่สามารถบันทึกไฟล์แนบ"</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"หมายเหตุ: เอกสารแนบอย่างน้อยหนึ่งรายการในข้อความที่ส่งต่อของคุณจะมีการดาวน์โหลดก่อนส่ง"</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"ไม่สามารถบันทึกไฟล์แนบ"</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"หมายเหตุ: ไฟล์แนบอย่างน้อยหนึ่งรายการในข้อความที่ส่งต่อของคุณจะมีการดาวน์โหลดก่อนส่ง"</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"ข้อความ"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"เชิญ"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"ไม่สามารถส่งต่อไฟล์แนบอย่างน้อยหนึ่งรายการ"</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"ไม่ได้ส่งต่อเอกสารแนบ"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"การลงชื่อเข้าใช้ <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ล้มเหลว"</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"ลงชื่อเข้าใช้ <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ไม่สำเร็จ"</string>
<string name="login_failed_title" msgid="7624349996212476176">"ไม่สามารถลงชื่อเข้าใช้"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>ไบต์"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"เก่ากว่า"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" - "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"การตั้งค่าบัญชี"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"เพิ่มบัญชี Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"เพิ่มบัญชี Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"บัญชีอีเมล"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"คุณสามารถตั้งค่าอีเมลสำหรับ\\nบัญชีส่วนใหญ่ได้ในไม่กี่ขั้นตอน"</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"คุณสามารถตั้งค่าบัญชี Exchange ได้ในไม่กี่ขั้นตอน"</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"คุณสามารถตั้งค่าบัญชี Exchange ActiveSync ได้ในไม่กี่ขั้นตอน"</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"คุณสามารถตั้งค่าบัญชีได้ในไม่กี่ขั้นตอน"</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"ที่อยู่อีเมล"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"รหัสผ่าน"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"ส่งอีเมลจากบัญชีนี้เป็นค่าเริ่มต้น"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"ส่งอีเมลจากบัญชีนี้เป็นค่าเริ่มต้น"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"ตั้งค่าด้วยตนเอง"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"พิมพ์ที่อยู่อีเมลและรหัสผ่านที่ถูกต้อง"</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"บัญชีซ้ำ"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"กำลังตรวจสอบการตั้งค่าเซิร์ฟเวอร์ขาเข้า..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"กำลังตรวจสอบการตั้งค่าเซิร์ฟเวอร์ขาออก..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"การตั้งค่าบัญชี"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"ตั้งค่าบัญชีของคุณแล้ว และอีเมลกำลังมาถึง"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"ตั้งค่าบัญชีของคุณแล้ว และอีเมลกำลังมาถึง!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"ตั้งชื่อให้กับบัญชีนี้ (เป็นตัวเลือก)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"ชื่อของคุณ (แสดงในข้อความขาออก)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"ต้องกรอกข้อมูลในฟิลด์นี้"</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"การตั้งค่าเซิร์ฟเวอร์ขาเข้า"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"ชื่อผู้ใช้"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"รหัสผ่าน"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"เซิร์ฟเวอร์ POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"เซิร์ฟเวอร์ IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"เซิร์ฟเวอร์"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"พอร์ต"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"ประเภทการรักษาความปลอดภัย"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"ไม่มี"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"เซิร์ฟเวอร์ SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"พอร์ต"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"ประเภทการรักษาความปลอดภัย"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"ต้องลงชื่อเข้าใช้"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"จำเป็นต้องลงชื่อเข้าใช้"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"ชื่อผู้ใช้"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"รหัสผ่าน"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"การตั้งค่าบัญชี"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"ทุก 15 นาที"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"ทุก 30 นาที"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"ทุกชั่วโมง"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"ส่งอีเมลจากบัญชีนี้เป็นค่าเริ่มต้น"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"แจ้งให้ฉันทราบเมื่อมีอีเมลเข้า"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"ซิงค์รายชื่อจากบัญชีนี้"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"ซิงค์ปฏิทินจากบัญชีนี้"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"ซิงค์อีเมลจากบัญชีนี้"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"ส่งอีเมลจากบัญชีนี้เป็นค่าเริ่มต้น"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"แจ้งให้ฉันทราบเมื่อมีอีเมลเข้า"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"ซิงค์รายชื่อจากบัญชีนี้"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"ซิงค์ปฏิทินจากบัญชีนี้"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"ซิงค์อีเมลจากบัญชีนี้"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"ดาวน์โหลดไฟล์แนบโดยอัตโนมัติเมื่อเชื่อมต่อ Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"ไม่สามารถดำเนินการให้เสร็จสิ้น"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"วันที่จะซิงค์"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"1 เดือน"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"ทั้งหมด"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"ใช้ค่าเริ่มต้นของบัญชี"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง"</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง"</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้อย่างปลอดภัย"</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้อย่างปลอดภัย"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"ต้องใช้ใบรับรองไคลเอ็นต์ ต้องการเชื่อมต่อกับเซิร์ฟเวอร์ที่มีใบรับรองไคลเอ็นต์หรือไม่"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"ใบรับรองไม่ถูกต้องหรือไม่สามารถเข้าถึงได้"</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"เซิร์ฟเวอร์ตอบสนองโดยมีข้อผิดพลาด โปรดตรวจสอบชื่อผู้ใช้และรหัสผ่านของคุณ แล้วลองอีกครั้ง"</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"ต้องมีใบรับรองไคลเอ็นต์ คุณต้องการเชื่อมต่อกับเซิร์ฟเวอร์ด้วยใบรับรองไคลเอ็นต์หรือไม่"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"ใบรับรองไม่ถูกต้องหรือไม่สามารถเข้าถึงได้"</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"เซิร์ฟเวอร์ตอบสนองโดยมีข้อผิดพลาด โปรดตรวจสอบชื่อผู้ใช้และรหัสผ่านของคุณ แล้วลองอีกครั้ง"</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์"</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"ต้องใช้ TLS แต่เซิร์ฟเวอร์ไม่สนับสนุน"</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"คำเตือน: การปิดใช้งานสิทธิ์ของแอปพลิเคชันอีเมลในการดูแลอุปกรณ์ของคุณจะเป็นการลบบัญชีอีเมลทั้งหมดที่จำเป็นต้องใช้สิทธิ์นั้น พร้อมทั้งอีเมล สมุดโทรศัพท์ กิจกรรมในปฏิทิน และข้อมูลอื่นๆ"</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"การอัปเดตความปลอดภัย"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> กำหนดให้คุณต้องอัปเดตการตั้งค่าความปลอดภัย"</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"บัญชี \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ต้องการการอัปเดตการตั้งค่าความปลอดภัย"</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"ต้องมีการอัปเดตการรักษาความปลอดภัย"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"ไม่สามารถซิงค์บัญชี \"<xliff:g id="ACCOUNT">%s</xliff:g>\" เนื่องจากข้อกำหนดด้านความปลอดภัย"</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"บัญชี \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ต้องมีการอัปเดตการตั้งค่าความปลอดภัย"</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"เปลี่ยนการตั้งค่าความปลอดภัยของบัญชี \"<xliff:g id="ACCOUNT">%s</xliff:g>\" แล้ว ผู้ใช้ไม่จำเป็นต้องดำเนินการใดๆ"</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"ต้องอัปเดตการรักษาความปลอดภัย"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"เปลี่ยนนโยบายความปลอดภัยแล้ว"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"ไม่ตรงกับนโยบายความปลอดภัย"</string>
<string name="account_security_title" msgid="3511543138560418587">"ความปลอดภัยของอุปกรณ์"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"เซิร์ฟเวอร์ <xliff:g id="SERVER">%s</xliff:g> ต้องการให้คุณอนุญาตให้ควบคุมคุณลักษณะความปลอดภัยบางอย่างของอุปกรณ์ Android ของคุณได้จากระยะไกล"</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"แก้ไขรายละเอียด"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"PIN หรือรหัสผ่านล็อกหน้าจอของคุณหมดอายุแล้ว"</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"รหัสผ่านล็อกหน้าจอหมดอายุแล้ว"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"รหัสผ่านล็อกหน้าจอใกล้หมดอายุ"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"คุณต้องเปลี่ยน PIN หรือรหัสผ่านล็อกหน้าจอของคุณโดยเร็ว มิฉะนั้นข้อมูลสำหรับ <xliff:g id="ACCOUNT">%s</xliff:g> จะถูกลบ เปลี่ยนรหัสตอนนี้หรือไม่"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"คุณต้องเปลี่ยน PIN หรือรหัสผ่านสำหรับการล็อกหน้าจอโดยเร็ว ไม่เช่นนั้นข้อมูลของ <xliff:g id="ACCOUNT">%s</xliff:g> จะถูกลบ คุณต้องการเปลี่ยนตอนนี้หรือไม่"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"รหัสผ่านล็อกหน้าจอหมดอายุแล้ว"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"ข้อมูลสำหรับ <xliff:g id="ACCOUNT">%s</xliff:g> กำลังถูกลบออกจากอุปกรณ์ของคุณ คุณสามารถคืนค่าข้อมูลได้โดยเปลี่ยน PIN หรือรหัสผ่านล็อกหน้าจอของคุณ เปลี่ยนรหัสตอนนี้หรือไม่"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"ข้อมูลสำหรับ <xliff:g id="ACCOUNT">%s</xliff:g> กำลังถูกลบออกจากอุปกรณ์ของคุณ คุณสามารถคืนค่าข้อมูลได้โดยเปลี่ยน PIN หรือรหัสผ่านล็อกหน้าจอของคุณ เปลี่ยนรหัสตอนนี้หรือไม่"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"ยกเลิกการเปลี่ยนแปลงที่ยังไม่ได้บันทึกหรือไม่"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"ลงชื่อเข้าใช้ไม่ได้"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"ชื่อผู้ใช้หรือรหัสผ่านสำหรับ <xliff:g id="ACCOUNT">%s</xliff:g> ไม่ถูกต้อง อัปเดตชื่อผู้ใช้และรหัสผ่านตอนนี้หรือไม่"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"ชื่อผู้ใช้หรือรหัสผ่านสำหรับ <xliff:g id="ACCOUNT">%s</xliff:g> ไม่ถูกต้อง คุณต้องการอัปเดตตอนนี้หรือไม่"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"บัญชีเริ่มต้น"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"ส่งอีเมลจากบัญชีนี้เป็นค่าเริ่มต้น"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"ดาวน์โหลดไฟล์แนบ"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"ดาวน์โหลดไฟล์แนบของข้อความล่าสุดผ่าน WiFi โดยอัตโนมัติ"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"การแจ้งเตือนทางอีเมล"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"ความถี่ในการซิงค์ การแจ้งเตือน ฯลฯ"</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"แจ้งในแถบระบบเมื่อได้รับอีเมล"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"ส่งการแจ้งเตือนเมื่อมีอีเมลเข้า"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"ความถี่ในการตรวจสอบกล่องจดหมาย"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"การตั้งค่าข้อความขาเข้า"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"ชื่อผู้ใช้ รหัสผ่าน และการตั้งค่าเซิร์ฟเวอร์ขาเข้าอื่นๆ"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"การตั้งค่าข้อความขาออก"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"ชื่อผู้ใช้ รหัสผ่าน และการตั้งค่าเซิร์ฟเวอร์ขาออกอื่นๆ"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"บังคับใช้นโยบายแล้ว"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"ไม่มี"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"นโยบายที่ไม่สนับสนุน"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"ไม่มี"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"พยายามซิงค์"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"แตะที่นี่เพื่อซิงค์บัญชีนี้"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"ชื่อบัญชี"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"ชื่อของคุณ"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"ลายเซ็น"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"คำตอบด่วน"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"แก้ไขข้อความที่คุณใช้เป็นประจำเมื่อเขียนอีเมล"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"แก้ไขข้อความที่คุณใช้เป็นประจำเมื่อเขียนอีเมล"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"เพิ่มข้อความต่อท้ายจดหมายที่คุณส่ง"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"การตั้งค่าการแจ้งเตือน"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"การใช้ข้อมูล"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"นโยบายความปลอดภัย"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"แก้ไขคำตอบด่วน"</string>
<string name="save_action" msgid="1988862706623227093">"บันทึก"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"ซิงค์รายชื่อในสมุดโทรศัพท์"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"ซิงค์สมุดโทรศัพท์สำหรับบัญชีนี้"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"ซิงค์ปฏิทิน"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"ซิงค์ปฏิทินสำหรับบัญชีนี้"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"ซิงค์ปฏิทิน"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"ซิงค์กิจกรรมในปฏิทินสำหรับบัญชีนี้"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"ซิงค์อีเมล"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"ซิงค์อีเมลสำหรับบัญชีนี้"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"สั่น"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"ผลลัพธ์ <xliff:g id="RESULTS">%1$d</xliff:g> รายการจาก <xliff:g id="DOMAIN">%2$s</xliff:g> รายการ"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"การตั้งค่า"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"ทั่วไป"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"การตั้งค่าทั่วไป"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"แอปพลิเคชัน"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"เลื่อนไปข้างหน้าโดยอัตโนมัติ"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"เลือกหน้าจอที่จะแสดงขึ้นหลังจากที่คุณลบข้อความ"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"ซ่อนช่องทำเครื่องหมาย"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"แตะข้อความในรายการค้างไว้เพื่อเลือก"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"ยืนยันก่อนลบ"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"ข้อความ"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"ยืนยันก่อนส่ง"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"ข้อความ"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"เลื่อนไปที่"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"ข้อความที่ใหม่กว่า"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"ข้อความที่เก่ากว่า"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"กำลังรอผลลัพธ์"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"เซิร์ฟเวอร์บางอย่างอาจใช้เวลานาน"</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"โฟลเดอร์"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"ไม่อนุญาตให้ใช้กล้องถ่ายรูปของอุปกรณ์"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"ต้องมีรหัสผ่านของอุปกรณ์"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"จำกัดการนำรหัสผ่านล่าสุดมาใช้ใหม่"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"รหัสผ่านต้องมีวันหมดอายุ"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"อุปกรณ์ต้องไม่มีการทำงานเพื่อล็อกหน้าจอ"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"จำกัดจำนวนกิจกรรมในปฏิทินที่ซิงค์"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"จำกัดจำนวนอีเมลที่ซิงค์"</string>
+ <string name="quick_1" msgid="3426057697353380951">"ขอบคุณ!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"น่าสนใจนะ!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"ฉันจะอ่านและตอบกลับทีหลัง"</string>
+ <string name="quick_4" msgid="3988974084396883051">"จัดการประชุมเพื่อคุยเรื่องนี้กัน"</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"การซิงค์พื้นหลังสำหรับบัญชีนี้ถูกปิดใช้งานขณะโรมมิ่ง"</string>
+ <string name="confirm_response" msgid="5747902757569543165">"กำลังส่งการตอบกลับ..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"ไม่มีข้อความ"</string>
</resources>
diff --git a/res/values-th/uploader.xml b/res/values-th/uploader.xml
index 3c4cd2d10..9849adfe8 100644
--- a/res/values-th/uploader.xml
+++ b/res/values-th/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"ซ่อนรายละเอียด"</string>
<string name="menu_settings" msgid="5088116127086866634">"การตั้งค่า"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"อัปโหลดแล้ว %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"บัญชี"</string>
<string name="upload" msgid="2615541458361216022">"อัปโหลด"</string>
<string name="ok" msgid="2516349681897895312">"ตกลง"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 3ffabddb2..014522cff 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Basahin ang mga attachment sa email"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Binibigyang-daan ang application na ito na basahin ang iyong mga attachment sa email."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Binibigyang-daan ang app na basahin ang iyong mga attachment sa email."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"I-access ang data ng provider ng email"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Binibigyang-daan ang application na ito na i-access ang database ng iyong email, kabilang ang mga natanggap na mensahe, ipinadalang mensahe, username, at password."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Binibigyang-daan ang application na i-access ang database ng iyong email, kabilang ang mga natanggap na mensahe, naipadalang mensahe, username, at password."</string>
<string name="app_name" msgid="5815426892327290362">"Email"</string>
<string name="compose_title" msgid="427986915662706899">"Bumuo"</string>
<string name="debug_title" msgid="5175710493691536719">"Debug"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Tapos na"</string>
<string name="create_action" msgid="3062715563215392251">"Lumikha ng bago"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Tanggalin"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Walang mga mabilisang pagtugon"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Walang mga mabilisang pagtugon."</string>
<string name="discard_action" msgid="6532206074859505968">"Itapon"</string>
<string name="save_draft_action" msgid="6413714270991417223">"I-save ang draft"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Ipasok mabilisang tugon"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Paghahanap"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Mga setting ng account"</string>
<string name="settings_action" msgid="6334807007967459412">"Mga Setting"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Mga pagpipilian sa pag-sync"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Mga pagpipilian sa pag-sync"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Markahan bilang hindi pa nababasa"</string>
<string name="move_action" msgid="3059189775933985898">"Ilipat"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">"Si "\n\n"<xliff:g id="SENDER">%s</xliff:g> ay sumulat:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Isama ang naka-quote na teksto"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Isama ang teksto"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Dapat kang magdagdag ng hindi bababa sa isang recipient."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Magdagdag ng hindi bababa sa isang recipient."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Di-wasto ang ilang email address."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Masyadong malaki ang file upang i-attach."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Ipasok ang mabilisang tugon"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Na-save"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Huminto"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Na-save attachment na <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Hindi mai-save ang attachment."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Paalala: Ida-download bago ang pagpapadala ang isa o higit pang mga attachment sa iyong ipinasang mensahe."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Hindi ma-save ang attachment."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Ida-download ang isa o higit pang mga attachment sa iyong ipinasang mensahe bago ang pagpapadala."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Mensahe"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Imbitahan"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Hindi makapagpasa ng isa o higit pang mga attachment."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Hindi napasa ang attachment"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Nabigo sa pag-signin sa <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Hindi matagumpay ang pag-signin ng <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Hindi makapag-sign in"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Mas luma"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Setup ng account"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Magdagdag ng Exchange account"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Magdagdag ng Exchange ActiveSync account"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Email account"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Maaari kang mag-set up ng email para sa karamihan ng mga account sa ilang hakbang lamang."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Maaari kang mag-set up ng isang Exchange account sa ilang hakbang lamang."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Maaari kang mag-set up ng isang Exchange ActiveSync account sa ilang hakbang lamang."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Mase-set up mo ang iyong account sa ilang hakbang lang."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Email address"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Password"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Magpadala ng email mula sa account na ito bilang default."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Magpadala ng email mula sa account na ito bilang default"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manu-manong pag-setup"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Mag-type ng wastong email address at password."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Duplicate na account"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Sinusuri ang mga setting ng papasok na server…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Sinusuri ang mga setting ng papalabas na server…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Setup ng account"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Naka-set up ang iyong account, at paparating na ang email!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Naka-set up na ang iyong account at paparating na ang email!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Bigyan ng pangalan ang account na ito (opsyonal)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Iyong pangalan (na ipinapakita sa mga papalabas na mensahe)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Hindi maaaring blangko ang field na ito."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Mga setting ng papasok na server"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Username"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Password"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3 server"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP server"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Server"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Port"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Uri ng seguridad"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Wala"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP server"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Port"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Uri ng seguridad"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Nangangailangan ng pag-sign-in."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Hingin ang pag-signin"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Username"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Password"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Setup ng account"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Tuwing 15 minuto"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Tuwing 30 minuto"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Oras-oras"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Magpadala ng email mula sa account na ito bilang default."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"I-notify ako kapag dumating ang email."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"I-sync ang mga contact mula sa account na ito."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"I-sync ang kalendaryo mula sa account na ito"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"I-sync ang email mula sa account na ito."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Magpadala ng email mula sa account na ito bilang default"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"I-notify ako kapag may dumating na email"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"I-sync ang mga contact mula sa account na ito"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"I-sync ang kalendaryo mula sa account na ito"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"I-sync ang email mula sa account na ito"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Awtomatikong i-download ang mga attachment kapag nakakonekta sa Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Hindi matapos"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Mga araw upang i-sync"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Isang buwan"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Lahat"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Gamitin ang default ng account"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Mali ang username o password."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Mali ang username o password."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Hindi tama ang username o password."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Hindi tama ang username o password."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Hindi makakonekta nang ligtas sa server."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Hindi makakonekta nang ligtas sa server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Kinakailangan ang certificate ng client. Kumonekta sa server gamit ang certificate ng client?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Di-wasto o hindi naa-access ang certificate."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Tumugon ang server nang may error. Suriin ang iyong username at password pagkatapos ay subukang muli."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Kinakailangan ng certificate ng client. Nais mo bang kumonekta sa server gamit ang isang certificate ng client?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Di-wasto o hindi naa-access ang certificate."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Tumugon ang server nang may error. Suriin ang iyong username at password, pagkatapos ay subukang muli."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Hindi makakonekta sa server."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Hindi makakonekta sa server."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"Kinakailangan ang TLS ngunit hindi suportado ng server."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"BABALA: Ang pag-deactivate sa awtoridad ng Email app na pangasiwaan ang iyong device ay magtatanggal sa lahat ng email account na nangangailangan nito, kasama ang email, mga contact, mga kaganapan sa kalendaryo, at iba pang data ng mga ito."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Update sa seguridad"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Kinakailangan ng <xliff:g id="ACCOUNT">%s</xliff:g> na i-update mo ang iyong mga setting ng seguridad."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Nangangailangan ang account na \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ng pag-update ng mga setting ng seguridad."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Kailangan update sa seguridad"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Hindi ma-sync ang account na \"<xliff:g id="ACCOUNT">%s</xliff:g>\" dahil sa mga kinakailangan sa seguridad."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Kinakailangan ng account na \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ng update sa mga setting ng seguridad."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Binago ng account na \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ang mga setting ng seguridad nito; walang kinakailangang pagkilos ng user."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Kailangan update sa seguridad"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Nabago patakaran sa seguridad"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Di masunod patakaran seguridad"</string>
<string name="account_security_title" msgid="3511543138560418587">"Seguridad ng device"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Kinakailangan ng server na <xliff:g id="SERVER">%s</xliff:g> na payagan mo itong malayuang kontrolin ang ilang tampok sa seguridad ng iyong Android device."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"I-edit ang mga detalye"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Nag-expire na ang iyong PIN o password sa pag-lock ng screen."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Expire na passw. pg-lock scr"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Nag-e-expire password pag-lock ng screen"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Dapat mong palitan ang iyong PIN o password sa pag-lock ng screen, o mabubura ang data para sa <xliff:g id="ACCOUNT">%s</xliff:g>. Palitan ito ngayon?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Kailangan mong baguhin ang iyong PIN o password para sa screen ng lock sa lalong madaling panahon, o mabubura ang data para sa <xliff:g id="ACCOUNT">%s</xliff:g>. Nais mo ba itong baguhin ngayon?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Nag-expire na password pag-lock screen"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Binubura ang data para sa <xliff:g id="ACCOUNT">%s</xliff:g> mula sa iyong device. Maaari mo itong ibalik sa pamamagitan ng pagbabago ng iyong PIN o password sa pag-lock ng screen. Palitan ito ngayon?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Binubura ang data para sa <xliff:g id="ACCOUNT">%s</xliff:g> mula sa iyong device. Maipapanumbalik mo ito sa pamamagitan ng pagbabago sa iyong PIN o password para sa screen ng lock. Nais mo ba itong baguhin ngayon?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Itapon ang hindi naka-save na mga pagbabago?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Hindi makapag-sign in"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Hindi tama ang username o password para sa <xliff:g id="ACCOUNT">%s</xliff:g>. I-update ang mga ito ngayon?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Hindi tama ang username o password para sa <xliff:g id="ACCOUNT">%s</xliff:g>. Nais mo bang i-update ang mga ito ngayon?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Default na account"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Magpadala ng email mula sa account na ito bilang default"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Mag-download ng mga attachment"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Awto i-download mga attachment sa mga bagong mensahe sa Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Mga notification sa email"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Dalas ng pag-sync, mga notification, atbp."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"I-notify sa System bar kapag dumating ang email"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Magpadala ng notification kapag may dumating na email"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Dalas ng pagtingin sa inbox"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Mga setting ng papasok"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Mga setting ng username, password, at ibang papasok na server"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Mga setting ng papalabas"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Mga setting ng username, password, at ibang papalabas na server"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Ipinapatupad na mga patakaran"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Wala"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Mga hindi sinusuportahang patakaran"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Wala"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Magtangkang i-sync"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Pumindot dito upang i-sync ang account na ito"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Pangalan ng account"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Iyong pangalan"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Lagda"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Mga mabilisang tugon"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"I-edit ang teksto na madalas mong ipasok kapag nag-i-email"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"I-edit tekstong madalas mong pinapasok kapag nagsusulat ng email"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Magsama ng teksto sa mga mensaheng iyong ipinapadala"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Mga setting ng notification"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Paggamit ng data"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Mga patakaran sa seguridad"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"I-edit ang mabilisang tugon"</string>
<string name="save_action" msgid="1988862706623227093">"I-save"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"I-sync ang mga contact"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Sync ang contact sa account na ito"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Sync ang Kalendaryo"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"I-sync kalendaryo sa account na ito"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"I-sync ang kalendaryo"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Sync ganap kalendaryo para ito acct"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"I-sync ang email"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"I-sync ang email sa account na ito"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"I-vibrate"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> (na) resulta mula sa <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Mga Setting"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Pangkalahatan"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Mga pangkalahatang setting"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Application"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Auto-advance"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Piliin kung aling screen ang ipapakita pagkatapos mong magtanggal ng mensahe"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Itago ang mga checkbox"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Sa mga listahan ng mensahe, pindutin nang matagal upang piliin"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Kumpirmahin bago tanggalin"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Mga Mensahe"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Kumpirmahin bago ipadala"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Mga Mensahe"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Mag-advance sa"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Mas bagong mga mensahe"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Mas lumang mensahe"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Naghihintay ng mga resulta"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Maaaring magtagal ang ilang server."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Mga Folder"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Wag payag paggamit ng camera ng device"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Hilingin ang password ng device"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Paghigpitan gamit muli dating password"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Hinging mag-expire ang mga password"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Hilingin idle device i-lock screen nito"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Limitahan ang bilang ng mga kaganapan sa kalendaryo na sini-sync"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Limitahan ang bilang ng mga email na sini-sync"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Salamat!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Magaling sa akin!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Babasahin ko ito sa ibang pagkakataon at babalik sa iyo."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Magtakda tayo ng pulong upang talakayin ito."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Hindi pinapagana ang background na pag-sync para sa account na ito habang nagro-roam."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Ipinapadala ang tugon..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Walang mga mensahe."</string>
</resources>
diff --git a/res/values-tl/uploader.xml b/res/values-tl/uploader.xml
index 157de852d..b21305c42 100644
--- a/res/values-tl/uploader.xml
+++ b/res/values-tl/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Itago ang Mga Detalye"</string>
<string name="menu_settings" msgid="5088116127086866634">"Mga Setting"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Na-upload %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Account"</string>
<string name="upload" msgid="2615541458361216022">"I-upload"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 5e3c2e5d9..f0649ae2e 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"E-posta eklerini oku"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Bu uygulamaya, e-posta eklerinizi okuma izni verir."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Uygulamaya e-posta eklerinizi okuma izni verir."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"E-posta sağlayıcı verilerine eriş"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Bu uygulamaya, alınan iletiler, gönderilen iletiler, kullanıcı adları ve şifreler de dahil olmak üzere e-posta veritabanınıza erişme izni verir."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Uygulamaya, alınan iletiler, gönderilen iletiler, kullanıcı adları ve şifreler de dahil olmak üzere e-posta veritabanınıza erişme izni verir."</string>
<string name="app_name" msgid="5815426892327290362">"E-posta"</string>
<string name="compose_title" msgid="427986915662706899">"E-Posta Yaz"</string>
<string name="debug_title" msgid="5175710493691536719">"Hata Ayıklama"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Bitti"</string>
<string name="create_action" msgid="3062715563215392251">"Yeni oluştur"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Sil"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Hızlı yanıt yok"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Hızlı yanıt yok."</string>
<string name="discard_action" msgid="6532206074859505968">"Sil"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Taslak kaydet"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Hızlı yanıt ekle"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Ara"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Hesap ayarları"</string>
<string name="settings_action" msgid="6334807007967459412">"Ayarlar"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Senkronizasyon seçenekleri"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Senkronizasyon seçenekleri"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Okunmadı olarak işaretle"</string>
<string name="move_action" msgid="3059189775933985898">"Taşı"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> şunu yazdı:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Alıntılanan metni dahil et"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Metni ekle"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"En az bir alıcı eklemelisiniz."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"En az bir alıcı ekleyin."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Bazı e-posta adresleri geçersiz."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Dosya eklenemeyecek kadar büyük."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Hızlı yanıt ekle"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Kaydedildi"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Durdur"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Ek <xliff:g id="FILENAME">%s</xliff:g> olarak kaydedildi."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Ek kaydedilemedi."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Not: Yönlendirilen iletinizdeki bir veya daha fazla ek, gönderme işleminden önce indirilecek."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Ek kaydedilemedi."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Yönlendirilen iletinizdeki bir veya daha fazla ek, gönderme işleminden önce indirilecek."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"İleti"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Davet Et"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Bir veya birden fazla ek yönlendirilemedi."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Ek yönlendirilmedi"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> oturumu açılamadı"</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> oturumu açılamadı."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Oturum açılamadı"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Daha eski"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Hesap kurulumu"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Bir Exchange hesabı ekleyin"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Bir Exchange ActiveSync hesabı ekleyin"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"E-posta hesabı"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Çoğu hesap için yalnızca birkaç adımda e-posta oluşturabilirsiniz."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Yalnızca birkaç adımda Exchange hesabı oluşturabilirsiniz."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Yalnızca birkaç adımda Exchange ActiveSync hesabı oluşturabilirsiniz."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Hesabınızı birkaç adımda oluşturabilirsiniz."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"E-posta adresi"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Şifre"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"E-postayı varsayılan olarak bu hesaptan gönder."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"E-postaları varsayılan olarak bu hesaptan gönder"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Manuel kurulum"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Geçerli bir e-posta adresi ve şifre yazın."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Yinelenen hesap"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Gelen sunucu ayarları denetleniyor..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Giden sunucu ayarları denetleniyor..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Hesap kurulumu"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Hesabınız ayarlandı ve e-posta gönderildi!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Hesabınız ayarlandı ve e-posta gönderildi!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Bu hesaba bir ad ver (isteğe bağlı)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Adınız (giden iletilerde görüntülenir)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Bu alan boş olamaz."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Gelen sunucu ayarları"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Kullanıcı adı"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Şifre"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3 sunucusu"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP sunucusu"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Sunucu"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Bağlantı Noktası"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Güvenlik türü"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Yok"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP sunucusu"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Bağlantı Noktası"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Güvenlik türü"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Oturum açılmasını gerektiriyor."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Oturum açmayı gerektir"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Kullanıcı adı"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Şifre"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Hesap kurulumu"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Her 15 dakikada bir"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Her 30 dakikada bir"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Saatte bir"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"E-postayı varsayılan olarak bu hesaptan gönder."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"E-posta geldiğinde bana bildir."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Bu hesaptaki kişileri senkronize et."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Bu hesaptaki takvimi senkronize et"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"E-postayı bu hesaptan senkronize et."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"E-postaları varsayılan olarak bu hesaptan gönder"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"E-posta geldiğinde bana bildir"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Bu hesaptaki kişileri senkronize et"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Bu hesaptaki takvimi senkronize et"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"E-postayı bu hesaptan senkronize et"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Kablosuz\'a bağlandığında ekleri otomatik olarak indir"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Tamamlanamadı"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Senkronize edilecek gün sayısı"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Bir ay"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Tümü"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Varsayılanı kullan"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Kullanıcı adı veya şifre hatalı."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Kullanıcı adı veya şifre hatalı."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Kullanıcı adı veya şifre hatalı."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Kullanıcı adı veya şifre yanlış."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Sunucuya güvenli biçimde bağlanılamıyor."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Sunucuya güvenli biçimde bağlanılamıyor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"İstemci sertifikası gerekli. Sunucuya istemci sertifikasıyla bağlanılsın mı?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Sertifika geçersiz veya erişilemiyor."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Sunucu hata gönderdi. Kullanıcı adınızı ve şifrenizi kontrol ettikten sonra tekrar deneyin."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"İstemci sertifikası gerekli. Sunucuya bir istemci sertifikası ile bağlanmak ister misiniz?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Sertifika geçersiz veya erişilemez."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Sunucu hata gönderdi. Kullanıcı adınızı ve şifrenizi kontrol ettikten sonra tekrar deneyin."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Sunucuya bağlanılamıyor."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Sunucuya bağlanılamıyor."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS gerekli ancak sunucu tarafından desteklenmiyor."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"UYARI: E-posta uygulamasının cihazınızı yönetme yetkisinin devre dışı bırakılması, bunu gerektiren tüm e-posta hesaplarının yanı sıra bu hesaplar ait e-postaları, kişileri, takvim olaylarını ve diğer verileri siler."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Güvenlik güncellemesi"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> için güvenlik ayarlarınızı güncellemeniz gerekiyor."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" hesabı, güvenlik ayarları güncellemesi gerektiriyor."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Güvenlik güncellemesi gerekli"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" hesabı güvenlik gereksinimleri nedeniyle senkronize edilemez."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" hesabı, güvenlik ayarları güncellemesi gerektiriyor."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"\"<xliff:g id="ACCOUNT">%s</xliff:g>\" hesabının güvenlik ayarları değiştirildi; kullanıcının işlem yapmasına gerek yok."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Güvenlik güncellemesi gerekli"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Güvenlik politikaları değişti"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Güvenlik politikaları karşılanamıyor"</string>
<string name="account_security_title" msgid="3511543138560418587">"Cihaz güvenliği"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"<xliff:g id="SERVER">%s</xliff:g> sunucusu, Android telefonunuzdaki bazı güvenlik özelliklerini uzaktan kontrol etmesine izin vermenizi gerektiriyor."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Ayrıntıları düzenle"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Ekran kilidinizin PIN veya şifresinin süresi doldu."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Ekr kilidi şifr süresi doldu"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Ekran kilidi şifresinin süresi doluyor"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Ekran kilidi PIN\'inizi veya şifrenizi yakında değiştirmeniz gerekiyor, aksi takdirde <xliff:g id="ACCOUNT">%s</xliff:g> hesabına ait veriler silinecek. Şimdi değiştirmek ister misiniz?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Ekran kilidi PIN\'inizi veya şifrenizi kısa süre içinde değiştirmeniz gerekiyor, aksi takdirde <xliff:g id="ACCOUNT">%s</xliff:g> hesabına ait veriler silinecek. Bunu şimdi değiştirmek ister misiniz?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Ekran kilidi şifresinin süresi doldu"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"<xliff:g id="ACCOUNT">%s</xliff:g> kullanıcısının verileri cihazınızdan siliniyor. Ekran kilidi PIN\'inizi veya şifrenizi değiştirerek bu verileri geri yükleyebilirsiniz. Şimdi değiştirmek ister misiniz?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"<xliff:g id="ACCOUNT">%s</xliff:g> hesabına ait veriler cihazınızdan siliniyor. Ekran kilidi PIN\'inizi veya şifrenizi değiştirerek bu verileri geri yükleyebilirsiniz. Bunu şimdi değiştirmek ister misiniz?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Kaydedilmeyen değişiklikler silinsin mi?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Oturum açılamadı."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"<xliff:g id="ACCOUNT">%s</xliff:g> için kullanıcı adı veya şifre yanlış. Şimdi güncellemek ister misiniz?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"<xliff:g id="ACCOUNT">%s</xliff:g> için kullanıcı adı veya şifre yanlış. Bunları şimdi güncellemek ister misiniz?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Varsayılan hesap"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"E-postaları varsayılan olarak bu hesaptan gönder"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Ekleri indir"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Son iletilerin eklerini Kablosuz üzerinden otomatik indir"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"E-posta bildirimleri"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Sıklığı, bildirimleri vs. senkronize et"</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"E-posta geldiğinde Sistem çubuğunda bildir"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"E-posta geldiğinde bildirim gönder"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Gelen kutusunu denetleme sıklığı"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Gelen ayarlar"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Kullanıcı adı, şifre ve diğer gelen sunucu ayarları"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Giden ayarlar"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Kullanıcı adı, şifre ve diğer giden sunucu ayarları"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Politikalar uygulandı"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Hiçbiri"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Desteklenmeyen politikalar"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Hiçbiri"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Senkronize etmeyi dene"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Bu hesabı senkronize etmek için buraya dokunun"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Hesap adı"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Adınız"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"İmza"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Hızlı yanıtlar"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"E-posta oluştururken sık girdiğiniz metinleri düzenleyin"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"E-posta oluştururken sık girdiğiniz metinleri düzenleyin"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Gönderdiğiniz iletilere metin ekleyin"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Bildirim ayarları"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Veri kullanımı"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Güvenlik politikaları"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Hızlı yanıtı düzenle"</string>
<string name="save_action" msgid="1988862706623227093">"Kaydet"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Kişileri senkronize et"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Bu hesaba ilişkin kişileri senkronize et"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Takvim\'i Senkronize Et"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Bu hesaba ilişkin takvimi senkronize et"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Takvimi senkronize et"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Bu hesabın takvim etkinliğini senkronize et"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"E-postayı senk. et"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Bu hesaba ilişkin e-postaları senkronize et"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Titreşim"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="DOMAIN">%2$s</xliff:g> alanından <xliff:g id="RESULTS">%1$d</xliff:g> sonuç"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Ayarlar"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Genel"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Genel ayarlar"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Uygulama"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Otomatik ilerle"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Bir iletiyi sildikten sonra gösterilecek ekranı seçin"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Onay kutularını gizle"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"İleti listelerinde seçmek için dokunun ve basılı tutun"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Silmeden önce onayla"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"İletiler"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Göndermeden önce onayla"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"İletiler"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Şu iletiye ilerle:"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Daha yeni ileti"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Eski ileti"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Sonuçlar bekleniyor"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Bazı sunucularda uzun sürebilir."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Klasörler"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Cihaz kamerasının kullanımına izin verme"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Cihaz şifresi gerektir"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Son şifrelerin tekrar kullanılmasını kısıtla"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Şifrelerde son kullanım tarihi gerektir"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Boştaki cihazın ekranını kilitlemesini gerektir"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Senk. edilen takvim etkinliği sayısını sınırlandır"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Senkronize edilen e-posta sayısını sınırlandır"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Teşekkür ederiz!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Benim için uygun görünüyor!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Bunu daha sonra okuyup size geri döneceğim."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Bu konuyu tartışmak üzere bir toplantı ayarlayalım."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Dolaşımdayken bu hesabın arka plan senkronizasyonu devre dışı bırakılır."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Yanıt gönderiliyor..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"İleti yok."</string>
</resources>
diff --git a/res/values-tr/uploader.xml b/res/values-tr/uploader.xml
index 1c367db16..a7a307625 100644
--- a/res/values-tr/uploader.xml
+++ b/res/values-tr/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Ayrıntıları Gizle"</string>
<string name="menu_settings" msgid="5088116127086866634">"Ayarlar"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Yükleme tarihi: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="PERCENTSIGN">%%</xliff:g><xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Hesap"</string>
<string name="upload" msgid="2615541458361216022">"Yükle"</string>
<string name="ok" msgid="2516349681897895312">"TAMAM"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 578e4092f..2782d1e1c 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Читати вкладені файли пошти"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Дозволяє програмі читати вкладені файли вашої пошти."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Дозволяє програмі читати вкладені файли вашої пошти."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Доступ до даних постачальника послуг електронної пошти"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Дозволяє програмі отримувати доступ до бази даних вашої пошти, зокрема отриманих і надісланих повідомлень, імен користувачів та паролів."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Дозволяє програмі отримувати доступ до бази даних вашої пошти, зокрема отриманих і надісланих повідомлень, імен користувачів та паролів."</string>
<string name="app_name" msgid="5815426892327290362">"Ел.пошта"</string>
<string name="compose_title" msgid="427986915662706899">"Написати"</string>
<string name="debug_title" msgid="5175710493691536719">"Налагодж."</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Готово"</string>
<string name="create_action" msgid="3062715563215392251">"Створити"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Видалити"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Швидких відповідей немає"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Швидких відповідей немає."</string>
<string name="discard_action" msgid="6532206074859505968">"Відхилити"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Зберег. чернетку"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Вставити швидк.відповідь"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Пошук"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Налашт-ня обл. зап."</string>
<string name="settings_action" msgid="6334807007967459412">"Налаштування"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Параметри синхронізації"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Параметри синхронізації"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Позн. як непрочит."</string>
<string name="move_action" msgid="3059189775933985898">"Переміст."</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+Копія/прихована"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> напис.:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Додати цитований текст"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Включити текст"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Потрібно додати принаймні 1 отримувача."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Додайте принаймні одного отримувача."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Деякі електронні адреси недійсні."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Файл завеликий для вклад."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Вставити швидку відповідь"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Збережено"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Зупинити"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Вклад. файл збереж. як <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Вкладений файл не збережено."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Примітка. Перед надсиланням буде завантажено один або кілька вкладених файлів із повідомлення, яке ви пересилаєте."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Вкладений файл не збережено."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Перед надсиланням буде завантажено один або кілька вкладених файлів із повідомлення, яке ви пересилаєте."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Повідомлення"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Запрошення"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Не вдалося переслати один або кілька вкладених файлів."</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Вкладений файл не переслано"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"Помилка входу в обліковий запис <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Помилка входу в обліковий запис <xliff:g id="ACCOUNT_NAME">%s</xliff:g>."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Не вдалося ввійти"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> Б"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Старіші"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" – "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Налаштування облікового запису"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Додати обл. запис Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Додати обл. запис Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Обліковий запис електронної пошти"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Можна налаштувати пошту для більшості облікових записів за допомогою лише кількох дій."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Можна налаштувати обліковий запис Exchange за допомогою лише кількох дій."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Можна налаштувати обліковий запис Exchange ActiveSync за допомогою лише кількох дій."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Обліковий запис можна налаштувати за допомогою лише кількох дій."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Електронна адреса"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Пароль"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Надс. ел.листи з цього обл. зап. за умовч."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Надсилати електронні листи з цього облікового запису за умовчанням"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Налашт-ня вручну"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Введіть дійсну електронну адресу та пароль."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Копія облікового запису"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Перевірка налашт-нь вихід. сервера…"</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Перевірка налашт-нь вихід. сервера…"</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Налаштування облікового запису"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Ваш обліковий запис налаштовано. Скоро надійдуть листи!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Ваш обліковий запис налаштовано. Скоро надійдуть листи!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Назвіть цей обл. запис. (додатково)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Ваше ім\'я (відображено у вихідних повідомл.)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Це поле не може бути порожнім."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Параметри сервера вхідних повідомлень"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Ім\'я корист."</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Пароль"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Cервер POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Сервер IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Сервер"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Порт"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Тип безпеки"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Немає"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Сервер SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Порт"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Тип безпеки"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Необхідно ввійти."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Потрібно ввійти"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Ім\'я корист."</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Пароль"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Налаштування облікового запису"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Кожні 15 хвилин"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Кожні 30 хвилин"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Щогодини"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Надс. ел.листи з цього обл. зап. за умовч."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Сповіщ. мене, коли надійде лист"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Синхрон. контакти з цього обл. зап."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Синхроніз. календ. з обл. запису."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Синхр. ел. пошту з обл. запису."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Надсилати електронні листи з цього облікового запису за умовчанням"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Сповіщати мене, коли надходить лист"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Синхронізувати контакти з цього облікового запису"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Синхронізувати календар із цього облікового запису"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Синхронізувати електронну пошту з цього облікового запису"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Автоматично завантажувати вкладення, коли є з\'єднання з Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Не вдалося закінчити"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Синхронізувати за стільки днів:"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Один місяць"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Усі"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Парам. обл.зап. за умовч."</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Ім\'я кор. або пароль неправильн."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Ім\'я корист. чи пароль неправильн."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Ім’я користувача чи пароль неправильні."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Ім’я користувача або пароль неправильні."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Неможливо безпечно з’єднатись із сервером."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Неможливо безпечно з’єднатися із сервером."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Потрібен сертифікат клієнта. Під’єднатися до сервера із сертифікатом клієнта?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Сертифікат недійсний або недоступний."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Сервер повідомив про помилку. Перевірте своє ім’я користувача та пароль і повторіть спробу."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Потрібен сертифікат клієнта. Під’єднатися до сервера із сертифікатом клієнта?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Сертифікат недійсний або недоступний."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Сервер повідомив про помилку. Перевірте своє ім’я користувача та пароль і повторіть спробу."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Неможливо з’єднатись із сервером."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Неможливо з’єднатись із сервером."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS обов\'язк., але не підтрм. цим сервером."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"ЗАСТЕРЕЖЕННЯ. Дезактивація повноважень програми електронної пошти на адміністрування вашого пристрою призведе до видалення всіх облікових записів електронної пошти, що потребують адміністрування, разом з їхніми електронними листами, контактами, подіями календаря й іншими даними."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Оновлення системи безпеки"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"Потрібно оновити налаштування безпеки для облікового запису <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Облік. запис \"<xliff:g id="ACCOUNT">%s</xliff:g>\" потреб. оновл. налашт-нь безпеки"</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Потрібне оновл. сист. безпеки"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Обліковий запис \"<xliff:g id="ACCOUNT">%s</xliff:g>\" неможливо синхронізувати через вимоги безпеки."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Для облікового запису \"<xliff:g id="ACCOUNT">%s</xliff:g>\" потрібно оновити налаштування безпеки."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Налаштування безпеки облікового запису \"<xliff:g id="ACCOUNT">%s</xliff:g>\" змінено. Користувачу не потрібно нічого робити."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Потрібно оновити прав. безпеки"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Правила безпеки змінено"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Неможл. дотрим. правил безпеки"</string>
<string name="account_security_title" msgid="3511543138560418587">"Безпека пристрою"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Сервер <xliff:g id="SERVER">%s</xliff:g> потребує вашого дозволу віддалено контролювати деякі функції безпеки вашого пристрою Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Редаг. деталі"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Термін дії PIN-коду чи пароля блокування екрана закінчився."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Пароль блок. екр. вже не діє"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Терм. дії пароля блок. екр. закінчується"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Незабаром потрібно буде змінити PIN-код або пароль блокування екрана, інакше дані для <xliff:g id="ACCOUNT">%s</xliff:g> буде стерто. Змінити зараз?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Незабаром потрібно буде змінити PIN-код або пароль блокування екрана, інакше дані для облікового запису <xliff:g id="ACCOUNT">%s</xliff:g> буде стерто. Змінити зараз?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Терм. дії пароля блок. екрана закінчився"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Дані для <xliff:g id="ACCOUNT">%s</xliff:g> стираються з вашого пристрою. Їх можна відновити, змінивши PIN-код або пароль блокування екрана. Змінити зараз?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Дані для облікового запису <xliff:g id="ACCOUNT">%s</xliff:g> стираються з вашого пристрою. Їх можна відновити, змінивши PIN-код або пароль блокування екрана. Змінити зараз?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Відхилити незбережені зміни?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Не вдалося ввійти"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Ім’я користувача чи пароль для <xliff:g id="ACCOUNT">%s</xliff:g> неправильні. Оновити зараз?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Ім’я користувача чи пароль для облікового запису <xliff:g id="ACCOUNT">%s</xliff:g> неправильні. Оновити зараз?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Обл. зап. за умовч."</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Надіс. ел.листи з цього обл. зап. за умовч."</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Завантажити вкладені файли"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Автом. завантажувати вклад. файли з останніх повідом. через WiFi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Сповіщення ел. пошти"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Синхронізуйте частоту, сповіщення тощо"</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Сповіщати в системному рядку про надходження листа"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Надсилати сповіщення, коли надходить лист"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Частота перевірки вхідн."</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Налашт. вхід. повід."</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Ім’я корист., пароль й інші налашт-ня сервера вхідних повідомл."</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Налашт-ня вихідних"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Ім’я корист., пароль й інші налашт-ня сервера вихідних повідомл."</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Правила, які застосовуються"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Немає"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Правила, які не підтримуються"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Немає"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Спробувати синхронізувати"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Торкніться тут, щоб синхронізувати цей обліковий запис"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Назва обл. зап."</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Ваше ім\'я"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Підпис"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Швидкі відповіді"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Змінити текст, який часто вставляється під час створення листів"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Редагувати текст, що часто вставляється під час створення листів"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Додав. текст у надісл. повідомл."</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Налаштування сповіщень"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Використання даних"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Правила безпеки"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Редагувати швидку відповідь"</string>
<string name="save_action" msgid="1988862706623227093">"Зберегти"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Синхрон. контакти"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Синхрон. контакти для облік. запису"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Синхроніз. Календар"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Синхроніз. календар для обл. запису"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Синхрон. календ."</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Синхроніз. календар із цим обл.зап."</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Синхроніз. ел.пошту"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Синхрон. ел. пошту для обл. запису"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Вібросигнал"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"Результатів з <xliff:g id="DOMAIN">%2$s</xliff:g>: <xliff:g id="RESULTS">%1$d</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Налаштування"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Загальні"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Загальні налаштування"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Програма"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Автоматичний перехід"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Виберіть, що відображати після видалення повідомлення"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Cховати прапорці"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"У списках повідомлень торкніться й утримуйте, щоб вибрати"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Підтвердити перед видаленням"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Повідомлення"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Підтвердити перед надсиланням"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Повідомлення"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Перейти до"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Новішого повідомлення"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Старішого повідомлення"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Очікування результатів"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Деяким серверам потрібно багато часу."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Папки"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Забороняти використання камери пристрою"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Вимагати пароль пристрою"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Обмежувати повторне викор. остан.паролів"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Вимагати закінчення терміну дії пароля"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Вимаг. блок-ня екрана неактивн. пристрою"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Обмежувати к-сть синхронізованих подій календаря"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Обмежувати к-сть синхронізованих електрон. листів"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Дякую!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Мені підходить!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Я прочитаю це пізніше, а потім дам знати."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Потрібно зустрітися, щоб це обговорити."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"У роумінгу фонову синхронізацію для цього облікового запису вимкнено."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Надсилання відповіді..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Немає повідомлень."</string>
</resources>
diff --git a/res/values-uk/uploader.xml b/res/values-uk/uploader.xml
index f894c08dc..6f6af5bb9 100644
--- a/res/values-uk/uploader.xml
+++ b/res/values-uk/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Сховати деталі"</string>
<string name="menu_settings" msgid="5088116127086866634">"Налаштування"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Завантажено: %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Обліковий запис"</string>
<string name="upload" msgid="2615541458361216022">"Завантажити"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 686e910b3..94731a2d4 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Đọc tệp đính kèm trong email"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Cho phép ứng dụng này đọc tệp đính kèm trong email của bạn."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Cho phép ứng dụng đọc tệp đính kèm trong email của bạn."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Truy cập dữ liệu của nhà cung cấp email"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Cho phép ứng dụng này truy cập cơ sở dữ liệu email của bạn, bao gồm thư đã nhận, thư đã gửi, tên người dùng và mật khẩu."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Cho phép ứng dụng truy cập cơ sở dữ liệu email của bạn, bao gồm thư đã nhận, thư đã gửi, tên người dùng và mật khẩu."</string>
<string name="app_name" msgid="5815426892327290362">"Email"</string>
<string name="compose_title" msgid="427986915662706899">"Soạn"</string>
<string name="debug_title" msgid="5175710493691536719">"Gỡ lỗi"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Xong"</string>
<string name="create_action" msgid="3062715563215392251">"Tạo mới"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Xóa"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Không có câu trả lời nhanh nào"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Không có câu trả lời nhanh nào."</string>
<string name="discard_action" msgid="6532206074859505968">"Hủy"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Lưu thư nháp"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Chèn trả lời nhanh"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Tìm kiếm"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Cài đặt tài khoản"</string>
<string name="settings_action" msgid="6334807007967459412">"Cài đặt"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Tùy chọn đồng bộ hóa"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Tùy chọn đồng bộ hóa"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Đánh dấu là chưa đọc"</string>
<string name="move_action" msgid="3059189775933985898">"Di chuyển"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g> đã viết:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Bao gồm nội dung được trích dẫn"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Bao gồm văn bản"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Bạn phải thêm ít nhất một người nhận."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Thêm ít nhất một người nhận."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Một số địa chỉ email không hợp lệ."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Tệp quá lớn để có thể đính kèm."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Chèn trả lời nhanh"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Đã lưu"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Dừng"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Đã lưu tệp đính kèm với tên <xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Không thể lưu tệp đính kèm."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Lưu ý: Một hoặc nhiều tệp đính kèm trong thư chuyển tiếp của bạn sẽ được tải xuống trước khi gửi."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Không thể lưu tệp đính kèm."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Một hoặc nhiều tệp đính kèm trong thư chuyển tiếp của bạn sẽ được tải xuống trước khi gửi."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Thư"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Mời"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Không thể chuyển tiếp một hoặc nhiều tệp đính kèm"</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Tệp đính kèm không được chuyển tiếp"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> đăng nhập không thành công."</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"Đăng nhập vào <xliff:g id="ACCOUNT_NAME">%s</xliff:g> không thành công."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Không thể đăng nhập"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Cũ hơn"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Thiết lập tài khoản"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Thêm tài khoản Exchange"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Thêm tài khoản Exchange ActiveSync"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"Tài khoản email"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Bạn có thể thiết lập email cho hầu hết mọi tài khoản chỉ bằng vài bước."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Bạn có thể thiết lập tài khoản Exchange chỉ bằng vài bước."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Bạn có thể thiết lập tài khoản Exchange ActiveSync chỉ bằng vài bước."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Bạn có thể thiết lập tài khoản của mình chỉ bằng vài bước."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Địa chỉ email"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Mật khẩu"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Gửi email từ tài khoản này theo mặc định."</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Gửi email từ tài khoản này theo mặc định"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Thiết lập thủ công"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Hãy nhập địa chỉ email và mật khẩu hợp lệ."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"Tài khoản trùng lặp"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Đang kiểm tra cài đặt máy chủ thư đến..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Đang kiểm tra cài đặt máy chủ thư đi..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Thiết lập tài khoản"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"Tài khoản của bạn đã được thiết lập và email đang được gửi!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"Tài khoản của bạn đã được thiết lập và email đang được gửi!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Đặt tên cho tài khoản này (tùy chọn)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Tên bạn (được hiển thị trong tin nhắn đi)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Không được để trống trường này."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Cài đặt máy chủ thư đến"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Tên người dùng"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Mật khẩu"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Máy chủ POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Máy chủ IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Máy chủ"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Cổng"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Loại bảo mật"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Không"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Máy chủ SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Cổng"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Loại bảo mật"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Yêu cầu đăng nhập."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Yêu cầu đăng nhập"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Tên người dùng"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Mật khẩu"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Thiết lập tài khoản"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"15 phút một lần"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"30 phút một lần"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Hàng giờ"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Gửi email từ tài khoản này theo mặc định."</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Thông báo cho tôi khi email đến."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Đồng bộ hóa danh bạ từ tài khoản này."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Đồng bộ hóa lịch từ tài khoản này."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Đồng bộ hóa email từ tài khoản này."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Gửi email từ tài khoản này theo mặc định"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Thông báo cho tôi khi email đến"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Đồng bộ hóa danh bạ từ tài khoản này"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Đồng bộ hóa lịch từ tài khoản này"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Đồng bộ hóa email từ tài khoản này"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Tự động tải xuống tệp đính kèm khi được kết nối Wi-Fi"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Không thể kết thúc"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Số ngày đồng bộ hóa"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Một tháng"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Tất cả"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Sử dụng mặc định của tài khoản"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Tên người dùng hoặc mật khẩu không chính xác."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Tên người dùng hoặc mật khẩu không chính xác."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Tên người dùng hoặc mật khẩu không chính xác."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Tên người dùng hoặc mật khẩu không chính xác."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Không thể kết nối an toàn với máy chủ."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Không thể kết nối an toàn với máy chủ."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Yêu cầu chứng chỉ ứng dụng khách. Kết nối với máy chủ có chứng chỉ ứng dụng khách?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Chứng chỉ không hợp lệ hoặc không thể truy cập được."</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Máy chủ trả về lỗi. Hãy kiểm tra tên người dùng và mật khẩu rồi thử lại."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Cần chứng chỉ ứng dụng khách. Bạn có muốn kết nối với máy chủ bằng chứng chỉ ứng dụng khách không?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Chứng chỉ không hợp lệ hoặc không thể truy cập được."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Máy chủ trả về lỗi. Hãy kiểm tra tên người dùng và mật khẩu rồi thử lại."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Không thể kết nối với máy chủ."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Không thể kết nối với máy chủ."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"TLS được yêu cầu nhưng không được máy chủ hỗ trợ."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"CẢNH BÁO: Việc vô hiệu hóa quyền quản lý điện thoại của bạn của ứng dụng Email sẽ xóa tất cả tài khoản email yêu cầu quyền đó, cùng với email, địa chỉ liên hệ, sự kiện lịch và các dữ liệu khác."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Cập nhật bảo mật"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> yêu cầu bạn cập nhật cài đặt bảo mật của mình."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"Tài khoản \"<xliff:g id="ACCOUNT">%s</xliff:g>\" yêu cầu cập nhật cài đặt bảo mật."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Yêu cầu cập nhật bảo mật"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"Không thể đồng bộ hóa tài khoản \"<xliff:g id="ACCOUNT">%s</xliff:g>\" do các yêu cầu về bảo mật."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"Tài khoản \"<xliff:g id="ACCOUNT">%s</xliff:g>\" yêu cầu cập nhật cài đặt bảo mật."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"Tài khoản \"<xliff:g id="ACCOUNT">%s</xliff:g>\" đã thay đổi cài đặt bảo mật; không yêu cầu bất kỳ tác vụ người dùng nào."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Yêu cầu cập nhật bảo mật"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Chính sách bảo mật đã thay đổi"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Ko thể đáp ứng c.sách bảo mật"</string>
<string name="account_security_title" msgid="3511543138560418587">"Bảo mật thiết bị"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Máy chủ <xliff:g id="SERVER">%s</xliff:g> yêu cầu bạn cho phép kiểm soát từ xa một số tính năng bảo mật của thiết bị Android của bạn."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Chỉnh sửa chi tiết"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Mật khẩu hoặc mã PIN khóa màn hình của bạn đã hết hạn."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Mật khẩu khóa màn hình đã hết hạn"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Mật khẩu khóa màn hình sắp hết hạn"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Bạn phải sớm thay đổi mã PIN hoặc mật khẩu khóa màn hình của mình, nếu không dữ liệu cho <xliff:g id="ACCOUNT">%s</xliff:g> sẽ bị xóa. Thay đổi ngay bây giờ?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Bạn cần phải sớm thay đổi PIN khóa màn hình hoặc mật khẩu, nếu không dữ liệu của <xliff:g id="ACCOUNT">%s</xliff:g> sẽ bị xóa. Bạn có muốn thay đổi ngay bây giờ không?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Mật khẩu khóa màn hình đã hết hạn"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Dữ liệu của <xliff:g id="ACCOUNT">%s</xliff:g> đang bị xóa khỏi thiết bị của bạn. Bạn có thể khôi phục dữ liệu đó bằng cách thay đổi mật khẩu hoặc mã PIN khóa màn hình của mình. Bạn có muốn thay đổi ngay bây giờ không?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Dữ liệu của <xliff:g id="ACCOUNT">%s</xliff:g> đang bị xóa khỏi thiết bị của bạn. Bạn có thể khôi phục dữ liệu bằng cách thay đổi PIN khóa màn hình hoặc mật khẩu của mình. Bạn có muốn thay đổi ngay bây giờ không?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Hủy những thay đổi chưa lưu?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Không thể đăng nhập"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Tên người dùng hoặc mật khẩu của <xliff:g id="ACCOUNT">%s</xliff:g> không đúng. Cập nhật tên người dùng hoặc mật khẩu ngay bây giờ?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Tên người dùng hoặc mật khẩu của <xliff:g id="ACCOUNT">%s</xliff:g> không chính xác. Bạn có muốn cập nhật các thông tin này ngay bây giờ không?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"Tài khoản mặc định"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Gửi email từ tài khoản này theo mặc định"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Tải xuống tệp đính kèm"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Tự động tải xuống tệp đính kèm tin nhắn gần đây qua Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Thông báo qua email"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Đồng bộ hóa tần suất, thông báo, v.v."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Thông báo trên thanh Hệ thống khi email đến"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Gửi thông báo khi email đến"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Tần suất kiểm tra hộp thư đến"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Cài đặt thư đến"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Tên người dùng, mật khẩu và các cài đặt máy chủ thư đến khác"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Cài đặt thư đi"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Tên người dùng, mật khẩu và cài đặt máy chủ thư đi khác"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Chính sách bắt buộc"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Bỏ chọn tất cả"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Chính sách không được hỗ trợ"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Bỏ chọn tất cả"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Thử đồng bộ hóa"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Chạm vào đây để đồng bộ hóa tài khoản này"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Tên tài khoản"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Tên bạn"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Chữ ký"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Trả lời nhanh"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Chỉnh sửa văn bản mà bạn thường xuyên chèn khi soạn email"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Chỉnh sửa văn bản mà bạn thường xuyên chèn khi soạn email"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Thêm văn bản vào tin nhắn bạn gửi"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Cài đặt thông báo"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Sử dụng dữ liệu"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Chính sách bảo mật"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Chỉnh sửa trả lời nhanh"</string>
<string name="save_action" msgid="1988862706623227093">"Lưu"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Đồng bộ hóa danh bạ"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Đồng bộ hóa danh bạ cho tài khoản này"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Đồng bộ hóa lịch"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Đồng bộ hóa lịch cho tài khoản này"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Đồng bộ hóa lịch"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Đ.bộ hóa sự kiện lịch cho TK này"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Đồng bộ hóa email"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Đồng bộ hóa email cho tài khoản này"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Rung"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> kết quả từ <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Cài đặt"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Chung"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Cài đặt chung"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Ứng dụng"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Tự động tiến"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Chọn màn hình hiển thị sau khi bạn xóa thư"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Ẩn hộp kiểm"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Trong danh sách các thư, chạm và giữ để chọn"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Xác nhận trước khi xóa"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Thư"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Xác nhận trước khi gửi"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Thư"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Chuyển sang"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Thư mới hơn"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Thư cũ hơn"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Đang chờ kết quả"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Một số máy chủ có thể xử lý lâu."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Thư mục"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Ko cho phép sử dụng máy ảnh của thiết bị"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Yêu cầu mật khẩu của thiết bị"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Hạn chế sử dụng lại các mật khẩu gần đây"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Buộc mật khẩu hết hạn"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Thiết bị cần ở chế độ rảnh để khóa màn hình"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Giới hạn số lượng sự kiện lịch được đồng bộ hóa"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Giới hạn số lượng email được đồng bộ hóa"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Cảm ơn bạn!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Tôi thấy được đấy!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Tôi sẽ đọc thư này sau và sẽ liên hệ lại với bạn."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Chúng ta hãy cùng tổ chức một cuộc họp để thảo luận về vấn đề này."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Đồng bộ hóa nền cho tài khoản này bị tắt trong khi chuyển vùng."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Đang gửi trả lời..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Không có thư nào."</string>
</resources>
diff --git a/res/values-vi/uploader.xml b/res/values-vi/uploader.xml
index f8ad2a055..66c63744e 100644
--- a/res/values-vi/uploader.xml
+++ b/res/values-vi/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Ẩn chi tiết"</string>
<string name="menu_settings" msgid="5088116127086866634">"Cài đặt"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Đã tải lên %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"Tài khoản"</string>
<string name="upload" msgid="2615541458361216022">"Tải lên"</string>
<string name="ok" msgid="2516349681897895312">"OK"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 0db981d8c..f86000d9c 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"读取电子邮件附件"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"允许此应用读取您的电子邮件附件。"</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"允许此应用读取您的电子邮件附件。"</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"访问电子邮件服务提供商数据"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"允许此应用访问您的电子邮件数据库,包括已收邮件、已发邮件、用户名和密码。"</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"允许此应用访问您的电子邮件数据库,包括已收邮件、已发邮件、用户名和密码。"</string>
<string name="app_name" msgid="5815426892327290362">"电子邮件"</string>
<string name="compose_title" msgid="427986915662706899">"写邮件"</string>
<string name="debug_title" msgid="5175710493691536719">"调试"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"完成"</string>
<string name="create_action" msgid="3062715563215392251">"新建"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"删除"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"没有快速回复"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"没有快速回复。"</string>
<string name="discard_action" msgid="6532206074859505968">"放弃"</string>
<string name="save_draft_action" msgid="6413714270991417223">"保存草稿"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"插入快速回复"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"搜索"</string>
<string name="account_settings_action" msgid="4494079183315085171">"帐户设置"</string>
<string name="settings_action" msgid="6334807007967459412">"设置"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"同步选项"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"同步选项"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"标记为未读"</string>
<string name="move_action" msgid="3059189775933985898">"移动"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+抄送/密送"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>编写:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"包含引用文字"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"包含原文"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"必须至少添加一个收件人。"</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"请至少添加一位收件人。"</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"某些电子邮件地址无效。"</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"文件太大,无法附加。"</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"插入快速回复"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"已保存"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"停止"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"附件已另存为“<xliff:g id="FILENAME">%s</xliff:g>”。"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"无法保存该附件。"</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"注意:您的转发邮件中有一个或多个附件会先下载再发送。"</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"无法保存附件。"</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"您转发的邮件中有一个或多个附件需要先下载,然后才能发送。"</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"邮件"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"邀请"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"一个或多个附件无法转发。"</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"无法转发附件"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> 登录失败。"</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> 登录失败。"</string>
<string name="login_failed_title" msgid="7624349996212476176">"无法登录"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g> B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"更早"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" - "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"帐户设置"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"添加 Exchange 帐户"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"添加 Exchange ActiveSync 帐户"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"电子邮件帐户"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"您只需执行几个步骤,即可为大多数帐户设置电子邮件。"</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"您只需执行几个步骤,即可设置 Exchange 帐户。"</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"您只需执行几个步骤,即可设置 Exchange ActiveSync 帐户。"</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"只需几步操作,即可设置自己的帐户。"</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"电子邮件地址"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"密码"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"默认情况下从此帐户发送电子邮件。"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"默认情况下从此帐户发送电子邮件"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"手动设置"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"请键入有效的电子邮件地址和密码。"</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"帐户重复"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"正在检查接收服务器设置..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"正在检查外发服务器设置..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"帐户设置"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"您的帐户已设置完毕,可以收发电子邮件了!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"您的帐户已设置完毕,可以收发电子邮件了!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"为此帐户创建名称(可选)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"您的姓名(显示在外发邮件上)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"此字段不能为空。"</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"接收服务器设置"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"用户名"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"密码"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3 服务器"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP 服务器"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"服务器"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"端口"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"安全类型"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"无"</string>
@@ -271,7 +266,7 @@
<string name="account_setup_incoming_security_tls_trust_certificates_label" msgid="6149084428423662620">"STARTTLS(接受所有证书)"</string>
<string name="account_setup_incoming_security_tls_label" msgid="6573498431821879660">"STARTTLS"</string>
<string name="account_setup_incoming_delete_policy_label" msgid="9213590134693857912">"从服务器中删除电子邮件"</string>
- <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"一律不"</string>
+ <string name="account_setup_incoming_delete_policy_never_label" msgid="3222897501875871041">"永不"</string>
<string name="account_setup_incoming_delete_policy_delete_label" msgid="222216840911785631">"当我从收件箱中删除时"</string>
<string name="account_setup_incoming_imap_path_prefix_label" msgid="401167247072926810">"IMAP 路径前缀"</string>
<string name="account_setup_incoming_imap_path_prefix_hint" msgid="9190845919067906033">"可选"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP 服务器"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"端口"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"安全类型"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"需要登录。"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"要求登录"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"用户名"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"密码"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"帐户设置"</string>
@@ -298,18 +293,18 @@
<string name="account_setup_options_title" msgid="9016600767888846051">"帐户设置"</string>
<string name="account_setup_options_headline" msgid="4181274232835368085">"帐户选项"</string>
<string name="account_setup_options_mail_check_frequency_label" msgid="4824859792882810053">"邮件查收频率"</string>
- <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"一律不"</string>
+ <string name="account_setup_options_mail_check_frequency_never" msgid="287951859480505416">"永不"</string>
<string name="account_setup_options_mail_check_frequency_push" msgid="5934525907736008673">"自动(推送)"</string>
<string name="account_setup_options_mail_check_frequency_5min" msgid="6388939895878539307">"每隔 5 分钟"</string>
<string name="account_setup_options_mail_check_frequency_10min" msgid="5344463157247877480">"每隔 10 分钟"</string>
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"每隔 15 分钟"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"每隔 30 分钟"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"每小时"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"默认情况下从此帐户发送电子邮件。"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"收到电子邮件时通知我。"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"同步此帐户下的联系人。"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"同步此帐户下的日历。"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"同步此帐户中的电子邮件。"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"默认情况下从此帐户发送电子邮件"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"收到电子邮件时通知我。"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"同步此帐户中的联系人"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"同步此帐户中的日历"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"同步此帐户中的电子邮件"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"连接到 Wi-Fi 后自动下载附件"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"无法完成"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"要同步的天数"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"一个月"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"全部"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"使用帐户的默认设置"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"用户名或密码不正确。"</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"用户名或密码不正确。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"用户名或密码不正确。"</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"用户名或密码不正确。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"无法安全地连接到服务器。"</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"无法安全地连接到服务器。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"需要客户端证书。要通过客户端证书连接到服务器吗?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"证书无效或无法使用。"</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"该服务器返回了包含错误讯息的响应。请检查您的用户名和密码,然后重试。"</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"需要客户端证书。要通过客户端证书连接到服务器吗?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"证书无效或无法使用。"</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"该服务器返回了包含错误讯息的响应。请检查您的用户名和密码,然后重试。"</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"无法连接到服务器。"</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"无法连接到服务器。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"需要 TLS,但服务器不支持 TLS。"</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"警告:撤消“电子邮件”应用管理您设备的权限会删除所有需要此权限的电子邮件帐户,以及这些帐户中的电子邮件、联系人、日历活动和其他数据。"</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"安全更新"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> 要求更新您的安全设置。"</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"帐户“<xliff:g id="ACCOUNT">%s</xliff:g>”要求更新安全设置。"</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"需要进行安全更新"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"帐户“<xliff:g id="ACCOUNT">%s</xliff:g>”由于安全要求而无法同步。"</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"帐户“<xliff:g id="ACCOUNT">%s</xliff:g>”需要更新安全设置。"</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"帐户“<xliff:g id="ACCOUNT">%s</xliff:g>”已更改其安全设置,用户无需进行任何操作。"</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"需要进行安全更新"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"安全政策已更改"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"无法满足安全政策的要求"</string>
<string name="account_security_title" msgid="3511543138560418587">"设备安全性"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"“<xliff:g id="SERVER">%s</xliff:g>”服务器要求您允许其远程控制您 Android 设备的某些安全功能。"</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"编辑详情"</string>
@@ -353,45 +352,52 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"您的锁定屏幕 PIN 或密码已过期。"</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"锁定屏幕密码已过期"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"锁定屏幕密码即将过期"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"您必须尽快更改锁定屏幕 PIN 或密码,否则系统会清除 <xliff:g id="ACCOUNT">%s</xliff:g> 的数据。要立即更改吗?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"您需要尽快更改锁定屏幕 PIN 或密码,否则系统将会清除 <xliff:g id="ACCOUNT">%s</xliff:g> 的数据。要立即更改吗?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"锁定屏幕密码已过期"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"<xliff:g id="ACCOUNT">%s</xliff:g> 的数据已从设备中清除。您可以通过更改锁定屏幕 PIN 或密码还原这些数据。要立即更改吗?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"<xliff:g id="ACCOUNT">%s</xliff:g> 的数据已从设备中清除。您可以通过更改锁定屏幕 PIN 或密码来还原这些数据。要立即更改吗?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"要舍弃未保存的更改?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"无法登录"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"<xliff:g id="ACCOUNT">%s</xliff:g> 的用户名或密码错误。要立即更新吗?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"<xliff:g id="ACCOUNT">%s</xliff:g> 的用户名或密码不正确。要立即更新吗?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"默认帐户"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"默认情况下从此帐户发送电子邮件"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"下载附件"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"通过 Wi-Fi 自动下载最新邮件的附件"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"电子邮件通知"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"同步频率、通知等。"</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"收到电子邮件时在系统栏中显示通知"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"收到电子邮件时发送通知"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"收件箱检查频率"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"接收设置"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"用户名、密码和其他接收服务器设置"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"外发设置"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"用户名、密码和其他外发服务器设置"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"政策已执行"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"无"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"不支持的政策"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"无"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"尝试同步"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"触摸此处以同步此帐户"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"帐户名称"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"您的姓名"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"签名"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"快速回复"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"编辑撰写电子邮件时经常插入的文本"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"编辑您在撰写电子邮件时经常插入的文本"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"在您发送的邮件中附加文本"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"通知设置"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"数据使用"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"安全政策"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"编辑快速回复"</string>
<string name="save_action" msgid="1988862706623227093">"保存"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"同步联系人"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"同步此帐户的联系人"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"同步日历"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"同步此帐户的日历"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"同步日历"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"同步此帐户的日历活动"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"同步电子邮件"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"同步此帐户的电子邮件"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"振动"</string>
<string name="account_settings_vibrate_when_summary" msgid="3991584445166247189">"收到电子邮件时也振动"</string>
<string name="account_settings_vibrate_when_always" msgid="6739506816960483174">"始终"</string>
<string name="account_settings_vibrate_when_silent" msgid="6417076436551648924">"仅在静音时"</string>
- <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"一律不"</string>
+ <string name="account_settings_vibrate_when_never" msgid="3759680093309511614">"永不"</string>
<string name="account_settings_vibrate_when_dlg_title" msgid="308167729046312952">"振动"</string>
<string name="account_settings_ringtone" msgid="8229878374785575207">"选择铃声"</string>
<string name="account_settings_servers" msgid="4925493817981624242">"服务器设置"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"来自 <xliff:g id="DOMAIN">%2$s</xliff:g> 的 <xliff:g id="RESULTS">%1$d</xliff:g> 条结果"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"设置"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"常规"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"常规设置"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"应用"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"自动跳转"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"选择要在删除邮件后显示的屏幕"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"隐藏复选框"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"在邮件列表中,触摸并按住即可选择"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"删除前先确认"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"邮件"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"发送前先确认"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"邮件"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"跳转至"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"更晚的邮件"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"更早的邮件"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"正在等待结果"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"有些服务器可能会花费较长的时间。"</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"文件夹"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"不允许使用设备的相机"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"需要设备密码"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"限制重复使用近期所用密码"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"强制密码在一段时间后过期"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"要求闲置设备锁定其屏幕"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"限制同步的日历活动数"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"限制同步的电子邮件数"</string>
+ <string name="quick_1" msgid="3426057697353380951">"非常感谢!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"我觉得不错!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"稍后我会阅读此邮件并给您回复。"</string>
+ <string name="quick_4" msgid="3988974084396883051">"让我们通过会议讨论一下这个问题。"</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"漫游时停用了此帐户的后台同步功能。"</string>
+ <string name="confirm_response" msgid="5747902757569543165">"正在发送回复..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"无邮件。"</string>
</resources>
diff --git a/res/values-zh-rCN/uploader.xml b/res/values-zh-rCN/uploader.xml
index e227885cd..3dc5046fe 100644
--- a/res/values-zh-rCN/uploader.xml
+++ b/res/values-zh-rCN/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"隐藏详情"</string>
<string name="menu_settings" msgid="5088116127086866634">"设置"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"上传时间:%s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"帐户"</string>
<string name="upload" msgid="2615541458361216022">"上传"</string>
<string name="ok" msgid="2516349681897895312">"确定"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 292a16d9e..2b41f6506 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"讀取電子郵件附件"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"允許這個應用程式讀取您的電子郵件附件。"</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"允許這個應用程式讀取您的電子郵件附件。"</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"存取電子郵件供應商資料"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"允許這個應用程式存取您的電子郵件資料庫,包括收到的郵件、送出的郵件、使用者名稱和密碼。"</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"允許這個應用程式存取您的電子郵件資料庫,包括收到的郵件、寄件備份、使用者名稱和密碼。"</string>
<string name="app_name" msgid="5815426892327290362">"電子郵件"</string>
<string name="compose_title" msgid="427986915662706899">"撰寫郵件"</string>
<string name="debug_title" msgid="5175710493691536719">"偵錯"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"完成"</string>
<string name="create_action" msgid="3062715563215392251">"建立新回應"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"刪除"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"沒有快速回應"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"沒有任何快速回應。"</string>
<string name="discard_action" msgid="6532206074859505968">"捨棄"</string>
<string name="save_draft_action" msgid="6413714270991417223">"儲存草稿"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"插入快速回應"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"搜尋"</string>
<string name="account_settings_action" msgid="4494079183315085171">"帳戶設定"</string>
<string name="settings_action" msgid="6334807007967459412">"設定"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"同步處理選項"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"同步處理選項"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"標示為未讀取"</string>
<string name="move_action" msgid="3059189775933985898">"移動"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"新增副本/密件副本"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>提到:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"包含引用文字"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"包含文字"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"您必須新增至少一位收件者。"</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"請至少新增一個收件者。"</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"部分電子郵件地址無效。"</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"檔案過大,超過附件大小限制。"</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"插入快速回應"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"已儲存"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"停止"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"已將附件另存為 <xliff:g id="FILENAME">%s</xliff:g>。"</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"無法儲存附件。"</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"請注意:在傳送轉寄的郵件之前,系統會先下載郵件中一或多個附件。"</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"無法儲存附件。"</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"傳送轉寄的郵件之前,系統會先下載郵件中一或多個附件。"</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"郵件"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"邀請"</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"無法轉寄一或多個附件。"</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"無法轉寄附件"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> 登入失敗。"</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> 登入失敗。"</string>
<string name="login_failed_title" msgid="7624349996212476176">"無法登入"</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"較舊"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"帳戶設定"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"新增 Exchange 帳戶"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"新增 Exchange ActiveSync 帳戶"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"電子郵件帳戶"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"只要幾個步驟,就能設妥許多帳戶的電子郵件。"</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"只要幾個步驟,就可以設定 Exchange 帳戶。"</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"只要幾個步驟,就可以設定 Exchange ActiveSync 帳戶。"</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"只要幾個步驟即可設定您的帳戶。"</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"電子郵件地址"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"密碼"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"預設使用這個帳戶傳送電子郵件。"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"預設使用這個帳戶傳送電子郵件"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"手動設定"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"輸入有效的電子郵件地址和密碼。"</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"複製帳戶"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"正在檢查收信伺服器設定..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"正在檢查外寄伺服器設定..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"帳戶設定"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"您的帳戶已設定完成,可以收發電子郵件了!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"您的帳戶已設定完成,可以開始收發電子郵件了!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"設定帳戶名稱 (選擇性)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"您的姓名 (顯示於外寄郵件)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"這個欄位不能留空。"</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"內送伺服器設定"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"使用者名稱"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"密碼"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"POP3 伺服器"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"IMAP 伺服器"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"伺服器"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"通訊埠"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"安全性類型"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"無"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"SMTP 伺服器"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"通訊埠"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"安全性類型"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"必須登入。"</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"要求登入"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"使用者名稱"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"密碼"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"帳戶設定"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"每 15 分鐘檢查一次"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"每 30 分鐘檢查一次"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"每小時檢查一次"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"設為傳送電子郵件的預設帳戶。"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"收到電子郵件時通知我。"</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"同步處理此帳戶的聯絡人。"</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"同步處理此帳戶的日曆。"</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"同步處理此帳戶所寄的電子郵件。"</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"預設使用這個帳戶傳送電子郵件"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"收到電子郵件時通知我"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"同步處理這個帳戶的聯絡人資訊"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"同步處理這個帳戶的日曆"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"同步處理這個帳戶的電子郵件"</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"連上 Wi-Fi 時自動下載附件。"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"無法完成"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"同步處理的天數"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"1 個月"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"全部"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"使用帳戶預設值"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"使用者名稱或密碼不正確。"</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"使用者名稱或密碼不正確。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"使用者名稱或密碼不正確。"</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"使用者名稱或密碼不正確。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"無法安全連線至伺服器。"</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"無法安全連線至伺服器。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"需要用戶端憑證。您要透過用戶端憑證連線至伺服器嗎?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"憑證無效或無法使用。"</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"伺服器傳回錯誤,請檢查您的使用者名稱和密碼,然後再試一次。"</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"需要用戶端憑證,您要透過用戶端憑證連線到伺服器嗎?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"憑證無效或無法使用。"</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"伺服器傳回錯誤,請檢查您的使用者名稱和密碼,然後再試一次。"</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"無法連線至伺服器。"</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"無法連線至伺服器。"\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"必須使用 TLS,但此伺服器不支援。"</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"警告:如果停用「電子郵件」應用程式的裝置管理權限,系統將刪除所有需要使用這項權限的「電子郵件」帳戶,以及帳戶中所有的電子郵件、聯絡人、日曆活動和其他資料。"</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"安全性更新"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"您必須更新 <xliff:g id="ACCOUNT">%s</xliff:g> 的安全性設定。"</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"「<xliff:g id="ACCOUNT">%s</xliff:g>」帳戶必須進行安全性設定更新。"</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"必須更新安全性"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"因為不符合安全性需求,系統無法同步處理「<xliff:g id="ACCOUNT">%s</xliff:g>」帳戶。"</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"「<xliff:g id="ACCOUNT">%s</xliff:g>」帳戶的安全性設定必須更新。"</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"「<xliff:g id="ACCOUNT">%s</xliff:g>」帳戶已自行變更安全性設定,使用者不需採取任何行動。"</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"安全性必須更新"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"安全性政策已變更"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"不符合安全性政策標準"</string>
<string name="account_security_title" msgid="3511543138560418587">"裝置安全性"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"<xliff:g id="SERVER">%s</xliff:g> 伺服器要求您的授權,使其可遠端控制 Android 裝置的一些安全性功能。"</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"請編輯資料"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"您的螢幕上鎖 PIN 或密碼已過期。"</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"螢幕上鎖密碼已過期"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"螢幕上鎖密碼即將過期"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"您必須儘快變更螢幕上鎖 PIN 或密碼,否則 <xliff:g id="ACCOUNT">%s</xliff:g> 的資料將遭到清除,要立即變更嗎?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"您必須儘快變更螢幕上鎖 PIN 或密碼,否則 <xliff:g id="ACCOUNT">%s</xliff:g> 的資料將遭到清除,要立即變更嗎?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"螢幕鎖定密碼已過期"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"<xliff:g id="ACCOUNT">%s</xliff:g> 的資料已從您的裝置中清除,如要還原這些資料,請變更螢幕上鎖 PIN 或密碼,要立即變更嗎?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"<xliff:g id="ACCOUNT">%s</xliff:g> 的資料已從您的裝置中清除,如要還原這些資料,請變更螢幕上鎖 PIN 或密碼,要立即變更嗎?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"要捨棄尚未儲存的變更?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"無法登入"</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"<xliff:g id="ACCOUNT">%s</xliff:g> 的使用者名稱或密碼不正確,要立即更新嗎?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"<xliff:g id="ACCOUNT">%s</xliff:g> 的使用者名稱或密碼不正確。您要現在更新嗎?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"預設帳戶"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"預設使用這個帳戶傳送電子郵件"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"下載附件"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"透過 WiFi 自動下載最新郵件的附件"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"電子郵件通知"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"同步處理頻率和通知等其他設定"</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"收到電子郵件時,在系統列中顯示通知"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"收到電子郵件時傳送通知"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"收件匣檢查頻率"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"內收設定"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"使用者名稱、密碼和其他內送伺服器設定"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"外寄設定"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"使用者名稱、密碼和其他外寄伺服器設定"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"強制執行的政策"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"無"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"不支援的政策"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"無"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"嘗試同步處理"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"輕觸這裡即可同步處理這個帳戶"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"帳戶名稱"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"您的姓名"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"簽名檔"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"快速回應"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"編輯您撰寫電子郵件時經常插入的文字"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"編輯您撰寫電子郵件時經常插入的文字"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"在送出的郵件後面附加文字"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"通知設定"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"資料用量"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"安全性政策"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"編輯快速回應"</string>
<string name="save_action" msgid="1988862706623227093">"儲存"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"同步處理聯絡人"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"同步處理此帳戶的聯絡人"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"同步處理日曆"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"同步處理此帳戶的日曆"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"同步處理日曆"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"同步處理這個帳戶的日曆活動"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"同步處理電子郵件"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"同步處理此帳戶的電子郵件"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"震動"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"共有 <xliff:g id="RESULTS">%1$d</xliff:g> 個來自 <xliff:g id="DOMAIN">%2$s</xliff:g> 的搜尋結果"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"設定"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"一般"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"一般設定"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"應用程式"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"自動推進"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"選擇刪除郵件後所要顯示的畫面"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"隱藏核取方塊"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"在郵件清單中,輕觸並按住項目即可選取"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"刪除前需確認"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"郵件"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"傳送前需確認"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"郵件"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"推進至"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"較新的郵件"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"較舊的郵件"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"正在等待結果"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"有些伺服器可能需要較長的時間。"</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"資料夾"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"不允許使用裝置相機"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"需要裝置密碼"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"限制重複使用最近用過的密碼"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"強制密碼到期"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"要求裝置在閒置時鎖定螢幕"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"限制同步處理的日曆活動數量"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"限制同步處理的電子郵件數量"</string>
+ <string name="quick_1" msgid="3426057697353380951">"感謝您!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"這主意不錯!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"我稍晚看過後回覆您。"</string>
+ <string name="quick_4" msgid="3988974084396883051">"開會討論吧。"</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"系統會在漫遊時停用這個帳戶的背景同步處理。"</string>
+ <string name="confirm_response" msgid="5747902757569543165">"正在傳送回應..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"沒有任何郵件。"</string>
</resources>
diff --git a/res/values-zh-rTW/uploader.xml b/res/values-zh-rTW/uploader.xml
index 4b32be321..3fd744b66 100644
--- a/res/values-zh-rTW/uploader.xml
+++ b/res/values-zh-rTW/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"隱藏詳細資料"</string>
<string name="menu_settings" msgid="5088116127086866634">"設定"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"上傳日期:%s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"帳戶"</string>
<string name="upload" msgid="2615541458361216022">"上傳"</string>
<string name="ok" msgid="2516349681897895312">"確定"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 358d0961b..72a0e3596 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="permission_read_attachment_label" msgid="9208086010625033590">"Funda okunamathiselwe kwi-imeyili"</string>
- <string name="permission_read_attachment_desc" msgid="6592948507403743153">"Ivumela lolu hlelo lokusebenza ukuba lufunde izinamathiseli zakho ze-imeyli."</string>
+ <string name="permission_read_attachment_desc" msgid="3394721085306308972">"Ivumela i-app ukufunda okunamathiselwe kwe-imeyili yakho."</string>
<string name="permission_access_provider_label" msgid="378256653525377586">"Finyelela kwimininingo yomhlinzeki we-imeyli"</string>
- <string name="permission_access_provider_desc" msgid="2221907862438022705">"Ivumela lolu hlelo lokusebenza ukufinyelela kumininingo yakho egciniwe ye-Imeyili, kuhlanganise imiyalezo etholiwe, imiyalezo ethunyelwe, amagama abasebenzisi kanye namaphasiwedi."</string>
+ <string name="permission_access_provider_desc" msgid="6296566558584670348">"Ivumela lolu hlelo lokusebenza ukufinyelela kumininingo yakho egciniwe ye-Imeyili, kuhlanganise imiyalezo etholiwe, imiyalezo ethunyelwe, amagama abasebenzisi kanye namaphasiwedi."</string>
<string name="app_name" msgid="5815426892327290362">"I-imeyli"</string>
<string name="compose_title" msgid="427986915662706899">"Bhala"</string>
<string name="debug_title" msgid="5175710493691536719">"Lungisa iphutha"</string>
@@ -36,7 +36,7 @@
<string name="done_action" msgid="7497990549515580249">"Kwenziwe"</string>
<string name="create_action" msgid="3062715563215392251">"Yenza okusha"</string>
<string name="delete_quick_response_action" msgid="3076922270182841978">"Susa"</string>
- <string name="quick_responses_empty_view" msgid="1693308598242828422">"Azikho izimpendulo ezisheshayo"</string>
+ <string name="quick_responses_empty_view" msgid="3960050972306132367">"Azikho izimpendulo ezisheshayo."</string>
<string name="discard_action" msgid="6532206074859505968">"Lahla"</string>
<string name="save_draft_action" msgid="6413714270991417223">"Londoloza okusazolungiswa"</string>
<string name="show_quick_text_list_dialog_action" msgid="4136018559611145202">"Faka impendulo esheshayo"</string>
@@ -50,7 +50,7 @@
<string name="search_action" msgid="6325101454876682308">"Sesha"</string>
<string name="account_settings_action" msgid="4494079183315085171">"Izilungiselelo ze-akhawunti"</string>
<string name="settings_action" msgid="6334807007967459412">"Izilungiselelo"</string>
- <string name="mailbox_settings_action" msgid="8008375875310554776">"Vumelanisa okukhethwa kukho"</string>
+ <string name="menu_folder_options" msgid="2871906096248843471">"Vumelanisa okukhethwa kukho"</string>
<string name="mark_as_unread_action" msgid="3766298115778767554">"Maka njengokungafundiwe"</string>
<string name="move_action" msgid="3059189775933985898">"Khipha"</string>
<string name="plus_cc_label" msgid="3365150001259912183">"+ Cc/Bcc"</string>
@@ -133,7 +133,7 @@
<string name="message_compose_reply_header_fmt" msgid="8815624773273454573">\n\n"<xliff:g id="SENDER">%s</xliff:g>ubhale:"\n\n</string>
<string name="message_compose_quoted_text_label" msgid="6950097435198536165">"Hlanganisa umbhalo ocashuniwe"</string>
<string name="message_compose_include_quoted_text_checkbox_label" msgid="8165567368956050390">"Hlanganisa umbhalo"</string>
- <string name="message_compose_error_no_recipients" msgid="4903715888250785486">"Kumelwe wengeze okungenani umamukeli oyedwa."</string>
+ <string name="message_compose_error_no_recipients" msgid="140299472517968199">"Ngeza okungenani umamukeli oyedwa."</string>
<string name="message_compose_error_invalid_email" msgid="1817633338629885643">"Amanye amakheli e-imeyili awalungile."</string>
<string name="message_compose_attachment_size" msgid="4401081828287333647">"Ifayela inkulu kakhulu ukuba inamathiselwe."</string>
<string name="message_compose_insert_quick_response_list_title" msgid="5314107302508728189">"Faka izimpendulo ezisheshayo"</string>
@@ -153,8 +153,8 @@
<string name="message_view_attachment_saved" msgid="3432810414785232025">"Kulondoloziwe"</string>
<string name="message_view_attachment_cancel_action" msgid="316700885943712101">"Misa"</string>
<string name="message_view_status_attachment_saved" msgid="8878790392556284868">"Isinamathiseli silondolozwe njenge-<xliff:g id="FILENAME">%s</xliff:g>."</string>
- <string name="message_view_status_attachment_not_saved" msgid="2433097334272991035">"Yehlulekile ukulondoloza okuxhunyiwe."</string>
- <string name="message_view_attachment_background_load" msgid="756797444835526487">"Yazi: Eyodwa noma eyengeziwe yezinamathiseli kumyalezo wakho odluliselwe izolandwa ngaphambi kokuthumelwa."</string>
+ <string name="message_view_status_attachment_not_saved" msgid="4013475734255421939">"Ayikwazanga ukugcina okunamathiselwe."</string>
+ <string name="message_view_attachment_background_load" msgid="7906875687519445185">"Eyodwa noma eyengeziwe yezinamathiseli kumlayezo wakho odluliselwe izolandwa ngaphambi kokuthumelwa."</string>
<string name="message_view_show_message_action" msgid="5134222901019191436">"Umyalezo"</string>
<string name="message_view_show_invite_action" msgid="8862797393776226777">"Mema..."</string>
<plurals name="message_view_show_attachments_action">
@@ -210,7 +210,7 @@
</plurals>
<string name="forward_download_failed_ticker" msgid="6176608320359303255">"Ayikwazi ukudlulisa isinamathiseli esisodwa noma ezengeziwe"</string>
<string name="forward_download_failed_title" msgid="6139701848515572511">"Okunamathiselwa kwi-imeyli akuthunyelwanga"</string>
- <string name="login_failed_ticker" msgid="5749227022559285302">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> ukungena ngemvume kwehlulekile"</string>
+ <string name="login_failed_ticker" msgid="2169365211566829350">"I-<xliff:g id="ACCOUNT_NAME">%s</xliff:g> ingene ngemvume ngempumelelo."</string>
<string name="login_failed_title" msgid="7624349996212476176">"Ayikwazanga ukungena ngemvume."</string>
<plurals name="message_view_attachment_bytes">
<item quantity="one" msgid="8914124732074848509">"<xliff:g id="SIZE_IN_BYTES">%d</xliff:g>B"</item>
@@ -232,15 +232,11 @@
<string name="message_view_move_to_older" msgid="4993043091356700890">"Okudadlana"</string>
<string name="message_list_subject_snippet_divider" msgid="1783589062530679520">" — "</string>
<string name="account_setup_basics_title" msgid="3578333196594678422">"Ukumisa i-akhawunti"</string>
- <string name="account_setup_basics_exchange_title" msgid="1147638872869594157">"Yengeza i-akhawunti Yokushintshanisa"</string>
- <string name="account_setup_basics_exchange_title_alternate" msgid="4980422714586153809">"Yengeza i-akhawunti Yokuvumelanisa Okusebenzsayo Kokushintshanisa"</string>
<string name="account_setup_basics_headline" msgid="6726590205905464015">"I-akhawunti ye-Imeyli"</string>
- <string name="accounts_welcome" msgid="1491126253077950685">"Ungase ulungisele ukusebenza i-imeyili yamanye ama-akhawunti ngezinyathelo ezimbalwa."</string>
- <string name="accounts_welcome_exchange" msgid="4432917203403596617">"Ungamisa i-akhawunti ye-Exchange ngezinyathelo ezimbalwa nje."</string>
- <string name="accounts_welcome_exchange_alternate" msgid="1319376442032224845">"Ungamisa i-akhawunti ye-Exchange ActiveSync ngezinyathelo ezimbalwa nje."</string>
+ <string name="accounts_welcome" msgid="8337750045270269649">"Ungasetha i-akhawunti yakho ngezinyathelo ezimbalwa."</string>
<string name="account_setup_basics_email_label" msgid="3454164053624112047">"Ikheli le-imeyli"</string>
<string name="account_setup_basics_password_label" msgid="9133549799291519298">"Iphasiwedi"</string>
- <string name="account_setup_basics_default_label" msgid="5924790142029806711">"Thumela i-imeyli kusuka kule akhawunti ngokuzenzakalelayo"</string>
+ <string name="account_setup_basics_default_label" msgid="8896222991837026736">"Thumela i-imeyli kusuka kule akhawunti ngokwakhona"</string>
<string name="account_setup_basics_manual_setup_action" msgid="8053852205391155912">"Ukumisela"</string>
<string name="account_setup_username_password_toast" msgid="3968270274727947460">"Sicela uthayiphe ikheli le-imeyili elilungile kanye nephasiwedi."</string>
<string name="account_duplicate_dlg_title" msgid="8089732986912704425">"I-akhawunti Ephindiwe"</string>
@@ -250,7 +246,7 @@
<string name="account_setup_check_settings_check_incoming_msg" msgid="5356212700221438863">"Ihlola izilungiselelo zesiphakeli ezingenayo..."</string>
<string name="account_setup_check_settings_check_outgoing_msg" msgid="4033015234096725343">"Ihlola izilungiselelo zesiphakeli eziphumayo..."</string>
<string name="account_setup_names_title" msgid="8483517350241119291">"Ukumisa i-akhawunti"</string>
- <string name="account_setup_names_headline" msgid="2413440250372658881">"I-akhawunti yakho imisiwe, futhi i-imeyli isendleleni!"</string>
+ <string name="account_setup_names_headline" msgid="914858472109729140">"I-akhawunti yakho imisiwe, futhi i-imeyli isendleleni!"</string>
<string name="account_setup_names_account_name_label" msgid="8033895024273259196">"Nike le-akhawunti igama (okokuzikhethela)"</string>
<string name="account_setup_names_user_name_label" msgid="8967410178488604770">"Igama lakho (liboniswa emiyalezweni ephumayo)"</string>
<string name="account_setup_names_user_name_empty_error" msgid="6791427018325367364">"Lesi sikhundla akumele singabi nalutho."</string>
@@ -261,8 +257,7 @@
<string name="account_setup_incoming_headline" msgid="6183711037633407184">"Izilungiselelo zeseva engenayo"</string>
<string name="account_setup_incoming_username_label" msgid="5700581386104070302">"Igama lomsebenzisi"</string>
<string name="account_setup_incoming_password_label" msgid="6365327603172559859">"Iphasiwedi"</string>
- <string name="account_setup_incoming_pop_server_label" msgid="4917504440057879152">"Iseva ye-POP3"</string>
- <string name="account_setup_incoming_imap_server_label" msgid="8685076830847734322">"Iseva ye-IMAP"</string>
+ <string name="account_setup_incoming_server_label" msgid="1480342966630002638">"Isiphakeli"</string>
<string name="account_setup_incoming_port_label" msgid="8214738923690447796">"Imbobo yokuxhuma"</string>
<string name="account_setup_incoming_security_label" msgid="2110260791086007424">"Uhlobo lokuphepha"</string>
<string name="account_setup_incoming_security_none_label" msgid="8300169413118264895">"Lutho"</string>
@@ -280,7 +275,7 @@
<string name="account_setup_outgoing_smtp_server_label" msgid="6035137446691195177">"Iseva ye-SMTP"</string>
<string name="account_setup_outgoing_port_label" msgid="7573207437835827876">"Imbobo yokuxhuma"</string>
<string name="account_setup_outgoing_security_label" msgid="911398071120720589">"Uhlobo lokuphepha"</string>
- <string name="account_setup_outgoing_require_login_label" msgid="6371514297854287948">"Dinga ukungena."</string>
+ <string name="account_setup_outgoing_require_login_label" msgid="7779484127897397562">"Kudingeka ukungena ngemvume"</string>
<string name="account_setup_outgoing_username_label" msgid="3309680794731596981">"Igama lomsebenzisi"</string>
<string name="account_setup_outgoing_password_label" msgid="227844585493317550">"Iphasiwedi"</string>
<string name="account_setup_exchange_title" msgid="396004732514751781">"Ukuhlela i-akhawunti"</string>
@@ -305,11 +300,11 @@
<string name="account_setup_options_mail_check_frequency_15min" msgid="5052776740089741793">"Njalo ngamaminithi angu-15"</string>
<string name="account_setup_options_mail_check_frequency_30min" msgid="1097088928685931864">"Njalo ngamaminithi angu-30"</string>
<string name="account_setup_options_mail_check_frequency_1hour" msgid="3767715356039692899">"Njalo ngehora"</string>
- <string name="account_setup_options_default_label" msgid="8869166381331276697">"Thumela i-imeyli kusuka kule akhawunti ngokuzenzakalelayo"</string>
- <string name="account_setup_options_notify_label" msgid="1247525794828820038">"Ngazise lapho i-imeyli ifika."</string>
- <string name="account_setup_options_sync_contacts_label" msgid="7467467090023434271">"Vumelanisa othintana nabo kusuka kule akhawunti."</string>
- <string name="account_setup_options_sync_calendar_label" msgid="3195979658426293931">"Vumelanisa ikhalenda kule akhawunti."</string>
- <string name="account_setup_options_sync_email_label" msgid="3930927721878987383">"Vumelanisa i-imeyli kule akhawunti."</string>
+ <string name="account_setup_options_default_label" msgid="2617227194283720914">"Thumela i-imeyli kusuka kule akhawunti ngokuzenzakalelayo"</string>
+ <string name="account_setup_options_notify_label" msgid="7046146571560728829">"Ngazise lapho i-imeyli ifika"</string>
+ <string name="account_setup_options_sync_contacts_label" msgid="276492345599531778">"Vumelanisa othintana nabo kusuka kule akhawunti"</string>
+ <string name="account_setup_options_sync_calendar_label" msgid="3222151135467189411">"Vumelanisa ikhalenda kule akhawunti"</string>
+ <string name="account_setup_options_sync_email_label" msgid="8585177128405004068">"Vumelanisa i-imeyli kule akhawunti."</string>
<string name="account_setup_options_background_attachments_label" msgid="5247749298276451846">"Layisha okunamathiselwa kwi-imeyili ngokuzenzakalelayo uma uxhunyiwe kukuxhuma kungenazintambo"</string>
<string name="account_setup_failed_dlg_title" msgid="9083263347962940552">"Ayikwazanga ukuqeda"</string>
<string name="account_setup_options_mail_window_label" msgid="7582247646138987328">"Izinsuku zokuvumelanisa"</string>
@@ -321,13 +316,13 @@
<string name="account_setup_options_mail_window_1month" msgid="5846359669750047081">"Inyanga eyodwa"</string>
<string name="account_setup_options_mail_window_all" msgid="5372861827683632364">"Konke"</string>
<string name="account_setup_options_mail_window_default" msgid="8321351926520165832">"Sebenzisa okuzenzakalelayo kwe-akhawunti"</string>
- <string name="account_setup_failed_dlg_auth_message" msgid="42827150104879570">"Igama lomsebenzisi noma iphasiwedi ayilungile."</string>
- <string name="account_setup_failed_dlg_auth_message_fmt" msgid="8598560266430207606">"Igama lomsebenzisi noma iphasiwedi ayilungile."\n"<xliff:g id="ERROR">%s</xliff:g>"</string>
+ <string name="account_setup_failed_dlg_auth_message" msgid="426627755590431364">"Igama lakho lomsebenzisi noma iphasiwedi ayilungile."</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt" msgid="737111956772240007">"Igama lomsebenzisi noma iphasiwedi ayilungile."\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_dlg_certificate_message" msgid="3836152264696108805">"Ayikwazi ukuxhuma ngokuphephile kwiseva."</string>
<string name="account_setup_failed_dlg_certificate_message_fmt" msgid="2121921642915593041">"Ayikwazi ukuxhuma ngokuphephile kwiseva. "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
- <string name="account_setup_failed_certificate_required" msgid="1280569002588325367">"Kudingeka isitifiketi sekhasimende. Xhuma esiphakelini ngesitifiketi sekhasimende?"</string>
- <string name="account_setup_failed_certificate_inaccessible" msgid="7245835883180762722">"Isitifiketi asivumelekile noma asingeneki"</string>
- <string name="account_setup_failed_check_credentials_message" msgid="222908719765968691">"Iseva iphendule ngephutha, sicela uhlole igama lakho lomsebenzisi nephasiwedi bese uzama futhi."</string>
+ <string name="account_setup_failed_certificate_required" msgid="2689944595775206006">"Isititiketi seklayenti siyadingeka. Ingabe ufuna ukuxhuma kuseva ngesitifiketi seklayenti?"</string>
+ <string name="account_setup_failed_certificate_inaccessible" msgid="3563840279690749547">"Isitifiketi asivumelekile noma asifinyeleleki."</string>
+ <string name="account_setup_failed_check_credentials_message" msgid="6531658092540248067">"Iseva iphendule ngephutha, sicela uhlole igama lakho lomsebenzisi nephasiwedi bese uzama futhi."</string>
<string name="account_setup_failed_dlg_server_message" msgid="4942810054116129684">"Ayikwazi ukuxhuma kwiseva."</string>
<string name="account_setup_failed_dlg_server_message_fmt" msgid="2525425638303883232">"Ayikwazi ukuxhuma kwiseva. "\n"(<xliff:g id="ERROR">%s</xliff:g>)"</string>
<string name="account_setup_failed_tls_required" msgid="307030406688611327">"I-TLS iyadingeka kodwa ayisekelwa iseva."</string>
@@ -343,8 +338,12 @@
<string name="disable_admin_warning" msgid="6196985268695592382">"ISEXWAYISO: Yenza kungasebenzi imvume yohlelo lokusebenza lwe-Imeyli ukubhalisa idivaysi yakho kuzosusa wonke ama-akhawunti e-Imeyli ayidingayo, kuhlanganise ne-imeyli yayo, othintana nabo, amakhalenda, izenzakalo, neminye imininingo."</string>
<string name="account_security_dialog_title" msgid="430041952584831904">"Okwakamuva kwezokuphepha"</string>
<string name="account_security_dialog_content_fmt" msgid="8843806143923278214">"<xliff:g id="ACCOUNT">%s</xliff:g> idinga ukuba ubuyekeze izilungiselelo zakho zokuzivikela."</string>
- <string name="security_notification_ticker_fmt" msgid="1108023476125276507">"i-Akhawunti \" <xliff:g id="ACCOUNT">%s</xliff:g> \" idinga ukubuyekeza izilungiselelo zokuphepha."</string>
- <string name="security_notification_content_title" msgid="3352841884304076235">"Ukubuyekeza kwezokuphepha kuyadingeka"</string>
+ <string name="security_unsupported_ticker_fmt" msgid="5166579214529283975">"I-Akhawuni \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ayikwazi ukuvumelanisa ngenxa yezimfuneko sokuphepha."</string>
+ <string name="security_needed_ticker_fmt" msgid="2120499087897133665">"I-Akhawunti \"<xliff:g id="ACCOUNT">%s</xliff:g>\" idinga ukubuyekeza izilungiselelo zokuphepha."</string>
+ <string name="security_changed_ticker_fmt" msgid="2609435447352755285">"I-Akhawunti \"<xliff:g id="ACCOUNT">%s</xliff:g>\" ishintshe izilungiselelo zayo zokuphepha; asikho isenzo somsebenzisi esidingekayo."</string>
+ <string name="security_notification_content_update_title" msgid="2429762903228690154">"Ukubuyekeza ezokuphepha kuyadingeka"</string>
+ <string name="security_notification_content_change_title" msgid="443490921895642130">"Izinqubomgomo zokuphepha zishintshiwe"</string>
+ <string name="security_notification_content_unsupported_title" msgid="7315219208043169233">"Izinqubomgomo zokuphepha azikwazi ukuhlangabezwa"</string>
<string name="account_security_title" msgid="3511543138560418587">"Ukuphepha kweDivaysi"</string>
<string name="account_security_policy_explanation_fmt" msgid="6932627044314460766">"Iseva <xliff:g id="SERVER">%s</xliff:g> idinga ukuba uyivumele ukuba ilawule kude ezinye izici zokuphepha kwedivayisi ye-Android."</string>
<string name="account_setup_failed_dlg_edit_details_action" msgid="5355993309841479360">"Hlela imininingwane"</string>
@@ -353,38 +352,45 @@
<string name="password_expired_ticker" msgid="4230570412974108968">"Iphinikhodi noma iphasiwedi yakho yokuvala isikrini iphelelwe isikhathi."</string>
<string name="password_expired_content_title" msgid="4349518706602252979">"Iphasiwedi yokuvala isikrini iphelelwe isikhathi"</string>
<string name="password_expire_warning_dialog_title" msgid="1687074175399798189">"Iphasiwedi yesikrini yokuvala iphelelwa isikhathi"</string>
- <string name="password_expire_warning_dialog_content_fmt" msgid="4595246020880351045">"Kumele ushintshe iphinikhodi noma iphasiwedi yokuvala isikrini maduze, noma idatha ye-<xliff:g id="ACCOUNT">%s</xliff:g> izosulwa. Ishintshe manje?"</string>
+ <string name="password_expire_warning_dialog_content_fmt" msgid="4293446611405084436">"Udinga ukushintsha i-PIN yesikrini sakho sokukhuya noma iphasiwedi ngokushesha, noma idatha ye-<xliff:g id="ACCOUNT">%s</xliff:g> izosulwa. Ufuna ukuyishintsha manje?"</string>
<string name="password_expired_dialog_title" msgid="2186547998125938084">"Iphasiwedi yokuvala isikrini iphelelwe isikhathi"</string>
- <string name="password_expired_dialog_content_fmt" msgid="5982207349002500211">"Idatha ye-<xliff:g id="ACCOUNT">%s</xliff:g> iyasulwa kudivayisi yakho. Ungayibuyisa ngokushintsha iphinikhodi yakho yokuvala isikrini noma iphasiwedi. Ishintshe manje?"</string>
+ <string name="password_expired_dialog_content_fmt" msgid="6538210092073931079">"Idatha le-<xliff:g id="ACCOUNT">%s</xliff:g> lisuliwe kudivayisi. Ungalibuyisa ngokushintsha i-PIN yakho yokukhiya isikrini noma iphasiwedi. Ufuna ukuyishintsha manje?"</string>
<string name="account_settings_exit_server_settings" msgid="8006323251094711431">"Lahla izinguquko ezingagciniwe?"</string>
<string name="account_settings_login_dialog_title" msgid="4024422579146302775">"Ayikwazanga ukungena ngemvume."</string>
- <string name="account_settings_login_dialog_content_fmt" msgid="3492735234999710234">"Igama lomsebenzisi noma iphasiwedi ye-<xliff:g id="ACCOUNT">%s</xliff:g> ayilungile. Wabuyekeze manje?"</string>
+ <string name="account_settings_login_dialog_content_fmt" msgid="8849649646111167377">"Igama lomsebenzisi noma iphasiwedi ye-<xliff:g id="ACCOUNT">%s</xliff:g> ayilungile. Ufuna ukuzivuselela manje?"</string>
<string name="account_settings_default_label" msgid="3575963379680943640">"I-akhawunti ezenzakalelayo"</string>
<string name="account_settings_default_summary" msgid="1531901438624688482">"Thumela i-imeyli kusuka kule akhawunti ngokuzenzakalelayo"</string>
<string name="account_settings_background_attachments_label" msgid="2980317599840958688">"Layisha ngokungenisa okunamathelayo"</string>
<string name="account_settings_background_attachments_summary" msgid="5954218549226189376">"Dawuniloda ngokuzenzakalla ukunamathiseleka emiyalezweni yakamuva nge-Wi-Fi"</string>
<string name="account_settings_notify_label" msgid="1630001017303007974">"Izaziso ze-Imeyli"</string>
<string name="account_settings_summary" msgid="8403582255413830007">"Ukuvama kokuvumelanisa, isaziso, nokunye."</string>
- <string name="account_settings_notify_summary" msgid="6301122709602752038">"Ngazise Kusistimu ochaza ngesimo uma i-imeyli ifika"</string>
+ <string name="account_settings_notify_summary" msgid="8134339460923068254">"Thumela isaziso uma i-imeyili ifika"</string>
<string name="account_settings_mail_check_frequency_label" msgid="8271462919214560616">"Ukuvama ukuhlola ibhokisi lemiyalezo engenayo"</string>
<string name="account_settings_incoming_label" msgid="7858928031806297542">"Izilungiselelo ezingenayo"</string>
<string name="account_settings_incoming_summary" msgid="2923044634831881068">"Igama lombebenzisi, iphasiwedi, nezinye izilungiselelo zeseva ezingenayo"</string>
<string name="account_settings_outgoing_label" msgid="4464829249980026745">"Izilungiselelo eziphumayo"</string>
<string name="account_settings_outgoing_summary" msgid="3572093624332724311">"Igama lomsebenzisi, iphasiwedi, nezinye izilungiselelo zeseva eziphumayo"</string>
+ <string name="account_settings_enforced_label" msgid="7429582254433588882">"Izinqubomgomo ziphoqiwe"</string>
+ <string name="account_settings_enforced_summary" msgid="8140860420440447771">"Lutho"</string>
+ <string name="account_settings_unsupported_label" msgid="1954091071454235577">"Izinqubomo ezingasekelwe"</string>
+ <string name="account_settings_unsupported_summary" msgid="2107633813351863608">"Lutho"</string>
+ <string name="account_settings_retry_label" msgid="1104680719299842829">"Zama ukuvumelanisa"</string>
+ <string name="account_settings_retry_summary" msgid="2703599639846201913">"Thinta lapha ukuze uvumelanise le akhawunti"</string>
<string name="account_settings_description_label" msgid="8894815221204511715">"Igama le-akhawunti"</string>
<string name="account_settings_name_label" msgid="8186406122590008449">"Igama lakho"</string>
<string name="account_settings_signature_label" msgid="4091969938785803201">"Isiginesha"</string>
<string name="account_settings_edit_quick_responses_label" msgid="3106019627675996480">"Izimpendulo ezisheshayo"</string>
- <string name="account_settings_edit_quick_responses_summary" msgid="5284435342418252369">"Hlela umbhalo owusebenzisa njalo uma ubhala ama-imeyli"</string>
+ <string name="account_settings_edit_quick_responses_summary" msgid="8056686122888722591">"Hlela umbhalo owusebenzisa njalo uma ubhala ama-imeyli"</string>
<string name="account_settings_signature_hint" msgid="7262183168962779403">"Jobelela umbhalo emiyalezweni oyithumelayo"</string>
<string name="account_settings_notifications" msgid="1042620094281375043">"Izilungiselelo zesaziso"</string>
<string name="account_settings_data_usage" msgid="6669107430575866736">"Ukusebenzisa idatha"</string>
+ <string name="account_settings_policies" msgid="6292833636418641840">"Izinqubomgomo zokuphepha"</string>
<string name="edit_quick_response_dialog" msgid="4322494050816995390">"Hlela izimpendulo ezisheshayo"</string>
<string name="save_action" msgid="1988862706623227093">"Londoloza"</string>
<string name="account_settings_sync_contacts_enable" msgid="1369272986009573218">"Vumelanisa othintana nabo"</string>
<string name="account_settings_sync_contacts_summary" msgid="816919452270997919">"Vumelanisa othintana nabo bale akhawunti"</string>
- <string name="account_settings_sync_calendar_enable" msgid="3039820725699412208">"Vumelanisa Ikhalenda"</string>
- <string name="account_settings_sync_calendar_summary" msgid="5241995538395965804">"Vumelanisa ikhalenda yale akhawunti"</string>
+ <string name="account_settings_sync_calendar_enable" msgid="6855333393468628003">"Vumelanisa ikhalenda"</string>
+ <string name="account_settings_sync_calendar_summary" msgid="7606340353079301703">"Vumelanisa umcimbi wekhalenda kule akhawunti"</string>
<string name="account_settings_sync_email_enable" msgid="3754115565685222477">"Vumelanisa i-imeyli"</string>
<string name="account_settings_sync_email_summary" msgid="262964076412310990">"Vumelanisa i-imeyli yale akhawunti"</string>
<string name="account_settings_vibrate_when_label" msgid="708477308761702671">"Dlidliza"</string>
@@ -422,10 +428,16 @@
<item quantity="other" msgid="7816121892960632123">"<xliff:g id="RESULTS">%1$d</xliff:g> imiphumela ephuma <xliff:g id="DOMAIN">%2$s</xliff:g>"</item>
</plurals>
<string name="settings_activity_title" msgid="5185915603716333904">"Izilungiselelo"</string>
- <string name="header_label_general_preferences" msgid="9204600297009680176">"Okuvamile"</string>
+ <string name="header_label_general_preferences" msgid="8243724566056800991">"Izilungiselelo ezijwayelekile"</string>
<string name="category_general_preferences" msgid="2742423840964045801">"Uhlelo lokusebenza"</string>
<string name="general_preference_auto_advance_label" msgid="213945004511666631">"Okuseqophelweni okuzenzakalelayo"</string>
<string name="general_preference_auto_advance_summary" msgid="6483439980032715119">"Khetha ukuthi isiphi isikrini esizoboniswa emuva kokuba ususe umyalezo"</string>
+ <string name="general_preference_hide_checkboxes_label" msgid="2054599123778503930">"Fihla amabhokisi okuhlola"</string>
+ <string name="general_preference_hide_checkboxes_summary" msgid="141341137898712712">"Ezinhlwini zemilayezo, thinta bese ubamba ukuze ukhethe"</string>
+ <string name="general_preference_confirm_delete_label" msgid="1863245465244241907">"Qinisekisa ngaphambi kokususa"</string>
+ <string name="general_preference_confirm_delete_summary" msgid="6710240861010766643">"Imilayezo"</string>
+ <string name="general_preference_confirm_send_label" msgid="4548277349553989930">"Qinisekisa ngaphambi kokuthumela"</string>
+ <string name="general_preference_confirm_send_summary" msgid="2695471027185506093">"Imilayezo"</string>
<string name="general_preference_auto_advance_dialog_title" msgid="5405052109452503909">"Dlulela ku"</string>
<string name="general_preference_auto_advance_newer" msgid="1336720027570509885">"Umyalezo omusha"</string>
<string name="general_preference_auto_advance_older" msgid="8273143493185128646">"Umyalezo wakudala"</string>
@@ -466,5 +478,18 @@
<string name="search_slow_warning_title" msgid="2826118321880530239">"Ilinde imiphumela"</string>
<string name="search_slow_warning_message" msgid="8494483410797387903">"Amanye amaseva angathatha isikhathi eside."</string>
<string name="action_bar_mailbox_list_title" msgid="7484457755531286333">"Amafolda"</string>
+ <string name="policy_dont_allow_camera" msgid="5744573062306937302">"Ungavumeli ukusebenza kwekhamera yedivayisi"</string>
+ <string name="policy_require_password" msgid="7177274900480984702">"Idinga iphasiwedi yedivayisi"</string>
+ <string name="policy_password_history" msgid="5743544498302303181">"Khawulela ukusetshenziswa kabusha kwamaphasiwedi wakamuva"</string>
+ <string name="policy_password_expiration" msgid="1248123255253649199">"Cela ukuthi amaphasiwedi aphalwe isikhathi"</string>
+ <string name="policy_screen_timeout" msgid="414869965358468080">"Dinga idivayisi yokumisa ukukhiya isikrini sayo"</string>
+ <string name="policy_calendar_age" msgid="627405158087482302">"Khawulela inombolo yemicimbi yekhalenda evunyelanisiwe"</string>
+ <string name="policy_email_age" msgid="7144148367145424963">"Khawulela inombolo yama-imeyili avumelanisiwe"</string>
+ <string name="quick_1" msgid="3426057697353380951">"Siyabonga!"</string>
+ <string name="quick_2" msgid="4188036352885736617">"Kuzwaka kukuhle kimi!"</string>
+ <string name="quick_3" msgid="8061819976353395585">"Ngizofunda lokho emvakwesikhashana."</string>
+ <string name="quick_4" msgid="3988974084396883051">"Masihlele umhlangano ukuxoxisana ngalokhu."</string>
<string name="require_manual_sync_message" msgid="7777357288642785955">"Ukuvumelaniswa okungemumva kule-akhawunti ayisebenzi ngesikhathi usazula zula."</string>
+ <string name="confirm_response" msgid="5747902757569543165">"Thumela impendulo..."</string>
+ <string name="no_conversations" msgid="5559527390337162819">"Ayikho imilayezo."</string>
</resources>
diff --git a/res/values-zu/uploader.xml b/res/values-zu/uploader.xml
index 47750deb7..60a78f11a 100644
--- a/res/values-zu/uploader.xml
+++ b/res/values-zu/uploader.xml
@@ -26,7 +26,7 @@
<string name="menu_hide_completed_items" msgid="6126007571523662799">"Fihla imininingwane"</string>
<string name="menu_settings" msgid="5088116127086866634">"Izilungiselelo"</string>
<string name="format_date_uploaded" msgid="803752037646090928">"Kulayishiwe %s"</string>
- <string name="format_progress_percent" msgid="1420459750508777491">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
+ <string name="format_progress_percent" msgid="4347398038122210157">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="account" msgid="5199161365824352613">"I-akhawunti"</string>
<string name="upload" msgid="2615541458361216022">"Layisha"</string>
<string name="ok" msgid="2516349681897895312">"KULUNGILE"</string>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index c881e6eb9..d51fb17f2 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -185,26 +185,13 @@
<item>@string/mailbox_name_display_junk</item>
</string-array>
- <!-- Arrays "mailbox_display_names" and "mailbox_display_icons" MUST match the order
- of the types of mailboxes defined in EmailContent -->
- <array name="mailbox_display_icons" translatable="false">
- <!-- TYPE_INBOX = 0 -->
- <item>@drawable/ic_folder_inbox_holo_light</item>
- <!-- TYPE_MAIL = 1 -->
- <item></item>
- <!-- TYPE_PARENT = 2 -->
- <item></item>
- <!-- TYPE_DRAFTS = 3 -->
- <item>@drawable/ic_folder_drafts_holo_light</item>
- <!-- TYPE_OUTBOX = 4 -->
- <item>@drawable/ic_folder_outbox_holo_light</item>
- <!-- TYPE_SENT = 5 -->
- <item>@drawable/ic_folder_sent_holo_light</item>
- <!-- TYPE_TRASH = 6 -->
- <item>@drawable/ic_menu_trash_holo_light</item>
- <!-- TYPE_JUNK = 7 -->
- <item>@drawable/ic_spam_normal_holo_light</item>
- </array>
+ <!-- A small number of default quick responses -->
+ <string-array name="default_quick_responses">
+ <item>@string/quick_1</item>
+ <item>@string/quick_2</item>
+ <item>@string/quick_3</item>
+ <item>@string/quick_4</item>
+ </string-array>
<!-- Account color chips on combined view -->
<array name="combined_view_account_colors" translatable="false">
@@ -219,10 +206,10 @@
<item>@color/combined_view_account_color_9</item>
</array>
- <!-- Length of the subject text in the message list items in dips for the
- various modes: wide, and narrow -->
- <integer-array name="subject_lengths">
- <item>50</item>
- <item>25</item>
- </integer-array>
+ <!-- Host addresses starting with these infer an smtp address replacing the word with "smtp" -->
+ <string-array translatable="false" name="smtp_host_prefixes">
+ <item>pop3</item>
+ <item>pop</item>
+ <item>imap</item>
+ </string-array>
</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 8521cf48a..7faf95d24 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -21,4 +21,46 @@
<attr name="maxWidth" format="dimension"/>
<attr name="maxHeight" format="dimension"/>
</declare-styleable>
+ <declare-styleable name="EmailServiceInfo">
+ <attr name="protocol" format="string"/>
+ <attr name="name" format="string"/>
+ <attr name="accountType" format="string"/>
+ <attr name="serviceClass" format="string"/>
+ <attr name="intent" format="string"/>
+ <attr name="port" format="integer"/>
+ <attr name="portSsl" format="integer"/>
+ <attr name="defaultSsl" format="boolean"/>
+ <attr name="offerTls" format="boolean"/>
+ <attr name="offerCerts" format="boolean"/>
+ <attr name="offerLocalDeletes" format="boolean"/>
+ <attr name="defaultLocalDeletes" format="integer"/>
+ <attr name="offerPrefix" format="boolean"/>
+ <attr name="usesSmtp" format="boolean"/>
+ <attr name="syncChanges" format="boolean"/>
+ <attr name="syncContacts" format="boolean"/>
+ <attr name="syncCalendar" format="boolean"/>
+ <attr name="usesAutodiscover" format="boolean"/>
+ <attr name="offerLookback" format="boolean"/>
+ <attr name="defaultLookback">
+ <enum name="auto" value="-2"/>
+ <enum name="days1" value="1"/>
+ <enum name="days3" value="2"/>
+ <enum name="weeks1" value="3"/>
+ <enum name="weeks2" value="4"/>
+ <enum name="months1" value="5"/>
+ <enum name="all" value="6"/>
+ </attr>
+ <attr name="offerAttachmentPreload" format="boolean"/>
+ <attr name="syncIntervalStrings" format="reference"/>
+ <attr name="syncIntervals" format="reference"/>
+ <attr name="defaultSyncInterval">
+ <enum name="push" value="-2"/>
+ <enum name="never" value="-1"/>
+ <enum name="mins5" value="5"/>
+ <enum name="mins10" value="10"/>
+ <enum name="mins15" value="15"/>
+ <enum name="mins30" value="30"/>
+ <enum name="mins60" value="60"/>
+ </attr>
+ </declare-styleable>
</resources>
diff --git a/res/values/bools.xml b/res/values/bools.xml
deleted file mode 100644
index 4a6977b07..000000000
--- a/res/values/bools.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <bool name="use_two_pane">false</bool>
-
- <!-- Reply/Reply All/Forward switcher in action bar -->
- <bool name="message_compose_action_tabs">false</bool>
-</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index f00f37eaf..a50494161 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -15,6 +15,7 @@
-->
<!-- See also values-xlarge for specializations for xlarge screens -->
+<!-- See also values-xlarge for specializations for xlarge screens -->
<resources>
<!-- Account setup screens -->
<color name="account_setup_headline_color">#5E802B</color>
@@ -23,25 +24,11 @@
<color name="account_setup_divider_color">#CCCCCC</color>
<!-- Main UI -->
- <color name="message_list_item_background_unread">#404040</color>
- <color name="message_list_item_background_read">#000000</color>
- <color name="account_folder_list_item_separator">#303030</color>
<color name="connection_error_banner">#fffff1a8</color>
<!-- Standard text colors -->
- <color name="text_primary_color">#000000</color>
<color name="text_secondary_color">#666666</color>
<color name="text_ternary_color">#aaaaaa</color>
- <color name="text_disabled_color">#888888</color>
-
- <color name="button_text_color">#777777</color>
- <color name="button_text_disabled_color">#cccccc</color>
-
- <!-- TODO: properly put these text colors in the theme and use selectors -->
- <color name="text_primary_color_inverse">#ffffff</color>
- <color name="text_secondary_color_inverse">#eeeeee</color>
-
- <color name="divider_color">#ff808080</color>
<!-- Account color chips on combined view -->
<color name="combined_view_account_color_1">#ff71aea7</color>
@@ -54,23 +41,6 @@
<color name="combined_view_account_color_8">#ff738359</color>
<color name="combined_view_account_color_9">#ff9d50a4</color>
- <!-- Drop target colors -->
- <color name="mailbox_drop_unavailable_fg_color">#ff999999</color>
- <color name="mailbox_drop_available_bg_color">#00ffffff</color>
- <color name="mailbox_drop_destructive_bg_color">#fff10000</color>
-
- <!-- Widget colors -->
- <color name="widget_default_text_color">#ff000000</color>
- <color name="widget_light_text_color">#ff666666</color>
- <color name="widget_title_color">#333333</color>
- <color name="widget_unread_color">#777777</color>
-
- <color name="message_view_info_back_color">#deecfa</color>
- <color name="message_view_header_color">#3cb8e6</color>
- <color name="message_activated_color">#3cb8e6</color>
-
- <color name="error_bar_background">#ffff66</color>
-
- <!-- Compose colors -->
- <color name="compose_label_text">#aaaaaa</color>
-</resources>
+ <color name="button_text_color">#777777</color>
+ <color name="button_text_disabled_color">#cccccc</color>
+</resources> \ No newline at end of file
diff --git a/res/values/dimensions.xml b/res/values/dimensions.xml
index 888d2a8f8..a466dd309 100644
--- a/res/values/dimensions.xml
+++ b/res/values/dimensions.xml
@@ -25,24 +25,6 @@
<dimen name="message_list_badge_margin">4dip</dimen>
<dimen name="message_list_icon_padding_compensation">3dip</dimen>
- <dimen name="message_header_height">48dip</dimen>
- <dimen name="message_header_badge_width">48dip</dimen>
- <dimen name="message_header_name_margin">4dip</dimen>
-
- <dimen name="error_message_height">48dip</dimen>
-
- <dimen name="widget_senders_font_size">14sp</dimen>
- <dimen name="widget_subject_font_size">14sp</dimen>
- <dimen name="widget_date_font_size">14sp</dimen>
-
- <dimen name="message_list_drag_offset">16dip</dimen>
- <dimen name="message_list_drag_count_font_size">42sp</dimen>
- <dimen name="message_list_drag_count_left_margin">16dip</dimen>
- <dimen name="message_list_drag_message_font_size">18sp</dimen>
- <dimen name="message_list_drag_message_right_margin">16dip</dimen>
-
- <dimen name="compose_scrollview_width">700dip</dimen>
-
<!-- Account settings fragments -->
<dimen name="settings_fragment_padding_top">16dip</dimen>
<dimen name="settings_fragment_padding_left">16dip</dimen>
@@ -61,21 +43,11 @@
<dimen name="setup_item_inset_left">0dip</dimen>
<dimen name="setup_item_inset_right">0dip</dimen>
- <!-- MessageListItem -->
- <dimen name="minimum_width_wide_mode">720dip</dimen>
-
<!-- Username/password entry -->
<dimen name="setup_credentials_input_width">340dip</dimen>
- <!-- Folder list item -->
- <dimen name="mailbox_list_padding_left">8dip</dimen>
- <dimen name="mailbox_list_padding_right">16dip</dimen>
- <dimen name="mailbox_list_count_margin_left">8dip</dimen>
-
<!-- Message list items -->
- <dimen name="replystate_margin_left">0dip</dimen>
+ <dimen name="replystate_margin_left">8dip</dimen>
+ <dimen name="replystate_margin_right">0dip</dimen>
<dimen name="replystate_margin_top">10sp</dimen>
- <dimen name="checkmark_margin_top">3sp</dimen>
- <dimen name="star_margin_top">28sp</dimen>
- <dimen name="date_margin_top">9sp</dimen>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3a89687b5..237ff1164 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -15,16 +15,21 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Names of packages and authorities that are common to all apps
+ and read from resources -->
+ <!-- Name of the search suggestions authority that looks up recent suggestions. This
+ needs to be modified in AndroidManifest.xml and res/xml/searchable.xml as well. -->
+ <string name="suggestions_authority" translatable="false">com.android.email.suggestionsprovider</string>
<!-- Permissions label for reading attachments -->
<string name="permission_read_attachment_label">Read email attachments</string>
<!-- Permissions description for reading attachments -->
- <string name="permission_read_attachment_desc">Allows this application to read your email
+ <string name="permission_read_attachment_desc">Allows the app to read your email
attachments.</string>
<!-- Permissions label for accessing the main provider -->
<string name="permission_access_provider_label">Access email provider data</string>
<!-- Permissions description for accessing the main provider -->
- <string name="permission_access_provider_desc">Allows this application to access your email
+ <string name="permission_access_provider_desc">Allows the app to access your email
database, including received messages, sent messages, usernames, and passwords.</string>
<!-- Name of application on Home screen -->
@@ -66,7 +71,7 @@
<string name="delete_quick_response_action">Delete</string>
<!-- Message informing user when a list that would contain quick responses
is empty [CHAR_LIMIT=80] -->
- <string name="quick_responses_empty_view">No quick responses</string>
+ <string name="quick_responses_empty_view">No quick responses.</string>
<!-- Menu item/button name -->
<string name="discard_action">Discard</string>
<!-- Menu item/button name [CHAR_LIMIT=16] -->
@@ -94,8 +99,8 @@
<string name="account_settings_action">Account settings</string>
<!-- Menu item for settings [CHAR LIMIT=40]-->
<string name="settings_action">Settings</string>
- <!-- Menu item [CHAR LIMIT=32] -->
- <string name="mailbox_settings_action">Sync options</string>
+ <!-- Menu item: options for this mailbox. [CHAR LIMIT = 32] -->
+ <string name="menu_folder_options">Sync options</string>
<!-- Menu item -->
<string name="mark_as_unread_action">Mark as unread</string>
<!-- Menu item for moving messages to folders [CHAR LIMIT=10] -->
@@ -223,11 +228,11 @@
<string name="debug_enable_debug_logging_label" translatable="false">
Enable extra debug logging?</string>
<!-- Do Not Translate. Checkbox label, shown only on debug screen -->
- <string name="debug_enable_exchange_logging_label" translatable="false">
- Enable exchange parser logging? (extremely verbose)</string>
+ <string name="debug_enable_verbose_logging_label" translatable="false">
+ Enable extremely verbose logging?</string>
<!-- Do Not Translate. Checkbox label, shown only on debug screen -->
- <string name="debug_enable_exchange_file_logging_label" translatable="false">
- Enable exchange sd card logging?</string>
+ <string name="debug_enable_file_logging_label" translatable="false">
+ Enable sd card logging?</string>
<!-- Do Not Translate. Button label, shown only on debug screen -->
<string name="debug_clear_webview_cache" translatable="false">
Clear WebView cache</string>
@@ -315,7 +320,7 @@
[CHAR_LIMIT=32] -->
<string name="message_compose_include_quoted_text_checkbox_label">Include text</string>
<!-- Toast that appears if you try to send with no recipients. -->
- <string name="message_compose_error_no_recipients">You must add at least one recipient.</string>
+ <string name="message_compose_error_no_recipients">Add at least one recipient.</string>
<!-- An address field contains invalid email addresses. -->
<string name="message_compose_error_invalid_email">Some email addresses are invalid.</string>
<!-- Toast that appears when an attachment is too big to send. -->
@@ -357,10 +362,10 @@
<string name="message_view_status_attachment_saved">Attachment saved
as <xliff:g id="filename">%s</xliff:g>.</string>
<!-- Toast after attachment could not be saved [CHAR LIMIT=30] -->
- <string name="message_view_status_attachment_not_saved">Couldn\'t save the attachment.</string>
+ <string name="message_view_status_attachment_not_saved">Couldn\'t save attachment.</string>
<!-- Toast upon using "send" when one or more attachments will need to be background loaded
[CHAR LIMIT=none]-->
- <string name="message_view_attachment_background_load">Note: One or more attachments in your
+ <string name="message_view_attachment_background_load">One or more attachments in your
forwarded message will be downloaded prior to sending.</string>
<!--Button on the message view screen to show the message content [CHAR LIMIT=16] -->
<string name="message_view_show_message_action">Message</string>
@@ -495,7 +500,7 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
<!-- Notification ticker when email account authentication fails [CHAR LIMIT=none] -->
<string name="login_failed_ticker">
- <xliff:g id="account_name">%s</xliff:g> signin failed.</string>
+ <xliff:g id="account_name">%s</xliff:g> signin unsuccessful.</string>
<!-- Notification title when email account authentication fails [CHAR LIMIT=30]-->
<string name="login_failed_title">Couldn\'t sign in</string>
@@ -531,31 +536,19 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
<!-- Title of screen when setting up new email account [CHAR LIMIT=45] -->
<string name="account_setup_basics_title">Account setup</string>
- <!-- Title of the screen when adding exchange account [CHAR LIMIT=45] -->
- <string name="account_setup_basics_exchange_title">
- Add an Exchange account</string>
- <!-- Title of the screen when adding exchange account [CHAR LIMIT=45] -->
- <string name="account_setup_basics_exchange_title_alternate">
- Add an Exchange ActiveSync account</string>
<!-- Headline of screen when setting up new email account (large text over divider)
[CHAR LIMIT=none] -->
<string name="account_setup_basics_headline">Email account</string>
<!-- On "Set up email" screen, enthusiastic welcome message. -->
- <string name="accounts_welcome">You can set up email for most accounts in just a few steps.
+ <string name="accounts_welcome">You can set up your account in just a few steps.
</string>
- <!-- On "Set up email" screen, enthusiastic welcome message (in EAS mode). -->
- <string name="accounts_welcome_exchange">You can set up an Exchange account in just a few
- steps.</string>
- <!-- On "Set up email" screen, enthusiastic welcome message (in EAS mode). -->
- <string name="accounts_welcome_exchange_alternate">
- You can set up an Exchange ActiveSync account in just a few steps.</string>
<!-- On "Set up email" screen, hint for account email address text field -->
<string name="account_setup_basics_email_label">Email address</string>
<!-- On "Set up email" screen, hint for account email password text field -->
<string name="account_setup_basics_password_label">Password</string>
<!-- On "Set up email" screen, checkbox label for making the new account the default account -->
<string name="account_setup_basics_default_label">
- Send email from this account by default.</string>
+ Send email from this account by default</string>
<!-- Button name on "Set up email" screen -->
<string name="account_setup_basics_manual_setup_action">Manual setup</string>
<!-- Toast when we can't build a URI from the given email & password -->
@@ -590,7 +583,7 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
<!-- Text that appears on "Set up email" screen after successfully setting up an account
[CHAR LIMIT=none] -->
<string name="account_setup_names_headline">
- Your account is set up, and email is on its way!</string>
+ Your account is set up and email is on its way!</string>
<!-- On "Set up email" screen, label of text field -->
<string name="account_setup_names_account_name_label">
Give this account a name (optional)</string>
@@ -630,9 +623,7 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
<!-- "Incoming server settings" screen, label for text field -->
<string name="account_setup_incoming_password_label">Password</string>
<!-- "Incoming server settings" screen, label for text field -->
- <string name="account_setup_incoming_pop_server_label">POP3 server</string>
- <!-- "Incoming server settings" screen, label for text field -->
- <string name="account_setup_incoming_imap_server_label">IMAP server</string>
+ <string name="account_setup_incoming_server_label">Server</string>
<!-- "Incoming server settings" screen, label for text field -->
<string name="account_setup_incoming_port_label">Port</string>
<!-- "Incoming server settings" screen, label for pop-up menu -->
@@ -681,7 +672,7 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
<!-- On "Outgoing server settings" screen, label for pop-up menu -->
<string name="account_setup_outgoing_security_label">Security type</string>
<!-- On "Outgoing server settings" screen, label for check box -->
- <string name="account_setup_outgoing_require_login_label">Require sign-in.</string>
+ <string name="account_setup_outgoing_require_login_label">Require signin</string>
<!-- On "Outgoing server settings" screen, label for text field -->
<string name="account_setup_outgoing_username_label">Username</string>
<!-- On "Outgoing server settings" screen, label for text field -->
@@ -735,20 +726,16 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
<string name="account_setup_options_mail_check_frequency_1hour">Every hour</string>
<!-- Check box label on "Set up email" screen to make this the default account -->
<!-- Note, this should usually match the default account summary preference string -->
- <string name="account_setup_options_default_label">Send email from this account by default.</string>
+ <string name="account_setup_options_default_label">Send email from this account by default</string>
<!-- In Account setup options & Account Settings screens, check box for new-mail notification -->
- <string name="account_setup_options_notify_label">Notify me when email arrives.</string>
+ <string name="account_setup_options_notify_label">Notify me when email arrives</string>
<!-- In Account setup options screen, optional check box to also sync contacts -->
- <string name="account_setup_options_sync_contacts_label">Sync contacts from this account.
- </string>
+ <string name="account_setup_options_sync_contacts_label">Sync contacts from this account</string>
<!-- In Account setup options screen, optional check box to also sync contacts -->
- <string name="account_setup_options_sync_calendar_label">Sync calendar from this account.
- </string>
+ <string name="account_setup_options_sync_calendar_label">Sync calendar from this account</string>
<!-- In Account setup options screen, check box to sync email -->
- <string name="account_setup_options_sync_email_label">Sync email from this account.
- </string>
- <!-- In Account setup options screen, check box to auto-download attachments [CHAR LIMIT=none]
- -->
+ <string name="account_setup_options_sync_email_label">Sync email from this account</string>
+ <!-- In Account setup options screen, check box to auto-download attachments [CHAR LIMIT=none] -->
<string name="account_setup_options_background_attachments_label">
Automatically download attachments when connected to Wi-Fi</string>
<!-- Dialog title when "setup" could not finish -->
@@ -774,9 +761,9 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
<string name="account_setup_options_mail_window_default">Use account\'s default</string>
<!-- "Setup could not finish" dialog text; e.g., Username or password incorrect -->
- <string name="account_setup_failed_dlg_auth_message">Username or password incorrect.</string>
+ <string name="account_setup_failed_dlg_auth_message">Username or password is incorrect.</string>
<!-- "Setup could not finish" dialog text; e.g., Username or password incorrect\n(ERR01 Account does not exist) -->
- <string name="account_setup_failed_dlg_auth_message_fmt">Username or password incorrect.\n(<xliff:g id="error">%s</xliff:g>)</string>
+ <string name="account_setup_failed_dlg_auth_message_fmt">Username or password is incorrect.\n(<xliff:g id="error">%s</xliff:g>)</string>
<!-- An error message presented to the user when the server's identity
cannot be established or trusted [CHAR LIMIT=NONE] -->
@@ -789,16 +776,15 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
<!-- An error message presented to the user when the server requires a
client certificate to connect [CHAR LIMIT=NONE] -->
<string name="account_setup_failed_certificate_required"
- >Client certificate is required. Connect to server with client certificate?</string>
+ >A client certificate is required. Do you want to connect to the server with a client certificate?</string>
<!-- An error message presented to the user when the certificate they
specified for connecting to a server is inaccessible [CHAR LIMIT=NONE] -->
<string name="account_setup_failed_certificate_inaccessible"
- >Certificate is invalid or inaccessible.</string>
+ >The certificate is invalid or inaccessible.</string>
<!-- Dialog text for ambiguous setup failure; server error/bad credentials [CHAR LIMIT=none] -->
<string name="account_setup_failed_check_credentials_message">
- The server responded with an error. Check your username and password
- then try again.</string>
+ The server responded with an error. Check your username and password, then try again.</string>
<!-- "Setup could not finish" dialog text; e.g., Cannot connect to server -->
<string name="account_setup_failed_dlg_server_message">Can\'t connect to server.</string>
@@ -832,7 +818,7 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
[CHAR LIMIT=none] -->
<string name="account_setup_security_policies_required_fmt">
The server <xliff:g id="server">%s</xliff:g> requires that you allow it to remotely control
- some security features of your Android device. Do you want to finish setting up this
+ some security features of your Android device. Do you want to finish setting up this
account?</string>
<!-- Additional diagnostic text when validation failed due to required provisioning not
being supported [CHAR LIMIT=none] -->
@@ -856,14 +842,30 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
provisioning, just before jumping into system settings such as Device Policy grant,
PIN/password, or encryption setup. [CHAR LIMIT=none] -->
<string name="account_security_dialog_content_fmt">
- <xliff:g id="account">%s</xliff:g> requires that you update your security settings.</string>
+ <xliff:g id="account">%s</xliff:g> requires that you update your security
+ settings.</string>
<!-- Notification ticker when device security required (note: unused in Holo XL) -->
- <string name="security_notification_ticker_fmt">
+ <string name="security_unsupported_ticker_fmt">
+ Account \"<xliff:g id="account">%s</xliff:g>\" can\'t be synced due to security
+ requirements.</string>
+ <!-- Notification ticker when device security required (note: unused in Holo XL) -->
+ <string name="security_needed_ticker_fmt">
Account \"<xliff:g id="account">%s</xliff:g>\" requires security settings update.
</string>
+ <!-- Notification ticker when device security required (note: unused in Holo XL) -->
+ <string name="security_changed_ticker_fmt">
+ Account \"<xliff:g id="account">%s</xliff:g>\" changed its security settings; no user
+ action is required.
+ </string>
<!-- Notification content title when device security required [CHAR_LIMIT=30] -->
- <string name="security_notification_content_title">Security update required</string>
+ <string name="security_notification_content_update_title">Security update required</string>
+ <!-- Notification content title when device security policies have changed [CHAR_LIMIT=36] -->
+ <string name="security_notification_content_change_title">Security policies have
+ changed</string>
+ <!-- Notification content title when device security policies cannot be met [CHAR_LIMIT=30] -->
+ <string name="security_notification_content_unsupported_title">Security policies can\'t be
+ met</string>
<!-- Title of the activity that dispatches changes to device security. Not normally seen. -->
<string name="account_security_title">Device security</string>
<!-- Additional diagnostic text when the email app asserts control of the phone.
@@ -892,15 +894,15 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
<string name="password_expire_warning_dialog_title">Lock screen password expiring</string>
<!-- Dialog content device pin/password is going to expire soon. [CHAR_LIMIT=none] -->
<string name="password_expire_warning_dialog_content_fmt">
- You must change your lock screen PIN or password soon, or the data for
- <xliff:g id="account">%s</xliff:g> will be erased. Change it now?</string>
+ You need to change your lock screen PIN or password soon, or the data for
+ <xliff:g id="account">%s</xliff:g> will be erased. Do you want to change it now?</string>
<!-- Dialog title if device pin/password has already expired. [CHAR_LIMIT=40] -->
<string name="password_expired_dialog_title">Lock screen password expired</string>
<!-- Dialog content device pin/password has already expired. [CHAR_LIMIT=none] -->
<string name="password_expired_dialog_content_fmt">
The data for <xliff:g id="account">%s</xliff:g> is being erased from your device.
- You can restore it by changing your lock screen PIN or password. Change it now?</string>
+ You can restore it by changing your lock screen PIN or password. Do you want to change it now?</string>
<!-- On AccountSettingsXL, dialog text if you try to exit in/out/eas fragment (server settings)
without checking/saving [CHAR LIMIT=none]-->
@@ -913,7 +915,7 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
[CHAR_LIMIT=none] -->
<string name="account_settings_login_dialog_content_fmt">
The username or password for <xliff:g id="account">%s</xliff:g> is incorrect.
- Update them now?</string>
+ Do you want to update them now?</string>
<!-- On Settings screen, setting option name -->
<string name="account_settings_default_label">Default account</string>
@@ -932,20 +934,32 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
[CHAR LIMIT=50] -->
<string name="account_settings_summary">Sync frequency, notifications, etc.</string>
<!-- On Settings screen, setting summary text -->
- <string name="account_settings_notify_summary">Notify in System bar when email arrives</string>
+ <string name="account_settings_notify_summary">Send notification when email arrives</string>
<!-- On Settings screen, setting option name and title of dialog box that opens -->
<string name="account_settings_mail_check_frequency_label">Inbox check frequency</string>
<!-- On Settings screen, setting option name -->
<string name="account_settings_incoming_label">Incoming settings</string>
- <!-- On Settings screen, setting option summary [CHAR LIMIT=64] -->
+ <!-- On Settings screen, setting option summary [CHAR LIMIT=64] -->
<string name="account_settings_incoming_summary">
Username, password, and other incoming server settings</string>
<!-- On Settings screen, setting option name -->
<string name="account_settings_outgoing_label">Outgoing settings</string>
- <!-- On Settings screen, setting option summary [CHAR LIMIT=64] -->
+ <!-- On Settings screen, setting option summary [CHAR LIMIT=64] -->
<string name="account_settings_outgoing_summary">
Username, password, and other outgoing server settings</string>
<!-- On Settings screen, setting option name -->
+ <string name="account_settings_enforced_label">Policies enforced</string>
+ <!-- On Settings screen, setting option summary [CHAR LIMIT=64] -->
+ <string name="account_settings_enforced_summary">None</string>
+ <!-- On Settings screen, setting option name -->
+ <string name="account_settings_unsupported_label">Unsupported policies</string>
+ <!-- On Settings screen, setting option summary [CHAR LIMIT=64] -->
+ <string name="account_settings_unsupported_summary">None</string>
+ <!-- On Settings screen, label for button that attempts to sync the account -->
+ <string name="account_settings_retry_label">Attempt sync</string>
+ <!-- On Settings screen, summmary for button that attempts to sync an account [CHAR LIMIT=64] -->
+ <string name="account_settings_retry_summary">Touch here to sync this account</string>
+ <!-- On Settings screen, setting option name -->
<string name="account_settings_description_label">Account name</string>
<!-- On Settings screen, setting option name -->
<string name="account_settings_name_label">Your name</string>
@@ -956,13 +970,15 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
<string name="account_settings_edit_quick_responses_label">Quick responses</string>
<!-- On Settings screen, setting option summary [CHAR LIMIT=64] -->
<string name="account_settings_edit_quick_responses_summary">
- Edit text that you frequently insert when composing emails</string>
+ Edit text that you frequently insert when composing email</string>
<!-- On Settings screen, setting option name -->
<string name="account_settings_signature_hint">Append text to messages you send</string>
<!-- On Settings screen, section heading -->
<string name="account_settings_notifications">Notification settings</string>
<!-- On Settings screen, section heading for data usage [CHAR LIMIT=70] -->
<string name="account_settings_data_usage">Data usage</string>
+ <!-- On Settings screen, section heading -->
+ <string name="account_settings_policies">Security policies</string>
<!-- On settings screen, dialog heading informing user to edit a quick response -->
<string name="edit_quick_response_dialog">Edit quick response</string>
@@ -974,9 +990,9 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
<!-- On settings screen, sync contacts summary text [CHAR LIMIT=35] -->
<string name="account_settings_sync_contacts_summary">Sync contacts for this account</string>
<!-- On settings screen, sync calendar check box label [CHAR LIMIT=20]-->
- <string name="account_settings_sync_calendar_enable">Sync Calendar</string>
- <!-- On settings screen, sync calendar summary text [CHAR LIMIT=35] -->
- <string name="account_settings_sync_calendar_summary">Sync calendar for this account</string>
+ <string name="account_settings_sync_calendar_enable">Sync calendar</string>
+ <!-- On settings screen, sync calendar summary text [CHAR LIMIT=50] -->
+ <string name="account_settings_sync_calendar_summary">Sync calendar event for this account</string>
<!-- On settings screen, sync email check box label [CHAR LIMIT=20]-->
<string name="account_settings_sync_email_enable">Sync email</string>
<!-- On settings screen, sync email summary text [CHAR LIMIT=35] -->
@@ -1086,7 +1102,7 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
<!-- General Preferences Screen -->
<!-- Label in preferences header to describe general preferences [CHAR LIMIT=32] -->
- <string name="header_label_general_preferences">General</string>
+ <string name="header_label_general_preferences">General settings</string>
<!-- First category in general preferences [CHAR LIMIT=64] -->
<string name="category_general_preferences">Application</string>
@@ -1097,8 +1113,27 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
<!-- General preference: Description of the setting for the direction to move to
when deleting the current message.
Options contain "newer message","older message", etc. [CHAR LIMIT=64] -->
- <string name="general_preference_auto_advance_summary">
- Choose which screen to show after you delete a message</string>
+ <string name="general_preference_auto_advance_summary">Choose which screen to show after you
+ delete a message</string>
+ <!-- General preference: Label of the setting for hiding checkboxes in the
+ message list [CHAR LIMIT=32] -->
+ <string name="general_preference_hide_checkboxes_label">Hide checkboxes</string>
+ <!-- General preference: Description of the setting for hiding checkboxes in the
+ message list [CHAR LIMIT=64] -->
+ <string name="general_preference_hide_checkboxes_summary">In lists of messages, touch and
+ hold to select</string>
+ <!-- General preference: Label of the setting for requiring confirmation before
+ message deletion [CHAR LIMIT=32] -->
+ <string name="general_preference_confirm_delete_label">Confirm before deleting</string>
+ <!-- General preference: Description of the setting for requiring confirmation before
+ message deletion [CHAR LIMIT=64] -->
+ <string name="general_preference_confirm_delete_summary">Messages</string>
+ <!-- General preference: Label of the setting for requiring confirmation before
+ message sending [CHAR LIMIT=32] -->
+ <string name="general_preference_confirm_send_label">Confirm before sending</string>
+ <!-- General preference: Description of the setting for requiring confirmation before
+ message sending [CHAR LIMIT=32] -->
+ <string name="general_preference_confirm_send_summary">Messages</string>
<!-- General preference: Title of the dialog box containing options for setting for
the direction to move to when deleting the current message.
Options contain "newer message","older message", etc. [CHAR LIMIT=32] -->
@@ -1226,7 +1261,44 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
Used only in layout computation, and never actually exposed to the user. -->
<string name="long_string" translatable="false">looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong</string>
+ <!-- A policy disallowing the user of the device's camera [CHAR LIMIT=50] -->
+ <string name="policy_dont_allow_camera">Disallow use of the device\'s camera</string>
+ <!-- A policy requiring a device lock screen password [CHAR LIMIT=50] -->
+ <string name="policy_require_password">Require device password</string>
+ <!-- A policy disallowing the reuse of recent passwords [CHAR LIMIT=50] -->
+ <string name="policy_password_history">Restrict the reuse of recent passwords</string>
+ <!-- A policy that forces a password to expire after a set period of time [CHAR LIMIT=50] -->
+ <string name="policy_password_expiration">Require passwords to expire</string>
+ <!-- A policy requiring a maximum amount of time the device can sit idle before the lock screen
+ is activated [CHAR LIMIT=50] -->
+ <string name="policy_screen_timeout">Require an idle device to lock its screen</string>
+ <!-- A policy limiting the number of old calendar events synced [CHAR LIMIT=50] -->
+ <string name="policy_calendar_age">Limit the number of calendar events synced</string>
+ <!-- A policy limiting the number of emails synced [CHAR LIMIT=50] -->
+ <string name="policy_email_age">Limit the number of emails synced</string>
+
+ <!-- The four strings below represent "quick responses" which the user can insert into a
+ message being composed with just a couple of taps. These four responses MUST be defined,
+ but need not include a string (i.e. they are optional). Further, the responses can be
+ customized as necessary by the translator, in case one or more of these is inappropriate in
+ a particular locale or if there are better options available. -->
+ <!-- A "quick response", i.e. a quick reply to a received mail [CHAR LIMIT=NONE] -->
+ <string name="quick_1">Thanks!</string>
+ <!-- A "quick response", i.e. a quick reply to a received mail [CHAR LIMIT=NONE] -->
+ <string name="quick_2">Sounds good to me!</string>
+ <!-- A "quick response", i.e. a quick reply to a received mail [CHAR LIMIT=NONE] -->
+ <string name="quick_3">I\'ll read this later and get back to you.</string>
+ <!-- A "quick response", i.e. a quick reply to a received mail [CHAR LIMIT=NONE] -->
+ <string name="quick_4">Let\'s set up a meeting to discuss this.</string>
+
<!-- This is the message warning the user that they must sync manually when roaming. [CHAR LIMIT=none]-->
<string name="require_manual_sync_message">Background sync for this account is disabled while\
roaming.</string>
+
+ <!-- This is shown when a user responds to a meeting invitation [CHAR LIMIT=none]-->
+ <string name="confirm_response">Sending response...</string>
+
+ <!-- Displayed in the middle of the screen when the inbox is empty [CHAR LIMIT 100]-->
+ <string name="no_conversations">No messages.</string>
</resources>
+
diff --git a/res/values/styles.xml b/res/values/styles.xml
index c88ff5976..956a86cff 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -16,13 +16,6 @@
<!-- non-xlarge. See also values-xlarge for specializations for xlarge screens -->
<resources>
- <style name="EmailTheme" parent="@android:style/Theme.Holo.Light">
- </style>
-
- <style name="ThemeNoTitleBar" parent="android:Theme.NoTitleBar">
- <item name="android:windowContentOverlay">@null</item>
- </style>
-
<!-- The headline at the top of every account settings fragments (in preferences) -->
<!-- TODO these are estimates for the phone UX - final sizes TBD -->
<style name="accountSettingsHeadline">
@@ -52,176 +45,5 @@
<item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
</style>
-
- <!-- EditText style without the "tray" -->
- <style name="PlainEditText" parent="android:Widget.Holo.Light.EditText">
- <item name="android:background">@null</item>
- </style>
-
- <style name="notification_secondary_text">
- <item name="android:textColor">?android:attr/textColorSecondary</item>
- </style>
-
- <style name="widget_list_item">
- <item name="android:textColor">?android:attr/textColorSecondary</item>
- <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
- </style>
-
- <style name="message_details_value">
- <item name="android:textSize">14dip</item>
- <item name="android:textColor">@color/text_secondary_color</item>
- <item name="android:singleLine">false</item>
- <item name="android:lineSpacingMultiplier">1.5</item>
- </style>
-
- <style name="message_details_value_selectable" parent="message_details_value">
- <item name="android:textIsSelectable">true</item>
- </style>
-
- <style name="message_details_label" parent="message_details_value">
- <item name="android:textStyle">bold</item>
- <item name="android:singleLine">true</item>
- <item name="android:layout_marginRight">8dp</item>
- <item name="android:layout_marginLeft">8dp</item>
- </style>
-
- <style name="message_view_subject">
- <item name="android:textSize">18dip</item>
- <item name="android:textColor">@color/text_primary_color</item>
- <item name="android:textStyle">bold</item>
- <item name="android:enabled">false</item>
- <item name="android:ellipsize">end</item>
- </style>
-
- <style name="Attachment" />
-
- <style name="Attachment.Button" parent="@android:style/Widget.Holo.Button.Borderless">
- <item name="android:minHeight">0dip</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:layout_width">0dip</item>
- <item name="android:layout_weight">1</item>
- <item name="android:layout_gravity">center_vertical</item>
- <item name="android:paddingTop">8dip</item>
- <item name="android:paddingBottom">8dip</item>
- <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
- <item name="android:textStyle">bold</item>
- <item name="android:textColor">@color/buttontext</item>
- <item name="android:singleLine">true</item>
- <item name="android:textAllCaps">true</item>
- </style>
-
- <style name="attachment_container">
- <item name="android:background">@drawable/attachment_background</item>
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:orientation">horizontal</item>
- </style>
-
- <style name="attachment_name">
- <item name="android:id">@id/attachment_name</item>
- <item name="android:paddingLeft">5dip</item>
- <item name="android:maxLines">1</item>
- <item name="android:layout_width">wrap_content</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:textColor">@color/text_primary_color</item>
- </style>
-
- <style name="attachment_thumbnail">
- <item name="android:layout_gravity">center_vertical</item>
- <item name="android:paddingLeft">5dip</item>
- <item name="android:layout_width">32dip</item>
- <item name="android:layout_height">32dip</item>
- </style>
-
- <style name="action_bar_custom_view">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">match_parent</item>
- </style>
-
- <style name="message_view_text">
- <item name="android:textSize">14dip</item>
- <item name="android:textColor">@color/text_secondary_color</item>
- </style>
-
- <style name="message_view_horizontal_divider">
- <item name="android:layout_height">1dip</item>
- <item name="android:background">?android:attr/dividerHorizontal</item>
- </style>
-
- <style name="message_view_tab" parent="@android:style/Widget.Holo.Light.Tab">
- <item name="android:layout_height">32dip</item>
- <item name="android:gravity">center</item>
- <item name="android:textSize">14dip</item>
- <item name="android:textColor">@color/text_secondary_color</item>
- </style>
-
- <style name="action_bar_account_name">
- <item name="android:textSize">18dip</item>
- <item name="android:textColor">@color/text_primary_color</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">end</item>
- </style>
-
- <style name="action_bar_account_name_secondary">
- <item name="android:textSize">14dip</item>
- <item name="android:textColor">@color/text_ternary_color</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">end</item>
- </style>
-
- <style name="action_bar_spinner_primary_text">
- <item name="android:textSize">16sp</item>
- <item name="android:textColor">@color/text_primary_color</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">end</item>
- </style>
-
- <style name="action_bar_spinner_secondary_text">
- <item name="android:textSize">14sp</item>
- <item name="android:textColor">@color/text_secondary_color</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">end</item>
- <item name="android:layout_marginTop">-4dip</item>
- </style>
-
- <style name="search_header">
- <item name="android:layout_height">32dip</item>
- <item name="android:layout_width">match_parent</item>
- <item name="android:paddingLeft">6dip</item>
- <item name="android:paddingRight">6dip</item>
- </style>
-
- <style name="message_list_item_normal">
- <!-- no styles on phones -->
- </style>
- <style name="message_list_item_wide">
- <!-- no styles on phones -->
- </style>
-
- <style name="message_view_action_buttons" parent="android:Widget.Holo.Button.Borderless">
- <item name="android:layout_width">48dip</item>
- <item name="android:layout_height">48dip</item>
- <item name="android:scaleType">center</item>
- </style>
-
- <style name="message_header_sender_name">
- <item name="android:textSize">16dip</item>
- <item name="android:textStyle">bold</item>
- <item name="android:textColor">@color/text_primary_color_inverse</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">end</item>
- </style>
-
- <style name="message_header_sender_address">
- <item name="android:textSize">14dip</item>
- <item name="android:textColor">@color/text_secondary_color_inverse</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">end</item>
- </style>
-
- <style name="QuotedTextHeaderStyle">
- <item name="android:textColor">#777777</item>
- <item name="android:textSize">12sp</item>
- </style>
</resources>
diff --git a/res/xml/account_settings_preferences.xml b/res/xml/account_settings_preferences.xml
index 7b6fa9bd6..03cb7c61a 100644..100755
--- a/res/xml/account_settings_preferences.xml
+++ b/res/xml/account_settings_preferences.xml
@@ -136,11 +136,23 @@
</PreferenceCategory>
<PreferenceCategory
- android:title="@string/account_settings_category_delete_account">
-
- <PreferenceScreen
- android:key="delete_account"
- android:title="@string/account_settings_delete_account_label" />
+ android:key="account_policies"
+ android:title="@string/account_settings_policies">
+
+ <com.android.email.activity.setup.PolicyListPreference
+ android:key="policies_enforced"
+ android:title="@string/account_settings_enforced_label"
+ android:summary="@string/account_settings_enforced_summary" />
+
+ <com.android.email.activity.setup.PolicyListPreference
+ android:key="policies_unsupported"
+ android:title="@string/account_settings_unsupported_label"
+ android:summary="@string/account_settings_unsupported_summary" />
+
+ <Preference
+ android:key="policies_retry_account"
+ android:title="@string/account_settings_retry_label"
+ android:summary="@string/account_settings_retry_summary" />
</PreferenceCategory>
</PreferenceScreen>
diff --git a/res/xml/general_preferences.xml b/res/xml/general_preferences.xml
index 93beefb8e..abb01f6af 100644
--- a/res/xml/general_preferences.xml
+++ b/res/xml/general_preferences.xml
@@ -17,38 +17,54 @@
<!-- App-wide preferences -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
- <PreferenceCategory
- android:key="category_general_preferences"
- android:title="@string/category_general_preferences">
-
- <ListPreference
- android:key="auto_advance"
- android:title="@string/general_preference_auto_advance_label"
- android:summary="@string/general_preference_auto_advance_summary"
- android:entries="@array/general_preference_auto_advance_entries"
- android:entryValues="@array/general_preference_auto_advance_values"
- android:dialogTitle="@string/general_preference_auto_advance_dialog_title" />
-
- <!-- Note, summary is set dynamically in GeneralPreferences.java -->
- <ListPreference
- android:key="text_zoom"
- android:title="@string/general_preference_text_zoom_label"
- android:entries="@array/general_preference_text_zoom_entries"
- android:entryValues="@array/general_preference_text_zoom_values"
- android:dialogTitle="@string/general_preference_text_zoom_dialog_title" />
-
- <!-- This may be removed in GeneralPreferences.java -->
- <CheckBoxPreference
- android:key="reply_all"
- android:persistent="true"
- android:defaultValue="false"
- android:title="@string/general_preference_reply_all_label"
- android:summary="@string/general_preference_reply_all_summary" />
-
- <PreferenceScreen
- android:key="clear_trusted_senders"
- android:title="@string/general_preferences_clear_trusted_senders_title"
- android:summary="@string/general_preferences_clear_trusted_senders_summary" />
-
- </PreferenceCategory>
+ <CheckBoxPreference
+ android:key="confirm_delete"
+ android:persistent="true"
+ android:defaultValue="false"
+ android:title="@string/general_preference_confirm_delete_label"
+ android:summary="@string/general_preference_confirm_delete_summary" />
+
+ <CheckBoxPreference
+ android:key="confirm_send"
+ android:persistent="true"
+ android:defaultValue="false"
+ android:title="@string/general_preference_confirm_send_label"
+ android:summary="@string/general_preference_confirm_send_summary" />
+
+ <ListPreference
+ android:key="auto_advance"
+ android:title="@string/general_preference_auto_advance_label"
+ android:summary="@string/general_preference_auto_advance_summary"
+ android:entries="@array/general_preference_auto_advance_entries"
+ android:entryValues="@array/general_preference_auto_advance_values"
+ android:dialogTitle="@string/general_preference_auto_advance_dialog_title" />
+
+ <!-- Note, summary is set dynamically in GeneralPreferences.java -->
+ <ListPreference
+ android:key="text_zoom"
+ android:title="@string/general_preference_text_zoom_label"
+ android:entries="@array/general_preference_text_zoom_entries"
+ android:entryValues="@array/general_preference_text_zoom_values"
+ android:dialogTitle="@string/general_preference_text_zoom_dialog_title" />
+
+ <CheckBoxPreference
+ android:key="hide_checkboxes"
+ android:persistent="true"
+ android:defaultValue="false"
+ android:title="@string/general_preference_hide_checkboxes_label"
+ android:summary="@string/general_preference_hide_checkboxes_summary" />
+
+ <!-- This may be removed in GeneralPreferences.java -->
+ <CheckBoxPreference
+ android:key="reply_all"
+ android:persistent="true"
+ android:defaultValue="false"
+ android:title="@string/general_preference_reply_all_label"
+ android:summary="@string/general_preference_reply_all_summary" />
+
+ <PreferenceScreen
+ android:key="clear_trusted_senders"
+ android:title="@string/general_preferences_clear_trusted_senders_title"
+ android:summary="@string/general_preferences_clear_trusted_senders_summary" />
+
</PreferenceScreen>
diff --git a/res/xml/pop_imap_authenticator.xml b/res/xml/pop_imap_authenticator.xml
index e82b94b25..ca34a8c9f 100644
--- a/res/xml/pop_imap_authenticator.xml
+++ b/res/xml/pop_imap_authenticator.xml
@@ -22,7 +22,7 @@
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.android.email"
- android:icon="@mipmap/ic_launcher_email"
+ android:icon="@mipmap/ic_launcher_mail"
android:smallIcon="@drawable/stat_notify_email_generic"
android:label="@string/app_name"
android:accountPreferences="@xml/account_preferences"
diff --git a/res/xml/syncadapter_pop_imap.xml b/res/xml/syncadapter_pop_imap.xml
index c1c0734ea..f4a7120fc 100644
--- a/res/xml/syncadapter_pop_imap.xml
+++ b/res/xml/syncadapter_pop_imap.xml
@@ -23,5 +23,6 @@
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.android.email.provider"
android:accountType="com.android.email"
- android:supportsUploading="false"
+ android:supportsUploading="true"
+ android:allowParallelSyncs="true"
/>
diff --git a/res/xml/widget_info.xml b/res/xml/widget_info.xml
index 5f3622f92..047857ece 100644
--- a/res/xml/widget_info.xml
+++ b/res/xml/widget_info.xml
@@ -21,5 +21,5 @@
android:previewImage="@drawable/email_widget_preview"
android:initialLayout="@layout/widget"
android:resizeMode="horizontal|vertical"
- android:configure="com.android.email.widget.WidgetConfiguration"
+ android:configure="com.android.email2.ui.MailboxSelectionActivityEmail"
/>
diff --git a/src/com/android/email/AttachmentInfo.java b/src/com/android/email/AttachmentInfo.java
index cedb63ea9..91a330026 100644
--- a/src/com/android/email/AttachmentInfo.java
+++ b/src/com/android/email/AttachmentInfo.java
@@ -35,7 +35,7 @@ import java.util.List;
/**
* Encapsulates commonly used attachment information related to suitability for viewing and saving,
- * based on the attachment's filename and mime type.
+ * based on the attachment's filename and mimetype.
*/
public class AttachmentInfo {
// Projection which can be used with the constructor taking a Cursor argument
diff --git a/src/com/android/email/Controller.java b/src/com/android/email/Controller.java
deleted file mode 100644
index 93a7d160e..000000000
--- a/src/com/android/email/Controller.java
+++ /dev/null
@@ -1,1889 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import android.app.Service;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteCallbackList;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.email.mail.store.Pop3Store.Pop3Message;
-import com.android.email.provider.AccountBackupRestore;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email.service.MailService;
-import com.android.emailcommon.Api;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.AuthenticationFailedException;
-import com.android.emailcommon.mail.Folder.MessageRetrievalListener;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.Body;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.service.EmailServiceStatus;
-import com.android.emailcommon.service.IEmailService;
-import com.android.emailcommon.service.IEmailServiceCallback;
-import com.android.emailcommon.service.SearchParams;
-import com.android.emailcommon.utility.AttachmentUtilities;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * New central controller/dispatcher for Email activities that may require remote operations.
- * Handles disambiguating between legacy MessagingController operations and newer provider/sync
- * based code. We implement Service to allow loadAttachment calls to be sent in a consistent manner
- * to IMAP, POP3, and EAS by AttachmentDownloadService
- */
-public class Controller {
- private static final String TAG = "Controller";
- private static Controller sInstance;
- private final Context mContext;
- private Context mProviderContext;
- private final MessagingController mLegacyController;
- private final LegacyListener mLegacyListener = new LegacyListener();
- private final ServiceCallback mServiceCallback = new ServiceCallback();
- private final HashSet<Result> mListeners = new HashSet<Result>();
- /*package*/ final ConcurrentHashMap<Long, Boolean> mLegacyControllerMap =
- new ConcurrentHashMap<Long, Boolean>();
-
- // Note that 0 is a syntactically valid account key; however there can never be an account
- // with id = 0, so attempts to restore the account will return null. Null values are
- // handled properly within the code, so this won't cause any issues.
- private static final long GLOBAL_MAILBOX_ACCOUNT_KEY = 0;
- /*package*/ static final String ATTACHMENT_MAILBOX_SERVER_ID = "__attachment_mailbox__";
- /*package*/ static final String ATTACHMENT_MESSAGE_UID_PREFIX = "__attachment_message__";
- /*package*/ static final String SEARCH_MAILBOX_SERVER_ID = "__search_mailbox__";
- private static final String WHERE_TYPE_ATTACHMENT =
- MailboxColumns.TYPE + "=" + Mailbox.TYPE_ATTACHMENT;
- private static final String WHERE_MAILBOX_KEY = MessageColumns.MAILBOX_KEY + "=?";
-
- private static final String[] MESSAGEID_TO_ACCOUNTID_PROJECTION = new String[] {
- EmailContent.RECORD_ID,
- EmailContent.MessageColumns.ACCOUNT_KEY
- };
- private static final int MESSAGEID_TO_ACCOUNTID_COLUMN_ACCOUNTID = 1;
-
- private static final String[] BODY_SOURCE_KEY_PROJECTION =
- new String[] {Body.SOURCE_MESSAGE_KEY};
- private static final int BODY_SOURCE_KEY_COLUMN = 0;
- private static final String WHERE_MESSAGE_KEY = Body.MESSAGE_KEY + "=?";
-
- private static final String MAILBOXES_FOR_ACCOUNT_SELECTION = MailboxColumns.ACCOUNT_KEY + "=?";
- private static final String MAILBOXES_FOR_ACCOUNT_EXCEPT_ACCOUNT_MAILBOX_SELECTION =
- MAILBOXES_FOR_ACCOUNT_SELECTION + " AND " + MailboxColumns.TYPE + "!=" +
- Mailbox.TYPE_EAS_ACCOUNT_MAILBOX;
- private static final String MESSAGES_FOR_ACCOUNT_SELECTION = MessageColumns.ACCOUNT_KEY + "=?";
-
- // Service callbacks as set up via setCallback
- private static RemoteCallbackList<IEmailServiceCallback> sCallbackList =
- new RemoteCallbackList<IEmailServiceCallback>();
-
- private volatile boolean mInUnitTests = false;
-
- protected Controller(Context _context) {
- mContext = _context.getApplicationContext();
- mProviderContext = _context;
- mLegacyController = MessagingController.getInstance(mProviderContext, this);
- mLegacyController.addListener(mLegacyListener);
- }
-
- /**
- * Mark this controller as being in use in a unit test.
- * This is a kludge vs having proper mocks and dependency injection; since the Controller is a
- * global singleton there isn't much else we can do.
- */
- public void markForTest(boolean inUnitTests) {
- mInUnitTests = inUnitTests;
- }
-
- /**
- * Cleanup for test. Mustn't be called for the regular {@link Controller}, as it's a
- * singleton and lives till the process finishes.
- *
- * <p>However, this method MUST be called for mock instances.
- */
- public void cleanupForTest() {
- mLegacyController.removeListener(mLegacyListener);
- }
-
- /**
- * Gets or creates the singleton instance of Controller.
- */
- public synchronized static Controller getInstance(Context _context) {
- if (sInstance == null) {
- sInstance = new Controller(_context);
- }
- return sInstance;
- }
-
- /**
- * Inject a mock controller. Used only for testing. Affects future calls to getInstance().
- *
- * Tests that use this method MUST clean it up by calling this method again with null.
- */
- public synchronized static void injectMockControllerForTest(Controller mockController) {
- sInstance = mockController;
- }
-
- /**
- * For testing only: Inject a different context for provider access. This will be
- * used internally for access the underlying provider (e.g. getContentResolver().query()).
- * @param providerContext the provider context to be used by this instance
- */
- public void setProviderContext(Context providerContext) {
- mProviderContext = providerContext;
- }
-
- /**
- * Any UI code that wishes for callback results (on async ops) should register their callback
- * here (typically from onResume()). Unregistered callbacks will never be called, to prevent
- * problems when the command completes and the activity has already paused or finished.
- * @param listener The callback that may be used in action methods
- */
- public void addResultCallback(Result listener) {
- synchronized (mListeners) {
- listener.setRegistered(true);
- mListeners.add(listener);
- }
- }
-
- /**
- * Any UI code that no longer wishes for callback results (on async ops) should unregister
- * their callback here (typically from onPause()). Unregistered callbacks will never be called,
- * to prevent problems when the command completes and the activity has already paused or
- * finished.
- * @param listener The callback that may no longer be used
- */
- public void removeResultCallback(Result listener) {
- synchronized (mListeners) {
- listener.setRegistered(false);
- mListeners.remove(listener);
- }
- }
-
- public Collection<Result> getResultCallbacksForTest() {
- return mListeners;
- }
-
- /**
- * Delete all Messages that live in the attachment mailbox
- */
- public void deleteAttachmentMessages() {
- // Note: There should only be one attachment mailbox at present
- ContentResolver resolver = mProviderContext.getContentResolver();
- Cursor c = null;
- try {
- c = resolver.query(Mailbox.CONTENT_URI, EmailContent.ID_PROJECTION,
- WHERE_TYPE_ATTACHMENT, null, null);
- while (c.moveToNext()) {
- long mailboxId = c.getLong(EmailContent.ID_PROJECTION_COLUMN);
- // Must delete attachments BEFORE messages
- AttachmentUtilities.deleteAllMailboxAttachmentFiles(mProviderContext, 0,
- mailboxId);
- resolver.delete(Message.CONTENT_URI, WHERE_MAILBOX_KEY,
- new String[] {Long.toString(mailboxId)});
- }
- } finally {
- if (c != null) {
- c.close();
- }
- }
- }
-
- /**
- * Get a mailbox based on a sqlite WHERE clause
- */
- private Mailbox getGlobalMailboxWhere(String where) {
- Cursor c = mProviderContext.getContentResolver().query(Mailbox.CONTENT_URI,
- Mailbox.CONTENT_PROJECTION, where, null, null);
- try {
- if (c.moveToFirst()) {
- Mailbox m = new Mailbox();
- m.restore(c);
- return m;
- }
- } finally {
- c.close();
- }
- return null;
- }
-
- /**
- * Returns the attachment mailbox (where we store eml attachment Emails), creating one
- * if necessary
- * @return the global attachment mailbox
- */
- public Mailbox getAttachmentMailbox() {
- Mailbox m = getGlobalMailboxWhere(WHERE_TYPE_ATTACHMENT);
- if (m == null) {
- m = new Mailbox();
- m.mAccountKey = GLOBAL_MAILBOX_ACCOUNT_KEY;
- m.mServerId = ATTACHMENT_MAILBOX_SERVER_ID;
- m.mFlagVisible = false;
- m.mDisplayName = ATTACHMENT_MAILBOX_SERVER_ID;
- m.mSyncInterval = Mailbox.CHECK_INTERVAL_NEVER;
- m.mType = Mailbox.TYPE_ATTACHMENT;
- m.save(mProviderContext);
- }
- return m;
- }
-
- /**
- * Returns the search mailbox for the specified account, creating one if necessary
- * @return the search mailbox for the passed in account
- */
- public Mailbox getSearchMailbox(long accountId) {
- Mailbox m = Mailbox.restoreMailboxOfType(mContext, accountId, Mailbox.TYPE_SEARCH);
- if (m == null) {
- m = new Mailbox();
- m.mAccountKey = accountId;
- m.mServerId = SEARCH_MAILBOX_SERVER_ID;
- m.mFlagVisible = false;
- m.mDisplayName = SEARCH_MAILBOX_SERVER_ID;
- m.mSyncInterval = Mailbox.CHECK_INTERVAL_NEVER;
- m.mType = Mailbox.TYPE_SEARCH;
- m.mFlags = Mailbox.FLAG_HOLDS_MAIL;
- m.mParentKey = Mailbox.NO_MAILBOX;
- m.save(mProviderContext);
- }
- return m;
- }
-
- /**
- * Create a Message from the Uri and store it in the attachment mailbox
- * @param uri the uri containing message content
- * @return the Message or null
- */
- public Message loadMessageFromUri(Uri uri) {
- Mailbox mailbox = getAttachmentMailbox();
- if (mailbox == null) return null;
- try {
- InputStream is = mProviderContext.getContentResolver().openInputStream(uri);
- try {
- // First, create a Pop3Message from the attachment and then parse it
- Pop3Message pop3Message = new Pop3Message(
- ATTACHMENT_MESSAGE_UID_PREFIX + System.currentTimeMillis(), null);
- pop3Message.parse(is);
- // Now, pull out the header fields
- Message msg = new Message();
- LegacyConversions.updateMessageFields(msg, pop3Message, 0, mailbox.mId);
- // Commit the message to the local store
- msg.save(mProviderContext);
- // Setup the rest of the message and mark it completely loaded
- mLegacyController.copyOneMessageToProvider(pop3Message, msg,
- Message.FLAG_LOADED_COMPLETE, mProviderContext);
- // Restore the complete message and return it
- return Message.restoreMessageWithId(mProviderContext, msg.mId);
- } catch (MessagingException e) {
- } catch (IOException e) {
- }
- } catch (FileNotFoundException e) {
- }
- return null;
- }
-
- /**
- * Set logging flags for external sync services
- *
- * Generally this should be called by anybody who changes Email.DEBUG
- */
- public void serviceLogging(int debugFlags) {
- IEmailService service = EmailServiceUtils.getExchangeService(mContext, mServiceCallback);
- try {
- service.setLogging(debugFlags);
- } catch (RemoteException e) {
- // TODO Change exception handling to be consistent with however this method
- // is implemented for other protocols
- Log.d("setLogging", "RemoteException" + e);
- }
- }
-
- /**
- * Request a remote update of mailboxes for an account.
- */
- public void updateMailboxList(final long accountId) {
- Utility.runAsync(new Runnable() {
- @Override
- public void run() {
- final IEmailService service = getServiceForAccount(accountId);
- if (service != null) {
- // Service implementation
- try {
- service.updateFolderList(accountId);
- } catch (RemoteException e) {
- // TODO Change exception handling to be consistent with however this method
- // is implemented for other protocols
- Log.d("updateMailboxList", "RemoteException" + e);
- }
- } else {
- // MessagingController implementation
- mLegacyController.listFolders(accountId, mLegacyListener);
- }
- }
- });
- }
-
- /**
- * Request a remote update of a mailbox. For use by the timed service.
- *
- * Functionally this is quite similar to updateMailbox(), but it's a separate API and
- * separate callback in order to keep UI callbacks from affecting the service loop.
- */
- public void serviceCheckMail(final long accountId, final long mailboxId, final long tag) {
- IEmailService service = getServiceForAccount(accountId);
- if (service != null) {
- // Service implementation
-// try {
- // TODO this isn't quite going to work, because we're going to get the
- // generic (UI) callbacks and not the ones we need to restart the ol' service.
- // service.startSync(mailboxId, tag);
- mLegacyListener.checkMailFinished(mContext, accountId, mailboxId, tag);
-// } catch (RemoteException e) {
- // TODO Change exception handling to be consistent with however this method
- // is implemented for other protocols
-// Log.d("updateMailbox", "RemoteException" + e);
-// }
- } else {
- // MessagingController implementation
- Utility.runAsync(new Runnable() {
- public void run() {
- mLegacyController.checkMail(accountId, tag, mLegacyListener);
- }
- });
- }
- }
-
- /**
- * Request a remote update of a mailbox.
- *
- * The contract here should be to try and update the headers ASAP, in order to populate
- * a simple message list. We should also at this point queue up a background task of
- * downloading some/all of the messages in this mailbox, but that should be interruptable.
- */
- public void updateMailbox(final long accountId, final long mailboxId, boolean userRequest) {
-
- IEmailService service = getServiceForAccount(accountId);
- if (service != null) {
- try {
- service.startSync(mailboxId, userRequest);
- } catch (RemoteException e) {
- // TODO Change exception handling to be consistent with however this method
- // is implemented for other protocols
- Log.d("updateMailbox", "RemoteException" + e);
- }
- } else {
- // MessagingController implementation
- Utility.runAsync(new Runnable() {
- public void run() {
- // TODO shouldn't be passing fully-build accounts & mailboxes into APIs
- Account account =
- Account.restoreAccountWithId(mProviderContext, accountId);
- Mailbox mailbox =
- Mailbox.restoreMailboxWithId(mProviderContext, mailboxId);
- if (account == null || mailbox == null ||
- mailbox.mType == Mailbox.TYPE_SEARCH) {
- return;
- }
- mLegacyController.synchronizeMailbox(account, mailbox, mLegacyListener);
- }
- });
- }
- }
-
- /**
- * Request that any final work necessary be done, to load a message.
- *
- * Note, this assumes that the caller has already checked message.mFlagLoaded and that
- * additional work is needed. There is no optimization here for a message which is already
- * loaded.
- *
- * @param messageId the message to load
- * @param callback the Controller callback by which results will be reported
- */
- public void loadMessageForView(final long messageId) {
-
- // Split here for target type (Service or MessagingController)
- IEmailService service = getServiceForMessage(messageId);
- if (service != null) {
- // There is no service implementation, so we'll just jam the value, log the error,
- // and get out of here.
- Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, messageId);
- ContentValues cv = new ContentValues();
- cv.put(MessageColumns.FLAG_LOADED, Message.FLAG_LOADED_COMPLETE);
- mProviderContext.getContentResolver().update(uri, cv, null, null);
- Log.d(Logging.LOG_TAG, "Unexpected loadMessageForView() for service-based message.");
- final long accountId = Account.getAccountIdForMessageId(mProviderContext, messageId);
- synchronized (mListeners) {
- for (Result listener : mListeners) {
- listener.loadMessageForViewCallback(null, accountId, messageId, 100);
- }
- }
- } else {
- // MessagingController implementation
- Utility.runAsync(new Runnable() {
- public void run() {
- mLegacyController.loadMessageForView(messageId, mLegacyListener);
- }
- });
- }
- }
-
-
- /**
- * Saves the message to a mailbox of given type.
- * This is a synchronous operation taking place in the same thread as the caller.
- * Upon return the message.mId is set.
- * @param message the message (must have the mAccountId set).
- * @param mailboxType the mailbox type (e.g. Mailbox.TYPE_DRAFTS).
- */
- public void saveToMailbox(final EmailContent.Message message, final int mailboxType) {
- long accountId = message.mAccountKey;
- long mailboxId = findOrCreateMailboxOfType(accountId, mailboxType);
- message.mMailboxKey = mailboxId;
- message.save(mProviderContext);
- }
-
- /**
- * Look for a specific system mailbox, creating it if necessary, and return the mailbox id.
- * This is a blocking operation and should not be called from the UI thread.
- *
- * Synchronized so multiple threads can call it (and not risk creating duplicate boxes).
- *
- * @param accountId the account id
- * @param mailboxType the mailbox type (e.g. EmailContent.Mailbox.TYPE_TRASH)
- * @return the id of the mailbox. The mailbox is created if not existing.
- * Returns Mailbox.NO_MAILBOX if the accountId or mailboxType are negative.
- * Does not validate the input in other ways (e.g. does not verify the existence of account).
- */
- public synchronized long findOrCreateMailboxOfType(long accountId, int mailboxType) {
- if (accountId < 0 || mailboxType < 0) {
- return Mailbox.NO_MAILBOX;
- }
- long mailboxId =
- Mailbox.findMailboxOfType(mProviderContext, accountId, mailboxType);
- return mailboxId == Mailbox.NO_MAILBOX ? createMailbox(accountId, mailboxType) : mailboxId;
- }
-
- /**
- * Returns the server-side name for a specific mailbox.
- *
- * @return the resource string corresponding to the mailbox type, empty if not found.
- */
- public static String getMailboxServerName(Context context, int mailboxType) {
- int resId = -1;
- switch (mailboxType) {
- case Mailbox.TYPE_INBOX:
- resId = R.string.mailbox_name_server_inbox;
- break;
- case Mailbox.TYPE_OUTBOX:
- resId = R.string.mailbox_name_server_outbox;
- break;
- case Mailbox.TYPE_DRAFTS:
- resId = R.string.mailbox_name_server_drafts;
- break;
- case Mailbox.TYPE_TRASH:
- resId = R.string.mailbox_name_server_trash;
- break;
- case Mailbox.TYPE_SENT:
- resId = R.string.mailbox_name_server_sent;
- break;
- case Mailbox.TYPE_JUNK:
- resId = R.string.mailbox_name_server_junk;
- break;
- }
- return resId != -1 ? context.getString(resId) : "";
- }
-
- /**
- * Create a mailbox given the account and mailboxType.
- * TODO: Does this need to be signaled explicitly to the sync engines?
- */
- @VisibleForTesting
- long createMailbox(long accountId, int mailboxType) {
- if (accountId < 0 || mailboxType < 0) {
- String mes = "Invalid arguments " + accountId + ' ' + mailboxType;
- Log.e(Logging.LOG_TAG, mes);
- throw new RuntimeException(mes);
- }
- Mailbox box = Mailbox.newSystemMailbox(
- accountId, mailboxType, getMailboxServerName(mContext, mailboxType));
- box.save(mProviderContext);
- return box.mId;
- }
-
- /**
- * Send a message:
- * - move the message to Outbox (the message is assumed to be in Drafts).
- * - EAS service will take it from there
- * - mark reply/forward state in source message (if any)
- * - trigger send for POP/IMAP
- * @param message the fully populated Message (usually retrieved from the Draft box). Note that
- * all transient fields (e.g. Body related fields) are also expected to be fully loaded
- */
- public void sendMessage(Message message) {
- ContentResolver resolver = mProviderContext.getContentResolver();
- long accountId = message.mAccountKey;
- long messageId = message.mId;
- if (accountId == Account.NO_ACCOUNT) {
- accountId = lookupAccountForMessage(messageId);
- }
- if (accountId == Account.NO_ACCOUNT) {
- // probably the message was not found
- if (Logging.LOGD) {
- Email.log("no account found for message " + messageId);
- }
- return;
- }
-
- // Move to Outbox
- long outboxId = findOrCreateMailboxOfType(accountId, Mailbox.TYPE_OUTBOX);
- ContentValues cv = new ContentValues();
- cv.put(EmailContent.MessageColumns.MAILBOX_KEY, outboxId);
-
- // does this need to be SYNCED_CONTENT_URI instead?
- Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, messageId);
- resolver.update(uri, cv, null, null);
-
- // If this is a reply/forward, indicate it as such on the source.
- long sourceKey = message.mSourceKey;
- if (sourceKey != Message.NO_MESSAGE) {
- boolean isReply = (message.mFlags & Message.FLAG_TYPE_REPLY) != 0;
- int flagUpdate = isReply ? Message.FLAG_REPLIED_TO : Message.FLAG_FORWARDED;
- setMessageAnsweredOrForwarded(sourceKey, flagUpdate);
- }
-
- sendPendingMessages(accountId);
- }
-
- private void sendPendingMessagesSmtp(long accountId) {
- // for IMAP & POP only, (attempt to) send the message now
- final Account account =
- Account.restoreAccountWithId(mProviderContext, accountId);
- if (account == null) {
- return;
- }
- final long sentboxId = findOrCreateMailboxOfType(accountId, Mailbox.TYPE_SENT);
- Utility.runAsync(new Runnable() {
- public void run() {
- mLegacyController.sendPendingMessages(account, sentboxId, mLegacyListener);
- }
- });
- }
-
- /**
- * Try to send all pending messages for a given account
- *
- * @param accountId the account for which to send messages
- */
- public void sendPendingMessages(long accountId) {
- // 1. make sure we even have an outbox, exit early if not
- final long outboxId =
- Mailbox.findMailboxOfType(mProviderContext, accountId, Mailbox.TYPE_OUTBOX);
- if (outboxId == Mailbox.NO_MAILBOX) {
- return;
- }
-
- // 2. dispatch as necessary
- IEmailService service = getServiceForAccount(accountId);
- if (service != null) {
- // Service implementation
- try {
- service.startSync(outboxId, false);
- } catch (RemoteException e) {
- // TODO Change exception handling to be consistent with however this method
- // is implemented for other protocols
- Log.d("updateMailbox", "RemoteException" + e);
- }
- } else {
- // MessagingController implementation
- sendPendingMessagesSmtp(accountId);
- }
- }
-
- /**
- * Reset visible limits for all accounts.
- * For each account:
- * look up limit
- * write limit into all mailboxes for that account
- */
- public void resetVisibleLimits() {
- Utility.runAsync(new Runnable() {
- public void run() {
- ContentResolver resolver = mProviderContext.getContentResolver();
- Cursor c = null;
- try {
- c = resolver.query(
- Account.CONTENT_URI,
- Account.ID_PROJECTION,
- null, null, null);
- while (c.moveToNext()) {
- long accountId = c.getLong(Account.ID_PROJECTION_COLUMN);
- String protocol = Account.getProtocol(mProviderContext, accountId);
- if (!HostAuth.SCHEME_EAS.equals(protocol)) {
- ContentValues cv = new ContentValues();
- cv.put(MailboxColumns.VISIBLE_LIMIT, Email.VISIBLE_LIMIT_DEFAULT);
- resolver.update(Mailbox.CONTENT_URI, cv,
- MailboxColumns.ACCOUNT_KEY + "=?",
- new String[] { Long.toString(accountId) });
- }
- }
- } finally {
- if (c != null) {
- c.close();
- }
- }
- }
- });
- }
-
- /**
- * Increase the load count for a given mailbox, and trigger a refresh. Applies only to
- * IMAP and POP mailboxes, with the exception of the EAS search mailbox.
- *
- * @param mailboxId the mailbox
- */
- public void loadMoreMessages(final long mailboxId) {
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- public void run() {
- Mailbox mailbox = Mailbox.restoreMailboxWithId(mProviderContext, mailboxId);
- if (mailbox == null) {
- return;
- }
- if (mailbox.mType == Mailbox.TYPE_SEARCH) {
- try {
- searchMore(mailbox.mAccountKey);
- } catch (MessagingException e) {
- // Nothing to be done
- }
- return;
- }
- Account account = Account.restoreAccountWithId(mProviderContext,
- mailbox.mAccountKey);
- if (account == null) {
- return;
- }
- // Use provider math to increment the field
- ContentValues cv = new ContentValues();;
- cv.put(EmailContent.FIELD_COLUMN_NAME, MailboxColumns.VISIBLE_LIMIT);
- cv.put(EmailContent.ADD_COLUMN_NAME, Email.VISIBLE_LIMIT_INCREMENT);
- Uri uri = ContentUris.withAppendedId(Mailbox.ADD_TO_FIELD_URI, mailboxId);
- mProviderContext.getContentResolver().update(uri, cv, null, null);
- // Trigger a refresh using the new, longer limit
- mailbox.mVisibleLimit += Email.VISIBLE_LIMIT_INCREMENT;
- mLegacyController.synchronizeMailbox(account, mailbox, mLegacyListener);
- }
- });
- }
-
- /**
- * @param messageId the id of message
- * @return the accountId corresponding to the given messageId, or -1 if not found.
- */
- private long lookupAccountForMessage(long messageId) {
- ContentResolver resolver = mProviderContext.getContentResolver();
- Cursor c = resolver.query(EmailContent.Message.CONTENT_URI,
- MESSAGEID_TO_ACCOUNTID_PROJECTION, EmailContent.RECORD_ID + "=?",
- new String[] { Long.toString(messageId) }, null);
- try {
- return c.moveToFirst()
- ? c.getLong(MESSAGEID_TO_ACCOUNTID_COLUMN_ACCOUNTID)
- : -1;
- } finally {
- c.close();
- }
- }
-
- /**
- * Delete a single attachment entry from the DB given its id.
- * Does not delete any eventual associated files.
- */
- public void deleteAttachment(long attachmentId) {
- ContentResolver resolver = mProviderContext.getContentResolver();
- Uri uri = ContentUris.withAppendedId(Attachment.CONTENT_URI, attachmentId);
- resolver.delete(uri, null, null);
- }
-
- /**
- * Async version of {@link #deleteMessageSync}.
- */
- public void deleteMessage(final long messageId) {
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- public void run() {
- deleteMessageSync(messageId);
- }
- });
- }
-
- /**
- * Batch & async version of {@link #deleteMessageSync}.
- */
- public void deleteMessages(final long[] messageIds) {
- if (messageIds == null || messageIds.length == 0) {
- throw new IllegalArgumentException();
- }
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- public void run() {
- for (long messageId: messageIds) {
- deleteMessageSync(messageId);
- }
- }
- });
- }
-
- /**
- * Delete a single message by moving it to the trash, or really delete it if it's already in
- * trash or a draft message.
- *
- * This function has no callback, no result reporting, because the desired outcome
- * is reflected entirely by changes to one or more cursors.
- *
- * @param messageId The id of the message to "delete".
- */
- /* package */ void deleteMessageSync(long messageId) {
- // 1. Get the message's account
- Account account = Account.getAccountForMessageId(mProviderContext, messageId);
-
- if (account == null) return;
-
- // 2. Confirm that there is a trash mailbox available. If not, create one
- long trashMailboxId = findOrCreateMailboxOfType(account.mId, Mailbox.TYPE_TRASH);
-
- // 3. Get the message's original mailbox
- Mailbox mailbox = Mailbox.getMailboxForMessageId(mProviderContext, messageId);
-
- if (mailbox == null) return;
-
- // 4. Drop non-essential data for the message (e.g. attachment files)
- AttachmentUtilities.deleteAllAttachmentFiles(mProviderContext, account.mId,
- messageId);
-
- Uri uri = ContentUris.withAppendedId(EmailContent.Message.SYNCED_CONTENT_URI,
- messageId);
- ContentResolver resolver = mProviderContext.getContentResolver();
-
- // 5. Perform "delete" as appropriate
- if ((mailbox.mId == trashMailboxId) || (mailbox.mType == Mailbox.TYPE_DRAFTS)) {
- // 5a. Really delete it
- resolver.delete(uri, null, null);
- } else {
- // 5b. Move to trash
- ContentValues cv = new ContentValues();
- cv.put(EmailContent.MessageColumns.MAILBOX_KEY, trashMailboxId);
- resolver.update(uri, cv, null, null);
- }
-
- if (isMessagingController(account)) {
- mLegacyController.processPendingActions(account.mId);
- }
- }
-
- /**
- * Moves messages to a new mailbox.
- *
- * This function has no callback, no result reporting, because the desired outcome
- * is reflected entirely by changes to one or more cursors.
- *
- * Note this method assumes all of the given message and mailbox IDs belong to the same
- * account.
- *
- * @param messageIds IDs of the messages that are to be moved
- * @param newMailboxId ID of the new mailbox that the messages will be moved to
- * @return an asynchronous task that executes the move (for testing only)
- */
- public EmailAsyncTask<Void, Void, Void> moveMessages(final long[] messageIds,
- final long newMailboxId) {
- if (messageIds == null || messageIds.length == 0) {
- throw new IllegalArgumentException();
- }
- return EmailAsyncTask.runAsyncParallel(new Runnable() {
- public void run() {
- Account account = Account.getAccountForMessageId(mProviderContext, messageIds[0]);
- if (account != null) {
- ContentValues cv = new ContentValues();
- cv.put(EmailContent.MessageColumns.MAILBOX_KEY, newMailboxId);
- ContentResolver resolver = mProviderContext.getContentResolver();
- for (long messageId : messageIds) {
- Uri uri = ContentUris.withAppendedId(
- EmailContent.Message.SYNCED_CONTENT_URI, messageId);
- resolver.update(uri, cv, null, null);
- }
- if (isMessagingController(account)) {
- mLegacyController.processPendingActions(account.mId);
- }
- }
- }
- });
- }
-
- /**
- * Set/clear the unread status of a message
- *
- * @param messageId the message to update
- * @param isRead the new value for the isRead flag
- */
- public void setMessageReadSync(long messageId, boolean isRead) {
- setMessageBooleanSync(messageId, EmailContent.MessageColumns.FLAG_READ, isRead);
- }
-
- /**
- * Set/clear the unread status of a message from UI thread
- *
- * @param messageId the message to update
- * @param isRead the new value for the isRead flag
- * @return the EmailAsyncTask created
- */
- public EmailAsyncTask<Void, Void, Void> setMessageRead(final long messageId,
- final boolean isRead) {
- return EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- setMessageBooleanSync(messageId, EmailContent.MessageColumns.FLAG_READ, isRead);
- }});
- }
-
- /**
- * Update a message record and ping MessagingController, if necessary
- *
- * @param messageId the message to update
- * @param cv the ContentValues used in the update
- */
- private void updateMessageSync(long messageId, ContentValues cv) {
- Uri uri = ContentUris.withAppendedId(EmailContent.Message.SYNCED_CONTENT_URI, messageId);
- mProviderContext.getContentResolver().update(uri, cv, null, null);
-
- // Service runs automatically, MessagingController needs a kick
- long accountId = Account.getAccountIdForMessageId(mProviderContext, messageId);
- if (accountId == Account.NO_ACCOUNT) return;
- if (isMessagingController(accountId)) {
- mLegacyController.processPendingActions(accountId);
- }
- }
-
- /**
- * Set the answered status of a message
- *
- * @param messageId the message to update
- * @return the AsyncTask that will execute the changes (for testing only)
- */
- public void setMessageAnsweredOrForwarded(final long messageId,
- final int flag) {
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- public void run() {
- Message msg = Message.restoreMessageWithId(mProviderContext, messageId);
- if (msg == null) {
- Log.w(Logging.LOG_TAG, "Unable to find source message for a reply/forward");
- return;
- }
- ContentValues cv = new ContentValues();
- cv.put(MessageColumns.FLAGS, msg.mFlags | flag);
- updateMessageSync(messageId, cv);
- }
- });
- }
-
- /**
- * Set/clear the favorite status of a message from UI thread
- *
- * @param messageId the message to update
- * @param isFavorite the new value for the isFavorite flag
- * @return the EmailAsyncTask created
- */
- public EmailAsyncTask<Void, Void, Void> setMessageFavorite(final long messageId,
- final boolean isFavorite) {
- return EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- setMessageBooleanSync(messageId, EmailContent.MessageColumns.FLAG_FAVORITE,
- isFavorite);
- }});
- }
- /**
- * Set/clear the favorite status of a message
- *
- * @param messageId the message to update
- * @param isFavorite the new value for the isFavorite flag
- */
- public void setMessageFavoriteSync(long messageId, boolean isFavorite) {
- setMessageBooleanSync(messageId, EmailContent.MessageColumns.FLAG_FAVORITE, isFavorite);
- }
-
- /**
- * Set/clear boolean columns of a message
- *
- * @param messageId the message to update
- * @param columnName the column to update
- * @param columnValue the new value for the column
- */
- private void setMessageBooleanSync(long messageId, String columnName, boolean columnValue) {
- ContentValues cv = new ContentValues();
- cv.put(columnName, columnValue);
- updateMessageSync(messageId, cv);
- }
-
-
- private static final HashMap<Long, SearchParams> sSearchParamsMap =
- new HashMap<Long, SearchParams>();
-
- public void searchMore(long accountId) throws MessagingException {
- SearchParams params = sSearchParamsMap.get(accountId);
- if (params == null) return;
- params.mOffset += params.mLimit;
- searchMessages(accountId, params);
- }
-
- /**
- * Search for messages on the (IMAP) server; do not call this on the UI thread!
- * @param accountId the id of the account to be searched
- * @param searchParams the parameters for this search
- * @throws MessagingException
- */
- public int searchMessages(final long accountId, final SearchParams searchParams)
- throws MessagingException {
- // Find/create our search mailbox
- Mailbox searchMailbox = getSearchMailbox(accountId);
- if (searchMailbox == null) return 0;
- final long searchMailboxId = searchMailbox.mId;
- // Save this away (per account)
- sSearchParamsMap.put(accountId, searchParams);
-
- if (searchParams.mOffset == 0) {
- // Delete existing contents of search mailbox
- ContentResolver resolver = mContext.getContentResolver();
- resolver.delete(Message.CONTENT_URI, Message.MAILBOX_KEY + "=" + searchMailboxId,
- null);
- ContentValues cv = new ContentValues();
- // For now, use the actual query as the name of the mailbox
- cv.put(Mailbox.DISPLAY_NAME, searchParams.mFilter);
- resolver.update(ContentUris.withAppendedId(Mailbox.CONTENT_URI, searchMailboxId),
- cv, null, null);
- }
-
- IEmailService service = getServiceForAccount(accountId);
- if (service != null) {
- // Service implementation
- try {
- return service.searchMessages(accountId, searchParams, searchMailboxId);
- } catch (RemoteException e) {
- // TODO Change exception handling to be consistent with however this method
- // is implemented for other protocols
- Log.e("searchMessages", "RemoteException", e);
- return 0;
- }
- } else {
- // This is the actual mailbox we'll be searching
- Mailbox actualMailbox = Mailbox.restoreMailboxWithId(mContext, searchParams.mMailboxId);
- if (actualMailbox == null) {
- Log.e(Logging.LOG_TAG, "Unable to find mailbox " + searchParams.mMailboxId
- + " to search in with " + searchParams);
- return 0;
- }
- // Do the search
- if (Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "Search: " + searchParams.mFilter);
- }
- return mLegacyController.searchMailbox(accountId, searchParams, searchMailboxId);
- }
- }
-
- /**
- * Respond to a meeting invitation.
- *
- * @param messageId the id of the invitation being responded to
- * @param response the code representing the response to the invitation
- */
- public void sendMeetingResponse(final long messageId, final int response) {
- // Split here for target type (Service or MessagingController)
- IEmailService service = getServiceForMessage(messageId);
- if (service != null) {
- // Service implementation
- try {
- service.sendMeetingResponse(messageId, response);
- } catch (RemoteException e) {
- // TODO Change exception handling to be consistent with however this method
- // is implemented for other protocols
- Log.e("onDownloadAttachment", "RemoteException", e);
- }
- }
- }
-
- /**
- * Request that an attachment be loaded. It will be stored at a location controlled
- * by the AttachmentProvider.
- *
- * @param attachmentId the attachment to load
- * @param messageId the owner message
- * @param accountId the owner account
- */
- public void loadAttachment(final long attachmentId, final long messageId,
- final long accountId) {
- Attachment attachInfo = Attachment.restoreAttachmentWithId(mProviderContext, attachmentId);
- if (attachInfo == null) {
- return;
- }
-
- if (Utility.attachmentExists(mProviderContext, attachInfo)) {
- // The attachment has already been downloaded, so we will just "pretend" to download it
- // This presumably is for POP3 messages
- synchronized (mListeners) {
- for (Result listener : mListeners) {
- listener.loadAttachmentCallback(null, accountId, messageId, attachmentId, 0);
- }
- for (Result listener : mListeners) {
- listener.loadAttachmentCallback(null, accountId, messageId, attachmentId, 100);
- }
- }
- return;
- }
-
- // Flag the attachment as needing download at the user's request
- ContentValues cv = new ContentValues();
- cv.put(Attachment.FLAGS, attachInfo.mFlags | Attachment.FLAG_DOWNLOAD_USER_REQUEST);
- attachInfo.update(mProviderContext, cv);
- }
-
- /**
- * For a given message id, return a service proxy if applicable, or null.
- *
- * @param messageId the message of interest
- * @result service proxy, or null if n/a
- */
- private IEmailService getServiceForMessage(long messageId) {
- // TODO make this more efficient, caching the account, smaller lookup here, etc.
- Message message = Message.restoreMessageWithId(mProviderContext, messageId);
- if (message == null) {
- return null;
- }
- return getServiceForAccount(message.mAccountKey);
- }
-
- /**
- * For a given account id, return a service proxy if applicable, or null.
- *
- * @param accountId the message of interest
- * @result service proxy, or null if n/a
- */
- private IEmailService getServiceForAccount(long accountId) {
- if (isMessagingController(accountId)) return null;
- return getExchangeEmailService();
- }
-
- private IEmailService getExchangeEmailService() {
- return EmailServiceUtils.getExchangeService(mContext, mServiceCallback);
- }
-
- /**
- * Simple helper to determine if legacy MessagingController should be used
- */
- public boolean isMessagingController(Account account) {
- if (account == null) return false;
- return isMessagingController(account.mId);
- }
-
- public boolean isMessagingController(long accountId) {
- Boolean isLegacyController = mLegacyControllerMap.get(accountId);
- if (isLegacyController == null) {
- String protocol = Account.getProtocol(mProviderContext, accountId);
- isLegacyController = ("pop3".equals(protocol) || "imap".equals(protocol));
- mLegacyControllerMap.put(accountId, isLegacyController);
- }
- return isLegacyController;
- }
-
- /**
- * Delete an account.
- */
- public void deleteAccount(final long accountId) {
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- deleteAccountSync(accountId, mProviderContext);
- }
- });
- }
-
- /**
- * Delete an account synchronously.
- */
- public void deleteAccountSync(long accountId, Context context) {
- try {
- mLegacyControllerMap.remove(accountId);
- // Get the account URI.
- final Account account = Account.restoreAccountWithId(context, accountId);
- if (account == null) {
- return; // Already deleted?
- }
-
- // Delete account data, attachments, PIM data, etc.
- deleteSyncedDataSync(accountId);
-
- // Now delete the account itself
- Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, accountId);
- context.getContentResolver().delete(uri, null, null);
-
- // For unit tests, don't run backup, security, and ui pieces.
- if (mInUnitTests) {
- return;
- }
-
- // Clean up
- AccountBackupRestore.backup(context);
- SecurityPolicy.getInstance(context).reducePolicies();
- Email.setServicesEnabledSync(context);
- Email.setNotifyUiAccountsChanged(true);
- MailService.actionReschedule(context);
- } catch (Exception e) {
- Log.w(Logging.LOG_TAG, "Exception while deleting account", e);
- }
- }
-
- /**
- * Delete all synced data, but don't delete the actual account. This is used when security
- * policy requirements are not met, and we don't want to reveal any synced data, but we do
- * wish to keep the account configured (e.g. to accept remote wipe commands).
- *
- * The only mailbox not deleted is the account mailbox (if any)
- * Also, clear the sync keys on the remaining account, since the data is gone.
- *
- * SYNCHRONOUS - do not call from UI thread.
- *
- * @param accountId The account to wipe.
- */
- public void deleteSyncedDataSync(long accountId) {
- try {
- // Delete synced attachments
- AttachmentUtilities.deleteAllAccountAttachmentFiles(mProviderContext,
- accountId);
-
- // Delete synced email, leaving only an empty inbox. We do this in two phases:
- // 1. Delete all non-inbox mailboxes (which will delete all of their messages)
- // 2. Delete all remaining messages (which will be the inbox messages)
- ContentResolver resolver = mProviderContext.getContentResolver();
- String[] accountIdArgs = new String[] { Long.toString(accountId) };
- resolver.delete(Mailbox.CONTENT_URI,
- MAILBOXES_FOR_ACCOUNT_EXCEPT_ACCOUNT_MAILBOX_SELECTION,
- accountIdArgs);
- resolver.delete(Message.CONTENT_URI, MESSAGES_FOR_ACCOUNT_SELECTION, accountIdArgs);
-
- // Delete sync keys on remaining items
- ContentValues cv = new ContentValues();
- cv.putNull(Account.SYNC_KEY);
- resolver.update(Account.CONTENT_URI, cv, Account.ID_SELECTION, accountIdArgs);
- cv.clear();
- cv.putNull(Mailbox.SYNC_KEY);
- resolver.update(Mailbox.CONTENT_URI, cv,
- MAILBOXES_FOR_ACCOUNT_SELECTION, accountIdArgs);
-
- // Delete PIM data (contacts, calendar), stop syncs, etc. if applicable
- IEmailService service = getServiceForAccount(accountId);
- if (service != null) {
- service.deleteAccountPIMData(accountId);
- }
- } catch (Exception e) {
- Log.w(Logging.LOG_TAG, "Exception while deleting account synced data", e);
- }
- }
-
- /**
- * Simple callback for synchronous commands. For many commands, this can be largely ignored
- * and the result is observed via provider cursors. The callback will *not* necessarily be
- * made from the UI thread, so you may need further handlers to safely make UI updates.
- */
- public static abstract class Result {
- private volatile boolean mRegistered;
-
- protected void setRegistered(boolean registered) {
- mRegistered = registered;
- }
-
- protected final boolean isRegistered() {
- return mRegistered;
- }
-
- /**
- * Callback for updateMailboxList
- *
- * @param result If null, the operation completed without error
- * @param accountId The account being operated on
- * @param progress 0 for "starting", 1..99 for updates (if needed in UI), 100 for complete
- */
- public void updateMailboxListCallback(MessagingException result, long accountId,
- int progress) {
- }
-
- /**
- * Callback for updateMailbox. Note: This looks a lot like checkMailCallback, but
- * it's a separate call used only by UI's, so we can keep things separate.
- *
- * @param result If null, the operation completed without error
- * @param accountId The account being operated on
- * @param mailboxId The mailbox being operated on
- * @param progress 0 for "starting", 1..99 for updates (if needed in UI), 100 for complete
- * @param numNewMessages the number of new messages delivered
- */
- public void updateMailboxCallback(MessagingException result, long accountId,
- long mailboxId, int progress, int numNewMessages, ArrayList<Long> addedMessages) {
- }
-
- /**
- * Callback for loadMessageForView
- *
- * @param result if null, the attachment completed - if non-null, terminating with failure
- * @param messageId the message which contains the attachment
- * @param progress 0 for "starting", 1..99 for updates (if needed in UI), 100 for complete
- */
- public void loadMessageForViewCallback(MessagingException result, long accountId,
- long messageId, int progress) {
- }
-
- /**
- * Callback for loadAttachment
- *
- * @param result if null, the attachment completed - if non-null, terminating with failure
- * @param messageId the message which contains the attachment
- * @param attachmentId the attachment being loaded
- * @param progress 0 for "starting", 1..99 for updates (if needed in UI), 100 for complete
- */
- public void loadAttachmentCallback(MessagingException result, long accountId,
- long messageId, long attachmentId, int progress) {
- }
-
- /**
- * Callback for checkmail. Note: This looks a lot like updateMailboxCallback, but
- * it's a separate call used only by the automatic checker service, so we can keep
- * things separate.
- *
- * @param result If null, the operation completed without error
- * @param accountId The account being operated on
- * @param mailboxId The mailbox being operated on (may be unknown at start)
- * @param progress 0 for "starting", no updates, 100 for complete
- * @param tag the same tag that was passed to serviceCheckMail()
- */
- public void serviceCheckMailCallback(MessagingException result, long accountId,
- long mailboxId, int progress, long tag) {
- }
-
- /**
- * Callback for sending pending messages. This will be called once to start the
- * group, multiple times for messages, and once to complete the group.
- *
- * Unfortunately this callback works differently on SMTP and EAS.
- *
- * On SMTP:
- *
- * First, we get this.
- * result == null, messageId == -1, progress == 0: start batch send
- *
- * Then we get these callbacks per message.
- * (Exchange backend may skip "start sending one message".)
- * result == null, messageId == xx, progress == 0: start sending one message
- * result == xxxx, messageId == xx, progress == 0; failed sending one message
- *
- * Finally we get this.
- * result == null, messageId == -1, progres == 100; finish sending batch
- *
- * On EAS: Almost same as above, except:
- *
- * - There's no first ("start batch send") callback.
- * - accountId is always -1.
- *
- * @param result If null, the operation completed without error
- * @param accountId The account being operated on
- * @param messageId The being sent (may be unknown at start)
- * @param progress 0 for "starting", 100 for complete
- */
- public void sendMailCallback(MessagingException result, long accountId,
- long messageId, int progress) {
- }
- }
-
- /**
- * Bridge to intercept {@link MessageRetrievalListener#loadAttachmentProgress} and
- * pass down to {@link Result}.
- */
- public class MessageRetrievalListenerBridge implements MessageRetrievalListener {
- private final long mMessageId;
- private final long mAttachmentId;
- private final long mAccountId;
-
- public MessageRetrievalListenerBridge(long messageId, long attachmentId) {
- mMessageId = messageId;
- mAttachmentId = attachmentId;
- mAccountId = Account.getAccountIdForMessageId(mProviderContext, mMessageId);
- }
-
- @Override
- public void loadAttachmentProgress(int progress) {
- synchronized (mListeners) {
- for (Result listener : mListeners) {
- listener.loadAttachmentCallback(null, mAccountId, mMessageId, mAttachmentId,
- progress);
- }
- }
- }
-
- @Override
- public void messageRetrieved(com.android.emailcommon.mail.Message message) {
- }
- }
-
- /**
- * Support for receiving callbacks from MessagingController and dealing with UI going
- * out of scope.
- */
- public class LegacyListener extends MessagingListener {
- public LegacyListener() {
- }
-
- @Override
- public void listFoldersStarted(long accountId) {
- synchronized (mListeners) {
- for (Result l : mListeners) {
- l.updateMailboxListCallback(null, accountId, 0);
- }
- }
- }
-
- @Override
- public void listFoldersFailed(long accountId, String message) {
- synchronized (mListeners) {
- for (Result l : mListeners) {
- l.updateMailboxListCallback(new MessagingException(message), accountId, 0);
- }
- }
- }
-
- @Override
- public void listFoldersFinished(long accountId) {
- synchronized (mListeners) {
- for (Result l : mListeners) {
- l.updateMailboxListCallback(null, accountId, 100);
- }
- }
- }
-
- @Override
- public void synchronizeMailboxStarted(long accountId, long mailboxId) {
- synchronized (mListeners) {
- for (Result l : mListeners) {
- l.updateMailboxCallback(null, accountId, mailboxId, 0, 0, null);
- }
- }
- }
-
- @Override
- public void synchronizeMailboxFinished(long accountId, long mailboxId,
- int totalMessagesInMailbox, int numNewMessages, ArrayList<Long> addedMessages) {
- synchronized (mListeners) {
- for (Result l : mListeners) {
- l.updateMailboxCallback(null, accountId, mailboxId, 100, numNewMessages,
- addedMessages);
- }
- }
- }
-
- @Override
- public void synchronizeMailboxFailed(long accountId, long mailboxId, Exception e) {
- MessagingException me;
- if (e instanceof MessagingException) {
- me = (MessagingException) e;
- } else {
- me = new MessagingException(e.toString());
- }
- synchronized (mListeners) {
- for (Result l : mListeners) {
- l.updateMailboxCallback(me, accountId, mailboxId, 0, 0, null);
- }
- }
- }
-
- @Override
- public void checkMailStarted(Context context, long accountId, long tag) {
- synchronized (mListeners) {
- for (Result l : mListeners) {
- l.serviceCheckMailCallback(null, accountId, -1, 0, tag);
- }
- }
- }
-
- @Override
- public void checkMailFinished(Context context, long accountId, long folderId, long tag) {
- synchronized (mListeners) {
- for (Result l : mListeners) {
- l.serviceCheckMailCallback(null, accountId, folderId, 100, tag);
- }
- }
- }
-
- @Override
- public void loadMessageForViewStarted(long messageId) {
- final long accountId = Account.getAccountIdForMessageId(mProviderContext, messageId);
- synchronized (mListeners) {
- for (Result listener : mListeners) {
- listener.loadMessageForViewCallback(null, accountId, messageId, 0);
- }
- }
- }
-
- @Override
- public void loadMessageForViewFinished(long messageId) {
- final long accountId = Account.getAccountIdForMessageId(mProviderContext, messageId);
- synchronized (mListeners) {
- for (Result listener : mListeners) {
- listener.loadMessageForViewCallback(null, accountId, messageId, 100);
- }
- }
- }
-
- @Override
- public void loadMessageForViewFailed(long messageId, String message) {
- final long accountId = Account.getAccountIdForMessageId(mProviderContext, messageId);
- synchronized (mListeners) {
- for (Result listener : mListeners) {
- listener.loadMessageForViewCallback(new MessagingException(message),
- accountId, messageId, 0);
- }
- }
- }
-
- @Override
- public void loadAttachmentStarted(long accountId, long messageId, long attachmentId,
- boolean requiresDownload) {
- try {
- mCallbackProxy.loadAttachmentStatus(messageId, attachmentId,
- EmailServiceStatus.IN_PROGRESS, 0);
- } catch (RemoteException e) {
- }
- synchronized (mListeners) {
- for (Result listener : mListeners) {
- listener.loadAttachmentCallback(null, accountId, messageId, attachmentId, 0);
- }
- }
- }
-
- @Override
- public void loadAttachmentFinished(long accountId, long messageId, long attachmentId) {
- try {
- mCallbackProxy.loadAttachmentStatus(messageId, attachmentId,
- EmailServiceStatus.SUCCESS, 100);
- } catch (RemoteException e) {
- }
- synchronized (mListeners) {
- for (Result listener : mListeners) {
- listener.loadAttachmentCallback(null, accountId, messageId, attachmentId, 100);
- }
- }
- }
-
- @Override
- public void loadAttachmentFailed(long accountId, long messageId, long attachmentId,
- MessagingException me, boolean background) {
- try {
- // If the cause of the MessagingException is an IOException, we send a status of
- // CONNECTION_ERROR; in this case, AttachmentDownloadService will try again to
- // download the attachment. Otherwise, the error is considered non-recoverable.
- int status = EmailServiceStatus.ATTACHMENT_NOT_FOUND;
- if (me != null && me.getCause() instanceof IOException) {
- status = EmailServiceStatus.CONNECTION_ERROR;
- }
- mCallbackProxy.loadAttachmentStatus(messageId, attachmentId, status, 0);
- } catch (RemoteException e) {
- }
- synchronized (mListeners) {
- for (Result listener : mListeners) {
- // TODO We are overloading the exception here. The UI listens for this
- // callback and displays a toast if the exception is not null. Since we
- // want to avoid displaying toast for background operations, we force
- // the exception to be null. This needs to be re-worked so the UI will
- // only receive (or at least pays attention to) responses for requests
- // it explicitly cares about. Then we would not need to overload the
- // exception parameter.
- listener.loadAttachmentCallback(background ? null : me, accountId, messageId,
- attachmentId, 0);
- }
- }
- }
-
- @Override
- synchronized public void sendPendingMessagesStarted(long accountId, long messageId) {
- synchronized (mListeners) {
- for (Result listener : mListeners) {
- listener.sendMailCallback(null, accountId, messageId, 0);
- }
- }
- }
-
- @Override
- synchronized public void sendPendingMessagesCompleted(long accountId) {
- synchronized (mListeners) {
- for (Result listener : mListeners) {
- listener.sendMailCallback(null, accountId, -1, 100);
- }
- }
- }
-
- @Override
- synchronized public void sendPendingMessagesFailed(long accountId, long messageId,
- Exception reason) {
- MessagingException me;
- if (reason instanceof MessagingException) {
- me = (MessagingException) reason;
- } else {
- me = new MessagingException(reason.toString());
- }
- synchronized (mListeners) {
- for (Result listener : mListeners) {
- listener.sendMailCallback(me, accountId, messageId, 0);
- }
- }
- }
- }
-
- /**
- * Service callback for service operations
- */
- private class ServiceCallback extends IEmailServiceCallback.Stub {
-
- private final static boolean DEBUG_FAIL_DOWNLOADS = false; // do not check in "true"
-
- public void loadAttachmentStatus(long messageId, long attachmentId, int statusCode,
- int progress) {
- MessagingException result = mapStatusToException(statusCode);
- switch (statusCode) {
- case EmailServiceStatus.SUCCESS:
- progress = 100;
- break;
- case EmailServiceStatus.IN_PROGRESS:
- if (DEBUG_FAIL_DOWNLOADS && progress > 75) {
- result = new MessagingException(
- String.valueOf(EmailServiceStatus.CONNECTION_ERROR));
- }
- // discard progress reports that look like sentinels
- if (progress < 0 || progress >= 100) {
- return;
- }
- break;
- }
- final long accountId = Account.getAccountIdForMessageId(mProviderContext, messageId);
- synchronized (mListeners) {
- for (Result listener : mListeners) {
- listener.loadAttachmentCallback(result, accountId, messageId, attachmentId,
- progress);
- }
- }
- }
-
- /**
- * Note, this is an incomplete implementation of this callback, because we are
- * not getting things back from Service in quite the same way as from MessagingController.
- * However, this is sufficient for basic "progress=100" notification that message send
- * has just completed.
- */
- public void sendMessageStatus(long messageId, String subject, int statusCode,
- int progress) {
- long accountId = -1; // This should be in the callback
- MessagingException result = mapStatusToException(statusCode);
- switch (statusCode) {
- case EmailServiceStatus.SUCCESS:
- progress = 100;
- break;
- case EmailServiceStatus.IN_PROGRESS:
- // discard progress reports that look like sentinels
- if (progress < 0 || progress >= 100) {
- return;
- }
- break;
- }
- synchronized(mListeners) {
- for (Result listener : mListeners) {
- listener.sendMailCallback(result, accountId, messageId, progress);
- }
- }
- }
-
- public void syncMailboxListStatus(long accountId, int statusCode, int progress) {
- MessagingException result = mapStatusToException(statusCode);
- switch (statusCode) {
- case EmailServiceStatus.SUCCESS:
- progress = 100;
- break;
- case EmailServiceStatus.IN_PROGRESS:
- // discard progress reports that look like sentinels
- if (progress < 0 || progress >= 100) {
- return;
- }
- break;
- }
- synchronized(mListeners) {
- for (Result listener : mListeners) {
- listener.updateMailboxListCallback(result, accountId, progress);
- }
- }
- }
-
- public void syncMailboxStatus(long mailboxId, int statusCode, int progress) {
- MessagingException result = mapStatusToException(statusCode);
- switch (statusCode) {
- case EmailServiceStatus.SUCCESS:
- progress = 100;
- break;
- case EmailServiceStatus.IN_PROGRESS:
- // discard progress reports that look like sentinels
- if (progress < 0 || progress >= 100) {
- return;
- }
- break;
- }
- // TODO should pass this back instead of looking it up here
- Mailbox mbx = Mailbox.restoreMailboxWithId(mProviderContext, mailboxId);
- // The mailbox could have disappeared if the server commanded it
- if (mbx == null) return;
- long accountId = mbx.mAccountKey;
- synchronized(mListeners) {
- for (Result listener : mListeners) {
- listener.updateMailboxCallback(result, accountId, mailboxId, progress, 0, null);
- }
- }
- }
-
- private MessagingException mapStatusToException(int statusCode) {
- switch (statusCode) {
- case EmailServiceStatus.SUCCESS:
- case EmailServiceStatus.IN_PROGRESS:
- // Don't generate error if the account is uninitialized
- case EmailServiceStatus.ACCOUNT_UNINITIALIZED:
- return null;
-
- case EmailServiceStatus.LOGIN_FAILED:
- return new AuthenticationFailedException("");
-
- case EmailServiceStatus.CONNECTION_ERROR:
- return new MessagingException(MessagingException.IOERROR);
-
- case EmailServiceStatus.SECURITY_FAILURE:
- return new MessagingException(MessagingException.SECURITY_POLICIES_REQUIRED);
-
- case EmailServiceStatus.ACCESS_DENIED:
- return new MessagingException(MessagingException.ACCESS_DENIED);
-
- case EmailServiceStatus.ATTACHMENT_NOT_FOUND:
- return new MessagingException(MessagingException.ATTACHMENT_NOT_FOUND);
-
- case EmailServiceStatus.CLIENT_CERTIFICATE_ERROR:
- return new MessagingException(MessagingException.CLIENT_CERTIFICATE_ERROR);
-
- case EmailServiceStatus.MESSAGE_NOT_FOUND:
- case EmailServiceStatus.FOLDER_NOT_DELETED:
- case EmailServiceStatus.FOLDER_NOT_RENAMED:
- case EmailServiceStatus.FOLDER_NOT_CREATED:
- case EmailServiceStatus.REMOTE_EXCEPTION:
- // TODO: define exception code(s) & UI string(s) for server-side errors
- default:
- return new MessagingException(String.valueOf(statusCode));
- }
- }
- }
-
- private interface ServiceCallbackWrapper {
- public void call(IEmailServiceCallback cb) throws RemoteException;
- }
-
- /**
- * Proxy that can be used to broadcast service callbacks; we currently use this only for
- * loadAttachment callbacks
- */
- private final IEmailServiceCallback.Stub mCallbackProxy =
- new IEmailServiceCallback.Stub() {
-
- /**
- * Broadcast a callback to the everyone that's registered
- *
- * @param wrapper the ServiceCallbackWrapper used in the broadcast
- */
- private synchronized void broadcastCallback(ServiceCallbackWrapper wrapper) {
- if (sCallbackList != null) {
- // Call everyone on our callback list
- // Exceptions can be safely ignored
- int count = sCallbackList.beginBroadcast();
- for (int i = 0; i < count; i++) {
- try {
- wrapper.call(sCallbackList.getBroadcastItem(i));
- } catch (RemoteException e) {
- }
- }
- sCallbackList.finishBroadcast();
- }
- }
-
- public void loadAttachmentStatus(final long messageId, final long attachmentId,
- final int status, final int progress) {
- broadcastCallback(new ServiceCallbackWrapper() {
- @Override
- public void call(IEmailServiceCallback cb) throws RemoteException {
- cb.loadAttachmentStatus(messageId, attachmentId, status, progress);
- }
- });
- }
-
- @Override
- public void sendMessageStatus(long messageId, String subject, int statusCode, int progress){
- }
-
- @Override
- public void syncMailboxListStatus(long accountId, int statusCode, int progress) {
- }
-
- @Override
- public void syncMailboxStatus(long mailboxId, int statusCode, int progress) {
- }
- };
-
- public static class ControllerService extends Service {
- /**
- * Create our EmailService implementation here. For now, only loadAttachment is supported;
- * the intention, however, is to move more functionality to the service interface
- */
- private final IEmailService.Stub mBinder = new IEmailService.Stub() {
-
- public Bundle validate(HostAuth hostAuth) {
- return null;
- }
-
- public Bundle autoDiscover(String userName, String password) {
- return null;
- }
-
- public void startSync(long mailboxId, boolean userRequest) {
- }
-
- public void stopSync(long mailboxId) {
- }
-
- public void loadAttachment(long attachmentId, boolean background)
- throws RemoteException {
- Attachment att = Attachment.restoreAttachmentWithId(ControllerService.this,
- attachmentId);
- if (att != null) {
- if (Email.DEBUG) {
- Log.d(TAG, "loadAttachment " + attachmentId + ": " + att.mFileName);
- }
- Message msg = Message.restoreMessageWithId(ControllerService.this,
- att.mMessageKey);
- if (msg != null) {
- // If the message is a forward and the attachment needs downloading, we need
- // to retrieve the message from the source, rather than from the message
- // itself
- if ((msg.mFlags & Message.FLAG_TYPE_FORWARD) != 0) {
- String[] cols = Utility.getRowColumns(ControllerService.this,
- Body.CONTENT_URI, BODY_SOURCE_KEY_PROJECTION, WHERE_MESSAGE_KEY,
- new String[] {Long.toString(msg.mId)});
- if (cols != null) {
- msg = Message.restoreMessageWithId(ControllerService.this,
- Long.parseLong(cols[BODY_SOURCE_KEY_COLUMN]));
- if (msg == null) {
- // TODO: We can try restoring from the deleted table here...
- return;
- }
- }
- }
- MessagingController legacyController = sInstance.mLegacyController;
- LegacyListener legacyListener = sInstance.mLegacyListener;
- legacyController.loadAttachment(msg.mAccountKey, msg.mId, msg.mMailboxKey,
- attachmentId, legacyListener, background);
- } else {
- // Send back the specific error status for this case
- sInstance.mCallbackProxy.loadAttachmentStatus(att.mMessageKey, attachmentId,
- EmailServiceStatus.MESSAGE_NOT_FOUND, 0);
- }
- }
- }
-
- public void updateFolderList(long accountId) {
- }
-
- public void hostChanged(long accountId) {
- }
-
- public void setLogging(int flags) {
- }
-
- public void sendMeetingResponse(long messageId, int response) {
- }
-
- public void loadMore(long messageId) {
- }
-
- // The following three methods are not implemented in this version
- public boolean createFolder(long accountId, String name) {
- return false;
- }
-
- public boolean deleteFolder(long accountId, String name) {
- return false;
- }
-
- public boolean renameFolder(long accountId, String oldName, String newName) {
- return false;
- }
-
- public void setCallback(IEmailServiceCallback cb) {
- sCallbackList.register(cb);
- }
-
- public void deleteAccountPIMData(long accountId) {
- }
-
- public int searchMessages(long accountId, SearchParams searchParams,
- long destMailboxId) {
- return 0;
- }
-
- @Override
- public int getApiLevel() {
- return Api.LEVEL;
- }
- };
-
- @Override
- public IBinder onBind(Intent intent) {
- return mBinder;
- }
- }
-}
diff --git a/src/com/android/email/ControllerResultUiThreadWrapper.java b/src/com/android/email/ControllerResultUiThreadWrapper.java
deleted file mode 100644
index f87c0525d..000000000
--- a/src/com/android/email/ControllerResultUiThreadWrapper.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import android.os.Handler;
-
-import com.android.email.Controller.Result;
-import com.android.emailcommon.mail.MessagingException;
-
-import java.util.ArrayList;
-
-/**
- * A {@link Result} that wraps another {@link Result} and makes sure methods gets called back
- * on the UI thread.
- *
- * <p>Optionally it supports the "synchronous" mode, if you pass null for the {@code handler}
- * parameter, which allows unit tests to run synchronously.
- */
-public class ControllerResultUiThreadWrapper<T extends Result> extends Result {
- private final Handler mHandler;
- private final T mWrappee;
-
- public ControllerResultUiThreadWrapper(Handler handler, T wrappee) {
- mHandler = handler;
- mWrappee = wrappee;
- }
-
- public T getWrappee() {
- return mWrappee;
- }
-
- @Override
- protected void setRegistered(boolean registered) {
- super.setRegistered(registered);
- mWrappee.setRegistered(registered);
- }
-
- private void run(Runnable runnable) {
- if (mHandler == null) {
- runnable.run();
- } else {
- mHandler.post(runnable);
- }
- }
-
- @Override
- public void loadAttachmentCallback(final MessagingException result, final long accountId,
- final long messageId, final long attachmentId, final int progress) {
- run(new Runnable() {
- public void run() {
- /* It's possible this callback is unregistered after this Runnable was posted and
- * sitting in the handler queue, so we always need to check if it's still registered
- * on the UI thread.
- */
- if (!isRegistered()) return;
- mWrappee.loadAttachmentCallback(result, accountId, messageId, attachmentId,
- progress);
- }
- });
- }
-
- @Override
- public void loadMessageForViewCallback(final MessagingException result, final long accountId,
- final long messageId, final int progress) {
- run(new Runnable() {
- public void run() {
- if (!isRegistered()) return;
- mWrappee.loadMessageForViewCallback(result, accountId, messageId, progress);
- }
- });
- }
-
- @Override
- public void sendMailCallback(final MessagingException result, final long accountId,
- final long messageId, final int progress) {
- run(new Runnable() {
- public void run() {
- if (!isRegistered()) return;
- mWrappee.sendMailCallback(result, accountId, messageId, progress);
- }
- });
- }
-
- @Override
- public void serviceCheckMailCallback(final MessagingException result, final long accountId,
- final long mailboxId, final int progress, final long tag) {
- run(new Runnable() {
- public void run() {
- if (!isRegistered()) return;
- mWrappee.serviceCheckMailCallback(result, accountId, mailboxId, progress, tag);
- }
- });
- }
-
- @Override
- public void updateMailboxCallback(final MessagingException result, final long accountId,
- final long mailboxId, final int progress, final int numNewMessages,
- final ArrayList<Long> addedMessages) {
- run(new Runnable() {
- public void run() {
- if (!isRegistered()) return;
- mWrappee.updateMailboxCallback(result, accountId, mailboxId, progress,
- numNewMessages, addedMessages);
- }
- });
- }
-
- @Override
- public void updateMailboxListCallback(final MessagingException result, final long accountId,
- final int progress) {
- run(new Runnable() {
- public void run() {
- if (!isRegistered()) return;
- mWrappee.updateMailboxListCallback(result, accountId, progress);
- }
- });
- }
-}
- \ No newline at end of file
diff --git a/src/com/android/email/Email.java b/src/com/android/email/Email.java
deleted file mode 100644
index 1ef55cf2a..000000000
--- a/src/com/android/email/Email.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import android.app.Application;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.util.Log;
-
-import com.android.email.activity.MessageCompose;
-import com.android.email.activity.ShortcutPicker;
-import com.android.email.service.AttachmentDownloadService;
-import com.android.email.service.MailService;
-import com.android.email.widget.WidgetConfiguration;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.TempDirectory;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.service.EmailServiceProxy;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-
-public class Email extends Application {
- /**
- * If this is enabled there will be additional logging information sent to
- * Log.d, including protocol dumps.
- *
- * This should only be used for logs that are useful for debbuging user problems,
- * not for internal/development logs.
- *
- * This can be enabled by typing "debug" in the AccountFolderList activity.
- * Changing the value to 'true' here will likely have no effect at all!
- *
- * TODO: rename this to sUserDebug, and rename LOGD below to DEBUG.
- */
- public static boolean DEBUG;
-
- // Exchange debugging flags (passed to Exchange, when available, via EmailServiceProxy)
- public static boolean DEBUG_EXCHANGE;
- public static boolean DEBUG_EXCHANGE_VERBOSE;
- public static boolean DEBUG_EXCHANGE_FILE;
-
- /**
- * If true, inhibit hardware graphics acceleration in UI (for a/b testing)
- */
- public static boolean sDebugInhibitGraphicsAcceleration = false;
-
- /**
- * Specifies how many messages will be shown in a folder by default. This number is set
- * on each new folder and can be incremented with "Load more messages..." by the
- * VISIBLE_LIMIT_INCREMENT
- */
- public static final int VISIBLE_LIMIT_DEFAULT = 25;
-
- /**
- * Number of additional messages to load when a user selects "Load more messages..."
- */
- public static final int VISIBLE_LIMIT_INCREMENT = 25;
-
- /**
- * This is used to force stacked UI to return to the "welcome" screen any time we change
- * the accounts list (e.g. deleting accounts in the Account Manager preferences.)
- */
- private static boolean sAccountsChangedNotification = false;
-
- private static String sMessageDecodeErrorString;
-
- private static Thread sUiThread;
-
- /**
- * Asynchronous version of {@link #setServicesEnabledSync(Context)}. Use when calling from
- * UI thread (or lifecycle entry points.)
- *
- * @param context
- */
- public static void setServicesEnabledAsync(final Context context) {
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- setServicesEnabledSync(context);
- }
- });
- }
-
- /**
- * Called throughout the application when the number of accounts has changed. This method
- * enables or disables the Compose activity, the boot receiver and the service based on
- * whether any accounts are configured.
- *
- * Blocking call - do not call from UI/lifecycle threads.
- *
- * @param context
- * @return true if there are any accounts configured.
- */
- public static boolean setServicesEnabledSync(Context context) {
- Cursor c = null;
- try {
- c = context.getContentResolver().query(
- Account.CONTENT_URI,
- Account.ID_PROJECTION,
- null, null, null);
- boolean enable = c.getCount() > 0;
- setServicesEnabled(context, enable);
- return enable;
- } finally {
- if (c != null) {
- c.close();
- }
- }
- }
-
- private static void setServicesEnabled(Context context, boolean enabled) {
- PackageManager pm = context.getPackageManager();
- if (!enabled && pm.getComponentEnabledSetting(
- new ComponentName(context, MailService.class)) ==
- PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
- /*
- * If no accounts now exist but the service is still enabled we're about to disable it
- * so we'll reschedule to kill off any existing alarms.
- */
- MailService.actionReschedule(context);
- }
- pm.setComponentEnabledSetting(
- new ComponentName(context, MessageCompose.class),
- enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
- PackageManager.DONT_KILL_APP);
- pm.setComponentEnabledSetting(
- new ComponentName(context, ShortcutPicker.class),
- enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
- PackageManager.DONT_KILL_APP);
- pm.setComponentEnabledSetting(
- new ComponentName(context, MailService.class),
- enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
- PackageManager.DONT_KILL_APP);
- pm.setComponentEnabledSetting(
- new ComponentName(context, AttachmentDownloadService.class),
- enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
- PackageManager.DONT_KILL_APP);
- if (enabled && pm.getComponentEnabledSetting(
- new ComponentName(context, MailService.class)) ==
- PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
- /*
- * And now if accounts do exist then we've just enabled the service and we want to
- * schedule alarms for the new accounts.
- */
- MailService.actionReschedule(context);
- }
-
- pm.setComponentEnabledSetting(
- new ComponentName(context, WidgetConfiguration.class),
- enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
- PackageManager.DONT_KILL_APP);
-
- // Start/stop the various services depending on whether there are any accounts
- startOrStopService(enabled, context, new Intent(context, AttachmentDownloadService.class));
- NotificationController.getInstance(context).watchForMessages(enabled);
- }
-
- /**
- * Starts or stops the service as necessary.
- * @param enabled If {@code true}, the service will be started. Otherwise, it will be stopped.
- * @param context The context to manage the service with.
- * @param intent The intent of the service to be managed.
- */
- private static void startOrStopService(boolean enabled, Context context, Intent intent) {
- if (enabled) {
- context.startService(intent);
- } else {
- context.stopService(intent);
- }
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- sUiThread = Thread.currentThread();
- Preferences prefs = Preferences.getPreferences(this);
- DEBUG = prefs.getEnableDebugLogging();
- sDebugInhibitGraphicsAcceleration = prefs.getInhibitGraphicsAcceleration();
- enableStrictMode(prefs.getEnableStrictMode());
- TempDirectory.setTempDirectory(this);
-
- // Tie MailRefreshManager to the Controller.
- RefreshManager.getInstance(this);
- // Reset all accounts to default visible window
- Controller.getInstance(this).resetVisibleLimits();
-
- // Enable logging in the EAS service, so it starts up as early as possible.
- updateLoggingFlags(this);
-
- // Get a helper string used deep inside message decoders (which don't have context)
- sMessageDecodeErrorString = getString(R.string.message_decode_error);
-
- // Make sure all required services are running when the app is started (can prevent
- // issues after an adb sync/install)
- setServicesEnabledAsync(this);
- }
-
- /**
- * Load enabled debug flags from the preferences and update the EAS debug flag.
- */
- public static void updateLoggingFlags(Context context) {
- Preferences prefs = Preferences.getPreferences(context);
- int debugLogging = prefs.getEnableDebugLogging() ? EmailServiceProxy.DEBUG_BIT : 0;
- int verboseLogging =
- prefs.getEnableExchangeLogging() ? EmailServiceProxy.DEBUG_VERBOSE_BIT : 0;
- int fileLogging =
- prefs.getEnableExchangeFileLogging() ? EmailServiceProxy.DEBUG_FILE_BIT : 0;
- int enableStrictMode =
- prefs.getEnableStrictMode() ? EmailServiceProxy.DEBUG_ENABLE_STRICT_MODE : 0;
- int debugBits = debugLogging | verboseLogging | fileLogging | enableStrictMode;
- Controller.getInstance(context).serviceLogging(debugBits);
- }
-
- /**
- * Internal, utility method for logging.
- * The calls to log() must be guarded with "if (Email.LOGD)" for performance reasons.
- */
- public static void log(String message) {
- Log.d(Logging.LOG_TAG, message);
- }
-
- /**
- * Called by the accounts reconciler to notify that accounts have changed, or by "Welcome"
- * to clear the flag.
- * @param setFlag true to set the notification flag, false to clear it
- */
- public static synchronized void setNotifyUiAccountsChanged(boolean setFlag) {
- sAccountsChangedNotification = setFlag;
- }
-
- /**
- * Called from activity onResume() functions to check for an accounts-changed condition, at
- * which point they should finish() and jump to the Welcome activity.
- */
- public static synchronized boolean getNotifyUiAccountsChanged() {
- return sAccountsChangedNotification;
- }
-
- public static void warnIfUiThread() {
- if (Thread.currentThread().equals(sUiThread)) {
- Log.w(Logging.LOG_TAG, "Method called on the UI thread", new Exception("STACK TRACE"));
- }
- }
-
- /**
- * Retrieve a simple string that can be used when message decoders encounter bad data.
- * This is provided here because the protocol decoders typically don't have mContext.
- */
- public static String getMessageDecodeErrorString() {
- return sMessageDecodeErrorString != null ? sMessageDecodeErrorString : "";
- }
-
- public static void enableStrictMode(boolean enabled) {
- Utility.enableStrictMode(enabled);
- }
-}
diff --git a/src/com/android/email/EmailAddressAdapter.java b/src/com/android/email/EmailAddressAdapter.java
deleted file mode 100644
index 1c07101b3..000000000
--- a/src/com/android/email/EmailAddressAdapter.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import com.android.common.contacts.BaseEmailAddressAdapter;
-import com.android.emailcommon.provider.Account;
-import com.android.ex.chips.AccountSpecifier;
-
-import android.content.Context;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-/**
- * An adaptation of {@link BaseEmailAddressAdapter} for the Email app. The main
- * purpose of the class is to bind the generic implementation to the resources
- * defined locally: strings and layouts.
- */
-public class EmailAddressAdapter extends BaseEmailAddressAdapter implements AccountSpecifier {
-
- private LayoutInflater mInflater;
-
- public EmailAddressAdapter(Context context) {
- super(context);
- mInflater = LayoutInflater.from(context);
- }
-
- @Override
- protected View inflateItemView(ViewGroup parent) {
- return mInflater.inflate(R.layout.recipient_dropdown_item, parent, false);
- }
-
- @Override
- protected View inflateItemViewLoading(ViewGroup parent) {
- return mInflater.inflate(R.layout.recipient_dropdown_item_loading, parent, false);
- }
-
- @Override
- protected void bindView(View view, String directoryType, String directoryName,
- String displayName, String emailAddress) {
- TextView text1 = (TextView)view.findViewById(R.id.text1);
- TextView text2 = (TextView)view.findViewById(R.id.text2);
- text1.setText(displayName);
- text2.setText(emailAddress);
- }
-
- @Override
- protected void bindViewLoading(View view, String directoryType, String directoryName) {
- TextView text1 = (TextView)view.findViewById(R.id.text1);
- String text = getContext().getString(R.string.gal_searching_fmt,
- TextUtils.isEmpty(directoryName) ? directoryType : directoryName);
- text1.setText(text);
- }
-
- /**
- * Set the account when known. Causes the search to prioritize contacts
- * from that account.
- */
- public void setAccount(Account account) {
- if (account != null) {
- // TODO: figure out how to infer the contacts account type from the email account
- super.setAccount(new android.accounts.Account(account.mEmailAddress, "unknown"));
- }
- }
-}
diff --git a/src/com/android/email/EmailConnectivityManager.java b/src/com/android/email/EmailConnectivityManager.java
index c618c3870..6746152d1 100644
--- a/src/com/android/email/EmailConnectivityManager.java
+++ b/src/com/android/email/EmailConnectivityManager.java
@@ -29,6 +29,8 @@ import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.util.Log;
+import com.android.email2.ui.MailActivityEmail;
+
/**
* Encapsulates functionality of ConnectivityManager for use in the Email application. In
* particular, this class provides callbacks for connectivity lost, connectivity restored, and
@@ -179,14 +181,14 @@ public class EmailConnectivityManager extends BroadcastReceiver {
if (info != null) {
// We're done if there's an active network
if (waiting) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, mName + ": Connectivity wait ended");
}
}
return;
} else {
if (!waiting) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, mName + ": Connectivity waiting...");
}
waiting = true;
diff --git a/src/com/android/email/FolderProperties.java b/src/com/android/email/FolderProperties.java
deleted file mode 100644
index 86c902139..000000000
--- a/src/com/android/email/FolderProperties.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-import com.google.common.base.Preconditions;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.database.Cursor;
-import android.graphics.drawable.Drawable;
-
-
-// TODO When the UI is settled, cache all strings/drawables
-/**
- * Stores names and icons for system folders. System folders are those with special
- * meaning, such as Inbox, Drafts, Trash, etc... Although these folders may or may
- * not exist on the server, we want to ensure they are displayed in a very specific
- * manner.
- *
- * Some methods probably should belong to {@link Mailbox}, but as this class uses resources,
- * we can't move them to emailcommon...
- */
-public class FolderProperties {
-
- private static FolderProperties sInstance;
-
- private final Context mContext;
-
- // Caches for frequently accessed resources.
- private final String[] mSpecialMailbox;
- private final TypedArray mSpecialMailboxDrawable;
- private final Drawable mSummaryStarredMailboxDrawable;
- private final Drawable mSummaryCombinedInboxDrawable;
-
- private FolderProperties(Context context) {
- mContext = context.getApplicationContext();
- mSpecialMailbox = context.getResources().getStringArray(R.array.mailbox_display_names);
- for (int i = 0; i < mSpecialMailbox.length; ++i) {
- if ("".equals(mSpecialMailbox[i])) {
- // there is no localized name, so use the display name from the server
- mSpecialMailbox[i] = null;
- }
- }
- mSpecialMailboxDrawable =
- context.getResources().obtainTypedArray(R.array.mailbox_display_icons);
- mSummaryStarredMailboxDrawable =
- context.getResources().getDrawable(R.drawable.ic_menu_star_holo_light);
- mSummaryCombinedInboxDrawable =
- context.getResources().getDrawable(R.drawable.ic_list_combined_inbox);
- }
-
- public static synchronized FolderProperties getInstance(Context context) {
- if (sInstance == null) {
- sInstance = new FolderProperties(context);
- }
- return sInstance;
- }
-
- public String getCombinedMailboxName(long mailboxId) {
- // Special combined mailboxes
- int resId = 0;
-
- // Can't use long for switch!?
- if (mailboxId == Mailbox.QUERY_ALL_INBOXES) {
- resId = R.string.account_folder_list_summary_inbox;
- } else if (mailboxId == Mailbox.QUERY_ALL_FAVORITES) {
- resId = R.string.account_folder_list_summary_starred;
- } else if (mailboxId == Mailbox.QUERY_ALL_DRAFTS) {
- resId = R.string.account_folder_list_summary_drafts;
- } else if (mailboxId == Mailbox.QUERY_ALL_OUTBOX) {
- resId = R.string.account_folder_list_summary_outbox;
- }
- if (resId != 0) {
- return mContext.getString(resId);
- }
- return null;
- }
-
- /**
- * Lookup names of localized special mailboxes
- */
- private String getDisplayName(int type, long mailboxId) {
- String name = getCombinedMailboxName(mailboxId);
-
- if ((name == null) && (type < mSpecialMailbox.length)) {
- name = mSpecialMailbox[type];
- }
- return name;
- }
-
- /**
- * Return the display name for a mailbox for UI. For normal mailboxes, it just returns
- * {@code originalDisplayName}, but for special mailboxes (such as combined mailboxes) it
- * returns a name obtained from the resource.
- *
- * @param mailboxType Such as {@link Mailbox#TYPE_INBOX}
- * @param mailboxId ID of a mailbox.
- * @param originalDisplayName Display name of the mailbox stored in the database.
- */
- public String getDisplayName(int mailboxType, long mailboxId, String originalDisplayName) {
- String name = getDisplayName(mailboxType, mailboxId);
- if (name != null) {
- return name;
- }
- return originalDisplayName;
- }
-
- /**
- * Same as {@link #getDisplayName(int, long, String)}, but gets information form a mailbox
- * cursor. The cursor must contain the following columns:
- * {@link MailboxColumns#ID}, {@link MailboxColumns#TYPE} and
- * {@link MailboxColumns#DISPLAY_NAME}.
- */
- public String getDisplayName(Cursor mailboxCursor) {
- final Cursor c = mailboxCursor;
- return getDisplayName(
- c.getInt(c.getColumnIndex(MailboxColumns.TYPE)),
- c.getLong(c.getColumnIndex(MailboxColumns.ID)),
- c.getString(c.getColumnIndex(MailboxColumns.DISPLAY_NAME))
- );
- }
-
- public String getDisplayName(Mailbox mailbox) {
- return getDisplayName(mailbox.mType, mailbox.mId, mailbox.mDisplayName);
- }
-
- /**
- * Return the message count which should be shown with a mailbox name. Depending on
- * the mailbox type, we change what to show.
- *
- * @param mailboxType Such as {@link Mailbox#TYPE_INBOX}
- * @param unreadCount Count obtained from {@link MailboxColumns#UNREAD_COUNT}
- * @param totalCount Count obtained from {@link MailboxColumns#MESSAGE_COUNT}
- */
- public int getMessageCount(int mailboxType, int unreadCount, int totalCount) {
- switch (mailboxType) {
- case Mailbox.TYPE_DRAFTS:
- case Mailbox.TYPE_OUTBOX:
- return totalCount;
- case Mailbox.TYPE_SENT:
- case Mailbox.TYPE_TRASH:
- return 0; // We don't show a count for sent/trash.
- }
- return unreadCount;
- }
-
- /**
- * Same as {@link #getMessageCount(int, int, int)}, but gets information form a mailbox
- * cursor. The cursor must contain the following columns:
- * {@link MailboxColumns#TYPE}, {@link MailboxColumns#UNREAD_COUNT} and
- * {@link MailboxColumns#MESSAGE_COUNT}.
- */
- public int getMessageCount(Cursor mailboxCursor) {
- final Cursor c = mailboxCursor;
- return getMessageCount(
- c.getInt(c.getColumnIndex(MailboxColumns.TYPE)),
- c.getInt(c.getColumnIndex(MailboxColumns.UNREAD_COUNT)),
- c.getInt(c.getColumnIndex(MailboxColumns.MESSAGE_COUNT))
- );
- }
-
- /**
- * @return message count to show for the UI for a combined inbox.
- *
- * Note this method doesn't use mContext so we can inject a mock context for provider
- * access. So it's static.
- */
- public static int getMessageCountForCombinedMailbox(Context context, long mailboxId) {
- Preconditions.checkState(mailboxId < -1L);
- if ((mailboxId == Mailbox.QUERY_ALL_INBOXES)
- || (mailboxId == Mailbox.QUERY_ALL_UNREAD)) {
- return Mailbox.getUnreadCountByMailboxType(context, Mailbox.TYPE_INBOX);
-
- } else if (mailboxId == Mailbox.QUERY_ALL_FAVORITES) {
- return Message.getFavoriteMessageCount(context);
-
- } else if (mailboxId == Mailbox.QUERY_ALL_DRAFTS) {
- return Mailbox.getMessageCountByMailboxType(context, Mailbox.TYPE_DRAFTS);
-
- } else if (mailboxId == Mailbox.QUERY_ALL_OUTBOX) {
- return Mailbox.getMessageCountByMailboxType(context, Mailbox.TYPE_OUTBOX);
- }
- throw new IllegalStateException("Invalid mailbox ID");
- }
-
- /**
- * Lookup icons of special mailboxes
- */
- public Drawable getIcon(int type, long mailboxId, int mailboxFlags) {
- if (mailboxId == Mailbox.QUERY_ALL_INBOXES) {
- return mSummaryCombinedInboxDrawable;
- } else if (mailboxId == Mailbox.QUERY_ALL_FAVORITES) {
- return mSummaryStarredMailboxDrawable;
- } else if (mailboxId == Mailbox.QUERY_ALL_DRAFTS) {
- return mSpecialMailboxDrawable.getDrawable(Mailbox.TYPE_DRAFTS);
- } else if (mailboxId == Mailbox.QUERY_ALL_OUTBOX) {
- return mSpecialMailboxDrawable.getDrawable(Mailbox.TYPE_OUTBOX);
- }
- if (0 <= type && type < mSpecialMailboxDrawable.length()) {
- final int resId = mSpecialMailboxDrawable.getResourceId(type, -1);
- if (resId != -1) {
- return mContext.getResources().getDrawable(resId);
- }
- }
- return null; // No icon
- }
-}
-
diff --git a/src/com/android/email/GroupMessagingListener.java b/src/com/android/email/GroupMessagingListener.java
deleted file mode 100644
index a7b87c288..000000000
--- a/src/com/android/email/GroupMessagingListener.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import com.android.emailcommon.mail.MessagingException;
-
-import android.content.Context;
-
-import java.util.ArrayList;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-public class GroupMessagingListener extends MessagingListener {
- /* The synchronization of the methods in this class
- is not needed because we use ConcurrentHashMap.
-
- Nevertheless, let's keep the "synchronized" for a while in the case
- we may want to change the implementation to use something else
- than ConcurrentHashMap.
- */
-
- private ConcurrentHashMap<MessagingListener, Object> mListenersMap =
- new ConcurrentHashMap<MessagingListener, Object>();
-
- private Set<MessagingListener> mListeners = mListenersMap.keySet();
-
- synchronized public void addListener(MessagingListener listener) {
- // we use "this" as a dummy non-null value
- mListenersMap.put(listener, this);
- }
-
- synchronized public void removeListener(MessagingListener listener) {
- mListenersMap.remove(listener);
- }
-
- synchronized public boolean isActiveListener(MessagingListener listener) {
- return mListenersMap.containsKey(listener);
- }
-
- @Override
- synchronized public void listFoldersStarted(long accountId) {
- for (MessagingListener l : mListeners) {
- l.listFoldersStarted(accountId);
- }
- }
-
- @Override
- synchronized public void listFoldersFailed(long accountId, String message) {
- for (MessagingListener l : mListeners) {
- l.listFoldersFailed(accountId, message);
- }
- }
-
- @Override
- synchronized public void listFoldersFinished(long accountId) {
- for (MessagingListener l : mListeners) {
- l.listFoldersFinished(accountId);
- }
- }
-
- @Override
- synchronized public void synchronizeMailboxStarted(long accountId, long mailboxId) {
- for (MessagingListener l : mListeners) {
- l.synchronizeMailboxStarted(accountId, mailboxId);
- }
- }
-
- @Override
- synchronized public void synchronizeMailboxFinished(long accountId, long mailboxId,
- int totalMessagesInMailbox, int numNewMessages, ArrayList<Long> addedMessages) {
- for (MessagingListener l : mListeners) {
- l.synchronizeMailboxFinished(accountId, mailboxId,
- totalMessagesInMailbox, numNewMessages, addedMessages);
- }
- }
-
- @Override
- synchronized public void synchronizeMailboxFailed(long accountId, long mailboxId, Exception e) {
- for (MessagingListener l : mListeners) {
- l.synchronizeMailboxFailed(accountId, mailboxId, e);
- }
- }
-
- @Override
- synchronized public void loadMessageForViewStarted(long messageId) {
- for (MessagingListener l : mListeners) {
- l.loadMessageForViewStarted(messageId);
- }
- }
-
- @Override
- synchronized public void loadMessageForViewFinished(long messageId) {
- for (MessagingListener l : mListeners) {
- l.loadMessageForViewFinished(messageId);
- }
- }
-
- @Override
- synchronized public void loadMessageForViewFailed(long messageId, String message) {
- for (MessagingListener l : mListeners) {
- l.loadMessageForViewFailed(messageId, message);
- }
- }
-
- @Override
- synchronized public void checkMailStarted(Context context, long accountId, long tag) {
- for (MessagingListener l : mListeners) {
- l.checkMailStarted(context, accountId, tag);
- }
- }
-
- @Override
- synchronized public void checkMailFinished(Context context, long accountId, long folderId,
- long tag) {
- for (MessagingListener l : mListeners) {
- l.checkMailFinished(context, accountId, folderId, tag);
- }
- }
-
- @Override
- synchronized public void sendPendingMessagesStarted(long accountId, long messageId) {
- for (MessagingListener l : mListeners) {
- l.sendPendingMessagesStarted(accountId, messageId);
- }
- }
-
- @Override
- synchronized public void sendPendingMessagesCompleted(long accountId) {
- for (MessagingListener l : mListeners) {
- l.sendPendingMessagesCompleted(accountId);
- }
- }
-
- @Override
- synchronized public void sendPendingMessagesFailed(long accountId, long messageId,
- Exception reason) {
- for (MessagingListener l : mListeners) {
- l.sendPendingMessagesFailed(accountId, messageId, reason);
- }
- }
-
- @Override
- synchronized public void messageUidChanged(long accountId, long mailboxId,
- String oldUid, String newUid) {
- for (MessagingListener l : mListeners) {
- l.messageUidChanged(accountId, mailboxId, oldUid, newUid);
- }
- }
-
- @Override
- synchronized public void loadAttachmentStarted(
- long accountId,
- long messageId,
- long attachmentId,
- boolean requiresDownload) {
- for (MessagingListener l : mListeners) {
- l.loadAttachmentStarted(accountId, messageId, attachmentId, requiresDownload);
- }
- }
-
- @Override
- synchronized public void loadAttachmentFinished(
- long accountId,
- long messageId,
- long attachmentId) {
- for (MessagingListener l : mListeners) {
- l.loadAttachmentFinished(accountId, messageId, attachmentId);
- }
- }
-
- @Override
- synchronized public void loadAttachmentFailed(
- long accountId,
- long messageId,
- long attachmentId,
- MessagingException me,
- boolean background) {
- for (MessagingListener l : mListeners) {
- l.loadAttachmentFailed(accountId, messageId, attachmentId, me, background);
- }
- }
-
- @Override
- synchronized public void controllerCommandCompleted(boolean moreCommandsToRun) {
- for (MessagingListener l : mListeners) {
- l.controllerCommandCompleted(moreCommandsToRun);
- }
- }
-}
diff --git a/src/com/android/email/LegacyConversions.java b/src/com/android/email/LegacyConversions.java
index fdefd3c4f..453c85459 100644
--- a/src/com/android/email/LegacyConversions.java
+++ b/src/com/android/email/LegacyConversions.java
@@ -41,6 +41,7 @@ import com.android.emailcommon.provider.EmailContent.Attachment;
import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
import com.android.emailcommon.provider.Mailbox;
import com.android.emailcommon.utility.AttachmentUtilities;
+import com.android.mail.providers.UIProvider;
import org.apache.commons.io.IOUtils;
@@ -212,8 +213,11 @@ public class LegacyConversions {
String[] partIds = part.getHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA);
String partId = partIds != null ? partIds[0] : null;
+ // Run the mime type through inferMimeType in case we have something generic and can do
+ // better using the filename extension
+ String mimeType = AttachmentUtilities.inferMimeType(name, part.getMimeType());
+ localAttachment.mMimeType = mimeType;
localAttachment.mFileName = name;
- localAttachment.mMimeType = part.getMimeType();
localAttachment.mSize = size; // May be reset below if file handled
localAttachment.mContentId = part.getContentId();
localAttachment.mContentUri = null; // Will be rewritten by saveAttachmentBody
@@ -316,6 +320,7 @@ public class LegacyConversions {
ContentValues cv = new ContentValues();
cv.put(AttachmentColumns.SIZE, copySize);
cv.put(AttachmentColumns.CONTENT_URI, contentUriString);
+ cv.put(AttachmentColumns.UI_STATE, UIProvider.AttachmentState.SAVED);
Uri uri = ContentUris.withAppendedId(Attachment.CONTENT_URI, attachmentId);
context.getContentResolver().update(uri, cv, null, null);
}
diff --git a/src/com/android/email/MessageListContext.java b/src/com/android/email/MessageListContext.java
deleted file mode 100644
index 03d3b2d6d..000000000
--- a/src/com/android/email/MessageListContext.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.email.activity.EmailActivity;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.service.SearchParams;
-import com.google.common.base.Objects;
-import com.google.common.base.Preconditions;
-
-/**
- * Information about what is being shown in a message list.
- * This encapsulates the meta-data about the list of messages, which can either be the
- * {@link Mailbox} ID, or {@link SearchParams}.
- */
-public class MessageListContext implements Parcelable {
-
- /**
- * The active account. Changing an account is a destructive enough operation that it warrants
- * the creation of a new {@link MessageListContext}
- */
- public final long mAccountId;
-
- /**
- * The mailbox ID containing the messages. Must not be {@link Mailbox#NO_MAILBOX}.
- */
- private final long mMailboxId;
-
- /**
- * The search parameters, if the user is in a search.
- * If non-null, {@link #mMailboxId} will always correspond to the search mailbox for the user.
- */
- private final SearchParams mSearchParams;
-
- // Private constructor - use static builder methods to generate a validated instance.
- private MessageListContext(long accountId, long searchMailboxId, SearchParams searchParams) {
- mAccountId = accountId;
- mMailboxId = searchMailboxId;
- mSearchParams = searchParams;
- }
-
- /**
- * Builds an instance from the information provided in an Intent.
- * This method will perform proper validation and throw an {@link IllegalArgumentException}
- * if values in the {@link Intent} are inconsistent.
- * This will also handle the generation of default values if certain fields are unspecified
- * in the {@link Intent}.
- */
- public static MessageListContext forIntent(Context context, Intent intent) {
- long accountId = intent.getLongExtra(EmailActivity.EXTRA_ACCOUNT_ID, Account.NO_ACCOUNT);
- long mailboxId = intent.getLongExtra(EmailActivity.EXTRA_MAILBOX_ID, Mailbox.NO_MAILBOX);
-
- if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
- final String queryTerm = intent.getStringExtra(EmailActivity.EXTRA_QUERY_STRING);
- final long searchMailboxId =
- Controller.getInstance(context).getSearchMailbox(accountId).mId;
- return forSearch(accountId, searchMailboxId, new SearchParams(mailboxId, queryTerm));
- } else {
- if (accountId == Account.NO_ACCOUNT) {
- accountId = Account.getDefaultAccountId(context);
- if (accountId == Account.NO_ACCOUNT) {
- return null;
- }
- }
- if (mailboxId == Mailbox.NO_MAILBOX) {
- mailboxId = (accountId == Account.ACCOUNT_ID_COMBINED_VIEW)
- ? Mailbox.QUERY_ALL_INBOXES
- : Mailbox.findMailboxOfType(context, accountId, Mailbox.TYPE_INBOX);
- }
-
- return forMailbox(accountId, mailboxId);
- }
- }
-
- /**
- * Creates a view context for a given search.
- */
- public static MessageListContext forSearch(
- long accountId, long searchMailboxId, SearchParams searchParams) {
- Preconditions.checkArgument(
- Account.isNormalAccount(accountId),
- "Can only search in normal accounts");
- return new MessageListContext(accountId, searchMailboxId, searchParams);
- }
-
- /**
- * Creates a view context for a given mailbox.
- */
- public static MessageListContext forMailbox(long accountId, long mailboxId) {
- Preconditions.checkArgument(accountId != Account.NO_ACCOUNT, "Must specify an account");
- Preconditions.checkArgument(mailboxId != Mailbox.NO_MAILBOX, "Must specify a mailbox");
- return new MessageListContext(accountId, mailboxId, null);
- }
-
- public boolean isSearch() {
- return mSearchParams != null;
- }
-
- public long getSearchedMailbox() {
- return isSearch() ? mSearchParams.mMailboxId : Mailbox.NO_MAILBOX;
- }
-
- public SearchParams getSearchParams() {
- return mSearchParams;
- }
-
- public long getMailboxId() {
- return mMailboxId;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o == this) {
- return true;
- }
- if ((o == null) || !(o instanceof MessageListContext)) {
- return false;
- }
-
- MessageListContext om = (MessageListContext) o;
- return mAccountId == om.mAccountId
- && mMailboxId == om.mMailboxId
- && Objects.equal(mSearchParams, om.mSearchParams);
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(mAccountId, mMailboxId, mSearchParams);
- }
-
- @Override
- public String toString() {
- return "[MessageListContext " + mAccountId + ":" + mMailboxId + ":" + mSearchParams + "]";
- }
-
-
- private MessageListContext(Parcel in) {
- mAccountId = in.readLong();
- mMailboxId = in.readLong();
- mSearchParams = in.readParcelable(SearchParams.class.getClassLoader());
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeLong(mAccountId);
- dest.writeLong(mMailboxId);
- dest.writeParcelable(mSearchParams, flags);
- }
-
- public static Parcelable.Creator<MessageListContext> CREATOR =
- new Parcelable.Creator<MessageListContext>() {
- @Override
- public MessageListContext createFromParcel(Parcel source) {
- return new MessageListContext(source);
- }
-
- @Override
- public MessageListContext[] newArray(int size) {
- return new MessageListContext[size];
- }
- };
-}
diff --git a/src/com/android/email/MessagingController.java b/src/com/android/email/MessagingController.java
deleted file mode 100644
index 6a0f1e1d8..000000000
--- a/src/com/android/email/MessagingController.java
+++ /dev/null
@@ -1,2186 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.TrafficStats;
-import android.net.Uri;
-import android.os.Process;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.email.mail.Sender;
-import com.android.email.mail.Store;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.TrafficFlags;
-import com.android.emailcommon.internet.MimeBodyPart;
-import com.android.emailcommon.internet.MimeHeader;
-import com.android.emailcommon.internet.MimeMultipart;
-import com.android.emailcommon.internet.MimeUtility;
-import com.android.emailcommon.mail.AuthenticationFailedException;
-import com.android.emailcommon.mail.FetchProfile;
-import com.android.emailcommon.mail.Flag;
-import com.android.emailcommon.mail.Folder;
-import com.android.emailcommon.mail.Folder.FolderType;
-import com.android.emailcommon.mail.Folder.MessageRetrievalListener;
-import com.android.emailcommon.mail.Folder.MessageUpdateCallbacks;
-import com.android.emailcommon.mail.Folder.OpenMode;
-import com.android.emailcommon.mail.Message;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.mail.Part;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.emailcommon.provider.EmailContent.SyncColumns;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.service.SearchParams;
-import com.android.emailcommon.utility.AttachmentUtilities;
-import com.android.emailcommon.utility.ConversionUtilities;
-import com.android.emailcommon.utility.Utility;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-
-/**
- * Starts a long running (application) Thread that will run through commands
- * that require remote mailbox access. This class is used to serialize and
- * prioritize these commands. Each method that will submit a command requires a
- * MessagingListener instance to be provided. It is expected that that listener
- * has also been added as a registered listener using addListener(). When a
- * command is to be executed, if the listener that was provided with the command
- * is no longer registered the command is skipped. The design idea for the above
- * is that when an Activity starts it registers as a listener. When it is paused
- * it removes itself. Thus, any commands that that activity submitted are
- * removed from the queue once the activity is no longer active.
- */
-public class MessagingController implements Runnable {
-
- /**
- * The maximum message size that we'll consider to be "small". A small message is downloaded
- * in full immediately instead of in pieces. Anything over this size will be downloaded in
- * pieces with attachments being left off completely and downloaded on demand.
- *
- *
- * 25k for a "small" message was picked by educated trial and error.
- * http://answers.google.com/answers/threadview?id=312463 claims that the
- * average size of an email is 59k, which I feel is too large for our
- * blind download. The following tests were performed on a download of
- * 25 random messages.
- * <pre>
- * 5k - 61 seconds,
- * 25k - 51 seconds,
- * 55k - 53 seconds,
- * </pre>
- * So 25k gives good performance and a reasonable data footprint. Sounds good to me.
- */
- private static final int MAX_SMALL_MESSAGE_SIZE = (25 * 1024);
-
- private static final Flag[] FLAG_LIST_SEEN = new Flag[] { Flag.SEEN };
- private static final Flag[] FLAG_LIST_FLAGGED = new Flag[] { Flag.FLAGGED };
- private static final Flag[] FLAG_LIST_ANSWERED = new Flag[] { Flag.ANSWERED };
-
- /**
- * We write this into the serverId field of messages that will never be upsynced.
- */
- private static final String LOCAL_SERVERID_PREFIX = "Local-";
-
- /**
- * Cache search results by account; this allows for "load more" support without having to
- * redo the search (which can be quite slow). SortableMessage is a smallish class, so memory
- * shouldn't be an issue
- */
- private static final HashMap<Long, SortableMessage[]> sSearchResults =
- new HashMap<Long, SortableMessage[]>();
-
- private static final ContentValues PRUNE_ATTACHMENT_CV = new ContentValues();
- static {
- PRUNE_ATTACHMENT_CV.putNull(AttachmentColumns.CONTENT_URI);
- }
-
- private static MessagingController sInstance = null;
- private final BlockingQueue<Command> mCommands = new LinkedBlockingQueue<Command>();
- private final Thread mThread;
-
- /**
- * All access to mListeners *must* be synchronized
- */
- private final GroupMessagingListener mListeners = new GroupMessagingListener();
- private boolean mBusy;
- private final Context mContext;
- private final Controller mController;
-
- /**
- * Simple cache for last search result mailbox by account and serverId, since the most common
- * case will be repeated use of the same mailbox
- */
- private long mLastSearchAccountKey = Account.NO_ACCOUNT;
- private String mLastSearchServerId = null;
- private Mailbox mLastSearchRemoteMailbox = null;
-
- protected MessagingController(Context _context, Controller _controller) {
- mContext = _context.getApplicationContext();
- mController = _controller;
- mThread = new Thread(this);
- mThread.start();
- }
-
- /**
- * Gets or creates the singleton instance of MessagingController. Application is used to
- * provide a Context to classes that need it.
- */
- public synchronized static MessagingController getInstance(Context _context,
- Controller _controller) {
- if (sInstance == null) {
- sInstance = new MessagingController(_context, _controller);
- }
- return sInstance;
- }
-
- /**
- * Inject a mock controller. Used only for testing. Affects future calls to getInstance().
- */
- public static void injectMockController(MessagingController mockController) {
- sInstance = mockController;
- }
-
- // TODO: seems that this reading of mBusy isn't thread-safe
- public boolean isBusy() {
- return mBusy;
- }
-
- public void run() {
- Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
- // TODO: add an end test to this infinite loop
- while (true) {
- Command command;
- try {
- command = mCommands.take();
- } catch (InterruptedException e) {
- continue; //re-test the condition on the eclosing while
- }
- if (command.listener == null || isActiveListener(command.listener)) {
- mBusy = true;
- command.runnable.run();
- mListeners.controllerCommandCompleted(mCommands.size() > 0);
- }
- mBusy = false;
- }
- }
-
- private void put(String description, MessagingListener listener, Runnable runnable) {
- try {
- Command command = new Command();
- command.listener = listener;
- command.runnable = runnable;
- command.description = description;
- mCommands.add(command);
- }
- catch (IllegalStateException ie) {
- throw new Error(ie);
- }
- }
-
- public void addListener(MessagingListener listener) {
- mListeners.addListener(listener);
- }
-
- public void removeListener(MessagingListener listener) {
- mListeners.removeListener(listener);
- }
-
- private boolean isActiveListener(MessagingListener listener) {
- return mListeners.isActiveListener(listener);
- }
-
- private static final int MAILBOX_COLUMN_ID = 0;
- private static final int MAILBOX_COLUMN_SERVER_ID = 1;
- private static final int MAILBOX_COLUMN_TYPE = 2;
-
- /** Small projection for just the columns required for a sync. */
- private static final String[] MAILBOX_PROJECTION = new String[] {
- MailboxColumns.ID,
- MailboxColumns.SERVER_ID,
- MailboxColumns.TYPE,
- };
-
- /**
- * Synchronize the folder list with the remote server. Synchronization occurs in the
- * background and results are passed through the {@link MessagingListener}. If the
- * given listener is not {@code null}, it must have been previously added to the set
- * of listeners using the {@link #addListener(MessagingListener)}. Otherwise, no
- * actions will be performed.
- *
- * TODO this needs to cache the remote folder list
- * TODO break out an inner listFoldersSynchronized which could simplify checkMail
- *
- * @param accountId ID of the account for which to list the folders
- * @param listener A listener to notify
- */
- void listFolders(final long accountId, MessagingListener listener) {
- final Account account = Account.restoreAccountWithId(mContext, accountId);
- if (account == null) {
- Log.i(Logging.LOG_TAG, "Could not load account id " + accountId
- + ". Has it been removed?");
- return;
- }
- mListeners.listFoldersStarted(accountId);
- put("listFolders", listener, new Runnable() {
- // TODO For now, mailbox addition occurs in the server-dependent store implementation,
- // but, mailbox removal occurs here. Instead, each store should be responsible for
- // content synchronization (addition AND removal) since each store will likely need
- // to implement it's own, unique synchronization methodology.
- public void run() {
- TrafficStats.setThreadStatsTag(TrafficFlags.getSyncFlags(mContext, account));
- Cursor localFolderCursor = null;
- try {
- // Step 1: Get remote mailboxes
- Store store = Store.getInstance(account, mContext);
- Folder[] remoteFolders = store.updateFolders();
- HashSet<String> remoteFolderNames = new HashSet<String>();
- for (int i = 0, count = remoteFolders.length; i < count; i++) {
- remoteFolderNames.add(remoteFolders[i].getName());
- }
-
- // Step 2: Get local mailboxes
- localFolderCursor = mContext.getContentResolver().query(
- Mailbox.CONTENT_URI,
- MAILBOX_PROJECTION,
- EmailContent.MailboxColumns.ACCOUNT_KEY + "=?",
- new String[] { String.valueOf(account.mId) },
- null);
-
- // Step 3: Remove any local mailbox not on the remote list
- while (localFolderCursor.moveToNext()) {
- String mailboxPath = localFolderCursor.getString(MAILBOX_COLUMN_SERVER_ID);
- // Short circuit if we have a remote mailbox with the same name
- if (remoteFolderNames.contains(mailboxPath)) {
- continue;
- }
-
- int mailboxType = localFolderCursor.getInt(MAILBOX_COLUMN_TYPE);
- long mailboxId = localFolderCursor.getLong(MAILBOX_COLUMN_ID);
- switch (mailboxType) {
- case Mailbox.TYPE_INBOX:
- case Mailbox.TYPE_DRAFTS:
- case Mailbox.TYPE_OUTBOX:
- case Mailbox.TYPE_SENT:
- case Mailbox.TYPE_TRASH:
- case Mailbox.TYPE_SEARCH:
- // Never, ever delete special mailboxes
- break;
- default:
- // Drop all attachment files related to this mailbox
- AttachmentUtilities.deleteAllMailboxAttachmentFiles(
- mContext, accountId, mailboxId);
- // Delete the mailbox; database triggers take care of related
- // Message, Body and Attachment records
- Uri uri = ContentUris.withAppendedId(
- Mailbox.CONTENT_URI, mailboxId);
- mContext.getContentResolver().delete(uri, null, null);
- break;
- }
- }
- mListeners.listFoldersFinished(accountId);
- } catch (Exception e) {
- mListeners.listFoldersFailed(accountId, e.toString());
- } finally {
- if (localFolderCursor != null) {
- localFolderCursor.close();
- }
- }
- }
- });
- }
-
- /**
- * Start background synchronization of the specified folder.
- * @param account
- * @param folder
- * @param listener
- */
- public void synchronizeMailbox(final Account account,
- final Mailbox folder, MessagingListener listener) {
- /*
- * We don't ever sync the Outbox.
- */
- if (folder.mType == Mailbox.TYPE_OUTBOX) {
- return;
- }
- mListeners.synchronizeMailboxStarted(account.mId, folder.mId);
- put("synchronizeMailbox", listener, new Runnable() {
- public void run() {
- synchronizeMailboxSynchronous(account, folder);
- }
- });
- }
-
- /**
- * Start foreground synchronization of the specified folder. This is called by
- * synchronizeMailbox or checkMail.
- * TODO this should use ID's instead of fully-restored objects
- * @param account
- * @param folder
- */
- private void synchronizeMailboxSynchronous(final Account account,
- final Mailbox folder) {
- TrafficStats.setThreadStatsTag(TrafficFlags.getSyncFlags(mContext, account));
- mListeners.synchronizeMailboxStarted(account.mId, folder.mId);
- if ((folder.mFlags & Mailbox.FLAG_HOLDS_MAIL) == 0) {
- // We don't hold messages, so, nothing to synchronize
- mListeners.synchronizeMailboxFinished(account.mId, folder.mId, 0, 0, null);
- return;
- }
- NotificationController nc = NotificationController.getInstance(mContext);
- try {
- processPendingActionsSynchronous(account);
-
- // Select generic sync or store-specific sync
- SyncResults results = synchronizeMailboxGeneric(account, folder);
- // The account might have been deleted
- if (results == null) return;
- mListeners.synchronizeMailboxFinished(account.mId, folder.mId,
- results.mTotalMessages,
- results.mAddedMessages.size(),
- results.mAddedMessages);
- // Clear authentication notification for this account
- nc.cancelLoginFailedNotification(account.mId);
- } catch (MessagingException e) {
- if (Logging.LOGD) {
- Log.v(Logging.LOG_TAG, "synchronizeMailbox", e);
- }
- if (e instanceof AuthenticationFailedException) {
- // Generate authentication notification
- nc.showLoginFailedNotification(account.mId);
- }
- mListeners.synchronizeMailboxFailed(account.mId, folder.mId, e);
- }
- }
-
- /**
- * Lightweight record for the first pass of message sync, where I'm just seeing if
- * the local message requires sync. Later (for messages that need syncing) we'll do a full
- * readout from the DB.
- */
- private static class LocalMessageInfo {
- private static final int COLUMN_ID = 0;
- private static final int COLUMN_FLAG_READ = 1;
- private static final int COLUMN_FLAG_FAVORITE = 2;
- private static final int COLUMN_FLAG_LOADED = 3;
- private static final int COLUMN_SERVER_ID = 4;
- private static final int COLUMN_FLAGS = 7;
- private static final String[] PROJECTION = new String[] {
- EmailContent.RECORD_ID,
- MessageColumns.FLAG_READ, MessageColumns.FLAG_FAVORITE, MessageColumns.FLAG_LOADED,
- SyncColumns.SERVER_ID, MessageColumns.MAILBOX_KEY, MessageColumns.ACCOUNT_KEY,
- MessageColumns.FLAGS
- };
-
- final long mId;
- final boolean mFlagRead;
- final boolean mFlagFavorite;
- final int mFlagLoaded;
- final String mServerId;
- final int mFlags;
-
- public LocalMessageInfo(Cursor c) {
- mId = c.getLong(COLUMN_ID);
- mFlagRead = c.getInt(COLUMN_FLAG_READ) != 0;
- mFlagFavorite = c.getInt(COLUMN_FLAG_FAVORITE) != 0;
- mFlagLoaded = c.getInt(COLUMN_FLAG_LOADED);
- mServerId = c.getString(COLUMN_SERVER_ID);
- mFlags = c.getInt(COLUMN_FLAGS);
- // Note: mailbox key and account key not needed - they are projected for the SELECT
- }
- }
-
- private void saveOrUpdate(EmailContent content, Context context) {
- if (content.isSaved()) {
- content.update(context, content.toContentValues());
- } else {
- content.save(context);
- }
- }
-
- /**
- * Load the structure and body of messages not yet synced
- * @param account the account we're syncing
- * @param remoteFolder the (open) Folder we're working on
- * @param unsyncedMessages an array of Message's we've got headers for
- * @param toMailbox the destination mailbox we're syncing
- * @throws MessagingException
- */
- void loadUnsyncedMessages(final Account account, Folder remoteFolder,
- ArrayList<Message> unsyncedMessages, final Mailbox toMailbox)
- throws MessagingException {
-
- // 1. Divide the unsynced messages into small & large (by size)
-
- // TODO doing this work here (synchronously) is problematic because it prevents the UI
- // from affecting the order (e.g. download a message because the user requested it.) Much
- // of this logic should move out to a different sync loop that attempts to update small
- // groups of messages at a time, as a background task. However, we can't just return
- // (yet) because POP messages don't have an envelope yet....
-
- ArrayList<Message> largeMessages = new ArrayList<Message>();
- ArrayList<Message> smallMessages = new ArrayList<Message>();
- for (Message message : unsyncedMessages) {
- if (message.getSize() > (MAX_SMALL_MESSAGE_SIZE)) {
- largeMessages.add(message);
- } else {
- smallMessages.add(message);
- }
- }
-
- // 2. Download small messages
-
- // TODO Problems with this implementation. 1. For IMAP, where we get a real envelope,
- // this is going to be inefficient and duplicate work we've already done. 2. It's going
- // back to the DB for a local message that we already had (and discarded).
-
- // For small messages, we specify "body", which returns everything (incl. attachments)
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.BODY);
- remoteFolder.fetch(smallMessages.toArray(new Message[smallMessages.size()]), fp,
- new MessageRetrievalListener() {
- public void messageRetrieved(Message message) {
- // Store the updated message locally and mark it fully loaded
- copyOneMessageToProvider(message, account, toMailbox,
- EmailContent.Message.FLAG_LOADED_COMPLETE);
- }
-
- @Override
- public void loadAttachmentProgress(int progress) {
- }
- });
-
- // 3. Download large messages. We ask the server to give us the message structure,
- // but not all of the attachments.
- fp.clear();
- fp.add(FetchProfile.Item.STRUCTURE);
- remoteFolder.fetch(largeMessages.toArray(new Message[largeMessages.size()]), fp, null);
- for (Message message : largeMessages) {
- if (message.getBody() == null) {
- // POP doesn't support STRUCTURE mode, so we'll just do a partial download
- // (hopefully enough to see some/all of the body) and mark the message for
- // further download.
- fp.clear();
- fp.add(FetchProfile.Item.BODY_SANE);
- // TODO a good optimization here would be to make sure that all Stores set
- // the proper size after this fetch and compare the before and after size. If
- // they equal we can mark this SYNCHRONIZED instead of PARTIALLY_SYNCHRONIZED
- remoteFolder.fetch(new Message[] { message }, fp, null);
-
- // Store the partially-loaded message and mark it partially loaded
- copyOneMessageToProvider(message, account, toMailbox,
- EmailContent.Message.FLAG_LOADED_PARTIAL);
- } else {
- // We have a structure to deal with, from which
- // we can pull down the parts we want to actually store.
- // Build a list of parts we are interested in. Text parts will be downloaded
- // right now, attachments will be left for later.
- ArrayList<Part> viewables = new ArrayList<Part>();
- ArrayList<Part> attachments = new ArrayList<Part>();
- MimeUtility.collectParts(message, viewables, attachments);
- // Download the viewables immediately
- for (Part part : viewables) {
- fp.clear();
- fp.add(part);
- // TODO what happens if the network connection dies? We've got partial
- // messages with incorrect status stored.
- remoteFolder.fetch(new Message[] { message }, fp, null);
- }
- // Store the updated message locally and mark it fully loaded
- copyOneMessageToProvider(message, account, toMailbox,
- EmailContent.Message.FLAG_LOADED_COMPLETE);
- }
- }
-
- }
-
- public void downloadFlagAndEnvelope(final Account account, final Mailbox mailbox,
- Folder remoteFolder, ArrayList<Message> unsyncedMessages,
- HashMap<String, LocalMessageInfo> localMessageMap, final ArrayList<Long> unseenMessages)
- throws MessagingException {
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.FLAGS);
- fp.add(FetchProfile.Item.ENVELOPE);
-
- final HashMap<String, LocalMessageInfo> localMapCopy;
- if (localMessageMap != null)
- localMapCopy = new HashMap<String, LocalMessageInfo>(localMessageMap);
- else {
- localMapCopy = new HashMap<String, LocalMessageInfo>();
- }
-
- remoteFolder.fetch(unsyncedMessages.toArray(new Message[0]), fp,
- new MessageRetrievalListener() {
- @Override
- public void messageRetrieved(Message message) {
- try {
- // Determine if the new message was already known (e.g. partial)
- // And create or reload the full message info
- LocalMessageInfo localMessageInfo =
- localMapCopy.get(message.getUid());
- EmailContent.Message localMessage = null;
- if (localMessageInfo == null) {
- localMessage = new EmailContent.Message();
- } else {
- localMessage = EmailContent.Message.restoreMessageWithId(
- mContext, localMessageInfo.mId);
- }
-
- if (localMessage != null) {
- try {
- // Copy the fields that are available into the message
- LegacyConversions.updateMessageFields(localMessage,
- message, account.mId, mailbox.mId);
- // Commit the message to the local store
- saveOrUpdate(localMessage, mContext);
- // Track the "new" ness of the downloaded message
- if (!message.isSet(Flag.SEEN) && unseenMessages != null) {
- unseenMessages.add(localMessage.mId);
- }
- } catch (MessagingException me) {
- Log.e(Logging.LOG_TAG,
- "Error while copying downloaded message." + me);
- }
-
- }
- }
- catch (Exception e) {
- Log.e(Logging.LOG_TAG,
- "Error while storing downloaded message." + e.toString());
- }
- }
-
- @Override
- public void loadAttachmentProgress(int progress) {
- }
- });
-
- }
-
- /**
- * A message and numeric uid that's easily sortable
- */
- private static class SortableMessage {
- private final Message mMessage;
- private final long mUid;
-
- SortableMessage(Message message, long uid) {
- mMessage = message;
- mUid = uid;
- }
- }
-
- public int searchMailbox(long accountId, SearchParams searchParams, long destMailboxId)
- throws MessagingException {
- try {
- return searchMailboxImpl(accountId, searchParams, destMailboxId);
- } finally {
- // Tell UI that we're done loading any search results (no harm calling this even if we
- // encountered an error or never sent a "started" message)
- mListeners.synchronizeMailboxFinished(accountId, destMailboxId, 0, 0, null);
- }
- }
-
- private int searchMailboxImpl(long accountId, SearchParams searchParams,
- final long destMailboxId) throws MessagingException {
- final Account account = Account.restoreAccountWithId(mContext, accountId);
- final Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, searchParams.mMailboxId);
- final Mailbox destMailbox = Mailbox.restoreMailboxWithId(mContext, destMailboxId);
- if (account == null || mailbox == null || destMailbox == null) {
- Log.d(Logging.LOG_TAG, "Attempted search for " + searchParams
- + " but account or mailbox information was missing");
- return 0;
- }
-
- // Tell UI that we're loading messages
- mListeners.synchronizeMailboxStarted(accountId, destMailbox.mId);
-
- Store remoteStore = Store.getInstance(account, mContext);
- Folder remoteFolder = remoteStore.getFolder(mailbox.mServerId);
- remoteFolder.open(OpenMode.READ_WRITE);
-
- SortableMessage[] sortableMessages = new SortableMessage[0];
- if (searchParams.mOffset == 0) {
- // Get the "bare" messages (basically uid)
- Message[] remoteMessages = remoteFolder.getMessages(searchParams, null);
- int remoteCount = remoteMessages.length;
- if (remoteCount > 0) {
- sortableMessages = new SortableMessage[remoteCount];
- int i = 0;
- for (Message msg : remoteMessages) {
- sortableMessages[i++] = new SortableMessage(msg, Long.parseLong(msg.getUid()));
- }
- // Sort the uid's, most recent first
- // Note: Not all servers will be nice and return results in the order of request;
- // those that do will see messages arrive from newest to oldest
- Arrays.sort(sortableMessages, new Comparator<SortableMessage>() {
- @Override
- public int compare(SortableMessage lhs, SortableMessage rhs) {
- return lhs.mUid > rhs.mUid ? -1 : lhs.mUid < rhs.mUid ? 1 : 0;
- }
- });
- sSearchResults.put(accountId, sortableMessages);
- }
- } else {
- sortableMessages = sSearchResults.get(accountId);
- }
-
- final int numSearchResults = sortableMessages.length;
- final int numToLoad =
- Math.min(numSearchResults - searchParams.mOffset, searchParams.mLimit);
- if (numToLoad <= 0) {
- return 0;
- }
-
- final ArrayList<Message> messageList = new ArrayList<Message>();
- for (int i = searchParams.mOffset; i < numToLoad + searchParams.mOffset; i++) {
- messageList.add(sortableMessages[i].mMessage);
- }
- // Get everything in one pass, rather than two (as in sync); this starts getting us
- // usable results quickly.
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.FLAGS);
- fp.add(FetchProfile.Item.ENVELOPE);
- fp.add(FetchProfile.Item.STRUCTURE);
- fp.add(FetchProfile.Item.BODY_SANE);
- remoteFolder.fetch(messageList.toArray(new Message[0]), fp,
- new MessageRetrievalListener() {
- public void messageRetrieved(Message message) {
- try {
- // Determine if the new message was already known (e.g. partial)
- // And create or reload the full message info
- EmailContent.Message localMessage = new EmailContent.Message();
- try {
- // Copy the fields that are available into the message
- LegacyConversions.updateMessageFields(localMessage,
- message, account.mId, mailbox.mId);
- // Commit the message to the local store
- saveOrUpdate(localMessage, mContext);
- localMessage.mMailboxKey = destMailboxId;
- // We load 50k or so; maybe it's complete, maybe not...
- int flag = EmailContent.Message.FLAG_LOADED_COMPLETE;
- // We store the serverId of the source mailbox into protocolSearchInfo
- // This will be used by loadMessageForView, etc. to use the proper remote
- // folder
- localMessage.mProtocolSearchInfo = mailbox.mServerId;
- if (message.getSize() > Store.FETCH_BODY_SANE_SUGGESTED_SIZE) {
- flag = EmailContent.Message.FLAG_LOADED_PARTIAL;
- }
- copyOneMessageToProvider(message, localMessage, flag, mContext);
- } catch (MessagingException me) {
- Log.e(Logging.LOG_TAG,
- "Error while copying downloaded message." + me);
- }
- } catch (Exception e) {
- Log.e(Logging.LOG_TAG,
- "Error while storing downloaded message." + e.toString());
- }
- }
-
- @Override
- public void loadAttachmentProgress(int progress) {
- }
- });
- return numSearchResults;
- }
-
-
- /**
- * Generic synchronizer - used for POP3 and IMAP.
- *
- * TODO Break this method up into smaller chunks.
- *
- * @param account the account to sync
- * @param mailbox the mailbox to sync
- * @return results of the sync pass
- * @throws MessagingException
- */
- private SyncResults synchronizeMailboxGeneric(final Account account, final Mailbox mailbox)
- throws MessagingException {
-
- /*
- * A list of IDs for messages that were downloaded and did not have the seen flag set.
- * This serves as the "true" new message count reported to the user via notification.
- */
- final ArrayList<Long> unseenMessages = new ArrayList<Long>();
-
- Log.d(Logging.LOG_TAG, "*** synchronizeMailboxGeneric ***");
- ContentResolver resolver = mContext.getContentResolver();
-
- // 0. We do not ever sync DRAFTS or OUTBOX (down or up)
- if (mailbox.mType == Mailbox.TYPE_DRAFTS || mailbox.mType == Mailbox.TYPE_OUTBOX) {
- int totalMessages = EmailContent.count(mContext, mailbox.getUri(), null, null);
- return new SyncResults(totalMessages, unseenMessages);
- }
-
- // 1. Get the message list from the local store and create an index of the uids
-
- Cursor localUidCursor = null;
- HashMap<String, LocalMessageInfo> localMessageMap = new HashMap<String, LocalMessageInfo>();
-
- try {
- localUidCursor = resolver.query(
- EmailContent.Message.CONTENT_URI,
- LocalMessageInfo.PROJECTION,
- EmailContent.MessageColumns.ACCOUNT_KEY + "=?" +
- " AND " + MessageColumns.MAILBOX_KEY + "=?",
- new String[] {
- String.valueOf(account.mId),
- String.valueOf(mailbox.mId)
- },
- null);
- while (localUidCursor.moveToNext()) {
- LocalMessageInfo info = new LocalMessageInfo(localUidCursor);
- localMessageMap.put(info.mServerId, info);
- }
- } finally {
- if (localUidCursor != null) {
- localUidCursor.close();
- }
- }
-
- // 2. Open the remote folder and create the remote folder if necessary
-
- Store remoteStore = Store.getInstance(account, mContext);
- // The account might have been deleted
- if (remoteStore == null) return null;
- Folder remoteFolder = remoteStore.getFolder(mailbox.mServerId);
-
- /*
- * If the folder is a "special" folder we need to see if it exists
- * on the remote server. It if does not exist we'll try to create it. If we
- * can't create we'll abort. This will happen on every single Pop3 folder as
- * designed and on Imap folders during error conditions. This allows us
- * to treat Pop3 and Imap the same in this code.
- */
- if (mailbox.mType == Mailbox.TYPE_TRASH || mailbox.mType == Mailbox.TYPE_SENT
- || mailbox.mType == Mailbox.TYPE_DRAFTS) {
- if (!remoteFolder.exists()) {
- if (!remoteFolder.create(FolderType.HOLDS_MESSAGES)) {
- return new SyncResults(0, unseenMessages);
- }
- }
- }
-
- // 3, Open the remote folder. This pre-loads certain metadata like message count.
- remoteFolder.open(OpenMode.READ_WRITE);
-
- // 4. Trash any remote messages that are marked as trashed locally.
- // TODO - this comment was here, but no code was here.
-
- // 5. Get the remote message count.
- int remoteMessageCount = remoteFolder.getMessageCount();
-
- // 6. Determine the limit # of messages to download
- int visibleLimit = mailbox.mVisibleLimit;
- if (visibleLimit <= 0) {
- visibleLimit = Email.VISIBLE_LIMIT_DEFAULT;
- }
-
- // 7. Create a list of messages to download
- Message[] remoteMessages = new Message[0];
- final ArrayList<Message> unsyncedMessages = new ArrayList<Message>();
- HashMap<String, Message> remoteUidMap = new HashMap<String, Message>();
-
- int newMessageCount = 0;
- if (remoteMessageCount > 0) {
- /*
- * Message numbers start at 1.
- */
- int remoteStart = Math.max(0, remoteMessageCount - visibleLimit) + 1;
- int remoteEnd = remoteMessageCount;
- remoteMessages = remoteFolder.getMessages(remoteStart, remoteEnd, null);
- // TODO Why are we running through the list twice? Combine w/ for loop below
- for (Message message : remoteMessages) {
- remoteUidMap.put(message.getUid(), message);
- }
-
- /*
- * Get a list of the messages that are in the remote list but not on the
- * local store, or messages that are in the local store but failed to download
- * on the last sync. These are the new messages that we will download.
- * Note, we also skip syncing messages which are flagged as "deleted message" sentinels,
- * because they are locally deleted and we don't need or want the old message from
- * the server.
- */
- for (Message message : remoteMessages) {
- LocalMessageInfo localMessage = localMessageMap.get(message.getUid());
- if (localMessage == null) {
- newMessageCount++;
- }
- // localMessage == null -> message has never been created (not even headers)
- // mFlagLoaded = UNLOADED -> message created, but none of body loaded
- // mFlagLoaded = PARTIAL -> message created, a "sane" amt of body has been loaded
- // mFlagLoaded = COMPLETE -> message body has been completely loaded
- // mFlagLoaded = DELETED -> message has been deleted
- // Only the first two of these are "unsynced", so let's retrieve them
- if (localMessage == null ||
- (localMessage.mFlagLoaded == EmailContent.Message.FLAG_LOADED_UNLOADED)) {
- unsyncedMessages.add(message);
- }
- }
- }
-
- // 8. Download basic info about the new/unloaded messages (if any)
- /*
- * Fetch the flags and envelope only of the new messages. This is intended to get us
- * critical data as fast as possible, and then we'll fill in the details.
- */
- if (unsyncedMessages.size() > 0) {
- downloadFlagAndEnvelope(account, mailbox, remoteFolder, unsyncedMessages,
- localMessageMap, unseenMessages);
- }
-
- // 9. Refresh the flags for any messages in the local store that we didn't just download.
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.FLAGS);
- remoteFolder.fetch(remoteMessages, fp, null);
- boolean remoteSupportsSeen = false;
- boolean remoteSupportsFlagged = false;
- boolean remoteSupportsAnswered = false;
- for (Flag flag : remoteFolder.getPermanentFlags()) {
- if (flag == Flag.SEEN) {
- remoteSupportsSeen = true;
- }
- if (flag == Flag.FLAGGED) {
- remoteSupportsFlagged = true;
- }
- if (flag == Flag.ANSWERED) {
- remoteSupportsAnswered = true;
- }
- }
- // Update SEEN/FLAGGED/ANSWERED (star) flags (if supported remotely - e.g. not for POP3)
- if (remoteSupportsSeen || remoteSupportsFlagged || remoteSupportsAnswered) {
- for (Message remoteMessage : remoteMessages) {
- LocalMessageInfo localMessageInfo = localMessageMap.get(remoteMessage.getUid());
- if (localMessageInfo == null) {
- continue;
- }
- boolean localSeen = localMessageInfo.mFlagRead;
- boolean remoteSeen = remoteMessage.isSet(Flag.SEEN);
- boolean newSeen = (remoteSupportsSeen && (remoteSeen != localSeen));
- boolean localFlagged = localMessageInfo.mFlagFavorite;
- boolean remoteFlagged = remoteMessage.isSet(Flag.FLAGGED);
- boolean newFlagged = (remoteSupportsFlagged && (localFlagged != remoteFlagged));
- int localFlags = localMessageInfo.mFlags;
- boolean localAnswered = (localFlags & EmailContent.Message.FLAG_REPLIED_TO) != 0;
- boolean remoteAnswered = remoteMessage.isSet(Flag.ANSWERED);
- boolean newAnswered = (remoteSupportsAnswered && (localAnswered != remoteAnswered));
- if (newSeen || newFlagged || newAnswered) {
- Uri uri = ContentUris.withAppendedId(
- EmailContent.Message.CONTENT_URI, localMessageInfo.mId);
- ContentValues updateValues = new ContentValues();
- updateValues.put(MessageColumns.FLAG_READ, remoteSeen);
- updateValues.put(MessageColumns.FLAG_FAVORITE, remoteFlagged);
- if (remoteAnswered) {
- localFlags |= EmailContent.Message.FLAG_REPLIED_TO;
- } else {
- localFlags &= ~EmailContent.Message.FLAG_REPLIED_TO;
- }
- updateValues.put(MessageColumns.FLAGS, localFlags);
- resolver.update(uri, updateValues, null, null);
- }
- }
- }
-
- // 10. Remove any messages that are in the local store but no longer on the remote store.
- HashSet<String> localUidsToDelete = new HashSet<String>(localMessageMap.keySet());
- localUidsToDelete.removeAll(remoteUidMap.keySet());
- for (String uidToDelete : localUidsToDelete) {
- LocalMessageInfo infoToDelete = localMessageMap.get(uidToDelete);
-
- // Delete associated data (attachment files)
- // Attachment & Body records are auto-deleted when we delete the Message record
- AttachmentUtilities.deleteAllAttachmentFiles(mContext, account.mId,
- infoToDelete.mId);
-
- // Delete the message itself
- Uri uriToDelete = ContentUris.withAppendedId(
- EmailContent.Message.CONTENT_URI, infoToDelete.mId);
- resolver.delete(uriToDelete, null, null);
-
- // Delete extra rows (e.g. synced or deleted)
- Uri syncRowToDelete = ContentUris.withAppendedId(
- EmailContent.Message.UPDATED_CONTENT_URI, infoToDelete.mId);
- resolver.delete(syncRowToDelete, null, null);
- Uri deletERowToDelete = ContentUris.withAppendedId(
- EmailContent.Message.UPDATED_CONTENT_URI, infoToDelete.mId);
- resolver.delete(deletERowToDelete, null, null);
- }
-
- loadUnsyncedMessages(account, remoteFolder, unsyncedMessages, mailbox);
-
- // 14. Clean up and report results
- remoteFolder.close(false);
-
- return new SyncResults(remoteMessageCount, unseenMessages);
- }
-
- /**
- * Copy one downloaded message (which may have partially-loaded sections)
- * into a newly created EmailProvider Message, given the account and mailbox
- *
- * @param message the remote message we've just downloaded
- * @param account the account it will be stored into
- * @param folder the mailbox it will be stored into
- * @param loadStatus when complete, the message will be marked with this status (e.g.
- * EmailContent.Message.LOADED)
- */
- public void copyOneMessageToProvider(Message message, Account account,
- Mailbox folder, int loadStatus) {
- EmailContent.Message localMessage = null;
- Cursor c = null;
- try {
- c = mContext.getContentResolver().query(
- EmailContent.Message.CONTENT_URI,
- EmailContent.Message.CONTENT_PROJECTION,
- EmailContent.MessageColumns.ACCOUNT_KEY + "=?" +
- " AND " + MessageColumns.MAILBOX_KEY + "=?" +
- " AND " + SyncColumns.SERVER_ID + "=?",
- new String[] {
- String.valueOf(account.mId),
- String.valueOf(folder.mId),
- String.valueOf(message.getUid())
- },
- null);
- if (c.moveToNext()) {
- localMessage = EmailContent.getContent(c, EmailContent.Message.class);
- localMessage.mMailboxKey = folder.mId;
- localMessage.mAccountKey = account.mId;
- copyOneMessageToProvider(message, localMessage, loadStatus, mContext);
- }
- } finally {
- if (c != null) {
- c.close();
- }
- }
- }
-
- /**
- * Copy one downloaded message (which may have partially-loaded sections)
- * into an already-created EmailProvider Message
- *
- * @param message the remote message we've just downloaded
- * @param localMessage the EmailProvider Message, already created
- * @param loadStatus when complete, the message will be marked with this status (e.g.
- * EmailContent.Message.LOADED)
- * @param context the context to be used for EmailProvider
- */
- public void copyOneMessageToProvider(Message message, EmailContent.Message localMessage,
- int loadStatus, Context context) {
- try {
-
- EmailContent.Body body = EmailContent.Body.restoreBodyWithMessageId(context,
- localMessage.mId);
- if (body == null) {
- body = new EmailContent.Body();
- }
- try {
- // Copy the fields that are available into the message object
- LegacyConversions.updateMessageFields(localMessage, message,
- localMessage.mAccountKey, localMessage.mMailboxKey);
-
- // Now process body parts & attachments
- ArrayList<Part> viewables = new ArrayList<Part>();
- ArrayList<Part> attachments = new ArrayList<Part>();
- MimeUtility.collectParts(message, viewables, attachments);
-
- ConversionUtilities.updateBodyFields(body, localMessage, viewables);
-
- // Commit the message & body to the local store immediately
- saveOrUpdate(localMessage, context);
- saveOrUpdate(body, context);
-
- // process (and save) attachments
- LegacyConversions.updateAttachments(context, localMessage, attachments);
-
- // One last update of message with two updated flags
- localMessage.mFlagLoaded = loadStatus;
-
- ContentValues cv = new ContentValues();
- cv.put(EmailContent.MessageColumns.FLAG_ATTACHMENT, localMessage.mFlagAttachment);
- cv.put(EmailContent.MessageColumns.FLAG_LOADED, localMessage.mFlagLoaded);
- Uri uri = ContentUris.withAppendedId(EmailContent.Message.CONTENT_URI,
- localMessage.mId);
- context.getContentResolver().update(uri, cv, null, null);
-
- } catch (MessagingException me) {
- Log.e(Logging.LOG_TAG, "Error while copying downloaded message." + me);
- }
-
- } catch (RuntimeException rte) {
- Log.e(Logging.LOG_TAG, "Error while storing downloaded message." + rte.toString());
- } catch (IOException ioe) {
- Log.e(Logging.LOG_TAG, "Error while storing attachment." + ioe.toString());
- }
- }
-
- public void processPendingActions(final long accountId) {
- put("processPendingActions", null, new Runnable() {
- public void run() {
- try {
- Account account = Account.restoreAccountWithId(mContext, accountId);
- if (account == null) {
- return;
- }
- processPendingActionsSynchronous(account);
- }
- catch (MessagingException me) {
- if (Logging.LOGD) {
- Log.v(Logging.LOG_TAG, "processPendingActions", me);
- }
- /*
- * Ignore any exceptions from the commands. Commands will be processed
- * on the next round.
- */
- }
- }
- });
- }
-
- /**
- * Find messages in the updated table that need to be written back to server.
- *
- * Handles:
- * Read/Unread
- * Flagged
- * Append (upload)
- * Move To Trash
- * Empty trash
- * TODO:
- * Move
- *
- * @param account the account to scan for pending actions
- * @throws MessagingException
- */
- private void processPendingActionsSynchronous(Account account)
- throws MessagingException {
- TrafficStats.setThreadStatsTag(TrafficFlags.getSyncFlags(mContext, account));
- ContentResolver resolver = mContext.getContentResolver();
- String[] accountIdArgs = new String[] { Long.toString(account.mId) };
-
- // Handle deletes first, it's always better to get rid of things first
- processPendingDeletesSynchronous(account, resolver, accountIdArgs);
-
- // Handle uploads (currently, only to sent messages)
- processPendingUploadsSynchronous(account, resolver, accountIdArgs);
-
- // Now handle updates / upsyncs
- processPendingUpdatesSynchronous(account, resolver, accountIdArgs);
- }
-
- /**
- * Get the mailbox corresponding to the remote location of a message; this will normally be
- * the mailbox whose _id is mailboxKey, except for search results, where we must look it up
- * by serverId
- * @param message the message in question
- * @return the mailbox in which the message resides on the server
- */
- private Mailbox getRemoteMailboxForMessage(EmailContent.Message message) {
- // If this is a search result, use the protocolSearchInfo field to get the server info
- if (!TextUtils.isEmpty(message.mProtocolSearchInfo)) {
- long accountKey = message.mAccountKey;
- String protocolSearchInfo = message.mProtocolSearchInfo;
- if (accountKey == mLastSearchAccountKey &&
- protocolSearchInfo.equals(mLastSearchServerId)) {
- return mLastSearchRemoteMailbox;
- }
- Cursor c = mContext.getContentResolver().query(Mailbox.CONTENT_URI,
- Mailbox.CONTENT_PROJECTION, Mailbox.PATH_AND_ACCOUNT_SELECTION,
- new String[] {protocolSearchInfo, Long.toString(accountKey)},
- null);
- try {
- if (c.moveToNext()) {
- Mailbox mailbox = new Mailbox();
- mailbox.restore(c);
- mLastSearchAccountKey = accountKey;
- mLastSearchServerId = protocolSearchInfo;
- mLastSearchRemoteMailbox = mailbox;
- return mailbox;
- } else {
- return null;
- }
- } finally {
- c.close();
- }
- } else {
- return Mailbox.restoreMailboxWithId(mContext, message.mMailboxKey);
- }
- }
-
- /**
- * Scan for messages that are in the Message_Deletes table, look for differences that
- * we can deal with, and do the work.
- *
- * @param account
- * @param resolver
- * @param accountIdArgs
- */
- private void processPendingDeletesSynchronous(Account account,
- ContentResolver resolver, String[] accountIdArgs) {
- Cursor deletes = resolver.query(EmailContent.Message.DELETED_CONTENT_URI,
- EmailContent.Message.CONTENT_PROJECTION,
- EmailContent.MessageColumns.ACCOUNT_KEY + "=?", accountIdArgs,
- EmailContent.MessageColumns.MAILBOX_KEY);
- long lastMessageId = -1;
- try {
- // Defer setting up the store until we know we need to access it
- Store remoteStore = null;
- // loop through messages marked as deleted
- while (deletes.moveToNext()) {
- boolean deleteFromTrash = false;
-
- EmailContent.Message oldMessage =
- EmailContent.getContent(deletes, EmailContent.Message.class);
-
- if (oldMessage != null) {
- lastMessageId = oldMessage.mId;
-
- Mailbox mailbox = getRemoteMailboxForMessage(oldMessage);
- if (mailbox == null) {
- continue; // Mailbox removed. Move to the next message.
- }
- deleteFromTrash = mailbox.mType == Mailbox.TYPE_TRASH;
-
- // Load the remote store if it will be needed
- if (remoteStore == null && deleteFromTrash) {
- remoteStore = Store.getInstance(account, mContext);
- }
-
- // Dispatch here for specific change types
- if (deleteFromTrash) {
- // Move message to trash
- processPendingDeleteFromTrash(remoteStore, account, mailbox, oldMessage);
- }
- }
-
- // Finally, delete the update
- Uri uri = ContentUris.withAppendedId(EmailContent.Message.DELETED_CONTENT_URI,
- oldMessage.mId);
- resolver.delete(uri, null, null);
- }
- } catch (MessagingException me) {
- // Presumably an error here is an account connection failure, so there is
- // no point in continuing through the rest of the pending updates.
- if (Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "Unable to process pending delete for id="
- + lastMessageId + ": " + me);
- }
- } finally {
- deletes.close();
- }
- }
-
- /**
- * Scan for messages that are in Sent, and are in need of upload,
- * and send them to the server. "In need of upload" is defined as:
- * serverId == null (no UID has been assigned)
- * or
- * message is in the updated list
- *
- * Note we also look for messages that are moving from drafts->outbox->sent. They never
- * go through "drafts" or "outbox" on the server, so we hang onto these until they can be
- * uploaded directly to the Sent folder.
- *
- * @param account
- * @param resolver
- * @param accountIdArgs
- */
- private void processPendingUploadsSynchronous(Account account,
- ContentResolver resolver, String[] accountIdArgs) {
- // Find the Sent folder (since that's all we're uploading for now
- Cursor mailboxes = resolver.query(Mailbox.CONTENT_URI, Mailbox.ID_PROJECTION,
- MailboxColumns.ACCOUNT_KEY + "=?"
- + " and " + MailboxColumns.TYPE + "=" + Mailbox.TYPE_SENT,
- accountIdArgs, null);
- long lastMessageId = -1;
- try {
- // Defer setting up the store until we know we need to access it
- Store remoteStore = null;
- while (mailboxes.moveToNext()) {
- long mailboxId = mailboxes.getLong(Mailbox.ID_PROJECTION_COLUMN);
- String[] mailboxKeyArgs = new String[] { Long.toString(mailboxId) };
- // Demand load mailbox
- Mailbox mailbox = null;
-
- // First handle the "new" messages (serverId == null)
- Cursor upsyncs1 = resolver.query(EmailContent.Message.CONTENT_URI,
- EmailContent.Message.ID_PROJECTION,
- EmailContent.Message.MAILBOX_KEY + "=?"
- + " and (" + EmailContent.Message.SERVER_ID + " is null"
- + " or " + EmailContent.Message.SERVER_ID + "=''" + ")",
- mailboxKeyArgs,
- null);
- try {
- while (upsyncs1.moveToNext()) {
- // Load the remote store if it will be needed
- if (remoteStore == null) {
- remoteStore = Store.getInstance(account, mContext);
- }
- // Load the mailbox if it will be needed
- if (mailbox == null) {
- mailbox = Mailbox.restoreMailboxWithId(mContext, mailboxId);
- if (mailbox == null) {
- continue; // Mailbox removed. Move to the next message.
- }
- }
- // upsync the message
- long id = upsyncs1.getLong(EmailContent.Message.ID_PROJECTION_COLUMN);
- lastMessageId = id;
- processUploadMessage(resolver, remoteStore, account, mailbox, id);
- }
- } finally {
- if (upsyncs1 != null) {
- upsyncs1.close();
- }
- }
-
- // Next, handle any updates (e.g. edited in place, although this shouldn't happen)
- Cursor upsyncs2 = resolver.query(EmailContent.Message.UPDATED_CONTENT_URI,
- EmailContent.Message.ID_PROJECTION,
- EmailContent.MessageColumns.MAILBOX_KEY + "=?", mailboxKeyArgs,
- null);
- try {
- while (upsyncs2.moveToNext()) {
- // Load the remote store if it will be needed
- if (remoteStore == null) {
- remoteStore = Store.getInstance(account, mContext);
- }
- // Load the mailbox if it will be needed
- if (mailbox == null) {
- mailbox = Mailbox.restoreMailboxWithId(mContext, mailboxId);
- if (mailbox == null) {
- continue; // Mailbox removed. Move to the next message.
- }
- }
- // upsync the message
- long id = upsyncs2.getLong(EmailContent.Message.ID_PROJECTION_COLUMN);
- lastMessageId = id;
- processUploadMessage(resolver, remoteStore, account, mailbox, id);
- }
- } finally {
- if (upsyncs2 != null) {
- upsyncs2.close();
- }
- }
- }
- } catch (MessagingException me) {
- // Presumably an error here is an account connection failure, so there is
- // no point in continuing through the rest of the pending updates.
- if (Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "Unable to process pending upsync for id="
- + lastMessageId + ": " + me);
- }
- } finally {
- if (mailboxes != null) {
- mailboxes.close();
- }
- }
- }
-
- /**
- * Scan for messages that are in the Message_Updates table, look for differences that
- * we can deal with, and do the work.
- *
- * @param account
- * @param resolver
- * @param accountIdArgs
- */
- private void processPendingUpdatesSynchronous(Account account,
- ContentResolver resolver, String[] accountIdArgs) {
- Cursor updates = resolver.query(EmailContent.Message.UPDATED_CONTENT_URI,
- EmailContent.Message.CONTENT_PROJECTION,
- EmailContent.MessageColumns.ACCOUNT_KEY + "=?", accountIdArgs,
- EmailContent.MessageColumns.MAILBOX_KEY);
- long lastMessageId = -1;
- try {
- // Defer setting up the store until we know we need to access it
- Store remoteStore = null;
- // Demand load mailbox (note order-by to reduce thrashing here)
- Mailbox mailbox = null;
- // loop through messages marked as needing updates
- while (updates.moveToNext()) {
- boolean changeMoveToTrash = false;
- boolean changeRead = false;
- boolean changeFlagged = false;
- boolean changeMailbox = false;
- boolean changeAnswered = false;
-
- EmailContent.Message oldMessage =
- EmailContent.getContent(updates, EmailContent.Message.class);
- lastMessageId = oldMessage.mId;
- EmailContent.Message newMessage =
- EmailContent.Message.restoreMessageWithId(mContext, oldMessage.mId);
- if (newMessage != null) {
- mailbox = Mailbox.restoreMailboxWithId(mContext, newMessage.mMailboxKey);
- if (mailbox == null) {
- continue; // Mailbox removed. Move to the next message.
- }
- if (oldMessage.mMailboxKey != newMessage.mMailboxKey) {
- if (mailbox.mType == Mailbox.TYPE_TRASH) {
- changeMoveToTrash = true;
- } else {
- changeMailbox = true;
- }
- }
- changeRead = oldMessage.mFlagRead != newMessage.mFlagRead;
- changeFlagged = oldMessage.mFlagFavorite != newMessage.mFlagFavorite;
- changeAnswered = (oldMessage.mFlags & EmailContent.Message.FLAG_REPLIED_TO) !=
- (newMessage.mFlags & EmailContent.Message.FLAG_REPLIED_TO);
- }
-
- // Load the remote store if it will be needed
- if (remoteStore == null &&
- (changeMoveToTrash || changeRead || changeFlagged || changeMailbox ||
- changeAnswered)) {
- remoteStore = Store.getInstance(account, mContext);
- }
-
- // Dispatch here for specific change types
- if (changeMoveToTrash) {
- // Move message to trash
- processPendingMoveToTrash(remoteStore, account, mailbox, oldMessage,
- newMessage);
- } else if (changeRead || changeFlagged || changeMailbox || changeAnswered) {
- processPendingDataChange(remoteStore, mailbox, changeRead, changeFlagged,
- changeMailbox, changeAnswered, oldMessage, newMessage);
- }
-
- // Finally, delete the update
- Uri uri = ContentUris.withAppendedId(EmailContent.Message.UPDATED_CONTENT_URI,
- oldMessage.mId);
- resolver.delete(uri, null, null);
- }
-
- } catch (MessagingException me) {
- // Presumably an error here is an account connection failure, so there is
- // no point in continuing through the rest of the pending updates.
- if (Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "Unable to process pending update for id="
- + lastMessageId + ": " + me);
- }
- } finally {
- updates.close();
- }
- }
-
- /**
- * Upsync an entire message. This must also unwind whatever triggered it (either by
- * updating the serverId, or by deleting the update record, or it's going to keep happening
- * over and over again.
- *
- * Note: If the message is being uploaded into an unexpected mailbox, we *do not* upload.
- * This is to avoid unnecessary uploads into the trash. Although the caller attempts to select
- * only the Drafts and Sent folders, this can happen when the update record and the current
- * record mismatch. In this case, we let the update record remain, because the filters
- * in processPendingUpdatesSynchronous() will pick it up as a move and handle it (or drop it)
- * appropriately.
- *
- * @param resolver
- * @param remoteStore
- * @param account
- * @param mailbox the actual mailbox
- * @param messageId
- */
- private void processUploadMessage(ContentResolver resolver, Store remoteStore,
- Account account, Mailbox mailbox, long messageId)
- throws MessagingException {
- EmailContent.Message newMessage =
- EmailContent.Message.restoreMessageWithId(mContext, messageId);
- boolean deleteUpdate = false;
- if (newMessage == null) {
- deleteUpdate = true;
- Log.d(Logging.LOG_TAG, "Upsync failed for null message, id=" + messageId);
- } else if (mailbox.mType == Mailbox.TYPE_DRAFTS) {
- deleteUpdate = false;
- Log.d(Logging.LOG_TAG, "Upsync skipped for mailbox=drafts, id=" + messageId);
- } else if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
- deleteUpdate = false;
- Log.d(Logging.LOG_TAG, "Upsync skipped for mailbox=outbox, id=" + messageId);
- } else if (mailbox.mType == Mailbox.TYPE_TRASH) {
- deleteUpdate = false;
- Log.d(Logging.LOG_TAG, "Upsync skipped for mailbox=trash, id=" + messageId);
- } else if (newMessage != null && newMessage.mMailboxKey != mailbox.mId) {
- deleteUpdate = false;
- Log.d(Logging.LOG_TAG, "Upsync skipped; mailbox changed, id=" + messageId);
- } else {
- Log.d(Logging.LOG_TAG, "Upsyc triggered for message id=" + messageId);
- deleteUpdate = processPendingAppend(remoteStore, account, mailbox, newMessage);
- }
- if (deleteUpdate) {
- // Finally, delete the update (if any)
- Uri uri = ContentUris.withAppendedId(
- EmailContent.Message.UPDATED_CONTENT_URI, messageId);
- resolver.delete(uri, null, null);
- }
- }
-
- /**
- * Upsync changes to read, flagged, or mailbox
- *
- * @param remoteStore the remote store for this mailbox
- * @param mailbox the mailbox the message is stored in
- * @param changeRead whether the message's read state has changed
- * @param changeFlagged whether the message's flagged state has changed
- * @param changeMailbox whether the message's mailbox has changed
- * @param oldMessage the message in it's pre-change state
- * @param newMessage the current version of the message
- */
- private void processPendingDataChange(Store remoteStore, Mailbox mailbox, boolean changeRead,
- boolean changeFlagged, boolean changeMailbox, boolean changeAnswered,
- EmailContent.Message oldMessage, final EmailContent.Message newMessage)
- throws MessagingException {
- // New mailbox is the mailbox this message WILL be in (same as the one it WAS in if it isn't
- // being moved
- Mailbox newMailbox = mailbox;
- // Mailbox is the original remote mailbox (the one we're acting on)
- mailbox = getRemoteMailboxForMessage(oldMessage);
-
- // 0. No remote update if the message is local-only
- if (newMessage.mServerId == null || newMessage.mServerId.equals("")
- || newMessage.mServerId.startsWith(LOCAL_SERVERID_PREFIX) || (mailbox == null)) {
- return;
- }
-
- // 1. No remote update for DRAFTS or OUTBOX
- if (mailbox.mType == Mailbox.TYPE_DRAFTS || mailbox.mType == Mailbox.TYPE_OUTBOX) {
- return;
- }
-
- // 2. Open the remote store & folder
- Folder remoteFolder = remoteStore.getFolder(mailbox.mServerId);
- if (!remoteFolder.exists()) {
- return;
- }
- remoteFolder.open(OpenMode.READ_WRITE);
- if (remoteFolder.getMode() != OpenMode.READ_WRITE) {
- return;
- }
-
- // 3. Finally, apply the changes to the message
- Message remoteMessage = remoteFolder.getMessage(newMessage.mServerId);
- if (remoteMessage == null) {
- return;
- }
- if (Email.DEBUG) {
- Log.d(Logging.LOG_TAG,
- "Update for msg id=" + newMessage.mId
- + " read=" + newMessage.mFlagRead
- + " flagged=" + newMessage.mFlagFavorite
- + " answered="
- + ((newMessage.mFlags & EmailContent.Message.FLAG_REPLIED_TO) != 0)
- + " new mailbox=" + newMessage.mMailboxKey);
- }
- Message[] messages = new Message[] { remoteMessage };
- if (changeRead) {
- remoteFolder.setFlags(messages, FLAG_LIST_SEEN, newMessage.mFlagRead);
- }
- if (changeFlagged) {
- remoteFolder.setFlags(messages, FLAG_LIST_FLAGGED, newMessage.mFlagFavorite);
- }
- if (changeAnswered) {
- remoteFolder.setFlags(messages, FLAG_LIST_ANSWERED,
- (newMessage.mFlags & EmailContent.Message.FLAG_REPLIED_TO) != 0);
- }
- if (changeMailbox) {
- Folder toFolder = remoteStore.getFolder(newMailbox.mServerId);
- if (!remoteFolder.exists()) {
- return;
- }
- // We may need the message id to search for the message in the destination folder
- remoteMessage.setMessageId(newMessage.mMessageId);
- // Copy the message to its new folder
- remoteFolder.copyMessages(messages, toFolder, new MessageUpdateCallbacks() {
- @Override
- public void onMessageUidChange(Message message, String newUid) {
- ContentValues cv = new ContentValues();
- cv.put(EmailContent.Message.SERVER_ID, newUid);
- // We only have one message, so, any updates _must_ be for it. Otherwise,
- // we'd have to cycle through to find the one with the same server ID.
- mContext.getContentResolver().update(ContentUris.withAppendedId(
- EmailContent.Message.CONTENT_URI, newMessage.mId), cv, null, null);
- }
- @Override
- public void onMessageNotFound(Message message) {
- }
- });
- // Delete the message from the remote source folder
- remoteMessage.setFlag(Flag.DELETED, true);
- remoteFolder.expunge();
- }
- remoteFolder.close(false);
- }
-
- /**
- * Process a pending trash message command.
- *
- * @param remoteStore the remote store we're working in
- * @param account The account in which we are working
- * @param newMailbox The local trash mailbox
- * @param oldMessage The message copy that was saved in the updates shadow table
- * @param newMessage The message that was moved to the mailbox
- */
- private void processPendingMoveToTrash(Store remoteStore,
- Account account, Mailbox newMailbox, EmailContent.Message oldMessage,
- final EmailContent.Message newMessage) throws MessagingException {
-
- // 0. No remote move if the message is local-only
- if (newMessage.mServerId == null || newMessage.mServerId.equals("")
- || newMessage.mServerId.startsWith(LOCAL_SERVERID_PREFIX)) {
- return;
- }
-
- // 1. Escape early if we can't find the local mailbox
- // TODO smaller projection here
- Mailbox oldMailbox = getRemoteMailboxForMessage(oldMessage);
- if (oldMailbox == null) {
- // can't find old mailbox, it may have been deleted. just return.
- return;
- }
- // 2. We don't support delete-from-trash here
- if (oldMailbox.mType == Mailbox.TYPE_TRASH) {
- return;
- }
-
- // 3. If DELETE_POLICY_NEVER, simply write back the deleted sentinel and return
- //
- // This sentinel takes the place of the server-side message, and locally "deletes" it
- // by inhibiting future sync or display of the message. It will eventually go out of
- // scope when it becomes old, or is deleted on the server, and the regular sync code
- // will clean it up for us.
- if (account.getDeletePolicy() == Account.DELETE_POLICY_NEVER) {
- EmailContent.Message sentinel = new EmailContent.Message();
- sentinel.mAccountKey = oldMessage.mAccountKey;
- sentinel.mMailboxKey = oldMessage.mMailboxKey;
- sentinel.mFlagLoaded = EmailContent.Message.FLAG_LOADED_DELETED;
- sentinel.mFlagRead = true;
- sentinel.mServerId = oldMessage.mServerId;
- sentinel.save(mContext);
-
- return;
- }
-
- // The rest of this method handles server-side deletion
-
- // 4. Find the remote mailbox (that we deleted from), and open it
- Folder remoteFolder = remoteStore.getFolder(oldMailbox.mServerId);
- if (!remoteFolder.exists()) {
- return;
- }
-
- remoteFolder.open(OpenMode.READ_WRITE);
- if (remoteFolder.getMode() != OpenMode.READ_WRITE) {
- remoteFolder.close(false);
- return;
- }
-
- // 5. Find the remote original message
- Message remoteMessage = remoteFolder.getMessage(oldMessage.mServerId);
- if (remoteMessage == null) {
- remoteFolder.close(false);
- return;
- }
-
- // 6. Find the remote trash folder, and create it if not found
- Folder remoteTrashFolder = remoteStore.getFolder(newMailbox.mServerId);
- if (!remoteTrashFolder.exists()) {
- /*
- * If the remote trash folder doesn't exist we try to create it.
- */
- remoteTrashFolder.create(FolderType.HOLDS_MESSAGES);
- }
-
- // 7. Try to copy the message into the remote trash folder
- // Note, this entire section will be skipped for POP3 because there's no remote trash
- if (remoteTrashFolder.exists()) {
- /*
- * Because remoteTrashFolder may be new, we need to explicitly open it
- */
- remoteTrashFolder.open(OpenMode.READ_WRITE);
- if (remoteTrashFolder.getMode() != OpenMode.READ_WRITE) {
- remoteFolder.close(false);
- remoteTrashFolder.close(false);
- return;
- }
-
- remoteFolder.copyMessages(new Message[] { remoteMessage }, remoteTrashFolder,
- new Folder.MessageUpdateCallbacks() {
- public void onMessageUidChange(Message message, String newUid) {
- // update the UID in the local trash folder, because some stores will
- // have to change it when copying to remoteTrashFolder
- ContentValues cv = new ContentValues();
- cv.put(EmailContent.Message.SERVER_ID, newUid);
- mContext.getContentResolver().update(newMessage.getUri(), cv, null, null);
- }
-
- /**
- * This will be called if the deleted message doesn't exist and can't be
- * deleted (e.g. it was already deleted from the server.) In this case,
- * attempt to delete the local copy as well.
- */
- public void onMessageNotFound(Message message) {
- mContext.getContentResolver().delete(newMessage.getUri(), null, null);
- }
- });
- remoteTrashFolder.close(false);
- }
-
- // 8. Delete the message from the remote source folder
- remoteMessage.setFlag(Flag.DELETED, true);
- remoteFolder.expunge();
- remoteFolder.close(false);
- }
-
- /**
- * Process a pending trash message command.
- *
- * @param remoteStore the remote store we're working in
- * @param account The account in which we are working
- * @param oldMailbox The local trash mailbox
- * @param oldMessage The message that was deleted from the trash
- */
- private void processPendingDeleteFromTrash(Store remoteStore,
- Account account, Mailbox oldMailbox, EmailContent.Message oldMessage)
- throws MessagingException {
-
- // 1. We only support delete-from-trash here
- if (oldMailbox.mType != Mailbox.TYPE_TRASH) {
- return;
- }
-
- // 2. Find the remote trash folder (that we are deleting from), and open it
- Folder remoteTrashFolder = remoteStore.getFolder(oldMailbox.mServerId);
- if (!remoteTrashFolder.exists()) {
- return;
- }
-
- remoteTrashFolder.open(OpenMode.READ_WRITE);
- if (remoteTrashFolder.getMode() != OpenMode.READ_WRITE) {
- remoteTrashFolder.close(false);
- return;
- }
-
- // 3. Find the remote original message
- Message remoteMessage = remoteTrashFolder.getMessage(oldMessage.mServerId);
- if (remoteMessage == null) {
- remoteTrashFolder.close(false);
- return;
- }
-
- // 4. Delete the message from the remote trash folder
- remoteMessage.setFlag(Flag.DELETED, true);
- remoteTrashFolder.expunge();
- remoteTrashFolder.close(false);
- }
-
- /**
- * Process a pending append message command. This command uploads a local message to the
- * server, first checking to be sure that the server message is not newer than
- * the local message.
- *
- * @param remoteStore the remote store we're working in
- * @param account The account in which we are working
- * @param newMailbox The mailbox we're appending to
- * @param message The message we're appending
- * @return true if successfully uploaded
- */
- private boolean processPendingAppend(Store remoteStore, Account account,
- Mailbox newMailbox, EmailContent.Message message)
- throws MessagingException {
-
- boolean updateInternalDate = false;
- boolean updateMessage = false;
- boolean deleteMessage = false;
-
- // 1. Find the remote folder that we're appending to and create and/or open it
- Folder remoteFolder = remoteStore.getFolder(newMailbox.mServerId);
- if (!remoteFolder.exists()) {
- if (!remoteFolder.canCreate(FolderType.HOLDS_MESSAGES)) {
- // This is POP3, we cannot actually upload. Instead, we'll update the message
- // locally with a fake serverId (so we don't keep trying here) and return.
- if (message.mServerId == null || message.mServerId.length() == 0) {
- message.mServerId = LOCAL_SERVERID_PREFIX + message.mId;
- Uri uri =
- ContentUris.withAppendedId(EmailContent.Message.CONTENT_URI, message.mId);
- ContentValues cv = new ContentValues();
- cv.put(EmailContent.Message.SERVER_ID, message.mServerId);
- mContext.getContentResolver().update(uri, cv, null, null);
- }
- return true;
- }
- if (!remoteFolder.create(FolderType.HOLDS_MESSAGES)) {
- // This is a (hopefully) transient error and we return false to try again later
- return false;
- }
- }
- remoteFolder.open(OpenMode.READ_WRITE);
- if (remoteFolder.getMode() != OpenMode.READ_WRITE) {
- return false;
- }
-
- // 2. If possible, load a remote message with the matching UID
- Message remoteMessage = null;
- if (message.mServerId != null && message.mServerId.length() > 0) {
- remoteMessage = remoteFolder.getMessage(message.mServerId);
- }
-
- // 3. If a remote message could not be found, upload our local message
- if (remoteMessage == null) {
- // 3a. Create a legacy message to upload
- Message localMessage = LegacyConversions.makeMessage(mContext, message);
-
- // 3b. Upload it
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.BODY);
- remoteFolder.appendMessages(new Message[] { localMessage });
-
- // 3b. And record the UID from the server
- message.mServerId = localMessage.getUid();
- updateInternalDate = true;
- updateMessage = true;
- } else {
- // 4. If the remote message exists we need to determine which copy to keep.
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.ENVELOPE);
- remoteFolder.fetch(new Message[] { remoteMessage }, fp, null);
- Date localDate = new Date(message.mServerTimeStamp);
- Date remoteDate = remoteMessage.getInternalDate();
- if (remoteDate != null && remoteDate.compareTo(localDate) > 0) {
- // 4a. If the remote message is newer than ours we'll just
- // delete ours and move on. A sync will get the server message
- // if we need to be able to see it.
- deleteMessage = true;
- } else {
- // 4b. Otherwise we'll upload our message and then delete the remote message.
-
- // Create a legacy message to upload
- Message localMessage = LegacyConversions.makeMessage(mContext, message);
-
- // 4c. Upload it
- fp.clear();
- fp = new FetchProfile();
- fp.add(FetchProfile.Item.BODY);
- remoteFolder.appendMessages(new Message[] { localMessage });
-
- // 4d. Record the UID and new internalDate from the server
- message.mServerId = localMessage.getUid();
- updateInternalDate = true;
- updateMessage = true;
-
- // 4e. And delete the old copy of the message from the server
- remoteMessage.setFlag(Flag.DELETED, true);
- }
- }
-
- // 5. If requested, Best-effort to capture new "internaldate" from the server
- if (updateInternalDate && message.mServerId != null) {
- try {
- Message remoteMessage2 = remoteFolder.getMessage(message.mServerId);
- if (remoteMessage2 != null) {
- FetchProfile fp2 = new FetchProfile();
- fp2.add(FetchProfile.Item.ENVELOPE);
- remoteFolder.fetch(new Message[] { remoteMessage2 }, fp2, null);
- message.mServerTimeStamp = remoteMessage2.getInternalDate().getTime();
- updateMessage = true;
- }
- } catch (MessagingException me) {
- // skip it - we can live without this
- }
- }
-
- // 6. Perform required edits to local copy of message
- if (deleteMessage || updateMessage) {
- Uri uri = ContentUris.withAppendedId(EmailContent.Message.CONTENT_URI, message.mId);
- ContentResolver resolver = mContext.getContentResolver();
- if (deleteMessage) {
- resolver.delete(uri, null, null);
- } else if (updateMessage) {
- ContentValues cv = new ContentValues();
- cv.put(EmailContent.Message.SERVER_ID, message.mServerId);
- cv.put(EmailContent.Message.SERVER_TIMESTAMP, message.mServerTimeStamp);
- resolver.update(uri, cv, null, null);
- }
- }
-
- return true;
- }
-
- /**
- * Finish loading a message that have been partially downloaded.
- *
- * @param messageId the message to load
- * @param listener the callback by which results will be reported
- */
- public void loadMessageForView(final long messageId, MessagingListener listener) {
- mListeners.loadMessageForViewStarted(messageId);
- put("loadMessageForViewRemote", listener, new Runnable() {
- public void run() {
- try {
- // 1. Resample the message, in case it disappeared or synced while
- // this command was in queue
- EmailContent.Message message =
- EmailContent.Message.restoreMessageWithId(mContext, messageId);
- if (message == null) {
- mListeners.loadMessageForViewFailed(messageId, "Unknown message");
- return;
- }
- if (message.mFlagLoaded == EmailContent.Message.FLAG_LOADED_COMPLETE) {
- mListeners.loadMessageForViewFinished(messageId);
- return;
- }
-
- // 2. Open the remote folder.
- // TODO combine with common code in loadAttachment
- Account account = Account.restoreAccountWithId(mContext, message.mAccountKey);
- Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, message.mMailboxKey);
- if (account == null || mailbox == null) {
- mListeners.loadMessageForViewFailed(messageId, "null account or mailbox");
- return;
- }
- TrafficStats.setThreadStatsTag(TrafficFlags.getSyncFlags(mContext, account));
-
- Store remoteStore = Store.getInstance(account, mContext);
- String remoteServerId = mailbox.mServerId;
- // If this is a search result, use the protocolSearchInfo field to get the
- // correct remote location
- if (!TextUtils.isEmpty(message.mProtocolSearchInfo)) {
- remoteServerId = message.mProtocolSearchInfo;
- }
- Folder remoteFolder = remoteStore.getFolder(remoteServerId);
- remoteFolder.open(OpenMode.READ_WRITE);
-
- // 3. Set up to download the entire message
- Message remoteMessage = remoteFolder.getMessage(message.mServerId);
- FetchProfile fp = new FetchProfile();
- fp.add(FetchProfile.Item.BODY);
- remoteFolder.fetch(new Message[] { remoteMessage }, fp, null);
-
- // 4. Write to provider
- copyOneMessageToProvider(remoteMessage, account, mailbox,
- EmailContent.Message.FLAG_LOADED_COMPLETE);
-
- // 5. Notify UI
- mListeners.loadMessageForViewFinished(messageId);
-
- } catch (MessagingException me) {
- if (Logging.LOGD) Log.v(Logging.LOG_TAG, "", me);
- mListeners.loadMessageForViewFailed(messageId, me.getMessage());
- } catch (RuntimeException rte) {
- mListeners.loadMessageForViewFailed(messageId, rte.getMessage());
- }
- }
- });
- }
-
- /**
- * Attempts to load the attachment specified by id from the given account and message.
- */
- public void loadAttachment(final long accountId, final long messageId, final long mailboxId,
- final long attachmentId, MessagingListener listener, final boolean background) {
- mListeners.loadAttachmentStarted(accountId, messageId, attachmentId, true);
-
- put("loadAttachment", listener, new Runnable() {
- public void run() {
- try {
- //1. Check if the attachment is already here and return early in that case
- Attachment attachment =
- Attachment.restoreAttachmentWithId(mContext, attachmentId);
- if (attachment == null) {
- mListeners.loadAttachmentFailed(accountId, messageId, attachmentId,
- new MessagingException("The attachment is null"),
- background);
- return;
- }
- if (Utility.attachmentExists(mContext, attachment)) {
- mListeners.loadAttachmentFinished(accountId, messageId, attachmentId);
- return;
- }
-
- // 2. Open the remote folder.
- // TODO all of these could be narrower projections
- Account account = Account.restoreAccountWithId(mContext, accountId);
- Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, mailboxId);
- EmailContent.Message message =
- EmailContent.Message.restoreMessageWithId(mContext, messageId);
-
- if (account == null || mailbox == null || message == null) {
- mListeners.loadAttachmentFailed(accountId, messageId, attachmentId,
- new MessagingException(
- "Account, mailbox, message or attachment are null"),
- background);
- return;
- }
- TrafficStats.setThreadStatsTag(
- TrafficFlags.getAttachmentFlags(mContext, account));
-
- Store remoteStore = Store.getInstance(account, mContext);
- Folder remoteFolder = remoteStore.getFolder(mailbox.mServerId);
- remoteFolder.open(OpenMode.READ_WRITE);
-
- // 3. Generate a shell message in which to retrieve the attachment,
- // and a shell BodyPart for the attachment. Then glue them together.
- Message storeMessage = remoteFolder.createMessage(message.mServerId);
- MimeBodyPart storePart = new MimeBodyPart();
- storePart.setSize((int)attachment.mSize);
- storePart.setHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA,
- attachment.mLocation);
- storePart.setHeader(MimeHeader.HEADER_CONTENT_TYPE,
- String.format("%s;\n name=\"%s\"",
- attachment.mMimeType,
- attachment.mFileName));
- // TODO is this always true for attachments? I think we dropped the
- // true encoding along the way
- storePart.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64");
-
- MimeMultipart multipart = new MimeMultipart();
- multipart.setSubType("mixed");
- multipart.addBodyPart(storePart);
-
- storeMessage.setHeader(MimeHeader.HEADER_CONTENT_TYPE, "multipart/mixed");
- storeMessage.setBody(multipart);
-
- // 4. Now ask for the attachment to be fetched
- FetchProfile fp = new FetchProfile();
- fp.add(storePart);
- remoteFolder.fetch(new Message[] { storeMessage }, fp,
- mController.new MessageRetrievalListenerBridge(
- messageId, attachmentId));
-
- // If we failed to load the attachment, throw an Exception here, so that
- // AttachmentDownloadService knows that we failed
- if (storePart.getBody() == null) {
- throw new MessagingException("Attachment not loaded.");
- }
-
- // 5. Save the downloaded file and update the attachment as necessary
- LegacyConversions.saveAttachmentBody(mContext, storePart, attachment,
- accountId);
-
- // 6. Report success
- mListeners.loadAttachmentFinished(accountId, messageId, attachmentId);
- }
- catch (MessagingException me) {
- if (Logging.LOGD) Log.v(Logging.LOG_TAG, "", me);
- mListeners.loadAttachmentFailed(
- accountId, messageId, attachmentId, me, background);
- } catch (IOException ioe) {
- Log.e(Logging.LOG_TAG, "Error while storing attachment." + ioe.toString());
- }
- }});
- }
-
- /**
- * Attempt to send any messages that are sitting in the Outbox.
- * @param account
- * @param listener
- */
- public void sendPendingMessages(final Account account, final long sentFolderId,
- MessagingListener listener) {
- put("sendPendingMessages", listener, new Runnable() {
- public void run() {
- sendPendingMessagesSynchronous(account, sentFolderId);
- }
- });
- }
-
- /**
- * Attempt to send all messages sitting in the given account's outbox. Optionally,
- * if the server requires it, the message will be moved to the given sent folder.
- */
- public void sendPendingMessagesSynchronous(final Account account,
- long sentFolderId) {
- TrafficStats.setThreadStatsTag(TrafficFlags.getSmtpFlags(mContext, account));
- NotificationController nc = NotificationController.getInstance(mContext);
- // 1. Loop through all messages in the account's outbox
- long outboxId = Mailbox.findMailboxOfType(mContext, account.mId, Mailbox.TYPE_OUTBOX);
- if (outboxId == Mailbox.NO_MAILBOX) {
- return;
- }
- ContentResolver resolver = mContext.getContentResolver();
- Cursor c = resolver.query(EmailContent.Message.CONTENT_URI,
- EmailContent.Message.ID_COLUMN_PROJECTION,
- EmailContent.Message.MAILBOX_KEY + "=?", new String[] { Long.toString(outboxId) },
- null);
- try {
- // 2. exit early
- if (c.getCount() <= 0) {
- return;
- }
- // 3. do one-time setup of the Sender & other stuff
- mListeners.sendPendingMessagesStarted(account.mId, -1);
-
- Sender sender = Sender.getInstance(mContext, account);
- Store remoteStore = Store.getInstance(account, mContext);
- boolean requireMoveMessageToSentFolder = remoteStore.requireCopyMessageToSentFolder();
- ContentValues moveToSentValues = null;
- if (requireMoveMessageToSentFolder) {
- moveToSentValues = new ContentValues();
- moveToSentValues.put(MessageColumns.MAILBOX_KEY, sentFolderId);
- }
-
- // 4. loop through the available messages and send them
- while (c.moveToNext()) {
- long messageId = -1;
- try {
- messageId = c.getLong(0);
- mListeners.sendPendingMessagesStarted(account.mId, messageId);
- // Don't send messages with unloaded attachments
- if (Utility.hasUnloadedAttachments(mContext, messageId)) {
- if (Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "Can't send #" + messageId +
- "; unloaded attachments");
- }
- continue;
- }
- sender.sendMessage(messageId);
- } catch (MessagingException me) {
- // report error for this message, but keep trying others
- if (me instanceof AuthenticationFailedException) {
- nc.showLoginFailedNotification(account.mId);
- }
- mListeners.sendPendingMessagesFailed(account.mId, messageId, me);
- continue;
- }
- // 5. move to sent, or delete
- Uri syncedUri =
- ContentUris.withAppendedId(EmailContent.Message.SYNCED_CONTENT_URI, messageId);
- if (requireMoveMessageToSentFolder) {
- // If this is a forwarded message and it has attachments, delete them, as they
- // duplicate information found elsewhere (on the server). This saves storage.
- EmailContent.Message msg =
- EmailContent.Message.restoreMessageWithId(mContext, messageId);
- if (msg != null &&
- ((msg.mFlags & EmailContent.Message.FLAG_TYPE_FORWARD) != 0)) {
- AttachmentUtilities.deleteAllAttachmentFiles(mContext, account.mId,
- messageId);
- }
- resolver.update(syncedUri, moveToSentValues, null, null);
- } else {
- AttachmentUtilities.deleteAllAttachmentFiles(mContext, account.mId,
- messageId);
- Uri uri =
- ContentUris.withAppendedId(EmailContent.Message.CONTENT_URI, messageId);
- resolver.delete(uri, null, null);
- resolver.delete(syncedUri, null, null);
- }
- }
- // 6. report completion/success
- mListeners.sendPendingMessagesCompleted(account.mId);
- nc.cancelLoginFailedNotification(account.mId);
- } catch (MessagingException me) {
- if (me instanceof AuthenticationFailedException) {
- nc.showLoginFailedNotification(account.mId);
- }
- mListeners.sendPendingMessagesFailed(account.mId, -1, me);
- } finally {
- c.close();
- }
- }
-
- /**
- * Checks mail for an account.
- * This entry point is for use by the mail checking service only, because it
- * gives slightly different callbacks (so the service doesn't get confused by callbacks
- * triggered by/for the foreground UI.
- *
- * TODO clean up the execution model which is unnecessarily threaded due to legacy code
- *
- * @param accountId the account to check
- * @param listener
- */
- public void checkMail(final long accountId, final long tag, final MessagingListener listener) {
- mListeners.checkMailStarted(mContext, accountId, tag);
-
- // This puts the command on the queue (not synchronous)
- listFolders(accountId, null);
-
- // Put this on the queue as well so it follows listFolders
- put("checkMail", listener, new Runnable() {
- public void run() {
- // send any pending outbound messages. note, there is a slight race condition
- // here if we somehow don't have a sent folder, but this should never happen
- // because the call to sendMessage() would have built one previously.
- long inboxId = -1;
- Account account = Account.restoreAccountWithId(mContext, accountId);
- if (account != null) {
- long sentboxId = Mailbox.findMailboxOfType(mContext, accountId,
- Mailbox.TYPE_SENT);
- if (sentboxId != Mailbox.NO_MAILBOX) {
- sendPendingMessagesSynchronous(account, sentboxId);
- }
- // find mailbox # for inbox and sync it.
- // TODO we already know this in Controller, can we pass it in?
- inboxId = Mailbox.findMailboxOfType(mContext, accountId, Mailbox.TYPE_INBOX);
- if (inboxId != Mailbox.NO_MAILBOX) {
- Mailbox mailbox =
- Mailbox.restoreMailboxWithId(mContext, inboxId);
- if (mailbox != null) {
- synchronizeMailboxSynchronous(account, mailbox);
- }
- }
- }
- mListeners.checkMailFinished(mContext, accountId, inboxId, tag);
- }
- });
- }
-
- private static class Command {
- public Runnable runnable;
-
- public MessagingListener listener;
-
- public String description;
-
- @Override
- public String toString() {
- return description;
- }
- }
-
- /** Results of the latest synchronization. */
- private static class SyncResults {
- /** The total # of messages in the folder */
- public final int mTotalMessages;
- /** A list of new message IDs; must not be {@code null} */
- public final ArrayList<Long> mAddedMessages;
-
- public SyncResults(int totalMessages, ArrayList<Long> addedMessages) {
- if (addedMessages == null) {
- throw new IllegalArgumentException("addedMessages must not be null");
- }
- mTotalMessages = totalMessages;
- mAddedMessages = addedMessages;
- }
- }
-}
diff --git a/src/com/android/email/MessagingListener.java b/src/com/android/email/MessagingListener.java
deleted file mode 100644
index 3371614a8..000000000
--- a/src/com/android/email/MessagingListener.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import com.android.emailcommon.mail.MessagingException;
-
-import android.content.Context;
-
-import java.util.ArrayList;
-
-/**
- * Defines the interface that MessagingController will use to callback to requesters. This class
- * is defined as non-abstract so that someone who wants to receive only a few messages can
- * do so without implementing the entire interface. It is highly recommended that users of
- * this interface use the @Override annotation in their implementations to avoid being caught by
- * changes in this class.
- */
-public class MessagingListener {
- public MessagingListener() {
- }
-
- public void listFoldersStarted(long accountId) {
- }
-
- public void listFoldersFailed(long accountId, String message) {
- }
-
- public void listFoldersFinished(long accountId) {
- }
-
- public void synchronizeMailboxStarted(long accountId, long mailboxId) {
- }
-
- /**
- * Synchronization of the mailbox finished. The mailbox and/or message databases have been
- * updated accordingly.
- *
- * @param accountId The account that was synchronized
- * @param mailboxId The mailbox that was synchronized
- * @param totalMessagesInMailbox The total number of messages in the mailbox
- * @param numNewMessages The number of new messages
- * @param addedMessages Message IDs of messages that were added during the synchronization.
- * These are new, unread messages. Messages that were previously read are not in this list.
- */
- public void synchronizeMailboxFinished(long accountId, long mailboxId,
- int totalMessagesInMailbox, int numNewMessages, ArrayList<Long> addedMessages) {
- }
-
- public void synchronizeMailboxFailed(long accountId, long mailboxId, Exception e) {
- }
-
- public void loadMessageForViewStarted(long messageId) {
- }
-
- public void loadMessageForViewFinished(long messageId) {
- }
-
- public void loadMessageForViewFailed(long messageId, String message) {
- }
-
- public void checkMailStarted(Context context, long accountId, long tag) {
- }
-
- public void checkMailFinished(Context context, long accountId, long mailboxId, long tag) {
- }
-
- public void sendPendingMessagesStarted(long accountId, long messageId) {
- }
-
- public void sendPendingMessagesCompleted(long accountId) {
- }
-
- public void sendPendingMessagesFailed(long accountId, long messageId, Exception reason) {
- }
-
- public void messageUidChanged(long accountId, long mailboxId, String oldUid, String newUid) {
- }
-
- public void loadAttachmentStarted(
- long accountId,
- long messageId,
- long attachmentId,
- boolean requiresDownload) {
- }
-
- public void loadAttachmentFinished(
- long accountId,
- long messageId,
- long attachmentId) {
- }
-
- public void loadAttachmentFailed(
- long accountId,
- long messageId,
- long attachmentId,
- MessagingException me,
- boolean background) {
- }
-
- /**
- * General notification messages subclasses can override to be notified that the controller
- * has completed a command. This is useful for turning off progress indicators that may have
- * been left over from previous commands.
- * @param moreCommandsToRun True if the controller will continue on to another command
- * immediately.
- */
- public void controllerCommandCompleted(boolean moreCommandsToRun) {
-
- }
-}
diff --git a/src/com/android/email/NotificationController.java b/src/com/android/email/NotificationController.java
index 6f7b12b31..42112fbd7 100644
--- a/src/com/android/email/NotificationController.java
+++ b/src/com/android/email/NotificationController.java
@@ -25,6 +25,7 @@ import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
+import android.content.res.Resources;
import android.database.ContentObserver;
import android.database.Cursor;
import android.graphics.Bitmap;
@@ -36,23 +37,29 @@ import android.os.Looper;
import android.os.Process;
import android.text.SpannableString;
import android.text.TextUtils;
+import android.text.style.TextAppearanceSpan;
import android.util.Log;
import com.android.email.activity.ContactStatusLoader;
-import com.android.email.activity.Welcome;
import com.android.email.activity.setup.AccountSecurity;
import com.android.email.activity.setup.AccountSettings;
+import com.android.email.provider.EmailProvider;
+import com.android.email.service.EmailBroadcastProcessorService;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
import com.android.emailcommon.mail.Address;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
import com.android.emailcommon.provider.EmailContent.Attachment;
import com.android.emailcommon.provider.EmailContent.MailboxColumns;
import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
import com.android.emailcommon.provider.Mailbox;
+import com.android.emailcommon.utility.EmailAsyncTask;
import com.android.emailcommon.utility.Utility;
+import com.android.mail.providers.Conversation;
+import com.android.mail.providers.Folder;
+import com.android.mail.providers.UIProvider;
+import com.android.mail.utils.Utils;
import com.google.common.annotations.VisibleForTesting;
import java.util.HashMap;
@@ -62,7 +69,8 @@ import java.util.HashSet;
* Class that manages notifications.
*/
public class NotificationController {
- private static final int NOTIFICATION_ID_SECURITY_NEEDED = 1;
+ private static final String TAG = "NotificationController";
+
/** Reserved for {@link com.android.exchange.CalendarSyncEnabler} */
@SuppressWarnings("unused")
private static final int NOTIFICATION_ID_EXCHANGE_CALENDAR_ADDED = 2;
@@ -70,13 +78,21 @@ public class NotificationController {
private static final int NOTIFICATION_ID_PASSWORD_EXPIRING = 4;
private static final int NOTIFICATION_ID_PASSWORD_EXPIRED = 5;
+ private static final int NOTIFICATION_ID_BASE_MASK = 0xF0000000;
private static final int NOTIFICATION_ID_BASE_NEW_MESSAGES = 0x10000000;
private static final int NOTIFICATION_ID_BASE_LOGIN_WARNING = 0x20000000;
+ private static final int NOTIFICATION_ID_BASE_SECURITY_NEEDED = 0x30000000;
+ private static final int NOTIFICATION_ID_BASE_SECURITY_CHANGED = 0x40000000;
/** Selection to retrieve accounts that should we notify user for changes */
private final static String NOTIFIED_ACCOUNT_SELECTION =
Account.FLAGS + "&" + Account.FLAGS_NOTIFY_NEW_MAIL + " != 0";
+ private static final String NEW_MAIL_MAILBOX_ID = "com.android.email.new_mail.mailboxId";
+ private static final String NEW_MAIL_MESSAGE_ID = "com.android.email.new_mail.messageId";
+ private static final String NEW_MAIL_MESSAGE_COUNT = "com.android.email.new_mail.messageCount";
+ private static final String NEW_MAIL_UNREAD_COUNT = "com.android.email.new_mail.unreadCount";
+
private static NotificationThread sNotificationThread;
private static Handler sNotificationHandler;
private static NotificationController sInstance;
@@ -86,18 +102,9 @@ public class NotificationController {
private final Bitmap mGenericSenderIcon;
private final Bitmap mGenericMultipleSenderIcon;
private final Clock mClock;
- // TODO We're maintaining all of our structures based upon the account ID. This is fine
- // for now since the assumption is that we only ever look for changes in an account's
- // INBOX. We should adjust our logic to use the mailbox ID instead.
- /** Maps account id to the message data */
+ /** Maps account id to its observer */
private final HashMap<Long, ContentObserver> mNotificationMap;
private ContentObserver mAccountObserver;
- /**
- * Suspend notifications for this account. If {@link Account#NO_ACCOUNT}, no
- * account notifications are suspended. If {@link Account#ACCOUNT_ID_COMBINED_VIEW},
- * notifications for all accounts are suspended.
- */
- private long mSuspendAccountId = Account.NO_ACCOUNT;
/**
* Timestamp indicating when the last message notification sound was played.
@@ -144,15 +151,15 @@ public class NotificationController {
private boolean needsOngoingNotification(int notificationId) {
// "Security needed" must be ongoing so that the user doesn't close it; otherwise, sync will
// be prevented until a reboot. Consider also doing this for password expired.
- return notificationId == NOTIFICATION_ID_SECURITY_NEEDED;
+ return (notificationId & NOTIFICATION_ID_BASE_MASK) == NOTIFICATION_ID_BASE_SECURITY_NEEDED;
}
/**
- * Returns a {@link Notification} for an event with the given account. The account contains
- * specific rules on ring tone usage and these will be used to modify the notification
+ * Returns a {@link Notification.Builder}} for an event with the given account. The account
+ * contains specific rules on ring tone usage and these will be used to modify the notification
* behaviour.
*
- * @param account The account this notification is being built for.
+ * @param accountId The id of the account this notification is being built for.
* @param ticker Text displayed when the notification is first shown. May be {@code null}.
* @param title The first line of text. May NOT be {@code null}.
* @param contentText The second line of text. May NOT be {@code null}.
@@ -164,7 +171,7 @@ public class NotificationController {
* to the settings for the given account.
* @return A {@link Notification} that can be sent to the notification service.
*/
- private Notification createAccountNotification(Account account, String ticker,
+ private Notification.Builder createBaseAccountNotificationBuilder(long accountId, String ticker,
CharSequence title, String contentText, Intent intent, Bitmap largeIcon,
Integer number, boolean enableAudio, boolean ongoing) {
// Pending Intent
@@ -175,7 +182,7 @@ public class NotificationController {
}
// NOTE: the ticker is not shown for notifications in the Holo UX
- Notification.Builder builder = new Notification.Builder(mContext)
+ final Notification.Builder builder = new Notification.Builder(mContext)
.setContentTitle(title)
.setContentText(contentText)
.setContentIntent(pending)
@@ -187,36 +194,37 @@ public class NotificationController {
.setOngoing(ongoing);
if (enableAudio) {
+ Account account = Account.restoreAccountWithId(mContext, accountId);
setupSoundAndVibration(builder, account);
}
- Notification notification = builder.getNotification();
- return notification;
+ return builder;
}
/**
* Generic notifier for any account. Uses notification rules from account.
*
- * @param account The account this notification is being built for.
+ * @param accountId The account id this notification is being built for.
* @param ticker Text displayed when the notification is first shown. May be {@code null}.
* @param title The first line of text. May NOT be {@code null}.
* @param contentText The second line of text. May NOT be {@code null}.
* @param intent The intent to start if the user clicks on the notification.
* @param notificationId The ID of the notification to register with the service.
*/
- private void showAccountNotification(Account account, String ticker, String title,
+ private void showNotification(long accountId, String ticker, String title,
String contentText, Intent intent, int notificationId) {
- Notification notification = createAccountNotification(account, ticker, title, contentText,
- intent, null, null, true, needsOngoingNotification(notificationId));
- mNotificationManager.notify(notificationId, notification);
+ final Notification.Builder builder = createBaseAccountNotificationBuilder(accountId, ticker,
+ title, contentText, intent, null, null, true,
+ needsOngoingNotification(notificationId));
+ mNotificationManager.notify(notificationId, builder.getNotification());
}
/**
* Returns a notification ID for new message notifications for the given account.
*/
- private int getNewMessageNotificationId(long accountId) {
+ private int getNewMessageNotificationId(long mailboxId) {
// We assume accountId will always be less than 0x0FFFFFFF; is there a better way?
- return (int) (NOTIFICATION_ID_BASE_NEW_MESSAGES + accountId);
+ return (int) (NOTIFICATION_ID_BASE_NEW_MESSAGES + mailboxId);
}
/**
@@ -229,8 +237,8 @@ public class NotificationController {
* notifications enabled. Otherwise, all observers are unregistered.
*/
public void watchForMessages(final boolean watch) {
- if (Email.DEBUG) {
- Log.i(Logging.LOG_TAG, "Notifications being toggled: " + watch);
+ if (MailActivityEmail.DEBUG) {
+ Log.d(Logging.LOG_TAG, "Notifications being toggled: " + watch);
}
// Don't create the thread if we're only going to stop watching
if (!watch && sNotificationThread == null) return;
@@ -258,7 +266,7 @@ public class NotificationController {
registerMessageNotification(Account.ACCOUNT_ID_COMBINED_VIEW);
// If we're already observing account changes, don't do anything else
if (mAccountObserver == null) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.i(Logging.LOG_TAG, "Observing account changes for notifications");
}
mAccountObserver = new AccountContentObserver(sNotificationHandler, mContext);
@@ -269,40 +277,6 @@ public class NotificationController {
}
/**
- * Temporarily suspend a single account from receiving notifications. NOTE: only a single
- * account may ever be suspended at a time. So, if this method is invoked a second time,
- * notifications for the previously suspended account will automatically be re-activated.
- * @param suspend If {@code true}, suspend notifications for the given account. Otherwise,
- * re-activate notifications for the previously suspended account.
- * @param accountId The ID of the account. If this is the special account ID
- * {@link Account#ACCOUNT_ID_COMBINED_VIEW}, notifications for all accounts are
- * suspended. If {@code suspend} is {@code false}, the account ID is ignored.
- */
- public void suspendMessageNotification(boolean suspend, long accountId) {
- if (mSuspendAccountId != Account.NO_ACCOUNT) {
- // we're already suspending an account; un-suspend it
- mSuspendAccountId = Account.NO_ACCOUNT;
- }
- if (suspend && accountId != Account.NO_ACCOUNT && accountId > 0L) {
- mSuspendAccountId = accountId;
- if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- // Only go onto the notification handler if we really, absolutely need to
- ensureHandlerExists();
- sNotificationHandler.post(new Runnable() {
- @Override
- public void run() {
- for (long accountId : mNotificationMap.keySet()) {
- mNotificationManager.cancel(getNewMessageNotificationId(accountId));
- }
- }
- });
- } else {
- mNotificationManager.cancel(getNewMessageNotificationId(accountId));
- }
- }
- }
-
- /**
* Ensures the notification handler exists and is ready to handle requests.
*/
private static synchronized void ensureHandlerExists() {
@@ -313,8 +287,7 @@ public class NotificationController {
}
/**
- * Registers an observer for changes to the INBOX for the given account. Since accounts
- * may only have a single INBOX, we will never have more than one observer for an account.
+ * Registers an observer for changes to mailboxes in the given account.
* NOTE: This must be called on the notification handler thread.
* @param accountId The ID of the account to register the observer for. May be
* {@link Account#ACCOUNT_ID_COMBINED_VIEW} to register observers for all
@@ -337,17 +310,11 @@ public class NotificationController {
} else {
ContentObserver obs = mNotificationMap.get(accountId);
if (obs != null) return; // we're already observing; nothing to do
-
- Mailbox mailbox = Mailbox.restoreMailboxOfType(mContext, accountId, Mailbox.TYPE_INBOX);
- if (mailbox == null) {
- Log.w(Logging.LOG_TAG, "Could not load INBOX for account id: " + accountId);
- return;
- }
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.i(Logging.LOG_TAG, "Registering for notifications for account " + accountId);
}
ContentObserver observer = new MessageContentObserver(
- sNotificationHandler, mContext, mailbox.mId, accountId);
+ sNotificationHandler, mContext, accountId);
resolver.registerContentObserver(Message.NOTIFIER_URI, true, observer);
mNotificationMap.put(accountId, observer);
// Now, ping the observer for any initial notifications
@@ -366,7 +333,7 @@ public class NotificationController {
private void unregisterMessageNotification(long accountId) {
ContentResolver resolver = mContext.getContentResolver();
if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.i(Logging.LOG_TAG, "Unregistering notifications for all accounts");
}
// cancel all existing message observers
@@ -375,7 +342,7 @@ public class NotificationController {
}
mNotificationMap.clear();
} else {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.i(Logging.LOG_TAG, "Unregistering notifications for account " + accountId);
}
ContentObserver observer = mNotificationMap.remove(accountId);
@@ -400,23 +367,97 @@ public class NotificationController {
if (TextUtils.isEmpty(email)) {
return null;
}
- return ContactStatusLoader.getContactInfo(mContext, email).mPhoto;
+ Bitmap photo = ContactStatusLoader.getContactInfo(mContext, email).mPhoto;
+
+ if (photo != null) {
+ final Resources res = mContext.getResources();
+ final int idealIconHeight =
+ res.getDimensionPixelSize(android.R.dimen.notification_large_icon_height);
+ final int idealIconWidth =
+ res.getDimensionPixelSize(android.R.dimen.notification_large_icon_width);
+
+ if (photo.getHeight() < idealIconHeight) {
+ // We should scale this image to fit the intended size
+ photo = Bitmap.createScaledBitmap(
+ photo, idealIconWidth, idealIconHeight, true);
+ }
+ }
+ return photo;
}
+ public static final String EXTRA_ACCOUNT = "account";
+ public static final String EXTRA_CONVERSATION = "conversationUri";
+ public static final String EXTRA_FOLDER = "folder";
+
+ private Intent createViewConversationIntent(Conversation conversation, Folder folder,
+ com.android.mail.providers.Account account) {
+ final Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ intent.setDataAndType(conversation.uri, account.mimeType);
+ intent.putExtra(EXTRA_ACCOUNT, account);
+ intent.putExtra(EXTRA_FOLDER, folder);
+ intent.putExtra(EXTRA_CONVERSATION, conversation);
+ return intent;
+ }
+
+ private Cursor getUiCursor(Uri uri, String[] projection) {
+ Cursor c = mContext.getContentResolver().query(uri, projection, null, null, null);
+ if (c == null) return null;
+ if (c.moveToFirst()) {
+ return c;
+ } else {
+ c.close();
+ return null;
+ }
+ }
+
+ private Intent createViewConversationIntent(Message message) {
+ Cursor c = getUiCursor(EmailProvider.uiUri("uiaccount", message.mAccountKey),
+ UIProvider.ACCOUNTS_PROJECTION);
+ if (c == null) {
+ Log.w(TAG, "Can't find account for message " + message.mId);
+ return null;
+ }
+ com.android.mail.providers.Account acct = new com.android.mail.providers.Account(c);
+ c.close();
+ c = getUiCursor(EmailProvider.uiUri("uifolder", message.mMailboxKey),
+ UIProvider.FOLDERS_PROJECTION);
+ if (c == null) {
+ Log.w(TAG, "Can't find folder for message " + message.mId + ", folder " +
+ message.mMailboxKey);
+ return null;
+ }
+ Folder folder = new Folder(c);
+ c.close();
+ c = getUiCursor(EmailProvider.uiUri("uiconversation", message.mId),
+ UIProvider.CONVERSATION_PROJECTION);
+ if (c == null) {
+ Log.w(TAG, "Can't find conversation for message " + message.mId);
+ return null;
+ }
+ Conversation conv = new Conversation(c);
+ c.close();
+ return createViewConversationIntent(conv, folder, acct);
+ }
+
/**
* Returns a "new message" notification for the given account.
*
* NOTE: DO NOT CALL THIS METHOD FROM THE UI THREAD (DATABASE ACCESS)
*/
@VisibleForTesting
- Notification createNewMessageNotification(long accountId, long mailboxId, long messageId,
+ Notification createNewMessageNotification(long mailboxId, long newMessageId,
int unseenMessageCount, int unreadCount) {
- final Account account = Account.restoreAccountWithId(mContext, accountId);
+ final Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, mailboxId);
+ if (mailbox == null) {
+ return null;
+ }
+ final Account account = Account.restoreAccountWithId(mContext, mailbox.mAccountKey);
if (account == null) {
return null;
}
// Get the latest message
- final Message message = Message.restoreMessageWithId(mContext, messageId);
+ final Message message = Message.restoreMessageWithId(mContext, newMessageId);
if (message == null) {
return null; // no message found???
}
@@ -432,26 +473,203 @@ public class NotificationController {
final SpannableString title = getNewMessageTitle(senderName, unseenMessageCount);
// TODO: add in display name on the second line for the text, once framework supports
// multiline texts.
+ // Show account name if an inbox; otherwise mailbox name
final String text = multipleUnseen
- ? account.mDisplayName
+ ? ((mailbox.mType == Mailbox.TYPE_INBOX) ? account.mDisplayName :
+ mailbox.mDisplayName)
: message.mSubject;
final Bitmap largeIcon = senderPhoto != null ? senderPhoto : mGenericSenderIcon;
final Integer number = unreadCount > 1 ? unreadCount : null;
- final Intent intent;
- if (unseenMessageCount > 1) {
- intent = Welcome.createOpenAccountInboxIntent(mContext, accountId);
- } else {
- intent = Welcome.createOpenMessageIntent(mContext, accountId, mailboxId, messageId);
+ Intent intent = createViewConversationIntent(message);
+ if (intent == null) {
+ return null;
}
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |
Intent.FLAG_ACTIVITY_TASK_ON_HOME);
long now = mClock.getTime();
boolean enableAudio = (now - mLastMessageNotifyTime) > MIN_SOUND_INTERVAL_MS;
- Notification notification = createAccountNotification(
- account, title.toString(), title, text,
+ final Notification.Builder builder = createBaseAccountNotificationBuilder(
+ mailbox.mAccountKey, title.toString(), title, text,
intent, largeIcon, number, enableAudio, false);
+ if (Utils.isRunningJellybeanOrLater()) {
+ // For a new-style notification
+ if (multipleUnseen) {
+ final Cursor messageCursor =
+ mContext.getContentResolver().query(ContentUris.withAppendedId(
+ EmailContent.MAILBOX_NOTIFICATION_URI, mailbox.mAccountKey),
+ EmailContent.NOTIFICATION_PROJECTION, null, null, null);
+
+ try {
+ if (messageCursor != null && messageCursor.getCount() > 0) {
+ final int maxNumDigestItems = mContext.getResources().getInteger(
+ R.integer.max_num_notification_digest_items);
+ // The body of the notification is the account name, or the label name.
+ builder.setSubText(text);
+
+ Notification.InboxStyle digest = new Notification.InboxStyle(builder);
+
+ digest.setBigContentTitle(title);
+
+ int numDigestItems = 0;
+ // We can assume that the current position of the cursor is on the
+ // newest message
+ messageCursor.moveToFirst();
+ do {
+ final long messageId =
+ messageCursor.getLong(EmailContent.ID_PROJECTION_COLUMN);
+
+ // Get the latest message
+ final Message digestMessage =
+ Message.restoreMessageWithId(mContext, messageId);
+ if (digestMessage != null) {
+ final CharSequence digestLine =
+ getSingleMessageInboxLine(mContext, digestMessage);
+ digest.addLine(digestLine);
+ numDigestItems++;
+ }
+ } while (numDigestItems <= maxNumDigestItems && messageCursor.moveToNext());
+
+ // We want to clear the content text in this case. The content text would
+ // have been set in createBaseAccountNotificationBuilder, but since the
+ // same string was set in as the subtext, we don't want to show a
+ // duplicate string.
+ builder.setContentText(null);
+ }
+ } finally {
+ if (messageCursor != null) {
+ messageCursor.close();
+ }
+ }
+ } else {
+ // The notification content will be the subject of the conversation.
+ builder.setContentText(getSingleMessageLittleText(mContext, message.mSubject));
+
+ // The notification subtext will be the subject of the conversation for inbox
+ // notifications, or will based on the the label name for user label notifications.
+ builder.setSubText(account.mDisplayName);
+
+ final Notification.BigTextStyle bigText = new Notification.BigTextStyle(builder);
+ bigText.bigText(getSingleMessageBigText(mContext, message));
+ }
+ }
+
mLastMessageNotifyTime = now;
- return notification;
+ return builder.getNotification();
+ }
+
+ /**
+ * Sets the bigtext for a notification for a single new conversation
+ * @param context
+ * @param message New message that triggered the notification.
+ * @return a {@link CharSequence} suitable for use in {@link Notification.BigTextStyle}
+ */
+ private static CharSequence getSingleMessageInboxLine(Context context, Message message) {
+ final String subject = message.mSubject;
+ final String snippet = message.mSnippet;
+ final String senders = Address.toFriendly(Address.unpack(message.mFrom));
+
+ final String subjectSnippet = !TextUtils.isEmpty(subject) ? subject : snippet;
+
+ final TextAppearanceSpan notificationPrimarySpan =
+ new TextAppearanceSpan(context, R.style.NotificationPrimaryText);
+
+ if (TextUtils.isEmpty(senders)) {
+ // If the senders are empty, just use the subject/snippet.
+ return subjectSnippet;
+ }
+ else if (TextUtils.isEmpty(subjectSnippet)) {
+ // If the subject/snippet is empty, just use the senders.
+ final SpannableString spannableString = new SpannableString(senders);
+ spannableString.setSpan(notificationPrimarySpan, 0, senders.length(), 0);
+
+ return spannableString;
+ } else {
+ final String formatString = context.getResources().getString(
+ R.string.multiple_new_message_notification_item);
+ final TextAppearanceSpan notificationSecondarySpan =
+ new TextAppearanceSpan(context, R.style.NotificationSecondaryText);
+
+ final String instantiatedString = String.format(formatString, senders, subjectSnippet);
+
+ final SpannableString spannableString = new SpannableString(instantiatedString);
+
+ final boolean isOrderReversed = formatString.indexOf("%2$s") <
+ formatString.indexOf("%1$s");
+ final int primaryOffset =
+ (isOrderReversed ? instantiatedString.lastIndexOf(senders) :
+ instantiatedString.indexOf(senders));
+ final int secondaryOffset =
+ (isOrderReversed ? instantiatedString.lastIndexOf(subjectSnippet) :
+ instantiatedString.indexOf(subjectSnippet));
+ spannableString.setSpan(notificationPrimarySpan,
+ primaryOffset, primaryOffset + senders.length(), 0);
+ spannableString.setSpan(notificationSecondarySpan,
+ secondaryOffset, secondaryOffset + subjectSnippet.length(), 0);
+ return spannableString;
+ }
+ }
+
+ /**
+ * Sets the bigtext for a notification for a single new conversation
+ * @param context
+ * @param subject Subject of the new message that triggered the notification
+ * @return a {@link CharSequence} suitable for use in {@link Notification.ContentText}
+ */
+ private static CharSequence getSingleMessageLittleText(Context context, String subject) {
+ if (subject == null) {
+ return null;
+ }
+ final TextAppearanceSpan notificationSubjectSpan = new TextAppearanceSpan(
+ context, R.style.NotificationPrimaryText);
+
+ final SpannableString spannableString = new SpannableString(subject);
+ spannableString.setSpan(notificationSubjectSpan, 0, subject.length(), 0);
+
+ return spannableString;
+ }
+
+
+ /**
+ * Sets the bigtext for a notification for a single new conversation
+ * @param context
+ * @param message New message that triggered the notification
+ * @return a {@link CharSequence} suitable for use in {@link Notification.BigTextStyle}
+ */
+ private static CharSequence getSingleMessageBigText(Context context, Message message) {
+ final TextAppearanceSpan notificationSubjectSpan = new TextAppearanceSpan(
+ context, R.style.NotificationPrimaryText);
+
+ final String subject = message.mSubject;
+ final String snippet = message.mSnippet;
+
+ if (TextUtils.isEmpty(subject)) {
+ // If the subject is empty, just use the snippet.
+ return snippet;
+ }
+ else if (TextUtils.isEmpty(snippet)) {
+ // If the snippet is empty, just use the subject.
+ final SpannableString spannableString = new SpannableString(subject);
+ spannableString.setSpan(notificationSubjectSpan, 0, subject.length(), 0);
+
+ return spannableString;
+ } else {
+ final String notificationBigTextFormat = context.getResources().getString(
+ R.string.single_new_message_notification_big_text);
+
+ // Localizers may change the order of the parameters, look at how the format
+ // string is structured.
+ final boolean isSubjectFirst = notificationBigTextFormat.indexOf("%2$s") >
+ notificationBigTextFormat.indexOf("%1$s");
+ final String bigText = String.format(notificationBigTextFormat, subject, snippet);
+ final SpannableString spannableString = new SpannableString(bigText);
+
+ final int subjectOffset =
+ (isSubjectFirst ? bigText.indexOf(subject) : bigText.lastIndexOf(subject));
+ spannableString.setSpan(notificationSubjectSpan,
+ subjectOffset, subjectOffset + subject.length(), 0);
+
+ return spannableString;
+ }
}
/**
@@ -503,9 +721,10 @@ public class NotificationController {
* NOTE: DO NOT CALL THIS METHOD FROM THE UI THREAD (DATABASE ACCESS)
*/
public void showDownloadForwardFailedNotification(Attachment attachment) {
- final Account account = Account.restoreAccountWithId(mContext, attachment.mAccountKey);
- if (account == null) return;
- showAccountNotification(account,
+ Message message = Message.restoreMessageWithId(mContext, attachment.mMessageKey);
+ if (message == null) return;
+ Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, message.mMailboxKey);
+ showNotification(mailbox.mAccountKey,
mContext.getString(R.string.forward_download_failed_ticker),
mContext.getString(R.string.forward_download_failed_title),
attachment.mFileName,
@@ -528,7 +747,10 @@ public class NotificationController {
public void showLoginFailedNotification(long accountId) {
final Account account = Account.restoreAccountWithId(mContext, accountId);
if (account == null) return;
- showAccountNotification(account,
+ final Mailbox mailbox = Mailbox.restoreMailboxOfType(mContext, account.mId,
+ Mailbox.TYPE_INBOX);
+ if (mailbox == null) return;
+ showNotification(mailbox.mAccountKey,
mContext.getString(R.string.login_failed_ticker, account.mDisplayName),
mContext.getString(R.string.login_failed_title),
account.getDisplayName(),
@@ -545,6 +767,13 @@ public class NotificationController {
}
/**
+ * Cancels the new message notification for a given mailbox
+ */
+ public void cancelNewMessageNotification(long mailboxId) {
+ mNotificationManager.cancel(getNewMessageNotificationId(mailboxId));
+ }
+
+ /**
* Show (or update) a notification that the user's password is expiring. The given account
* is used to update the display text, but, all accounts share the same notification ID.
*
@@ -560,7 +789,7 @@ public class NotificationController {
String ticker =
mContext.getString(R.string.password_expire_warning_ticker_fmt, accountName);
String title = mContext.getString(R.string.password_expire_warning_content_title);
- showAccountNotification(account, ticker, title, accountName, intent,
+ showNotification(accountId, ticker, title, accountName, intent,
NOTIFICATION_ID_PASSWORD_EXPIRING);
}
@@ -579,7 +808,7 @@ public class NotificationController {
String accountName = account.getDisplayName();
String ticker = mContext.getString(R.string.password_expired_ticker);
String title = mContext.getString(R.string.password_expired_content_title);
- showAccountNotification(account, ticker, title, accountName, intent,
+ showNotification(accountId, ticker, title, accountName, intent,
NOTIFICATION_ID_PASSWORD_EXPIRED);
}
@@ -592,135 +821,159 @@ public class NotificationController {
}
/**
- * Show (or update) a security needed notification. The given account is used to update
- * the display text, but, all accounts share the same notification ID.
+ * Show (or update) a security needed notification. If tapped, the user is taken to a
+ * dialog asking whether he wants to update his settings.
*/
public void showSecurityNeededNotification(Account account) {
Intent intent = AccountSecurity.actionUpdateSecurityIntent(mContext, account.mId, true);
String accountName = account.getDisplayName();
String ticker =
- mContext.getString(R.string.security_notification_ticker_fmt, accountName);
- String title = mContext.getString(R.string.security_notification_content_title);
- showAccountNotification(account, ticker, title, accountName, intent,
- NOTIFICATION_ID_SECURITY_NEEDED);
+ mContext.getString(R.string.security_needed_ticker_fmt, accountName);
+ String title = mContext.getString(R.string.security_notification_content_update_title);
+ showNotification(account.mId, ticker, title, accountName, intent,
+ (int)(NOTIFICATION_ID_BASE_SECURITY_NEEDED + account.mId));
}
/**
- * Cancels the security needed notification.
+ * Show (or update) a security changed notification. If tapped, the user is taken to the
+ * account settings screen where he can view the list of enforced policies
+ */
+ public void showSecurityChangedNotification(Account account) {
+ Intent intent = AccountSettings.createAccountSettingsIntent(mContext, account.mId, null);
+ String accountName = account.getDisplayName();
+ String ticker =
+ mContext.getString(R.string.security_changed_ticker_fmt, accountName);
+ String title = mContext.getString(R.string.security_notification_content_change_title);
+ showNotification(account.mId, ticker, title, accountName, intent,
+ (int)(NOTIFICATION_ID_BASE_SECURITY_CHANGED + account.mId));
+ }
+
+ /**
+ * Show (or update) a security unsupported notification. If tapped, the user is taken to the
+ * account settings screen where he can view the list of unsupported policies
+ */
+ public void showSecurityUnsupportedNotification(Account account) {
+ Intent intent = AccountSettings.createAccountSettingsIntent(mContext, account.mId, null);
+ String accountName = account.getDisplayName();
+ String ticker =
+ mContext.getString(R.string.security_unsupported_ticker_fmt, accountName);
+ String title = mContext.getString(R.string.security_notification_content_unsupported_title);
+ showNotification(account.mId, ticker, title, accountName, intent,
+ (int)(NOTIFICATION_ID_BASE_SECURITY_NEEDED + account.mId));
+ }
+
+ /**
+ * Cancels all security needed notifications.
*/
public void cancelSecurityNeededNotification() {
- mNotificationManager.cancel(NOTIFICATION_ID_SECURITY_NEEDED);
+ EmailAsyncTask.runAsyncParallel(new Runnable() {
+ @Override
+ public void run() {
+ Cursor c = mContext.getContentResolver().query(Account.CONTENT_URI,
+ Account.ID_PROJECTION, null, null, null);
+ try {
+ while (c.moveToNext()) {
+ long id = c.getLong(Account.ID_PROJECTION_COLUMN);
+ mNotificationManager.cancel(
+ (int)(NOTIFICATION_ID_BASE_SECURITY_NEEDED + id));
+ }
+ }
+ finally {
+ c.close();
+ }
+ }});
}
/**
* Observer invoked whenever a message we're notifying the user about changes.
*/
private static class MessageContentObserver extends ContentObserver {
- /** A selection to get messages the user hasn't seen before */
- private final static String MESSAGE_SELECTION =
- MessageColumns.MAILBOX_KEY + "=? AND "
- + MessageColumns.ID + ">? AND "
- + MessageColumns.FLAG_READ + "=0 AND "
- + Message.FLAG_LOADED_SELECTION;
private final Context mContext;
- private final long mMailboxId;
private final long mAccountId;
public MessageContentObserver(
- Handler handler, Context context, long mailboxId, long accountId) {
+ Handler handler, Context context, long accountId) {
super(handler);
mContext = context;
- mMailboxId = mailboxId;
mAccountId = accountId;
}
@Override
public void onChange(boolean selfChange) {
- if (mAccountId == sInstance.mSuspendAccountId
- || sInstance.mSuspendAccountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- return;
- }
-
ContentObserver observer = sInstance.mNotificationMap.get(mAccountId);
- if (observer == null) {
- // Notification for a mailbox that we aren't observing; account is probably
- // being deleted.
- Log.w(Logging.LOG_TAG, "Received notification when observer data was null");
- return;
- }
Account account = Account.restoreAccountWithId(mContext, mAccountId);
- if (account == null) {
+ if (observer == null || account == null) {
Log.w(Logging.LOG_TAG, "Couldn't find account for changed message notification");
return;
}
- long oldMessageId = account.mNotifiedMessageId;
- int oldMessageCount = account.mNotifiedMessageCount;
ContentResolver resolver = mContext.getContentResolver();
- Long lastSeenMessageId = Utility.getFirstRowLong(
- mContext, ContentUris.withAppendedId(Mailbox.CONTENT_URI, mMailboxId),
- new String[] { MailboxColumns.LAST_SEEN_MESSAGE_KEY },
- null, null, null, 0);
- if (lastSeenMessageId == null) {
- // Mailbox got nuked. Could be that the account is in the process of being deleted
- Log.w(Logging.LOG_TAG, "Couldn't find mailbox for changed message notification");
- return;
- }
-
- Cursor c = resolver.query(
- Message.CONTENT_URI, EmailContent.ID_PROJECTION,
- MESSAGE_SELECTION,
- new String[] { Long.toString(mMailboxId), Long.toString(lastSeenMessageId) },
- MessageColumns.ID + " DESC");
- if (c == null) {
- // Couldn't find message info - things may be getting deleted in bulk.
- Log.w(Logging.LOG_TAG, "#onChange(); NULL response for message id query");
- return;
- }
+ Cursor c = resolver.query(ContentUris.withAppendedId(
+ EmailContent.MAILBOX_NOTIFICATION_URI, mAccountId),
+ EmailContent.NOTIFICATION_PROJECTION, null, null, null);
try {
- int newMessageCount = c.getCount();
- long newMessageId = 0L;
- if (c.moveToNext()) {
- newMessageId = c.getLong(EmailContent.ID_PROJECTION_COLUMN);
- }
-
- if (newMessageCount == 0) {
- // No messages to notify for; clear the notification
- int notificationId = sInstance.getNewMessageNotificationId(mAccountId);
- sInstance.mNotificationManager.cancel(notificationId);
- } else if (newMessageCount != oldMessageCount
- || (newMessageId != 0 && newMessageId != oldMessageId)) {
- // Either the count or last message has changed; update the notification
- Integer unreadCount = Utility.getFirstRowInt(
- mContext, ContentUris.withAppendedId(Mailbox.CONTENT_URI, mMailboxId),
- new String[] { MailboxColumns.UNREAD_COUNT },
- null, null, null, 0);
- if (unreadCount == null) {
- Log.w(Logging.LOG_TAG, "Couldn't find unread count for mailbox");
- return;
- }
+ while (c.moveToNext()) {
+ long mailboxId = c.getLong(EmailContent.NOTIFICATION_MAILBOX_ID_COLUMN);
+ if (mailboxId == 0) continue;
+ int messageCount =
+ c.getInt(EmailContent.NOTIFICATION_MAILBOX_MESSAGE_COUNT_COLUMN);
+ int unreadCount =
+ c.getInt(EmailContent.NOTIFICATION_MAILBOX_UNREAD_COUNT_COLUMN);
- Notification n = sInstance.createNewMessageNotification(
- mAccountId, mMailboxId, newMessageId,
- newMessageCount, unreadCount);
- if (n != null) {
- // Make the notification visible
- sInstance.mNotificationManager.notify(
- sInstance.getNewMessageNotificationId(mAccountId), n);
- }
+ Mailbox m = Mailbox.restoreMailboxWithId(mContext, mailboxId);
+ long newMessageId = Utility.getFirstRowLong(mContext,
+ ContentUris.withAppendedId(
+ EmailContent.MAILBOX_MOST_RECENT_MESSAGE_URI, mailboxId),
+ Message.ID_COLUMN_PROJECTION, null, null, null,
+ Message.ID_MAILBOX_COLUMN_ID, -1L);
+ Log.d(Logging.LOG_TAG, "Changes to " + account.mDisplayName + "/" +
+ m.mDisplayName + ", count: " + messageCount + ", lastNotified: " +
+ m.mLastNotifiedMessageKey + ", mostRecent: " + newMessageId);
+ // Broadcast intent here
+ Intent i = new Intent(EmailBroadcastProcessorService.ACTION_NOTIFY_NEW_MAIL);
+ // Required by UIProvider
+ i.setType(EmailProvider.EMAIL_APP_MIME_TYPE);
+ i.putExtra(UIProvider.UpdateNotificationExtras.EXTRA_FOLDER,
+ Uri.parse(EmailProvider.uiUriString("uifolder", mailboxId)));
+ i.putExtra(UIProvider.UpdateNotificationExtras.EXTRA_ACCOUNT,
+ Uri.parse(EmailProvider.uiUriString("uiaccount", m.mAccountKey)));
+ i.putExtra(UIProvider.UpdateNotificationExtras.EXTRA_UPDATED_UNREAD_COUNT,
+ unreadCount);
+ // Required by our notification controller
+ i.putExtra(NEW_MAIL_MAILBOX_ID, mailboxId);
+ i.putExtra(NEW_MAIL_MESSAGE_ID, newMessageId);
+ i.putExtra(NEW_MAIL_MESSAGE_COUNT, messageCount);
+ i.putExtra(NEW_MAIL_UNREAD_COUNT, unreadCount);
+ mContext.sendOrderedBroadcast(i, null);
}
- // Save away the new values
- ContentValues cv = new ContentValues();
- cv.put(AccountColumns.NOTIFIED_MESSAGE_ID, newMessageId);
- cv.put(AccountColumns.NOTIFIED_MESSAGE_COUNT, newMessageCount);
- resolver.update(ContentUris.withAppendedId(Account.CONTENT_URI, mAccountId), cv,
- null, null);
} finally {
c.close();
}
}
}
+ public static void notifyNewMail(Context context, Intent i) {
+ Log.d(Logging.LOG_TAG, "Sending notification to system...");
+ NotificationController nc = NotificationController.getInstance(context);
+ ContentResolver resolver = context.getContentResolver();
+ long mailboxId = i.getLongExtra(NEW_MAIL_MAILBOX_ID, -1);
+ long newMessageId = i.getLongExtra(NEW_MAIL_MESSAGE_ID, -1);
+ int messageCount = i.getIntExtra(NEW_MAIL_MESSAGE_COUNT, 0);
+ int unreadCount = i.getIntExtra(NEW_MAIL_UNREAD_COUNT, 0);
+ Notification n = nc.createNewMessageNotification(mailboxId, newMessageId,
+ messageCount, unreadCount);
+ if (n != null) {
+ // Make the notification visible
+ nc.mNotificationManager.notify(nc.getNewMessageNotificationId(mailboxId), n);
+ }
+ // Save away the new values
+ ContentValues cv = new ContentValues();
+ cv.put(MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY, newMessageId);
+ cv.put(MailboxColumns.LAST_NOTIFIED_MESSAGE_COUNT, messageCount);
+ resolver.update(ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId), cv,
+ null, null);
+ }
+
/**
* Observer invoked whenever an account is modified. This could mean the user changed the
* notification settings.
@@ -735,8 +988,7 @@ public class NotificationController {
@Override
public void onChange(boolean selfChange) {
final ContentResolver resolver = mContext.getContentResolver();
- final Cursor c = resolver.query(
- Account.CONTENT_URI, EmailContent.ID_PROJECTION,
+ final Cursor c = resolver.query(Account.CONTENT_URI, EmailContent.ID_PROJECTION,
NOTIFIED_ACCOUNT_SELECTION, null, null);
final HashSet<Long> newAccountList = new HashSet<Long>();
final HashSet<Long> removedAccountList = new HashSet<Long>();
diff --git a/src/com/android/email/Preferences.java b/src/com/android/email/Preferences.java
index fb5ec25b5..c4bb9360d 100644
--- a/src/com/android/email/Preferences.java
+++ b/src/com/android/email/Preferences.java
@@ -51,12 +51,18 @@ public class Preferences {
private static final String TRUSTED_SENDERS = "trustedSenders";
private static final String LAST_ACCOUNT_USED = "lastAccountUsed";
private static final String REQUIRE_MANUAL_SYNC_DIALOG_SHOWN = "requireManualSyncDialogShown";
+ private static final String CONFIRM_DELETE = "confirm_delete";
+ private static final String CONFIRM_SEND = "confirm_send";
+ private static final String HIDE_CHECKBOXES = "hide_checkboxes";
public static final int AUTO_ADVANCE_NEWER = 0;
public static final int AUTO_ADVANCE_OLDER = 1;
public static final int AUTO_ADVANCE_MESSAGE_LIST = 2;
// "move to older" was the behavior on older versions.
private static final int AUTO_ADVANCE_DEFAULT = AUTO_ADVANCE_OLDER;
+ private static final boolean CONFIRM_DELETE_DEFAULT = false;
+ private static final boolean CONFIRM_SEND_DEFAULT = false;
+ private static final boolean HIDE_CHECKBOXES_DEFAULT = false;
// The following constants are used as offsets into R.array.general_preference_text_zoom_size.
public static final int TEXT_ZOOM_TINY = 0;
@@ -192,6 +198,30 @@ public class Preferences {
mSharedPreferences.edit().putInt(AUTO_ADVANCE_DIRECTION, direction).apply();
}
+ public boolean getHideCheckboxes() {
+ return mSharedPreferences.getBoolean(HIDE_CHECKBOXES, HIDE_CHECKBOXES_DEFAULT);
+ }
+
+ public void setHideCheckboxes(boolean set) {
+ mSharedPreferences.edit().putBoolean(HIDE_CHECKBOXES, set).apply();
+ }
+
+ public boolean getConfirmDelete() {
+ return mSharedPreferences.getBoolean(CONFIRM_DELETE, CONFIRM_DELETE_DEFAULT);
+ }
+
+ public void setConfirmDelete(boolean set) {
+ mSharedPreferences.edit().putBoolean(CONFIRM_DELETE, set).apply();
+ }
+
+ public boolean getConfirmSend() {
+ return mSharedPreferences.getBoolean(CONFIRM_SEND, CONFIRM_SEND_DEFAULT);
+ }
+
+ public void setConfirmSend(boolean set) {
+ mSharedPreferences.edit().putBoolean(CONFIRM_SEND, set).apply();
+ }
+
public int getTextZoom() {
return mSharedPreferences.getInt(TEXT_ZOOM, TEXT_ZOOM_DEFAULT);
}
diff --git a/src/com/android/email/RecipientAdapter.java b/src/com/android/email/RecipientAdapter.java
deleted file mode 100644
index 5312a771d..000000000
--- a/src/com/android/email/RecipientAdapter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import android.accounts.Account;
-import android.content.Context;
-
-import com.android.ex.chips.BaseRecipientAdapter;
-import com.android.ex.chips.RecipientEditTextView;
-
-public class RecipientAdapter extends BaseRecipientAdapter {
- public RecipientAdapter(Context context, RecipientEditTextView list) {
- super(context);
- }
-
- /**
- * Set the account when known. Causes the search to prioritize contacts from
- * that account.
- */
- @Override
- public void setAccount(Account account) {
- if (account != null) {
- // TODO: figure out how to infer the contacts account
- // type from the email account
- super.setAccount(new android.accounts.Account(account.name, "unknown"));
- }
- }
-
- @Override
- protected int getDefaultPhotoResource() {
- return R.drawable.ic_contact_picture;
- }
-
- @Override
- protected int getItemLayout() {
- return R.layout.chips_recipient_dropdown_item;
- }
-
- @Override
- protected int getWaitingForDirectorySearchLayout() {
- return R.layout.chips_waiting_for_directory_search;
- }
-}
diff --git a/src/com/android/email/RefreshManager.java b/src/com/android/email/RefreshManager.java
deleted file mode 100644
index 4e5fd5876..000000000
--- a/src/com/android/email/RefreshManager.java
+++ /dev/null
@@ -1,456 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.utility.Utility;
-
-import android.content.Context;
-import android.os.AsyncTask;
-import android.os.Handler;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-
-/**
- * Class that handles "refresh" (and "send pending messages" for outboxes) related functionalities.
- *
- * <p>This class is responsible for two things:
- * <ul>
- * <li>Taking refresh requests of mailbox-lists and message-lists and the "send outgoing
- * messages" requests from UI, and calls appropriate methods of {@link Controller}.
- * Note at this point the timer-based refresh
- * (by {@link com.android.email.service.MailService}) uses {@link Controller} directly.
- * <li>Keeping track of which mailbox list/message list is actually being refreshed.
- * </ul>
- * Refresh requests will be ignored if a request to the same target is already requested, or is
- * already being refreshed.
- *
- * <p>Conceptually it can be a part of {@link Controller}, but extracted for easy testing.
- *
- * (All public methods must be called on the UI thread. All callbacks will be called on the UI
- * thread.)
- */
-public class RefreshManager {
- private static final boolean LOG_ENABLED = false; // DONT SUBMIT WITH TRUE
- private static final long MAILBOX_AUTO_REFRESH_INTERVAL = 5 * 60 * 1000; // in milliseconds
- private static final long MAILBOX_LIST_AUTO_REFRESH_INTERVAL = 5 * 60 * 1000; // in milliseconds
-
- private static RefreshManager sInstance;
-
- private final Clock mClock;
- private final Context mContext;
- private final Controller mController;
- private final Controller.Result mControllerResult;
-
- /** Last error message */
- private String mErrorMessage;
-
- public interface Listener {
- /**
- * Refresh status of a mailbox list or a message list has changed.
- *
- * @param accountId ID of the account.
- * @param mailboxId -1 if it's about the mailbox list, or the ID of the mailbox list in
- * question.
- */
- public void onRefreshStatusChanged(long accountId, long mailboxId);
-
- /**
- * Error callback.
- *
- * @param accountId ID of the account, or -1 if unknown.
- * @param mailboxId ID of the mailbox, or -1 if unknown.
- * @param message error message which can be shown to the user.
- */
- public void onMessagingError(long accountId, long mailboxId, String message);
- }
-
- private final ArrayList<Listener> mListeners = new ArrayList<Listener>();
-
- /**
- * Status of a mailbox list/message list.
- */
- /* package */ static class Status {
- /**
- * True if a refresh of the mailbox is requested, and not finished yet.
- */
- private boolean mIsRefreshRequested;
-
- /**
- * True if the mailbox is being refreshed.
- *
- * Set true when {@link #onRefreshRequested} is called, i.e. refresh is requested by UI.
- * Note refresh can occur without a request from UI as well (e.g. timer based refresh).
- * In which case, {@link #mIsRefreshing} will be true with {@link #mIsRefreshRequested}
- * being false.
- */
- private boolean mIsRefreshing;
-
- private long mLastRefreshTime;
-
- public boolean isRefreshing() {
- return mIsRefreshRequested || mIsRefreshing;
- }
-
- public boolean canRefresh() {
- return !isRefreshing();
- }
-
- public void onRefreshRequested() {
- mIsRefreshRequested = true;
- }
-
- public long getLastRefreshTime() {
- return mLastRefreshTime;
- }
-
- public void onCallback(MessagingException exception, int progress, Clock clock) {
- if (exception == null && progress == 0) {
- // Refresh started
- mIsRefreshing = true;
- } else if (exception != null || progress == 100) {
- // Refresh finished
- mIsRefreshing = false;
- mIsRefreshRequested = false;
- mLastRefreshTime = clock.getTime();
- }
- }
- }
-
- /**
- * Map of accounts/mailboxes to {@link Status}.
- */
- private static class RefreshStatusMap {
- private final HashMap<Long, Status> mMap = new HashMap<Long, Status>();
-
- public Status get(long id) {
- Status s = mMap.get(id);
- if (s == null) {
- s = new Status();
- mMap.put(id, s);
- }
- return s;
- }
-
- public boolean isRefreshingAny() {
- for (Status s : mMap.values()) {
- if (s.isRefreshing()) {
- return true;
- }
- }
- return false;
- }
- }
-
- private final RefreshStatusMap mMailboxListStatus = new RefreshStatusMap();
- private final RefreshStatusMap mMessageListStatus = new RefreshStatusMap();
-
- /**
- * @return the singleton instance.
- */
- public static synchronized RefreshManager getInstance(Context context) {
- if (sInstance == null) {
- sInstance = new RefreshManager(context, Controller.getInstance(context),
- Clock.INSTANCE, new Handler());
- }
- return sInstance;
- }
-
- protected RefreshManager(Context context, Controller controller, Clock clock,
- Handler handler) {
- mClock = clock;
- mContext = context.getApplicationContext();
- mController = controller;
- mControllerResult = new ControllerResultUiThreadWrapper<ControllerResult>(
- handler, new ControllerResult());
- mController.addResultCallback(mControllerResult);
- }
-
- /**
- * MUST be called for mock instances. (The actual instance is a singleton, so no cleanup
- * is necessary.)
- */
- public void cleanUpForTest() {
- mController.removeResultCallback(mControllerResult);
- }
-
- public void registerListener(Listener listener) {
- if (listener == null) {
- throw new IllegalArgumentException();
- }
- mListeners.add(listener);
- }
-
- public void unregisterListener(Listener listener) {
- if (listener == null) {
- throw new IllegalArgumentException();
- }
- mListeners.remove(listener);
- }
-
- /**
- * Refresh the mailbox list of an account.
- */
- public boolean refreshMailboxList(long accountId) {
- final Status status = mMailboxListStatus.get(accountId);
- if (!status.canRefresh()) return false;
-
- if (LOG_ENABLED) {
- Log.d(Logging.LOG_TAG, "refreshMailboxList " + accountId);
- }
- status.onRefreshRequested();
- notifyRefreshStatusChanged(accountId, -1);
- mController.updateMailboxList(accountId);
- return true;
- }
-
- public boolean isMailboxStale(long mailboxId) {
- return mClock.getTime() >= (mMessageListStatus.get(mailboxId).getLastRefreshTime()
- + MAILBOX_AUTO_REFRESH_INTERVAL);
- }
-
- public boolean isMailboxListStale(long accountId) {
- return mClock.getTime() >= (mMailboxListStatus.get(accountId).getLastRefreshTime()
- + MAILBOX_LIST_AUTO_REFRESH_INTERVAL);
- }
-
- /**
- * Refresh messages in a mailbox.
- */
- public boolean refreshMessageList(long accountId, long mailboxId, boolean userRequest) {
- return refreshMessageList(accountId, mailboxId, false, userRequest);
- }
-
- /**
- * "load more messages" in a mailbox.
- */
- public boolean loadMoreMessages(long accountId, long mailboxId) {
- return refreshMessageList(accountId, mailboxId, true, true);
- }
-
- private boolean refreshMessageList(long accountId, long mailboxId, boolean loadMoreMessages,
- boolean userRequest) {
- final Status status = mMessageListStatus.get(mailboxId);
- if (!status.canRefresh()) return false;
-
- if (LOG_ENABLED) {
- Log.d(Logging.LOG_TAG, "refreshMessageList " + accountId + ", " + mailboxId + ", "
- + loadMoreMessages);
- }
- status.onRefreshRequested();
- notifyRefreshStatusChanged(accountId, mailboxId);
- if (loadMoreMessages) {
- mController.loadMoreMessages(mailboxId);
- } else {
- mController.updateMailbox(accountId, mailboxId, userRequest);
- }
- return true;
- }
-
- /**
- * Send pending messages.
- */
- public boolean sendPendingMessages(long accountId) {
- if (LOG_ENABLED) {
- Log.d(Logging.LOG_TAG, "sendPendingMessages " + accountId);
- }
- notifyRefreshStatusChanged(accountId, -1);
- mController.sendPendingMessages(accountId);
- return true;
- }
-
- /**
- * Call {@link #sendPendingMessages} for all accounts.
- */
- public void sendPendingMessagesForAllAccounts() {
- if (LOG_ENABLED) {
- Log.d(Logging.LOG_TAG, "sendPendingMessagesForAllAccounts");
- }
- new SendPendingMessagesForAllAccountsImpl()
- .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
-
- private class SendPendingMessagesForAllAccountsImpl extends Utility.ForEachAccount {
- public SendPendingMessagesForAllAccountsImpl() {
- super(mContext);
- }
-
- @Override
- protected void performAction(long accountId) {
- sendPendingMessages(accountId);
- }
- }
-
- public long getLastMailboxListRefreshTime(long accountId) {
- return mMailboxListStatus.get(accountId).getLastRefreshTime();
- }
-
- public long getLastMessageListRefreshTime(long mailboxId) {
- return mMessageListStatus.get(mailboxId).getLastRefreshTime();
- }
-
- public boolean isMailboxListRefreshing(long accountId) {
- return mMailboxListStatus.get(accountId).isRefreshing();
- }
-
- public boolean isMessageListRefreshing(long mailboxId) {
- return mMessageListStatus.get(mailboxId).isRefreshing();
- }
-
- public boolean isRefreshingAnyMailboxListForTest() {
- return mMailboxListStatus.isRefreshingAny();
- }
-
- public boolean isRefreshingAnyMessageListForTest() {
- return mMessageListStatus.isRefreshingAny();
- }
-
- public String getErrorMessage() {
- return mErrorMessage;
- }
-
- private void notifyRefreshStatusChanged(long accountId, long mailboxId) {
- for (Listener l : mListeners) {
- l.onRefreshStatusChanged(accountId, mailboxId);
- }
- }
-
- private void reportError(long accountId, long mailboxId, String errorMessage) {
- mErrorMessage = errorMessage;
- for (Listener l : mListeners) {
- l.onMessagingError(accountId, mailboxId, mErrorMessage);
- }
- }
-
- /* package */ Collection<Listener> getListenersForTest() {
- return mListeners;
- }
-
- /* package */ Status getMailboxListStatusForTest(long accountId) {
- return mMailboxListStatus.get(accountId);
- }
-
- /* package */ Status getMessageListStatusForTest(long mailboxId) {
- return mMessageListStatus.get(mailboxId);
- }
-
- private class ControllerResult extends Controller.Result {
- private boolean mSendMailExceptionReported = false;
-
- private String exceptionToString(MessagingException exception) {
- if (exception == null) {
- return "(no exception)";
- } else {
- return MessagingExceptionStrings.getErrorString(mContext, exception);
- }
- }
-
- /**
- * Callback for mailbox list refresh.
- */
- @Override
- public void updateMailboxListCallback(MessagingException exception, long accountId,
- int progress) {
- if (LOG_ENABLED) {
- Log.d(Logging.LOG_TAG, "updateMailboxListCallback " + accountId + ", " + progress
- + ", " + exceptionToString(exception));
- }
- mMailboxListStatus.get(accountId).onCallback(exception, progress, mClock);
- if (exception != null) {
- reportError(accountId, -1,
- MessagingExceptionStrings.getErrorString(mContext, exception));
- }
- notifyRefreshStatusChanged(accountId, -1);
- }
-
- /**
- * Callback for explicit (user-driven) mailbox refresh.
- */
- @Override
- public void updateMailboxCallback(MessagingException exception, long accountId,
- long mailboxId, int progress, int dontUseNumNewMessages,
- ArrayList<Long> addedMessages) {
- if (LOG_ENABLED) {
- Log.d(Logging.LOG_TAG, "updateMailboxCallback " + accountId + ", "
- + mailboxId + ", " + progress + ", " + exceptionToString(exception));
- }
- updateMailboxCallbackInternal(exception, accountId, mailboxId, progress, 0);
- }
-
- /**
- * Callback for implicit (timer-based) mailbox refresh.
- *
- * Do the same as {@link #updateMailboxCallback}.
- * TODO: Figure out if it's really okay to do the same as updateMailboxCallback.
- * If both the explicit refresh and the implicit refresh can run at the same time,
- * we need to keep track of their status separately.
- */
- @Override
- public void serviceCheckMailCallback(
- MessagingException exception, long accountId, long mailboxId, int progress,
- long tag) {
- if (LOG_ENABLED) {
- Log.d(Logging.LOG_TAG, "serviceCheckMailCallback " + accountId + ", "
- + mailboxId + ", " + progress + ", " + exceptionToString(exception));
- }
- updateMailboxCallbackInternal(exception, accountId, mailboxId, progress, 0);
- }
-
- private void updateMailboxCallbackInternal(MessagingException exception, long accountId,
- long mailboxId, int progress, int dontUseNumNewMessages) {
- // Don't use dontUseNumNewMessages. serviceCheckMailCallback() don't set it.
- mMessageListStatus.get(mailboxId).onCallback(exception, progress, mClock);
- if (exception != null) {
- reportError(accountId, mailboxId,
- MessagingExceptionStrings.getErrorString(mContext, exception));
- }
- notifyRefreshStatusChanged(accountId, mailboxId);
- }
-
-
- /**
- * Send message progress callback.
- *
- * We don't keep track of the status of outboxes, but we monitor this to catch
- * errors.
- */
- @Override
- public void sendMailCallback(MessagingException exception, long accountId, long messageId,
- int progress) {
- if (LOG_ENABLED) {
- Log.d(Logging.LOG_TAG, "sendMailCallback " + accountId + ", "
- + messageId + ", " + progress + ", " + exceptionToString(exception));
- }
- if (progress == 0 && messageId == -1) {
- mSendMailExceptionReported = false;
- }
- if (exception != null && !mSendMailExceptionReported) {
- // Only the first error in a batch will be reported.
- mSendMailExceptionReported = true;
- reportError(accountId, messageId,
- MessagingExceptionStrings.getErrorString(mContext, exception));
- }
- if (progress == 100) {
- mSendMailExceptionReported = false;
- }
- }
- }
-}
diff --git a/src/com/android/email/SecurityPolicy.java b/src/com/android/email/SecurityPolicy.java
index f571e8ad4..9b6cfb8bd 100644
--- a/src/com/android/email/SecurityPolicy.java
+++ b/src/com/android/email/SecurityPolicy.java
@@ -20,23 +20,33 @@ import android.app.admin.DeviceAdminInfo;
import android.app.admin.DeviceAdminReceiver;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
+import android.content.ContentProviderOperation;
import android.content.ContentResolver;
+import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
+import android.content.OperationApplicationException;
import android.database.Cursor;
+import android.net.Uri;
+import android.os.RemoteException;
import android.util.Log;
+import com.android.email.provider.EmailProvider;
import com.android.email.service.EmailBroadcastProcessorService;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent;
import com.android.emailcommon.provider.EmailContent.AccountColumns;
import com.android.emailcommon.provider.EmailContent.PolicyColumns;
import com.android.emailcommon.provider.Policy;
+import com.android.emailcommon.utility.TextUtilities;
import com.android.emailcommon.utility.Utility;
import com.google.common.annotations.VisibleForTesting;
+import java.util.ArrayList;
+
/**
* Utility functions to support reading and writing security policies, and handshaking the device
* into and out of various security states.
@@ -127,7 +137,7 @@ public class SecurityPolicy {
try {
while (c.moveToNext()) {
policy.restore(c);
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "Aggregate from: " + policy);
}
aggregate.mPasswordMinLength =
@@ -172,12 +182,12 @@ public class SecurityPolicy {
aggregate.mPasswordExpirationDays = 0;
if (aggregate.mPasswordComplexChars == Integer.MIN_VALUE)
aggregate.mPasswordComplexChars = 0;
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "Calculated Aggregate: " + aggregate);
}
return aggregate;
}
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "Calculated Aggregate: no policy");
}
return Policy.NO_POLICY;
@@ -204,11 +214,12 @@ public class SecurityPolicy {
}
/**
- * API: Report that policies may have been updated due to rewriting values in an Account.
- * @param accountId the account that has been updated, -1 if unknown/deleted
+ * API: Report that policies may have been updated due to rewriting values in an Account; we
+ * clear the aggregate policy (so it can be recomputed) and set the policies in the DPM
*/
- public synchronized void policiesUpdated(long accountId) {
+ public synchronized void policiesUpdated() {
mAggregatePolicy = null;
+ setActivePolicies();
}
/**
@@ -218,61 +229,10 @@ public class SecurityPolicy {
* rollbacks.
*/
public void reducePolicies() {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "reducePolicies");
}
- policiesUpdated(-1);
- setActivePolicies();
- }
-
- /**
- * API: Query if the proposed set of policies are supported on the device.
- *
- * @param policy the polices that were requested
- * @return boolean if supported
- */
- public boolean isSupported(Policy policy) {
- // IMPLEMENTATION: At this time, the only policy which might not be supported is
- // encryption (which requires low-level systems support). Other policies are fully
- // supported by the framework and do not need to be checked.
- if (policy.mRequireEncryption) {
- int encryptionStatus = getDPM().getStorageEncryptionStatus();
- if (encryptionStatus == DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED) {
- return false;
- }
- }
-
- // If we ever support devices that can't disable cameras for any reason, we should
- // indicate as such in the mDontAllowCamera policy
-
- return true;
- }
-
- /**
- * API: Remove any unsupported policies
- *
- * This is used when we have a set of polices that have been requested, but the server
- * is willing to allow unsupported policies to be considered optional.
- *
- * @param policy the polices that were requested
- * @return the same PolicySet if all are supported; A replacement PolicySet if any
- * unsupported policies were removed
- */
- public Policy clearUnsupportedPolicies(Policy policy) {
- // IMPLEMENTATION: At this time, the only policy which might not be supported is
- // encryption (which requires low-level systems support). Other policies are fully
- // supported by the framework and do not need to be checked.
- if (policy.mRequireEncryption) {
- int encryptionStatus = getDPM().getStorageEncryptionStatus();
- if (encryptionStatus == DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED) {
- policy.mRequireEncryption = false;
- }
- }
-
- // If we ever support devices that can't disable cameras for any reason, we should
- // clear the mDontAllowCamera policy
-
- return policy;
+ policiesUpdated();
}
/**
@@ -284,7 +244,7 @@ public class SecurityPolicy {
*/
public boolean isActive(Policy policy) {
int reasons = getInactiveReasons(policy);
- if (Email.DEBUG && (reasons != 0)) {
+ if (MailActivityEmail.DEBUG && (reasons != 0)) {
StringBuilder sb = new StringBuilder("isActive for " + policy + ": ");
if (reasons == 0) {
sb.append("true");
@@ -303,6 +263,9 @@ public class SecurityPolicy {
if ((reasons & INACTIVE_NEED_ENCRYPTION) != 0) {
sb.append("encryption ");
}
+ if ((reasons & INACTIVE_PROTOCOL_POLICIES) != 0) {
+ sb.append("protocol ");
+ }
Log.d(TAG, sb.toString());
}
return reasons == 0;
@@ -329,6 +292,11 @@ public class SecurityPolicy {
public final static int INACTIVE_NEED_ENCRYPTION = 8;
/**
+ * Return bits from isActive: Protocol-specific policies cannot be enforced
+ */
+ public final static int INACTIVE_PROTOCOL_POLICIES = 16;
+
+ /**
* API: Query used to determine if a given policy is "active" (the device is operating at
* the required security level).
*
@@ -418,6 +386,10 @@ public class SecurityPolicy {
// password failures are counted locally - no test required here
// no check required for remote wipe (it's supported, if we're the admin)
+ if (policy.mProtocolPoliciesUnsupported != null) {
+ reasons |= INACTIVE_PROTOCOL_POLICIES;
+ }
+
// If we made it all the way, reasons == 0 here. Otherwise it's a list of grievances.
return reasons;
}
@@ -436,12 +408,12 @@ public class SecurityPolicy {
Policy aggregatePolicy = getAggregatePolicy();
// if empty set, detach from policy manager
if (aggregatePolicy == Policy.NO_POLICY) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "setActivePolicies: none, remove admin");
}
dpm.removeActiveAdmin(mAdminName);
} else if (isActiveAdmin()) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "setActivePolicies: " + aggregatePolicy);
}
// set each policy in the policy manager
@@ -514,24 +486,123 @@ public class SecurityPolicy {
Account account = Account.restoreAccountWithId(mContext, accountId);
// In case the account has been deleted, just return
if (account == null) return;
- if (Email.DEBUG) {
- if (account.mPolicyKey == 0) {
- Log.d(TAG, "policiesRequired for " + account.mDisplayName + ": none");
- } else {
- Policy policy = Policy.restorePolicyWithId(mContext, account.mPolicyKey);
- if (policy == null) {
- Log.w(TAG, "No policy??");
- } else {
- Log.d(TAG, "policiesRequired for " + account.mDisplayName + ": " + policy);
- }
- }
+ if (account.mPolicyKey == 0) return;
+ Policy policy = Policy.restorePolicyWithId(mContext, account.mPolicyKey);
+ if (policy == null) return;
+ if (MailActivityEmail.DEBUG) {
+ Log.d(TAG, "policiesRequired for " + account.mDisplayName + ": " + policy);
}
// Mark the account as "on hold".
setAccountHoldFlag(mContext, account, true);
- // Put up a notification
- NotificationController.getInstance(mContext).showSecurityNeededNotification(account);
+ // Put up an appropriate notification
+ if (policy.mProtocolPoliciesUnsupported == null) {
+ NotificationController.getInstance(mContext).showSecurityNeededNotification(account);
+ } else {
+ NotificationController.getInstance(mContext).showSecurityUnsupportedNotification(
+ account);
+ }
+ }
+
+ public static void clearAccountPolicy(Context context, Account account) {
+ setAccountPolicy(context, account, null, null);
+ }
+
+ /**
+ * Set the policy for an account atomically; this also removes any other policy associated with
+ * the account and sets the policy key for the account. If policy is null, the policyKey is
+ * set to 0 and the securitySyncKey to null. Also, update the account object to reflect the
+ * current policyKey and securitySyncKey
+ * @param context the caller's context
+ * @param account the account whose policy is to be set
+ * @param policy the policy to set, or null if we're clearing the policy
+ * @param securitySyncKey the security sync key for this account (ignored if policy is null)
+ */
+ public static void setAccountPolicy(Context context, Account account, Policy policy,
+ String securitySyncKey) {
+ ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+
+ // Make sure this is a valid policy set
+ if (policy != null) {
+ policy.normalize();
+ // Add the new policy (no account will yet reference this)
+ ops.add(ContentProviderOperation.newInsert(
+ Policy.CONTENT_URI).withValues(policy.toContentValues()).build());
+ // Make the policyKey of the account our newly created policy, and set the sync key
+ ops.add(ContentProviderOperation.newUpdate(
+ ContentUris.withAppendedId(Account.CONTENT_URI, account.mId))
+ .withValueBackReference(AccountColumns.POLICY_KEY, 0)
+ .withValue(AccountColumns.SECURITY_SYNC_KEY, securitySyncKey)
+ .build());
+ } else {
+ ops.add(ContentProviderOperation.newUpdate(
+ ContentUris.withAppendedId(Account.CONTENT_URI, account.mId))
+ .withValue(AccountColumns.SECURITY_SYNC_KEY, null)
+ .withValue(AccountColumns.POLICY_KEY, 0)
+ .build());
+ }
+
+ // Delete the previous policy associated with this account, if any
+ if (account.mPolicyKey > 0) {
+ ops.add(ContentProviderOperation.newDelete(
+ ContentUris.withAppendedId(
+ Policy.CONTENT_URI, account.mPolicyKey)).build());
+ }
+
+ try {
+ context.getContentResolver().applyBatch(EmailContent.AUTHORITY, ops);
+ account.refresh(context);
+ } catch (RemoteException e) {
+ // This is fatal to a remote process
+ throw new IllegalStateException("Exception setting account policy.");
+ } catch (OperationApplicationException e) {
+ // Can't happen; our provider doesn't throw this exception
+ }
+ }
+
+ public void setAccountPolicy(long accountId, Policy policy, String securityKey) {
+ Account account = Account.restoreAccountWithId(mContext, accountId);
+ Policy oldPolicy = null;
+ if (account.mPolicyKey > 0) {
+ oldPolicy = Policy.restorePolicyWithId(mContext, account.mPolicyKey);
+ }
+ boolean policyChanged = (oldPolicy == null) || !oldPolicy.equals(policy);
+ if (!policyChanged && (TextUtilities.stringOrNullEquals(securityKey,
+ account.mSecuritySyncKey))) {
+ Log.d(Logging.LOG_TAG, "setAccountPolicy; policy unchanged");
+ } else {
+ setAccountPolicy(mContext, account, policy, securityKey);
+ policiesUpdated();
+ }
+
+ boolean setHold = false;
+ if (policy.mProtocolPoliciesUnsupported != null) {
+ // We can't support this, reasons in unsupportedRemotePolicies
+ Log.d(Logging.LOG_TAG,
+ "Notify policies for " + account.mDisplayName + " not supported.");
+ setHold = true;
+ NotificationController.getInstance(mContext).showSecurityUnsupportedNotification(
+ account);
+ // Erase data
+ Uri uri = EmailProvider.uiUri("uiaccountdata", accountId);
+ mContext.getContentResolver().delete(uri, null, null);
+ } else if (isActive(policy)) {
+ if (policyChanged) {
+ Log.d(Logging.LOG_TAG, "Notify policies for " + account.mDisplayName + " changed.");
+ // Notify that policies changed
+ NotificationController.getInstance(mContext).showSecurityChangedNotification(
+ account);
+ }
+ } else {
+ setHold = true;
+ Log.d(Logging.LOG_TAG, "Notify policies for " + account.mDisplayName +
+ " are not being enforced.");
+ // Put up a notification
+ NotificationController.getInstance(mContext).showSecurityNeededNotification(account);
+ }
+ // Set/clear the account hold.
+ setAccountHoldFlag(mContext, account, setHold);
}
/**
@@ -594,13 +665,14 @@ public class SecurityPolicy {
Log.w(TAG, "Email administration disabled; deleting " + c.getCount() +
" secured account(s)");
while (c.moveToNext()) {
- Controller.getInstance(context).deleteAccountSync(
- c.getLong(EmailContent.ID_PROJECTION_COLUMN), context);
+ long accountId = c.getLong(EmailContent.ID_PROJECTION_COLUMN);
+ Uri uri = EmailProvider.uiUri("uiaccountdata", accountId);
+ cr.delete(uri, null, null);
}
} finally {
c.close();
}
- policiesUpdated(-1);
+ policiesUpdated();
}
/**
@@ -643,7 +715,7 @@ public class SecurityPolicy {
nextExpiringAccountId);
} else {
// 5. Actually expired - find all accounts that expire passwords, and wipe them
- boolean wiped = wipeExpiredAccounts(context, Controller.getInstance(context));
+ boolean wiped = wipeExpiredAccounts(context);
if (wiped) {
NotificationController.getInstance(mContext).showPasswordExpiredNotification(
nextExpiringAccountId);
@@ -673,7 +745,7 @@ public class SecurityPolicy {
* @return true if one or more accounts were wiped
*/
@VisibleForTesting
- /*package*/ static boolean wipeExpiredAccounts(Context context, Controller controller) {
+ /*package*/ static boolean wipeExpiredAccounts(Context context) {
boolean result = false;
Cursor c = context.getContentResolver().query(Policy.CONTENT_URI,
Policy.ID_PROJECTION, HAS_PASSWORD_EXPIRATION, null, null);
@@ -687,7 +759,8 @@ public class SecurityPolicy {
// Mark the account as "on hold".
setAccountHoldFlag(context, account, true);
// Erase data
- controller.deleteSyncedDataSync(accountId);
+ Uri uri = EmailProvider.uiUri("uiaccountdata", accountId);
+ context.getContentResolver().delete(uri, null, null);
// Report one or more were found
result = true;
}
diff --git a/src/com/android/email/SingleRunningTask.java b/src/com/android/email/SingleRunningTask.java
index ae628a049..2f40b6272 100644
--- a/src/com/android/email/SingleRunningTask.java
+++ b/src/com/android/email/SingleRunningTask.java
@@ -16,10 +16,10 @@
package com.android.email;
-import com.android.emailcommon.Logging;
-
import android.util.Log;
+import com.android.emailcommon.Logging;
+
import java.util.concurrent.atomic.AtomicBoolean;
/**
@@ -45,12 +45,8 @@ public abstract class SingleRunningTask<Param> {
try {
runInternal(param);
} finally {
- Log.i(Logging.LOG_TAG, mLogTaskName + ": done");
mIsRunning.set(false);
}
- } else {
- // Already running -- do nothing.
- Log.i(Logging.LOG_TAG, mLogTaskName + ": already running");
}
}
diff --git a/src/com/android/email/Throttle.java b/src/com/android/email/Throttle.java
deleted file mode 100644
index 9edddf141..000000000
--- a/src/com/android/email/Throttle.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email;
-
-import com.android.emailcommon.Logging;
-
-import android.os.Handler;
-import android.util.Log;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-/**
- * This class used to "throttle" a flow of events.
- *
- * When {@link #onEvent()} is called, it calls the callback in a certain timeout later.
- * Initially {@link #mMinTimeout} is used as the timeout, but if it gets multiple {@link #onEvent}
- * calls in a certain amount of time, it extends the timeout, until it reaches {@link #mMaxTimeout}.
- *
- * This class is primarily used to throttle content changed events.
- */
-public class Throttle {
- public static final boolean DEBUG = false; // Don't submit with true
-
- public static final int DEFAULT_MIN_TIMEOUT = 150;
- public static final int DEFAULT_MAX_TIMEOUT = 2500;
- /* package */ static final int TIMEOUT_EXTEND_INTERVAL = 500;
-
- private static Timer TIMER = new Timer();
-
- private final Clock mClock;
- private final Timer mTimer;
-
- /** Name of the instance. Only for logging. */
- private final String mName;
-
- /** Handler for UI thread. */
- private final Handler mHandler;
-
- /** Callback to be called */
- private final Runnable mCallback;
-
- /** Minimum (default) timeout, in milliseconds. */
- private final int mMinTimeout;
-
- /** Max timeout, in milliseconds. */
- private final int mMaxTimeout;
-
- /** Current timeout, in milliseconds. */
- private int mTimeout;
-
- /** When {@link #onEvent()} was last called. */
- private long mLastEventTime;
-
- private MyTimerTask mRunningTimerTask;
-
- /** Constructor with default timeout */
- public Throttle(String name, Runnable callback, Handler handler) {
- this(name, callback, handler, DEFAULT_MIN_TIMEOUT, DEFAULT_MAX_TIMEOUT);
- }
-
- /** Constructor that takes custom timeout */
- public Throttle(String name, Runnable callback, Handler handler,int minTimeout,
- int maxTimeout) {
- this(name, callback, handler, minTimeout, maxTimeout, Clock.INSTANCE, TIMER);
- }
-
- /** Constructor for tests */
- /* package */ Throttle(String name, Runnable callback, Handler handler,int minTimeout,
- int maxTimeout, Clock clock, Timer timer) {
- if (maxTimeout < minTimeout) {
- throw new IllegalArgumentException();
- }
- mName = name;
- mCallback = callback;
- mClock = clock;
- mTimer = timer;
- mHandler = handler;
- mMinTimeout = minTimeout;
- mMaxTimeout = maxTimeout;
- mTimeout = mMinTimeout;
- }
-
- private void debugLog(String message) {
- Log.d(Logging.LOG_TAG, "Throttle: [" + mName + "] " + message);
- }
-
- private boolean isCallbackScheduled() {
- return mRunningTimerTask != null;
- }
-
- public void cancelScheduledCallback() {
- if (mRunningTimerTask != null) {
- if (DEBUG) debugLog("Canceling scheduled callback");
- mRunningTimerTask.cancel();
- mRunningTimerTask = null;
- }
- }
-
- /* package */ void updateTimeout() {
- final long now = mClock.getTime();
- if ((now - mLastEventTime) <= TIMEOUT_EXTEND_INTERVAL) {
- mTimeout *= 2;
- if (mTimeout >= mMaxTimeout) {
- mTimeout = mMaxTimeout;
- }
- if (DEBUG) debugLog("Timeout extended " + mTimeout);
- } else {
- mTimeout = mMinTimeout;
- if (DEBUG) debugLog("Timeout reset to " + mTimeout);
- }
-
- mLastEventTime = now;
- }
-
- public void onEvent() {
- if (DEBUG) debugLog("onEvent");
-
- updateTimeout();
-
- if (isCallbackScheduled()) {
- if (DEBUG) debugLog(" callback already scheduled");
- } else {
- if (DEBUG) debugLog(" scheduling callback");
- mRunningTimerTask = new MyTimerTask();
- mTimer.schedule(mRunningTimerTask, mTimeout);
- }
- }
-
- /**
- * Timer task called on timeout,
- */
- private class MyTimerTask extends TimerTask {
- private boolean mCanceled;
-
- @Override
- public void run() {
- mHandler.post(new HandlerRunnable());
- }
-
- @Override
- public boolean cancel() {
- mCanceled = true;
- return super.cancel();
- }
-
- private class HandlerRunnable implements Runnable {
- @Override
- public void run() {
- mRunningTimerTask = null;
- if (!mCanceled) { // This check has to be done on the UI thread.
- if (DEBUG) debugLog("Kicking callback");
- mCallback.run();
- }
- }
- }
- }
-
- /* package */ int getTimeoutForTest() {
- return mTimeout;
- }
-
- /* package */ long getLastEventTimeForTest() {
- return mLastEventTime;
- }
-}
diff --git a/src/com/android/email/activity/AccountSelectorAdapter.java b/src/com/android/email/activity/AccountSelectorAdapter.java
deleted file mode 100644
index 231c2705c..000000000
--- a/src/com/android/email/activity/AccountSelectorAdapter.java
+++ /dev/null
@@ -1,636 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.Context;
-import android.content.Loader;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.CursorAdapter;
-import android.widget.TextView;
-
-import com.android.email.FolderProperties;
-import com.android.email.R;
-import com.android.email.ResourceHelper;
-import com.android.email.data.ClosingMatrixCursor;
-import com.android.email.data.ThrottlingCursorLoader;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-/**
- * Account selector spinner.
- *
- * TODO Test it!
- */
-public class AccountSelectorAdapter extends CursorAdapter {
- /** meta data column for an message count (unread or total, depending on row) */
- private static final String MESSAGE_COUNT = "unreadCount";
-
- /** meta data column for the row type; used for display purposes */
- private static final String ROW_TYPE = "rowType";
-
- /** meta data position of the currently selected account in the drop-down list */
- private static final String ACCOUNT_POSITION = "accountPosition";
-
- /** "account id" virtual column name for the matrix cursor */
- private static final String ACCOUNT_ID = "accountId";
-
- private static final int ROW_TYPE_HEADER = AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
- @SuppressWarnings("unused")
- private static final int ROW_TYPE_MAILBOX = 0;
- private static final int ROW_TYPE_ACCOUNT = 1;
- private static final int ITEM_VIEW_TYPE_ACCOUNT = 0;
- static final int UNKNOWN_POSITION = -1;
- /** Projection for account database query */
- private static final String[] ACCOUNT_PROJECTION = new String[] {
- EmailContent.RECORD_ID,
- Account.DISPLAY_NAME,
- Account.EMAIL_ADDRESS,
- };
- /**
- * Projection used for the selector display; we add meta data that doesn't exist in the
- * account database, so, this should be a super-set of {@link #ACCOUNT_PROJECTION}.
- */
- private static final String[] ADAPTER_PROJECTION = new String[] {
- ROW_TYPE,
- EmailContent.RECORD_ID,
- Account.DISPLAY_NAME,
- Account.EMAIL_ADDRESS,
- MESSAGE_COUNT,
- ACCOUNT_POSITION, // TODO Probably we don't really need this
- ACCOUNT_ID,
- };
-
- /** Sort order. Show the default account first. */
- private static final String ORDER_BY = Account.IS_DEFAULT + " desc, " + Account.RECORD_ID;
-
- @SuppressWarnings("hiding")
- private final Context mContext;
- private final LayoutInflater mInflater;
- private final ResourceHelper mResourceHelper;
-
- /**
- * Returns a loader that can populate the account spinner.
- * @param context a context
- * @param accountId the ID of the currently viewed account
- */
- public static Loader<Cursor> createLoader(Context context, long accountId, long mailboxId) {
- return new AccountsLoader(context, accountId, mailboxId, UiUtilities.useTwoPane(context));
- }
-
- public AccountSelectorAdapter(Context context) {
- super(context, null, 0 /* no auto-requery */);
- mContext = context;
- mInflater = LayoutInflater.from(context);
- mResourceHelper = ResourceHelper.getInstance(context);
- }
-
- /**
- * {@inheritDoc}
- *
- * The account selector view can contain one of four types of row data:
- * <ol>
- * <li>headers</li>
- * <li>accounts</li>
- * <li>recent mailboxes</li>
- * <li>"show all folders"</li>
- * </ol>
- * Headers are handled separately as they have a unique layout and cannot be interacted with.
- * Accounts, recent mailboxes and "show all folders" all have the same interaction model and
- * share a very similar layout. The single difference is that both accounts and recent
- * mailboxes display an unread count; whereas "show all folders" does not. To determine
- * if a particular row is "show all folders" verify that a) it's not an account row and
- * b) it's ID is {@link Mailbox#NO_MAILBOX}.
- *
- * TODO Use recycled views. ({@link #getViewTypeCount} and {@link #getItemViewType})
- */
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- Cursor c = getCursor();
- c.moveToPosition(position);
- View view;
- if (c.getInt(c.getColumnIndex(ROW_TYPE)) == ROW_TYPE_HEADER) {
- view = mInflater.inflate(R.layout.action_bar_spinner_dropdown_header, parent, false);
- final TextView displayNameView = (TextView) view.findViewById(R.id.display_name);
- final String displayName = getDisplayName(c);
- displayNameView.setText(displayName);
- } else {
- view = mInflater.inflate(R.layout.action_bar_spinner_dropdown, parent, false);
- final TextView displayNameView = (TextView) view.findViewById(R.id.display_name);
- final TextView emailAddressView = (TextView) view.findViewById(R.id.email_address);
- final TextView unreadCountView = (TextView) view.findViewById(R.id.unread_count);
- final View chipView = view.findViewById(R.id.color_chip);
-
- final String displayName = getDisplayName(c);
- final String emailAddress = getAccountEmailAddress(c);
-
- displayNameView.setText(displayName);
-
- // Show the email address only when it's different from the display name.
- boolean isAccount = isAccountItem(c);
- if (displayName.equals(emailAddress) || !isAccount) {
- emailAddressView.setVisibility(View.GONE);
- } else {
- emailAddressView.setVisibility(View.VISIBLE);
- emailAddressView.setText(emailAddress);
- }
-
- long id = getId(c);
- if (isAccount || id != Mailbox.NO_MAILBOX) {
- unreadCountView.setVisibility(View.VISIBLE);
- unreadCountView.setText(UiUtilities.getMessageCountForUi(mContext,
- getAccountUnreadCount(c), true));
-
- // If we're on a combined account, show the color chip indicators for all real
- // accounts so it can be used as a legend.
- boolean isCombinedActive =
- ((CursorWithExtras) c).getAccountId() == Account.ACCOUNT_ID_COMBINED_VIEW;
-
- if (isCombinedActive && Account.isNormalAccount(id)) {
- chipView.setBackgroundColor(mResourceHelper.getAccountColor(id));
- chipView.setVisibility(View.VISIBLE);
- } else {
- chipView.setVisibility(View.GONE);
- }
- } else {
- unreadCountView.setVisibility(View.INVISIBLE);
- chipView.setVisibility(View.GONE);
- }
-
- }
- return view;
- }
-
- @Override
- public View newView(Context context, Cursor cursor, ViewGroup parent) {
- return null; // we don't reuse views. This method never gets called.
- }
-
- @Override
- public void bindView(View view, Context context, Cursor cursor) {
- // we don't reuse views. This method never gets called.
- }
-
- @Override
- public int getViewTypeCount() {
- return 2;
- }
-
- @Override
- public int getItemViewType(int position) {
- Cursor c = getCursor();
- c.moveToPosition(position);
- return c.getLong(c.getColumnIndex(ROW_TYPE)) == ROW_TYPE_HEADER
- ? AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER
- : ITEM_VIEW_TYPE_ACCOUNT;
- }
-
- @Override
- public boolean areAllItemsEnabled() {
- return false;
- }
-
- @Override
- public boolean isEnabled(int position) {
- return (getItemViewType(position) != AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER);
- }
-
- public boolean isAccountItem(int position) {
- Cursor c = getCursor();
- c.moveToPosition(position);
- return isAccountItem(c);
- }
-
- public boolean isAccountItem(Cursor c) {
- return (c.getLong(c.getColumnIndex(ROW_TYPE)) == ROW_TYPE_ACCOUNT);
- }
-
- public boolean isMailboxItem(int position) {
- Cursor c = getCursor();
- c.moveToPosition(position);
- return (c.getLong(c.getColumnIndex(ROW_TYPE)) == ROW_TYPE_MAILBOX);
- }
-
- private int getAccountUnreadCount(Cursor c) {
- return getMessageCount(c);
- }
-
- /**
- * Returns the account/mailbox ID extracted from the given cursor.
- */
- private static long getId(Cursor c) {
- return c.getLong(c.getColumnIndex(EmailContent.RECORD_ID));
- }
-
- /**
- * @return ID of the account / mailbox for a row
- */
- public long getId(int position) {
- final Cursor c = getCursor();
- return c.moveToPosition(position) ? getId(c) : Account.NO_ACCOUNT;
- }
-
- /**
- * @return ID of the account for a row
- */
- public long getAccountId(int position) {
- final Cursor c = getCursor();
- return c.moveToPosition(position)
- ? c.getLong(c.getColumnIndex(ACCOUNT_ID))
- : Account.NO_ACCOUNT;
- }
-
- /** Returns the account name extracted from the given cursor. */
- static String getDisplayName(Cursor cursor) {
- return cursor.getString(cursor.getColumnIndex(Account.DISPLAY_NAME));
- }
-
- /** Returns the email address extracted from the given cursor. */
- private static String getAccountEmailAddress(Cursor cursor) {
- return cursor.getString(cursor.getColumnIndex(Account.EMAIL_ADDRESS));
- }
-
- /**
- * Returns the message count (unread or total, depending on row) extracted from the given
- * cursor.
- */
- private static int getMessageCount(Cursor cursor) {
- return cursor.getInt(cursor.getColumnIndex(MESSAGE_COUNT));
- }
-
- private static String sCombinedViewDisplayName;
- private static String getCombinedViewDisplayName(Context c) {
- if (sCombinedViewDisplayName == null) {
- sCombinedViewDisplayName = c.getResources().getString(
- R.string.mailbox_list_account_selector_combined_view);
- }
- return sCombinedViewDisplayName;
- }
-
- /**
- * Load the account list. The resulting cursor contains
- * - Account info
- * - # of unread messages in inbox
- * - The "Combined view" row if there's more than one account.
- */
- @VisibleForTesting
- static class AccountsLoader extends ThrottlingCursorLoader {
- private final Context mContext;
- private final long mAccountId;
- private final long mMailboxId;
- private final boolean mUseTwoPane; // Injectable for test
- private final FolderProperties mFolderProperties;
-
- @VisibleForTesting
- AccountsLoader(Context context, long accountId, long mailboxId, boolean useTwoPane) {
- // Super class loads a regular account cursor, but we replace it in loadInBackground().
- super(context, Account.CONTENT_URI, ACCOUNT_PROJECTION, null, null,
- ORDER_BY);
- mContext = context;
- mAccountId = accountId;
- mMailboxId = mailboxId;
- mFolderProperties = FolderProperties.getInstance(mContext);
- mUseTwoPane = useTwoPane;
- }
-
- @Override
- public Cursor loadInBackground() {
- final Cursor accountsCursor = super.loadInBackground();
- // Use ClosingMatrixCursor so that accountsCursor gets closed too when it's closed.
- final CursorWithExtras resultCursor
- = new CursorWithExtras(ADAPTER_PROJECTION, accountsCursor);
- final int accountPosition = addAccountsToCursor(resultCursor, accountsCursor);
- addMailboxesToCursor(resultCursor, accountPosition);
-
- resultCursor.setAccountMailboxInfo(getContext(), mAccountId, mMailboxId);
- return resultCursor;
- }
-
- /** Adds the account list [with extra meta data] to the given matrix cursor */
- private int addAccountsToCursor(CursorWithExtras matrixCursor, Cursor accountCursor) {
- int accountPosition = UNKNOWN_POSITION;
- accountCursor.moveToPosition(-1);
-
- matrixCursor.mAccountCount = accountCursor.getCount();
- int totalUnread = 0;
- while (accountCursor.moveToNext()) {
- // Add account, with its unread count.
- final long accountId = accountCursor.getLong(0);
- final int unread = Mailbox.getUnreadCountByAccountAndMailboxType(
- mContext, accountId, Mailbox.TYPE_INBOX);
- final String name = getDisplayName(accountCursor);
- final String emailAddress = getAccountEmailAddress(accountCursor);
- addRow(matrixCursor, ROW_TYPE_ACCOUNT, accountId, name, emailAddress, unread,
- UNKNOWN_POSITION, accountId);
- totalUnread += unread;
- if (accountId == mAccountId) {
- accountPosition = accountCursor.getPosition();
- }
- }
- // Add "combined view" if more than one account exists
- final int countAccounts = accountCursor.getCount();
- if (countAccounts > 1) {
- final String accountCount = mContext.getResources().getQuantityString(
- R.plurals.number_of_accounts, countAccounts, countAccounts);
- addRow(matrixCursor, ROW_TYPE_ACCOUNT, Account.ACCOUNT_ID_COMBINED_VIEW,
- getCombinedViewDisplayName(mContext),
- accountCount, totalUnread, UNKNOWN_POSITION,
- Account.ACCOUNT_ID_COMBINED_VIEW);
-
- // Increment the account count for the combined account.
- matrixCursor.mAccountCount++;
- }
- return accountPosition;
- }
-
- /**
- * Adds the recent mailbox list / "show all folders" to the given cursor.
- *
- * @param matrixCursor the cursor to add the list to
- * @param accountPosition the cursor position of the currently selected account
- */
- private void addMailboxesToCursor(CursorWithExtras matrixCursor, int accountPosition) {
- if (mAccountId == Account.NO_ACCOUNT) {
- return; // Account not selected
- }
- if (mAccountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- if (!mUseTwoPane) {
- // TODO We may want a header for this to separate it from the account list
- addShowAllFoldersRow(matrixCursor, accountPosition);
- }
- return;
- }
- String emailAddress = null;
- if (accountPosition != UNKNOWN_POSITION) {
- matrixCursor.moveToPosition(accountPosition);
- emailAddress =
- matrixCursor.getString(matrixCursor.getColumnIndex(Account.EMAIL_ADDRESS));
- }
- RecentMailboxManager mailboxManager = RecentMailboxManager.getInstance(mContext);
- ArrayList<Long> recentMailboxes = null;
- if (!mUseTwoPane) {
- // Do not display recent mailboxes in the account spinner for the two pane view
- recentMailboxes = mailboxManager.getMostRecent(mAccountId, mUseTwoPane);
- }
- final int recentCount = (recentMailboxes == null) ? 0 : recentMailboxes.size();
- matrixCursor.mRecentCount = recentCount;
-
- if (!mUseTwoPane) {
- // "Recent mailboxes" header
- addHeaderRow(matrixCursor, mContext.getString(
- R.string.mailbox_list_account_selector_mailbox_header_fmt, emailAddress));
- }
-
- if (recentCount > 0) {
- addMailboxRows(matrixCursor, accountPosition, recentMailboxes);
- }
-
- if (!mUseTwoPane) {
- addShowAllFoldersRow(matrixCursor, accountPosition);
- }
- }
-
- private void addShowAllFoldersRow(CursorWithExtras matrixCursor, int accountPosition) {
- matrixCursor.mHasShowAllFolders = true;
- String name = mContext.getString(
- R.string.mailbox_list_account_selector_show_all_folders);
- addRow(matrixCursor, ROW_TYPE_MAILBOX, Mailbox.NO_MAILBOX, name, null, 0,
- accountPosition, mAccountId);
- }
-
-
- private static final String[] RECENT_MAILBOX_INFO_PROJECTION = new String[] {
- MailboxColumns.ID, MailboxColumns.DISPLAY_NAME, MailboxColumns.TYPE,
- MailboxColumns.UNREAD_COUNT, MailboxColumns.MESSAGE_COUNT
- };
-
- private void addMailboxRows(MatrixCursor matrixCursor, int accountPosition,
- Collection<Long> mailboxIds) {
- Cursor c = mContext.getContentResolver().query(
- Mailbox.CONTENT_URI, RECENT_MAILBOX_INFO_PROJECTION,
- Utility.buildInSelection(MailboxColumns.ID, mailboxIds), null,
- RecentMailboxManager.RECENT_MAILBOXES_SORT_ORDER);
- try {
- c.moveToPosition(-1);
- while (c.moveToNext()) {
- addRow(matrixCursor, ROW_TYPE_MAILBOX,
- c.getLong(c.getColumnIndex(MailboxColumns.ID)),
- mFolderProperties.getDisplayName(c), null,
- mFolderProperties.getMessageCount(c), accountPosition, mAccountId);
- }
- } finally {
- c.close();
- }
- }
-
- private void addHeaderRow(MatrixCursor cursor, String name) {
- addRow(cursor, ROW_TYPE_HEADER, 0L, name, null, 0, UNKNOWN_POSITION,
- Account.NO_ACCOUNT);
- }
-
- /** Adds a row to the given cursor */
- private void addRow(MatrixCursor cursor, int rowType, long id, String name,
- String emailAddress, int messageCount, int listPosition, long accountId) {
- cursor.newRow()
- .add(rowType)
- .add(id)
- .add(name)
- .add(emailAddress)
- .add(messageCount)
- .add(listPosition)
- .add(accountId);
- }
- }
-
- /** Cursor with some extra meta data. */
- static class CursorWithExtras extends ClosingMatrixCursor {
-
- /** Number of account elements, including the combined account row. */
- private int mAccountCount;
- /** Number of recent mailbox elements */
- private int mRecentCount;
- private boolean mHasShowAllFolders;
-
- private boolean mAccountExists;
-
- /**
- * Account ID that's loaded.
- */
- private long mAccountId;
- private String mAccountDisplayName;
-
- /**
- * Mailbox ID that's loaded.
- */
- private long mMailboxId;
- private String mMailboxDisplayName;
- private int mMailboxMessageCount;
-
- @VisibleForTesting
- CursorWithExtras(String[] columnNames, Cursor innerCursor) {
- super(columnNames, innerCursor);
- }
-
- private static final String[] ACCOUNT_INFO_PROJECTION = new String[] {
- AccountColumns.DISPLAY_NAME,
- };
- private static final String[] MAILBOX_INFO_PROJECTION = new String[] {
- MailboxColumns.ID, MailboxColumns.DISPLAY_NAME, MailboxColumns.TYPE,
- MailboxColumns.UNREAD_COUNT, MailboxColumns.MESSAGE_COUNT
- };
-
- /**
- * Set the current account/mailbox info.
- */
- @VisibleForTesting
- void setAccountMailboxInfo(Context context, long accountId, long mailboxId) {
- mAccountId = accountId;
- mMailboxId = mailboxId;
-
- // Get account info
- if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- // We need to treat ACCOUNT_ID_COMBINED_VIEW specially...
- mAccountExists = true;
- mAccountDisplayName = getCombinedViewDisplayName(context);
- if (mailboxId != Mailbox.NO_MAILBOX) {
- setCombinedMailboxInfo(context, mailboxId);
- }
- return;
- }
-
- mAccountDisplayName = Utility.getFirstRowString(context,
- ContentUris.withAppendedId(Account.CONTENT_URI, accountId),
- ACCOUNT_INFO_PROJECTION, null, null, null, 0, null);
- if (mAccountDisplayName == null) {
- // Account gone!
- mAccountExists = false;
- return;
- }
- mAccountExists = true;
-
- // If mailbox not specified, done.
- if (mMailboxId == Mailbox.NO_MAILBOX) {
- return;
- }
- // Combined mailbox?
- // Unfortunately this can happen even when account != ACCOUNT_ID_COMBINED_VIEW,
- // when you open "starred" on 2-pane on non-combined view.
- if (mMailboxId < 0) {
- setCombinedMailboxInfo(context, mailboxId);
- return;
- }
-
- // Get mailbox info
- final ContentResolver r = context.getContentResolver();
- final Cursor mailboxCursor = r.query(
- ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId),
- MAILBOX_INFO_PROJECTION, null, null, null);
- try {
- if (mailboxCursor.moveToFirst()) {
- final FolderProperties fp = FolderProperties.getInstance(context);
- mMailboxDisplayName = fp.getDisplayName(mailboxCursor);
- mMailboxMessageCount = fp.getMessageCount(mailboxCursor);
- }
- } finally {
- mailboxCursor.close();
- }
- }
-
- private void setCombinedMailboxInfo(Context context, long mailboxId) {
- Preconditions.checkState(mailboxId < -1, "Not combined mailbox");
- mMailboxDisplayName = FolderProperties.getInstance(context)
- .getCombinedMailboxName(mMailboxId);
-
- mMailboxMessageCount = FolderProperties.getMessageCountForCombinedMailbox(
- context, mailboxId);
- }
-
- /**
- * Returns the cursor position of the item with the given ID. Or {@link #UNKNOWN_POSITION}
- * if the given ID does not exist.
- */
- int getPosition(long id) {
- moveToPosition(-1);
- while(moveToNext()) {
- if (id == getId(this)) {
- return getPosition();
- }
- }
- return UNKNOWN_POSITION;
- }
-
- public int getAccountCount() {
- return mAccountCount;
- }
-
- @VisibleForTesting
- public int getRecentMailboxCount() {
- return mRecentCount;
- }
-
- /**
- * @return true if the cursor has more than one selectable item so we should enable the
- * spinner.
- */
- public boolean shouldEnableSpinner() {
- return mHasShowAllFolders || (mAccountCount + mRecentCount > 1);
- }
-
- public long getAccountId() {
- return mAccountId;
- }
-
- public String getAccountDisplayName() {
- return mAccountDisplayName;
- }
-
- @VisibleForTesting
- public long getMailboxId() {
- return mMailboxId;
- }
-
- public String getMailboxDisplayName() {
- return mMailboxDisplayName;
- }
-
- public int getMailboxMessageCount() {
- return mMailboxMessageCount;
- }
-
- /**
- * @return {@code true} if the specified accuont exists.
- */
- public boolean accountExists() {
- return mAccountExists;
- }
- }
-}
diff --git a/src/com/android/email/activity/ActionBarController.java b/src/com/android/email/activity/ActionBarController.java
deleted file mode 100644
index 4a5df7cf6..000000000
--- a/src/com/android/email/activity/ActionBarController.java
+++ /dev/null
@@ -1,574 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.ActionBar;
-import android.app.LoaderManager;
-import android.app.LoaderManager.LoaderCallbacks;
-import android.content.Context;
-import android.content.Loader;
-import android.database.Cursor;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ListPopupWindow;
-import android.widget.ListView;
-import android.widget.SearchView;
-import android.widget.TextView;
-
-import com.android.email.R;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.DelayedOperations;
-import com.android.emailcommon.utility.Utility;
-
-/**
- * Manages the account name and the custom view part on the action bar.
- */
-public class ActionBarController {
- private static final String BUNDLE_KEY_MODE = "ActionBarController.BUNDLE_KEY_MODE";
-
- /**
- * Constants for {@link #mSearchMode}.
- *
- * In {@link #MODE_NORMAL} mode, we don't show the search box.
- * In {@link #MODE_SEARCH} mode, we do show the search box.
- * The action bar doesn't really care if the activity is showing search results.
- * If the activity is showing search results, and the {@link Callback#onSearchExit} is called,
- * the activity probably wants to close itself, but this class doesn't make the desision.
- */
- private static final int MODE_NORMAL = 0;
- private static final int MODE_SEARCH = 1;
-
- private static final int LOADER_ID_ACCOUNT_LIST
- = EmailActivity.ACTION_BAR_CONTROLLER_LOADER_ID_BASE + 0;
-
- private final Context mContext;
- private final LoaderManager mLoaderManager;
- private final ActionBar mActionBar;
- private final DelayedOperations mDelayedOperations;
-
- /** "Folders" label shown with account name on 1-pane mailbox list */
- private final String mAllFoldersLabel;
-
- private final ViewGroup mActionBarCustomView;
- private final ViewGroup mAccountSpinnerContainer;
- private final View mAccountSpinner;
- private final Drawable mAccountSpinnerDefaultBackground;
- private final TextView mAccountSpinnerLine1View;
- private final TextView mAccountSpinnerLine2View;
- private final TextView mAccountSpinnerCountView;
-
- private View mSearchContainer;
- private SearchView mSearchView;
-
- private final AccountDropdownPopup mAccountDropdown;
-
- private final AccountSelectorAdapter mAccountsSelectorAdapter;
-
- private AccountSelectorAdapter.CursorWithExtras mCursor;
-
- /** The current account ID; used to determine if the account has changed. */
- private long mLastAccountIdForDirtyCheck = Account.NO_ACCOUNT;
-
- /** The current mailbox ID; used to determine if the mailbox has changed. */
- private long mLastMailboxIdForDirtyCheck = Mailbox.NO_MAILBOX;
-
- /** Either {@link #MODE_NORMAL} or {@link #MODE_SEARCH}. */
- private int mSearchMode = MODE_NORMAL;
-
- /** The current title mode, which should be one of {@code Callback TITLE_MODE_*} */
- private int mTitleMode;
-
- public final Callback mCallback;
-
- public interface SearchContext {
- public long getTargetMailboxId();
- }
-
- private static final int TITLE_MODE_SPINNER_ENABLED = 0x10;
-
- public interface Callback {
- /** Values for {@link #getTitleMode}. Show only account name */
- public static final int TITLE_MODE_ACCOUNT_NAME_ONLY = 0 | TITLE_MODE_SPINNER_ENABLED;
-
- /**
- * Show the current account name with "Folders"
- * The account spinner will be disabled in this mode.
- */
- public static final int TITLE_MODE_ACCOUNT_WITH_ALL_FOLDERS_LABEL = 1;
-
- /**
- * Show the current account name and the current mailbox name.
- */
- public static final int TITLE_MODE_ACCOUNT_WITH_MAILBOX = 2 | TITLE_MODE_SPINNER_ENABLED;
- /**
- * Show the current message subject. Actual subject is obtained via
- * {@link #getMessageSubject()}.
- *
- * The account spinner will be disabled in this mode.
- */
- public static final int TITLE_MODE_MESSAGE_SUBJECT = 3;
-
- /** @return true if an account is selected. */
- public boolean isAccountSelected();
-
- /**
- * @return currently selected account ID, {@link Account#ACCOUNT_ID_COMBINED_VIEW},
- * or -1 if no account is selected.
- */
- public long getUIAccountId();
-
- /**
- * @return currently selected mailbox ID, or {@link Mailbox#NO_MAILBOX} if no mailbox is
- * selected.
- */
- public long getMailboxId();
-
- /**
- * @return constants such as {@link #TITLE_MODE_ACCOUNT_NAME_ONLY}.
- */
- public int getTitleMode();
-
- /** @see #TITLE_MODE_MESSAGE_SUBJECT */
- public String getMessageSubject();
-
- /** @return the "UP" arrow should be shown. */
- public boolean shouldShowUp();
-
- /**
- * Called when an account is selected on the account spinner.
- * @param accountId ID of the selected account, or {@link Account#ACCOUNT_ID_COMBINED_VIEW}.
- */
- public void onAccountSelected(long accountId);
-
- /**
- * Invoked when a recent mailbox is selected on the account spinner.
- *
- * @param accountId ID of the selected account, or {@link Account#ACCOUNT_ID_COMBINED_VIEW}.
- * @param mailboxId The ID of the selected mailbox, or {@link Mailbox#NO_MAILBOX} if the
- * special option "show all mailboxes" was selected.
- */
- public void onMailboxSelected(long accountId, long mailboxId);
-
- /** Called when no accounts are found in the database. */
- public void onNoAccountsFound();
-
- /**
- * Retrieves the hint text to be shown for when a search entry is being made.
- */
- public String getSearchHint();
-
- /**
- * Called when the action bar initially shows the search entry field.
- */
- public void onSearchStarted();
-
- /**
- * Called when a search is submitted.
- *
- * @param queryTerm query string
- */
- public void onSearchSubmit(String queryTerm);
-
- /**
- * Called when the search box is closed.
- */
- public void onSearchExit();
- }
-
- public ActionBarController(Context context, LoaderManager loaderManager,
- ActionBar actionBar, Callback callback) {
- mContext = context;
- mLoaderManager = loaderManager;
- mActionBar = actionBar;
- mCallback = callback;
- mDelayedOperations = new DelayedOperations(Utility.getMainThreadHandler());
- mAllFoldersLabel = mContext.getResources().getString(
- R.string.action_bar_mailbox_list_title);
- mAccountsSelectorAdapter = new AccountSelectorAdapter(mContext);
-
- // Configure action bar.
- mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_CUSTOM);
-
- // Prepare the custom view
- mActionBar.setCustomView(R.layout.action_bar_custom_view);
- mActionBarCustomView = (ViewGroup) mActionBar.getCustomView();
-
- // Account spinner
- mAccountSpinnerContainer =
- UiUtilities.getView(mActionBarCustomView, R.id.account_spinner_container);
- mAccountSpinner = UiUtilities.getView(mActionBarCustomView, R.id.account_spinner);
- mAccountSpinnerDefaultBackground = mAccountSpinner.getBackground();
-
- mAccountSpinnerLine1View = UiUtilities.getView(mActionBarCustomView, R.id.spinner_line_1);
- mAccountSpinnerLine2View = UiUtilities.getView(mActionBarCustomView, R.id.spinner_line_2);
- mAccountSpinnerCountView = UiUtilities.getView(mActionBarCustomView, R.id.spinner_count);
-
- // Account dropdown
- mAccountDropdown = new AccountDropdownPopup(mContext);
- mAccountDropdown.setAdapter(mAccountsSelectorAdapter);
-
- mAccountSpinner.setOnClickListener(new View.OnClickListener() {
- @Override public void onClick(View v) {
- if (mAccountsSelectorAdapter.getCount() > 0) {
- mAccountDropdown.show();
- }
- }
- });
- }
-
- private void initSearchViews() {
- if (mSearchContainer == null) {
- final LayoutInflater inflater = LayoutInflater.from(mContext);
- mSearchContainer = inflater.inflate(R.layout.action_bar_search, null);
- mSearchView = UiUtilities.getView(mSearchContainer, R.id.search_view);
- mSearchView.setSubmitButtonEnabled(false);
- mSearchView.setOnQueryTextListener(mOnQueryText);
- mSearchView.onActionViewExpanded();
- mActionBarCustomView.addView(mSearchContainer);
- }
- }
-
-
- /** Must be called from {@link UIControllerBase#onActivityCreated()} */
- public void onActivityCreated() {
- refresh();
- }
-
- /** Must be called from {@link UIControllerBase#onActivityDestroy()} */
- public void onActivityDestroy() {
- if (mAccountDropdown.isShowing()) {
- mAccountDropdown.dismiss();
- }
- }
-
- /** Must be called from {@link UIControllerBase#onSaveInstanceState} */
- public void onSaveInstanceState(Bundle outState) {
- mDelayedOperations.removeCallbacks(); // Remove all pending operations
- outState.putInt(BUNDLE_KEY_MODE, mSearchMode);
- }
-
- /** Must be called from {@link UIControllerBase#onRestoreInstanceState} */
- public void onRestoreInstanceState(Bundle savedState) {
- int mode = savedState.getInt(BUNDLE_KEY_MODE);
- if (mode == MODE_SEARCH) {
- // No need to re-set the initial query, as the View tree restoration does that
- enterSearchMode(null);
- }
- }
-
- /**
- * @return true if the search box is shown.
- */
- public boolean isInSearchMode() {
- return mSearchMode == MODE_SEARCH;
- }
-
- /**
- * @return Whether or not the search bar should be shown. This is a function of whether or not a
- * search is active, and if the current layout supports it.
- */
- private boolean shouldShowSearchBar() {
- return isInSearchMode() && (mTitleMode != Callback.TITLE_MODE_MESSAGE_SUBJECT);
- }
-
- /**
- * Show the search box.
- *
- * @param initialQueryTerm if non-empty, set to the search box.
- */
- public void enterSearchMode(String initialQueryTerm) {
- initSearchViews();
- if (isInSearchMode()) {
- return;
- }
- if (!TextUtils.isEmpty(initialQueryTerm)) {
- mSearchView.setQuery(initialQueryTerm, false);
- } else {
- mSearchView.setQuery("", false);
- }
- mSearchView.setQueryHint(mCallback.getSearchHint());
-
- mSearchMode = MODE_SEARCH;
-
- // Focus on the search input box and throw up the IME if specified.
- // TODO: HACK. this is a workaround IME not popping up.
- mSearchView.setIconified(false);
-
- refresh();
- mCallback.onSearchStarted();
- }
-
- public void exitSearchMode() {
- if (!isInSearchMode()) {
- return;
- }
- mSearchMode = MODE_NORMAL;
-
- refresh();
- mCallback.onSearchExit();
- }
-
- /**
- * Performs the back action.
- *
- * @param isSystemBackKey <code>true</code> if the system back key was pressed.
- * <code>false</code> if it's caused by the "home" icon click on the action bar.
- */
- public boolean onBackPressed(boolean isSystemBackKey) {
- if (shouldShowSearchBar()) {
- exitSearchMode();
- return true;
- }
- return false;
- }
-
- /** Refreshes the action bar display. */
- public void refresh() {
- // The actual work is in refreshInernal(), but we don't call it directly here, because:
- // 1. refresh() is called very often.
- // 2. to avoid nested fragment transaction.
- // refresh is often called during a fragment transaction, but updateTitle() may call
- // a callback which would initiate another fragment transaction.
- mDelayedOperations.removeCallbacks(mRefreshRunnable);
- mDelayedOperations.post(mRefreshRunnable);
- }
-
- private final Runnable mRefreshRunnable = new Runnable() {
- @Override public void run() {
- refreshInernal();
- }
- };
- private void refreshInernal() {
- final boolean showUp = isInSearchMode() || mCallback.shouldShowUp();
- mActionBar.setDisplayOptions(showUp
- ? ActionBar.DISPLAY_HOME_AS_UP : 0, ActionBar.DISPLAY_HOME_AS_UP);
-
- final long accountId = mCallback.getUIAccountId();
- final long mailboxId = mCallback.getMailboxId();
- if ((mLastAccountIdForDirtyCheck != accountId)
- || (mLastMailboxIdForDirtyCheck != mailboxId)) {
- mLastAccountIdForDirtyCheck = accountId;
- mLastMailboxIdForDirtyCheck = mailboxId;
-
- if (accountId != Account.NO_ACCOUNT) {
- loadAccountMailboxInfo(accountId, mailboxId);
- }
- }
-
- updateTitle();
- }
-
- /**
- * Load account/mailbox info, and account/recent mailbox list.
- */
- private void loadAccountMailboxInfo(final long accountId, final long mailboxId) {
- mLoaderManager.restartLoader(LOADER_ID_ACCOUNT_LIST, null,
- new LoaderCallbacks<Cursor>() {
- @Override
- public Loader<Cursor> onCreateLoader(int id, Bundle args) {
- return AccountSelectorAdapter.createLoader(mContext, accountId, mailboxId);
- }
-
- @Override
- public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
- mCursor = (AccountSelectorAdapter.CursorWithExtras) data;
- updateTitle();
- }
-
- @Override
- public void onLoaderReset(Loader<Cursor> loader) {
- mCursor = null;
- updateTitle();
- }
- });
- }
-
- /**
- * Update the "title" part.
- */
- private void updateTitle() {
- mAccountsSelectorAdapter.swapCursor(mCursor);
-
- if (mCursor == null) {
- // Initial load not finished.
- mActionBarCustomView.setVisibility(View.GONE);
- return;
- }
- mActionBarCustomView.setVisibility(View.VISIBLE);
-
- if (mCursor.getAccountCount() == 0) {
- mCallback.onNoAccountsFound();
- return;
- }
-
- if ((mCursor.getAccountId() != Account.NO_ACCOUNT) && !mCursor.accountExists()) {
- // Account specified, but does not exist.
- if (isInSearchMode()) {
- exitSearchMode();
- }
-
- // Switch to the default account.
- mCallback.onAccountSelected(Account.getDefaultAccountId(mContext));
- return;
- }
-
- mTitleMode = mCallback.getTitleMode();
-
- if (shouldShowSearchBar()) {
- initSearchViews();
- // In search mode, the search box is a replacement of the account spinner, so ignore
- // the work needed to update that. It will get updated when it goes visible again.
- mAccountSpinnerContainer.setVisibility(View.GONE);
- mSearchContainer.setVisibility(View.VISIBLE);
- return;
- }
-
- // Account spinner visible.
- mAccountSpinnerContainer.setVisibility(View.VISIBLE);
- UiUtilities.setVisibilitySafe(mSearchContainer, View.GONE);
-
- if (mTitleMode == Callback.TITLE_MODE_MESSAGE_SUBJECT) {
- mAccountSpinnerLine1View.setSingleLine(false);
- mAccountSpinnerLine1View.setMaxLines(2);
- mAccountSpinnerLine1View.setText(mCallback.getMessageSubject());
- mAccountSpinnerLine2View.setVisibility(View.GONE);
-
- mAccountSpinnerCountView.setVisibility(View.GONE);
-
- } else {
- // Get mailbox name
- final String mailboxName;
- if (mTitleMode == Callback.TITLE_MODE_ACCOUNT_WITH_ALL_FOLDERS_LABEL) {
- mailboxName = mAllFoldersLabel;
- } else if (mTitleMode == Callback.TITLE_MODE_ACCOUNT_WITH_MAILBOX) {
- mailboxName = mCursor.getMailboxDisplayName();
- } else {
- mailboxName = null;
- }
-
- // Note - setSingleLine is needed as well as setMaxLines since they set different
- // flags on the view.
- mAccountSpinnerLine1View.setSingleLine();
- mAccountSpinnerLine1View.setMaxLines(1);
- if (TextUtils.isEmpty(mailboxName)) {
- mAccountSpinnerLine1View.setText(mCursor.getAccountDisplayName());
-
- // Change the visibility of line 2, so line 1 will be vertically-centered.
- mAccountSpinnerLine2View.setVisibility(View.GONE);
- } else {
- mAccountSpinnerLine1View.setText(mailboxName);
- mAccountSpinnerLine2View.setVisibility(View.VISIBLE);
- mAccountSpinnerLine2View.setText(mCursor.getAccountDisplayName());
- }
-
- mAccountSpinnerCountView.setVisibility(View.VISIBLE);
- mAccountSpinnerCountView.setText(UiUtilities.getMessageCountForUi(
- mContext, mCursor.getMailboxMessageCount(), true));
- }
-
- boolean spinnerEnabled =
- ((mTitleMode & TITLE_MODE_SPINNER_ENABLED) != 0) && mCursor.shouldEnableSpinner();
-
-
- setSpinnerEnabled(spinnerEnabled);
- }
-
- private void setSpinnerEnabled(boolean enabled) {
- if (enabled == mAccountSpinner.isEnabled()) {
- return;
- }
-
- mAccountSpinner.setEnabled(enabled);
- if (enabled) {
- mAccountSpinner.setBackgroundDrawable(mAccountSpinnerDefaultBackground);
- } else {
- mAccountSpinner.setBackgroundDrawable(null);
- }
-
- // For some reason, changing the background mucks with the padding so we have to manually
- // reset vertical padding here (also specified in XML, but it seems to be ignored for
- // some reason.
- mAccountSpinner.setPadding(
- mAccountSpinner.getPaddingLeft(),
- 0,
- mAccountSpinner.getPaddingRight(),
- 0);
- }
-
-
- private final SearchView.OnQueryTextListener mOnQueryText
- = new SearchView.OnQueryTextListener() {
- @Override
- public boolean onQueryTextChange(String newText) {
- // Event not handled. Let the search do the default action.
- return false;
- }
-
- @Override
- public boolean onQueryTextSubmit(String query) {
- mCallback.onSearchSubmit(mSearchView.getQuery().toString());
- return true; // Event handled.
- }
- };
-
- private void onAccountSpinnerItemClicked(int position) {
- if (mAccountsSelectorAdapter == null) { // just in case...
- return;
- }
- final long accountId = mAccountsSelectorAdapter.getAccountId(position);
-
- if (mAccountsSelectorAdapter.isAccountItem(position)) {
- mCallback.onAccountSelected(accountId);
- } else if (mAccountsSelectorAdapter.isMailboxItem(position)) {
- mCallback.onMailboxSelected(accountId,
- mAccountsSelectorAdapter.getId(position));
- }
- }
-
- // Based on Spinner.DropdownPopup
- private class AccountDropdownPopup extends ListPopupWindow {
- public AccountDropdownPopup(Context context) {
- super(context);
- setAnchorView(mAccountSpinner);
- setModal(true);
- setPromptPosition(POSITION_PROMPT_ABOVE);
- setOnItemClickListener(new OnItemClickListener() {
- public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
- onAccountSpinnerItemClicked(position);
- dismiss();
- }
- });
- }
-
- @Override
- public void show() {
- setWidth(mContext.getResources().getDimensionPixelSize(
- R.dimen.account_dropdown_dropdownwidth));
- setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
- super.show();
- // List view is instantiated in super.show(), so we need to do this after...
- getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
- }
- }
-}
diff --git a/src/com/android/email/activity/ActivityHelper.java b/src/com/android/email/activity/ActivityHelper.java
index f795b2771..ebab0e54a 100644
--- a/src/com/android/email/activity/ActivityHelper.java
+++ b/src/com/android/email/activity/ActivityHelper.java
@@ -18,20 +18,14 @@ package com.android.email.activity;
import android.app.Activity;
import android.content.ActivityNotFoundException;
-import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.Browser;
import android.view.WindowManager;
-import com.android.email.Controller;
-import com.android.email.Email;
-import com.android.email.R;
import com.android.email.activity.setup.AccountSecurity;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
/**
* Various methods that are used by both 1-pane and 2-pane activities.
@@ -61,9 +55,10 @@ public final class ActivityHelper {
*/
public static boolean openUrlInMessage(Activity activity, String url, long senderAccountId) {
// hijack mailto: uri's and handle locally
- if (url != null && url.toLowerCase().startsWith("mailto:")) {
- return MessageCompose.actionCompose(activity, url, senderAccountId);
- }
+ //***
+ //if (url != null && url.toLowerCase().startsWith("mailto:")) {
+ // return MessageCompose.actionCompose(activity, url, senderAccountId);
+ //}
// Handle most uri's via intent launch
boolean result = false;
@@ -81,49 +76,13 @@ public final class ActivityHelper {
}
/**
- * Open Calendar app with specific time
- */
- public static void openCalendar(Activity activity, long epochEventStartTime) {
- Uri uri = Uri.parse("content://com.android.calendar/time/" + epochEventStartTime);
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setData(uri);
- intent.putExtra("VIEW", "DAY");
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
- activity.startActivity(intent);
- }
-
- public static void deleteMessage(Context context, long messageId) {
- Controller.getInstance(context).deleteMessage(messageId);
- Utility.showToast(context,
- context.getResources().getQuantityString(R.plurals.message_deleted_toast, 1));
- }
-
- public static void moveMessages(final Context context, final long newMailboxId,
- final long[] messageIds) {
- Controller.getInstance(context).moveMessages(messageIds, newMailboxId);
- EmailAsyncTask.runAsyncSerial(new Runnable() {
- @Override
- public void run() {
- String mailboxName = Mailbox.getDisplayName(context, newMailboxId);
- if (mailboxName == null) {
- return; // Mailbox gone??
- }
- String message = context.getResources().getQuantityString(
- R.plurals.message_moved_toast, messageIds.length, messageIds.length ,
- mailboxName);
- Utility.showToast(context, message);
- }
- });
- }
-
- /**
* If configured via debug flags, inhibit hardware graphics acceleration. Must be called
* early in onCreate().
*
* NOTE: Currently, this only works if HW accel is *not* enabled via the manifest.
*/
public static void debugSetWindowFlags(Activity activity) {
- if (Email.sDebugInhibitGraphicsAcceleration) {
+ if (MailActivityEmail.sDebugInhibitGraphicsAcceleration) {
// Clear the flag in the activity's window
activity.getWindow().setFlags(0,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
diff --git a/src/com/android/email/activity/AddressTextView.java b/src/com/android/email/activity/AddressTextView.java
deleted file mode 100644
index dd73b2442..000000000
--- a/src/com/android/email/activity/AddressTextView.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import com.android.email.R;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.MultiAutoCompleteTextView;
-
-/**
- * This is a MultiAutoCompleteTextView which sets the error state
- * (@see TextView.setError) when email address validation fails.
- */
-class AddressTextView extends MultiAutoCompleteTextView {
- private class ForwardValidator implements Validator {
- private Validator mValidator = null;
-
- public CharSequence fixText(CharSequence invalidText) {
- mIsValid = false;
- return invalidText;
- }
-
- public boolean isValid(CharSequence text) {
- return mValidator != null ? mValidator.isValid(text) : true;
- }
-
- public void setValidator(Validator validator) {
- mValidator = validator;
- }
- }
-
- private boolean mIsValid = true;
- private final ForwardValidator mInternalValidator = new ForwardValidator();
-
- public AddressTextView(Context context, AttributeSet attrs) {
- super(context, attrs);
- super.setValidator(mInternalValidator);
- }
-
- @Override
- public void setValidator(Validator validator) {
- mInternalValidator.setValidator(validator);
- }
-
- @Override
- public void performValidation() {
- mIsValid = true;
- super.performValidation();
- markError(!mIsValid);
- }
-
- private void markError(boolean enable) {
- if (enable) {
- setError(getContext().getString(R.string.message_compose_error_invalid_email));
- } else {
- setError(null);
- }
- }
-}
diff --git a/src/com/android/email/activity/AttachmentInfoDialog.java b/src/com/android/email/activity/AttachmentInfoDialog.java
deleted file mode 100644
index 5005c1dbb..000000000
--- a/src/com/android/email/activity/AttachmentInfoDialog.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import com.android.email.AttachmentInfo;
-import com.android.email.R;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.provider.Settings;
-
-/**
- * "Info" dialog box
- */
-public class AttachmentInfoDialog extends DialogFragment {
- private static final String BUNDLE_TITLE = "title";
- private static final String BUNDLE_BODY_TEXT = "body_text";
- private static final String BUNDLE_ACTION_TEXT = "action_text";
- private static final String BUNDLE_ACTION_INTENT = "action_intent";
-
- /**
- * Returns a new dialog instance
- */
- public static AttachmentInfoDialog newInstance(Context context, int denyFlags) {
- Resources res = context.getResources();
- String title = res.getString(R.string.attachment_info_dialog_default_title);
- String bodyText = res.getString(R.string.attachment_info_unknown);
- String actionText = null;
- Intent actionIntent = null;
-
- // NOTE: Order here matters. There can be multiple reasons for denying an attachment,
- // so, we want to show the most important ones first (i.e. it's pointless to tell the
- // user to connect to wi-fi to download a 30mb attachment that is suspected of being
- // malware).
- if ((denyFlags & AttachmentInfo.DENY_MALWARE) != 0) {
- bodyText = res.getString(R.string.attachment_info_malware);
- } else if ((denyFlags & AttachmentInfo.DENY_POLICY) != 0) {
- bodyText = res.getString(R.string.attachment_info_policy);
- } else if ((denyFlags & AttachmentInfo.DENY_NOINTENT) != 0) {
- bodyText = res.getString(R.string.attachment_info_no_intent);
- } else if ((denyFlags & AttachmentInfo.DENY_NOSIDELOAD) != 0) {
- bodyText = res.getString(R.string.attachment_info_sideload_disabled);
- actionText = res.getString(R.string.attachment_info_application_settings);
- actionIntent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
- actionIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- actionIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
- } else if ((denyFlags & AttachmentInfo.DENY_APKINSTALL) != 0) {
- bodyText = res.getString(R.string.attachment_info_apk_install_disabled);
- } else if ((denyFlags & AttachmentInfo.DENY_WIFIONLY) != 0) {
- title = res.getString(R.string.attachment_info_dialog_wifi_title);
- bodyText = res.getString(R.string.attachment_info_wifi_only);
- actionText = res.getString(R.string.attachment_info_wifi_settings);
- actionIntent = new Intent(Settings.ACTION_WIFI_SETTINGS);
- actionIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- actionIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
- }
- AttachmentInfoDialog dialog = new AttachmentInfoDialog();
- Bundle args = new Bundle();
- args.putString(BUNDLE_TITLE, title);
- args.putString(BUNDLE_BODY_TEXT, bodyText);
- args.putString(BUNDLE_ACTION_TEXT, actionText);
- args.putParcelable(BUNDLE_ACTION_INTENT, actionIntent);
- dialog.setArguments(args);
- return dialog;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- Bundle args = getArguments();
- Context context = getActivity();
- String title = args.getString(BUNDLE_TITLE);
- String infoText = args.getString(BUNDLE_BODY_TEXT);
- String actionText = args.getString(BUNDLE_ACTION_TEXT);
- final Intent actionIntent = args.getParcelable(BUNDLE_ACTION_INTENT);
-
- OnClickListener onClickListener = new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- startActivity(actionIntent);
- break;
- case DialogInterface.BUTTON_NEUTRAL:
- dialog.dismiss();
- break;
- }
- }
- };
-
- AlertDialog.Builder builder = new AlertDialog.Builder(context);
- builder.setTitle(title);
- builder.setMessage(infoText);
- builder.setNeutralButton(R.string.okay_action, onClickListener);
- if (actionText != null && actionIntent != null) {
- builder.setPositiveButton(actionText, onClickListener);
- }
- return builder.show();
- }
-}
diff --git a/src/com/android/email/activity/BannerController.java b/src/com/android/email/activity/BannerController.java
deleted file mode 100644
index 0084091d6..000000000
--- a/src/com/android/email/activity/BannerController.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.animation.Animator;
-import android.animation.ObjectAnimator;
-import android.animation.PropertyValuesHolder;
-import android.animation.TimeInterpolator;
-import android.content.Context;
-import android.view.ViewGroup;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.TextView;
-
-/**
- * Class to hide/show a banner.
- */
-public class BannerController {
- private static final int ANIMATION_DURATION = 100;
- private static final TimeInterpolator INTERPOLATOR = new DecelerateInterpolator(1.5f);
-
- private final TextView mBannerView;
- private final int mBannerHeight;
-
- private boolean mShown;
-
- /** Hold last animator to cancel. */
- private Animator mLastAnimator;
-
- public BannerController(Context context, TextView bannerView, int bannerHeight) {
- mBannerView = bannerView;
- mBannerHeight = bannerHeight;
-
- setBannerYAnim(-mBannerHeight); // hide by default.
- }
-
- /**
- * @return the current y position of the banner.
- */
- private int getBannerY() {
- return ((ViewGroup.MarginLayoutParams) mBannerView.getLayoutParams()).topMargin;
- }
-
- private static final String PROP_SET_BANNER_Y = "bannerYAnim";
-
- /**
- * Set the Y position of the banner. public, but should only be used by animators.
- */
- public void setBannerYAnim(int y) {
- ((ViewGroup.MarginLayoutParams) mBannerView.getLayoutParams()).topMargin = y;
- mBannerView.requestLayout();
- }
-
- /**
- * Show a banner with a message.
- *
- * @return false if a banner is already shown, in which case the message won't be updated.
- */
- public boolean show(String message) {
- if (mShown) {
- return false; // If already shown, don't change the message, to avoid flicker.
- }
- mShown = true;
- mBannerView.setText(message);
- slideBanner(0);
- return true;
- }
-
- /**
- * Dismiss a banner.
- */
- public void dismiss() {
- if (!mShown) {
- return; // Always hidden, or hiding.
- }
- mShown = false;
- slideBanner(-mBannerHeight); // Slide up to hide.
- }
-
- private void slideBanner(int toY) {
- if (mLastAnimator != null) {
- mLastAnimator.cancel();
- }
-
- final PropertyValuesHolder[] values = {
- PropertyValuesHolder.ofInt(PROP_SET_BANNER_Y, getBannerY(), toY) };
- final ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(
- this, values).setDuration(ANIMATION_DURATION);
- animator.setInterpolator(INTERPOLATOR);
- mLastAnimator = animator;
- animator.start();
- }
-}
diff --git a/src/com/android/email/activity/ChipsAddressTextView.java b/src/com/android/email/activity/ChipsAddressTextView.java
deleted file mode 100644
index dac6b06c1..000000000
--- a/src/com/android/email/activity/ChipsAddressTextView.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-import com.android.ex.chips.RecipientEditTextView;
-
-/**
- * This is a MultiAutoCompleteTextView which has a custom validator.
- */
-class ChipsAddressTextView extends RecipientEditTextView {
- /** A noop validator that does not munge invalid texts. */
- private class ForwardValidator implements Validator {
- private Validator mValidator = null;
-
- public CharSequence fixText(CharSequence invalidText) {
- return invalidText;
- }
-
- public boolean isValid(CharSequence text) {
- return mValidator != null ? mValidator.isValid(text) : true;
- }
-
- public void setValidator(Validator validator) {
- mValidator = validator;
- }
- }
-
- private final ForwardValidator mInternalValidator = new ForwardValidator();
-
- public ChipsAddressTextView(Context context, AttributeSet attrs) {
- super(context, attrs);
- super.setValidator(mInternalValidator);
- }
-
- @Override
- public void setValidator(Validator validator) {
- mInternalValidator.setValidator(validator);
- }
-}
diff --git a/src/com/android/email/activity/DeleteMessageConfirmationDialog.java b/src/com/android/email/activity/DeleteMessageConfirmationDialog.java
deleted file mode 100644
index c05ead225..000000000
--- a/src/com/android/email/activity/DeleteMessageConfirmationDialog.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import com.android.email.R;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.Fragment;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.res.Resources;
-import android.os.Bundle;
-
-/**
- * Confirmation dialog for deleting messages.
- */
-public class DeleteMessageConfirmationDialog extends DialogFragment
- implements DialogInterface.OnClickListener {
- private static final String COUNT_MESSAGES_ARG = "count_messages";
-
- public interface Callback {
- public void onDeleteMessageConfirmationDialogOkPressed();
- }
-
- /**
- * Create a new dialog.
- *
- * @param countMessage the number of messages to be deleted
- * @param callbackFragment fragment that implements {@link Callback}. Or null, in which case
- * the parent activity must implement {@link Callback}.
- */
- public static DeleteMessageConfirmationDialog newInstance(int countMessage,
- Fragment callbackFragment) {
- final DeleteMessageConfirmationDialog dialog = new DeleteMessageConfirmationDialog();
- final Bundle args = new Bundle();
- args.putInt(COUNT_MESSAGES_ARG, countMessage);
- dialog.setArguments(args);
- if (callbackFragment != null) {
- dialog.setTargetFragment(callbackFragment, 0);
- }
- return dialog;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final int countMessages = getArguments().getInt(COUNT_MESSAGES_ARG);
-
- final Context context = getActivity();
- final Resources res = context.getResources();
- final AlertDialog.Builder b = new AlertDialog.Builder(context);
- b.setTitle(res.getString(R.string.message_delete_dialog_title))
- .setIconAttribute(android.R.attr.alertDialogIcon)
- .setMessage(res.getQuantityString(R.plurals.message_delete_confirm, countMessages))
- .setPositiveButton(R.string.okay_action, this)
- .setNegativeButton(R.string.cancel_action, null);
- return b.create();
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- getCallback().onDeleteMessageConfirmationDialogOkPressed();
- break;
- }
- }
-
- private Callback getCallback() {
- Fragment targetFragment = getTargetFragment();
- if (targetFragment != null) {
- // If a target is set, it MUST implement Callback.
- return (Callback) targetFragment;
- }
- // If not the parent activity MUST implement Callback.
- return (Callback) getActivity();
- }
-}
diff --git a/src/com/android/email/activity/EmailActivity.java b/src/com/android/email/activity/EmailActivity.java
deleted file mode 100644
index 50667cbff..000000000
--- a/src/com/android/email/activity/EmailActivity.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.app.Fragment;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.os.Handler;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.TextView;
-
-import com.android.email.Controller;
-import com.android.email.ControllerResultUiThreadWrapper;
-import com.android.email.Email;
-import com.android.email.MessageListContext;
-import com.android.email.MessagingExceptionStrings;
-import com.android.email.R;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.IntentUtilities;
-import com.google.common.base.Preconditions;
-
-import java.util.ArrayList;
-
-/**
- * The main Email activity, which is used on both the tablet and the phone.
- *
- * Because this activity is device agnostic, so most of the UI aren't owned by this, but by
- * the UIController.
- */
-public class EmailActivity extends Activity implements View.OnClickListener, FragmentInstallable {
- public static final String EXTRA_ACCOUNT_ID = "ACCOUNT_ID";
- public static final String EXTRA_MAILBOX_ID = "MAILBOX_ID";
- public static final String EXTRA_MESSAGE_ID = "MESSAGE_ID";
- public static final String EXTRA_QUERY_STRING = "QUERY_STRING";
-
- /** Loader IDs starting with this is safe to use from UIControllers. */
- static final int UI_CONTROLLER_LOADER_ID_BASE = 100;
-
- /** Loader IDs starting with this is safe to use from ActionBarController. */
- static final int ACTION_BAR_CONTROLLER_LOADER_ID_BASE = 200;
-
- private static float sLastFontScale = -1;
-
- private Controller mController;
- private Controller.Result mControllerResult;
-
- private UIControllerBase mUIController;
-
- private final EmailAsyncTask.Tracker mTaskTracker = new EmailAsyncTask.Tracker();
-
- /** Banner to display errors */
- private BannerController mErrorBanner;
- /** Id of the account that had a messaging exception most recently. */
- private long mLastErrorAccountId;
-
- /**
- * Create an intent to launch and open account's inbox.
- *
- * @param accountId If -1, default account will be used.
- */
- public static Intent createOpenAccountIntent(Activity fromActivity, long accountId) {
- Intent i = IntentUtilities.createRestartAppIntent(fromActivity, EmailActivity.class);
- if (accountId != -1) {
- i.putExtra(EXTRA_ACCOUNT_ID, accountId);
- }
- return i;
- }
-
- /**
- * Create an intent to launch and open a mailbox.
- *
- * @param accountId must not be -1.
- * @param mailboxId must not be -1. Magic mailboxes IDs (such as
- * {@link Mailbox#QUERY_ALL_INBOXES}) don't work.
- */
- public static Intent createOpenMailboxIntent(Activity fromActivity, long accountId,
- long mailboxId) {
- if (accountId == -1 || mailboxId == -1) {
- throw new IllegalArgumentException();
- }
- Intent i = IntentUtilities.createRestartAppIntent(fromActivity, EmailActivity.class);
- i.putExtra(EXTRA_ACCOUNT_ID, accountId);
- i.putExtra(EXTRA_MAILBOX_ID, mailboxId);
- return i;
- }
-
- /**
- * Create an intent to launch and open a message.
- *
- * @param accountId must not be -1.
- * @param mailboxId must not be -1. Magic mailboxes IDs (such as
- * {@link Mailbox#QUERY_ALL_INBOXES}) don't work.
- * @param messageId must not be -1.
- */
- public static Intent createOpenMessageIntent(Activity fromActivity, long accountId,
- long mailboxId, long messageId) {
- if (accountId == -1 || mailboxId == -1 || messageId == -1) {
- throw new IllegalArgumentException();
- }
- Intent i = IntentUtilities.createRestartAppIntent(fromActivity, EmailActivity.class);
- i.putExtra(EXTRA_ACCOUNT_ID, accountId);
- i.putExtra(EXTRA_MAILBOX_ID, mailboxId);
- i.putExtra(EXTRA_MESSAGE_ID, messageId);
- return i;
- }
-
- /**
- * Create an intent to launch search activity.
- *
- * @param accountId ID of the account for the mailbox. Must not be {@link Account#NO_ACCOUNT}.
- * @param mailboxId ID of the mailbox to search, or {@link Mailbox#NO_MAILBOX} to perform
- * global search.
- * @param query query string.
- */
- public static Intent createSearchIntent(Activity fromActivity, long accountId,
- long mailboxId, String query) {
- Preconditions.checkArgument(Account.isNormalAccount(accountId),
- "Can only search in normal accounts");
-
- // Note that a search doesn't use a restart intent, as we want another instance of
- // the activity to sit on the stack for search.
- Intent i = new Intent(fromActivity, EmailActivity.class);
- i.putExtra(EXTRA_ACCOUNT_ID, accountId);
- i.putExtra(EXTRA_MAILBOX_ID, mailboxId);
- i.putExtra(EXTRA_QUERY_STRING, query);
- i.setAction(Intent.ACTION_SEARCH);
- return i;
- }
-
- /**
- * Initialize {@link #mUIController}.
- */
- private void initUIController() {
- mUIController = UiUtilities.useTwoPane(this)
- ? new UIControllerTwoPane(this) : new UIControllerOnePane(this);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) Log.d(Logging.LOG_TAG, this + " onCreate");
-
- float fontScale = getResources().getConfiguration().fontScale;
- if (sLastFontScale != -1 && sLastFontScale != fontScale) {
- // If the font scale has been initialized, and has been detected to be different than
- // the last time the Activity ran, it means the user changed the font while no
- // Email Activity was running - we still need to purge static information though.
- onFontScaleChangeDetected();
- }
- sLastFontScale = fontScale;
-
- // UIController is used in onPrepareOptionsMenu(), which can be called from within
- // super.onCreate(), so we need to initialize it here.
- initUIController();
-
- super.onCreate(savedInstanceState);
- ActivityHelper.debugSetWindowFlags(this);
- setContentView(mUIController.getLayoutId());
-
- mUIController.onActivityViewReady();
-
- mController = Controller.getInstance(this);
- mControllerResult = new ControllerResultUiThreadWrapper<ControllerResult>(new Handler(),
- new ControllerResult());
- mController.addResultCallback(mControllerResult);
-
- // Set up views
- // TODO Probably better to extract mErrorMessageView related code into a separate class,
- // so that it'll be easy to reuse for the phone activities.
- TextView errorMessage = (TextView) findViewById(R.id.error_message);
- errorMessage.setOnClickListener(this);
- int errorBannerHeight = getResources().getDimensionPixelSize(R.dimen.error_message_height);
- mErrorBanner = new BannerController(this, errorMessage, errorBannerHeight);
-
- if (savedInstanceState != null) {
- mUIController.onRestoreInstanceState(savedInstanceState);
- } else {
- final Intent intent = getIntent();
- final MessageListContext viewContext = MessageListContext.forIntent(this, intent);
- if (viewContext == null) {
- // This might happen if accounts were deleted on another thread, and there aren't
- // any remaining
- Welcome.actionStart(this);
- finish();
- return;
- } else {
- final long messageId = intent.getLongExtra(EXTRA_MESSAGE_ID, Message.NO_MESSAGE);
- mUIController.open(viewContext, messageId);
- }
- }
- mUIController.onActivityCreated();
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onSaveInstanceState");
- }
- super.onSaveInstanceState(outState);
- mUIController.onSaveInstanceState(outState);
- }
-
- // FragmentInstallable
- @Override
- public void onInstallFragment(Fragment fragment) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onInstallFragment fragment=" + fragment);
- }
- mUIController.onInstallFragment(fragment);
- }
-
- // FragmentInstallable
- @Override
- public void onUninstallFragment(Fragment fragment) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onUninstallFragment fragment=" + fragment);
- }
- mUIController.onUninstallFragment(fragment);
- }
-
- @Override
- protected void onStart() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) Log.d(Logging.LOG_TAG, this + " onStart");
- super.onStart();
- mUIController.onActivityStart();
- }
-
- @Override
- protected void onResume() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) Log.d(Logging.LOG_TAG, this + " onResume");
- super.onResume();
- mUIController.onActivityResume();
- /**
- * In {@link MessageList#onResume()}, we go back to {@link Welcome} if an account
- * has been added/removed. We don't need to do that here, because we fetch the most
- * up-to-date account list. Additionally, we detect and do the right thing if all
- * of the accounts have been removed.
- */
- }
-
- @Override
- protected void onPause() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) Log.d(Logging.LOG_TAG, this + " onPause");
- super.onPause();
- mUIController.onActivityPause();
- }
-
- @Override
- protected void onStop() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) Log.d(Logging.LOG_TAG, this + " onStop");
- super.onStop();
- mUIController.onActivityStop();
- }
-
- @Override
- protected void onDestroy() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) Log.d(Logging.LOG_TAG, this + " onDestroy");
- mController.removeResultCallback(mControllerResult);
- mTaskTracker.cancellAllInterrupt();
- mUIController.onActivityDestroy();
- super.onDestroy();
- }
-
- @Override
- public void onBackPressed() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onBackPressed");
- }
- if (!mUIController.onBackPressed(true)) {
- // Not handled by UIController -- perform the default. i.e. close the app.
- super.onBackPressed();
- }
- }
-
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.error_message:
- dismissErrorMessage();
- break;
- }
- }
-
- /**
- * Force dismiss the error banner.
- */
- private void dismissErrorMessage() {
- mErrorBanner.dismiss();
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- return mUIController.onCreateOptionsMenu(getMenuInflater(), menu);
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- return mUIController.onPrepareOptionsMenu(getMenuInflater(), menu);
- }
-
- /**
- * Called when the search key is pressd.
- *
- * Use the below command to emulate the key press on devices without the search key.
- * adb shell input keyevent 84
- */
- @Override
- public boolean onSearchRequested() {
- if (Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onSearchRequested");
- }
- mUIController.onSearchRequested();
- return true; // Event handled.
- }
-
- @Override
- @SuppressWarnings("deprecation")
- public boolean onOptionsItemSelected(MenuItem item) {
- if (mUIController.onOptionsItemSelected(item)) {
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- /**
- * A {@link Controller.Result} to detect connection status.
- */
- private class ControllerResult extends Controller.Result {
- @Override
- public void sendMailCallback(
- MessagingException result, long accountId, long messageId, int progress) {
- handleError(result, accountId, progress);
- }
-
- @Override
- public void serviceCheckMailCallback(
- MessagingException result, long accountId, long mailboxId, int progress, long tag) {
- handleError(result, accountId, progress);
- }
-
- @Override
- public void updateMailboxCallback(MessagingException result, long accountId, long mailboxId,
- int progress, int numNewMessages, ArrayList<Long> addedMessages) {
- handleError(result, accountId, progress);
- }
-
- @Override
- public void updateMailboxListCallback(
- MessagingException result, long accountId, int progress) {
- handleError(result, accountId, progress);
- }
-
- @Override
- public void loadAttachmentCallback(MessagingException result, long accountId,
- long messageId, long attachmentId, int progress) {
- handleError(result, accountId, progress);
- }
-
- @Override
- public void loadMessageForViewCallback(MessagingException result, long accountId,
- long messageId, int progress) {
- handleError(result, accountId, progress);
- }
-
- private void handleError(final MessagingException result, final long accountId,
- int progress) {
- if (accountId == -1) {
- return;
- }
- if (result == null) {
- if (progress > 0) {
- // Connection now working; clear the error message banner
- if (mLastErrorAccountId == accountId) {
- dismissErrorMessage();
- }
- }
- } else {
- Account account = Account.restoreAccountWithId(EmailActivity.this, accountId);
- if (account == null) return;
- String message =
- MessagingExceptionStrings.getErrorString(EmailActivity.this, result);
- if (!TextUtils.isEmpty(account.mDisplayName)) {
- // TODO Use properly designed layout. Don't just concatenate strings;
- // which is generally poor for I18N.
- message = message + " (" + account.mDisplayName + ")";
- }
- if (mErrorBanner.show(message)) {
- mLastErrorAccountId = accountId;
- }
- }
- }
- }
-
- /**
- * Handle a change to the system font size. This invalidates some static caches we have.
- */
- private void onFontScaleChangeDetected() {
- MessageListItem.resetDrawingCaches();
- }
-}
diff --git a/src/com/android/email/activity/FragmentInstallable.java b/src/com/android/email/activity/FragmentInstallable.java
deleted file mode 100644
index 98d9d2d46..000000000
--- a/src/com/android/email/activity/FragmentInstallable.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.app.Fragment;
-
-/**
- * Interface for {@link Activity} that can "install" fragments.
- */
-public interface FragmentInstallable {
- /**
- * Called when a {@link Fragment} wants to be installed to the host activity.
- *
- * Fragments which use this MUST call this from {@link Fragment#onActivityCreated} using
- * {@link UiUtilities#installFragment}.
- *
- * This means a host {@link Activity} can safely assume a passed {@link Fragment} is already
- * created.
- */
- public void onInstallFragment(Fragment fragment);
-
- /**
- * Called when a {@link Fragment} wants to be uninstalled from the host activity.
- *
- * Fragments which use this MUST call this from {@link Fragment#onDestroyView} using
- * {@link UiUtilities#uninstallFragment}.
- */
- public void onUninstallFragment(Fragment fragment);
-}
diff --git a/src/com/android/email/activity/MailboxFinder.java b/src/com/android/email/activity/MailboxFinder.java
deleted file mode 100644
index 831ec840c..000000000
--- a/src/com/android/email/activity/MailboxFinder.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import com.android.email.Controller;
-import com.android.email.ControllerResultUiThreadWrapper;
-import com.android.email.Email;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-
-import android.content.Context;
-import android.os.Handler;
-import android.util.Log;
-
-/**
- * A class that finds a mailbox ID by account ID and mailbox type.
- *
- * If an account doesn't have a mailbox of a specified type, it refreshes the mailbox list and
- * try looking for again.
- *
- * This is a "one-shot" class. You create an instance, call {@link #startLookup}, get a result
- * or call {@link #cancel}, and that's it. The instance can't be re-used.
- */
-public class MailboxFinder {
- private final Context mContext;
- private final Controller mController;
-
- // Actual Controller.Result that will wrapped by ControllerResultUiThreadWrapper.
- // Unit tests directly use it to avoid asynchronicity caused by ControllerResultUiThreadWrapper.
- private final ControllerResults mInnerControllerResults;
- private Controller.Result mControllerResults; // Not final, we null it out when done.
-
- private final long mAccountId;
- private final int mMailboxType;
- private final Callback mCallback;
-
- private FindMailboxTask mTask;
- private boolean mStarted;
- private boolean mClosed;
-
- /**
- * Callback for results.
- */
- public interface Callback {
- public void onAccountNotFound();
- public void onMailboxNotFound(long accountId);
- public void onAccountSecurityHold(long accountId);
- public void onMailboxFound(long accountId, long mailboxId);
- }
-
- /**
- * Creates an instance for {@code accountId} and {@code mailboxType}. (But won't start yet)
- *
- * Must be called on the UI thread.
- */
- public MailboxFinder(Context context, long accountId, int mailboxType, Callback callback) {
- if (accountId == -1) {
- throw new UnsupportedOperationException();
- }
- mContext = context.getApplicationContext();
- mController = Controller.getInstance(context);
- mAccountId = accountId;
- mMailboxType = mailboxType;
- mCallback = callback;
- mInnerControllerResults = new ControllerResults();
- mControllerResults = new ControllerResultUiThreadWrapper<ControllerResults>(
- new Handler(), mInnerControllerResults);
- mController.addResultCallback(mControllerResults);
- }
-
- /**
- * Start looking up.
- *
- * Must be called on the UI thread.
- */
- public void startLookup() {
- if (mStarted) {
- throw new IllegalStateException(); // Can't start twice.
- }
- mStarted = true;
- mTask = new FindMailboxTask(true);
- mTask.executeParallel();
- }
-
- /**
- * Cancel the operation. It's safe to call it multiple times, or even if the operation is
- * already finished.
- */
- public void cancel() {
- if (!mClosed) {
- close();
- }
- }
-
- /**
- * Stop the running task, if exists, and clean up internal resources.
- */
- private void close() {
- mClosed = true;
- if (mControllerResults != null) {
- mController.removeResultCallback(mControllerResults);
- mControllerResults = null;
- }
- Utility.cancelTaskInterrupt(mTask);
- mTask = null;
- }
-
- private class ControllerResults extends Controller.Result {
- @Override
- public void updateMailboxListCallback(MessagingException result, long accountId,
- int progress) {
- if (mClosed || (accountId != mAccountId)) {
- return; // Already closed, or non-target account.
- }
- Log.i(Logging.LOG_TAG, "MailboxFinder: updateMailboxListCallback");
- if (result != null) {
- // Error while updating the mailbox list. Notify the UI...
- try {
- mCallback.onMailboxNotFound(mAccountId);
- } finally {
- close();
- }
- } else if (progress == 100) {
- // Mailbox list updated, look for mailbox again...
- mTask = new FindMailboxTask(false);
- mTask.executeParallel();
- }
- }
- }
-
- /**
- * Async task for finding a single mailbox by type. If a mailbox of a type is not found,
- * and {@code okToRecurse} is true, we update the mailbox list and try looking again.
- */
- private class FindMailboxTask extends EmailAsyncTask<Void, Void, Long> {
- private final boolean mOkToRecurse;
-
- private static final int RESULT_MAILBOX_FOUND = 0;
- private static final int RESULT_ACCOUNT_SECURITY_HOLD = 1;
- private static final int RESULT_ACCOUNT_NOT_FOUND = 2;
- private static final int RESULT_MAILBOX_NOT_FOUND = 3;
- private static final int RESULT_START_NETWORK_LOOK_UP = 4;
-
- private int mResult = -1;
-
- /**
- * Special constructor to cache some local info
- */
- public FindMailboxTask(boolean okToRecurse) {
- super(null);
- mOkToRecurse = okToRecurse;
- }
-
- @Override
- protected Long doInBackground(Void... params) {
- // Quick check that account is not in security hold
- if (Account.isSecurityHold(mContext, mAccountId)) {
- mResult = RESULT_ACCOUNT_SECURITY_HOLD;
- return Mailbox.NO_MAILBOX;
- }
-
- // See if we can find the requested mailbox in the DB.
- long mailboxId = Mailbox.findMailboxOfType(mContext, mAccountId, mMailboxType);
- if (mailboxId != Mailbox.NO_MAILBOX) {
- mResult = RESULT_MAILBOX_FOUND;
- return mailboxId; // Found
- }
-
- // Mailbox not found. Does the account really exists?
- final boolean accountExists = Account.isValidId(mContext, mAccountId);
- if (accountExists) {
- if (mOkToRecurse) {
- // launch network lookup
- mResult = RESULT_START_NETWORK_LOOK_UP;
- } else {
- mResult = RESULT_MAILBOX_NOT_FOUND;
- }
- } else {
- mResult = RESULT_ACCOUNT_NOT_FOUND;
- }
- return Mailbox.NO_MAILBOX;
- }
-
- @Override
- protected void onSuccess(Long mailboxId) {
- switch (mResult) {
- case RESULT_ACCOUNT_SECURITY_HOLD:
- Log.w(Logging.LOG_TAG, "MailboxFinder: Account security hold.");
- try {
- mCallback.onAccountSecurityHold(mAccountId);
- } finally {
- close();
- }
- return;
- case RESULT_ACCOUNT_NOT_FOUND:
- Log.w(Logging.LOG_TAG, "MailboxFinder: Account not found.");
- try {
- mCallback.onAccountNotFound();
- } finally {
- close();
- }
- return;
- case RESULT_MAILBOX_NOT_FOUND:
- Log.w(Logging.LOG_TAG, "MailboxFinder: Mailbox not found.");
- try {
- mCallback.onMailboxNotFound(mAccountId);
- } finally {
- close();
- }
- return;
- case RESULT_MAILBOX_FOUND:
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "MailboxFinder: mailbox found: id=" + mailboxId);
- }
- try {
- mCallback.onMailboxFound(mAccountId, mailboxId);
- } finally {
- close();
- }
- return;
- case RESULT_START_NETWORK_LOOK_UP:
- // Not found locally. Let's sync the mailbox list...
- Log.i(Logging.LOG_TAG, "MailboxFinder: Starting network lookup.");
- mController.updateMailboxList(mAccountId);
- return;
- default:
- throw new RuntimeException();
- }
- }
- }
-
- /* package */ boolean isStartedForTest() {
- return mStarted;
- }
-
- /**
- * Called by unit test. Return true if all the internal resources are really released.
- */
- /* package */ boolean isReallyClosedForTest() {
- return mClosed && (mTask == null) && (mControllerResults == null);
- }
-
- /* package */ Controller.Result getControllerResultsForTest() {
- return mInnerControllerResults;
- }
-}
diff --git a/src/com/android/email/activity/MailboxFragmentAdapter.java b/src/com/android/email/activity/MailboxFragmentAdapter.java
deleted file mode 100644
index 4321eb62d..000000000
--- a/src/com/android/email/activity/MailboxFragmentAdapter.java
+++ /dev/null
@@ -1,659 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.content.ContentUris;
-import android.content.Context;
-import android.content.Loader;
-import android.database.Cursor;
-import android.database.CursorWrapper;
-import android.database.MatrixCursor;
-import android.database.MatrixCursor.RowBuilder;
-import android.database.MergeCursor;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.CursorAdapter;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.android.email.Email;
-import com.android.email.FolderProperties;
-import com.android.email.R;
-import com.android.email.ResourceHelper;
-import com.android.email.data.ClosingMatrixCursor;
-import com.android.email.data.ThrottlingCursorLoader;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.util.ArrayList;
-
-/**
- * Mailbox cursor adapter for the mailbox list fragment.
- *
- * A mailbox cursor may contain one of several different types of data. Currently, this
- * adapter supports the following views:
- * 1. The standard inbox, mailbox view
- * 2. The combined mailbox view
- * 3. Nested folder navigation
- *
- * TODO At a minimum, we should break out the loaders. They have no relation to the view code
- * and only serve to confuse the user.
- * TODO Determine if we actually need a separate adapter / view / loader for nested folder
- * navigation. It's a little convoluted at the moment, but, still manageable.
- */
-class MailboxFragmentAdapter extends CursorAdapter {
- /**
- * Callback interface used to report clicks other than the basic list item click or long press.
- */
- interface Callback {
- /** Callback for setting background of mailbox list items during a drag */
- public void onBind(MailboxListItem listItem);
- }
-
- /** Do-nothing callback to avoid null tests for <code>mCallback</code>. */
- private static final class EmptyCallback implements Callback {
- public static final Callback INSTANCE = new EmptyCallback();
- @Override public void onBind(MailboxListItem listItem) { }
- }
-
- /*
- * The type of the row to present to the user. There are 4 defined rows that each
- * have a slightly different look. These are typically used in the constant column
- * {@link #ROW_TYPE} specified in {@link #PROJECTION} and {@link #SUBMAILBOX_PROJECTION}.
- */
- /** Both regular and combined mailboxes */
- private static final int ROW_TYPE_MAILBOX = 0;
- /** Account "mailboxes" in the combined view */
- private static final int ROW_TYPE_ACCOUNT = 1;
- // The following types are used when drilling into a mailbox
- /** The current mailbox */
- private static final int ROW_TYPE_CURMAILBOX = 2;
- /** Sub mailboxes */
- private static final int ROW_TYPE_SUBMAILBOX = 3;
- /** Header */
- private static final int ROW_TYPE_HEADER = 4;
-
- /** The type of data contained in the cursor row. */
- private static final String ROW_TYPE = "rowType";
- /** The original ID of the cursor row. May be negative. */
- private static final String ORIGINAL_ID = "orgMailboxId";
- /**
- * Projection for a typical mailbox or account row.
- * <p><em>NOTE</em> This projection contains two ID columns. The first, named "_id", is used
- * by the framework ListView implementation. Since ListView does not handle negative IDs in
- * this column, we define a "mailbox_id" column that contains the real mailbox ID; which
- * may be negative for special mailboxes.
- */
- private static final String[] PROJECTION = new String[] { MailboxColumns.ID,
- MailboxColumns.ID + " AS " + ORIGINAL_ID,
- MailboxColumns.DISPLAY_NAME, MailboxColumns.TYPE, MailboxColumns.UNREAD_COUNT,
- MailboxColumns.MESSAGE_COUNT, ROW_TYPE_MAILBOX + " AS " + ROW_TYPE,
- MailboxColumns.FLAGS, MailboxColumns.ACCOUNT_KEY };
- /**
- * Projection used to retrieve immediate children for a mailbox. The columns need to
- * be identical to those in {@link #PROJECTION}. We are only changing the constant
- * column {@link #ROW_TYPE}.
- */
- private static final String[] SUBMAILBOX_PROJECTION = new String[] { MailboxColumns.ID,
- MailboxColumns.ID + " AS " + ORIGINAL_ID,
- MailboxColumns.DISPLAY_NAME, MailboxColumns.TYPE, MailboxColumns.UNREAD_COUNT,
- MailboxColumns.MESSAGE_COUNT, ROW_TYPE_SUBMAILBOX + " AS " + ROW_TYPE,
- MailboxColumns.FLAGS, MailboxColumns.ACCOUNT_KEY };
- private static final String[] CURMAILBOX_PROJECTION = new String[] { MailboxColumns.ID,
- MailboxColumns.ID + " AS " + ORIGINAL_ID,
- MailboxColumns.DISPLAY_NAME, MailboxColumns.TYPE, MailboxColumns.UNREAD_COUNT,
- MailboxColumns.MESSAGE_COUNT, ROW_TYPE_CURMAILBOX + " AS " + ROW_TYPE,
- MailboxColumns.FLAGS, MailboxColumns.ACCOUNT_KEY };
- /** Project to use for matrix cursors; rows MUST be identical to {@link #PROJECTION} */
- private static final String[] MATRIX_PROJECTION = new String[] {
- MailboxColumns.ID, ORIGINAL_ID, MailboxColumns.DISPLAY_NAME, MailboxColumns.TYPE,
- MailboxColumns.UNREAD_COUNT, MailboxColumns.MESSAGE_COUNT, ROW_TYPE, MailboxColumns.FLAGS,
- MailboxColumns.ACCOUNT_KEY };
-
- /** All mailboxes for the account */
- private static final String ALL_MAILBOX_SELECTION = MailboxColumns.ACCOUNT_KEY + "=?" +
- " AND " + Mailbox.USER_VISIBLE_MAILBOX_SELECTION;
- /** All system mailboxes for an account */
- private static final String SYSTEM_MAILBOX_SELECTION = ALL_MAILBOX_SELECTION
- + " AND " + MailboxColumns.TYPE + "!=" + Mailbox.TYPE_MAIL;
- /** All mailboxes with the given parent */
- private static final String USER_MAILBOX_SELECTION_WITH_PARENT = ALL_MAILBOX_SELECTION
- + " AND " + MailboxColumns.PARENT_KEY + "=?"
- + " AND " + MailboxColumns.TYPE + "=" + Mailbox.TYPE_MAIL;
- /** Selection for a specific mailbox */
- private static final String MAILBOX_SELECTION = MailboxColumns.ACCOUNT_KEY + "=?"
- + " AND " + MailboxColumns.ID + "=?";
-
- private static final String MAILBOX_ORDER_BY = "CASE " + MailboxColumns.TYPE
- + " WHEN " + Mailbox.TYPE_INBOX + " THEN 0"
- + " WHEN " + Mailbox.TYPE_DRAFTS + " THEN 1"
- + " WHEN " + Mailbox.TYPE_OUTBOX + " THEN 2"
- + " WHEN " + Mailbox.TYPE_SENT + " THEN 3"
- + " WHEN " + Mailbox.TYPE_TRASH + " THEN 4"
- + " WHEN " + Mailbox.TYPE_JUNK + " THEN 5"
- // Other mailboxes (i.e. of Mailbox.TYPE_MAIL) are shown in alphabetical order.
- + " ELSE 10 END"
- + " ," + MailboxColumns.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
-
- /** View is of a "normal" row */
- private static final int ITEM_VIEW_TYPE_NORMAL = 0;
- /** View is of a separator row */
- private static final int ITEM_VIEW_TYPE_HEADER = AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
-
- private static boolean sEnableUpdate = true;
- private final LayoutInflater mInflater;
- private final ResourceHelper mResourceHelper;
- private final Callback mCallback;
-
- public MailboxFragmentAdapter(Context context, Callback callback) {
- super(context, null, 0 /* flags; no content observer */);
- mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback;
- mResourceHelper = ResourceHelper.getInstance(context);
- }
-
- @Override
- public int getViewTypeCount() {
- return 2;
- }
-
- @Override
- public int getItemViewType(int position) {
- return isHeader(position) ? ITEM_VIEW_TYPE_HEADER : ITEM_VIEW_TYPE_NORMAL;
- }
-
- @Override
- public boolean isEnabled(int position) {
- return !isHeader(position);
- }
-
- // The LabelList has headers which are not
- // enabled.
- @Override
- public boolean areAllItemsEnabled() {
- return false;
- }
-
- @Override
- public void bindView(View view, Context context, Cursor cursor) {
- if (view instanceof MailboxListItem) {
- bindListItem(view, context, cursor);
- } else {
- bindListHeader(view, context, cursor);
- }
- }
-
- @Override
- public View newView(Context context, Cursor cursor, ViewGroup parent) {
- if (cursor.getInt(cursor.getColumnIndex(ROW_TYPE)) == ROW_TYPE_HEADER) {
- return mInflater.inflate(R.layout.mailbox_list_header, parent, false);
- }
- return mInflater.inflate(R.layout.mailbox_list_item, parent, false);
- }
-
- private boolean isHeader(int position) {
- Cursor c = getCursor();
- if ((c == null) || c.isClosed()) {
- return false;
- }
- c.moveToPosition(position);
- int rowType = c.getInt(c.getColumnIndex(ROW_TYPE));
- return rowType == ROW_TYPE_HEADER;
- }
-
- /** Returns {@code true} if the specified row is of an account in the combined view. */
- boolean isAccountRow(int position) {
- return isAccountRow((Cursor) getItem(position));
- }
-
- /**
- * Returns {@code true} if the specified row is a mailbox.
- * ({@link #ROW_TYPE_MAILBOX}, {@link #ROW_TYPE_CURMAILBOX} and {@link #ROW_TYPE_SUBMAILBOX})
- */
- boolean isMailboxRow(int position) {
- return isMailboxRow((Cursor) getItem(position));
- }
-
- /** Returns {@code true} if the current row is of an account in the combined view. */
- private static boolean isAccountRow(Cursor cursor) {
- return getRowType(cursor) == ROW_TYPE_ACCOUNT;
- }
-
- /** Returns {@code true} if the current row is a header */
- private static boolean isHeaderRow(Cursor cursor) {
- return getRowType(cursor) == ROW_TYPE_HEADER;
- }
-
- /**
- * Returns {@code true} if the current row is a mailbox.
- * ({@link #ROW_TYPE_MAILBOX}, {@link #ROW_TYPE_CURMAILBOX} and {@link #ROW_TYPE_SUBMAILBOX})
- */
- private static boolean isMailboxRow(Cursor cursor) {
- return !(isAccountRow(cursor) || isHeaderRow(cursor));
- }
-
- /**
- * Returns the ID of the given row. It may be a mailbox or account ID depending upon the
- * result of {@link #isAccountRow}.
- */
- long getId(int position) {
- Cursor c = (Cursor) getItem(position);
- return getId(c);
- }
-
- /**
- * Returns the account ID of the mailbox owner for the given row. If the given row is a
- * combined mailbox, {@link Account#ACCOUNT_ID_COMBINED_VIEW} is returned. If the given
- * row is an account, returns the account's ID [the same as {@link #ORIGINAL_ID}].
- */
- long getAccountId(int position) {
- Cursor c = (Cursor) getItem(position);
- return getAccountId(c);
- }
-
- /**
- * Turn on and off list updates; during a drag operation, we do NOT want to the list of
- * mailboxes to update, as this would be visually jarring
- * @param state whether or not the MailboxList can be updated
- */
- static void enableUpdates(boolean state) {
- sEnableUpdate = state;
- }
-
- private static String getDisplayName(Context context, Cursor cursor) {
- final String name = cursor.getString(cursor.getColumnIndex(MailboxColumns.DISPLAY_NAME));
- if (isHeaderRow(cursor) || isAccountRow(cursor)) {
- // Always use actual name
- return name;
- } else {
- // Use this method for two purposes:
- // - Set combined mailbox names
- // - Rewrite special mailbox names (e.g. trash)
- FolderProperties fp = FolderProperties.getInstance(context);
- return fp.getDisplayName(getType(cursor), getId(cursor), name);
- }
- }
-
- static long getId(Cursor cursor) {
- return cursor.getLong(cursor.getColumnIndex(ORIGINAL_ID));
- }
-
- static int getType(Cursor cursor) {
- return cursor.getInt(cursor.getColumnIndex(MailboxColumns.TYPE));
- }
-
- static int getMessageCount(Cursor cursor) {
- return cursor.getInt(cursor.getColumnIndex(MailboxColumns.MESSAGE_COUNT));
- }
-
- static int getUnreadCount(Cursor cursor) {
- return cursor.getInt(cursor.getColumnIndex(MailboxColumns.UNREAD_COUNT));
- }
-
- static long getAccountId(Cursor cursor) {
- return cursor.getLong(cursor.getColumnIndex(MailboxColumns.ACCOUNT_KEY));
- }
-
- private static int getRowType(Cursor cursor) {
- return cursor.getInt(cursor.getColumnIndex(ROW_TYPE));
- }
-
- private static int getFlags(Cursor cursor) {
- return cursor.getInt(cursor.getColumnIndex(MailboxColumns.FLAGS));
- }
-
- /**
- * {@link Cursor} with extra information which is returned by the loader created by
- * {@link MailboxFragmentAdapter#createMailboxesLoader}.
- */
- static class CursorWithExtras extends CursorWrapper {
- /**
- * The number of mailboxes in the cursor if the cursor contains top-level mailboxes.
- * Otherwise, the number of *child* mailboxes.
- */
- public final int mChildCount;
-
- CursorWithExtras(Cursor cursor, int childCount) {
- super(cursor);
- mChildCount = childCount;
- }
- }
-
- private void bindListHeader(View view, Context context, Cursor cursor) {
- final TextView nameView = (TextView) view.findViewById(R.id.display_name);
- nameView.setText(getDisplayName(context, cursor));
- }
-
- private void bindListItem(View view, Context context, Cursor cursor) {
- final boolean isAccount = isAccountRow(cursor);
- final int type = getType(cursor);
- final long id = getId(cursor);
- final long accountId = getAccountId(cursor);
- final int flags = getFlags(cursor);
- final int rowType = getRowType(cursor);
- final boolean hasVisibleChildren = (flags & Mailbox.FLAG_HAS_CHILDREN) != 0
- && (flags & Mailbox.FLAG_CHILDREN_VISIBLE) != 0;
-
- MailboxListItem listItem = (MailboxListItem)view;
- listItem.mMailboxId = isAccountRow(cursor) ? Mailbox.NO_MAILBOX : id;
- listItem.mMailboxType = type;
- listItem.mAccountId = accountId;
- listItem.mIsValidDropTarget = (id >= 0)
- && !Utility.arrayContains(Mailbox.INVALID_DROP_TARGETS, type)
- && (flags & Mailbox.FLAG_ACCEPTS_MOVED_MAIL) != 0;
- listItem.mIsNavigable = hasVisibleChildren;
-
- listItem.mAdapter = this;
- // Set the background depending on whether we're in drag mode, the mailbox is a valid
- // target, etc.
- mCallback.onBind(listItem);
-
- // Set mailbox name
- final TextView nameView = (TextView) view.findViewById(R.id.mailbox_name);
- nameView.setText(getDisplayName(context, cursor));
- // Set count
- final int count;
- if (isAccountRow(cursor)) {
- count = getUnreadCount(cursor);
- } else {
- FolderProperties fp = FolderProperties.getInstance(context);
- count = fp.getMessageCount(type, getUnreadCount(cursor), getMessageCount(cursor));
- }
- final TextView countView = (TextView) view.findViewById(R.id.message_count);
-
- // Set folder icon
- final ImageView folderIcon = (ImageView) view.findViewById(R.id.folder_icon);
- folderIcon.setImageDrawable(
- FolderProperties.getInstance(context).getIcon(type, id, flags));
-
- final ImageView mailboxExpandedIcon =
- (ImageView) view.findViewById(R.id.folder_expanded_icon);
- switch (rowType) {
- case ROW_TYPE_SUBMAILBOX:
- if (hasVisibleChildren) {
- mailboxExpandedIcon.setVisibility(View.VISIBLE);
- mailboxExpandedIcon.setImageResource(
- R.drawable.ic_mailbox_collapsed_holo_light);
- } else {
- mailboxExpandedIcon.setVisibility(View.INVISIBLE);
- mailboxExpandedIcon.setImageDrawable(null);
- }
- folderIcon.setVisibility(View.INVISIBLE);
- break;
- case ROW_TYPE_CURMAILBOX:
- mailboxExpandedIcon.setVisibility(View.GONE);
- mailboxExpandedIcon.setImageDrawable(null);
- folderIcon.setVisibility(View.GONE);
- break;
- case ROW_TYPE_MAILBOX:
- default: // Includes ROW_TYPE_ACCOUNT
- if (hasVisibleChildren) {
- mailboxExpandedIcon.setVisibility(View.VISIBLE);
- mailboxExpandedIcon.setImageResource(
- R.drawable.ic_mailbox_collapsed_holo_light);
- } else {
- mailboxExpandedIcon.setVisibility(View.GONE);
- mailboxExpandedIcon.setImageDrawable(null);
- }
- folderIcon.setVisibility(View.VISIBLE);
- break;
- }
-
- // If the unread count is zero, not to show countView.
- if (count > 0) {
- countView.setVisibility(View.VISIBLE);
- countView.setText(Integer.toString(count));
- } else {
- countView.setVisibility(View.GONE);
- }
-
- final View chipView = view.findViewById(R.id.color_chip);
- if (isAccount) {
- chipView.setVisibility(View.VISIBLE);
- chipView.setBackgroundColor(mResourceHelper.getAccountColor(id));
- } else {
- chipView.setVisibility(View.GONE);
- }
- }
-
- /**
- * Returns a cursor loader for the mailboxes of the given account. If <code>parentKey</code>
- * refers to a valid mailbox ID [e.g. non-zero], restrict the loader to only those mailboxes
- * contained by this parent mailbox.
- *
- * Note the returned loader always returns a {@link CursorWithExtras}.
- */
- static Loader<Cursor> createMailboxesLoader(Context context, long accountId,
- long parentMailboxId) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "MailboxFragmentAdapter#CursorWithExtras accountId=" + accountId
- + " parentMailboxId=" + parentMailboxId);
- }
- if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- throw new IllegalArgumentException();
- }
- return new MailboxFragmentLoader(context, accountId, parentMailboxId);
- }
-
- /**
- * Returns a cursor loader for the combined view.
- */
- static Loader<Cursor> createCombinedViewLoader(Context context) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "MailboxFragmentAdapter#createCombinedViewLoader");
- }
- return new CombinedMailboxLoader(context);
- }
-
- /**
- * Adds a new row into the given cursor.
- */
- private static void addMailboxRow(MatrixCursor cursor, long mailboxId, String displayName,
- int mailboxType, int unreadCount, int messageCount, int rowType, int flags,
- long accountId) {
- long listId = mailboxId;
- if (mailboxId < 0) {
- listId = Long.MAX_VALUE + mailboxId; // IDs for the list view must be positive
- }
- RowBuilder row = cursor.newRow();
- row.add(listId);
- row.add(mailboxId);
- row.add(displayName);
- row.add(mailboxType);
- row.add(unreadCount);
- row.add(messageCount);
- row.add(rowType);
- row.add(flags);
- row.add(accountId);
- }
-
- private static void addCombinedMailboxRow(Context context, MatrixCursor cursor, long id,
- int mailboxType, boolean showAlways) {
- if (id >= 0) {
- throw new IllegalArgumentException(); // Must be QUERY_ALL_*, which are all negative
- }
- int count = FolderProperties.getMessageCountForCombinedMailbox(context, id);
- if (showAlways || (count > 0)) {
- addMailboxRow(
- cursor, id, "", mailboxType, count, count, ROW_TYPE_MAILBOX, Mailbox.FLAG_NONE,
- Account.ACCOUNT_ID_COMBINED_VIEW);
- }
- }
-
- /**
- * Loads mailboxes that are the children of a given mailbox ID.
- *
- * The returned {@link Cursor} is always a {@link CursorWithExtras}.
- */
- private static class MailboxFragmentLoader extends ThrottlingCursorLoader {
- private final Context mContext;
- private final long mAccountId;
- private final long mParentKey;
-
- MailboxFragmentLoader(Context context, long accountId, long parentKey) {
- super(context, Mailbox.CONTENT_URI,
- (parentKey != Mailbox.NO_MAILBOX)
- ? SUBMAILBOX_PROJECTION
- : PROJECTION,
- USER_MAILBOX_SELECTION_WITH_PARENT,
- new String[] { Long.toString(accountId), Long.toString(parentKey) },
- MAILBOX_ORDER_BY);
- mContext = context;
- mAccountId = accountId;
- mParentKey = parentKey;
- }
-
- @Override
- public void onContentChanged() {
- if (sEnableUpdate) {
- super.onContentChanged();
- }
- }
-
- @Override
- public Cursor loadInBackground() {
- boolean parentRemoved = false;
-
- final Cursor userMailboxCursor = super.loadInBackground();
- final Cursor returnCursor;
-
- final int childCount = userMailboxCursor.getCount();
-
- if (mParentKey != Mailbox.NO_MAILBOX) {
- // If we're not showing the top level mailboxes, add the "parent" mailbox.
- final Cursor parentCursor = getContext().getContentResolver().query(
- Mailbox.CONTENT_URI, CURMAILBOX_PROJECTION, MAILBOX_SELECTION,
- new String[] { Long.toString(mAccountId), Long.toString(mParentKey) },
- null);
- returnCursor = new MergeCursor(new Cursor[] { parentCursor, userMailboxCursor });
- } else {
- // TODO Add per-account starred mailbox support
- final MatrixCursor starredCursor = new MatrixCursor(MATRIX_PROJECTION);
- final Cursor systemMailboxCursor = mContext.getContentResolver().query(
- Mailbox.CONTENT_URI, PROJECTION, SYSTEM_MAILBOX_SELECTION,
- new String[] { Long.toString(mAccountId) }, MAILBOX_ORDER_BY);
- final MatrixCursor recentCursor = new MatrixCursor(MATRIX_PROJECTION);
- final MatrixCursor headerCursor = new MatrixCursor(MATRIX_PROJECTION);
- if (childCount > 0) {
- final String name = mContext.getString(R.string.mailbox_list_user_mailboxes);
- addMailboxRow(headerCursor, 0L, name, 0, 0, 0, ROW_TYPE_HEADER, 0, 0L);
- }
- ArrayList<Long> recentList = null;
- boolean useTwoPane = UiUtilities.useTwoPane(mContext);
- if (useTwoPane) {
- recentList = RecentMailboxManager.getInstance(mContext)
- .getMostRecent(mAccountId, true);
- }
- if (recentList != null && recentList.size() > 0) {
- final String name = mContext.getString(R.string.mailbox_list_recent_mailboxes);
- addMailboxRow(recentCursor, 0L, name, 0, 0, 0, ROW_TYPE_HEADER, 0, 0L);
- for (long mailboxId : recentList) {
- final Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, mailboxId);
- if (mailbox == null) continue;
- final int messageCount = Utility.getFirstRowInt(mContext,
- ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId),
- new String[] { MailboxColumns.MESSAGE_COUNT }, null, null, null, 0);
- final int unreadCount = Utility.getFirstRowInt(mContext,
- ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId),
- new String[] { MailboxColumns.UNREAD_COUNT }, null, null, null, 0);
- addMailboxRow(recentCursor, mailboxId, mailbox.mDisplayName, mailbox.mType,
- unreadCount, messageCount, ROW_TYPE_MAILBOX, mailbox.mFlags,
- mailbox.mAccountKey);
- }
- }
- int accountStarredCount = Message.getFavoriteMessageCount(mContext, mAccountId);
- if (accountStarredCount > 0) {
- // Only add "Starred", if there is at least one starred message
- addCombinedMailboxRow(mContext, starredCursor, Mailbox.QUERY_ALL_FAVORITES,
- Mailbox.TYPE_MAIL, true);
- }
- returnCursor = new MergeCursor(new Cursor[] {
- starredCursor, systemMailboxCursor, recentCursor, headerCursor,
- userMailboxCursor, });
- }
- return new CursorWithExtras(returnCursor, childCount);
- }
- }
-
- /**
- * Loader for mailboxes in "Combined view".
- */
- @VisibleForTesting
- static class CombinedMailboxLoader extends ThrottlingCursorLoader {
- private static final String[] ACCOUNT_PROJECTION = new String[] {
- EmailContent.RECORD_ID, AccountColumns.DISPLAY_NAME,
- };
- private static final int COLUMN_ACCOUND_ID = 0;
- private static final int COLUMN_ACCOUNT_DISPLAY_NAME = 1;
-
- private final Context mContext;
-
- private CombinedMailboxLoader(Context context) {
- super(context, Account.CONTENT_URI, ACCOUNT_PROJECTION, null, null, null);
- mContext = context;
- }
-
- @Override
- public Cursor loadInBackground() {
- final Cursor accounts = super.loadInBackground();
-
- // Build combined mailbox rows.
- final MatrixCursor returnCursor = buildCombinedMailboxes(mContext, accounts);
-
- // Add account rows.
- accounts.moveToPosition(-1);
- while (accounts.moveToNext()) {
- final long accountId = accounts.getLong(COLUMN_ACCOUND_ID);
- final String accountName = accounts.getString(COLUMN_ACCOUNT_DISPLAY_NAME);
- final int unreadCount = Mailbox.getUnreadCountByAccountAndMailboxType(
- mContext, accountId, Mailbox.TYPE_INBOX);
- addMailboxRow(returnCursor, accountId, accountName, Mailbox.TYPE_NONE,
- unreadCount, unreadCount, ROW_TYPE_ACCOUNT, Mailbox.FLAG_NONE,
- accountId);
- }
- return returnCursor;
- }
-
- @VisibleForTesting
- static MatrixCursor buildCombinedMailboxes(Context c, Cursor innerCursor) {
- MatrixCursor cursor = new ClosingMatrixCursor(MATRIX_PROJECTION, innerCursor);
- // Combined inbox -- show unread count
- addCombinedMailboxRow(c, cursor, Mailbox.QUERY_ALL_INBOXES, Mailbox.TYPE_INBOX, true);
-
- // Favorite (starred) -- show # of favorites
- addCombinedMailboxRow(c, cursor, Mailbox.QUERY_ALL_FAVORITES, Mailbox.TYPE_MAIL, false);
-
- // Drafts -- show # of drafts
- addCombinedMailboxRow(c, cursor, Mailbox.QUERY_ALL_DRAFTS, Mailbox.TYPE_DRAFTS, false);
-
- // Outbox -- # of outstanding messages
- addCombinedMailboxRow(c, cursor, Mailbox.QUERY_ALL_OUTBOX, Mailbox.TYPE_OUTBOX, false);
-
- return cursor;
- }
- }
-}
diff --git a/src/com/android/email/activity/MailboxListFragment.java b/src/com/android/email/activity/MailboxListFragment.java
deleted file mode 100644
index e9750e829..000000000
--- a/src/com/android/email/activity/MailboxListFragment.java
+++ /dev/null
@@ -1,1198 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.app.ListFragment;
-import android.app.LoaderManager;
-import android.app.LoaderManager.LoaderCallbacks;
-import android.content.ClipData;
-import android.content.ClipDescription;
-import android.content.Context;
-import android.content.Loader;
-import android.database.Cursor;
-import android.graphics.Rect;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.util.Log;
-import android.view.DragEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnDragListener;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ListView;
-
-import com.android.email.Controller;
-import com.android.email.Email;
-import com.android.email.R;
-import com.android.email.RefreshManager;
-import com.android.email.provider.EmailProvider;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.util.Timer;
-
-/**
- * This fragment presents a list of mailboxes for a given account or the combined mailboxes.
- *
- * This fragment has several parameters that determine the current view.
- *
- * <pre>
- * Parameters:
- * - Account ID.
- * - Set via {@link #newInstance}.
- * - Can be obtained with {@link #getAccountId()}.
- * - Will not change throughout fragment lifecycle.
- * - Either an actual account ID, or {@link Account#ACCOUNT_ID_COMBINED_VIEW}.
- *
- * - "Highlight enabled?" flag
- * - Set via {@link #newInstance}.
- * - Can be obtained with {@link #getEnableHighlight()}.
- * - Will not change throughout fragment lifecycle.
- * - If {@code true}, we highlight the "selected" mailbox (used only on 2-pane).
- * - Note even if it's {@code true}, there may be no highlighted mailbox.
- * (This usually happens on 2-pane before the UI controller finds the Inbox to highlight.)
- *
- * - "Parent" mailbox ID
- * - Stored in {@link #mParentMailboxId}
- * - Changes as the user navigates through nested mailboxes.
- * - Initialized using the {@code mailboxId} parameter for {@link #newInstance}
- * in {@link #setInitialParentAndHighlight()}.
- *
- * - "Highlighted" mailbox
- * - Only used when highlighting is enabled. (Otherwise always {@link Mailbox#NO_MAILBOX}.)
- * i.e. used only on two-pane.
- * - Stored in {@link #mHighlightedMailboxId}
- * - Initialized using the {@code mailboxId} parameter for {@link #newInstance}
- * in {@link #setInitialParentAndHighlight()}.
- *
- * - Can be changed any time, using {@link #setHighlightedMailbox(long)}.
- *
- * - If set, it's considered "selected", and we highlight the list item.
- *
- * - (It should always be the ID of the list item selected in the list view, but we store it in
- * a member for efficiency.)
- *
- * - Sometimes, we need to set the highlighted mailbox while we're still loading data.
- * In this case, we can't update {@link #mHighlightedMailboxId} right away, but need to do so
- * in when the next data set arrives, in
- * {@link MailboxListFragment.MailboxListLoaderCallbacks#onLoadFinished}. For this, we use
- * we store the mailbox ID in {@link #mNextHighlightedMailboxId} and update
- * {@link #mHighlightedMailboxId} in onLoadFinished.
- *
- *
- * The "selected" is defined using the "parent" and "highlighted" mailboxes.
- * - "Selected" mailbox (also sometimes called "current".)
- * - This is what the user thinks it's now selected.
- *
- * - Can be obtained with {@link #getSelectedMailboxId()}
- * - If the "highlighted" mailbox exists, it's the "selected." Otherwise, the "parent"
- * is considered "selected."
- * - This is what is passed to {@link Callback#onMailboxSelected}.
- * </pre>
- *
- *
- * This fragment shows the content in one of the three following views, depending on the
- * parameters above.
- *
- * <pre>
- * 1. Combined view
- * - Used if the account ID == {@link Account#ACCOUNT_ID_COMBINED_VIEW}.
- * - Parent mailbox is always {@link Mailbox#NO_MAILBOX}.
- * - List contains:
- * - combined mailboxes
- * - all accounts
- *
- * 2. Root view for an account
- * - Used if the account ID != {@link Account#ACCOUNT_ID_COMBINED_VIEW} and
- * Parent mailbox == {@link Mailbox#NO_MAILBOX}
- * - List contains
- * - all the top level mailboxes for the selected account.
- *
- * 3. Root view for a mailbox. (nested view)
- * - Used if the account ID != {@link Account#ACCOUNT_ID_COMBINED_VIEW} and
- * Parent mailbox != {@link Mailbox#NO_MAILBOX}
- * - List contains:
- * - parent mailbox (determined by "parent" mailbox ID)
- * - all child mailboxes of the parent mailbox.
- * </pre>
- *
- *
- * Note that when a fragment is put in the back stack, it'll lose the content view but the fragment
- * itself is not destroyed. If you call {@link #getListView()} in this state it'll throw
- * an {@link IllegalStateException}. So,
- * - If code is supposed to be executed only when the fragment has the content view, use
- * {@link #getListView()} directly to make sure it doesn't accidentally get executed when there's
- * no views.
- * - Otherwise, make sure to check if the fragment has views with {@link #isViewCreated()}
- * before touching any views.
- */
-public class MailboxListFragment extends ListFragment implements OnItemClickListener,
- OnDragListener {
- private static final String TAG = "MailboxListFragment";
-
- private static final String BUNDLE_KEY_PARENT_MAILBOX_ID
- = "MailboxListFragment.state.parent_mailbox_id";
- private static final String BUNDLE_KEY_HIGHLIGHTED_MAILBOX_ID
- = "MailboxListFragment.state.selected_mailbox_id";
- private static final String BUNDLE_LIST_STATE = "MailboxListFragment.state.listState";
- private static final boolean DEBUG_DRAG_DROP = false; // MUST NOT SUBMIT SET TO TRUE
-
- /** No drop target is available where the user is currently hovering over */
- private static final int NO_DROP_TARGET = -1;
- // Total height of the top and bottom scroll zones, in pixels
- private static final int SCROLL_ZONE_SIZE = 64;
- // The amount of time to scroll by one pixel, in ms
- private static final int SCROLL_SPEED = 4;
-
- /** Arbitrary number for use with the loader manager */
- private static final int MAILBOX_LOADER_ID = 1;
-
- /** Argument name(s) */
- private static final String ARG_ACCOUNT_ID = "accountId";
- private static final String ARG_ENABLE_HIGHLIGHT = "enablehighlight";
- private static final String ARG_INITIAL_CURRENT_MAILBOX_ID = "initialParentMailboxId";
-
- private final EmailAsyncTask.Tracker mTaskTracker = new EmailAsyncTask.Tracker();
-
- /** Rectangle used for hit testing children */
- private static final Rect sTouchFrame = new Rect();
-
- private RefreshManager mRefreshManager;
-
- // UI Support
- private Activity mActivity;
- private MailboxFragmentAdapter mListAdapter;
- private Callback mCallback = EmptyCallback.INSTANCE;
-
- // See the class javadoc
- private long mParentMailboxId;
- private long mHighlightedMailboxId;
-
- /**
- * Becomes {@code true} once we determine which mailbox to use as the parent.
- */
- private boolean mParentDetermined;
-
- /**
- * ID of the mailbox that should be highlighted when the next cursor is loaded.
- */
- private long mNextHighlightedMailboxId = Mailbox.NO_MAILBOX;
-
- // True if a drag is currently in progress
- private boolean mDragInProgress;
- /** Mailbox ID of the item being dragged. Used to determine valid drop targets. */
- private long mDragItemMailboxId = -1;
- /** A unique identifier for the drop target. May be {@link #NO_DROP_TARGET}. */
- private int mDropTargetId = NO_DROP_TARGET;
- // The mailbox list item view that the user's finger is hovering over
- private MailboxListItem mDropTargetView;
- // Lazily instantiated height of a mailbox list item (-1 is a sentinel for 'not initialized')
- private int mDragItemHeight = -1;
- /** {@code true} if we are currently scrolling under the drag item */
- private boolean mTargetScrolling;
-
- private Parcelable mSavedListState;
-
- private final MailboxFragmentAdapter.Callback mMailboxesAdapterCallback =
- new MailboxFragmentAdapter.Callback() {
- @Override
- public void onBind(MailboxListItem listItem) {
- listItem.setDropTargetBackground(mDragInProgress, mDragItemMailboxId);
- }
- };
-
- /**
- * Callback interface that owning activities must implement
- */
- public interface Callback {
- /**
- * Called when any mailbox (even a combined mailbox) is selected.
- *
- * @param accountId
- * The ID of the owner account of the selected mailbox.
- * Or {@link Account#ACCOUNT_ID_COMBINED_VIEW} if it's a combined mailbox.
- * @param mailboxId
- * The ID of the selected mailbox. This may be real mailbox ID [e.g. a number > 0],
- * or a combined mailbox ID [e.g. {@link Mailbox#QUERY_ALL_INBOXES}].
- * @param nestedNavigation {@code true} if the event is caused by nested mailbox navigation,
- * that is, going up or drilling-in to a child mailbox.
- */
- public void onMailboxSelected(long accountId, long mailboxId, boolean nestedNavigation);
-
- /** Called when an account is selected on the combined view. */
- public void onAccountSelected(long accountId);
-
- /**
- * Called when the parent mailbox is changing.
- */
- public void onParentMailboxChanged();
- }
-
- private static class EmptyCallback implements Callback {
- public static final Callback INSTANCE = new EmptyCallback();
- @Override public void onMailboxSelected(long accountId, long mailboxId,
- boolean nestedNavigation) { }
- @Override public void onAccountSelected(long accountId) { }
- @Override
- public void onParentMailboxChanged() { }
- }
-
- /**
- * Returns the index of the view located at the specified coordinates in the given list.
- * If the coordinates are outside of the list, {@code NO_DROP_TARGET} is returned.
- */
- private static int pointToIndex(ListView list, int x, int y) {
- final int count = list.getChildCount();
- for (int i = count - 1; i >= 0; i--) {
- final View child = list.getChildAt(i);
- if (child.getVisibility() == View.VISIBLE) {
- child.getHitRect(sTouchFrame);
- if (sTouchFrame.contains(x, y)) {
- return i;
- }
- }
- }
- return NO_DROP_TARGET;
- }
-
- /**
- * Create a new instance with initialization parameters.
- *
- * This fragment should be created only with this method. (Arguments should always be set.)
- *
- * @param accountId The ID of the account we want to view
- * @param initialCurrentMailboxId ID of the mailbox of interest.
- * Pass {@link Mailbox#NO_MAILBOX} to show top-level mailboxes.
- * @param enableHighlight {@code true} if highlighting is enabled on the current screen
- * configuration. (We don't highlight mailboxes on one-pane.)
- */
- public static MailboxListFragment newInstance(long accountId, long initialCurrentMailboxId,
- boolean enableHighlight) {
- final MailboxListFragment instance = new MailboxListFragment();
- final Bundle args = new Bundle();
- args.putLong(ARG_ACCOUNT_ID, accountId);
- args.putLong(ARG_INITIAL_CURRENT_MAILBOX_ID, initialCurrentMailboxId);
- args.putBoolean(ARG_ENABLE_HIGHLIGHT, enableHighlight);
- instance.setArguments(args);
- return instance;
- }
-
- /**
- * The account ID the mailbox is associated with. Do not use directly; instead, use
- * {@link #getAccountId()}.
- * <p><em>NOTE:</em> Although we cannot force these to be immutable using Java language
- * constructs, this <em>must</em> be considered immutable.
- */
- private Long mImmutableAccountId;
-
- /**
- * {@code initialCurrentMailboxId} passed to {@link #newInstance}.
- * Do not use directly; instead, use {@link #getInitialCurrentMailboxId()}.
- * <p><em>NOTE:</em> Although we cannot force these to be immutable using Java language
- * constructs, this <em>must</em> be considered immutable.
- */
- private long mImmutableInitialCurrentMailboxId;
-
- /**
- * {@code enableHighlight} passed to {@link #newInstance}.
- * Do not use directly; instead, use {@link #getEnableHighlight()}.
- * <p><em>NOTE:</em> Although we cannot force these to be immutable using Java language
- * constructs, this <em>must</em> be considered immutable.
- */
- private boolean mImmutableEnableHighlight;
-
- private void initializeArgCache() {
- if (mImmutableAccountId != null) return;
- mImmutableAccountId = getArguments().getLong(ARG_ACCOUNT_ID);
- mImmutableInitialCurrentMailboxId = getArguments().getLong(ARG_INITIAL_CURRENT_MAILBOX_ID);
- mImmutableEnableHighlight = getArguments().getBoolean(ARG_ENABLE_HIGHLIGHT);
- }
-
- /**
- * @return {@code accountId} passed to {@link #newInstance}. Safe to call even before onCreate.
- */
- public long getAccountId() {
- initializeArgCache();
- return mImmutableAccountId;
- }
-
- /**
- * @return {@code initialCurrentMailboxId} passed to {@link #newInstance}.
- * Safe to call even before onCreate.
- */
- public long getInitialCurrentMailboxId() {
- initializeArgCache();
- return mImmutableInitialCurrentMailboxId;
- }
-
- /**
- * @return {@code enableHighlight} passed to {@link #newInstance}.
- * Safe to call even before onCreate.
- */
- public boolean getEnableHighlight() {
- initializeArgCache();
- return mImmutableEnableHighlight;
- }
-
- @Override
- public void onAttach(Activity activity) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onAttach");
- }
- super.onAttach(activity);
- }
-
- /**
- * Called to do initial creation of a fragment. This is called after
- * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onCreate");
- }
- super.onCreate(savedInstanceState);
-
- mActivity = getActivity();
- mRefreshManager = RefreshManager.getInstance(mActivity);
- mListAdapter = new MailboxFragmentAdapter(mActivity, mMailboxesAdapterCallback);
- setListAdapter(mListAdapter); // It's safe to do even before the list view is created.
-
- if (savedInstanceState == null) {
- setInitialParentAndHighlight();
- } else {
- restoreInstanceState(savedInstanceState);
- }
- }
-
- /**
- * Set {@link #mParentMailboxId} and {@link #mHighlightedMailboxId} from the fragment arguments.
- */
- private void setInitialParentAndHighlight() {
- final long initialMailboxId = getInitialCurrentMailboxId();
- if (getAccountId() == Account.ACCOUNT_ID_COMBINED_VIEW) {
- // For the combined view, always show the top-level, but highlight the "current".
- mParentMailboxId = Mailbox.NO_MAILBOX;
- } else {
- // Inbox needs special care.
- // Note we can't get the mailbox type on the UI thread but this method *can* be used...
- final long inboxId = Mailbox.findMailboxOfType(getActivity(), getAccountId(),
- Mailbox.TYPE_INBOX);
- if (initialMailboxId == inboxId) {
- // If Inbox is set as the initial current, we show the top level mailboxes
- // with inbox highlighted.
- mParentMailboxId = Mailbox.NO_MAILBOX;
- } else {
- // Otherwise, try using the "current" as the "parent" (and also highlight it).
- // If it has no children, we go up in onLoadFinished().
- mParentMailboxId = initialMailboxId;
- }
- }
- // Highlight the mailbox of interest
- if (getEnableHighlight()) {
- mHighlightedMailboxId = initialMailboxId;
- }
- }
-
- @Override
- public View onCreateView(
- LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onCreateView");
- }
- return inflater.inflate(R.layout.mailbox_list_fragment, container, false);
- }
-
- /**
- * @return true if the content view is created and not destroyed yet. (i.e. between
- * {@link #onCreateView} and {@link #onDestroyView}.
- */
- private boolean isViewCreated() {
- return getView() != null;
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onActivityCreated");
- }
- super.onActivityCreated(savedInstanceState);
-
- // Note we can't do this in onCreateView.
- // getListView() is only usable after onCreateView().
- final ListView lv = getListView();
- lv.setOnItemClickListener(this);
- lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
- lv.setOnDragListener(this);
-
- startLoading(mParentMailboxId, mHighlightedMailboxId);
-
- UiUtilities.installFragment(this);
- }
-
- public void setCallback(Callback callback) {
- mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback;
- }
-
- /**
- * Called when the Fragment is visible to the user.
- */
- @Override
- public void onStart() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onStart");
- }
- super.onStart();
- }
-
- /**
- * Called when the fragment is visible to the user and actively running.
- */
- @Override
- public void onResume() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onResume");
- }
- super.onResume();
-
- // Fetch the latest mailbox list from the server here if stale so that the user always
- // sees the (reasonably) up-to-date mailbox list, without pressing "refresh".
- final long accountId = getAccountId();
- if (mRefreshManager.isMailboxListStale(accountId)) {
- mRefreshManager.refreshMailboxList(accountId);
- }
- }
-
- @Override
- public void onPause() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onPause");
- }
- mSavedListState = getListView().onSaveInstanceState();
- super.onPause();
- }
-
- /**
- * Called when the Fragment is no longer started.
- */
- @Override
- public void onStop() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onStop");
- }
- super.onStop();
- }
-
- @Override
- public void onDestroyView() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onDestroyView");
- }
- UiUtilities.uninstallFragment(this);
- super.onDestroyView();
- }
-
- /**
- * Called when the fragment is no longer in use.
- */
- @Override
- public void onDestroy() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onDestroy");
- }
- mTaskTracker.cancellAllInterrupt();
- super.onDestroy();
- }
-
- @Override
- public void onDetach() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onDetach");
- }
- super.onDetach();
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onSaveInstanceState");
- }
- super.onSaveInstanceState(outState);
- outState.putLong(BUNDLE_KEY_PARENT_MAILBOX_ID, mParentMailboxId);
- outState.putLong(BUNDLE_KEY_HIGHLIGHTED_MAILBOX_ID, mHighlightedMailboxId);
- if (isViewCreated()) {
- outState.putParcelable(BUNDLE_LIST_STATE, getListView().onSaveInstanceState());
- }
- }
-
- private void restoreInstanceState(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " restoreInstanceState");
- }
- mParentMailboxId = savedInstanceState.getLong(BUNDLE_KEY_PARENT_MAILBOX_ID);
- mNextHighlightedMailboxId = savedInstanceState.getLong(BUNDLE_KEY_HIGHLIGHTED_MAILBOX_ID);
- mSavedListState = savedInstanceState.getParcelable(BUNDLE_LIST_STATE);
- }
-
- /**
- * @return "Selected" mailbox ID.
- */
- public long getSelectedMailboxId() {
- return (mHighlightedMailboxId != Mailbox.NO_MAILBOX) ? mHighlightedMailboxId
- : mParentMailboxId;
- }
-
- /**
- * @return {@code true} if top-level mailboxes are shown. {@code false} otherwise.
- */
- private boolean isRoot() {
- return mParentMailboxId == Mailbox.NO_MAILBOX;
- }
-
- /**
- * Navigate one level up in the mailbox hierarchy. Does nothing if at the root account view.
- */
- public boolean navigateUp() {
- if (isRoot()) {
- return false;
- }
- FindParentMailboxTask.ResultCallback callback = new FindParentMailboxTask.ResultCallback() {
- @Override public void onResult(long nextParentMailboxId,
- long nextHighlightedMailboxId, long nextSelectedMailboxId) {
-
- startLoading(nextParentMailboxId, nextHighlightedMailboxId);
- }
- };
- new FindParentMailboxTask(
- getActivity().getApplicationContext(), mTaskTracker, getAccountId(),
- getEnableHighlight(), mParentMailboxId, mHighlightedMailboxId, callback
- ).cancelPreviousAndExecuteParallel((Void[]) null);
- return true;
- }
-
- /**
- * @return {@code true} if the fragment is showing nested mailboxes and we can go one level up.
- * {@code false} otherwise, meaning we're showing the top level mailboxes *OR*
- * we're still loading initial data and we can't determine if we're going to show
- * top-level or not.
- */
- public boolean canNavigateUp() {
- if (!mParentDetermined) {
- return false; // We can't determine yet...
- }
- return !isRoot();
- }
-
- /**
- * A task to determine what parent mailbox ID/highlighted mailbox ID to use for the "UP"
- * navigation, given the current parent mailbox ID, the highlighted mailbox ID, and {@link
- * #mEnableHighlight}.
- */
- @VisibleForTesting
- static class FindParentMailboxTask extends EmailAsyncTask<Void, Void, Long[]> {
- public interface ResultCallback {
- /**
- * Callback to get the result.
- *
- * @param nextParentMailboxId ID of the mailbox to use
- * @param nextHighlightedMailboxId ID of the mailbox to highlight
- * @param nextSelectedMailboxId ID of the mailbox to notify with
- * {@link Callback#onMailboxSelected}.
- */
- public void onResult(long nextParentMailboxId, long nextHighlightedMailboxId,
- long nextSelectedMailboxId);
- }
-
- private final Context mContext;
- private final long mAccountId;
- private final boolean mEnableHighlight;
- private final long mParentMailboxId;
- private final long mHighlightedMailboxId;
- private final ResultCallback mCallback;
-
- public FindParentMailboxTask(Context context, EmailAsyncTask.Tracker taskTracker,
- long accountId, boolean enableHighlight, long parentMailboxId,
- long highlightedMailboxId, ResultCallback callback) {
- super(taskTracker);
- mContext = context;
- mAccountId = accountId;
- mEnableHighlight = enableHighlight;
- mParentMailboxId = parentMailboxId;
- mHighlightedMailboxId = highlightedMailboxId;
- mCallback = callback;
- }
-
- @Override
- protected Long[] doInBackground(Void... params) {
- Mailbox parentMailbox = Mailbox.restoreMailboxWithId(mContext, mParentMailboxId);
- final long nextParentId = (parentMailbox == null) ? Mailbox.NO_MAILBOX
- : parentMailbox.mParentKey;
- final long nextHighlightedId;
- final long nextSelectedId;
- if (mEnableHighlight) {
- // If the "parent" is highlighted before the transition, it should still be
- // highlighted after the upper level view.
- if (mParentMailboxId == mHighlightedMailboxId) {
- nextHighlightedId = mParentMailboxId;
- } else {
- // Otherwise, the next parent will be highlighted, unless we're going up to
- // the root, in which case Inbox should be highlighted.
- if (nextParentId == Mailbox.NO_MAILBOX) {
- nextHighlightedId = Mailbox.findMailboxOfType(mContext, mAccountId,
- Mailbox.TYPE_INBOX);
- } else {
- nextHighlightedId = nextParentId;
- }
- }
-
- // Highlighted one will be "selected".
- nextSelectedId = nextHighlightedId;
-
- } else { // !mEnableHighlight
- nextHighlightedId = Mailbox.NO_MAILBOX;
-
- // Parent will be selected.
- nextSelectedId = nextParentId;
- }
- return new Long[]{nextParentId, nextHighlightedId, nextSelectedId};
- }
-
- @Override
- protected void onSuccess(Long[] result) {
- mCallback.onResult(result[0], result[1], result[2]);
- }
- }
-
- /**
- * Starts the loader.
- *
- * @param parentMailboxId Mailbox ID to be used as the "parent" mailbox
- * @param highlightedMailboxId Mailbox ID that should be highlighted when the data is loaded.
- */
- private void startLoading(long parentMailboxId, long highlightedMailboxId) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " startLoading parent=" + parentMailboxId
- + " highlighted=" + highlightedMailboxId);
- }
- final LoaderManager lm = getLoaderManager();
- boolean parentMailboxChanging = false;
-
- // Parent mailbox changing -- destroy the current loader to force reload.
- if (mParentMailboxId != parentMailboxId) {
- lm.destroyLoader(MAILBOX_LOADER_ID);
- setListShown(false);
- parentMailboxChanging = true;
- }
- mParentMailboxId = parentMailboxId;
- if (getEnableHighlight()) {
- mNextHighlightedMailboxId = highlightedMailboxId;
- }
-
- lm.initLoader(MAILBOX_LOADER_ID, null, new MailboxListLoaderCallbacks());
-
- if (parentMailboxChanging) {
- mCallback.onParentMailboxChanged();
- }
- }
-
- /**
- * Highlight the given mailbox.
- *
- * If data is already loaded, it just sets {@link #mHighlightedMailboxId} and highlight the
- * corresponding list item. (And if the corresponding list item is not found,
- * {@link #mHighlightedMailboxId} is set to {@link Mailbox#NO_MAILBOX})
- *
- * If we're still loading data, it sets {@link #mNextHighlightedMailboxId} instead, and then
- * it'll be set to {@link #mHighlightedMailboxId} in
- * {@link MailboxListLoaderCallbacks#onLoadFinished}.
- *
- * @param mailboxId The ID of the mailbox to highlight.
- */
- public void setHighlightedMailbox(long mailboxId) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " setHighlightedMailbox mailbox=" + mailboxId);
- }
- if (!getEnableHighlight()) {
- return;
- }
- if (mHighlightedMailboxId == mailboxId) {
- return; // already highlighted.
- }
- if (mListAdapter.getCursor() == null) {
- // List not loaded yet. Just remember the ID here and let onLoadFinished() update
- // mHighlightedMailboxId.
- mNextHighlightedMailboxId = mailboxId;
- return;
- }
- mHighlightedMailboxId = mailboxId;
- updateHighlightedMailbox(true);
- }
-
- // TODO This class probably should be made static. There are many calls into the enclosing
- // class and we need to be cautious about what we call while in these callbacks
- private class MailboxListLoaderCallbacks implements LoaderCallbacks<Cursor> {
- private boolean mIsFirstLoad;
-
- @Override
- public Loader<Cursor> onCreateLoader(int id, Bundle args) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, MailboxListFragment.this + " onCreateLoader");
- }
- mIsFirstLoad = true;
- if (getAccountId() == Account.ACCOUNT_ID_COMBINED_VIEW) {
- return MailboxFragmentAdapter.createCombinedViewLoader(getActivity());
- } else {
- return MailboxFragmentAdapter.createMailboxesLoader(getActivity(), getAccountId(),
- mParentMailboxId);
- }
- }
-
- @Override
- public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, MailboxListFragment.this + " onLoadFinished count="
- + cursor.getCount());
- }
- // Note in onLoadFinished we can assume the view is created.
- // The loader manager doesn't deliver results when a fragment is stopped.
-
- // If we're showing a nested mailboxes, and the current parent mailbox has no children,
- // go up.
- if (getAccountId() != Account.ACCOUNT_ID_COMBINED_VIEW) {
- MailboxFragmentAdapter.CursorWithExtras c =
- (MailboxFragmentAdapter.CursorWithExtras) cursor;
- if ((c.mChildCount == 0) && !isRoot()) {
- // Always swap out the cursor so we don't hold a reference to a stale one.
- mListAdapter.swapCursor(cursor);
- navigateUp();
- return;
- }
- }
-
- // Save list view state (primarily scroll position)
- final ListView lv = getListView();
- final Parcelable listState;
- if (mSavedListState != null) {
- listState = mSavedListState;
- mSavedListState = null;
- } else {
- listState = lv.onSaveInstanceState();
- }
-
- if (cursor.getCount() == 0) {
- // There's no row -- call setListShown(false) to make ListFragment show progress
- // icon.
- mListAdapter.swapCursor(null);
- setListShown(false);
-
- } else {
- mParentDetermined = true; // Okay now we're sure which mailbox is the parent.
-
- mListAdapter.swapCursor(cursor);
- setListShown(true);
-
- // Restore the list state, so scroll position is restored - this has to happen
- // prior to setting the checked/highlighted mailbox below.
- lv.onRestoreInstanceState(listState);
-
- // Update the highlighted mailbox
- if (mNextHighlightedMailboxId != Mailbox.NO_MAILBOX) {
- setHighlightedMailbox(mNextHighlightedMailboxId);
- mNextHighlightedMailboxId = Mailbox.NO_MAILBOX;
- }
-
- // We want to make visible the selection only for the first load.
- // Re-load caused by content changed events shouldn't scroll the list.
- if (!updateHighlightedMailbox(mIsFirstLoad)) {
- // This may happen if the mailbox to be selected is not actually in the list
- // that was loaded. Let the user just pick one manually if needed.
- return;
- }
- }
-
- // List has been reloaded; clear any drop target information
- mDropTargetId = NO_DROP_TARGET;
- mDropTargetView = null;
-
- mIsFirstLoad = false;
- }
-
- @Override
- public void onLoaderReset(Loader<Cursor> loader) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, MailboxListFragment.this + " onLoaderReset");
- }
- mListAdapter.swapCursor(null);
- }
- }
-
- /**
- * {@inheritDoc}
- * <p>
- * @param doNotUse <em>IMPORTANT</em>: Do not use this parameter. The ID in the list widget
- * must be a positive value. However, we rely on negative IDs for special mailboxes. Instead,
- * we use the ID returned by {@link MailboxFragmentAdapter#getId(int)}.
- */
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long doNotUse) {
- final long id = mListAdapter.getId(position);
- if (mListAdapter.isAccountRow(position)) {
- mCallback.onAccountSelected(id);
- } else if (mListAdapter.isMailboxRow(position)) {
- // Save account-id. (Need to do this before startLoading() below, which will destroy
- // the current loader and make the mListAdapter lose the cursor.
- // Note, don't just use getAccountId(). A mailbox may tied to a different account ID
- // from getAccountId(). (Currently "Starred" does so.)
- long accountId = mListAdapter.getAccountId(position);
- boolean nestedNavigation = false;
- if (((MailboxListItem) view).isNavigable() && (id != mParentMailboxId)) {
- // Drill-in. Selected one will be the next parent, and it'll also be highlighted.
- startLoading(id, id);
- nestedNavigation = true;
- }
- if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- // Virtual mailboxes, such as "Starred", will have a "combined view" ID. However,
- // we really want to relay the current active account, so that
- // things like per-account starred mailboxes work as expected.
- accountId = getAccountId();
- }
- mCallback.onMailboxSelected(accountId, id, nestedNavigation);
- }
- }
-
- /**
- * Really highlight the mailbox for {@link #mHighlightedMailboxId} on the list view.
- *
- * Note if a list item for {@link #mHighlightedMailboxId} is not found,
- * {@link #mHighlightedMailboxId} will be set to {@link Mailbox#NO_MAILBOX}.
- *
- * @return false when the highlighted mailbox seems to be gone; i.e. if
- * {@link #mHighlightedMailboxId} is set but not found in the list.
- */
- private boolean updateHighlightedMailbox(boolean ensureSelectionVisible) {
- if (!getEnableHighlight() || !isViewCreated()) {
- return true; // Nothing to highlight
- }
- final ListView lv = getListView();
- boolean found = false;
- if (mHighlightedMailboxId == Mailbox.NO_MAILBOX) {
- // No mailbox selected
- lv.clearChoices();
- found = true;
- } else {
- // TODO Don't mix list view & list adapter indices. This is a recipe for disaster.
- final int count = lv.getCount();
- for (int i = 0; i < count; i++) {
- if (mListAdapter.getId(i) != mHighlightedMailboxId) {
- continue;
- }
- found = true;
- lv.setItemChecked(i, true);
- if (ensureSelectionVisible) {
- Utility.listViewSmoothScrollToPosition(getActivity(), lv, i);
- }
- break;
- }
- }
- if (!found) {
- mHighlightedMailboxId = Mailbox.NO_MAILBOX;
- }
- return found;
- }
-
- // Drag & Drop handling
-
- /**
- * Update all of the list's child views with the proper target background (for now, orange if
- * a valid target, except red if the trash; standard background otherwise)
- */
- private void updateChildViews() {
- final ListView lv = getListView();
- int itemCount = lv.getChildCount();
- // Lazily initialize the height of our list items
- if (itemCount > 0 && mDragItemHeight < 0) {
- mDragItemHeight = lv.getChildAt(0).getHeight();
- }
- for (int i = 0; i < itemCount; i++) {
- final View child = lv.getChildAt(i);
- if (!(child instanceof MailboxListItem)) {
- continue;
- }
- MailboxListItem item = (MailboxListItem) child;
- item.setDropTargetBackground(mDragInProgress, mDragItemMailboxId);
- }
- }
-
- /**
- * Called when the user has dragged outside of the mailbox list area.
- */
- private void onDragExited() {
- // Reset the background of the current target
- if (mDropTargetView != null) {
- mDropTargetView.setDropTargetBackground(mDragInProgress, mDragItemMailboxId);
- mDropTargetView = null;
- }
- mDropTargetId = NO_DROP_TARGET;
- stopScrolling();
- }
-
- /**
- * Called while dragging; highlight possible drop targets, and auto scroll the list.
- */
- private void onDragLocation(DragEvent event) {
- final ListView lv = getListView();
- // TODO The list may be changing while in drag-n-drop; temporarily suspend drag-n-drop
- // if the list is being updated [i.e. navigated to another mailbox]
- if (mDragItemHeight <= 0) {
- // This shouldn't be possible, but avoid NPE
- Log.w(TAG, "drag item height is not set");
- return;
- }
- // Find out which item we're in and highlight as appropriate
- final int rawTouchX = (int) event.getX();
- final int rawTouchY = (int) event.getY();
- final int viewIndex = pointToIndex(lv, rawTouchX, rawTouchY);
- int targetId = viewIndex;
- if (targetId != mDropTargetId) {
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Target changed; oldId: " + mDropTargetId + ", newId: " + targetId);
- }
- // Remove highlight the current target; if there was one
- if (mDropTargetView != null) {
- mDropTargetView.setDropTargetBackground(true, mDragItemMailboxId);
- mDropTargetView = null;
- }
- // Get the new target mailbox view
- final View childView = lv.getChildAt(viewIndex);
- final MailboxListItem newTarget;
- if (childView == null) {
- // In any event, we're no longer dragging in the list view if newTarget is null
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Drag off the list");
- }
- newTarget = null;
- final int childCount = lv.getChildCount();
- if (viewIndex >= childCount) {
- // Touching beyond the end of the list; may happen for small lists
- onDragExited();
- return;
- } else {
- // We should never get here
- Log.w(TAG, "null view; idx: " + viewIndex + ", cnt: " + childCount);
- }
- } else if (!(childView instanceof MailboxListItem)) {
- // We're over a header suchas "Recent folders". We shouldn't finish DnD, but
- // drop should be disabled.
- newTarget = null;
- targetId = NO_DROP_TARGET;
- } else {
- newTarget = (MailboxListItem) childView;
- if (newTarget.mMailboxType == Mailbox.TYPE_TRASH) {
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Trash mailbox; id: " + newTarget.mMailboxId);
- }
- newTarget.setDropTrashBackground();
- } else if (newTarget.isDropTarget(mDragItemMailboxId)) {
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Target mailbox; id: " + newTarget.mMailboxId);
- }
- newTarget.setDropActiveBackground();
- } else {
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Non-droppable mailbox; id: " + newTarget.mMailboxId);
- }
- newTarget.setDropTargetBackground(true, mDragItemMailboxId);
- targetId = NO_DROP_TARGET;
- }
- }
- // Save away our current position and view
- mDropTargetId = targetId;
- mDropTargetView = newTarget;
- }
-
- // This is a quick-and-dirty implementation of drag-under-scroll; something like this
- // should eventually find its way into the framework
- int scrollDiff = rawTouchY - (lv.getHeight() - SCROLL_ZONE_SIZE);
- boolean scrollDown = (scrollDiff > 0);
- boolean scrollUp = (SCROLL_ZONE_SIZE > rawTouchY);
- if (!mTargetScrolling && scrollDown) {
- int itemsToScroll = lv.getCount() - lv.getLastVisiblePosition();
- int pixelsToScroll = (itemsToScroll + 1) * mDragItemHeight;
- lv.smoothScrollBy(pixelsToScroll, pixelsToScroll * SCROLL_SPEED);
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Start scrolling list down");
- }
- mTargetScrolling = true;
- } else if (!mTargetScrolling && scrollUp) {
- int pixelsToScroll = (lv.getFirstVisiblePosition() + 1) * mDragItemHeight;
- lv.smoothScrollBy(-pixelsToScroll, pixelsToScroll * SCROLL_SPEED);
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Start scrolling list up");
- }
- mTargetScrolling = true;
- } else if (!scrollUp && !scrollDown) {
- stopScrolling();
- }
- }
-
- /**
- * Indicate that scrolling has stopped
- */
- private void stopScrolling() {
- final ListView lv = getListView();
- if (mTargetScrolling) {
- mTargetScrolling = false;
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Stop scrolling list");
- }
- // Stop the scrolling
- lv.smoothScrollBy(0, 0);
- }
- }
-
- private void onDragEnded() {
- if (mDragInProgress) {
- mDragInProgress = false;
- // Reenable updates to the view and redraw (in case it changed)
- MailboxFragmentAdapter.enableUpdates(true);
- mListAdapter.notifyDataSetChanged();
- // Stop highlighting targets
- updateChildViews();
- // Stop any scrolling that was going on
- stopScrolling();
- }
- }
-
- private boolean onDragStarted(DragEvent event) {
- // We handle dropping of items with our email mime type
- // If the mime type has a mailbox id appended, that is the mailbox of the item
- // being draged
- ClipDescription description = event.getClipDescription();
- int mimeTypeCount = description.getMimeTypeCount();
- for (int i = 0; i < mimeTypeCount; i++) {
- String mimeType = description.getMimeType(i);
- if (mimeType.startsWith(EmailProvider.EMAIL_MESSAGE_MIME_TYPE)) {
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Drag started");
- }
- mDragItemMailboxId = -1;
- // See if we find a mailbox id here
- int dash = mimeType.lastIndexOf('-');
- if (dash > 0) {
- try {
- mDragItemMailboxId = Long.parseLong(mimeType.substring(dash + 1));
- } catch (NumberFormatException e) {
- // Ignore; we just won't know the mailbox
- }
- }
- mDragInProgress = true;
- // Stop the list from updating
- MailboxFragmentAdapter.enableUpdates(false);
- // Update the backgrounds of our child views to highlight drop targets
- updateChildViews();
- return true;
- }
- }
- return false;
- }
-
- /**
- * Perform a "drop" action. If the user is not on top of a valid drop target, no action
- * is performed.
- * @return {@code true} if the drop action was performed. Otherwise {@code false}.
- */
- private boolean onDrop(DragEvent event) {
- stopScrolling();
- // If we're not on a target, we're done
- if (mDropTargetId == NO_DROP_TARGET) {
- return false;
- }
- final Controller controller = Controller.getInstance(mActivity);
- ClipData clipData = event.getClipData();
- int count = clipData.getItemCount();
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Dropping " + count + " items.");
- }
- // Extract the messageId's to move from the ClipData (set up in MessageListItem)
- final long[] messageIds = new long[count];
- for (int i = 0; i < count; i++) {
- Uri uri = clipData.getItemAt(i).getUri();
- String msgNum = uri.getPathSegments().get(1);
- long id = Long.parseLong(msgNum);
- messageIds[i] = id;
- }
- // Call either deleteMessage or moveMessage, depending on the target
- if (mDropTargetView.mMailboxType == Mailbox.TYPE_TRASH) {
- controller.deleteMessages(messageIds);
- } else {
- controller.moveMessages(messageIds, mDropTargetView.mMailboxId);
- }
- return true;
- }
-
- @Override
- public boolean onDrag(View view, DragEvent event) {
- boolean result = false;
- switch (event.getAction()) {
- case DragEvent.ACTION_DRAG_STARTED:
- result = onDragStarted(event);
- break;
- case DragEvent.ACTION_DRAG_ENTERED:
- // The drag has entered the ListView window
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Drag entered; targetId: " + mDropTargetId);
- }
- break;
- case DragEvent.ACTION_DRAG_EXITED:
- // The drag has left the building
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Drag exited; targetId: " + mDropTargetId);
- }
- onDragExited();
- break;
- case DragEvent.ACTION_DRAG_ENDED:
- // The drag is over
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Drag ended");
- }
- onDragEnded();
- break;
- case DragEvent.ACTION_DRAG_LOCATION:
- // We're moving around within our window; handle scroll, if necessary
- onDragLocation(event);
- break;
- case DragEvent.ACTION_DROP:
- // The drag item was dropped
- if (DEBUG_DRAG_DROP) {
- Log.d(TAG, "=== Drop");
- }
- result = onDrop(event);
- break;
- default:
- break;
- }
- return result;
- }
-}
diff --git a/src/com/android/email/activity/MailboxListItem.java b/src/com/android/email/activity/MailboxListItem.java
deleted file mode 100644
index 177d8f587..000000000
--- a/src/com/android/email/activity/MailboxListItem.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import com.android.email.R;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.Mailbox;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-
-public class MailboxListItem extends RelativeLayout {
- // Colors used for drop targets
- private static Integer sDropAvailableBgColor;
- private static Integer sDropTrashBgColor;
-
- /**
- * Owner account ID for the mailbox, {@link Account#ACCOUNT_ID_COMBINED_VIEW} for a combined
- * mailbox, or the ID for the current account, if it's an account row.
- */
- public long mAccountId;
-
- /**
- * ID for the current mailbox, or {@link Mailbox#NO_MAILBOX} if it's an account row.
- */
- public long mMailboxId;
- public Integer mMailboxType;
- /** If {@code true} this item can be used as a drop target. Otherwise, drop is prohibited. */
- public boolean mIsValidDropTarget;
- /** If {@code true} this item can be navigated to. Otherwise, it can just be selected. */
- public boolean mIsNavigable;
- public MailboxFragmentAdapter mAdapter;
-
- private Drawable mBackground;
- private TextView mLabelName;
- private TextView mLabelCount;
-
- /**
- * Drawable for an active item for D&D. Note the drawable has state, so we can't share it
- * between items.
- * DO NOT use this directly; use {@link #getDropActiveBgDrawable()} instead, as it's lazily-
- * initialized.
- */
- private Drawable mDropActiveBgDrawable;
-
- public MailboxListItem(Context context) {
- super(context);
- }
-
- public MailboxListItem(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public MailboxListItem(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- mBackground = getBackground();
- if (sDropAvailableBgColor == null) {
- Resources res = getResources();
- sDropAvailableBgColor = res.getColor(R.color.mailbox_drop_available_bg_color);
- sDropTrashBgColor = res.getColor(R.color.mailbox_drop_destructive_bg_color);
- }
- mLabelName = (TextView)findViewById(R.id.mailbox_name);
- mLabelCount = (TextView)findViewById(R.id.message_count);
- }
-
- /**
- * Whether or not this mailbox item is a drop target. Only valid mailboxes or those
- * not forbidden by the system (see {@link Mailbox#INVALID_DROP_TARGETS}) will return
- * {@code true}.
- */
- public boolean isDropTarget(long itemMailboxId) {
- return mIsValidDropTarget && (itemMailboxId != mMailboxId);
- }
-
- /**
- * Returns whether or not this item can be navigated to.
- */
- public boolean isNavigable() {
- return mIsNavigable;
- }
-
- private Drawable getDropActiveBgDrawable() {
- if (mDropActiveBgDrawable == null) {
- mDropActiveBgDrawable =
- getContext().getResources().getDrawable(R.drawable.list_activated_holo);
- }
- return mDropActiveBgDrawable;
- }
-
- @Override
- public void setBackgroundDrawable(Drawable d) {
- // Don't override with the same instance.
- // If we don't do the check, something bad will happen to the fade-out animation for
- // the selected to non-selected transition. (Looks like if you re-set the same
- // StateListDrawable instance, it'll get confused.)
- if (d != getBackground()) {
- super.setBackgroundDrawable(d);
- }
- }
-
- /**
- * Set the "trash" drop target background.
- */
- public void setDropTrashBackground() {
- setBackgroundColor(sDropTrashBgColor);
- }
-
- /**
- * Set the "active" drop target background. (Used for the items that the user is hovering over)
- */
- public void setDropActiveBackground() {
- setBackgroundDrawable(getDropActiveBgDrawable());
- }
-
- public void setDropTargetBackground(boolean dragInProgress, long itemMailbox) {
- boolean isBackgroundSet = false;
- if (dragInProgress) {
- if (isDropTarget(itemMailbox)) {
- setBackgroundColor(sDropAvailableBgColor);
- isBackgroundSet = true;
- } else {
- mLabelName.setEnabled(false);
- mLabelCount.setEnabled(false);
- }
- } else {
- mLabelName.setEnabled(true);
- mLabelCount.setEnabled(true);
- }
- if (!isBackgroundSet) {
- // Drag not in progress, or it's not a drop target.
- setBackgroundDrawable(mBackground);
- }
- }
-}
diff --git a/src/com/android/email/activity/MailboxMoveToAdapter.java b/src/com/android/email/activity/MailboxMoveToAdapter.java
deleted file mode 100644
index bbcb8560a..000000000
--- a/src/com/android/email/activity/MailboxMoveToAdapter.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.content.Context;
-import android.content.Loader;
-import android.database.Cursor;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.CursorAdapter;
-import android.widget.TextView;
-
-import com.android.email.Email;
-import com.android.email.FolderProperties;
-import com.android.email.data.ThrottlingCursorLoader;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.Utility;
-
-/**
- * Cursor adapter for the "move to mailbox" dialog.
- * TODO We've detached this class from {@link MailboxFragmentAdapter} and {@link MailboxFragmentAdapter}.
- * Depending upon the UX for the dialog and nested folders, we may want to bring these three
- * adapter classes back into alignment.
- */
-class MailboxMoveToAdapter extends CursorAdapter {
- /** Selection for all mailboxes in an account */
- private static final String ALL_MAILBOX_SELECTION = MailboxColumns.ACCOUNT_KEY + "=?"
- + " AND " + Mailbox.USER_VISIBLE_MAILBOX_SELECTION;
- /** Selection for valid target mailboxes */
- private static final String TARGET_MAILBOX_SELECTION =
- MailboxColumns.TYPE + " NOT IN (" + Mailbox.TYPE_DRAFTS + ","
- + Mailbox.TYPE_OUTBOX + "," + Mailbox.TYPE_SENT + "," + Mailbox.TYPE_TRASH + ") AND ("
- + MailboxColumns.FLAGS + " & " + Mailbox.FLAG_ACCEPTS_MOVED_MAIL + " != 0)";
- /** Selection to exclude a mailbox ID */
- private static final String EXCLUDE_MAILBOX_SELECTION =
- MailboxColumns.ID + "!=?";
- /** The main selection to populate the "move to" dialog */
- private static final String MOVE_TO_SELECTION =
- ALL_MAILBOX_SELECTION
- + " AND " + TARGET_MAILBOX_SELECTION
- + " AND " + EXCLUDE_MAILBOX_SELECTION;
- /** Projection that uses the server id column as the mailbox name */
- private static final String[] MOVE_TO_PROJECTION_SERVER_ID = new String[] {
- MailboxColumns.ID,
- MailboxColumns.ID + " AS org_mailbox_id",
- MailboxColumns.SERVER_ID,
- MailboxColumns.TYPE,
- };
- /** Projection that uses the display name column as the mailbox name */
- private static final String[] MOVE_TO_PROJECTION_DISPLAY_NAME = new String[] {
- MailboxColumns.ID,
- MailboxColumns.ID + " AS org_mailbox_id",
- MailboxColumns.DISPLAY_NAME,
- MailboxColumns.TYPE,
- };
- /** Sort order for special mailboxes */
- private static final String MOVE_TO_ORDER_BY_STATIC =
- "CASE " + MailboxColumns.TYPE
- + " WHEN " + Mailbox.TYPE_INBOX + " THEN 0"
- + " WHEN " + Mailbox.TYPE_JUNK + " THEN 1"
- + " ELSE 10 END";
- /** Server id sort order */
- private static final String MOVE_TO_ORDER_BY_SERVER_ID =
- MOVE_TO_ORDER_BY_STATIC
- // All other mailboxes are shown in alphabetical order.
- + ", " + MailboxColumns.SERVER_ID;
- /** Display name sort order */
- private static final String MOVE_TO_ORDER_BY_DISPLAY_NAME =
- MOVE_TO_ORDER_BY_STATIC
- // All other mailboxes are shown in alphabetical order.
- + ", " + MailboxColumns.DISPLAY_NAME;
-
- // Column 0 is only for ListView; we don't use it in our code.
- private static final int COLUMN_ID = 1;
- private static final int COLUMN_MAILBOX_NAME = 2;
- private static final int COLUMN_TYPE = 3;
-
- /** Cached layout inflater */
- private final LayoutInflater mInflater;
-
- public MailboxMoveToAdapter(Context context) {
- super(context, null, 0 /* flags; no content observer */);
- mInflater = LayoutInflater.from(context);
- }
-
- @Override
- public void bindView(View view, Context context, Cursor cursor) {
- TextView t = (TextView) view;
- t.setText(getDisplayText(context, cursor));
- }
-
- @Override
- public View newView(Context context, Cursor cursor, ViewGroup parent) {
- return mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
- }
-
- static Loader<Cursor> createLoader(Context context, long accountId, long mailboxId) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "MailboxDialogAdapter#createLoader accountId=" + accountId
- + ", mailboxId=" + mailboxId);
- }
- return new MailboxMoveToLoader(context, accountId, mailboxId);
- }
-
- /**
- * Returns the mailbox name to display in the dialog list. If the mailbox is of
- * certain, well known, types, use a predefined name. Otherwise, use the server
- * provided name.
- */
- private static String getDisplayText(Context context, Cursor cursor) {
- final int type = cursor.getInt(COLUMN_TYPE);
- final long mailboxId = cursor.getLong(COLUMN_ID);
- return FolderProperties.getInstance(context).getDisplayName(type, mailboxId,
- cursor.getString(COLUMN_MAILBOX_NAME));
- }
-
- /** Loader for the "move to mailbox" dialog. */
- private static class MailboxMoveToLoader extends ThrottlingCursorLoader {
- private final long mAccountId;
- public MailboxMoveToLoader(Context context, long accountId, long mailboxId) {
- super(context, Mailbox.CONTENT_URI,
- null, MOVE_TO_SELECTION,
- new String[] { Long.toString(accountId), Long.toString(mailboxId) }, null);
- mAccountId = accountId;
- }
-
- @Override
- public Cursor loadInBackground() {
- // TODO Create a common way to store the fully qualified path name for all account types
- final String protocol = Account.getProtocol(getContext(), mAccountId);
- if (HostAuth.SCHEME_EAS.equals(protocol)) {
- // For EAS accounts; use the display name
- setProjection(MOVE_TO_PROJECTION_DISPLAY_NAME);
- setSortOrder(MOVE_TO_ORDER_BY_DISPLAY_NAME);
- } else {
- // For all other accounts; use the server id
- setProjection(MOVE_TO_PROJECTION_SERVER_ID);
- setSortOrder(MOVE_TO_ORDER_BY_SERVER_ID);
- }
- final Cursor mailboxesCursor = super.loadInBackground();
- return Utility.CloseTraceCursorWrapper.get(mailboxesCursor);
- }
- }
-}
diff --git a/src/com/android/email/activity/MessageCommandButtonView.java b/src/com/android/email/activity/MessageCommandButtonView.java
deleted file mode 100644
index f9370cb93..000000000
--- a/src/com/android/email/activity/MessageCommandButtonView.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import com.android.email.R;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-/**
- * A View that is shown at the bottom of {@link MessageViewFragment} and contains buttons such
- * as "(move to) newer".
- *
- * This class is meant to hide layout differences between portrait and landscape, if any.
- * e.g. We might combine some of the buttons when we have small real estate.
- */
-public class MessageCommandButtonView extends LinearLayout implements View.OnClickListener {
- /**
- * If false, we don't want to show anything, in which case all fields holding a view
- * (e.g. {@link #mMoveToNewerButton}) are null.
- */
- private boolean mShowPanel;
-
- private View mMoveToNewerButton;
- private View mMoveToOlderButton;
- private TextView mMessagePosition;
-
- private Callback mCallback = EmptyCallback.INSTANCE;
-
- public interface Callback {
- public void onMoveToNewer();
- public void onMoveToOlder();
- }
-
- private static class EmptyCallback implements Callback {
- public static final Callback INSTANCE = new EmptyCallback();
- @Override public void onMoveToNewer() {}
- @Override public void onMoveToOlder() {}
- }
-
- public MessageCommandButtonView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- public MessageCommandButtonView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public MessageCommandButtonView(Context context) {
- super(context);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- mMoveToNewerButton = findViewById(R.id.move_to_newer_button);
- if (mMoveToNewerButton == null) {
- mShowPanel = false;
- return;
- }
- mShowPanel = true;
- mMoveToOlderButton = findViewById(R.id.move_to_older_button);
- mMessagePosition = (TextView) findViewById(R.id.message_position);
-
- mMoveToNewerButton.setOnClickListener(this);
- mMoveToOlderButton.setOnClickListener(this);
- }
-
- public void setCallback(Callback callback) {
- mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback;
- }
-
- public void enableNavigationButtons(boolean enableMoveToNewer, boolean enableMoveToOlder,
- int currentPosition, int countMessages) {
- if (!mShowPanel) {
- return;
- }
- mMoveToNewerButton.setEnabled(enableMoveToNewer);
- mMoveToOlderButton.setEnabled(enableMoveToOlder);
-
- // Show "POSITION of TOTAL"
- final String positionOfCount;
- if (countMessages == 0) {
- positionOfCount = "";
- } else {
- positionOfCount = getContext().getResources().getString(R.string.position_of_count,
- (currentPosition + 1), countMessages);
- }
- mMessagePosition.setText(positionOfCount);
- }
-
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.move_to_newer_button:
- mCallback.onMoveToNewer();
- break;
- case R.id.move_to_older_button:
- mCallback.onMoveToOlder();
- break;
- }
- }
-}
diff --git a/src/com/android/email/activity/MessageCompose.java b/src/com/android/email/activity/MessageCompose.java
deleted file mode 100644
index 42bc13efb..000000000
--- a/src/com/android/email/activity/MessageCompose.java
+++ /dev/null
@@ -1,2365 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.ActionBar;
-import android.app.ActionBar.OnNavigationListener;
-import android.app.ActionBar.Tab;
-import android.app.ActionBar.TabListener;
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.FragmentTransaction;
-import android.content.ActivityNotFoundException;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.provider.OpenableColumns;
-import android.text.InputFilter;
-import android.text.SpannableStringBuilder;
-import android.text.Spanned;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.text.util.Rfc822Tokenizer;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnFocusChangeListener;
-import android.view.ViewGroup;
-import android.webkit.WebView;
-import android.widget.ArrayAdapter;
-import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.ImageView;
-import android.widget.MultiAutoCompleteTextView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.android.common.contacts.DataUsageStatUpdater;
-import com.android.email.Controller;
-import com.android.email.Email;
-import com.android.email.EmailAddressAdapter;
-import com.android.email.EmailAddressValidator;
-import com.android.email.R;
-import com.android.email.RecipientAdapter;
-import com.android.email.activity.setup.AccountSettings;
-import com.android.email.mail.internet.EmailHtmlUtil;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.internet.MimeUtility;
-import com.android.emailcommon.mail.Address;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.Body;
-import com.android.emailcommon.provider.EmailContent.BodyColumns;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.emailcommon.provider.EmailContent.QuickResponseColumns;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.provider.QuickResponse;
-import com.android.emailcommon.utility.AttachmentUtilities;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-import com.android.ex.chips.AccountSpecifier;
-import com.android.ex.chips.ChipsUtil;
-import com.android.ex.chips.RecipientEditTextView;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Objects;
-import com.google.common.collect.Lists;
-
-import java.io.File;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutionException;
-
-
-/**
- * Activity to compose a message.
- *
- * TODO Revive shortcuts command for removed menu options.
- * C: add cc/bcc
- * N: add attachment
- */
-public class MessageCompose extends Activity implements OnClickListener, OnFocusChangeListener,
- DeleteMessageConfirmationDialog.Callback, InsertQuickResponseDialog.Callback {
-
- private static final String ACTION_REPLY = "com.android.email.intent.action.REPLY";
- private static final String ACTION_REPLY_ALL = "com.android.email.intent.action.REPLY_ALL";
- private static final String ACTION_FORWARD = "com.android.email.intent.action.FORWARD";
- private static final String ACTION_EDIT_DRAFT = "com.android.email.intent.action.EDIT_DRAFT";
-
- private static final String EXTRA_ACCOUNT_ID = "account_id";
- private static final String EXTRA_MESSAGE_ID = "message_id";
- /** If the intent is sent from the email app itself, it should have this boolean extra. */
- public static final String EXTRA_FROM_WITHIN_APP = "from_within_app";
- /** If the intent is sent from thw widget. */
- public static final String EXTRA_FROM_WIDGET = "from_widget";
-
- private static final String STATE_KEY_CC_SHOWN =
- "com.android.email.activity.MessageCompose.ccShown";
- private static final String STATE_KEY_QUOTED_TEXT_SHOWN =
- "com.android.email.activity.MessageCompose.quotedTextShown";
- private static final String STATE_KEY_DRAFT_ID =
- "com.android.email.activity.MessageCompose.draftId";
- private static final String STATE_KEY_LAST_SAVE_TASK_ID =
- "com.android.email.activity.MessageCompose.requestId";
- private static final String STATE_KEY_ACTION =
- "com.android.email.activity.MessageCompose.action";
-
- private static final int ACTIVITY_REQUEST_PICK_ATTACHMENT = 1;
-
- private static final String[] ATTACHMENT_META_SIZE_PROJECTION = {
- OpenableColumns.SIZE
- };
- private static final int ATTACHMENT_META_SIZE_COLUMN_SIZE = 0;
-
- /**
- * A registry of the active tasks used to save messages.
- */
- private static final ConcurrentHashMap<Long, SendOrSaveMessageTask> sActiveSaveTasks =
- new ConcurrentHashMap<Long, SendOrSaveMessageTask>();
-
- private static long sNextSaveTaskId = 1;
-
- /**
- * The ID of the latest save or send task requested by this Activity.
- */
- private long mLastSaveTaskId = -1;
-
- private Account mAccount;
-
- /**
- * The contents of the current message being edited. This is not always in sync with what's
- * on the UI. {@link #updateMessage(Message, Account, boolean, boolean)} must be called to sync
- * the UI values into this object.
- */
- private Message mDraft = new Message();
-
- /**
- * A collection of attachments the user is currently wanting to attach to this message.
- */
- private final ArrayList<Attachment> mAttachments = new ArrayList<Attachment>();
-
- /**
- * The source message for a reply, reply all, or forward. This is asynchronously loaded.
- */
- private Message mSource;
-
- /**
- * The attachments associated with the source attachments. Usually included in a forward.
- */
- private ArrayList<Attachment> mSourceAttachments = new ArrayList<Attachment>();
-
- /**
- * The action being handled by this activity. This is initially populated from the
- * {@link Intent}, but can switch between reply/reply all/forward where appropriate.
- * This value is nullable (a null value indicating a regular "compose").
- */
- private String mAction;
-
- private TextView mFromView;
- private MultiAutoCompleteTextView mToView;
- private MultiAutoCompleteTextView mCcView;
- private MultiAutoCompleteTextView mBccView;
- private View mCcBccContainer;
- private EditText mSubjectView;
- private EditText mMessageContentView;
- private View mAttachmentContainer;
- private ViewGroup mAttachmentContentView;
- private View mQuotedTextArea;
- private CheckBox mIncludeQuotedTextCheckBox;
- private WebView mQuotedText;
- private ActionSpinnerAdapter mActionSpinnerAdapter;
-
- private Controller mController;
- private boolean mDraftNeedsSaving;
- private boolean mMessageLoaded;
- private boolean mInitiallyEmpty;
- private boolean mPickingAttachment = false;
- private Boolean mQuickResponsesAvailable = true;
- private final EmailAsyncTask.Tracker mTaskTracker = new EmailAsyncTask.Tracker();
-
- private AccountSpecifier mAddressAdapterTo;
- private AccountSpecifier mAddressAdapterCc;
- private AccountSpecifier mAddressAdapterBcc;
-
- /**
- * Watches the to, cc, bcc, subject, and message body fields.
- */
- private final TextWatcher mWatcher = new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence s, int start,
- int before, int after) { }
-
- @Override
- public void onTextChanged(CharSequence s, int start,
- int before, int count) {
- setMessageChanged(true);
- }
-
- @Override
- public void afterTextChanged(android.text.Editable s) { }
- };
-
- private static Intent getBaseIntent(Context context) {
- return new Intent(context, MessageCompose.class);
- }
-
- /**
- * Create an {@link Intent} that can start the message compose activity. If accountId -1,
- * the default account will be used; otherwise, the specified account is used.
- */
- public static Intent getMessageComposeIntent(Context context, long accountId) {
- Intent i = getBaseIntent(context);
- i.putExtra(EXTRA_ACCOUNT_ID, accountId);
- return i;
- }
-
- /**
- * Creates an {@link Intent} that can start the message compose activity from the main Email
- * activity. This should not be used for Intents to be fired from outside of the main Email
- * activity, such as from widgets, as the behavior of the compose screen differs subtly from
- * those cases.
- */
- private static Intent getMainAppIntent(Context context, long accountId) {
- Intent result = getMessageComposeIntent(context, accountId);
- result.putExtra(EXTRA_FROM_WITHIN_APP, true);
- return result;
- }
-
- /**
- * Compose a new message using the given account. If account is {@link Account#NO_ACCOUNT}
- * the default account will be used.
- * This should only be called from the main Email application.
- * @param context
- * @param accountId
- */
- public static void actionCompose(Context context, long accountId) {
- try {
- Intent i = getMainAppIntent(context, accountId);
- context.startActivity(i);
- } catch (ActivityNotFoundException anfe) {
- // Swallow it - this is usually a race condition, especially under automated test.
- // (The message composer might have been disabled)
- Email.log(anfe.toString());
- }
- }
-
- /**
- * Compose a new message using a uri (mailto:) and a given account. If account is -1 the
- * default account will be used.
- * This should only be called from the main Email application.
- * @param context
- * @param uriString
- * @param accountId
- * @return true if startActivity() succeeded
- */
- public static boolean actionCompose(Context context, String uriString, long accountId) {
- try {
- Intent i = getMainAppIntent(context, accountId);
- i.setAction(Intent.ACTION_SEND);
- i.setData(Uri.parse(uriString));
- context.startActivity(i);
- return true;
- } catch (ActivityNotFoundException anfe) {
- // Swallow it - this is usually a race condition, especially under automated test.
- // (The message composer might have been disabled)
- Email.log(anfe.toString());
- return false;
- }
- }
-
- /**
- * Compose a new message as a reply to the given message. If replyAll is true the function
- * is reply all instead of simply reply.
- * @param context
- * @param messageId
- * @param replyAll
- */
- public static void actionReply(Context context, long messageId, boolean replyAll) {
- startActivityWithMessage(context, replyAll ? ACTION_REPLY_ALL : ACTION_REPLY, messageId);
- }
-
- /**
- * Compose a new message as a forward of the given message.
- * @param context
- * @param messageId
- */
- public static void actionForward(Context context, long messageId) {
- startActivityWithMessage(context, ACTION_FORWARD, messageId);
- }
-
- /**
- * Continue composition of the given message. This action modifies the way this Activity
- * handles certain actions.
- * Save will attempt to replace the message in the given folder with the updated version.
- * Discard will delete the message from the given folder.
- * @param context
- * @param messageId the message id.
- */
- public static void actionEditDraft(Context context, long messageId) {
- startActivityWithMessage(context, ACTION_EDIT_DRAFT, messageId);
- }
-
- /**
- * Starts a compose activity with a message as a reference message (e.g. for reply or forward).
- */
- private static void startActivityWithMessage(Context context, String action, long messageId) {
- Intent i = getBaseIntent(context);
- i.putExtra(EXTRA_MESSAGE_ID, messageId);
- i.setAction(action);
- context.startActivity(i);
- }
-
- private void setAccount(Intent intent) {
- long accountId = intent.getLongExtra(EXTRA_ACCOUNT_ID, -1);
- if (accountId == Account.NO_ACCOUNT) {
- accountId = Account.getDefaultAccountId(this);
- }
- if (accountId == Account.NO_ACCOUNT) {
- // There are no accounts set up. This should not have happened. Prompt the
- // user to set up an account as an acceptable bailout.
- Welcome.actionStart(this);
- finish();
- } else {
- setAccount(Account.restoreAccountWithId(this, accountId));
- }
- }
-
- private void setAccount(Account account) {
- if (account == null) {
- throw new IllegalArgumentException();
- }
- mAccount = account;
- mFromView.setText(account.mEmailAddress);
- mAddressAdapterTo
- .setAccount(new android.accounts.Account(account.mEmailAddress, "unknown"));
- mAddressAdapterCc
- .setAccount(new android.accounts.Account(account.mEmailAddress, "unknown"));
- mAddressAdapterBcc
- .setAccount(new android.accounts.Account(account.mEmailAddress, "unknown"));
-
- new QuickResponseChecker(mTaskTracker).executeParallel((Void) null);
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityHelper.debugSetWindowFlags(this);
- setContentView(R.layout.message_compose);
-
- mController = Controller.getInstance(getApplication());
- initViews();
-
- // Show the back arrow on the action bar.
- getActionBar().setDisplayOptions(
- ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP);
-
- if (savedInstanceState != null) {
- long draftId = savedInstanceState.getLong(STATE_KEY_DRAFT_ID, Message.NOT_SAVED);
- long existingSaveTaskId = savedInstanceState.getLong(STATE_KEY_LAST_SAVE_TASK_ID, -1);
- setAction(savedInstanceState.getString(STATE_KEY_ACTION));
- SendOrSaveMessageTask existingSaveTask = sActiveSaveTasks.get(existingSaveTaskId);
-
- if ((draftId != Message.NOT_SAVED) || (existingSaveTask != null)) {
- // Restoring state and there was an existing message saved or in the process of
- // being saved.
- resumeDraft(draftId, existingSaveTask, false /* don't restore views */);
- } else {
- // Restoring state but there was nothing saved - probably means the user rotated
- // the device immediately - just use the Intent.
- resolveIntent(getIntent());
- }
- } else {
- Intent intent = getIntent();
- setAction(intent.getAction());
- resolveIntent(intent);
- }
- }
-
- private void resolveIntent(Intent intent) {
- if (Intent.ACTION_VIEW.equals(mAction)
- || Intent.ACTION_SENDTO.equals(mAction)
- || Intent.ACTION_SEND.equals(mAction)
- || Intent.ACTION_SEND_MULTIPLE.equals(mAction)) {
- initFromIntent(intent);
- setMessageChanged(true);
- setMessageLoaded(true);
- } else if (ACTION_REPLY.equals(mAction)
- || ACTION_REPLY_ALL.equals(mAction)
- || ACTION_FORWARD.equals(mAction)) {
- long sourceMessageId = getIntent().getLongExtra(EXTRA_MESSAGE_ID, Message.NOT_SAVED);
- loadSourceMessage(sourceMessageId, true);
-
- } else if (ACTION_EDIT_DRAFT.equals(mAction)) {
- // Assert getIntent.hasExtra(EXTRA_MESSAGE_ID)
- long draftId = getIntent().getLongExtra(EXTRA_MESSAGE_ID, Message.NOT_SAVED);
- resumeDraft(draftId, null, true /* restore views */);
-
- } else {
- // Normal compose flow for a new message.
- setAccount(intent);
- setInitialComposeText(null, getAccountSignature(mAccount));
- setMessageLoaded(true);
- }
- }
-
- @Override
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- // Temporarily disable onTextChanged listeners while restoring the fields
- removeListeners();
- super.onRestoreInstanceState(savedInstanceState);
- if (savedInstanceState.getBoolean(STATE_KEY_CC_SHOWN)) {
- showCcBccFields();
- }
- mQuotedTextArea.setVisibility(savedInstanceState.getBoolean(STATE_KEY_QUOTED_TEXT_SHOWN)
- ? View.VISIBLE : View.GONE);
- mQuotedText.setVisibility(savedInstanceState.getBoolean(STATE_KEY_QUOTED_TEXT_SHOWN)
- ? View.VISIBLE : View.GONE);
- addListeners();
- }
-
- // needed for unit tests
- @Override
- public void setIntent(Intent intent) {
- super.setIntent(intent);
- setAction(intent.getAction());
- }
-
- private void setQuickResponsesAvailable(boolean quickResponsesAvailable) {
- if (mQuickResponsesAvailable != quickResponsesAvailable) {
- mQuickResponsesAvailable = quickResponsesAvailable;
- invalidateOptionsMenu();
- }
- }
-
- /**
- * Given an accountId and context, finds if the database has any QuickResponse
- * entries and returns the result to the Callback.
- */
- private class QuickResponseChecker extends EmailAsyncTask<Void, Void, Boolean> {
- public QuickResponseChecker(EmailAsyncTask.Tracker tracker) {
- super(tracker);
- }
-
- @Override
- protected Boolean doInBackground(Void... params) {
- return EmailContent.count(MessageCompose.this, QuickResponse.CONTENT_URI,
- QuickResponseColumns.ACCOUNT_KEY + "=?",
- new String[] {Long.toString(mAccount.mId)}) > 0;
- }
-
- @Override
- protected void onSuccess(Boolean quickResponsesAvailable) {
- setQuickResponsesAvailable(quickResponsesAvailable);
- }
- }
-
- @Override
- public void onResume() {
- super.onResume();
-
- // Exit immediately if the accounts list has changed (e.g. externally deleted)
- if (Email.getNotifyUiAccountsChanged()) {
- Welcome.actionStart(this);
- finish();
- return;
- }
-
- // If activity paused and quick responses are removed/added, possibly update options menu
- if (mAccount != null) {
- new QuickResponseChecker(mTaskTracker).executeParallel((Void) null);
- }
- }
-
- @Override
- public void onPause() {
- super.onPause();
- saveIfNeeded();
- }
-
- /**
- * We override onDestroy to make sure that the WebView gets explicitly destroyed.
- * Otherwise it can leak native references.
- */
- @Override
- public void onDestroy() {
- super.onDestroy();
- mQuotedText.destroy();
- mQuotedText = null;
-
- mTaskTracker.cancellAllInterrupt();
-
- if (mAddressAdapterTo != null && mAddressAdapterTo instanceof EmailAddressAdapter) {
- ((EmailAddressAdapter) mAddressAdapterTo).close();
- }
- if (mAddressAdapterCc != null && mAddressAdapterCc instanceof EmailAddressAdapter) {
- ((EmailAddressAdapter) mAddressAdapterCc).close();
- }
- if (mAddressAdapterBcc != null && mAddressAdapterBcc instanceof EmailAddressAdapter) {
- ((EmailAddressAdapter) mAddressAdapterBcc).close();
- }
- }
-
- /**
- * The framework handles most of the fields, but we need to handle stuff that we
- * dynamically show and hide:
- * Cc field,
- * Bcc field,
- * Quoted text,
- */
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
-
- long draftId = mDraft.mId;
- if (draftId != Message.NOT_SAVED) {
- outState.putLong(STATE_KEY_DRAFT_ID, draftId);
- }
- outState.putBoolean(STATE_KEY_CC_SHOWN, mCcBccContainer.getVisibility() == View.VISIBLE);
- outState.putBoolean(STATE_KEY_QUOTED_TEXT_SHOWN,
- mQuotedTextArea.getVisibility() == View.VISIBLE);
- outState.putString(STATE_KEY_ACTION, mAction);
-
- // If there are any outstanding save requests, ensure that it's noted in case it hasn't
- // finished by the time the activity is restored.
- outState.putLong(STATE_KEY_LAST_SAVE_TASK_ID, mLastSaveTaskId);
- }
-
- @Override
- public void onBackPressed() {
- onBack(true /* systemKey */);
- }
-
- /**
- * Whether or not the current message being edited has a source message (i.e. is a reply,
- * or forward) that is loaded.
- */
- private boolean hasSourceMessage() {
- return mSource != null;
- }
-
- /**
- * @return true if the activity was opened by the email app itself.
- */
- private boolean isOpenedFromWithinApp() {
- Intent i = getIntent();
- return (i != null && i.getBooleanExtra(EXTRA_FROM_WITHIN_APP, false));
- }
-
- private boolean isOpenedFromWidget() {
- Intent i = getIntent();
- return (i != null && i.getBooleanExtra(EXTRA_FROM_WIDGET, false));
- }
-
- /**
- * Sets message as loaded and then initializes the TextWatchers.
- * @param isLoaded - value to which to set mMessageLoaded
- */
- private void setMessageLoaded(boolean isLoaded) {
- if (mMessageLoaded != isLoaded) {
- mMessageLoaded = isLoaded;
- addListeners();
- mInitiallyEmpty = areViewsEmpty();
- }
- }
-
- private void setMessageChanged(boolean messageChanged) {
- boolean needsSaving = messageChanged && !(mInitiallyEmpty && areViewsEmpty());
-
- if (mDraftNeedsSaving != needsSaving) {
- mDraftNeedsSaving = needsSaving;
- invalidateOptionsMenu();
- }
- }
-
- /**
- * @return whether or not all text fields are empty (i.e. the entire compose message is empty)
- */
- private boolean areViewsEmpty() {
- return (mToView.length() == 0)
- && (mCcView.length() == 0)
- && (mBccView.length() == 0)
- && (mSubjectView.length() == 0)
- && isBodyEmpty()
- && mAttachments.isEmpty();
- }
-
- private boolean isBodyEmpty() {
- return (mMessageContentView.length() == 0)
- || mMessageContentView.getText()
- .toString().equals("\n" + getAccountSignature(mAccount));
- }
-
- public void setFocusShifter(int fromViewId, final int targetViewId) {
- View label = findViewById(fromViewId); // xlarge only
- if (label != null) {
- final View target = UiUtilities.getView(this, targetViewId);
- label.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- target.requestFocus();
- }
- });
- }
- }
-
- /**
- * An {@link InputFilter} that implements special address cleanup rules.
- * The first space key entry following an "@" symbol that is followed by any combination
- * of letters and symbols, including one+ dots and zero commas, should insert an extra
- * comma (followed by the space).
- */
- @VisibleForTesting
- static final InputFilter RECIPIENT_FILTER = new InputFilter() {
- @Override
- public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
- int dstart, int dend) {
-
- // Quick check - did they enter a single space?
- if (end-start != 1 || source.charAt(start) != ' ') {
- return null;
- }
-
- // determine if the characters before the new space fit the pattern
- // follow backwards and see if we find a comma, dot, or @
- int scanBack = dstart;
- boolean dotFound = false;
- while (scanBack > 0) {
- char c = dest.charAt(--scanBack);
- switch (c) {
- case '.':
- dotFound = true; // one or more dots are req'd
- break;
- case ',':
- return null;
- case '@':
- if (!dotFound) {
- return null;
- }
-
- // we have found a comma-insert case. now just do it
- // in the least expensive way we can.
- if (source instanceof Spanned) {
- SpannableStringBuilder sb = new SpannableStringBuilder(",");
- sb.append(source);
- return sb;
- } else {
- return ", ";
- }
- default:
- // just keep going
- }
- }
-
- // no termination cases were found, so don't edit the input
- return null;
- }
- };
-
- private void initViews() {
- ViewGroup toParent = UiUtilities.getViewOrNull(this, R.id.to_content);
- if (toParent != null) {
- mToView = (MultiAutoCompleteTextView) toParent.findViewById(R.id.to);
- ViewGroup ccParent, bccParent;
- ccParent = (ViewGroup) findViewById(R.id.cc_content);
- mCcView = (MultiAutoCompleteTextView) ccParent.findViewById(R.id.cc);
- bccParent = (ViewGroup) findViewById(R.id.bcc_content);
- mBccView = (MultiAutoCompleteTextView) bccParent.findViewById(R.id.bcc);
- } else {
- mToView = UiUtilities.getView(this, R.id.to);
- mCcView = UiUtilities.getView(this, R.id.cc);
- mBccView = UiUtilities.getView(this, R.id.bcc);
- }
-
- mFromView = UiUtilities.getView(this, R.id.from);
- mCcBccContainer = UiUtilities.getView(this, R.id.cc_bcc_wrapper);
- mSubjectView = UiUtilities.getView(this, R.id.subject);
- mMessageContentView = UiUtilities.getView(this, R.id.body_text);
- mAttachmentContentView = UiUtilities.getView(this, R.id.attachments);
- mAttachmentContainer = UiUtilities.getView(this, R.id.attachment_container);
- mQuotedTextArea = UiUtilities.getView(this, R.id.quoted_text_area);
- mIncludeQuotedTextCheckBox = UiUtilities.getView(this, R.id.include_quoted_text);
- mQuotedText = UiUtilities.getView(this, R.id.quoted_text);
-
- InputFilter[] recipientFilters = new InputFilter[] { RECIPIENT_FILTER };
-
- // NOTE: assumes no other filters are set
- mToView.setFilters(recipientFilters);
- mCcView.setFilters(recipientFilters);
- mBccView.setFilters(recipientFilters);
-
- /*
- * We set this to invisible by default. Other methods will turn it back on if it's
- * needed.
- */
- mQuotedTextArea.setVisibility(View.GONE);
- setIncludeQuotedText(false, false);
-
- mIncludeQuotedTextCheckBox.setOnClickListener(this);
-
- EmailAddressValidator addressValidator = new EmailAddressValidator();
-
- setupAddressAdapters();
- mToView.setTokenizer(new Rfc822Tokenizer());
- mToView.setValidator(addressValidator);
-
- mCcView.setTokenizer(new Rfc822Tokenizer());
- mCcView.setValidator(addressValidator);
-
- mBccView.setTokenizer(new Rfc822Tokenizer());
- mBccView.setValidator(addressValidator);
-
- final View addCcBccView = UiUtilities.getViewOrNull(this, R.id.add_cc_bcc);
- if (addCcBccView != null) {
- // Tablet view.
- addCcBccView.setOnClickListener(this);
- }
-
- final View addAttachmentView = UiUtilities.getViewOrNull(this, R.id.add_attachment);
- if (addAttachmentView != null) {
- // Tablet view.
- addAttachmentView.setOnClickListener(this);
- }
-
- setFocusShifter(R.id.to_label, R.id.to);
- setFocusShifter(R.id.cc_label, R.id.cc);
- setFocusShifter(R.id.bcc_label, R.id.bcc);
- setFocusShifter(R.id.composearea_tap_trap_bottom, R.id.body_text);
-
- mMessageContentView.setOnFocusChangeListener(this);
-
- updateAttachmentContainer();
- mToView.requestFocus();
- }
-
- /**
- * Initializes listeners. Should only be called once initializing of views is complete to
- * avoid unnecessary draft saving.
- */
- private void addListeners() {
- mToView.addTextChangedListener(mWatcher);
- mCcView.addTextChangedListener(mWatcher);
- mBccView.addTextChangedListener(mWatcher);
- mSubjectView.addTextChangedListener(mWatcher);
- mMessageContentView.addTextChangedListener(mWatcher);
- }
-
- /**
- * Removes listeners from the user-editable fields. Can be used to temporarily disable them
- * while resetting fields (such as when changing from reply to reply all) to avoid
- * unnecessary saving.
- */
- private void removeListeners() {
- mToView.removeTextChangedListener(mWatcher);
- mCcView.removeTextChangedListener(mWatcher);
- mBccView.removeTextChangedListener(mWatcher);
- mSubjectView.removeTextChangedListener(mWatcher);
- mMessageContentView.removeTextChangedListener(mWatcher);
- }
-
- /**
- * Set up address auto-completion adapters.
- */
- private void setupAddressAdapters() {
- boolean supportsChips = ChipsUtil.supportsChipsUi();
-
- if (supportsChips && mToView instanceof RecipientEditTextView) {
- mAddressAdapterTo = new RecipientAdapter(this, (RecipientEditTextView) mToView);
- mToView.setAdapter((RecipientAdapter) mAddressAdapterTo);
- } else {
- mAddressAdapterTo = new EmailAddressAdapter(this);
- mToView.setAdapter((EmailAddressAdapter) mAddressAdapterTo);
- }
- if (supportsChips && mCcView instanceof RecipientEditTextView) {
- mAddressAdapterCc = new RecipientAdapter(this, (RecipientEditTextView) mCcView);
- mCcView.setAdapter((RecipientAdapter) mAddressAdapterCc);
- } else {
- mAddressAdapterCc = new EmailAddressAdapter(this);
- mCcView.setAdapter((EmailAddressAdapter) mAddressAdapterCc);
- }
- if (supportsChips && mBccView instanceof RecipientEditTextView) {
- mAddressAdapterBcc = new RecipientAdapter(this, (RecipientEditTextView) mBccView);
- mBccView.setAdapter((RecipientAdapter) mAddressAdapterBcc);
- } else {
- mAddressAdapterBcc = new EmailAddressAdapter(this);
- mBccView.setAdapter((EmailAddressAdapter) mAddressAdapterBcc);
- }
- }
-
- /**
- * Asynchronously loads a draft message for editing.
- * This may or may not restore the view contents, depending on whether or not callers want,
- * since in the case of screen rotation, those are restored automatically.
- */
- private void resumeDraft(
- long draftId,
- SendOrSaveMessageTask existingSaveTask,
- final boolean restoreViews) {
- // Note - this can be Message.NOT_SAVED if there is an existing save task in progress
- // for the draft we need to load.
- mDraft.mId = draftId;
-
- new LoadMessageTask(draftId, existingSaveTask, new OnMessageLoadHandler() {
- @Override
- public void onMessageLoaded(Message message, Body body) {
- message.mHtml = body.mHtmlContent;
- message.mText = body.mTextContent;
- message.mHtmlReply = body.mHtmlReply;
- message.mTextReply = body.mTextReply;
- message.mIntroText = body.mIntroText;
- message.mSourceKey = body.mSourceKey;
-
- mDraft = message;
- processDraftMessage(message, restoreViews);
-
- // Load attachments related to the draft.
- loadAttachments(message.mId, mAccount, new AttachmentLoadedCallback() {
- @Override
- public void onAttachmentLoaded(Attachment[] attachments) {
- for (Attachment attachment: attachments) {
- addAttachment(attachment);
- }
- }
- });
-
- // If we're resuming an edit of a reply, reply-all, or forward, re-load the
- // source message if available so that we get more information.
- if (message.mSourceKey != Message.NOT_SAVED) {
- loadSourceMessage(message.mSourceKey, false /* restore views */);
- }
- }
-
- @Override
- public void onLoadFailed() {
- Utility.showToast(MessageCompose.this, R.string.error_loading_message_body);
- finish();
- }
- }).executeSerial((Void[]) null);
- }
-
- @VisibleForTesting
- void processDraftMessage(Message message, boolean restoreViews) {
- if (restoreViews) {
- mSubjectView.setText(message.mSubject);
- addAddresses(mToView, Address.unpack(message.mTo));
- Address[] cc = Address.unpack(message.mCc);
- if (cc.length > 0) {
- addAddresses(mCcView, cc);
- }
- Address[] bcc = Address.unpack(message.mBcc);
- if (bcc.length > 0) {
- addAddresses(mBccView, bcc);
- }
-
- mMessageContentView.setText(message.mText);
-
- showCcBccFieldsIfFilled();
- setNewMessageFocus();
- }
- setMessageChanged(false);
-
- // The quoted text must always be restored.
- displayQuotedText(message.mTextReply, message.mHtmlReply);
- setIncludeQuotedText(
- (mDraft.mFlags & Message.FLAG_NOT_INCLUDE_QUOTED_TEXT) == 0, false);
- }
-
- /**
- * Asynchronously loads a source message (to be replied or forwarded in this current view),
- * populating text fields and quoted text fields when the load finishes, if requested.
- */
- private void loadSourceMessage(long sourceMessageId, final boolean restoreViews) {
- new LoadMessageTask(sourceMessageId, null, new OnMessageLoadHandler() {
- @Override
- public void onMessageLoaded(Message message, Body body) {
- message.mHtml = body.mHtmlContent;
- message.mText = body.mTextContent;
- message.mHtmlReply = null;
- message.mTextReply = null;
- message.mIntroText = null;
- mSource = message;
- mSourceAttachments = new ArrayList<Attachment>();
-
- if (restoreViews) {
- processSourceMessage(mSource, mAccount);
- setInitialComposeText(null, getAccountSignature(mAccount));
- }
-
- loadAttachments(message.mId, mAccount, new AttachmentLoadedCallback() {
- @Override
- public void onAttachmentLoaded(Attachment[] attachments) {
- final boolean supportsSmartForward =
- (mAccount.mFlags & Account.FLAGS_SUPPORTS_SMART_FORWARD) != 0;
-
- // Process the attachments to have the appropriate smart forward flags.
- for (Attachment attachment : attachments) {
- if (supportsSmartForward) {
- attachment.mFlags |= Attachment.FLAG_SMART_FORWARD;
- }
- mSourceAttachments.add(attachment);
- }
- if (isForward() && restoreViews) {
- if (processSourceMessageAttachments(
- mAttachments, mSourceAttachments, true)) {
- updateAttachmentUi();
- setMessageChanged(true);
- }
- }
- }
- });
-
- if (mAction.equals(ACTION_EDIT_DRAFT)) {
- // Resuming a draft may in fact be resuming a reply/reply all/forward.
- // Use a best guess and infer the action here.
- String inferredAction = inferAction();
- if (inferredAction != null) {
- setAction(inferredAction);
- // No need to update the action selector as switching actions should do it.
- return;
- }
- }
-
- updateActionSelector();
- }
-
- @Override
- public void onLoadFailed() {
- // The loading of the source message is only really required if it is needed
- // immediately to restore the view contents. In the case of resuming draft, it
- // is only needed to gather additional information.
- if (restoreViews) {
- Utility.showToast(MessageCompose.this, R.string.error_loading_message_body);
- finish();
- }
- }
- }).executeSerial((Void[]) null);
- }
-
- /**
- * Infers whether or not the current state of the message best reflects either a reply,
- * reply-all, or forward.
- */
- @VisibleForTesting
- String inferAction() {
- String subject = mSubjectView.getText().toString();
- if (subject == null) {
- return null;
- }
- if (subject.toLowerCase().startsWith("fwd:")) {
- return ACTION_FORWARD;
- } else if (subject.toLowerCase().startsWith("re:")) {
- int numRecipients = getAddresses(mToView).length
- + getAddresses(mCcView).length
- + getAddresses(mBccView).length;
- if (numRecipients > 1) {
- return ACTION_REPLY_ALL;
- } else {
- return ACTION_REPLY;
- }
- } else {
- // Unsure.
- return null;
- }
- }
-
- private interface OnMessageLoadHandler {
- /**
- * Handles a load to a message (e.g. a draft message or a source message).
- */
- void onMessageLoaded(Message message, Body body);
-
- /**
- * Handles a failure to load a message.
- */
- void onLoadFailed();
- }
-
- /**
- * Asynchronously loads a message and the account information.
- * This can be used to load a reference message (when replying) or when restoring a draft.
- */
- private class LoadMessageTask extends EmailAsyncTask<Void, Void, Object[]> {
- /**
- * The message ID to load, if available.
- */
- private long mMessageId;
-
- /**
- * A future-like reference to the save task which must complete prior to this load.
- */
- private final SendOrSaveMessageTask mSaveTask;
-
- /**
- * A callback to pass the results of the load to.
- */
- private final OnMessageLoadHandler mCallback;
-
- public LoadMessageTask(
- long messageId, SendOrSaveMessageTask saveTask, OnMessageLoadHandler callback) {
- super(mTaskTracker);
- mMessageId = messageId;
- mSaveTask = saveTask;
- mCallback = callback;
- }
-
- private long getIdToLoad() throws InterruptedException, ExecutionException {
- if (mMessageId == -1) {
- mMessageId = mSaveTask.get();
- }
- return mMessageId;
- }
-
- @Override
- protected Object[] doInBackground(Void... params) {
- long messageId;
- try {
- messageId = getIdToLoad();
- } catch (InterruptedException e) {
- // Don't have a good message ID to load - bail.
- Log.e(Logging.LOG_TAG,
- "Unable to load draft message since existing save task failed: " + e);
- return null;
- } catch (ExecutionException e) {
- // Don't have a good message ID to load - bail.
- Log.e(Logging.LOG_TAG,
- "Unable to load draft message since existing save task failed: " + e);
- return null;
- }
- Message message = Message.restoreMessageWithId(MessageCompose.this, messageId);
- if (message == null) {
- return null;
- }
- long accountId = message.mAccountKey;
- Account account = Account.restoreAccountWithId(MessageCompose.this, accountId);
- Body body;
- try {
- body = Body.restoreBodyWithMessageId(MessageCompose.this, message.mId);
- } catch (RuntimeException e) {
- Log.d(Logging.LOG_TAG, "Exception while loading message body: " + e);
- return null;
- }
- return new Object[] {message, body, account};
- }
-
- @Override
- protected void onSuccess(Object[] results) {
- if ((results == null) || (results.length != 3)) {
- mCallback.onLoadFailed();
- return;
- }
-
- final Message message = (Message) results[0];
- final Body body = (Body) results[1];
- final Account account = (Account) results[2];
- if ((message == null) || (body == null) || (account == null)) {
- mCallback.onLoadFailed();
- return;
- }
-
- setAccount(account);
- mCallback.onMessageLoaded(message, body);
- setMessageLoaded(true);
- }
- }
-
- private interface AttachmentLoadedCallback {
- /**
- * Handles completion of the loading of a set of attachments.
- * Callback will always happen on the main thread.
- */
- void onAttachmentLoaded(Attachment[] attachment);
- }
-
- private void loadAttachments(
- final long messageId,
- final Account account,
- final AttachmentLoadedCallback callback) {
- new EmailAsyncTask<Void, Void, Attachment[]>(mTaskTracker) {
- @Override
- protected Attachment[] doInBackground(Void... params) {
- return Attachment.restoreAttachmentsWithMessageId(MessageCompose.this, messageId);
- }
-
- @Override
- protected void onSuccess(Attachment[] attachments) {
- if (attachments == null) {
- attachments = new Attachment[0];
- }
- callback.onAttachmentLoaded(attachments);
- }
- }.executeSerial((Void[]) null);
- }
-
- @Override
- public void onFocusChange(View view, boolean focused) {
- if (focused) {
- switch (view.getId()) {
- case R.id.body_text:
- // When focusing on the message content via tabbing to it, or other means of
- // auto focusing, move the cursor to the end of the body (before the signature).
- if (mMessageContentView.getSelectionStart() == 0
- && mMessageContentView.getSelectionEnd() == 0) {
- // There is no way to determine if the focus change was programmatic or due
- // to keyboard event, or if it was due to a tap/restore. Use a best-guess
- // by using the fact that auto-focus/keyboard tabs set the selection to 0.
- setMessageContentSelection(getAccountSignature(mAccount));
- }
- }
- }
- }
-
- private static void addAddresses(MultiAutoCompleteTextView view, Address[] addresses) {
- if (addresses == null) {
- return;
- }
- for (Address address : addresses) {
- addAddress(view, address.toString());
- }
- }
-
- private static void addAddresses(MultiAutoCompleteTextView view, String[] addresses) {
- if (addresses == null) {
- return;
- }
- for (String oneAddress : addresses) {
- addAddress(view, oneAddress);
- }
- }
-
- private static void addAddresses(MultiAutoCompleteTextView view, String addresses) {
- if (addresses == null) {
- return;
- }
- Address[] unpackedAddresses = Address.unpack(addresses);
- for (Address address : unpackedAddresses) {
- addAddress(view, address.toString());
- }
- }
-
- private static void addAddress(MultiAutoCompleteTextView view, String address) {
- view.append(address + ", ");
- }
-
- private static String getPackedAddresses(TextView view) {
- Address[] addresses = Address.parse(view.getText().toString().trim());
- return Address.pack(addresses);
- }
-
- private static Address[] getAddresses(TextView view) {
- Address[] addresses = Address.parse(view.getText().toString().trim());
- return addresses;
- }
-
- /*
- * Computes a short string indicating the destination of the message based on To, Cc, Bcc.
- * If only one address appears, returns the friendly form of that address.
- * Otherwise returns the friendly form of the first address appended with "and N others".
- */
- private String makeDisplayName(String packedTo, String packedCc, String packedBcc) {
- Address first = null;
- int nRecipients = 0;
- for (String packed: new String[] {packedTo, packedCc, packedBcc}) {
- Address[] addresses = Address.unpack(packed);
- nRecipients += addresses.length;
- if (first == null && addresses.length > 0) {
- first = addresses[0];
- }
- }
- if (nRecipients == 0) {
- return "";
- }
- String friendly = first.toFriendly();
- if (nRecipients == 1) {
- return friendly;
- }
- return this.getString(R.string.message_compose_display_name, friendly, nRecipients - 1);
- }
-
- private ContentValues getUpdateContentValues(Message message) {
- ContentValues values = new ContentValues();
- values.put(MessageColumns.TIMESTAMP, message.mTimeStamp);
- values.put(MessageColumns.FROM_LIST, message.mFrom);
- values.put(MessageColumns.TO_LIST, message.mTo);
- values.put(MessageColumns.CC_LIST, message.mCc);
- values.put(MessageColumns.BCC_LIST, message.mBcc);
- values.put(MessageColumns.SUBJECT, message.mSubject);
- values.put(MessageColumns.DISPLAY_NAME, message.mDisplayName);
- values.put(MessageColumns.FLAG_READ, message.mFlagRead);
- values.put(MessageColumns.FLAG_LOADED, message.mFlagLoaded);
- values.put(MessageColumns.FLAG_ATTACHMENT, message.mFlagAttachment);
- values.put(MessageColumns.FLAGS, message.mFlags);
- return values;
- }
-
- /**
- * Updates the given message using values from the compose UI.
- *
- * @param message The message to be updated.
- * @param account the account (used to obtain From: address).
- * @param hasAttachments true if it has one or more attachment.
- * @param sending set true if the message is about to sent, in which case we perform final
- * clean up;
- */
- private void updateMessage(Message message, Account account, boolean hasAttachments,
- boolean sending) {
- if (message.mMessageId == null || message.mMessageId.length() == 0) {
- message.mMessageId = Utility.generateMessageId();
- }
- message.mTimeStamp = System.currentTimeMillis();
- message.mFrom = new Address(account.getEmailAddress(), account.getSenderName()).pack();
- message.mTo = getPackedAddresses(mToView);
- message.mCc = getPackedAddresses(mCcView);
- message.mBcc = getPackedAddresses(mBccView);
- message.mSubject = mSubjectView.getText().toString();
- message.mText = mMessageContentView.getText().toString();
- message.mAccountKey = account.mId;
- message.mDisplayName = makeDisplayName(message.mTo, message.mCc, message.mBcc);
- message.mFlagRead = true;
- message.mFlagLoaded = Message.FLAG_LOADED_COMPLETE;
- message.mFlagAttachment = hasAttachments;
- // Use the Intent to set flags saying this message is a reply or a forward and save the
- // unique id of the source message
- if (mSource != null && mQuotedTextArea.getVisibility() == View.VISIBLE) {
- message.mSourceKey = mSource.mId;
- // If the quote bar is visible; this must either be a reply or forward
- // Get the body of the source message here
- message.mHtmlReply = mSource.mHtml;
- message.mTextReply = mSource.mText;
- String fromAsString = Address.unpackToString(mSource.mFrom);
- if (isForward()) {
- message.mFlags |= Message.FLAG_TYPE_FORWARD;
- String subject = mSource.mSubject;
- String to = Address.unpackToString(mSource.mTo);
- String cc = Address.unpackToString(mSource.mCc);
- message.mIntroText =
- getString(R.string.message_compose_fwd_header_fmt, subject, fromAsString,
- to != null ? to : "", cc != null ? cc : "");
- } else {
- message.mFlags |= Message.FLAG_TYPE_REPLY;
- message.mIntroText =
- getString(R.string.message_compose_reply_header_fmt, fromAsString);
- }
- }
-
- if (includeQuotedText()) {
- message.mFlags &= ~Message.FLAG_NOT_INCLUDE_QUOTED_TEXT;
- } else {
- message.mFlags |= Message.FLAG_NOT_INCLUDE_QUOTED_TEXT;
- if (sending) {
- // If we are about to send a message, and not including the original message,
- // clear the related field.
- // We can't do this until the last minutes, so that the user can change their
- // mind later and want to include it again.
- mDraft.mIntroText = null;
- mDraft.mTextReply = null;
- mDraft.mHtmlReply = null;
-
- // Note that mSourceKey is not cleared out as this is still considered a
- // reply/forward.
- }
- }
- }
-
- private class SendOrSaveMessageTask extends EmailAsyncTask<Void, Void, Long> {
- private final boolean mSend;
- private final long mTaskId;
-
- /** A context that will survive even past activity destruction. */
- private final Context mContext;
-
- public SendOrSaveMessageTask(long taskId, boolean send) {
- super(null /* DO NOT cancel in onDestroy */);
- if (send && ActivityManager.isUserAMonkey()) {
- Log.d(Logging.LOG_TAG, "Inhibiting send while monkey is in charge.");
- send = false;
- }
- mTaskId = taskId;
- mSend = send;
- mContext = getApplicationContext();
-
- sActiveSaveTasks.put(mTaskId, this);
- }
-
- @Override
- protected Long doInBackground(Void... params) {
- synchronized (mDraft) {
- updateMessage(mDraft, mAccount, mAttachments.size() > 0, mSend);
- ContentResolver resolver = getContentResolver();
- if (mDraft.isSaved()) {
- // Update the message
- Uri draftUri =
- ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, mDraft.mId);
- resolver.update(draftUri, getUpdateContentValues(mDraft), null, null);
- // Update the body
- ContentValues values = new ContentValues();
- values.put(BodyColumns.TEXT_CONTENT, mDraft.mText);
- values.put(BodyColumns.TEXT_REPLY, mDraft.mTextReply);
- values.put(BodyColumns.HTML_REPLY, mDraft.mHtmlReply);
- values.put(BodyColumns.INTRO_TEXT, mDraft.mIntroText);
- values.put(BodyColumns.SOURCE_MESSAGE_KEY, mDraft.mSourceKey);
- Body.updateBodyWithMessageId(MessageCompose.this, mDraft.mId, values);
- } else {
- // mDraft.mId is set upon return of saveToMailbox()
- mController.saveToMailbox(mDraft, Mailbox.TYPE_DRAFTS);
- }
- // For any unloaded attachment, set the flag saying we need it loaded
- boolean hasUnloadedAttachments = false;
- for (Attachment attachment : mAttachments) {
- if (attachment.mContentUri == null &&
- ((attachment.mFlags & Attachment.FLAG_SMART_FORWARD) == 0)) {
- attachment.mFlags |= Attachment.FLAG_DOWNLOAD_FORWARD;
- hasUnloadedAttachments = true;
- if (Email.DEBUG) {
- Log.d(Logging.LOG_TAG,
- "Requesting download of attachment #" + attachment.mId);
- }
- }
- // Make sure the UI version of the attachment has the now-correct id; we will
- // use the id again when coming back from picking new attachments
- if (!attachment.isSaved()) {
- // this attachment is new so save it to DB.
- attachment.mMessageKey = mDraft.mId;
- attachment.save(MessageCompose.this);
- } else if (attachment.mMessageKey != mDraft.mId) {
- // We clone the attachment and save it again; otherwise, it will
- // continue to point to the source message. From this point forward,
- // the attachments will be independent of the original message in the
- // database; however, we still need the message on the server in order
- // to retrieve unloaded attachments
- attachment.mMessageKey = mDraft.mId;
- ContentValues cv = attachment.toContentValues();
- cv.put(Attachment.FLAGS, attachment.mFlags);
- cv.put(Attachment.MESSAGE_KEY, mDraft.mId);
- getContentResolver().insert(Attachment.CONTENT_URI, cv);
- }
- }
-
- if (mSend) {
- // Let the user know if message sending might be delayed by background
- // downlading of unloaded attachments
- if (hasUnloadedAttachments) {
- Utility.showToast(MessageCompose.this,
- R.string.message_view_attachment_background_load);
- }
- mController.sendMessage(mDraft);
-
- ArrayList<CharSequence> addressTexts = new ArrayList<CharSequence>();
- addressTexts.add(mToView.getText());
- addressTexts.add(mCcView.getText());
- addressTexts.add(mBccView.getText());
- DataUsageStatUpdater updater = new DataUsageStatUpdater(mContext);
- updater.updateWithRfc822Address(addressTexts);
- }
- return mDraft.mId;
- }
- }
-
- private boolean shouldShowSaveToast() {
- // Don't show the toast when rotating, or when opening an Activity on top of this one.
- return !isChangingConfigurations() && !mPickingAttachment;
- }
-
- @Override
- protected void onSuccess(Long draftId) {
- // Note that send or save tasks are always completed, even if the activity
- // finishes earlier.
- sActiveSaveTasks.remove(mTaskId);
- // Don't display the toast if the user is just changing the orientation
- if (!mSend && shouldShowSaveToast()) {
- Toast.makeText(mContext, R.string.message_saved_toast, Toast.LENGTH_LONG).show();
- }
- }
- }
-
- /**
- * Send or save a message:
- * - out of the UI thread
- * - write to Drafts
- * - if send, invoke Controller.sendMessage()
- * - when operation is complete, display toast
- */
- private void sendOrSaveMessage(boolean send) {
- if (!mMessageLoaded) {
- Log.w(Logging.LOG_TAG,
- "Attempted to save draft message prior to the state being fully loaded");
- return;
- }
- synchronized (sActiveSaveTasks) {
- mLastSaveTaskId = sNextSaveTaskId++;
-
- SendOrSaveMessageTask task = new SendOrSaveMessageTask(mLastSaveTaskId, send);
-
- // Ensure the tasks are executed serially so that rapid scheduling doesn't result
- // in inconsistent data.
- task.executeSerial();
- }
- }
-
- private void saveIfNeeded() {
- if (!mDraftNeedsSaving) {
- return;
- }
- setMessageChanged(false);
- sendOrSaveMessage(false);
- }
-
- /**
- * Checks whether all the email addresses listed in TO, CC, BCC are valid.
- */
- @VisibleForTesting
- boolean isAddressAllValid() {
- boolean supportsChips = ChipsUtil.supportsChipsUi();
- for (TextView view : new TextView[]{mToView, mCcView, mBccView}) {
- String addresses = view.getText().toString().trim();
- if (!Address.isAllValid(addresses)) {
- // Don't show an error message if we're using chips as the chips have
- // their own error state.
- if (!supportsChips || !(view instanceof RecipientEditTextView)) {
- view.setError(getString(R.string.message_compose_error_invalid_email));
- }
- return false;
- }
- }
- return true;
- }
-
- private void onSend() {
- if (!isAddressAllValid()) {
- Toast.makeText(this, getString(R.string.message_compose_error_invalid_email),
- Toast.LENGTH_LONG).show();
- } else if (getAddresses(mToView).length == 0 &&
- getAddresses(mCcView).length == 0 &&
- getAddresses(mBccView).length == 0) {
- mToView.setError(getString(R.string.message_compose_error_no_recipients));
- Toast.makeText(this, getString(R.string.message_compose_error_no_recipients),
- Toast.LENGTH_LONG).show();
- } else {
- sendOrSaveMessage(true);
- setMessageChanged(false);
- finish();
- }
- }
-
- private void showQuickResponseDialog() {
- if (mAccount == null) {
- // Load not finished, bail.
- return;
- }
- InsertQuickResponseDialog.newInstance(null, mAccount)
- .show(getFragmentManager(), null);
- }
-
- /**
- * Inserts the selected QuickResponse into the message body at the current cursor position.
- */
- @Override
- public void onQuickResponseSelected(CharSequence text) {
- int start = mMessageContentView.getSelectionStart();
- int end = mMessageContentView.getSelectionEnd();
- mMessageContentView.getEditableText().replace(start, end, text);
- }
-
- private void onDiscard() {
- DeleteMessageConfirmationDialog.newInstance(1, null).show(getFragmentManager(), "dialog");
- }
-
- /**
- * Called when ok on the "discard draft" dialog is pressed. Actually delete the draft.
- */
- @Override
- public void onDeleteMessageConfirmationDialogOkPressed() {
- if (mDraft.mId > 0) {
- // By the way, we can't pass the message ID from onDiscard() to here (using a
- // dialog argument or whatever), because you can rotate the screen when the dialog is
- // shown, and during rotation we save & restore the draft. If it's the
- // first save, we give it an ID at this point for the first time (and last time).
- // Which means it's possible for a draft to not have an ID in onDiscard(),
- // but here.
- mController.deleteMessage(mDraft.mId);
- }
- Utility.showToast(MessageCompose.this, R.string.message_discarded_toast);
- setMessageChanged(false);
- finish();
- }
-
- /**
- * Handles an explicit user-initiated action to save a draft.
- */
- private void onSave() {
- saveIfNeeded();
- }
-
- private void showCcBccFieldsIfFilled() {
- if ((mCcView.length() > 0) || (mBccView.length() > 0)) {
- showCcBccFields();
- }
- }
-
- private void showCcBccFields() {
- if (mCcBccContainer.getVisibility() != View.VISIBLE) {
- mCcBccContainer.setVisibility(View.VISIBLE);
- mCcView.requestFocus();
- UiUtilities.setVisibilitySafe(this, R.id.add_cc_bcc, View.INVISIBLE);
- invalidateOptionsMenu();
- }
- }
-
- /**
- * Kick off a picker for whatever kind of MIME types we'll accept and let Android take over.
- */
- private void onAddAttachment() {
- Intent i = new Intent(Intent.ACTION_GET_CONTENT);
- i.addCategory(Intent.CATEGORY_OPENABLE);
- i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
- i.setType(AttachmentUtilities.ACCEPTABLE_ATTACHMENT_SEND_UI_TYPES[0]);
- mPickingAttachment = true;
- startActivityForResult(
- Intent.createChooser(i, getString(R.string.choose_attachment_dialog_title)),
- ACTIVITY_REQUEST_PICK_ATTACHMENT);
- }
-
- private Attachment loadAttachmentInfo(Uri uri) {
- long size = -1;
- ContentResolver contentResolver = getContentResolver();
-
- // Load name & size independently, because not all providers support both
- final String name = Utility.getContentFileName(this, uri);
-
- Cursor metadataCursor = contentResolver.query(uri, ATTACHMENT_META_SIZE_PROJECTION,
- null, null, null);
- if (metadataCursor != null) {
- try {
- if (metadataCursor.moveToFirst()) {
- size = metadataCursor.getLong(ATTACHMENT_META_SIZE_COLUMN_SIZE);
- }
- } finally {
- metadataCursor.close();
- }
- }
-
- // When the size is not provided, we need to determine it locally.
- if (size < 0) {
- // if the URI is a file: URI, ask file system for its size
- if ("file".equalsIgnoreCase(uri.getScheme())) {
- String path = uri.getPath();
- if (path != null) {
- File file = new File(path);
- size = file.length(); // Returns 0 for file not found
- }
- }
-
- if (size <= 0) {
- // The size was not measurable; This attachment is not safe to use.
- // Quick hack to force a relevant error into the UI
- // TODO: A proper announcement of the problem
- size = AttachmentUtilities.MAX_ATTACHMENT_UPLOAD_SIZE + 1;
- }
- }
-
- Attachment attachment = new Attachment();
- attachment.mFileName = name;
- attachment.mContentUri = uri.toString();
- attachment.mSize = size;
- attachment.mMimeType = AttachmentUtilities.inferMimeTypeForUri(this, uri);
- return attachment;
- }
-
- private void addAttachment(Attachment attachment) {
- // Before attaching the attachment, make sure it meets any other pre-attach criteria
- if (attachment.mSize > AttachmentUtilities.MAX_ATTACHMENT_UPLOAD_SIZE) {
- Toast.makeText(this, R.string.message_compose_attachment_size, Toast.LENGTH_LONG)
- .show();
- return;
- }
-
- mAttachments.add(attachment);
- updateAttachmentUi();
- }
-
- private void updateAttachmentUi() {
- mAttachmentContentView.removeAllViews();
-
- for (Attachment attachment : mAttachments) {
- // Note: allowDelete is set in two cases:
- // 1. First time a message (w/ attachments) is forwarded,
- // where action == ACTION_FORWARD
- // 2. 1 -> Save -> Reopen
- // but FLAG_SMART_FORWARD is already set at 1.
- // Even if the account supports smart-forward, attachments added
- // manually are still removable.
- final boolean allowDelete = (attachment.mFlags & Attachment.FLAG_SMART_FORWARD) == 0;
-
- View view = getLayoutInflater().inflate(R.layout.attachment, mAttachmentContentView,
- false);
- TextView nameView = UiUtilities.getView(view, R.id.attachment_name);
- ImageView delete = UiUtilities.getView(view, R.id.remove_attachment);
- TextView sizeView = UiUtilities.getView(view, R.id.attachment_size);
-
- nameView.setText(attachment.mFileName);
- if (attachment.mSize > 0) {
- sizeView.setText(UiUtilities.formatSize(this, attachment.mSize));
- } else {
- sizeView.setVisibility(View.GONE);
- }
- if (allowDelete) {
- delete.setOnClickListener(this);
- delete.setTag(view);
- } else {
- delete.setVisibility(View.INVISIBLE);
- }
- view.setTag(attachment);
- mAttachmentContentView.addView(view);
- }
- updateAttachmentContainer();
- }
-
- private void updateAttachmentContainer() {
- mAttachmentContainer.setVisibility(mAttachmentContentView.getChildCount() == 0
- ? View.GONE : View.VISIBLE);
- }
-
- private void addAttachmentFromUri(Uri uri) {
- addAttachment(loadAttachmentInfo(uri));
- }
-
- /**
- * Same as {@link #addAttachmentFromUri}, but does the mime-type check against
- * {@link AttachmentUtilities#ACCEPTABLE_ATTACHMENT_SEND_INTENT_TYPES}.
- */
- private void addAttachmentFromSendIntent(Uri uri) {
- final Attachment attachment = loadAttachmentInfo(uri);
- final String mimeType = attachment.mMimeType;
- if (!TextUtils.isEmpty(mimeType) && MimeUtility.mimeTypeMatches(mimeType,
- AttachmentUtilities.ACCEPTABLE_ATTACHMENT_SEND_INTENT_TYPES)) {
- addAttachment(attachment);
- }
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- mPickingAttachment = false;
- if (data == null) {
- return;
- }
- addAttachmentFromUri(data.getData());
- setMessageChanged(true);
- }
-
- private boolean includeQuotedText() {
- return mIncludeQuotedTextCheckBox.isChecked();
- }
-
- public void onClick(View view) {
- if (handleCommand(view.getId())) {
- return;
- }
- switch (view.getId()) {
- case R.id.remove_attachment:
- onDeleteAttachmentIconClicked(view);
- break;
- }
- }
-
- private void setIncludeQuotedText(boolean include, boolean updateNeedsSaving) {
- mIncludeQuotedTextCheckBox.setChecked(include);
- mQuotedText.setVisibility(mIncludeQuotedTextCheckBox.isChecked()
- ? View.VISIBLE : View.GONE);
- if (updateNeedsSaving) {
- setMessageChanged(true);
- }
- }
-
- private void onDeleteAttachmentIconClicked(View delButtonView) {
- View attachmentView = (View) delButtonView.getTag();
- Attachment attachment = (Attachment) attachmentView.getTag();
- deleteAttachment(mAttachments, attachment);
- updateAttachmentUi();
- setMessageChanged(true);
- }
-
- /**
- * Removes an attachment from the current message.
- * If the attachment has previous been saved in the db (i.e. this is a draft message which
- * has previously been saved), then the draft is deleted from the db.
- *
- * This does not update the UI to remove the attachment view.
- * @param attachments the list of attachments to delete from. Injected for tests.
- * @param attachment the attachment to delete
- */
- private void deleteAttachment(List<Attachment> attachments, Attachment attachment) {
- attachments.remove(attachment);
- if ((attachment.mMessageKey == mDraft.mId) && attachment.isSaved()) {
- final long attachmentId = attachment.mId;
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- mController.deleteAttachment(attachmentId);
- }
- });
- }
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (handleCommand(item.getItemId())) {
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- private boolean handleCommand(int viewId) {
- switch (viewId) {
- case android.R.id.home:
- onBack(false /* systemKey */);
- return true;
- case R.id.send:
- onSend();
- return true;
- case R.id.save:
- onSave();
- return true;
- case R.id.show_quick_text_list_dialog:
- showQuickResponseDialog();
- return true;
- case R.id.discard:
- onDiscard();
- return true;
- case R.id.include_quoted_text:
- // The checkbox is already toggled at this point.
- setIncludeQuotedText(mIncludeQuotedTextCheckBox.isChecked(), true);
- return true;
- case R.id.add_cc_bcc:
- showCcBccFields();
- return true;
- case R.id.add_attachment:
- onAddAttachment();
- return true;
- case R.id.settings:
- AccountSettings.actionSettings(this, mAccount.mId);
- return true;
- }
- return false;
- }
-
- /**
- * Handle a tap to the system back key, or the "app up" button in the action bar.
- * @param systemKey whether or not the system key was pressed
- */
- private void onBack(boolean systemKey) {
- finish();
- if (isOpenedFromWithinApp()) {
- // If opened from within the app, we just close it.
- return;
- }
-
- if ((isOpenedFromWidget() || !systemKey) && (mAccount != null)) {
- // Otherwise, need to open the main screen for the appropriate account.
- // Note that mAccount should always be set by the time the action bar is set up.
- startActivity(Welcome.createOpenAccountInboxIntent(this, mAccount.mId));
- }
- }
-
- private void setAction(String action) {
- if (Objects.equal(action, mAction)) {
- return;
- }
-
- mAction = action;
- onActionChanged();
- }
-
- /**
- * Handles changing from reply/reply all/forward states. Note: this activity cannot transition
- * from a standard compose state to any of the other three states.
- */
- private void onActionChanged() {
- if (!hasSourceMessage()) {
- return;
- }
- // Temporarily remove listeners so that changing action does not invalidate and save message
- removeListeners();
-
- processSourceMessage(mSource, mAccount);
-
- // Note that the attachments might not be loaded yet, but this will safely noop
- // if that's the case, and the attachments will be processed when they load.
- if (processSourceMessageAttachments(mAttachments, mSourceAttachments, isForward())) {
- updateAttachmentUi();
- setMessageChanged(true);
- }
-
- updateActionSelector();
- addListeners();
- }
-
- /**
- * Updates UI components that allows the user to switch between reply/reply all/forward.
- */
- private void updateActionSelector() {
- ActionBar actionBar = getActionBar();
- if (shouldUseActionTabs()) {
- // Tab-based mode switching.
- if (actionBar.getTabCount() > 0) {
- selectActionTab(mAction);
- } else {
- createAndAddTab(R.string.reply_action, ACTION_REPLY);
- createAndAddTab(R.string.reply_all_action, ACTION_REPLY_ALL);
- createAndAddTab(R.string.forward_action, ACTION_FORWARD);
- }
-
- actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
- } else {
- // Spinner based mode switching.
- if (mActionSpinnerAdapter == null) {
- mActionSpinnerAdapter = new ActionSpinnerAdapter(this);
- actionBar.setListNavigationCallbacks(
- mActionSpinnerAdapter, ACTION_SPINNER_LISTENER);
- }
- actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
- actionBar.setSelectedNavigationItem(
- ActionSpinnerAdapter.getActionPosition(mAction));
- }
- actionBar.setDisplayShowTitleEnabled(false);
- }
-
- private final TabListener ACTION_TAB_LISTENER = new TabListener() {
- @Override public void onTabReselected(Tab tab, FragmentTransaction ft) {}
- @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) {}
-
- @Override
- public void onTabSelected(Tab tab, FragmentTransaction ft) {
- String action = (String) tab.getTag();
- setAction(action);
- }
- };
-
- private final OnNavigationListener ACTION_SPINNER_LISTENER = new OnNavigationListener() {
- @Override
- public boolean onNavigationItemSelected(int itemPosition, long itemId) {
- setAction(ActionSpinnerAdapter.getAction(itemPosition));
- return true;
- }
- };
-
- private static class ActionSpinnerAdapter extends ArrayAdapter<String> {
- public ActionSpinnerAdapter(final Context context) {
- super(context,
- android.R.layout.simple_spinner_dropdown_item,
- android.R.id.text1,
- Lists.newArrayList(ACTION_REPLY, ACTION_REPLY_ALL, ACTION_FORWARD));
- }
-
- @Override
- public View getDropDownView(int position, View convertView, ViewGroup parent) {
- View result = super.getDropDownView(position, convertView, parent);
- ((TextView) result.findViewById(android.R.id.text1)).setText(getDisplayValue(position));
- return result;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View result = super.getView(position, convertView, parent);
- ((TextView) result.findViewById(android.R.id.text1)).setText(getDisplayValue(position));
- return result;
- }
-
- private String getDisplayValue(int position) {
- switch (position) {
- case 0:
- return getContext().getString(R.string.reply_action);
- case 1:
- return getContext().getString(R.string.reply_all_action);
- case 2:
- return getContext().getString(R.string.forward_action);
- default:
- throw new IllegalArgumentException("Invalid action type for spinner");
- }
- }
-
- public static String getAction(int position) {
- switch (position) {
- case 0:
- return ACTION_REPLY;
- case 1:
- return ACTION_REPLY_ALL;
- case 2:
- return ACTION_FORWARD;
- default:
- throw new IllegalArgumentException("Invalid action type for spinner");
- }
- }
-
- public static int getActionPosition(String action) {
- if (ACTION_REPLY.equals(action)) {
- return 0;
- } else if (ACTION_REPLY_ALL.equals(action)) {
- return 1;
- } else if (ACTION_FORWARD.equals(action)) {
- return 2;
- }
- throw new IllegalArgumentException("Invalid action type for spinner");
- }
-
- }
-
- private Tab createAndAddTab(int labelResource, final String action) {
- ActionBar.Tab tab = getActionBar().newTab();
- boolean selected = mAction.equals(action);
- tab.setTag(action);
- tab.setText(getString(labelResource));
- tab.setTabListener(ACTION_TAB_LISTENER);
- getActionBar().addTab(tab, selected);
- return tab;
- }
-
- private void selectActionTab(final String action) {
- final ActionBar actionBar = getActionBar();
- for (int i = 0, n = actionBar.getTabCount(); i < n; i++) {
- ActionBar.Tab tab = actionBar.getTabAt(i);
- if (action.equals(tab.getTag())) {
- actionBar.selectTab(tab);
- return;
- }
- }
- }
-
- private boolean shouldUseActionTabs() {
- return getResources().getBoolean(R.bool.message_compose_action_tabs);
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- getMenuInflater().inflate(R.menu.message_compose_option, menu);
- return true;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- menu.findItem(R.id.save).setEnabled(mDraftNeedsSaving);
- MenuItem addCcBcc = menu.findItem(R.id.add_cc_bcc);
- if (addCcBcc != null) {
- // Only available on phones.
- addCcBcc.setVisible(
- (mCcBccContainer == null) || (mCcBccContainer.getVisibility() != View.VISIBLE));
- }
- MenuItem insertQuickResponse = menu.findItem(R.id.show_quick_text_list_dialog);
- insertQuickResponse.setVisible(mQuickResponsesAvailable);
- insertQuickResponse.setEnabled(mQuickResponsesAvailable);
- return true;
- }
-
- /**
- * Set a message body and a signature when the Activity is launched.
- *
- * @param text the message body
- */
- @VisibleForTesting
- void setInitialComposeText(CharSequence text, String signature) {
- mMessageContentView.setText("");
- int textLength = 0;
- if (text != null) {
- mMessageContentView.append(text);
- textLength = text.length();
- }
- if (!TextUtils.isEmpty(signature)) {
- if (textLength == 0 || text.charAt(textLength - 1) != '\n') {
- mMessageContentView.append("\n");
- }
- mMessageContentView.append(signature);
-
- // Reset cursor to right before the signature.
- mMessageContentView.setSelection(textLength);
- }
- }
-
- /**
- * Fill all the widgets with the content found in the Intent Extra, if any.
- *
- * Note that we don't actually check the intent action (typically VIEW, SENDTO, or SEND).
- * There is enough overlap in the definitions that it makes more sense to simply check for
- * all available data and use as much of it as possible.
- *
- * With one exception: EXTRA_STREAM is defined as only valid for ACTION_SEND.
- *
- * @param intent the launch intent
- */
- @VisibleForTesting
- void initFromIntent(Intent intent) {
-
- setAccount(intent);
-
- // First, add values stored in top-level extras
- String[] extraStrings = intent.getStringArrayExtra(Intent.EXTRA_EMAIL);
- if (extraStrings != null) {
- addAddresses(mToView, extraStrings);
- }
- extraStrings = intent.getStringArrayExtra(Intent.EXTRA_CC);
- if (extraStrings != null) {
- addAddresses(mCcView, extraStrings);
- }
- extraStrings = intent.getStringArrayExtra(Intent.EXTRA_BCC);
- if (extraStrings != null) {
- addAddresses(mBccView, extraStrings);
- }
- String extraString = intent.getStringExtra(Intent.EXTRA_SUBJECT);
- if (extraString != null) {
- mSubjectView.setText(extraString);
- }
-
- // Next, if we were invoked with a URI, try to interpret it
- // We'll take two courses here. If it's mailto:, there is a specific set of rules
- // that define various optional fields. However, for any other scheme, we'll simply
- // take the entire scheme-specific part and interpret it as a possible list of addresses.
- final Uri dataUri = intent.getData();
- if (dataUri != null) {
- if ("mailto".equals(dataUri.getScheme())) {
- initializeFromMailTo(dataUri.toString());
- } else {
- String toText = dataUri.getSchemeSpecificPart();
- if (toText != null) {
- addAddresses(mToView, toText.split(","));
- }
- }
- }
-
- // Next, fill in the plaintext (note, this will override mailto:?body=)
- CharSequence text = intent.getCharSequenceExtra(Intent.EXTRA_TEXT);
- setInitialComposeText(text, getAccountSignature(mAccount));
-
- // Next, convert EXTRA_STREAM into an attachment
- if (Intent.ACTION_SEND.equals(mAction) && intent.hasExtra(Intent.EXTRA_STREAM)) {
- Uri uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
- if (uri != null) {
- addAttachmentFromSendIntent(uri);
- }
- }
-
- if (Intent.ACTION_SEND_MULTIPLE.equals(mAction)
- && intent.hasExtra(Intent.EXTRA_STREAM)) {
- ArrayList<Parcelable> list = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
- if (list != null) {
- for (Parcelable parcelable : list) {
- Uri uri = (Uri) parcelable;
- if (uri != null) {
- addAttachmentFromSendIntent(uri);
- }
- }
- }
- }
-
- // Finally - expose fields that were filled in but are normally hidden, and set focus
- showCcBccFieldsIfFilled();
- setNewMessageFocus();
- }
-
- /**
- * When we are launched with an intent that includes a mailto: URI, we can actually
- * gather quite a few of our message fields from it.
- *
- * @param mailToString the href (which must start with "mailto:").
- */
- private void initializeFromMailTo(String mailToString) {
-
- // Chop up everything between mailto: and ? to find recipients
- int index = mailToString.indexOf("?");
- int length = "mailto".length() + 1;
- String to;
- try {
- // Extract the recipient after mailto:
- if (index == -1) {
- to = decode(mailToString.substring(length));
- } else {
- to = decode(mailToString.substring(length, index));
- }
- addAddresses(mToView, to.split(" ,"));
- } catch (UnsupportedEncodingException e) {
- Log.e(Logging.LOG_TAG, e.getMessage() + " while decoding '" + mailToString + "'");
- }
-
- // Extract the other parameters
-
- // We need to disguise this string as a URI in order to parse it
- Uri uri = Uri.parse("foo://" + mailToString);
-
- List<String> cc = uri.getQueryParameters("cc");
- addAddresses(mCcView, cc.toArray(new String[cc.size()]));
-
- List<String> otherTo = uri.getQueryParameters("to");
- addAddresses(mCcView, otherTo.toArray(new String[otherTo.size()]));
-
- List<String> bcc = uri.getQueryParameters("bcc");
- addAddresses(mBccView, bcc.toArray(new String[bcc.size()]));
-
- List<String> subject = uri.getQueryParameters("subject");
- if (subject.size() > 0) {
- mSubjectView.setText(subject.get(0));
- }
-
- List<String> body = uri.getQueryParameters("body");
- if (body.size() > 0) {
- setInitialComposeText(body.get(0), getAccountSignature(mAccount));
- }
- }
-
- private String decode(String s) throws UnsupportedEncodingException {
- return URLDecoder.decode(s, "UTF-8");
- }
-
- /**
- * Displays quoted text from the original email
- */
- private void displayQuotedText(String textBody, String htmlBody) {
- // Only use plain text if there is no HTML body
- boolean plainTextFlag = TextUtils.isEmpty(htmlBody);
- String text = plainTextFlag ? textBody : htmlBody;
- if (text != null) {
- text = plainTextFlag ? EmailHtmlUtil.escapeCharacterToDisplay(text) : text;
- // TODO: re-enable EmailHtmlUtil.resolveInlineImage() for HTML
- // EmailHtmlUtil.resolveInlineImage(getContentResolver(), mAccount,
- // text, message, 0);
- mQuotedTextArea.setVisibility(View.VISIBLE);
- if (mQuotedText != null) {
- mQuotedText.loadDataWithBaseURL("email://", text, "text/html", "utf-8", null);
- }
- }
- }
-
- /**
- * Given a packed address String, the address of our sending account, a view, and a list of
- * addressees already added to other addressing views, adds unique addressees that don't
- * match our address to the passed in view
- */
- private static boolean safeAddAddresses(String addrs, String ourAddress,
- MultiAutoCompleteTextView view, ArrayList<Address> addrList) {
- boolean added = false;
- for (Address address : Address.unpack(addrs)) {
- // Don't send to ourselves or already-included addresses
- if (!address.getAddress().equalsIgnoreCase(ourAddress) && !addrList.contains(address)) {
- addrList.add(address);
- addAddress(view, address.toString());
- added = true;
- }
- }
- return added;
- }
-
- /**
- * Set up the to and cc views properly for the "reply" and "replyAll" cases. What's important
- * is that we not 1) send to ourselves, and 2) duplicate addressees.
- * @param message the message we're replying to
- * @param account the account we're sending from
- * @param replyAll whether this is a replyAll (vs a reply)
- */
- @VisibleForTesting
- void setupAddressViews(Message message, Account account, boolean replyAll) {
- // Start clean.
- clearAddressViews();
-
- // If Reply-to: addresses are included, use those; otherwise, use the From: address.
- Address[] replyToAddresses = Address.unpack(message.mReplyTo);
- if (replyToAddresses.length == 0) {
- replyToAddresses = Address.unpack(message.mFrom);
- }
-
- // Check if ourAddress is one of the replyToAddresses to decide how to populate To: field
- String ourAddress = account.mEmailAddress;
- boolean containsOurAddress = false;
- for (Address address : replyToAddresses) {
- if (ourAddress.equalsIgnoreCase(address.getAddress())) {
- containsOurAddress = true;
- break;
- }
- }
-
- if (containsOurAddress) {
- addAddresses(mToView, message.mTo);
- } else {
- addAddresses(mToView, replyToAddresses);
- }
-
- if (replyAll) {
- // Keep a running list of addresses we're sending to
- ArrayList<Address> allAddresses = new ArrayList<Address>();
- for (Address address: replyToAddresses) {
- allAddresses.add(address);
- }
-
- if (!containsOurAddress) {
- safeAddAddresses(message.mTo, ourAddress, mCcView, allAddresses);
- }
-
- safeAddAddresses(message.mCc, ourAddress, mCcView, allAddresses);
- }
- showCcBccFieldsIfFilled();
- }
-
- private void clearAddressViews() {
- mToView.setText("");
- mCcView.setText("");
- mBccView.setText("");
- }
-
- /**
- * Pull out the parts of the now loaded source message and apply them to the new message
- * depending on the type of message being composed.
- */
- @VisibleForTesting
- void processSourceMessage(Message message, Account account) {
- String subject = message.mSubject;
- if (subject == null) {
- subject = "";
- }
- if (ACTION_REPLY.equals(mAction) || ACTION_REPLY_ALL.equals(mAction)) {
- setupAddressViews(message, account, ACTION_REPLY_ALL.equals(mAction));
- if (!subject.toLowerCase().startsWith("re:")) {
- mSubjectView.setText("Re: " + subject);
- } else {
- mSubjectView.setText(subject);
- }
- displayQuotedText(message.mText, message.mHtml);
- setIncludeQuotedText(true, false);
- } else if (ACTION_FORWARD.equals(mAction)) {
- clearAddressViews();
- mSubjectView.setText(!subject.toLowerCase().startsWith("fwd:")
- ? "Fwd: " + subject : subject);
- displayQuotedText(message.mText, message.mHtml);
- setIncludeQuotedText(true, false);
- } else {
- Log.w(Logging.LOG_TAG, "Unexpected action for a call to processSourceMessage "
- + mAction);
- }
- showCcBccFieldsIfFilled();
- setNewMessageFocus();
- }
-
- /**
- * Processes the source attachments and ensures they're either included or excluded from
- * a list of active attachments. This can be used to add attachments for a forwarded message, or
- * to remove them if going from a "Forward" to a "Reply"
- * Uniqueness is based on filename.
- *
- * @param current the list of active attachments on the current message. Injected for tests.
- * @param sourceAttachments the list of attachments related with the source message. Injected
- * for tests.
- * @param include whether or not the sourceMessages should be included or excluded from the
- * current list of active attachments
- * @return whether or not the current attachments were modified
- */
- @VisibleForTesting
- boolean processSourceMessageAttachments(
- List<Attachment> current, List<Attachment> sourceAttachments, boolean include) {
-
- // Build a map of filename to the active attachments.
- HashMap<String, Attachment> currentNames = new HashMap<String, Attachment>();
- for (Attachment attachment : current) {
- currentNames.put(attachment.mFileName, attachment);
- }
-
- boolean dirty = false;
- if (include) {
- // Needs to make sure it's in the list.
- for (Attachment attachment : sourceAttachments) {
- if (!currentNames.containsKey(attachment.mFileName)) {
- current.add(attachment);
- dirty = true;
- }
- }
- } else {
- // Need to remove the source attachments.
- HashSet<String> sourceNames = new HashSet<String>();
- for (Attachment attachment : sourceAttachments) {
- if (currentNames.containsKey(attachment.mFileName)) {
- deleteAttachment(current, currentNames.get(attachment.mFileName));
- dirty = true;
- }
- }
- }
-
- return dirty;
- }
-
- /**
- * Set a cursor to the end of a body except a signature.
- */
- @VisibleForTesting
- void setMessageContentSelection(String signature) {
- int selection = mMessageContentView.length();
- if (!TextUtils.isEmpty(signature)) {
- int signatureLength = signature.length();
- int estimatedSelection = selection - signatureLength;
- if (estimatedSelection >= 0) {
- CharSequence text = mMessageContentView.getText();
- int i = 0;
- while (i < signatureLength
- && text.charAt(estimatedSelection + i) == signature.charAt(i)) {
- ++i;
- }
- if (i == signatureLength) {
- selection = estimatedSelection;
- while (selection > 0 && text.charAt(selection - 1) == '\n') {
- --selection;
- }
- }
- }
- }
- mMessageContentView.setSelection(selection, selection);
- }
-
- /**
- * In order to accelerate typing, position the cursor in the first empty field,
- * or at the end of the body composition field if none are empty. Typically, this will
- * play out as follows:
- * Reply / Reply All - put cursor in the empty message body
- * Forward - put cursor in the empty To field
- * Edit Draft - put cursor in whatever field still needs entry
- */
- private void setNewMessageFocus() {
- if (mToView.length() == 0) {
- mToView.requestFocus();
- } else if (mSubjectView.length() == 0) {
- mSubjectView.requestFocus();
- } else {
- mMessageContentView.requestFocus();
- }
- }
-
- private boolean isForward() {
- return ACTION_FORWARD.equals(mAction);
- }
-
- /**
- * @return the signature for the specified account, if non-null. If the account specified is
- * null or has no signature, {@code null} is returned.
- */
- private static String getAccountSignature(Account account) {
- return (account == null) ? null : account.mSignature;
- }
-}
diff --git a/src/com/android/email/activity/MessageFileView.java b/src/com/android/email/activity/MessageFileView.java
deleted file mode 100644
index c648218c0..000000000
--- a/src/com/android/email/activity/MessageFileView.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import com.android.email.R;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-import android.app.ActionBar;
-import android.app.Activity;
-import android.net.Uri;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.MenuItem;
-
-/**
- * Activity to show file-based messages. (i.e. *.eml files, and possibly *.msg files).
- */
-public class MessageFileView extends Activity implements MessageViewFragmentBase.Callback {
- private ActionBar mActionBar;
-
- private MessageFileViewFragment mFragment;
-
- private final EmailAsyncTask.Tracker mTaskTracker = new EmailAsyncTask.Tracker();
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- ActivityHelper.debugSetWindowFlags(this);
- setContentView(R.layout.message_file_view);
-
- mActionBar = getActionBar();
- mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP
- | ActionBar.DISPLAY_SHOW_TITLE);
-
- mFragment = (MessageFileViewFragment) getFragmentManager().findFragmentById(
- R.id.message_file_view_fragment);
- mFragment.setCallback(this);
-
- final Uri fileEmailUri = getIntent().getData();
- if (fileEmailUri == null) {
- Log.w(Logging.LOG_TAG, "Insufficient intent parameter. Closing...");
- finish();
- return;
- }
-
- mFragment.setFileUri(fileEmailUri);
-
- // Set title.
- new LoadFilenameTask(fileEmailUri).executeParallel();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- mTaskTracker.cancellAllInterrupt();
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- onBackPressed(); // Treat as "back".
- return true;
- }
-
- return super.onOptionsItemSelected(item);
- }
-
- /**
- * Set the activity title. ("Viewing FILENAME")
- */
- private void setTitle(String filename) {
- mActionBar.setTitle(getString(R.string.eml_view_title, filename));
- }
-
- /**
- * Load the filename of the EML, and update the activity title.
- */
- private class LoadFilenameTask extends EmailAsyncTask<Void, Void, String> {
- private final Uri mContentUri;
-
- public LoadFilenameTask(Uri contentUri) {
- super(mTaskTracker);
- mContentUri = contentUri;
- }
-
- @Override
- protected String doInBackground(Void... params) {
- return Utility.getContentFileName(MessageFileView.this, mContentUri);
- }
-
- @Override
- protected void onSuccess(String filename) {
- if (filename == null) {
- return;
- }
- setTitle(filename);
- }
- }
-
- @Override
- public boolean onUrlInMessageClicked(String url) {
- // EML files don't have the "owner" account, so use the default account as the sender.
- return ActivityHelper.openUrlInMessage(this, url, Account.NO_ACCOUNT);
- }
-
- @Override
- public void onMessageNotExists() { // Probably meessage deleted.
- finish();
- }
-
- @Override
- public void onLoadMessageStarted() {
- // Not important for EMLs
- }
-
- @Override
- public void onLoadMessageFinished() {
- // Not important for EMLs
- }
-
- @Override
- public void onLoadMessageError(String errorMessage) {
- // Not important for EMLs
- }
-
- @VisibleForTesting
- MessageFileViewFragment getFragment() {
- return mFragment;
- }
-}
diff --git a/src/com/android/email/activity/MessageFileViewFragment.java b/src/com/android/email/activity/MessageFileViewFragment.java
deleted file mode 100644
index 55a6cf54f..000000000
--- a/src/com/android/email/activity/MessageFileViewFragment.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.net.Uri;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.email.Email;
-import com.android.email.R;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.utility.Utility;
-
-/**
- * A {@link MessageViewFragmentBase} subclass for file based messages. (aka EML files)
- */
-public class MessageFileViewFragment extends MessageViewFragmentBase {
- /**
- * URI of message to open.
- */
- private Uri mFileEmailUri;
-
- /**
- * # of instances of this class. When it gets 0, and the last one is not destroying for
- * a config change, we delete all the EML files.
- */
- private static int sFragmentCount;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- sFragmentCount++;
- }
-
- @Override
- public View onCreateView(
- LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View result = super.onCreateView(inflater, container, savedInstanceState);
-
- // Actions are not available in this view.
- UiUtilities.setVisibilitySafe(result, R.id.favorite, View.GONE);
- UiUtilities.setVisibilitySafe(result, R.id.reply, View.GONE);
- UiUtilities.setVisibilitySafe(result, R.id.reply_all, View.GONE);
- UiUtilities.setVisibilitySafe(result, R.id.forward, View.GONE);
- UiUtilities.setVisibilitySafe(result, R.id.more, View.GONE);
-
- return result;
- }
-
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- if (mFileEmailUri == null) { // sanity check. setFileUri() must have been called.
- throw new IllegalStateException();
- }
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
-
- // If this is the last fragment of its kind, delete any/all attachment messages
- sFragmentCount--;
- if ((sFragmentCount == 0) && !getActivity().isChangingConfigurations()) {
- getController().deleteAttachmentMessages();
- }
- }
-
- /**
- * Called by the host activity to set the URL to the EML file to open.
- * Must be called before {@link #onActivityCreated(Bundle)}.
- *
- * Note: We don't use the fragment transaction for this fragment, so we can't use
- * {@link #getArguments()} to pass arguments.
- */
- public void setFileUri(Uri fileEmailUri) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " openMessage");
- }
- if (mFileEmailUri != null) {
- throw new IllegalStateException();
- }
- if (fileEmailUri == null) {
- throw new IllegalArgumentException();
- }
- mFileEmailUri = fileEmailUri;
- }
-
- /**
- * NOTE See the comment on the super method. It's called on a worker thread.
- */
- @Override
- protected Message openMessageSync(Activity activity) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " openMessageSync");
- }
- // Put up a toast; this can take a little while...
- Utility.showToast(activity, R.string.message_view_parse_message_toast);
- Message msg = getController().loadMessageFromUri(mFileEmailUri);
- if (msg == null) {
- // Indicate that the EML couldn't be loaded
- Utility.showToast(activity, R.string.message_view_display_attachment_toast);
- return null;
- }
- return msg;
- }
-
- @Override
- protected Message reloadMessageSync(Activity activity) {
- // EML files will never change, so just return the same copy.
- return getMessage();
- }
-
- /**
- * {@inheritDoc}
- *
- * Does exactly same as the super class method, but does an extra sanity check.
- */
- @Override
- protected void reloadUiFromMessage(Message message, boolean okToFetch) {
- // EML file should never be partially loaded.
- if (message.mFlagLoaded != Message.FLAG_LOADED_COMPLETE) {
- throw new IllegalStateException();
- }
- super.reloadUiFromMessage(message, okToFetch);
- }
-}
diff --git a/src/com/android/email/activity/MessageList.java b/src/com/android/email/activity/MessageList.java
deleted file mode 100644
index 6cbea98c9..000000000
--- a/src/com/android/email/activity/MessageList.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import com.android.email.R;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-
-/**
- * A dummy activity to support old-style (pre-honeycomb) account shortcuts.
- */
-public class MessageList extends Activity {
- @VisibleForTesting
- static final String EXTRA_ACCOUNT_ID = "com.android.email.activity._ACCOUNT_ID";
-
- private final EmailAsyncTask.Tracker mTaskTracker = new EmailAsyncTask.Tracker();
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- final Activity me = this;
- new EmailAsyncTask<Void, Void, Long>(mTaskTracker) {
- @Override
- protected Long doInBackground(Void... params) {
- return getAccountFromIntent(me, getIntent());
- }
-
- @Override
- protected void onSuccess(Long accountId) {
- if ((accountId == null) || (accountId == Account.NO_ACCOUNT)) {
- // Account deleted?
- Utility.showToast(me, R.string.toast_account_not_found);
- Welcome.actionStart(me);
- } else {
- Welcome.actionOpenAccountInbox(me, accountId);
- }
- finish();
- }
- }.executeParallel();
- }
-
- @Override
- protected void onDestroy() {
- mTaskTracker.cancellAllInterrupt();
- super.onDestroy();
- }
-
- @VisibleForTesting
- static long getAccountFromIntent(Context context, Intent i) {
- final Uri uri = i.getData();
- if (uri == null) {
- return Account.NO_ACCOUNT;
- }
- return Account.getAccountIdFromShortcutSafeUri(context, uri);
- }
-
- /**
- * Create a froyo/gingerbread style account shortcut intent. Used by unit tests and
- * test code in {@link ShortcutPicker}.
- */
- @VisibleForTesting
- static Intent createFroyoIntent(Context context, Account account) {
- final Intent intent = new Intent(context, MessageList.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- intent.putExtra(EXTRA_ACCOUNT_ID, account.mId);
- intent.setData(account.getShortcutSafeUri());
-
- return intent;
- }
-}
diff --git a/src/com/android/email/activity/MessageListFragment.java b/src/com/android/email/activity/MessageListFragment.java
deleted file mode 100644
index 8ece5ed60..000000000
--- a/src/com/android/email/activity/MessageListFragment.java
+++ /dev/null
@@ -1,1574 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.app.ListFragment;
-import android.app.LoaderManager;
-import android.content.ClipData;
-import android.content.ContentUris;
-import android.content.Context;
-import android.content.Loader;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.graphics.Canvas;
-import android.graphics.Point;
-import android.graphics.PointF;
-import android.graphics.Rect;
-import android.graphics.Typeface;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.text.TextPaint;
-import android.util.Log;
-import android.view.ActionMode;
-import android.view.DragEvent;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.DragShadowBuilder;
-import android.view.View.OnDragListener;
-import android.view.View.OnTouchListener;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemLongClickListener;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.android.email.Controller;
-import com.android.email.Email;
-import com.android.email.MessageListContext;
-import com.android.email.NotificationController;
-import com.android.email.R;
-import com.android.email.RefreshManager;
-import com.android.email.activity.MessagesAdapter.SearchResultsCursor;
-import com.android.email.provider.EmailProvider;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.Maps;
-
-import java.util.HashMap;
-import java.util.Set;
-
-/**
- * Message list.
- *
- * See the class javadoc for {@link MailboxListFragment} for notes on {@link #getListView()} and
- * {@link #isViewCreated()}.
- */
-public class MessageListFragment extends ListFragment
- implements OnItemLongClickListener, MessagesAdapter.Callback,
- MoveMessageToDialog.Callback, OnDragListener, OnTouchListener {
- private static final String BUNDLE_LIST_STATE = "MessageListFragment.state.listState";
- private static final String BUNDLE_KEY_SELECTED_MESSAGE_ID
- = "messageListFragment.state.listState.selected_message_id";
-
- private static final int LOADER_ID_MESSAGES_LOADER = 1;
-
- /** Argument name(s) */
- private static final String ARG_LIST_CONTEXT = "listContext";
-
- // Controller access
- private Controller mController;
- private RefreshManager mRefreshManager;
- private final RefreshListener mRefreshListener = new RefreshListener();
-
- // UI Support
- private Activity mActivity;
- private Callback mCallback = EmptyCallback.INSTANCE;
- private boolean mIsViewCreated;
-
- private View mListPanel;
- private View mListFooterView;
- private TextView mListFooterText;
- private View mListFooterProgress;
- private ViewGroup mSearchHeader;
- private ViewGroup mWarningContainer;
- private TextView mSearchHeaderText;
- private TextView mSearchHeaderCount;
-
- private static final int LIST_FOOTER_MODE_NONE = 0;
- private static final int LIST_FOOTER_MODE_MORE = 1;
- private int mListFooterMode;
-
- private MessagesAdapter mListAdapter;
- private boolean mIsFirstLoad;
-
- /** ID of the message to hightlight. */
- private long mSelectedMessageId = -1;
-
- private Account mAccount;
- private Mailbox mMailbox;
- /** The original mailbox being searched, if this list is showing search results. */
- private Mailbox mSearchedMailbox;
- private boolean mIsEasAccount;
- private boolean mIsRefreshable;
- private int mCountTotalAccounts;
-
- // Misc members
-
- private boolean mShowSendCommand;
- private boolean mShowMoveCommand;
-
- /**
- * If true, we disable the CAB even if there are selected messages.
- * It's used in portrait on the tablet when the message view becomes visible and the message
- * list gets pushed out of the screen, in which case we want to keep the selection but the CAB
- * should be gone.
- */
- private boolean mDisableCab;
-
- /** true between {@link #onResume} and {@link #onPause}. */
- private boolean mResumed;
-
- /**
- * {@link ActionMode} shown when 1 or more message is selected.
- */
- private ActionMode mSelectionMode;
- private SelectionModeCallback mLastSelectionModeCallback;
-
- private Parcelable mSavedListState;
-
- private final EmailAsyncTask.Tracker mTaskTracker = new EmailAsyncTask.Tracker();
-
- /**
- * Callback interface that owning activities must implement
- */
- public interface Callback {
- public static final int TYPE_REGULAR = 0;
- public static final int TYPE_DRAFT = 1;
- public static final int TYPE_TRASH = 2;
-
- /**
- * Called when the specified mailbox does not exist.
- */
- public void onMailboxNotFound(boolean firstLoad);
-
- /**
- * Called when the user wants to open a message.
- * Note {@code mailboxId} is of the actual mailbox of the message, which is different from
- * {@link MessageListFragment#getMailboxId} if it's magic mailboxes.
- *
- * @param messageId the message ID of the message
- * @param messageMailboxId the mailbox ID of the message.
- * This will never take values like {@link Mailbox#QUERY_ALL_INBOXES}.
- * @param listMailboxId the mailbox ID of the listbox shown on this fragment.
- * This can be that of a magic mailbox, e.g. {@link Mailbox#QUERY_ALL_INBOXES}.
- * @param type {@link #TYPE_REGULAR}, {@link #TYPE_DRAFT} or {@link #TYPE_TRASH}.
- */
- public void onMessageOpen(long messageId, long messageMailboxId, long listMailboxId,
- int type);
-
- /**
- * Called when an operation is initiated that can potentially advance the current
- * message selection (e.g. a delete operation may advance the selection).
- * @param affectedMessages the messages the operation will apply to
- */
- public void onAdvancingOpAccepted(Set<Long> affectedMessages);
-
- /**
- * Called when a drag & drop is initiated.
- *
- * @return true if drag & drop is allowed
- */
- public boolean onDragStarted();
-
- /**
- * Called when a drag & drop is ended.
- */
- public void onDragEnded();
- }
-
- private static final class EmptyCallback implements Callback {
- public static final Callback INSTANCE = new EmptyCallback();
-
- @Override
- public void onMailboxNotFound(boolean isFirstLoad) {
- }
-
- @Override
- public void onMessageOpen(
- long messageId, long messageMailboxId, long listMailboxId, int type) {
- }
-
- @Override
- public void onAdvancingOpAccepted(Set<Long> affectedMessages) {
- }
-
- @Override
- public boolean onDragStarted() {
- return false; // We don't know -- err on the safe side.
- }
-
- @Override
- public void onDragEnded() {
- }
- }
-
- /**
- * Create a new instance with initialization parameters.
- *
- * This fragment should be created only with this method. (Arguments should always be set.)
- *
- * @param listContext The list context to show messages for
- */
- public static MessageListFragment newInstance(MessageListContext listContext) {
- final MessageListFragment instance = new MessageListFragment();
- final Bundle args = new Bundle();
- args.putParcelable(ARG_LIST_CONTEXT, listContext);
- instance.setArguments(args);
- return instance;
- }
-
- /**
- * The context describing the contents to be shown in the list.
- * Do not use directly; instead, use the getters such as {@link #getAccountId()}.
- * <p><em>NOTE:</em> Although we cannot force these to be immutable using Java language
- * constructs, this <em>must</em> be considered immutable.
- */
- private MessageListContext mListContext;
-
- private void initializeArgCache() {
- if (mListContext != null) return;
- mListContext = getArguments().getParcelable(ARG_LIST_CONTEXT);
- }
-
- /**
- * @return the account ID passed to {@link #newInstance}. Safe to call even before onCreate.
- *
- * NOTE it may return {@link Account#ACCOUNT_ID_COMBINED_VIEW}.
- */
- public long getAccountId() {
- initializeArgCache();
- return mListContext.mAccountId;
- }
-
- /**
- * @return the mailbox ID passed to {@link #newInstance}. Safe to call even before onCreate.
- */
- public long getMailboxId() {
- initializeArgCache();
- return mListContext.getMailboxId();
- }
-
- /**
- * @return true if the mailbox is a combined mailbox. Safe to call even before onCreate.
- */
- public boolean isCombinedMailbox() {
- return getAccountId() == Account.ACCOUNT_ID_COMBINED_VIEW;
- }
-
- public MessageListContext getListContext() {
- initializeArgCache();
- return mListContext;
- }
-
- /**
- * @return Whether or not initial data is loaded in this list.
- */
- public boolean hasDataLoaded() {
- return mCountTotalAccounts > 0;
- }
-
- /**
- * @return The account object, when known. Null if not yet known.
- */
- public Account getAccount() {
- return mAccount;
- }
-
- /**
- * @return The mailbox where the messages belong in, when known. Null if not yet known.
- */
- public Mailbox getMailbox() {
- return mMailbox;
- }
-
- /**
- * @return Whether or not this message list is showing a user's inbox.
- * Note that combined inbox view is treated as an inbox view.
- */
- public boolean isInboxList() {
- MessageListContext listContext = getListContext();
- long accountId = listContext.mAccountId;
- if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- return listContext.getMailboxId() == Mailbox.QUERY_ALL_INBOXES;
- }
-
- if (!hasDataLoaded()) {
- // If the data hasn't finished loading, we don't have the full mailbox - infer from ID.
- long inboxId = Mailbox.findMailboxOfType(mActivity, accountId, Mailbox.TYPE_INBOX);
- return listContext.getMailboxId() == inboxId;
- }
- return (mMailbox != null) && (mMailbox.mType == Mailbox.TYPE_INBOX);
- }
-
- /**
- * @return The mailbox being searched, when known. Null if not yet known or if not a search
- * result.
- */
- public Mailbox getSearchedMailbox() {
- return mSearchedMailbox;
- }
-
- @Override
- public void onAttach(Activity activity) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onAttach");
- }
- super.onAttach(activity);
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onCreate");
- }
- super.onCreate(savedInstanceState);
-
- mActivity = getActivity();
- setHasOptionsMenu(true);
- mController = Controller.getInstance(mActivity);
- mRefreshManager = RefreshManager.getInstance(mActivity);
-
- mListAdapter = new MessagesAdapter(mActivity, this);
- mIsFirstLoad = true;
- }
-
- @Override
- public View onCreateView(
- LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onCreateView");
- }
- // Use a custom layout, which includes the original layout with "send messages" panel.
- View root = inflater.inflate(R.layout.message_list_fragment,null);
- mIsViewCreated = true;
- mListPanel = UiUtilities.getView(root, R.id.list_panel);
- return root;
- }
-
- public void setLayout(ThreePaneLayout layout) {
- if (UiUtilities.useTwoPane(mActivity)) {
- mListAdapter.setLayout(layout);
- }
- }
-
- private void initSearchHeader() {
- if (mSearchHeader == null) {
- ViewGroup root = (ViewGroup) getView();
- mSearchHeader = (ViewGroup) LayoutInflater.from(mActivity).inflate(
- R.layout.message_list_search_header, root, false);
- mSearchHeaderText = UiUtilities.getView(mSearchHeader, R.id.search_header_text);
- mSearchHeaderCount = UiUtilities.getView(mSearchHeader, R.id.search_count);
-
- // Add above the actual list.
- root.addView(mSearchHeader, 0);
- }
- }
-
- /**
- * @return true if the content view is created and not destroyed yet. (i.e. between
- * {@link #onCreateView} and {@link #onDestroyView}.
- */
- private boolean isViewCreated() {
- // Note that we don't use "getView() != null". This method is used in updateSelectionMode()
- // to determine if CAB shold be shown. But because it's called from onDestroyView(), at
- // this point the fragment still has views but we want to hide CAB, we can't use
- // getView() here.
- return mIsViewCreated;
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onActivityCreated");
- }
- super.onActivityCreated(savedInstanceState);
-
- final ListView lv = getListView();
- lv.setOnItemLongClickListener(this);
- lv.setOnTouchListener(this);
- lv.setItemsCanFocus(false);
- lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
-
- mListFooterView = getActivity().getLayoutInflater().inflate(
- R.layout.message_list_item_footer, lv, false);
- setEmptyText(getString(R.string.message_list_no_messages));
-
- if (savedInstanceState != null) {
- // Fragment doesn't have this method. Call it manually.
- restoreInstanceState(savedInstanceState);
- }
-
- startLoading();
-
- UiUtilities.installFragment(this);
- }
-
- @Override
- public void onStart() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onStart");
- }
- super.onStart();
- }
-
- @Override
- public void onResume() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onResume");
- }
- super.onResume();
- adjustMessageNotification(false);
- mRefreshManager.registerListener(mRefreshListener);
- mResumed = true;
- }
-
- @Override
- public void onPause() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onPause");
- }
- mResumed = false;
- mSavedListState = getListView().onSaveInstanceState();
- adjustMessageNotification(true);
- super.onPause();
- }
-
- @Override
- public void onStop() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onStop");
- }
- mTaskTracker.cancellAllInterrupt();
- mRefreshManager.unregisterListener(mRefreshListener);
-
- super.onStop();
- }
-
- @Override
- public void onDestroyView() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onDestroyView");
- }
- mIsViewCreated = false; // Clear this first for updateSelectionMode(). See isViewCreated().
- UiUtilities.uninstallFragment(this);
- updateSelectionMode();
-
- // Reset the footer mode since we just blew away the footer view we were holding on to.
- // This will get re-updated when/if this fragment is restored.
- mListFooterMode = LIST_FOOTER_MODE_NONE;
- super.onDestroyView();
- }
-
- @Override
- public void onDestroy() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onDestroy");
- }
-
- finishSelectionMode();
- super.onDestroy();
- }
-
- @Override
- public void onDetach() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onDetach");
- }
- super.onDetach();
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onSaveInstanceState");
- }
- super.onSaveInstanceState(outState);
- mListAdapter.onSaveInstanceState(outState);
- if (isViewCreated()) {
- outState.putParcelable(BUNDLE_LIST_STATE, getListView().onSaveInstanceState());
- }
- outState.putLong(BUNDLE_KEY_SELECTED_MESSAGE_ID, mSelectedMessageId);
- }
-
- @VisibleForTesting
- void restoreInstanceState(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " restoreInstanceState");
- }
- mListAdapter.loadState(savedInstanceState);
- mSavedListState = savedInstanceState.getParcelable(BUNDLE_LIST_STATE);
- mSelectedMessageId = savedInstanceState.getLong(BUNDLE_KEY_SELECTED_MESSAGE_ID);
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- inflater.inflate(R.menu.message_list_fragment_option, menu);
- }
-
- @Override
- public void onPrepareOptionsMenu(Menu menu) {
- menu.findItem(R.id.send).setVisible(mShowSendCommand);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.send:
- onSendPendingMessages();
- return true;
-
- }
- return false;
- }
-
- public void setCallback(Callback callback) {
- mCallback = (callback != null) ? callback : EmptyCallback.INSTANCE;
- }
-
- /**
- * This method must be called when the fragment is hidden/shown.
- */
- public void onHidden(boolean hidden) {
- // When hidden, we need to disable CAB.
- if (hidden == mDisableCab) {
- return;
- }
- mDisableCab = hidden;
- updateSelectionMode();
- }
-
- public void setSelectedMessage(long messageId) {
- if (mSelectedMessageId == messageId) {
- return;
- }
- mSelectedMessageId = messageId;
- if (mResumed) {
- highlightSelectedMessage(true);
- }
- }
-
- /**
- * @return true if the mailbox is refreshable. false otherwise, or unknown yet.
- */
- public boolean isRefreshable() {
- return mIsRefreshable;
- }
-
- /**
- * @return the number of messages that are currently selected.
- */
- private int getSelectedCount() {
- return mListAdapter.getSelectedSet().size();
- }
-
- /**
- * @return true if the list is in the "selection" mode.
- */
- public boolean isInSelectionMode() {
- return mSelectionMode != null;
- }
-
- /**
- * Called when a message is clicked.
- */
- @Override
- public void onListItemClick(ListView parent, View view, int position, long id) {
- if (view != mListFooterView) {
- MessageListItem itemView = (MessageListItem) view;
- onMessageOpen(itemView.mMailboxId, id);
- } else {
- doFooterClick();
- }
- }
-
- // This is tentative drag & drop UI
- private static class ShadowBuilder extends DragShadowBuilder {
- private static Drawable sBackground;
- /** Paint information for the move message text */
- private static TextPaint sMessagePaint;
- /** Paint information for the message count */
- private static TextPaint sCountPaint;
- /** The x location of any touch event; used to ensure the drag overlay is drawn correctly */
- private static int sTouchX;
-
- /** Width of the draggable view */
- private final int mDragWidth;
- /** Height of the draggable view */
- private final int mDragHeight;
-
- private final String mMessageText;
- private final PointF mMessagePoint;
-
- private final String mCountText;
- private final PointF mCountPoint;
- private int mOldOrientation = Configuration.ORIENTATION_UNDEFINED;
-
- /** Margin applied to the right of count text */
- private static float sCountMargin;
- /** Margin applied to left of the message text */
- private static float sMessageMargin;
- /** Vertical offset of the drag view */
- private static int sDragOffset;
-
- public ShadowBuilder(View view, int count) {
- super(view);
- Resources res = view.getResources();
- int newOrientation = res.getConfiguration().orientation;
-
- mDragHeight = view.getHeight();
- mDragWidth = view.getWidth();
-
- // TODO: Can we define a layout for the contents of the drag area?
- if (sBackground == null || mOldOrientation != newOrientation) {
- mOldOrientation = newOrientation;
-
- sBackground = res.getDrawable(R.drawable.list_pressed_holo);
- sBackground.setBounds(0, 0, mDragWidth, mDragHeight);
-
- sDragOffset = (int)res.getDimension(R.dimen.message_list_drag_offset);
-
- sMessagePaint = new TextPaint();
- float messageTextSize;
- messageTextSize = res.getDimension(R.dimen.message_list_drag_message_font_size);
- sMessagePaint.setTextSize(messageTextSize);
- sMessagePaint.setTypeface(Typeface.DEFAULT_BOLD);
- sMessagePaint.setAntiAlias(true);
- sMessageMargin = res.getDimension(R.dimen.message_list_drag_message_right_margin);
-
- sCountPaint = new TextPaint();
- float countTextSize;
- countTextSize = res.getDimension(R.dimen.message_list_drag_count_font_size);
- sCountPaint.setTextSize(countTextSize);
- sCountPaint.setTypeface(Typeface.DEFAULT_BOLD);
- sCountPaint.setAntiAlias(true);
- sCountMargin = res.getDimension(R.dimen.message_list_drag_count_left_margin);
- }
-
- // Calculate layout positions
- Rect b = new Rect();
-
- mMessageText = res.getQuantityString(R.plurals.move_messages, count, count);
- sMessagePaint.getTextBounds(mMessageText, 0, mMessageText.length(), b);
- mMessagePoint = new PointF(mDragWidth - b.right - sMessageMargin,
- (mDragHeight - b.top)/ 2);
-
- mCountText = Integer.toString(count);
- sCountPaint.getTextBounds(mCountText, 0, mCountText.length(), b);
- mCountPoint = new PointF(sCountMargin,
- (mDragHeight - b.top) / 2);
- }
-
- @Override
- public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
- shadowSize.set(mDragWidth, mDragHeight);
- shadowTouchPoint.set(sTouchX, (mDragHeight / 2) + sDragOffset);
- }
-
- @Override
- public void onDrawShadow(Canvas canvas) {
- super.onDrawShadow(canvas);
- sBackground.draw(canvas);
- canvas.drawText(mMessageText, mMessagePoint.x, mMessagePoint.y, sMessagePaint);
- canvas.drawText(mCountText, mCountPoint.x, mCountPoint.y, sCountPaint);
- }
- }
-
- @Override
- public boolean onDrag(View view, DragEvent event) {
- switch(event.getAction()) {
- case DragEvent.ACTION_DRAG_ENDED:
- if (event.getResult()) {
- onDeselectAll(); // Clear the selection
- }
- mCallback.onDragEnded();
- break;
- }
- return false;
- }
-
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_DOWN) {
- // Save the touch location to draw the drag overlay at the correct location
- ShadowBuilder.sTouchX = (int)event.getX();
- }
- // don't do anything, let the system process the event
- return false;
- }
-
- @Override
- public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
- if (view != mListFooterView) {
- // Always toggle the item.
- MessageListItem listItem = (MessageListItem) view;
- boolean toggled = false;
- if (!mListAdapter.isSelected(listItem)) {
- toggleSelection(listItem);
- toggled = true;
- }
-
- // Additionally, check to see if we can drag the item.
- if (!mCallback.onDragStarted()) {
- return toggled; // D&D not allowed.
- }
- // We can't move from combined accounts view
- // We also need to check the actual mailbox to see if we can move items from it
- final long mailboxId = getMailboxId();
- if (mAccount == null || mMailbox == null) {
- return false;
- } else if (mailboxId > 0 && !mMailbox.canHaveMessagesMoved()) {
- return false;
- }
- // Start drag&drop.
-
- // Create ClipData with the Uri of the message we're long clicking
- ClipData data = ClipData.newUri(mActivity.getContentResolver(),
- MessageListItem.MESSAGE_LIST_ITEMS_CLIP_LABEL, Message.CONTENT_URI.buildUpon()
- .appendPath(Long.toString(listItem.mMessageId))
- .appendQueryParameter(
- EmailProvider.MESSAGE_URI_PARAMETER_MAILBOX_ID,
- Long.toString(mailboxId))
- .build());
- Set<Long> selectedMessageIds = mListAdapter.getSelectedSet();
- int size = selectedMessageIds.size();
- // Add additional Uri's for any other selected messages
- for (Long messageId: selectedMessageIds) {
- if (messageId.longValue() != listItem.mMessageId) {
- data.addItem(new ClipData.Item(
- ContentUris.withAppendedId(Message.CONTENT_URI, messageId)));
- }
- }
- // Start dragging now
- listItem.setOnDragListener(this);
- listItem.startDrag(data, new ShadowBuilder(listItem, size), null, 0);
- return true;
- }
- return false;
- }
-
- private void toggleSelection(MessageListItem itemView) {
- itemView.invalidate();
- mListAdapter.toggleSelected(itemView);
- }
-
- /**
- * Called when a message on the list is selected
- *
- * @param messageMailboxId the actual mailbox ID of the message. Note it's different than
- * what is returned by {@link #getMailboxId()} for combined mailboxes.
- * ({@link #getMailboxId()} may return special mailbox values such as
- * {@link Mailbox#QUERY_ALL_INBOXES})
- * @param messageId ID of the message to open.
- */
- private void onMessageOpen(final long messageMailboxId, final long messageId) {
- if ((mMailbox != null) && (mMailbox.mId == messageMailboxId)) {
- // Normal case - the message belongs in the mailbox list we're viewing.
- mCallback.onMessageOpen(messageId, messageMailboxId,
- getMailboxId(), callbackTypeForMailboxType(mMailbox.mType));
- return;
- }
-
- // Weird case - a virtual mailbox where the messages could come from different mailbox
- // types - here we have to query the DB for the type.
- new MessageOpenTask(messageMailboxId, messageId).cancelPreviousAndExecuteParallel();
- }
-
- private int callbackTypeForMailboxType(int mailboxType) {
- switch (mailboxType) {
- case Mailbox.TYPE_DRAFTS:
- return Callback.TYPE_DRAFT;
- case Mailbox.TYPE_TRASH:
- return Callback.TYPE_TRASH;
- default:
- return Callback.TYPE_REGULAR;
- }
- }
-
- /**
- * Task to look up the mailbox type for a message, and kicks the callback.
- */
- private class MessageOpenTask extends EmailAsyncTask<Void, Void, Integer> {
- private final long mMessageMailboxId;
- private final long mMessageId;
-
- public MessageOpenTask(long messageMailboxId, long messageId) {
- super(mTaskTracker);
- mMessageMailboxId = messageMailboxId;
- mMessageId = messageId;
- }
-
- @Override
- protected Integer doInBackground(Void... params) {
- // Restore the mailbox type. Note we can't use mMailbox.mType here, because
- // we don't have mMailbox for combined mailbox.
- // ("All Starred" can contain any kind of messages.)
- return callbackTypeForMailboxType(
- Mailbox.getMailboxType(mActivity, mMessageMailboxId));
- }
-
- @Override
- protected void onSuccess(Integer type) {
- if (type == null) {
- return;
- }
- mCallback.onMessageOpen(mMessageId, mMessageMailboxId, getMailboxId(), type);
- }
- }
-
- private void showMoveMessagesDialog(Set<Long> selectedSet) {
- long[] messageIds = Utility.toPrimitiveLongArray(selectedSet);
- MoveMessageToDialog dialog = MoveMessageToDialog.newInstance(messageIds, this);
- dialog.show(getFragmentManager(), "dialog");
- }
-
- @Override
- public void onMoveToMailboxSelected(long newMailboxId, long[] messageIds) {
- final Context context = getActivity();
- if (context == null) {
- // Detached from activity. This callback was really delayed or a monkey was involved.
- return;
- }
-
- mCallback.onAdvancingOpAccepted(Utility.toLongSet(messageIds));
- ActivityHelper.moveMessages(context, newMailboxId, messageIds);
-
- // Move is async, so we can't refresh now. Instead, just clear the selection.
- onDeselectAll();
- }
-
- /**
- * Refresh the list. NOOP for special mailboxes (e.g. combined inbox).
- *
- * Note: Manual refresh is enabled even for push accounts.
- */
- public void onRefresh(boolean userRequest) {
- if (mIsRefreshable) {
- mRefreshManager.refreshMessageList(getAccountId(), getMailboxId(), userRequest);
- }
- }
-
- private void onDeselectAll() {
- mListAdapter.clearSelection();
- if (isInSelectionMode()) {
- finishSelectionMode();
- }
- }
-
- /**
- * Load more messages. NOOP for special mailboxes (e.g. combined inbox).
- */
- private void onLoadMoreMessages() {
- if (mIsRefreshable) {
- mRefreshManager.loadMoreMessages(getAccountId(), getMailboxId());
- }
- }
-
- public void onSendPendingMessages() {
- RefreshManager rm = RefreshManager.getInstance(mActivity);
- if (getMailboxId() == Mailbox.QUERY_ALL_OUTBOX) {
- rm.sendPendingMessagesForAllAccounts();
- } else if (mMailbox != null) { // Magic boxes don't have a specific account id.
- rm.sendPendingMessages(mMailbox.mAccountKey);
- }
- }
-
- /**
- * Toggles a set read/unread states. Note, the default behavior is "mark unread", so the
- * sense of the helper methods is "true=unread"; this may be called from the UI thread
- *
- * @param selectedSet The current list of selected items
- */
- private void toggleRead(Set<Long> selectedSet) {
- toggleMultiple(selectedSet, new MultiToggleHelper() {
-
- @Override
- public boolean getField(Cursor c) {
- return c.getInt(MessagesAdapter.COLUMN_READ) == 0;
- }
-
- @Override
- public void setField(long messageId, boolean newValue) {
- mController.setMessageReadSync(messageId, !newValue);
- }
- });
- }
-
- /**
- * Toggles a set of favorites (stars); this may be called from the UI thread
- *
- * @param selectedSet The current list of selected items
- */
- private void toggleFavorite(Set<Long> selectedSet) {
- toggleMultiple(selectedSet, new MultiToggleHelper() {
-
- @Override
- public boolean getField(Cursor c) {
- return c.getInt(MessagesAdapter.COLUMN_FAVORITE) != 0;
- }
-
- @Override
- public void setField(long messageId, boolean newValue) {
- mController.setMessageFavoriteSync(messageId, newValue);
- }
- });
- }
-
- private void deleteMessages(Set<Long> selectedSet) {
- final long[] messageIds = Utility.toPrimitiveLongArray(selectedSet);
- mController.deleteMessages(messageIds);
- Toast.makeText(mActivity, mActivity.getResources().getQuantityString(
- R.plurals.message_deleted_toast, messageIds.length), Toast.LENGTH_SHORT).show();
- selectedSet.clear();
- // Message deletion is async... Can't refresh the list immediately.
- }
-
- private interface MultiToggleHelper {
- /**
- * Return true if the field of interest is "set". If one or more are false, then our
- * bulk action will be to "set". If all are set, our bulk action will be to "clear".
- * @param c the cursor, positioned to the item of interest
- * @return true if the field at this row is "set"
- */
- public boolean getField(Cursor c);
-
- /**
- * Set or clear the field of interest; setField is called asynchronously via EmailAsyncTask
- * @param messageId the message id of the current message
- * @param newValue the new value to be set at this row
- */
- public void setField(long messageId, boolean newValue);
- }
-
- /**
- * Toggle multiple fields in a message, using the following logic: If one or more fields
- * are "clear", then "set" them. If all fields are "set", then "clear" them all. Provider
- * calls are applied asynchronously in setField
- *
- * @param selectedSet the set of messages that are selected
- * @param helper functions to implement the specific getter & setter
- */
- private void toggleMultiple(final Set<Long> selectedSet, final MultiToggleHelper helper) {
- final Cursor c = mListAdapter.getCursor();
- if (c == null || c.isClosed()) {
- return;
- }
-
- final HashMap<Long, Boolean> setValues = Maps.newHashMap();
- boolean allWereSet = true;
-
- c.moveToPosition(-1);
- while (c.moveToNext()) {
- long id = c.getInt(MessagesAdapter.COLUMN_ID);
- if (selectedSet.contains(id)) {
- boolean value = helper.getField(c);
- setValues.put(id, value);
- allWereSet = allWereSet && value;
- }
- }
-
- if (!setValues.isEmpty()) {
- final boolean newValue = !allWereSet;
- c.moveToPosition(-1);
- // TODO: we should probably put up a dialog or some other progress indicator for this.
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- for (long id : setValues.keySet()) {
- if (setValues.get(id) != newValue) {
- helper.setField(id, newValue);
- }
- }
- }});
- }
- }
-
- /**
- * Test selected messages for showing appropriate labels
- * @param selectedSet
- * @param columnId
- * @param defaultflag
- * @return true when the specified flagged message is selected
- */
- private boolean testMultiple(Set<Long> selectedSet, int columnId, boolean defaultflag) {
- final Cursor c = mListAdapter.getCursor();
- if (c == null || c.isClosed()) {
- return false;
- }
- c.moveToPosition(-1);
- while (c.moveToNext()) {
- long id = c.getInt(MessagesAdapter.COLUMN_ID);
- if (selectedSet.contains(Long.valueOf(id))) {
- if (c.getInt(columnId) == (defaultflag ? 1 : 0)) {
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * @return true if one or more non-starred messages are selected.
- */
- public boolean doesSelectionContainNonStarredMessage() {
- return testMultiple(mListAdapter.getSelectedSet(), MessagesAdapter.COLUMN_FAVORITE,
- false);
- }
-
- /**
- * @return true if one or more read messages are selected.
- */
- public boolean doesSelectionContainReadMessage() {
- return testMultiple(mListAdapter.getSelectedSet(), MessagesAdapter.COLUMN_READ, true);
- }
-
- /**
- * Implements a timed refresh of "stale" mailboxes. This should only happen when
- * multiple conditions are true, including:
- * Only refreshable mailboxes.
- * Only when the mailbox is "stale" (currently set to 5 minutes since last refresh)
- * Note we do this even if it's a push account; even on Exchange only inbox can be pushed.
- */
- private void autoRefreshStaleMailbox() {
- if (!mIsRefreshable) {
- // Not refreshable (special box such as drafts, or magic boxes)
- return;
- }
- if (!mRefreshManager.isMailboxStale(getMailboxId())) {
- return;
- }
- onRefresh(false);
- }
-
- /** Implements {@link MessagesAdapter.Callback} */
- @Override
- public void onAdapterFavoriteChanged(MessageListItem itemView, boolean newFavorite) {
- mController.setMessageFavorite(itemView.mMessageId, newFavorite);
- }
-
- /** Implements {@link MessagesAdapter.Callback} */
- @Override
- public void onAdapterSelectedChanged(MessageListItem itemView, boolean newSelected,
- int mSelectedCount) {
- updateSelectionMode();
- }
-
- private void updateSearchHeader(Cursor cursor) {
- MessageListContext listContext = getListContext();
- if (!listContext.isSearch() || cursor == null) {
- UiUtilities.setVisibilitySafe(mSearchHeader, View.GONE);
- return;
- }
-
- SearchResultsCursor searchCursor = (SearchResultsCursor) cursor;
- initSearchHeader();
- mSearchHeader.setVisibility(View.VISIBLE);
- String header = String.format(
- mActivity.getString(R.string.search_header_text_fmt),
- listContext.getSearchParams().mFilter);
- mSearchHeaderText.setText(header);
- int resultCount = searchCursor.getResultsCount();
- // Don't show a negative value here; this means that the server request failed
- // TODO Use some other text for this case (e.g. "search failed")?
- if (resultCount < 0) {
- resultCount = 0;
- }
- mSearchHeaderCount.setText(UiUtilities.getMessageCountForUi(
- mActivity, resultCount, false /* replaceZeroWithBlank */));
- }
-
- private int determineFooterMode() {
- int result = LIST_FOOTER_MODE_NONE;
- if ((mMailbox == null)
- || (mMailbox.mType == Mailbox.TYPE_OUTBOX)
- || (mMailbox.mType == Mailbox.TYPE_DRAFTS)) {
- return result; // No footer
- }
- if (mMailbox.mType == Mailbox.TYPE_SEARCH) {
- // Determine how many results have been loaded.
- Cursor c = mListAdapter.getCursor();
- if (c == null || c.isClosed()) {
- // Unknown yet - don't do anything.
- return result;
- }
- int total = ((SearchResultsCursor) c).getResultsCount();
- int loaded = c.getCount();
-
- if (loaded < total) {
- result = LIST_FOOTER_MODE_MORE;
- }
- } else if (!mIsEasAccount) {
- // IMAP, POP has "load more" for regular mailboxes.
- result = LIST_FOOTER_MODE_MORE;
- }
- return result;
- }
-
- private void updateFooterView() {
- // Only called from onLoadFinished -- always has views.
- int mode = determineFooterMode();
- if (mListFooterMode == mode) {
- return;
- }
- mListFooterMode = mode;
-
- ListView lv = getListView();
- if (mListFooterMode != LIST_FOOTER_MODE_NONE) {
- lv.addFooterView(mListFooterView);
- if (getListAdapter() != null) {
- // Already have an adapter - reset it to force the mode. But save the scroll
- // position so that we don't get kicked to the top.
- Parcelable listState = lv.onSaveInstanceState();
- setListAdapter(mListAdapter);
- lv.onRestoreInstanceState(listState);
- }
-
- mListFooterProgress = mListFooterView.findViewById(R.id.progress);
- mListFooterText = (TextView) mListFooterView.findViewById(R.id.main_text);
- } else {
- lv.removeFooterView(mListFooterView);
- }
- updateListFooter();
- }
-
- /**
- * Set the list footer text based on mode and the current "network active" status
- */
- private void updateListFooter() {
- if (mListFooterMode != LIST_FOOTER_MODE_NONE) {
- int footerTextId = 0;
- switch (mListFooterMode) {
- case LIST_FOOTER_MODE_MORE:
- boolean active = mRefreshManager.isMessageListRefreshing(getMailboxId());
- footerTextId = active ? R.string.status_loading_messages
- : R.string.message_list_load_more_messages_action;
- mListFooterProgress.setVisibility(active ? View.VISIBLE : View.GONE);
- break;
- }
- mListFooterText.setText(footerTextId);
- }
- }
-
- /**
- * Handle a click in the list footer, which changes meaning depending on what we're looking at.
- */
- private void doFooterClick() {
- switch (mListFooterMode) {
- case LIST_FOOTER_MODE_NONE: // should never happen
- break;
- case LIST_FOOTER_MODE_MORE:
- onLoadMoreMessages();
- break;
- }
- }
-
- private void showSendCommand(boolean show) {
- if (show != mShowSendCommand) {
- mShowSendCommand = show;
- mActivity.invalidateOptionsMenu();
- }
- }
-
- private void updateMailboxSpecificActions() {
- final boolean isOutbox = (getMailboxId() == Mailbox.QUERY_ALL_OUTBOX)
- || ((mMailbox != null) && (mMailbox.mType == Mailbox.TYPE_OUTBOX));
- showSendCommand(isOutbox && (mListAdapter != null) && (mListAdapter.getCount() > 0));
-
- // A null account/mailbox means we're in a combined view. We show the move icon there,
- // even though it may be the case that we can't move messages from one of the mailboxes.
- // There's no good way to tell that right now, though.
- mShowMoveCommand = (mAccount == null || mAccount.supportsMoveMessages(getActivity()))
- && (mMailbox == null || mMailbox.canHaveMessagesMoved());
-
- // Enable mailbox specific actions on the UIController level if needed.
- mActivity.invalidateOptionsMenu();
- }
-
- /**
- * Adjusts message notification depending upon the state of the fragment and the currently
- * viewed mailbox. If the fragment is resumed, notifications for the current mailbox may
- * be suspended. Otherwise, notifications may be re-activated. Not all mailbox types are
- * supported for notifications. These include (but are not limited to) special mailboxes
- * such as {@link Mailbox#QUERY_ALL_DRAFTS}, {@link Mailbox#QUERY_ALL_FAVORITES}, etc...
- *
- * @param updateLastSeenKey If {@code true}, the last seen message key for the currently
- * viewed mailbox will be updated.
- */
- private void adjustMessageNotification(boolean updateLastSeenKey) {
- final long accountId = getAccountId();
- final long mailboxId = getMailboxId();
- if (mailboxId == Mailbox.QUERY_ALL_INBOXES || mailboxId > 0) {
- if (updateLastSeenKey) {
- Utility.updateLastSeenMessageKey(mActivity, accountId);
- }
- NotificationController notifier = NotificationController.getInstance(mActivity);
- notifier.suspendMessageNotification(mResumed, accountId);
- }
- }
-
- private void startLoading() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " startLoading");
- }
- // Clear the list. (ListFragment will show the "Loading" animation)
- showSendCommand(false);
- updateSearchHeader(null);
-
- // Start loading...
- final LoaderManager lm = getLoaderManager();
- lm.initLoader(LOADER_ID_MESSAGES_LOADER, null, LOADER_CALLBACKS);
- }
-
- /** Timeout to show a warning, since some IMAP searches could take a long time. */
- private final int SEARCH_WARNING_DELAY_MS = 10000;
-
- private void onSearchLoadTimeout() {
- // Search is taking too long. Show an error message.
- ViewGroup root = (ViewGroup) getView();
- Activity host = getActivity();
- if (root != null && host != null) {
- mListPanel.setVisibility(View.GONE);
- mWarningContainer = (ViewGroup) LayoutInflater.from(host).inflate(
- R.layout.message_list_warning, root, false);
- TextView title = UiUtilities.getView(mWarningContainer, R.id.message_title);
- TextView message = UiUtilities.getView(mWarningContainer, R.id.message_warning);
- title.setText(R.string.search_slow_warning_title);
- message.setText(R.string.search_slow_warning_message);
- root.addView(mWarningContainer);
- }
- }
-
- /**
- * Loader callbacks for message list.
- */
- private final LoaderManager.LoaderCallbacks<Cursor> LOADER_CALLBACKS =
- new LoaderManager.LoaderCallbacks<Cursor>() {
- @Override
- public Loader<Cursor> onCreateLoader(int id, Bundle args) {
- final MessageListContext listContext = getListContext();
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, MessageListFragment.this
- + " onCreateLoader(messages) listContext=" + listContext);
- }
-
- if (mListContext.isSearch()) {
- final MessageListContext searchInfo = mListContext;
-
- // Search results are not primed with local data, and so will usually be slow.
- // In some cases, they could take a long time to return, so we need to be robust.
- setListShownNoAnimation(false);
- Utility.getMainThreadHandler().postDelayed(new Runnable() {
- @Override
- public void run() {
- if (mListContext != searchInfo) {
- // Different list is being shown now.
- return;
- }
- if (!mIsFirstLoad) {
- // Something already returned. No need to do anything.
- return;
- }
- onSearchLoadTimeout();
- }
- }, SEARCH_WARNING_DELAY_MS);
- }
-
- mIsFirstLoad = true;
- return MessagesAdapter.createLoader(getActivity(), listContext);
- }
-
- @Override
- public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, MessageListFragment.this
- + " onLoadFinished(messages) mailboxId=" + getMailboxId());
- }
- MessagesAdapter.MessagesCursor cursor = (MessagesAdapter.MessagesCursor) c;
-
- // Update the list
- mListAdapter.swapCursor(cursor);
-
- if (!cursor.mIsFound) {
- mCallback.onMailboxNotFound(mIsFirstLoad);
- return;
- }
-
- // Get the "extras" part.
- mAccount = cursor.mAccount;
- mMailbox = cursor.mMailbox;
- mIsEasAccount = cursor.mIsEasAccount;
- mIsRefreshable = cursor.mIsRefreshable;
- mCountTotalAccounts = cursor.mCountTotalAccounts;
-
- // If this is a search result, open the first message.
- if (UiUtilities.useTwoPane(getActivity()) && mIsFirstLoad && mListContext.isSearch()
- && cursor.getCount() > 0) {
- cursor.moveToFirst();
- onMessageOpen(getMailboxId(), cursor.getLong(MessagesAdapter.COLUMN_ID));
- }
-
- // Suspend message notifications as long as we're resumed
- adjustMessageNotification(false);
-
- // If this is a search mailbox, set the query; otherwise, clear it
- if (mIsFirstLoad) {
- if (mMailbox != null && mMailbox.mType == Mailbox.TYPE_SEARCH) {
- mListAdapter.setQuery(getListContext().getSearchParams().mFilter);
- mSearchedMailbox = ((SearchResultsCursor) c).getSearchedMailbox();
- } else {
- mListAdapter.setQuery(null);
- mSearchedMailbox = null;
- }
- updateMailboxSpecificActions();
-
- // Show chips if combined view.
- mListAdapter.setShowColorChips(isCombinedMailbox() && mCountTotalAccounts > 1);
- }
-
- // Various post processing...
- updateSearchHeader(cursor);
- autoRefreshStaleMailbox();
- updateFooterView();
- updateSelectionMode();
-
- // We want to make visible the selection only for the first load.
- // Re-load caused by content changed events shouldn't scroll the list.
- highlightSelectedMessage(mIsFirstLoad);
-
- if (mIsFirstLoad) {
- UiUtilities.setVisibilitySafe(mWarningContainer, View.GONE);
- mListPanel.setVisibility(View.VISIBLE);
-
- // Setting the adapter will automatically transition from "Loading" to showing
- // the list, which could show "No messages". Avoid showing that on the first sync,
- // if we know we're still potentially loading more.
- if (!isEmptyAndLoading(cursor)) {
- setListAdapter(mListAdapter);
- }
- } else if ((getListAdapter() == null) && !isEmptyAndLoading(cursor)) {
- setListAdapter(mListAdapter);
- }
-
- // Restore the state -- this step has to be the last, because Some of the
- // "post processing" seems to reset the scroll position.
- if (mSavedListState != null) {
- getListView().onRestoreInstanceState(mSavedListState);
- mSavedListState = null;
- }
-
- mIsFirstLoad = false;
- }
-
- /**
- * Determines whether or not the list is empty, but we're still potentially loading data.
- * This represents an ambiguous state where we may not want to show "No messages", since
- * it may still just be loading.
- */
- private boolean isEmptyAndLoading(Cursor cursor) {
- return (cursor.getCount() == 0)
- && mRefreshManager.isMessageListRefreshing(mMailbox.mId);
- }
-
- @Override
- public void onLoaderReset(Loader<Cursor> loader) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, MessageListFragment.this
- + " onLoaderReset(messages)");
- }
- mListAdapter.swapCursor(null);
- mAccount = null;
- mMailbox = null;
- mSearchedMailbox = null;
- mCountTotalAccounts = 0;
- }
- };
-
- /**
- * Show/hide the "selection" action mode, according to the number of selected messages and
- * the visibility of the fragment.
- * Also update the content (title and menus) if necessary.
- */
- public void updateSelectionMode() {
- final int numSelected = getSelectedCount();
- if ((numSelected == 0) || mDisableCab || !isViewCreated()) {
- finishSelectionMode();
- return;
- }
- if (isInSelectionMode()) {
- updateSelectionModeView();
- } else {
- mLastSelectionModeCallback = new SelectionModeCallback();
- getActivity().startActionMode(mLastSelectionModeCallback);
- }
- }
-
-
- /**
- * Finish the "selection" action mode.
- *
- * Note this method finishes the contextual mode, but does *not* clear the selection.
- * If you want to do so use {@link #onDeselectAll()} instead.
- */
- private void finishSelectionMode() {
- if (isInSelectionMode()) {
- mLastSelectionModeCallback.mClosedByUser = false;
- mSelectionMode.finish();
- }
- }
-
- /** Update the "selection" action mode bar */
- private void updateSelectionModeView() {
- mSelectionMode.invalidate();
- }
-
- private class SelectionModeCallback implements ActionMode.Callback {
- private MenuItem mMarkRead;
- private MenuItem mMarkUnread;
- private MenuItem mAddStar;
- private MenuItem mRemoveStar;
- private MenuItem mMove;
-
- /* package */ boolean mClosedByUser = true;
-
- @Override
- public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- mSelectionMode = mode;
-
- MenuInflater inflater = getActivity().getMenuInflater();
- inflater.inflate(R.menu.message_list_fragment_cab_options, menu);
- mMarkRead = menu.findItem(R.id.mark_read);
- mMarkUnread = menu.findItem(R.id.mark_unread);
- mAddStar = menu.findItem(R.id.add_star);
- mRemoveStar = menu.findItem(R.id.remove_star);
- mMove = menu.findItem(R.id.move);
- return true;
- }
-
- @Override
- public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
- int num = getSelectedCount();
- // Set title -- "# selected"
- mSelectionMode.setTitle(getActivity().getResources().getQuantityString(
- R.plurals.message_view_selected_message_count, num, num));
-
- // Show appropriate menu items.
- boolean nonStarExists = doesSelectionContainNonStarredMessage();
- boolean readExists = doesSelectionContainReadMessage();
- mMarkRead.setVisible(!readExists);
- mMarkUnread.setVisible(readExists);
- mAddStar.setVisible(nonStarExists);
- mRemoveStar.setVisible(!nonStarExists);
- mMove.setVisible(mShowMoveCommand);
- return true;
- }
-
- @Override
- public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- Set<Long> selectedConversations = mListAdapter.getSelectedSet();
- if (selectedConversations.isEmpty()) return true;
- switch (item.getItemId()) {
- case R.id.mark_read:
- // Note - marking as read does not trigger auto-advance.
- toggleRead(selectedConversations);
- break;
- case R.id.mark_unread:
- mCallback.onAdvancingOpAccepted(selectedConversations);
- toggleRead(selectedConversations);
- break;
- case R.id.add_star:
- case R.id.remove_star:
- // TODO: removing a star can be a destructive command and cause auto-advance
- // if the current mailbox shown is favorites.
- toggleFavorite(selectedConversations);
- break;
- case R.id.delete:
- mCallback.onAdvancingOpAccepted(selectedConversations);
- deleteMessages(selectedConversations);
- break;
- case R.id.move:
- showMoveMessagesDialog(selectedConversations);
- break;
- }
- return true;
- }
-
- @Override
- public void onDestroyActionMode(ActionMode mode) {
- // Clear this before onDeselectAll() to prevent onDeselectAll() from trying to close the
- // contextual mode again.
- mSelectionMode = null;
- if (mClosedByUser) {
- // Clear selection, only when the contextual mode is explicitly closed by the user.
- //
- // We close the contextual mode when the fragment becomes temporary invisible
- // (i.e. mIsVisible == false) too, in which case we want to keep the selection.
- onDeselectAll();
- }
- }
- }
-
- private class RefreshListener implements RefreshManager.Listener {
- @Override
- public void onMessagingError(long accountId, long mailboxId, String message) {
- }
-
- @Override
- public void onRefreshStatusChanged(long accountId, long mailboxId) {
- updateListFooter();
- }
- }
-
- /**
- * Highlight the selected message.
- */
- private void highlightSelectedMessage(boolean ensureSelectionVisible) {
- if (!isViewCreated()) {
- return;
- }
-
- final ListView lv = getListView();
- if (mSelectedMessageId == -1) {
- // No message selected
- lv.clearChoices();
- return;
- }
-
- final int count = lv.getCount();
- for (int i = 0; i < count; i++) {
- if (lv.getItemIdAtPosition(i) != mSelectedMessageId) {
- continue;
- }
- lv.setItemChecked(i, true);
- if (ensureSelectionVisible) {
- Utility.listViewSmoothScrollToPosition(getActivity(), lv, i);
- }
- break;
- }
- }
-}
diff --git a/src/com/android/email/activity/MessageListItem.java b/src/com/android/email/activity/MessageListItem.java
deleted file mode 100644
index 0d8c27dd0..000000000
--- a/src/com/android/email/activity/MessageListItem.java
+++ /dev/null
@@ -1,599 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.content.Context;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Typeface;
-import android.graphics.drawable.Drawable;
-import android.text.Layout.Alignment;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.SpannableStringBuilder;
-import android.text.StaticLayout;
-import android.text.TextPaint;
-import android.text.TextUtils;
-import android.text.TextUtils.TruncateAt;
-import android.text.format.DateUtils;
-import android.text.style.ForegroundColorSpan;
-import android.text.style.StyleSpan;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.accessibility.AccessibilityEvent;
-
-import com.android.email.R;
-import com.android.emailcommon.utility.TextUtilities;
-import com.google.common.base.Objects;
-
-/**
- * This custom View is the list item for the MessageList activity, and serves two purposes:
- * 1. It's a container to store message metadata (e.g. the ids of the message, mailbox, & account)
- * 2. It handles internal clicks such as the checkbox or the favorite star
- */
-public class MessageListItem extends View {
- // Note: messagesAdapter directly fiddles with these fields.
- /* package */ long mMessageId;
- /* package */ long mMailboxId;
- /* package */ long mAccountId;
-
- private ThreePaneLayout mLayout;
- private MessagesAdapter mAdapter;
- private MessageListItemCoordinates mCoordinates;
- private Context mContext;
-
- private boolean mDownEvent;
-
- public static final String MESSAGE_LIST_ITEMS_CLIP_LABEL =
- "com.android.email.MESSAGE_LIST_ITEMS";
-
- public MessageListItem(Context context) {
- super(context);
- init(context);
- }
-
- public MessageListItem(Context context, AttributeSet attrs) {
- super(context, attrs);
- init(context);
- }
-
- public MessageListItem(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- init(context);
- }
-
- // Wide mode shows sender, snippet, time, and favorite spread out across the screen
- private static final int MODE_WIDE = MessageListItemCoordinates.WIDE_MODE;
- // Sentinel indicating that the view needs layout
- public static final int NEEDS_LAYOUT = -1;
-
- private static boolean sInit = false;
- private static final TextPaint sDefaultPaint = new TextPaint();
- private static final TextPaint sBoldPaint = new TextPaint();
- private static final TextPaint sDatePaint = new TextPaint();
- private static Bitmap sAttachmentIcon;
- private static Bitmap sInviteIcon;
- private static int sBadgeMargin;
- private static Bitmap sFavoriteIconOff;
- private static Bitmap sFavoriteIconOn;
- private static Bitmap sSelectedIconOn;
- private static Bitmap sSelectedIconOff;
- private static Bitmap sStateReplied;
- private static Bitmap sStateForwarded;
- private static Bitmap sStateRepliedAndForwarded;
- private static String sSubjectSnippetDivider;
- private static String sSubjectDescription;
- private static String sSubjectEmptyDescription;
-
- // Static colors.
- private static int DEFAULT_TEXT_COLOR;
- private static int ACTIVATED_TEXT_COLOR;
- private static int LIGHT_TEXT_COLOR;
- private static int DRAFT_TEXT_COLOR;
- private static int SUBJECT_TEXT_COLOR_READ;
- private static int SUBJECT_TEXT_COLOR_UNREAD;
- private static int SNIPPET_TEXT_COLOR_READ;
- private static int SNIPPET_TEXT_COLOR_UNREAD;
- private static int SENDERS_TEXT_COLOR_READ;
- private static int SENDERS_TEXT_COLOR_UNREAD;
- private static int DATE_TEXT_COLOR_READ;
- private static int DATE_TEXT_COLOR_UNREAD;
-
- public String mSender;
- public SpannableStringBuilder mText;
- public CharSequence mSnippet;
- private String mSubject;
- private StaticLayout mSubjectLayout;
- public boolean mRead;
- public boolean mHasAttachment = false;
- public boolean mHasInvite = true;
- public boolean mIsFavorite = false;
- public boolean mHasBeenRepliedTo = false;
- public boolean mHasBeenForwarded = false;
- /** {@link Paint} for account color chips. null if no chips should be drawn. */
- public Paint mColorChipPaint;
-
- private int mMode = -1;
-
- private int mViewWidth = 0;
- private int mViewHeight = 0;
-
- private static int sItemHeightWide;
- private static int sItemHeightNormal;
-
- // Note: these cannot be shared Drawables because they are selectors which have state.
- private Drawable mReadSelector;
- private Drawable mUnreadSelector;
- private Drawable mWideReadSelector;
- private Drawable mWideUnreadSelector;
-
- private CharSequence mFormattedSender;
- // We must initialize this to something, in case the timestamp of the message is zero (which
- // should be very rare); this is otherwise set in setTimestamp
- private CharSequence mFormattedDate = "";
-
- private void init(Context context) {
- mContext = context;
- if (!sInit) {
- Resources r = context.getResources();
- sSubjectDescription = r.getString(R.string.message_subject_description).concat(", ");
- sSubjectEmptyDescription = r.getString(R.string.message_is_empty_description);
- sSubjectSnippetDivider = r.getString(R.string.message_list_subject_snippet_divider);
- sItemHeightWide =
- r.getDimensionPixelSize(R.dimen.message_list_item_height_wide);
- sItemHeightNormal =
- r.getDimensionPixelSize(R.dimen.message_list_item_height_normal);
-
- sDefaultPaint.setTypeface(Typeface.DEFAULT);
- sDefaultPaint.setAntiAlias(true);
- sDatePaint.setTypeface(Typeface.DEFAULT);
- sDatePaint.setAntiAlias(true);
- sBoldPaint.setTypeface(Typeface.DEFAULT_BOLD);
- sBoldPaint.setAntiAlias(true);
-
- sAttachmentIcon = BitmapFactory.decodeResource(r, R.drawable.ic_badge_attachment);
- sInviteIcon = BitmapFactory.decodeResource(r, R.drawable.ic_badge_invite_holo_light);
- sBadgeMargin = r.getDimensionPixelSize(R.dimen.message_list_badge_margin);
- sFavoriteIconOff =
- BitmapFactory.decodeResource(r, R.drawable.btn_star_off_normal_email_holo_light);
- sFavoriteIconOn =
- BitmapFactory.decodeResource(r, R.drawable.btn_star_on_normal_email_holo_light);
- sSelectedIconOff =
- BitmapFactory.decodeResource(r, R.drawable.btn_check_off_normal_holo_light);
- sSelectedIconOn =
- BitmapFactory.decodeResource(r, R.drawable.btn_check_on_normal_holo_light);
-
- sStateReplied =
- BitmapFactory.decodeResource(r, R.drawable.ic_badge_reply_holo_light);
- sStateForwarded =
- BitmapFactory.decodeResource(r, R.drawable.ic_badge_forward_holo_light);
- sStateRepliedAndForwarded =
- BitmapFactory.decodeResource(r, R.drawable.ic_badge_reply_forward_holo_light);
-
- DEFAULT_TEXT_COLOR = r.getColor(R.color.default_text_color);
- ACTIVATED_TEXT_COLOR = r.getColor(android.R.color.white);
- SUBJECT_TEXT_COLOR_READ = r.getColor(R.color.subject_text_color_read);
- SUBJECT_TEXT_COLOR_UNREAD = r.getColor(R.color.subject_text_color_unread);
- SNIPPET_TEXT_COLOR_READ = r.getColor(R.color.snippet_text_color_read);
- SNIPPET_TEXT_COLOR_UNREAD = r.getColor(R.color.snippet_text_color_unread);
- SENDERS_TEXT_COLOR_READ = r.getColor(R.color.senders_text_color_read);
- SENDERS_TEXT_COLOR_UNREAD = r.getColor(R.color.senders_text_color_unread);
- DATE_TEXT_COLOR_READ = r.getColor(R.color.date_text_color_read);
- DATE_TEXT_COLOR_UNREAD = r.getColor(R.color.date_text_color_unread);
-
- sInit = true;
- }
- }
-
- /**
- * Invalidate all drawing caches associated with drawing message list items.
- * This is an expensive operation, and should be done rarely, such as when system font size
- * changes occurs.
- */
- public static void resetDrawingCaches() {
- MessageListItemCoordinates.resetCaches();
- sInit = false;
- }
-
- /**
- * Sets message subject and snippet safely, ensuring the cache is invalidated.
- */
- public void setText(String subject, String snippet, boolean forceUpdate) {
- boolean changed = false;
- if (!Objects.equal(mSubject, subject)) {
- mSubject = subject;
- changed = true;
- populateContentDescription();
- }
-
- if (!Objects.equal(mSnippet, snippet)) {
- mSnippet = snippet;
- changed = true;
- }
-
- if (forceUpdate || changed || (mSubject == null && mSnippet == null) /* first time */) {
- SpannableStringBuilder ssb = new SpannableStringBuilder();
- boolean hasSubject = false;
- if (!TextUtils.isEmpty(mSubject)) {
- SpannableString ss = new SpannableString(mSubject);
- ss.setSpan(new StyleSpan(mRead ? Typeface.NORMAL : Typeface.BOLD), 0, ss.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- ssb.append(ss);
- hasSubject = true;
- }
- if (!TextUtils.isEmpty(mSnippet)) {
- if (hasSubject) {
- ssb.append(sSubjectSnippetDivider);
- }
- ssb.append(mSnippet);
- }
- mText = ssb;
- requestLayout();
- }
- }
-
- long mTimeFormatted = 0;
- public void setTimestamp(long timestamp) {
- if (mTimeFormatted != timestamp) {
- mFormattedDate = DateUtils.getRelativeTimeSpanString(mContext, timestamp).toString();
- mTimeFormatted = timestamp;
- }
- }
-
- /**
- * Determine the mode of this view (WIDE or NORMAL)
- *
- * @param width The width of the view
- * @return The mode of the view
- */
- private int getViewMode(int width) {
- return MessageListItemCoordinates.getMode(mContext, width);
- }
-
- private Drawable mCurentBackground = null; // Only used by updateBackground()
-
- private void updateBackground() {
- final Drawable newBackground;
- boolean isMultiPane = MessageListItemCoordinates.isMultiPane(mContext);
- if (mRead) {
- if (isMultiPane && mLayout.isLeftPaneVisible()) {
- if (mWideReadSelector == null) {
- mWideReadSelector = getContext().getResources()
- .getDrawable(R.drawable.conversation_wide_read_selector);
- }
- newBackground = mWideReadSelector;
- } else {
- if (mReadSelector == null) {
- mReadSelector = getContext().getResources()
- .getDrawable(R.drawable.conversation_read_selector);
- }
- newBackground = mReadSelector;
- }
- } else {
- if (isMultiPane && mLayout.isLeftPaneVisible()) {
- if (mWideUnreadSelector == null) {
- mWideUnreadSelector = getContext().getResources().getDrawable(
- R.drawable.conversation_wide_unread_selector);
- }
- newBackground = mWideUnreadSelector;
- } else {
- if (mUnreadSelector == null) {
- mUnreadSelector = getContext().getResources()
- .getDrawable(R.drawable.conversation_unread_selector);
- }
- newBackground = mUnreadSelector;
- }
- }
- if (newBackground != mCurentBackground) {
- // setBackgroundDrawable is a heavy operation. Only call it when really needed.
- setBackgroundDrawable(newBackground);
- mCurentBackground = newBackground;
- }
- }
-
- private void calculateSubjectText() {
- if (mText == null || mText.length() == 0) {
- return;
- }
- boolean hasSubject = false;
- int snippetStart = 0;
- if (!TextUtils.isEmpty(mSubject)) {
- int subjectColor = getFontColor(mRead ? SUBJECT_TEXT_COLOR_READ
- : SUBJECT_TEXT_COLOR_UNREAD);
- mText.setSpan(new ForegroundColorSpan(subjectColor), 0, mSubject.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- snippetStart = mSubject.length() + 1;
- }
- if (!TextUtils.isEmpty(mSnippet)) {
- int snippetColor = getFontColor(mRead ? SNIPPET_TEXT_COLOR_READ
- : SNIPPET_TEXT_COLOR_UNREAD);
- mText.setSpan(new ForegroundColorSpan(snippetColor), snippetStart, mText.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- }
-
- private void calculateDrawingData() {
- sDefaultPaint.setTextSize(mCoordinates.subjectFontSize);
- calculateSubjectText();
- mSubjectLayout = new StaticLayout(mText, sDefaultPaint,
- mCoordinates.subjectWidth, Alignment.ALIGN_NORMAL, 1, 0, false /* includePad */);
- if (mCoordinates.subjectLineCount < mSubjectLayout.getLineCount()) {
- // TODO: ellipsize.
- int end = mSubjectLayout.getLineEnd(mCoordinates.subjectLineCount - 1);
- mSubjectLayout = new StaticLayout(mText.subSequence(0, end),
- sDefaultPaint, mCoordinates.subjectWidth, Alignment.ALIGN_NORMAL, 1, 0, true);
- }
-
- // Now, format the sender for its width
- TextPaint senderPaint = mRead ? sDefaultPaint : sBoldPaint;
- // And get the ellipsized string for the calculated width
- if (TextUtils.isEmpty(mSender)) {
- mFormattedSender = "";
- } else {
- int senderWidth = mCoordinates.sendersWidth;
- senderPaint.setTextSize(mCoordinates.sendersFontSize);
- senderPaint.setColor(getFontColor(mRead ? SENDERS_TEXT_COLOR_READ
- : SENDERS_TEXT_COLOR_UNREAD));
- mFormattedSender = TextUtils.ellipsize(mSender, senderPaint, senderWidth,
- TruncateAt.END);
- }
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- if (widthMeasureSpec != 0 || mViewWidth == 0) {
- mViewWidth = MeasureSpec.getSize(widthMeasureSpec);
- int mode = getViewMode(mViewWidth);
- if (mode != mMode) {
- mMode = mode;
- }
- mViewHeight = measureHeight(heightMeasureSpec, mMode);
- }
- setMeasuredDimension(mViewWidth, mViewHeight);
- }
-
- /**
- * Determine the height of this view
- *
- * @param measureSpec A measureSpec packed into an int
- * @param mode The current mode of this view
- * @return The height of the view, honoring constraints from measureSpec
- */
- private int measureHeight(int measureSpec, int mode) {
- int result = 0;
- int specMode = MeasureSpec.getMode(measureSpec);
- int specSize = MeasureSpec.getSize(measureSpec);
-
- if (specMode == MeasureSpec.EXACTLY) {
- // We were told how big to be
- result = specSize;
- } else {
- // Measure the text
- if (mMode == MODE_WIDE) {
- result = sItemHeightWide;
- } else {
- result = sItemHeightNormal;
- }
- if (specMode == MeasureSpec.AT_MOST) {
- // Respect AT_MOST value if that was what is called for by
- // measureSpec
- result = Math.min(result, specSize);
- }
- }
- return result;
- }
-
- @Override
- public void draw(Canvas canvas) {
- // Update the background, before View.draw() draws it.
- setSelected(mAdapter.isSelected(this));
- updateBackground();
- super.draw(canvas);
- }
-
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
-
- mCoordinates = MessageListItemCoordinates.forWidth(mContext, mViewWidth);
- calculateDrawingData();
- }
-
- private int getFontColor(int defaultColor) {
- return isActivated() && MessageListItemCoordinates.isMultiPane(mContext) ?
- ACTIVATED_TEXT_COLOR : defaultColor;
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- // Draw the color chip indicating the mailbox this belongs to
- if (mColorChipPaint != null) {
- canvas.drawRect(
- mCoordinates.chipX, mCoordinates.chipY,
- mCoordinates.chipX + mCoordinates.chipWidth,
- mCoordinates.chipY + mCoordinates.chipHeight,
- mColorChipPaint);
- }
-
- // Draw the checkbox
- canvas.drawBitmap(mAdapter.isSelected(this) ? sSelectedIconOn : sSelectedIconOff,
- mCoordinates.checkmarkX, mCoordinates.checkmarkY, null);
-
- // Draw the sender name
- Paint senderPaint = mRead ? sDefaultPaint : sBoldPaint;
- senderPaint.setColor(getFontColor(mRead ? SENDERS_TEXT_COLOR_READ
- : SENDERS_TEXT_COLOR_UNREAD));
- senderPaint.setTextSize(mCoordinates.sendersFontSize);
- canvas.drawText(mFormattedSender, 0, mFormattedSender.length(),
- mCoordinates.sendersX, mCoordinates.sendersY - mCoordinates.sendersAscent,
- senderPaint);
-
- // Draw the reply state. Draw nothing if neither replied nor forwarded.
- if (mHasBeenRepliedTo && mHasBeenForwarded) {
- canvas.drawBitmap(sStateRepliedAndForwarded,
- mCoordinates.stateX, mCoordinates.stateY, null);
- } else if (mHasBeenRepliedTo) {
- canvas.drawBitmap(sStateReplied,
- mCoordinates.stateX, mCoordinates.stateY, null);
- } else if (mHasBeenForwarded) {
- canvas.drawBitmap(sStateForwarded,
- mCoordinates.stateX, mCoordinates.stateY, null);
- }
-
- // Subject and snippet.
- sDefaultPaint.setTextSize(mCoordinates.subjectFontSize);
- canvas.save();
- canvas.translate(
- mCoordinates.subjectX,
- mCoordinates.subjectY);
- mSubjectLayout.draw(canvas);
- canvas.restore();
-
- // Draw the date
- sDatePaint.setTextSize(mCoordinates.dateFontSize);
- sDatePaint.setColor(mRead ? DATE_TEXT_COLOR_READ : DATE_TEXT_COLOR_UNREAD);
- int dateX = mCoordinates.dateXEnd
- - (int) sDatePaint.measureText(mFormattedDate, 0, mFormattedDate.length());
-
- canvas.drawText(mFormattedDate, 0, mFormattedDate.length(),
- dateX, mCoordinates.dateY - mCoordinates.dateAscent, sDatePaint);
-
- // Draw the favorite icon
- canvas.drawBitmap(mIsFavorite ? sFavoriteIconOn : sFavoriteIconOff,
- mCoordinates.starX, mCoordinates.starY, null);
-
- // TODO: deal with the icon layouts better from the coordinate class so that this logic
- // doesn't have to exist.
- // Draw the attachment and invite icons, if necessary.
- int iconsLeft = dateX - sBadgeMargin;
- if (mHasAttachment) {
- iconsLeft = iconsLeft - sAttachmentIcon.getWidth();
- canvas.drawBitmap(sAttachmentIcon, iconsLeft, mCoordinates.paperclipY, null);
- }
- if (mHasInvite) {
- iconsLeft -= sInviteIcon.getWidth();
- canvas.drawBitmap(sInviteIcon, iconsLeft, mCoordinates.paperclipY, null);
- }
-
- }
-
- /**
- * Called by the adapter at bindView() time
- *
- * @param adapter the adapter that creates this view
- * @param layout If this is a three pane implementation, the
- * ThreePaneLayout. Otherwise, null.
- */
- public void bindViewInit(MessagesAdapter adapter, ThreePaneLayout layout) {
- mLayout = layout;
- mAdapter = adapter;
- requestLayout();
- }
-
- private static final int TOUCH_SLOP = 24;
- private static int sScaledTouchSlop = -1;
-
- private void initializeSlop(Context context) {
- if (sScaledTouchSlop == -1) {
- final Resources res = context.getResources();
- final Configuration config = res.getConfiguration();
- final float density = res.getDisplayMetrics().density;
- final float sizeAndDensity;
- if (config.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_XLARGE)) {
- sizeAndDensity = density * 1.5f;
- } else {
- sizeAndDensity = density;
- }
- sScaledTouchSlop = (int) (sizeAndDensity * TOUCH_SLOP + 0.5f);
- }
- }
-
- /**
- * Overriding this method allows us to "catch" clicks in the checkbox or star
- * and process them accordingly.
- */
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- initializeSlop(getContext());
-
- boolean handled = false;
- int touchX = (int) event.getX();
- int checkRight = mCoordinates.checkmarkX
- + mCoordinates.checkmarkWidthIncludingMargins + sScaledTouchSlop;
- int starLeft = mCoordinates.starX - sScaledTouchSlop;
-
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- if (touchX < checkRight || touchX > starLeft) {
- mDownEvent = true;
- if ((touchX < checkRight) || (touchX > starLeft)) {
- handled = true;
- }
- }
- break;
-
- case MotionEvent.ACTION_CANCEL:
- mDownEvent = false;
- break;
-
- case MotionEvent.ACTION_UP:
- if (mDownEvent) {
- if (touchX < checkRight) {
- mAdapter.toggleSelected(this);
- handled = true;
- } else if (touchX > starLeft) {
- mIsFavorite = !mIsFavorite;
- mAdapter.updateFavorite(this, mIsFavorite);
- handled = true;
- }
- }
- break;
- }
-
- if (handled) {
- invalidate();
- } else {
- handled = super.onTouchEvent(event);
- }
-
- return handled;
- }
-
- @Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
- event.setClassName(getClass().getName());
- event.setPackageName(getContext().getPackageName());
- event.setEnabled(true);
- event.setContentDescription(getContentDescription());
- return true;
- }
-
- /**
- * Sets the content description for this item, used for accessibility.
- */
- private void populateContentDescription() {
- if (!TextUtils.isEmpty(mSubject)) {
- setContentDescription(sSubjectDescription + mSubject);
- } else {
- setContentDescription(sSubjectEmptyDescription);
- }
- }
-}
diff --git a/src/com/android/email/activity/MessageListItemCoordinates.java b/src/com/android/email/activity/MessageListItemCoordinates.java
deleted file mode 100644
index 87e4d6c08..000000000
--- a/src/com/android/email/activity/MessageListItemCoordinates.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.email.activity;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Typeface;
-import android.text.TextPaint;
-import android.util.SparseArray;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.MeasureSpec;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.widget.TextView;
-
-import com.android.email.R;
-
-/**
- * Represents the coordinates of elements inside a CanvasConversationHeaderView
- * (eg, checkmark, star, subject, sender, labels, etc.) It will inflate a view,
- * and record the coordinates of each element after layout. This will allows us
- * to easily improve performance by creating custom view while still defining
- * layout in XML files.
- */
-public class MessageListItemCoordinates {
- // Modes.
- public static final int WIDE_MODE = 0;
- public static final int NORMAL_MODE = 1;
-
- // Static threshold.
- private static int MINIMUM_WIDTH_WIDE_MODE = -1;
- private static int[] SUBJECT_LENGTHS;
-
- // Checkmark.
- int checkmarkX;
- int checkmarkY;
- int checkmarkWidthIncludingMargins;
-
- // Reply and forward state.
- int stateX;
- int stateY;
-
- // Star.
- int starX;
- int starY;
-
- // Senders.
- int sendersX;
- int sendersY;
- int sendersWidth;
- int sendersLineCount;
- int sendersFontSize;
- int sendersAscent;
-
- // Subject.
- int subjectX;
- int subjectY;
- int subjectWidth;
- int subjectLineCount;
- int subjectFontSize;
- int subjectAscent;
-
- // Color chip.
- int chipX;
- int chipY;
- int chipWidth;
- int chipHeight;
-
- // Date.
- int dateXEnd;
- int dateY;
- int dateFontSize;
- int dateAscent;
-
- // Paperclip.
- int paperclipY;
-
- // Cache to save Coordinates based on view width.
- private static SparseArray<MessageListItemCoordinates> mCache =
- new SparseArray<MessageListItemCoordinates>();
-
- private static TextPaint sPaint = new TextPaint();
-
- static {
- sPaint.setTypeface(Typeface.DEFAULT);
- sPaint.setAntiAlias(true);
- }
-
- // Not directly instantiable.
- private MessageListItemCoordinates() {}
-
- /**
- * Returns the mode of the header view (Wide/Normal/Narrow) given the its
- * measured width.
- */
- public static int getMode(Context context, int width) {
- Resources res = context.getResources();
- if (MINIMUM_WIDTH_WIDE_MODE <= 0) {
- MINIMUM_WIDTH_WIDE_MODE = res.getDimensionPixelSize(R.dimen.minimum_width_wide_mode);
- }
-
- // Choose the correct mode based on view width.
- int mode = NORMAL_MODE;
- if (width > MINIMUM_WIDTH_WIDE_MODE) {
- mode = WIDE_MODE;
- }
- return mode;
- }
-
- public static boolean isMultiPane(Context context) {
- return UiUtilities.useTwoPane(context);
- }
-
- /**
- * Returns the layout id to be inflated in this mode.
- */
- private static int getLayoutId(int mode) {
- switch (mode) {
- case WIDE_MODE:
- return R.layout.message_list_item_wide;
- case NORMAL_MODE:
- return R.layout.message_list_item_normal;
- default:
- throw new IllegalArgumentException("Unknown conversation header view mode " + mode);
- }
- }
-
- /**
- * Returns a value array multiplied by the specified density.
- */
- public static int[] getDensityDependentArray(int[] values, float density) {
- int result[] = new int[values.length];
- for (int i = 0; i < values.length; ++i) {
- result[i] = (int) (values[i] * density);
- }
- return result;
- }
-
- /**
- * Returns the height of the view in this mode.
- */
- public static int getHeight(Context context, int mode) {
- return context.getResources().getDimensionPixelSize(
- (mode == WIDE_MODE)
- ? R.dimen.message_list_item_height_wide
- : R.dimen.message_list_item_height_normal);
- }
-
- /**
- * Returns the x coordinates of a view by tracing up its hierarchy.
- */
- private static int getX(View view) {
- int x = 0;
- while (view != null) {
- x += (int) view.getX();
- ViewParent parent = view.getParent();
- view = parent != null ? (View) parent : null;
- }
- return x;
- }
-
- /**
- * Returns the y coordinates of a view by tracing up its hierarchy.
- */
- private static int getY(View view) {
- int y = 0;
- while (view != null) {
- y += (int) view.getY();
- ViewParent parent = view.getParent();
- view = parent != null ? (View) parent : null;
- }
- return y;
- }
-
- /**
- * Returns the width of a view.
- *
- * @param includeMargins whether or not to include margins when calculating
- * width.
- */
- public static int getWidth(View view, boolean includeMargins) {
- ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
- return view.getWidth() + (includeMargins ? params.leftMargin + params.rightMargin : 0);
- }
-
- /**
- * Returns the height of a view.
- *
- * @param includeMargins whether or not to include margins when calculating
- * height.
- */
- public static int getHeight(View view, boolean includeMargins) {
- ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
- return view.getHeight() + (includeMargins ? params.topMargin + params.bottomMargin : 0);
- }
-
- /**
- * Returns the number of lines of this text view.
- */
- private static int getLineCount(TextView textView) {
- return textView.getHeight() / textView.getLineHeight();
- }
-
- /**
- * Returns the length (maximum of characters) of subject in this mode.
- */
- public static int getSubjectLength(Context context, int mode) {
- Resources res = context.getResources();
- if (SUBJECT_LENGTHS == null) {
- SUBJECT_LENGTHS = res.getIntArray(R.array.subject_lengths);
- }
- return SUBJECT_LENGTHS[mode];
- }
-
- /**
- * Reset the caches associated with the coordinate layouts.
- */
- static void resetCaches() {
- mCache.clear();
- }
-
- /**
- * Returns coordinates for elements inside a conversation header view given
- * the view width.
- */
- public static MessageListItemCoordinates forWidth(Context context, int width) {
- MessageListItemCoordinates coordinates = mCache.get(width);
- if (coordinates == null) {
- coordinates = new MessageListItemCoordinates();
- mCache.put(width, coordinates);
- // TODO: make the field computation done inside of the constructor and mark fields final
-
- // Layout the appropriate view.
- int mode = getMode(context, width);
- int height = getHeight(context, mode);
- View view = LayoutInflater.from(context).inflate(getLayoutId(mode), null);
- int widthSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
- int heightSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
- view.measure(widthSpec, heightSpec);
- view.layout(0, 0, width, height);
-
- // Records coordinates.
- View checkmark = view.findViewById(R.id.checkmark);
- coordinates.checkmarkX = getX(checkmark);
- coordinates.checkmarkY = getY(checkmark);
- coordinates.checkmarkWidthIncludingMargins = getWidth(checkmark, true);
-
- View star = view.findViewById(R.id.star);
- coordinates.starX = getX(star);
- coordinates.starY = getY(star);
-
- View state = view.findViewById(R.id.reply_state);
- coordinates.stateX = getX(state);
- coordinates.stateY = getY(state);
-
- TextView senders = (TextView) view.findViewById(R.id.senders);
- coordinates.sendersX = getX(senders);
- coordinates.sendersY = getY(senders);
- coordinates.sendersWidth = getWidth(senders, false);
- coordinates.sendersLineCount = getLineCount(senders);
- coordinates.sendersFontSize = (int) senders.getTextSize();
- coordinates.sendersAscent = Math.round(senders.getPaint().ascent());
-
- TextView subject = (TextView) view.findViewById(R.id.subject);
- coordinates.subjectX = getX(subject);
- coordinates.subjectY = getY(subject);
- coordinates.subjectWidth = getWidth(subject, false);
- coordinates.subjectLineCount = getLineCount(subject);
- coordinates.subjectFontSize = (int) subject.getTextSize();
- coordinates.subjectAscent = Math.round(subject.getPaint().ascent());
-
- View chip = view.findViewById(R.id.color_chip);
- coordinates.chipX = getX(chip);
- coordinates.chipY = getY(chip);
- coordinates.chipWidth = getWidth(chip, false);
- coordinates.chipHeight = getHeight(chip, false);
-
- TextView date = (TextView) view.findViewById(R.id.date);
- coordinates.dateXEnd = getX(date) + date.getWidth();
- coordinates.dateY = getY(date);
- coordinates.dateFontSize = (int) date.getTextSize();
- coordinates.dateAscent = Math.round(date.getPaint().ascent());
-
- // The x-value is computed relative to the date.
- View paperclip = view.findViewById(R.id.paperclip);
- coordinates.paperclipY = getY(paperclip);
- }
- return coordinates;
- }
-}
diff --git a/src/com/android/email/activity/MessageOrderManager.java b/src/com/android/email/activity/MessageOrderManager.java
deleted file mode 100644
index fffcf7c3b..000000000
--- a/src/com/android/email/activity/MessageOrderManager.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.database.ContentObserver;
-import android.database.Cursor;
-import android.os.Handler;
-
-import com.android.email.MessageListContext;
-import com.android.email.activity.MessageOrderManager.Callback;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.DelayedOperations;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
-
-/**
- * Used by {@link MessageView} to determine the message-id of the previous/next messages.
- *
- * All public methods must be called on the main thread.
- *
- * Call {@link #moveTo} to set the current message id. As a result,
- * either {@link Callback#onMessagesChanged} or {@link Callback#onMessageNotFound} is called.
- *
- * Use {@link #canMoveToNewer()} and {@link #canMoveToOlder()} to see if there is a newer/older
- * message, and {@link #moveToNewer()} and {@link #moveToOlder()} to update the current position.
- *
- * If the message list changes (e.g. message removed, new message arrived, etc), {@link Callback}
- * gets called again.
- *
- * When an instance is no longer needed, call {@link #close()}, which closes an underlying cursor
- * and shuts down an async task.
- *
- * TODO: Is there better words than "newer"/"older" that works even if we support other sort orders
- * than timestamp?
- */
-public class MessageOrderManager {
- private final Context mContext;
- private final ContentResolver mContentResolver;
-
- private final MessageListContext mListContext;
- private final ContentObserver mObserver;
- private final Callback mCallback;
- private final DelayedOperations mDelayedOperations;
-
- private LoadMessageListTask mLoadMessageListTask;
- private Cursor mCursor;
-
- private long mCurrentMessageId = -1;
-
- private int mTotalMessageCount;
-
- private int mCurrentPosition;
-
- private boolean mClosed = false;
-
- public interface Callback {
- /**
- * Called when the message set by {@link MessageOrderManager#moveTo(long)} is found in the
- * mailbox. {@link #canMoveToOlder}, {@link #canMoveToNewer}, {@link #moveToOlder} and
- * {@link #moveToNewer} are ready to be called.
- */
- public void onMessagesChanged();
- /**
- * Called when the message set by {@link MessageOrderManager#moveTo(long)} is not found.
- */
- public void onMessageNotFound();
- }
-
- /**
- * Wrapper for {@link Callback}, which uses {@link DelayedOperations#post(Runnable)} to
- * kick callbacks rather than calling them directly. This is used to avoid the "nested fragment
- * transaction" exception. e.g. {@link #moveTo} is often called during a fragment transaction,
- * and if the message no longer exists we call {@link #onMessageNotFound}, which most probably
- * triggers another fragment transaction.
- */
- private class PostingCallback implements Callback {
- private final Callback mOriginal;
-
- private PostingCallback(Callback original) {
- mOriginal = original;
- }
-
- private final Runnable mOnMessagesChangedRunnable = new Runnable() {
- @Override public void run() {
- mOriginal.onMessagesChanged();
- }
- };
-
- @Override
- public void onMessagesChanged() {
- mDelayedOperations.post(mOnMessagesChangedRunnable);
- }
-
- private final Runnable mOnMessageNotFoundRunnable = new Runnable() {
- @Override public void run() {
- mOriginal.onMessageNotFound();
- }
- };
-
- @Override
- public void onMessageNotFound() {
- mDelayedOperations.post(mOnMessageNotFoundRunnable);
- }
- }
-
- public MessageOrderManager(Context context, MessageListContext listContext, Callback callback) {
- this(context, listContext, callback, new DelayedOperations(Utility.getMainThreadHandler()));
- }
-
- @VisibleForTesting
- MessageOrderManager(Context context, MessageListContext listContext, Callback callback,
- DelayedOperations delayedOperations) {
- Preconditions.checkArgument(listContext.getMailboxId() != Mailbox.NO_MAILBOX);
- mContext = context.getApplicationContext();
- mContentResolver = mContext.getContentResolver();
- mDelayedOperations = delayedOperations;
- mListContext = listContext;
- mCallback = new PostingCallback(callback);
- mObserver = new ContentObserver(getHandlerForContentObserver()) {
- @Override public void onChange(boolean selfChange) {
- if (mClosed) {
- return;
- }
- onContentChanged();
- }
- };
- startTask();
- }
-
- public MessageListContext getListContext() {
- return mListContext;
- }
-
- public long getMailboxId() {
- return mListContext.getMailboxId();
- }
-
- /**
- * @return the total number of messages.
- */
- public int getTotalMessageCount() {
- return mTotalMessageCount;
- }
-
- /**
- * @return current cursor position, starting from 0.
- */
- public int getCurrentPosition() {
- return mCurrentPosition;
- }
-
- /**
- * @return a {@link Handler} for {@link ContentObserver}.
- *
- * Unit tests override this and return null, so that {@link ContentObserver#onChange} is
- * called synchronously.
- */
- /* package */ Handler getHandlerForContentObserver() {
- return new Handler();
- }
-
- private boolean isTaskRunning() {
- return mLoadMessageListTask != null;
- }
-
- private void startTask() {
- cancelTask();
- startQuery();
- }
-
- /**
- * Start {@link LoadMessageListTask} to query DB.
- * Unit tests override this to make tests synchronous and to inject a mock query.
- */
- /* package */ void startQuery() {
- mLoadMessageListTask = new LoadMessageListTask();
- mLoadMessageListTask.executeParallel();
- }
-
- private void cancelTask() {
- Utility.cancelTaskInterrupt(mLoadMessageListTask);
- mLoadMessageListTask = null;
- }
-
- private void closeCursor() {
- if (mCursor != null) {
- mCursor.close();
- mCursor = null;
- }
- }
-
- private void setCurrentMessageIdFromCursor() {
- if (mCursor != null) {
- mCurrentMessageId = mCursor.getLong(EmailContent.ID_PROJECTION_COLUMN);
- }
- }
-
- private void onContentChanged() {
- if (!isTaskRunning()) { // Start only if not running already.
- startTask();
- }
- }
-
- /**
- * Shutdown itself and release resources.
- */
- public void close() {
- mClosed = true;
- mDelayedOperations.removeCallbacks();
- cancelTask();
- closeCursor();
- }
-
- public long getCurrentMessageId() {
- return mCurrentMessageId;
- }
-
- /**
- * Set the current message id. As a result, either {@link Callback#onMessagesChanged} or
- * {@link Callback#onMessageNotFound} is called.
- */
- public void moveTo(long messageId) {
- if (mCurrentMessageId != messageId) {
- mCurrentMessageId = messageId;
- adjustCursorPosition();
- }
- }
-
- private void adjustCursorPosition() {
- mCurrentPosition = 0;
- if (mCurrentMessageId == -1) {
- return; // Current ID not specified yet.
- }
- if (mCursor == null) {
- // Task not finished yet.
- // We call adjustCursorPosition() again when we've opened a cursor.
- return;
- }
- mCursor.moveToPosition(-1);
- while (mCursor.moveToNext()
- && mCursor.getLong(EmailContent.ID_PROJECTION_COLUMN) != mCurrentMessageId) {
- mCurrentPosition++;
- }
- if (mCursor.isAfterLast()) {
- mCurrentPosition = 0;
- mCallback.onMessageNotFound(); // Message not found... Already deleted?
- } else {
- mCallback.onMessagesChanged();
- }
- }
-
- /**
- * @return true if the message set to {@link #moveTo} has an older message in the mailbox.
- * false otherwise, or unknown yet.
- */
- public boolean canMoveToOlder() {
- return (mCursor != null) && !mCursor.isLast();
- }
-
-
- /**
- * @return true if the message set to {@link #moveTo} has an newer message in the mailbox.
- * false otherwise, or unknown yet.
- */
- public boolean canMoveToNewer() {
- return (mCursor != null) && !mCursor.isFirst();
- }
-
- /**
- * Move to the older message.
- *
- * @return true iif succeed, and {@link Callback#onMessagesChanged} is called.
- */
- public boolean moveToOlder() {
- if (canMoveToOlder() && mCursor.moveToNext()) {
- mCurrentPosition++;
- setCurrentMessageIdFromCursor();
- mCallback.onMessagesChanged();
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Move to the newer message.
- *
- * @return true iif succeed, and {@link Callback#onMessagesChanged} is called.
- */
- public boolean moveToNewer() {
- if (canMoveToNewer() && mCursor.moveToPrevious()) {
- mCurrentPosition--;
- setCurrentMessageIdFromCursor();
- mCallback.onMessagesChanged();
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Task to open a Cursor on a worker thread.
- */
- private class LoadMessageListTask extends EmailAsyncTask<Void, Void, Cursor> {
- public LoadMessageListTask() {
- super(null);
- }
-
- @Override
- protected Cursor doInBackground(Void... params) {
- return openNewCursor();
- }
-
- @Override
- protected void onCancelled(Cursor cursor) {
- if (cursor != null) {
- cursor.close();
- }
- onCursorOpenDone(null);
- }
-
- @Override
- protected void onSuccess(Cursor cursor) {
- onCursorOpenDone(cursor);
- }
- }
-
- /**
- * Open a new cursor for a message list.
- *
- * This method is called on a worker thread by LoadMessageListTask.
- */
- private Cursor openNewCursor() {
- final Cursor cursor = mContentResolver.query(EmailContent.Message.CONTENT_URI,
- EmailContent.ID_PROJECTION,
- Message.buildMessageListSelection(
- mContext, mListContext.mAccountId, mListContext.getMailboxId()),
- null, EmailContent.MessageColumns.TIMESTAMP + " DESC");
- return cursor;
- }
-
- /**
- * Called when {@link #openNewCursor()} is finished.
- *
- * Unit tests call this directly to inject a mock cursor.
- */
- /* package */ void onCursorOpenDone(Cursor cursor) {
- try {
- closeCursor();
- if (cursor == null || cursor.isClosed()) {
- mTotalMessageCount = 0;
- mCurrentPosition = 0;
- return; // Task canceled
- }
- mCursor = cursor;
- mTotalMessageCount = mCursor.getCount();
- mCursor.registerContentObserver(mObserver);
- adjustCursorPosition();
- } finally {
- mLoadMessageListTask = null; // isTaskRunning() becomes false.
- }
- }
-}
diff --git a/src/com/android/email/activity/MessageViewFragment.java b/src/com/android/email/activity/MessageViewFragment.java
deleted file mode 100644
index 1c3143cd6..000000000
--- a/src/com/android/email/activity/MessageViewFragment.java
+++ /dev/null
@@ -1,525 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-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 android.view.accessibility.AccessibilityEvent;
-import android.widget.ImageView;
-import android.widget.PopupMenu;
-import android.widget.PopupMenu.OnMenuItemClickListener;
-
-import com.android.email.Email;
-import com.android.email.Preferences;
-import com.android.email.R;
-import com.android.emailcommon.mail.MeetingInfo;
-import com.android.emailcommon.mail.PackedString;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.service.EmailServiceConstants;
-import com.android.emailcommon.utility.Utility;
-
-/**
- * A {@link MessageViewFragmentBase} subclass for regular email messages. (regular as in "not eml
- * files").
- */
-public class MessageViewFragment extends MessageViewFragmentBase
- implements MoveMessageToDialog.Callback, OnMenuItemClickListener {
- /** Argument name(s) */
- private static final String ARG_MESSAGE_ID = "messageId";
-
- private ImageView mFavoriteIcon;
-
- private View mReplyButton;
-
- private View mReplyAllButton;
-
- /* Nullable - not available on phone portrait. */
- private View mForwardButton;
-
- private View mMoreButton;
-
- // calendar meeting invite answers
- private View mMeetingYes;
- private View mMeetingMaybe;
- private View mMeetingNo;
- private Drawable mFavoriteIconOn;
- private Drawable mFavoriteIconOff;
-
- /** Default to ReplyAll if true. Otherwise Reply. */
- boolean mDefaultReplyAll;
-
- /** Whether or not to enable Reply/ReplyAll and Forward buttons */
- boolean mEnableReplyForwardButtons;
-
- /** Whether or not the message can be moved from the mailbox it's in. */
- private boolean mSupportsMove;
-
- private int mPreviousMeetingResponse = EmailServiceConstants.MEETING_REQUEST_NOT_RESPONDED;
-
- /**
- * This class has more call backs than {@link MessageViewFragmentBase}.
- *
- * - EML files can't be "mark unread".
- * - EML files can't have the invite buttons or the view in calender link.
- * Note EML files can have ICS (calendar invitation) files, but we don't treat them as
- * invites. (Only exchange provider sets the FLAG_INCOMING_MEETING_INVITE
- * flag.)
- * It'd be weird to respond to an invitation in an EML that might not be addressed to you...
- */
- public interface Callback extends MessageViewFragmentBase.Callback {
- /** Called when the "view in calendar" link is clicked. */
- public void onCalendarLinkClicked(long epochEventStartTime);
-
- /**
- * Called when a calender response button is clicked.
- *
- * @param response one of {@link EmailServiceConstants#MEETING_REQUEST_ACCEPTED},
- * {@link EmailServiceConstants#MEETING_REQUEST_DECLINED}, or
- * {@link EmailServiceConstants#MEETING_REQUEST_TENTATIVE}.
- */
- public void onRespondedToInvite(int response);
-
- /** Called when the current message is set unread. */
- public void onMessageSetUnread();
-
- /**
- * Called right before the current message will be deleted or moved to another mailbox.
- *
- * Callees will usually close the fragment.
- */
- public void onBeforeMessageGone();
-
- /** Called when the forward button is pressed. */
- public void onForward();
- /** Called when the reply button is pressed. */
- public void onReply();
- /** Called when the reply-all button is pressed. */
- public void onReplyAll();
- }
-
- public static final class EmptyCallback extends MessageViewFragmentBase.EmptyCallback
- implements Callback {
- @SuppressWarnings("hiding")
- public static final Callback INSTANCE = new EmptyCallback();
-
- @Override public void onCalendarLinkClicked(long epochEventStartTime) { }
- @Override public void onMessageSetUnread() { }
- @Override public void onRespondedToInvite(int response) { }
- @Override public void onBeforeMessageGone() { }
- @Override public void onForward() { }
- @Override public void onReply() { }
- @Override public void onReplyAll() { }
- }
-
- private Callback mCallback = EmptyCallback.INSTANCE;
-
- /**
- * Create a new instance with initialization parameters.
- *
- * This fragment should be created only with this method. (Arguments should always be set.)
- *
- * @param messageId ID of the message to open
- */
- public static MessageViewFragment newInstance(long messageId) {
- if (messageId == Message.NO_MESSAGE) {
- throw new IllegalArgumentException();
- }
- final MessageViewFragment instance = new MessageViewFragment();
- final Bundle args = new Bundle();
- args.putLong(ARG_MESSAGE_ID, messageId);
- instance.setArguments(args);
- return instance;
- }
-
- /**
- * We will display the message for this ID. This must never be a special message ID such as
- * {@link Message#NO_MESSAGE}. Do NOT use directly; instead, use {@link #getMessageId()}.
- * <p><em>NOTE:</em> Although we cannot force these to be immutable using Java language
- * constructs, this <em>must</em> be considered immutable.
- */
- private Long mImmutableMessageId;
-
- private void initializeArgCache() {
- if (mImmutableMessageId != null) return;
- mImmutableMessageId = getArguments().getLong(ARG_MESSAGE_ID);
- }
-
- /**
- * @return the message ID passed to {@link #newInstance}. Safe to call even before onCreate.
- */
- public long getMessageId() {
- initializeArgCache();
- return mImmutableMessageId;
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setHasOptionsMenu(true);
-
- final Resources res = getActivity().getResources();
- mFavoriteIconOn = res.getDrawable(R.drawable.btn_star_on_convo_holo_light);
- mFavoriteIconOff = res.getDrawable(R.drawable.btn_star_off_convo_holo_light);
- }
-
- @Override
- public void onResume() {
- super.onResume();
- if (mMoreButton != null) {
- mDefaultReplyAll = Preferences.getSharedPreferences(mContext).getBoolean(
- Preferences.REPLY_ALL, Preferences.REPLY_ALL_DEFAULT);
-
- int replyVisibility = View.GONE;
- int replyAllVisibility = View.GONE;
- if (mEnableReplyForwardButtons) {
- replyVisibility = mDefaultReplyAll ? View.GONE : View.VISIBLE;
- replyAllVisibility = mDefaultReplyAll ? View.VISIBLE : View.GONE;
- }
- mReplyButton.setVisibility(replyVisibility);
- mReplyAllButton.setVisibility(replyAllVisibility);
- }
- }
-
- @Override
- public View onCreateView(
- LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- final View view = super.onCreateView(inflater, container, savedInstanceState);
-
- mFavoriteIcon = (ImageView) UiUtilities.getView(view, R.id.favorite);
- mReplyButton = UiUtilities.getView(view, R.id.reply);
- mReplyAllButton = UiUtilities.getView(view, R.id.reply_all);
- mForwardButton = UiUtilities.getViewOrNull(view, R.id.forward);
- mMeetingYes = UiUtilities.getView(view, R.id.accept);
- mMeetingMaybe = UiUtilities.getView(view, R.id.maybe);
- mMeetingNo = UiUtilities.getView(view, R.id.decline);
- mMoreButton = UiUtilities.getViewOrNull(view, R.id.more);
-
- mFavoriteIcon.setOnClickListener(this);
- mReplyButton.setOnClickListener(this);
- mReplyAllButton.setOnClickListener(this);
- if (mMoreButton != null) {
- mMoreButton.setOnClickListener(this);
- }
- if (mForwardButton != null) {
- mForwardButton.setOnClickListener(this);
- }
- mMeetingYes.setOnClickListener(this);
- mMeetingMaybe.setOnClickListener(this);
- mMeetingNo.setOnClickListener(this);
- UiUtilities.getView(view, R.id.invite_link).setOnClickListener(this);
-
- enableReplyForwardButtons(false);
-
- return view;
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- inflater.inflate(R.menu.message_view_fragment_option, menu);
- }
-
- @Override
- public void onPrepareOptionsMenu(Menu menu) {
- menu.findItem(R.id.move).setVisible(mSupportsMove);
- }
-
- private void enableReplyForwardButtons(boolean enabled) {
- mEnableReplyForwardButtons = enabled;
- // We don't have disabled button assets, so let's hide them for now
- final int visibility = enabled ? View.VISIBLE : View.GONE;
-
- // Modify Reply All button only if there's no overflow OR there is
- // overflow but default is to show the Reply All button
- if (mMoreButton == null || mDefaultReplyAll) {
- UiUtilities.setVisibilitySafe(mReplyAllButton, visibility);
- }
-
- // Modify Reply button only if there's no overflow OR there is
- // overflow but default is to show the Reply button
- if (mMoreButton == null || !mDefaultReplyAll) {
- UiUtilities.setVisibilitySafe(mReplyButton, visibility);
- }
-
- if (mForwardButton != null) {
- mForwardButton.setVisibility(visibility);
- }
- if (mMoreButton != null) {
- mMoreButton.setVisibility(visibility);
- }
- }
-
- public void setCallback(Callback callback) {
- mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback;
- super.setCallback(mCallback);
- }
-
- @Override
- protected void resetView() {
- super.resetView();
- mPreviousMeetingResponse = EmailServiceConstants.MEETING_REQUEST_NOT_RESPONDED;
- }
-
- /**
- * NOTE See the comment on the super method. It's called on a worker thread.
- */
- @Override
- protected Message openMessageSync(Activity activity) {
- return Message.restoreMessageWithId(activity, getMessageId());
- }
-
- @Override
- protected void onMessageShown(long messageId, Mailbox mailbox) {
- super.onMessageShown(messageId, mailbox);
-
- Account account = Account.restoreAccountWithId(mContext, getAccountId());
- boolean supportsMove = account.supportsMoveMessages(mContext)
- && mailbox.canHaveMessagesMoved();
- if (mSupportsMove != supportsMove) {
- mSupportsMove = supportsMove;
- Activity host = getActivity();
- if (host != null) {
- host.invalidateOptionsMenu();
- }
- }
-
- // Disable forward/reply buttons as necessary.
- enableReplyForwardButtons(Mailbox.isMailboxTypeReplyAndForwardable(mailbox.mType));
- }
-
- /**
- * Sets the content description for the star icon based on whether it's currently starred.
- */
- private void setStarContentDescription(boolean isFavorite) {
- if (isFavorite) {
- mFavoriteIcon.setContentDescription(
- mContext.getResources().getString(R.string.remove_star_action));
- } else {
- mFavoriteIcon.setContentDescription(
- mContext.getResources().getString(R.string.set_star_action));
- }
- }
-
- /**
- * Toggle favorite status and write back to provider
- */
- private void onClickFavorite() {
- if (!isMessageOpen()) return;
- Message message = getMessage();
-
- // Update UI
- boolean newFavorite = ! message.mFlagFavorite;
- mFavoriteIcon.setImageDrawable(newFavorite ? mFavoriteIconOn : mFavoriteIconOff);
-
- // Handle accessibility event
- setStarContentDescription(newFavorite);
- mFavoriteIcon.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
-
- // Update provider
- message.mFlagFavorite = newFavorite;
- getController().setMessageFavorite(message.mId, newFavorite);
- }
-
- /**
- * Set message read/unread.
- */
- public void onMarkMessageAsRead(boolean isRead) {
- if (!isMessageOpen()) return;
- Message message = getMessage();
- if (message.mFlagRead != isRead) {
- message.mFlagRead = isRead;
- getController().setMessageRead(message.mId, isRead);
- if (!isRead) { // Became unread. We need to close the message.
- mCallback.onMessageSetUnread();
- }
- }
- }
-
- /**
- * Send a service message indicating that a meeting invite button has been clicked.
- */
- private void onRespondToInvite(int response, int toastResId) {
- if (!isMessageOpen()) return;
- Message message = getMessage();
- // do not send twice in a row the same response
- if (mPreviousMeetingResponse != response) {
- getController().sendMeetingResponse(message.mId, response);
- mPreviousMeetingResponse = response;
- }
- Utility.showToast(getActivity(), toastResId);
- mCallback.onRespondedToInvite(response);
- }
-
- private void onInviteLinkClicked() {
- if (!isMessageOpen()) return;
- Message message = getMessage();
- String startTime = new PackedString(message.mMeetingInfo).get(MeetingInfo.MEETING_DTSTART);
- if (startTime != null) {
- long epochTimeMillis = Utility.parseEmailDateTimeToMillis(startTime);
- mCallback.onCalendarLinkClicked(epochTimeMillis);
- } else {
- Email.log("meetingInfo without DTSTART " + message.mMeetingInfo);
- }
- }
-
- @Override
- public void onClick(View view) {
- if (!isMessageOpen()) {
- return; // Ignore.
- }
- switch (view.getId()) {
- case R.id.reply:
- mCallback.onReply();
- return;
- case R.id.reply_all:
- mCallback.onReplyAll();
- return;
- case R.id.forward:
- mCallback.onForward();
- return;
-
- case R.id.favorite:
- onClickFavorite();
- return;
-
- case R.id.invite_link:
- onInviteLinkClicked();
- return;
-
- case R.id.accept:
- onRespondToInvite(EmailServiceConstants.MEETING_REQUEST_ACCEPTED,
- R.string.message_view_invite_toast_yes);
- return;
- case R.id.maybe:
- onRespondToInvite(EmailServiceConstants.MEETING_REQUEST_TENTATIVE,
- R.string.message_view_invite_toast_maybe);
- return;
- case R.id.decline:
- onRespondToInvite(EmailServiceConstants.MEETING_REQUEST_DECLINED,
- R.string.message_view_invite_toast_no);
- return;
-
- case R.id.more: {
- PopupMenu popup = new PopupMenu(getActivity(), mMoreButton);
- Menu menu = popup.getMenu();
- popup.getMenuInflater().inflate(R.menu.message_header_overflow_menu,
- menu);
-
- // Remove Reply if ReplyAll icon is visible or vice versa
- menu.removeItem(mDefaultReplyAll ? R.id.reply_all : R.id.reply);
- popup.setOnMenuItemClickListener(this);
- popup.show();
- break;
- }
-
- }
- super.onClick(view);
- }
-
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- if (isMessageOpen()) {
- switch (item.getItemId()) {
- case R.id.reply:
- mCallback.onReply();
- return true;
- case R.id.reply_all:
- mCallback.onReplyAll();
- return true;
- case R.id.forward:
- mCallback.onForward();
- return true;
- }
- }
- return false;
- }
-
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.move:
- onMove();
- return true;
- case R.id.delete:
- onDelete();
- return true;
- case R.id.mark_as_unread:
- onMarkAsUnread();
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- private void onMove() {
- MoveMessageToDialog dialog = MoveMessageToDialog.newInstance(new long[] {getMessageId()},
- this);
- dialog.show(getFragmentManager(), "dialog");
- }
-
- // MoveMessageToDialog$Callback
- @Override
- public void onMoveToMailboxSelected(long newMailboxId, long[] messageIds) {
- mCallback.onBeforeMessageGone();
- ActivityHelper.moveMessages(mContext, newMailboxId, messageIds);
- }
-
- private void onDelete() {
- mCallback.onBeforeMessageGone();
- ActivityHelper.deleteMessage(mContext, getMessageId());
- }
-
- private void onMarkAsUnread() {
- onMarkMessageAsRead(false);
- }
-
- /**
- * {@inheritDoc}
- *
- * Mark the current as unread.
- */
- @Override
- protected void onPostLoadBody() {
- onMarkMessageAsRead(true);
-
- // Initialize star content description for accessibility
- Message message = getMessage();
- setStarContentDescription(message.mFlagFavorite);
- }
-
- @Override
- protected void updateHeaderView(Message message) {
- super.updateHeaderView(message);
-
- mFavoriteIcon.setImageDrawable(message.mFlagFavorite ? mFavoriteIconOn : mFavoriteIconOff);
-
- // Enable the invite tab if necessary
- if ((message.mFlags & Message.FLAG_INCOMING_MEETING_INVITE) != 0) {
- addTabFlags(TAB_FLAGS_HAS_INVITE);
- }
- }
-}
diff --git a/src/com/android/email/activity/MessageViewFragmentBase.java b/src/com/android/email/activity/MessageViewFragmentBase.java
deleted file mode 100644
index 4ec0c2083..000000000
--- a/src/com/android/email/activity/MessageViewFragmentBase.java
+++ /dev/null
@@ -1,1961 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.app.DownloadManager;
-import android.app.Fragment;
-import android.app.LoaderManager.LoaderCallbacks;
-import android.content.ActivityNotFoundException;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.Context;
-import android.content.Intent;
-import android.content.Loader;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.database.ContentObserver;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.media.MediaScannerConnection;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.Handler;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.QuickContact;
-import android.text.SpannableStringBuilder;
-import android.text.TextUtils;
-import android.text.format.DateUtils;
-import android.util.Log;
-import android.util.Patterns;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.webkit.WebSettings;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-import android.widget.Button;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import com.android.email.AttachmentInfo;
-import com.android.email.Controller;
-import com.android.email.ControllerResultUiThreadWrapper;
-import com.android.email.Email;
-import com.android.email.Preferences;
-import com.android.email.R;
-import com.android.email.Throttle;
-import com.android.email.mail.internet.EmailHtmlUtil;
-import com.android.email.service.AttachmentDownloadService;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.Address;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.Attachment;
-import com.android.emailcommon.provider.EmailContent.Body;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.AttachmentUtilities;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.collect.Maps;
-
-import org.apache.commons.io.IOUtils;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Formatter;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-// TODO Better handling of config changes.
-// - Retain the content; don't kick 3 async tasks every time
-
-/**
- * Base class for {@link MessageViewFragment} and {@link MessageFileViewFragment}.
- */
-public abstract class MessageViewFragmentBase extends Fragment implements View.OnClickListener {
- private static final String BUNDLE_KEY_CURRENT_TAB = "MessageViewFragmentBase.currentTab";
- private static final String BUNDLE_KEY_PICTURE_LOADED = "MessageViewFragmentBase.pictureLoaded";
- private static final int PHOTO_LOADER_ID = 1;
- protected Context mContext;
-
- // Regex that matches start of img tag. '<(?i)img\s+'.
- private static final Pattern IMG_TAG_START_REGEX = Pattern.compile("<(?i)img\\s+");
- // Regex that matches Web URL protocol part as case insensitive.
- private static final Pattern WEB_URL_PROTOCOL = Pattern.compile("(?i)http|https://");
-
- private static int PREVIEW_ICON_WIDTH = 62;
- private static int PREVIEW_ICON_HEIGHT = 62;
-
- // The different levels of zoom: read from the Preferences.
- private static String[] sZoomSizes = null;
-
- private TextView mSubjectView;
- private TextView mFromNameView;
- private TextView mFromAddressView;
- private TextView mDateTimeView;
- private TextView mAddressesView;
- private WebView mMessageContentView;
- private LinearLayout mAttachments;
- private View mTabSection;
- private ImageView mFromBadge;
- private ImageView mSenderPresenceView;
- private View mMainView;
- private View mLoadingProgress;
- private View mDetailsCollapsed;
- private View mDetailsExpanded;
- private boolean mDetailsFilled;
-
- private TextView mMessageTab;
- private TextView mAttachmentTab;
- private TextView mInviteTab;
- // It is not really a tab, but looks like one of them.
- private TextView mShowPicturesTab;
- private View mAlwaysShowPicturesButton;
-
- private View mAttachmentsScroll;
- private View mInviteScroll;
-
- private long mAccountId = Account.NO_ACCOUNT;
- private long mMessageId = Message.NO_MESSAGE;
- private Message mMessage;
-
- private Controller mController;
- private ControllerResultUiThreadWrapper<ControllerResults> mControllerCallback;
-
- // contains the HTML body. Is used by LoadAttachmentTask to display inline images.
- // is null most of the time, is used transiently to pass info to LoadAttachementTask
- private String mHtmlTextRaw;
-
- // contains the HTML content as set in WebView.
- private String mHtmlTextWebView;
-
- private boolean mIsMessageLoadedForTest;
-
- private MessageObserver mMessageObserver;
-
- private static final int CONTACT_STATUS_STATE_UNLOADED = 0;
- private static final int CONTACT_STATUS_STATE_UNLOADED_TRIGGERED = 1;
- private static final int CONTACT_STATUS_STATE_LOADED = 2;
-
- private int mContactStatusState;
- private Uri mQuickContactLookupUri;
-
- /** Flag for {@link #mTabFlags}: Message has attachment(s) */
- protected static final int TAB_FLAGS_HAS_ATTACHMENT = 1;
-
- /**
- * Flag for {@link #mTabFlags}: Message contains invite. This flag is only set by
- * {@link MessageViewFragment}.
- */
- protected static final int TAB_FLAGS_HAS_INVITE = 2;
-
- /** Flag for {@link #mTabFlags}: Message contains pictures */
- protected static final int TAB_FLAGS_HAS_PICTURES = 4;
-
- /** Flag for {@link #mTabFlags}: "Show pictures" has already been pressed */
- protected static final int TAB_FLAGS_PICTURE_LOADED = 8;
-
- /**
- * Flags to control the tabs.
- * @see #updateTabs(int)
- */
- private int mTabFlags;
-
- /** # of attachments in the current message */
- private int mAttachmentCount;
-
- // Use (random) large values, to avoid confusion with TAB_FLAGS_*
- protected static final int TAB_MESSAGE = 101;
- protected static final int TAB_INVITE = 102;
- protected static final int TAB_ATTACHMENT = 103;
- private static final int TAB_NONE = 0;
-
- /** Current tab */
- private int mCurrentTab = TAB_NONE;
- /**
- * Tab that was selected in the previous activity instance.
- * Used to restore the current tab after screen rotation.
- */
- private int mRestoredTab = TAB_NONE;
-
- private boolean mRestoredPictureLoaded;
-
- private final EmailAsyncTask.Tracker mTaskTracker = new EmailAsyncTask.Tracker();
-
- public interface Callback {
- /**
- * Called when a link in a message is clicked.
- *
- * @param url link url that's clicked.
- * @return true if handled, false otherwise.
- */
- public boolean onUrlInMessageClicked(String url);
-
- /**
- * Called when the message specified doesn't exist, or is deleted/moved.
- */
- public void onMessageNotExists();
-
- /** Called when it starts loading a message. */
- public void onLoadMessageStarted();
-
- /** Called when it successfully finishes loading a message. */
- public void onLoadMessageFinished();
-
- /** Called when an error occurred during loading a message. */
- public void onLoadMessageError(String errorMessage);
- }
-
- public static class EmptyCallback implements Callback {
- public static final Callback INSTANCE = new EmptyCallback();
- @Override public void onLoadMessageError(String errorMessage) {}
- @Override public void onLoadMessageFinished() {}
- @Override public void onLoadMessageStarted() {}
- @Override public void onMessageNotExists() {}
- @Override
- public boolean onUrlInMessageClicked(String url) {
- return false;
- }
- }
-
- private Callback mCallback = EmptyCallback.INSTANCE;
-
- @Override
- public void onAttach(Activity activity) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onAttach");
- }
- super.onAttach(activity);
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onCreate");
- }
- super.onCreate(savedInstanceState);
-
- mContext = getActivity().getApplicationContext();
-
- // Initialize components, but don't "start" them. Registering the controller callbacks
- // and starting MessageObserver, should be done in onActivityCreated or later and be stopped
- // in onDestroyView to prevent from getting callbacks when the fragment is in the back
- // stack, but they'll start again when it's back from the back stack.
- mController = Controller.getInstance(mContext);
- mControllerCallback = new ControllerResultUiThreadWrapper<ControllerResults>(
- new Handler(), new ControllerResults());
- mMessageObserver = new MessageObserver(new Handler(), mContext);
-
- if (savedInstanceState != null) {
- restoreInstanceState(savedInstanceState);
- }
- }
-
- @Override
- public View onCreateView(
- LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onCreateView");
- }
- final View view = inflater.inflate(R.layout.message_view_fragment, container, false);
-
- cleanupDetachedViews();
-
- mSubjectView = (TextView) UiUtilities.getView(view, R.id.subject);
- mFromNameView = (TextView) UiUtilities.getView(view, R.id.from_name);
- mFromAddressView = (TextView) UiUtilities.getView(view, R.id.from_address);
- mAddressesView = (TextView) UiUtilities.getView(view, R.id.addresses);
- mDateTimeView = (TextView) UiUtilities.getView(view, R.id.datetime);
- mMessageContentView = (WebView) UiUtilities.getView(view, R.id.message_content);
- mAttachments = (LinearLayout) UiUtilities.getView(view, R.id.attachments);
- mTabSection = UiUtilities.getView(view, R.id.message_tabs_section);
- mFromBadge = (ImageView) UiUtilities.getView(view, R.id.badge);
- mSenderPresenceView = (ImageView) UiUtilities.getView(view, R.id.presence);
- mMainView = UiUtilities.getView(view, R.id.main_panel);
- mLoadingProgress = UiUtilities.getView(view, R.id.loading_progress);
- mDetailsCollapsed = UiUtilities.getView(view, R.id.sub_header_contents_collapsed);
- mDetailsExpanded = UiUtilities.getView(view, R.id.sub_header_contents_expanded);
-
- mFromNameView.setOnClickListener(this);
- mFromAddressView.setOnClickListener(this);
- mFromBadge.setOnClickListener(this);
- mSenderPresenceView.setOnClickListener(this);
-
- mMessageTab = UiUtilities.getView(view, R.id.show_message);
- mAttachmentTab = UiUtilities.getView(view, R.id.show_attachments);
- mShowPicturesTab = UiUtilities.getView(view, R.id.show_pictures);
- mAlwaysShowPicturesButton = UiUtilities.getView(view, R.id.always_show_pictures_button);
- // Invite is only used in MessageViewFragment, but visibility is controlled here.
- mInviteTab = UiUtilities.getView(view, R.id.show_invite);
-
- mMessageTab.setOnClickListener(this);
- mAttachmentTab.setOnClickListener(this);
- mShowPicturesTab.setOnClickListener(this);
- mAlwaysShowPicturesButton.setOnClickListener(this);
- mInviteTab.setOnClickListener(this);
- mDetailsCollapsed.setOnClickListener(this);
- mDetailsExpanded.setOnClickListener(this);
-
- mAttachmentsScroll = UiUtilities.getView(view, R.id.attachments_scroll);
- mInviteScroll = UiUtilities.getView(view, R.id.invite_scroll);
-
- WebSettings webSettings = mMessageContentView.getSettings();
- boolean supportMultiTouch = mContext.getPackageManager()
- .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH);
- webSettings.setDisplayZoomControls(!supportMultiTouch);
- webSettings.setSupportZoom(true);
- webSettings.setBuiltInZoomControls(true);
- mMessageContentView.setWebViewClient(new CustomWebViewClient());
- return view;
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onActivityCreated");
- }
- super.onActivityCreated(savedInstanceState);
- mController.addResultCallback(mControllerCallback);
-
- resetView();
- new LoadMessageTask(true).executeParallel();
-
- UiUtilities.installFragment(this);
- }
-
- @Override
- public void onStart() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onStart");
- }
- super.onStart();
- }
-
- @Override
- public void onResume() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onResume");
- }
- super.onResume();
-
- // We might have comes back from other full-screen activities. If so, we need to update
- // the attachment tab as system settings may have been updated that affect which
- // options are available to the user.
- updateAttachmentTab();
- }
-
- @Override
- public void onPause() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onPause");
- }
- super.onPause();
- }
-
- @Override
- public void onStop() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onStop");
- }
- super.onStop();
- }
-
- @Override
- public void onDestroyView() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onDestroyView");
- }
- UiUtilities.uninstallFragment(this);
- mController.removeResultCallback(mControllerCallback);
- cancelAllTasks();
-
- // We should clean up the Webview here, but it can't release resources until it is
- // actually removed from the view tree.
-
- super.onDestroyView();
- }
-
- private void cleanupDetachedViews() {
- // WebView cleanup must be done after it leaves the rendering tree, according to
- // its contract
- if (mMessageContentView != null) {
- mMessageContentView.destroy();
- mMessageContentView = null;
- }
- }
-
- @Override
- public void onDestroy() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onDestroy");
- }
-
- cleanupDetachedViews();
- super.onDestroy();
- }
-
- @Override
- public void onDetach() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onDetach");
- }
- super.onDetach();
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onSaveInstanceState");
- }
- super.onSaveInstanceState(outState);
- outState.putInt(BUNDLE_KEY_CURRENT_TAB, mCurrentTab);
- outState.putBoolean(BUNDLE_KEY_PICTURE_LOADED, (mTabFlags & TAB_FLAGS_PICTURE_LOADED) != 0);
- }
-
- private void restoreInstanceState(Bundle state) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " restoreInstanceState");
- }
- // At this point (in onCreate) no tabs are visible (because we don't know if the message has
- // an attachment or invite before loading it). We just remember the tab here.
- // We'll make it current when the tab first becomes visible in updateTabs().
- mRestoredTab = state.getInt(BUNDLE_KEY_CURRENT_TAB);
- mRestoredPictureLoaded = state.getBoolean(BUNDLE_KEY_PICTURE_LOADED);
- }
-
- public void setCallback(Callback callback) {
- mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback;
- }
-
- private void cancelAllTasks() {
- mMessageObserver.unregister();
- mTaskTracker.cancellAllInterrupt();
- }
-
- protected final Controller getController() {
- return mController;
- }
-
- protected final Callback getCallback() {
- return mCallback;
- }
-
- public final Message getMessage() {
- return mMessage;
- }
-
- protected final boolean isMessageOpen() {
- return mMessage != null;
- }
-
- /**
- * Returns the account id of the current message, or -1 if unknown (message not open yet, or
- * viewing an EML message).
- */
- public long getAccountId() {
- return mAccountId;
- }
-
- /**
- * Show/hide the content. We hide all the content (except for the bottom buttons) when loading,
- * to avoid flicker.
- */
- private void showContent(boolean showContent, boolean showProgressWhenHidden) {
- makeVisible(mMainView, showContent);
- makeVisible(mLoadingProgress, !showContent && showProgressWhenHidden);
- }
-
- // TODO: clean this up - most of this is not needed since the WebView and Fragment is not
- // reused for multiple messages.
- protected void resetView() {
- showContent(false, false);
- updateTabs(0);
- setCurrentTab(TAB_MESSAGE);
- if (mMessageContentView != null) {
- blockNetworkLoads(true);
- mMessageContentView.scrollTo(0, 0);
-
- // Dynamic configuration of WebView
- final WebSettings settings = mMessageContentView.getSettings();
- settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
- mMessageContentView.setInitialScale(getWebViewZoom());
- }
- mAttachmentsScroll.scrollTo(0, 0);
- mInviteScroll.scrollTo(0, 0);
- mAttachments.removeAllViews();
- mAttachments.setVisibility(View.GONE);
- initContactStatusViews();
- }
-
- /**
- * Returns the zoom scale (in percent) which is a combination of the user setting
- * (tiny, small, normal, large, huge) and the device density. The intention
- * is for the text to be physically equal in size over different density
- * screens.
- */
- private int getWebViewZoom() {
- float density = mContext.getResources().getDisplayMetrics().density;
- int zoom = Preferences.getPreferences(mContext).getTextZoom();
- if (sZoomSizes == null) {
- sZoomSizes = mContext.getResources()
- .getStringArray(R.array.general_preference_text_zoom_size);
- }
- return (int)(Float.valueOf(sZoomSizes[zoom]) * density * 100);
- }
-
- private void initContactStatusViews() {
- mContactStatusState = CONTACT_STATUS_STATE_UNLOADED;
- mQuickContactLookupUri = null;
- showDefaultQuickContactBadgeImage();
- }
-
- private void showDefaultQuickContactBadgeImage() {
- mFromBadge.setImageResource(R.drawable.ic_contact_picture);
- }
-
- protected final void addTabFlags(int tabFlags) {
- updateTabs(mTabFlags | tabFlags);
- }
-
- private final void clearTabFlags(int tabFlags) {
- updateTabs(mTabFlags & ~tabFlags);
- }
-
- private void setAttachmentCount(int count) {
- mAttachmentCount = count;
- if (mAttachmentCount > 0) {
- addTabFlags(TAB_FLAGS_HAS_ATTACHMENT);
- } else {
- clearTabFlags(TAB_FLAGS_HAS_ATTACHMENT);
- }
- }
-
- private static void makeVisible(View v, boolean visible) {
- final int visibility = visible ? View.VISIBLE : View.GONE;
- if ((v != null) && (v.getVisibility() != visibility)) {
- v.setVisibility(visibility);
- }
- }
-
- private static boolean isVisible(View v) {
- return (v != null) && (v.getVisibility() == View.VISIBLE);
- }
-
- /**
- * Update the visual of the tabs. (visibility, text, etc)
- */
- private void updateTabs(int tabFlags) {
- mTabFlags = tabFlags;
-
- if (getView() == null) {
- return;
- }
-
- boolean messageTabVisible = (tabFlags & (TAB_FLAGS_HAS_INVITE | TAB_FLAGS_HAS_ATTACHMENT))
- != 0;
- makeVisible(mMessageTab, messageTabVisible);
- makeVisible(mInviteTab, (tabFlags & TAB_FLAGS_HAS_INVITE) != 0);
- makeVisible(mAttachmentTab, (tabFlags & TAB_FLAGS_HAS_ATTACHMENT) != 0);
-
- final boolean hasPictures = (tabFlags & TAB_FLAGS_HAS_PICTURES) != 0;
- final boolean pictureLoaded = (tabFlags & TAB_FLAGS_PICTURE_LOADED) != 0;
- makeVisible(mShowPicturesTab, hasPictures && !pictureLoaded);
-
- mAttachmentTab.setText(mContext.getResources().getQuantityString(
- R.plurals.message_view_show_attachments_action,
- mAttachmentCount, mAttachmentCount));
-
- // Hide the entire section if no tabs are visible.
- makeVisible(mTabSection, isVisible(mMessageTab) || isVisible(mInviteTab)
- || isVisible(mAttachmentTab) || isVisible(mShowPicturesTab)
- || isVisible(mAlwaysShowPicturesButton));
-
- // Restore previously selected tab after rotation
- if (mRestoredTab != TAB_NONE && isVisible(getTabViewForFlag(mRestoredTab))) {
- setCurrentTab(mRestoredTab);
- mRestoredTab = TAB_NONE;
- }
- }
-
- /**
- * Set the current tab.
- *
- * @param tab any of {@link #TAB_MESSAGE}, {@link #TAB_ATTACHMENT} or {@link #TAB_INVITE}.
- */
- private void setCurrentTab(int tab) {
- mCurrentTab = tab;
-
- // Hide & unselect all tabs
- makeVisible(getTabContentViewForFlag(TAB_MESSAGE), false);
- makeVisible(getTabContentViewForFlag(TAB_ATTACHMENT), false);
- makeVisible(getTabContentViewForFlag(TAB_INVITE), false);
- getTabViewForFlag(TAB_MESSAGE).setSelected(false);
- getTabViewForFlag(TAB_ATTACHMENT).setSelected(false);
- getTabViewForFlag(TAB_INVITE).setSelected(false);
-
- makeVisible(getTabContentViewForFlag(mCurrentTab), true);
- getTabViewForFlag(mCurrentTab).setSelected(true);
- }
-
- private View getTabViewForFlag(int tabFlag) {
- switch (tabFlag) {
- case TAB_MESSAGE:
- return mMessageTab;
- case TAB_ATTACHMENT:
- return mAttachmentTab;
- case TAB_INVITE:
- return mInviteTab;
- }
- throw new IllegalArgumentException();
- }
-
- private View getTabContentViewForFlag(int tabFlag) {
- switch (tabFlag) {
- case TAB_MESSAGE:
- return mMessageContentView;
- case TAB_ATTACHMENT:
- return mAttachmentsScroll;
- case TAB_INVITE:
- return mInviteScroll;
- }
- throw new IllegalArgumentException();
- }
-
- private void blockNetworkLoads(boolean block) {
- if (mMessageContentView != null) {
- mMessageContentView.getSettings().setBlockNetworkLoads(block);
- }
- }
-
- private void setMessageHtml(String html) {
- if (html == null) {
- html = "";
- }
- if (mMessageContentView != null) {
- mMessageContentView.loadDataWithBaseURL("email://", html, "text/html", "utf-8", null);
- }
- }
-
- /**
- * Handle clicks on sender, which shows {@link QuickContact} or prompts to add
- * the sender as a contact.
- */
- private void onClickSender() {
- if (!isMessageOpen()) return;
- final Address senderEmail = Address.unpackFirst(mMessage.mFrom);
- if (senderEmail == null) return;
-
- if (mContactStatusState == CONTACT_STATUS_STATE_UNLOADED) {
- // Status not loaded yet.
- mContactStatusState = CONTACT_STATUS_STATE_UNLOADED_TRIGGERED;
- return;
- }
- if (mContactStatusState == CONTACT_STATUS_STATE_UNLOADED_TRIGGERED) {
- return; // Already clicked, and waiting for the data.
- }
-
- if (mQuickContactLookupUri != null) {
- QuickContact.showQuickContact(mContext, mFromBadge, mQuickContactLookupUri,
- QuickContact.MODE_MEDIUM, null);
- } else {
- // No matching contact, ask user to create one
- final Uri mailUri = Uri.fromParts("mailto", senderEmail.getAddress(), null);
- final Intent intent = new Intent(ContactsContract.Intents.SHOW_OR_CREATE_CONTACT,
- mailUri);
-
- // Only provide personal name hint if we have one
- final String senderPersonal = senderEmail.getPersonal();
- if (!TextUtils.isEmpty(senderPersonal)) {
- intent.putExtra(ContactsContract.Intents.Insert.NAME, senderPersonal);
- }
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
-
- startActivity(intent);
- }
- }
-
- private static class ContactStatusLoaderCallbacks
- implements LoaderCallbacks<ContactStatusLoader.Result> {
- private static final String BUNDLE_EMAIL_ADDRESS = "email";
- private final MessageViewFragmentBase mFragment;
-
- public ContactStatusLoaderCallbacks(MessageViewFragmentBase fragment) {
- mFragment = fragment;
- }
-
- public static Bundle createArguments(String emailAddress) {
- Bundle b = new Bundle();
- b.putString(BUNDLE_EMAIL_ADDRESS, emailAddress);
- return b;
- }
-
- @Override
- public Loader<ContactStatusLoader.Result> onCreateLoader(int id, Bundle args) {
- return new ContactStatusLoader(mFragment.mContext,
- args.getString(BUNDLE_EMAIL_ADDRESS));
- }
-
- @Override
- public void onLoadFinished(Loader<ContactStatusLoader.Result> loader,
- ContactStatusLoader.Result result) {
- boolean triggered =
- (mFragment.mContactStatusState == CONTACT_STATUS_STATE_UNLOADED_TRIGGERED);
- mFragment.mContactStatusState = CONTACT_STATUS_STATE_LOADED;
- mFragment.mQuickContactLookupUri = result.mLookupUri;
-
- if (result.isUnknown()) {
- mFragment.mSenderPresenceView.setVisibility(View.GONE);
- } else {
- mFragment.mSenderPresenceView.setVisibility(View.VISIBLE);
- mFragment.mSenderPresenceView.setImageResource(result.mPresenceResId);
- }
- if (result.mPhoto != null) { // photo will be null if unknown.
- mFragment.mFromBadge.setImageBitmap(result.mPhoto);
- }
- if (triggered) {
- mFragment.onClickSender();
- }
- }
-
- @Override
- public void onLoaderReset(Loader<ContactStatusLoader.Result> loader) {
- }
- }
-
- private void onSaveAttachment(MessageViewAttachmentInfo info) {
- if (!Utility.isExternalStorageMounted()) {
- /*
- * Abort early if there's no place to save the attachment. We don't want to spend
- * the time downloading it and then abort.
- */
- Utility.showToast(getActivity(), R.string.message_view_status_attachment_not_saved);
- return;
- }
-
- if (info.isFileSaved()) {
- // Nothing to do - we have the file saved.
- return;
- }
-
- File savedFile = performAttachmentSave(info);
- if (savedFile != null) {
- Utility.showToast(getActivity(), String.format(
- mContext.getString(R.string.message_view_status_attachment_saved),
- savedFile.getName()));
- } else {
- Utility.showToast(getActivity(), R.string.message_view_status_attachment_not_saved);
- }
- }
-
- private File performAttachmentSave(MessageViewAttachmentInfo info) {
- Attachment attachment = Attachment.restoreAttachmentWithId(mContext, info.mId);
- Uri attachmentUri = AttachmentUtilities.getAttachmentUri(mAccountId, attachment.mId);
-
- try {
- File downloads = Environment.getExternalStoragePublicDirectory(
- Environment.DIRECTORY_DOWNLOADS);
- downloads.mkdirs();
- File file = Utility.createUniqueFile(downloads, attachment.mFileName);
- Uri contentUri = AttachmentUtilities.resolveAttachmentIdToContentUri(
- mContext.getContentResolver(), attachmentUri);
- InputStream in = mContext.getContentResolver().openInputStream(contentUri);
- OutputStream out = new FileOutputStream(file);
- IOUtils.copy(in, out);
- out.flush();
- out.close();
- in.close();
-
- String absolutePath = file.getAbsolutePath();
-
- // Although the download manager can scan media files, scanning only happens after the
- // user clicks on the item in the Downloads app. So, we run the attachment through
- // the media scanner ourselves so it gets added to gallery / music immediately.
- MediaScannerConnection.scanFile(mContext, new String[] {absolutePath},
- null, null);
-
- DownloadManager dm =
- (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
- dm.addCompletedDownload(info.mName, info.mName,
- false /* do not use media scanner */,
- info.mContentType, absolutePath, info.mSize,
- true /* show notification */);
-
- // Cache the stored file information.
- info.setSavedPath(absolutePath);
-
- // Update our buttons.
- updateAttachmentButtons(info);
-
- return file;
-
- } catch (IOException ioe) {
- // Ignore. Callers will handle it from the return code.
- }
-
- return null;
- }
-
- private void onOpenAttachment(MessageViewAttachmentInfo info) {
- if (info.mAllowInstall) {
- // The package installer is unable to install files from a content URI; it must be
- // given a file path. Therefore, we need to save it first in order to proceed
- if (!info.mAllowSave || !Utility.isExternalStorageMounted()) {
- Utility.showToast(getActivity(), R.string.message_view_status_attachment_not_saved);
- return;
- }
-
- if (!info.isFileSaved()) {
- if (performAttachmentSave(info) == null) {
- // Saving failed for some reason - bail.
- Utility.showToast(
- getActivity(), R.string.message_view_status_attachment_not_saved);
- return;
- }
- }
- }
- try {
- Intent intent = info.getAttachmentIntent(mContext, mAccountId);
- startActivity(intent);
- } catch (ActivityNotFoundException e) {
- Utility.showToast(getActivity(), R.string.message_view_display_attachment_toast);
- }
- }
-
- private void onInfoAttachment(final MessageViewAttachmentInfo attachment) {
- AttachmentInfoDialog dialog =
- AttachmentInfoDialog.newInstance(getActivity(), attachment.mDenyFlags);
- dialog.show(getActivity().getFragmentManager(), null);
- }
-
- private void onLoadAttachment(final MessageViewAttachmentInfo attachment) {
- attachment.loadButton.setVisibility(View.GONE);
- // If there's nothing in the download queue, we'll probably start right away so wait a
- // second before showing the cancel button
- if (AttachmentDownloadService.getQueueSize() == 0) {
- // Set to invisible; if the button is still in this state one second from now, we'll
- // assume the download won't start right away, and we make the cancel button visible
- attachment.cancelButton.setVisibility(View.GONE);
- // Create the timed task that will change the button state
- new EmailAsyncTask<Void, Void, Void>(mTaskTracker) {
- @Override
- protected Void doInBackground(Void... params) {
- try {
- Thread.sleep(1000L);
- } catch (InterruptedException e) { }
- return null;
- }
- @Override
- protected void onSuccess(Void result) {
- // If the timeout completes and the attachment has not loaded, show cancel
- if (!attachment.loaded) {
- attachment.cancelButton.setVisibility(View.VISIBLE);
- }
- }
- }.executeParallel();
- } else {
- attachment.cancelButton.setVisibility(View.VISIBLE);
- }
- attachment.showProgressIndeterminate();
- mController.loadAttachment(attachment.mId, mMessageId, mAccountId);
- }
-
- private void onCancelAttachment(MessageViewAttachmentInfo attachment) {
- // Don't change button states if we couldn't cancel the download
- if (AttachmentDownloadService.cancelQueuedAttachment(attachment.mId)) {
- attachment.loadButton.setVisibility(View.VISIBLE);
- attachment.cancelButton.setVisibility(View.GONE);
- attachment.hideProgress();
- }
- }
-
- /**
- * Called by ControllerResults. Show the "View" and "Save" buttons; hide "Load" and "Stop"
- *
- * @param attachmentId the attachment that was just downloaded
- */
- private void doFinishLoadAttachment(long attachmentId) {
- MessageViewAttachmentInfo info = findAttachmentInfo(attachmentId);
- if (info != null) {
- info.loaded = true;
- updateAttachmentButtons(info);
- }
- }
-
- private void showPicturesInHtml() {
- boolean picturesAlreadyLoaded = (mTabFlags & TAB_FLAGS_PICTURE_LOADED) != 0;
- if ((mMessageContentView != null) && !picturesAlreadyLoaded) {
- blockNetworkLoads(false);
- // TODO: why is this calling setMessageHtml just because the images can load now?
- setMessageHtml(mHtmlTextWebView);
-
- // Prompt the user to always show images from this sender.
- makeVisible(UiUtilities.getView(getView(), R.id.always_show_pictures_button), true);
-
- addTabFlags(TAB_FLAGS_PICTURE_LOADED);
- }
- }
-
- private void showDetails() {
- if (!isMessageOpen()) {
- return;
- }
-
- if (!mDetailsFilled) {
- String date = formatDate(mMessage.mTimeStamp, true);
- final String SEPARATOR = "\n";
- String to = Address.toString(Address.unpack(mMessage.mTo), SEPARATOR);
- String cc = Address.toString(Address.unpack(mMessage.mCc), SEPARATOR);
- String bcc = Address.toString(Address.unpack(mMessage.mBcc), SEPARATOR);
- setDetailsRow(mDetailsExpanded, date, R.id.date, R.id.date_row);
- setDetailsRow(mDetailsExpanded, to, R.id.to, R.id.to_row);
- setDetailsRow(mDetailsExpanded, cc, R.id.cc, R.id.cc_row);
- setDetailsRow(mDetailsExpanded, bcc, R.id.bcc, R.id.bcc_row);
- mDetailsFilled = true;
- }
-
- mDetailsCollapsed.setVisibility(View.GONE);
- mDetailsExpanded.setVisibility(View.VISIBLE);
- }
-
- private void hideDetails() {
- mDetailsCollapsed.setVisibility(View.VISIBLE);
- mDetailsExpanded.setVisibility(View.GONE);
- }
-
- private static void setDetailsRow(View root, String text, int textViewId, int rowViewId) {
- if (TextUtils.isEmpty(text)) {
- root.findViewById(rowViewId).setVisibility(View.GONE);
- return;
- }
- ((TextView) UiUtilities.getView(root, textViewId)).setText(text);
- }
-
-
- @Override
- public void onClick(View view) {
- if (!isMessageOpen()) {
- return; // Ignore.
- }
- switch (view.getId()) {
- case R.id.badge:
- onClickSender();
- break;
- case R.id.load:
- onLoadAttachment((MessageViewAttachmentInfo) view.getTag());
- break;
- case R.id.info:
- onInfoAttachment((MessageViewAttachmentInfo) view.getTag());
- break;
- case R.id.save:
- onSaveAttachment((MessageViewAttachmentInfo) view.getTag());
- break;
- case R.id.open:
- onOpenAttachment((MessageViewAttachmentInfo) view.getTag());
- break;
- case R.id.cancel:
- onCancelAttachment((MessageViewAttachmentInfo) view.getTag());
- break;
- case R.id.show_message:
- setCurrentTab(TAB_MESSAGE);
- break;
- case R.id.show_invite:
- setCurrentTab(TAB_INVITE);
- break;
- case R.id.show_attachments:
- setCurrentTab(TAB_ATTACHMENT);
- break;
- case R.id.show_pictures:
- showPicturesInHtml();
- break;
- case R.id.always_show_pictures_button:
- setShowImagesForSender();
- break;
- case R.id.sub_header_contents_collapsed:
- showDetails();
- break;
- case R.id.sub_header_contents_expanded:
- hideDetails();
- break;
- }
- }
-
- /**
- * Start loading contact photo and presence.
- */
- private void queryContactStatus() {
- if (!isMessageOpen()) return;
- initContactStatusViews(); // Initialize the state, just in case.
-
- // Find the sender email address, and start presence check.
- Address sender = Address.unpackFirst(mMessage.mFrom);
- if (sender != null) {
- String email = sender.getAddress();
- if (email != null) {
- getLoaderManager().restartLoader(PHOTO_LOADER_ID,
- ContactStatusLoaderCallbacks.createArguments(email),
- new ContactStatusLoaderCallbacks(this));
- }
- }
- }
-
- /**
- * Called by {@link LoadMessageTask} and {@link ReloadMessageTask} to load a message in a
- * subclass specific way.
- *
- * NOTE This method is called on a worker thread! Implementations must properly synchronize
- * when accessing members.
- *
- * @param activity the parent activity. Subclass use it as a context, and to show a toast.
- */
- protected abstract Message openMessageSync(Activity activity);
-
- /**
- * Called in a background thread to reload a new copy of the Message in case something has
- * changed.
- */
- protected Message reloadMessageSync(Activity activity) {
- return openMessageSync(activity);
- }
-
- /**
- * Async task for loading a single message outside of the UI thread
- */
- private class LoadMessageTask extends EmailAsyncTask<Void, Void, Message> {
-
- private final boolean mOkToFetch;
- private Mailbox mMailbox;
-
- /**
- * Special constructor to cache some local info
- */
- public LoadMessageTask(boolean okToFetch) {
- super(mTaskTracker);
- mOkToFetch = okToFetch;
- }
-
- @Override
- protected Message doInBackground(Void... params) {
- Activity activity = getActivity();
- Message message = null;
- if (activity != null) {
- message = openMessageSync(activity);
- }
- if (message != null) {
- mMailbox = Mailbox.restoreMailboxWithId(mContext, message.mMailboxKey);
- if (mMailbox == null) {
- message = null; // mailbox removed??
- }
- }
- return message;
- }
-
- @Override
- protected void onSuccess(Message message) {
- if (message == null) {
- resetView();
- mCallback.onMessageNotExists();
- return;
- }
- mMessageId = message.mId;
-
- reloadUiFromMessage(message, mOkToFetch);
- queryContactStatus();
- onMessageShown(mMessageId, mMailbox);
- RecentMailboxManager.getInstance(mContext).touch(mAccountId, message.mMailboxKey);
- }
- }
-
- /**
- * Kicked by {@link MessageObserver}. Reload the message and update the views.
- */
- private class ReloadMessageTask extends EmailAsyncTask<Void, Void, Message> {
- public ReloadMessageTask() {
- super(mTaskTracker);
- }
-
- @Override
- protected Message doInBackground(Void... params) {
- Activity activity = getActivity();
- if (activity == null) {
- return null;
- } else {
- return reloadMessageSync(activity);
- }
- }
-
- @Override
- protected void onSuccess(Message message) {
- if (message == null || message.mMailboxKey != mMessage.mMailboxKey) {
- // Message deleted or moved.
- mCallback.onMessageNotExists();
- return;
- }
- mMessage = message;
- updateHeaderView(mMessage);
- }
- }
-
- /**
- * Called when a message is shown to the user.
- */
- protected void onMessageShown(long messageId, Mailbox mailbox) {
- }
-
- /**
- * Called when the message body is loaded.
- */
- protected void onPostLoadBody() {
- }
-
- /**
- * Async task for loading a single message body outside of the UI thread
- */
- private class LoadBodyTask extends EmailAsyncTask<Void, Void, String[]> {
-
- private final long mId;
- private boolean mErrorLoadingMessageBody;
- private final boolean mAutoShowPictures;
-
- /**
- * Special constructor to cache some local info
- */
- public LoadBodyTask(long messageId, boolean autoShowPictures) {
- super(mTaskTracker);
- mId = messageId;
- mAutoShowPictures = autoShowPictures;
- }
-
- @Override
- protected String[] doInBackground(Void... params) {
- try {
- String text = null;
- String html = Body.restoreBodyHtmlWithMessageId(mContext, mId);
- if (html == null) {
- text = Body.restoreBodyTextWithMessageId(mContext, mId);
- }
- return new String[] { text, html };
- } catch (RuntimeException re) {
- // This catches SQLiteException as well as other RTE's we've seen from the
- // database calls, such as IllegalStateException
- Log.d(Logging.LOG_TAG, "Exception while loading message body", re);
- mErrorLoadingMessageBody = true;
- return null;
- }
- }
-
- @Override
- protected void onSuccess(String[] results) {
- if (results == null) {
- if (mErrorLoadingMessageBody) {
- Utility.showToast(getActivity(), R.string.error_loading_message_body);
- }
- resetView();
- return;
- }
- reloadUiFromBody(results[0], results[1], mAutoShowPictures); // text, html
- onPostLoadBody();
- }
- }
-
- /**
- * Async task for loading attachments
- *
- * Note: This really should only be called when the message load is complete - or, we should
- * leave open a listener so the attachments can fill in as they are discovered. In either case,
- * this implementation is incomplete, as it will fail to refresh properly if the message is
- * partially loaded at this time.
- */
- private class LoadAttachmentsTask extends EmailAsyncTask<Long, Void, Attachment[]> {
- public LoadAttachmentsTask() {
- super(mTaskTracker);
- }
-
- @Override
- protected Attachment[] doInBackground(Long... messageIds) {
- return Attachment.restoreAttachmentsWithMessageId(mContext, messageIds[0]);
- }
-
- @Override
- protected void onSuccess(Attachment[] attachments) {
- try {
- if (attachments == null) {
- return;
- }
- boolean htmlChanged = false;
- int numDisplayedAttachments = 0;
- for (Attachment attachment : attachments) {
- if (mHtmlTextRaw != null && attachment.mContentId != null
- && attachment.mContentUri != null) {
- // for html body, replace CID for inline images
- // Regexp which matches ' src="cid:contentId"'.
- String contentIdRe =
- "\\s+(?i)src=\"cid(?-i):\\Q" + attachment.mContentId + "\\E\"";
- String srcContentUri = " src=\"" + attachment.mContentUri + "\"";
- mHtmlTextRaw = mHtmlTextRaw.replaceAll(contentIdRe, srcContentUri);
- htmlChanged = true;
- } else {
- addAttachment(attachment);
- numDisplayedAttachments++;
- }
- }
- setAttachmentCount(numDisplayedAttachments);
- mHtmlTextWebView = mHtmlTextRaw;
- mHtmlTextRaw = null;
- if (htmlChanged) {
- setMessageHtml(mHtmlTextWebView);
- }
- } finally {
- showContent(true, false);
- }
- }
- }
-
- private static Bitmap getPreviewIcon(Context context, AttachmentInfo attachment) {
- try {
- return BitmapFactory.decodeStream(
- context.getContentResolver().openInputStream(
- AttachmentUtilities.getAttachmentThumbnailUri(
- attachment.mAccountKey, attachment.mId,
- PREVIEW_ICON_WIDTH,
- PREVIEW_ICON_HEIGHT)));
- } catch (Exception e) {
- Log.d(Logging.LOG_TAG, "Attachment preview failed with exception " + e.getMessage());
- return null;
- }
- }
-
- /**
- * Subclass of AttachmentInfo which includes our views and buttons related to attachment
- * handling, as well as our determination of suitability for viewing (based on availability of
- * a viewer app) and saving (based upon the presence of external storage)
- */
- private static class MessageViewAttachmentInfo extends AttachmentInfo {
- private Button openButton;
- private Button saveButton;
- private Button loadButton;
- private Button infoButton;
- private Button cancelButton;
- private ImageView iconView;
-
- private static final Map<AttachmentInfo, String> sSavedFileInfos = Maps.newHashMap();
-
- // Don't touch it directly from the outer class.
- private final ProgressBar mProgressView;
- private boolean loaded;
-
- private MessageViewAttachmentInfo(Context context, Attachment attachment,
- ProgressBar progressView) {
- super(context, attachment);
- mProgressView = progressView;
- }
-
- /**
- * Create a new attachment info based upon an existing attachment info. Display
- * related fields (such as views and buttons) are copied from old to new.
- */
- private MessageViewAttachmentInfo(Context context, MessageViewAttachmentInfo oldInfo) {
- super(context, oldInfo);
- openButton = oldInfo.openButton;
- saveButton = oldInfo.saveButton;
- loadButton = oldInfo.loadButton;
- infoButton = oldInfo.infoButton;
- cancelButton = oldInfo.cancelButton;
- iconView = oldInfo.iconView;
- mProgressView = oldInfo.mProgressView;
- loaded = oldInfo.loaded;
- }
-
- public void hideProgress() {
- // Don't use GONE, which'll break the layout.
- if (mProgressView.getVisibility() != View.INVISIBLE) {
- mProgressView.setVisibility(View.INVISIBLE);
- }
- }
-
- public void showProgress(int progress) {
- if (mProgressView.getVisibility() != View.VISIBLE) {
- mProgressView.setVisibility(View.VISIBLE);
- }
- if (mProgressView.isIndeterminate()) {
- mProgressView.setIndeterminate(false);
- }
- mProgressView.setProgress(progress);
-
- // Hide on completion.
- if (progress == 100) {
- hideProgress();
- }
- }
-
- public void showProgressIndeterminate() {
- if (mProgressView.getVisibility() != View.VISIBLE) {
- mProgressView.setVisibility(View.VISIBLE);
- }
- if (!mProgressView.isIndeterminate()) {
- mProgressView.setIndeterminate(true);
- }
- }
-
- /**
- * Determines whether or not this attachment has a saved file in the external storage. That
- * is, the user has at some point clicked "save" for this attachment.
- *
- * Note: this is an approximation and uses an in-memory cache that can get wiped when the
- * process dies, and so is somewhat conservative. Additionally, the user can modify the file
- * after saving, and so the file may not be the same (though this is unlikely).
- */
- public boolean isFileSaved() {
- String path = getSavedPath();
- if (path == null) {
- return false;
- }
- boolean savedFileExists = new File(path).exists();
- if (!savedFileExists) {
- // Purge the cache entry.
- setSavedPath(null);
- }
- return savedFileExists;
- }
-
- private void setSavedPath(String path) {
- if (path == null) {
- sSavedFileInfos.remove(this);
- } else {
- sSavedFileInfos.put(this, path);
- }
- }
-
- /**
- * Returns an absolute file path for the given attachment if it has been saved. If one is
- * not found, {@code null} is returned.
- *
- * Clients are expected to validate that the file at the given path is still valid.
- */
- private String getSavedPath() {
- return sSavedFileInfos.get(this);
- }
-
- @Override
- protected Uri getUriForIntent(Context context, long accountId) {
- // Prefer to act on the saved file for intents.
- String path = getSavedPath();
- return (path != null)
- ? Uri.parse("file://" + getSavedPath())
- : super.getUriForIntent(context, accountId);
- }
- }
-
- /**
- * Updates all current attachments on the attachment tab.
- */
- private void updateAttachmentTab() {
- for (int i = 0, count = mAttachments.getChildCount(); i < count; i++) {
- View view = mAttachments.getChildAt(i);
- MessageViewAttachmentInfo oldInfo = (MessageViewAttachmentInfo)view.getTag();
- MessageViewAttachmentInfo newInfo =
- new MessageViewAttachmentInfo(getActivity(), oldInfo);
- updateAttachmentButtons(newInfo);
- view.setTag(newInfo);
- }
- }
-
- /**
- * Updates the attachment buttons. Adjusts the visibility of the buttons as well
- * as updating any tag information associated with the buttons.
- */
- private void updateAttachmentButtons(MessageViewAttachmentInfo attachmentInfo) {
- ImageView attachmentIcon = attachmentInfo.iconView;
- Button openButton = attachmentInfo.openButton;
- Button saveButton = attachmentInfo.saveButton;
- Button loadButton = attachmentInfo.loadButton;
- Button infoButton = attachmentInfo.infoButton;
- Button cancelButton = attachmentInfo.cancelButton;
-
- if (!attachmentInfo.mAllowView) {
- openButton.setVisibility(View.GONE);
- }
- if (!attachmentInfo.mAllowSave) {
- saveButton.setVisibility(View.GONE);
- }
-
- if (!attachmentInfo.mAllowView && !attachmentInfo.mAllowSave) {
- // This attachment may never be viewed or saved, so block everything
- attachmentInfo.hideProgress();
- openButton.setVisibility(View.GONE);
- saveButton.setVisibility(View.GONE);
- loadButton.setVisibility(View.GONE);
- cancelButton.setVisibility(View.GONE);
- infoButton.setVisibility(View.VISIBLE);
- } else if (attachmentInfo.loaded) {
- // If the attachment is loaded, show 100% progress
- // Note that for POP3 messages, the user will only see "Open" and "Save",
- // because the entire message is loaded before being shown.
- // Hide "Load" and "Info", show "View" and "Save"
- attachmentInfo.showProgress(100);
- if (attachmentInfo.mAllowSave) {
- saveButton.setVisibility(View.VISIBLE);
-
- boolean isFileSaved = attachmentInfo.isFileSaved();
- saveButton.setEnabled(!isFileSaved);
- if (!isFileSaved) {
- saveButton.setText(R.string.message_view_attachment_save_action);
- } else {
- saveButton.setText(R.string.message_view_attachment_saved);
- }
- }
- if (attachmentInfo.mAllowView) {
- // Set the attachment action button text accordingly
- if (attachmentInfo.mContentType.startsWith("audio/") ||
- attachmentInfo.mContentType.startsWith("video/")) {
- openButton.setText(R.string.message_view_attachment_play_action);
- } else if (attachmentInfo.mAllowInstall) {
- openButton.setText(R.string.message_view_attachment_install_action);
- } else {
- openButton.setText(R.string.message_view_attachment_view_action);
- }
- openButton.setVisibility(View.VISIBLE);
- }
- if (attachmentInfo.mDenyFlags == AttachmentInfo.ALLOW) {
- infoButton.setVisibility(View.GONE);
- } else {
- infoButton.setVisibility(View.VISIBLE);
- }
- loadButton.setVisibility(View.GONE);
- cancelButton.setVisibility(View.GONE);
-
- updatePreviewIcon(attachmentInfo);
- } else {
- // The attachment is not loaded, so present UI to start downloading it
-
- // Show "Load"; hide "View", "Save" and "Info"
- saveButton.setVisibility(View.GONE);
- openButton.setVisibility(View.GONE);
- infoButton.setVisibility(View.GONE);
-
- // If the attachment is queued, show the indeterminate progress bar. From this point,.
- // any progress changes will cause this to be replaced by the normal progress bar
- if (AttachmentDownloadService.isAttachmentQueued(attachmentInfo.mId)) {
- attachmentInfo.showProgressIndeterminate();
- loadButton.setVisibility(View.GONE);
- cancelButton.setVisibility(View.VISIBLE);
- } else {
- loadButton.setVisibility(View.VISIBLE);
- cancelButton.setVisibility(View.GONE);
- }
- }
- openButton.setTag(attachmentInfo);
- saveButton.setTag(attachmentInfo);
- loadButton.setTag(attachmentInfo);
- infoButton.setTag(attachmentInfo);
- cancelButton.setTag(attachmentInfo);
- }
-
- /**
- * Copy data from a cursor-refreshed attachment into the UI. Called from UI thread.
- *
- * @param attachment A single attachment loaded from the provider
- */
- private void addAttachment(Attachment attachment) {
- LayoutInflater inflater = getActivity().getLayoutInflater();
- View view = inflater.inflate(R.layout.message_view_attachment, null);
-
- TextView attachmentName = (TextView) UiUtilities.getView(view, R.id.attachment_name);
- TextView attachmentInfoView = (TextView) UiUtilities.getView(view, R.id.attachment_info);
- ImageView attachmentIcon = (ImageView) UiUtilities.getView(view, R.id.attachment_icon);
- Button openButton = (Button) UiUtilities.getView(view, R.id.open);
- Button saveButton = (Button) UiUtilities.getView(view, R.id.save);
- Button loadButton = (Button) UiUtilities.getView(view, R.id.load);
- Button infoButton = (Button) UiUtilities.getView(view, R.id.info);
- Button cancelButton = (Button) UiUtilities.getView(view, R.id.cancel);
- ProgressBar attachmentProgress = (ProgressBar) UiUtilities.getView(view, R.id.progress);
-
- MessageViewAttachmentInfo attachmentInfo = new MessageViewAttachmentInfo(
- mContext, attachment, attachmentProgress);
-
- // Check whether the attachment already exists
- if (Utility.attachmentExists(mContext, attachment)) {
- attachmentInfo.loaded = true;
- }
-
- attachmentInfo.openButton = openButton;
- attachmentInfo.saveButton = saveButton;
- attachmentInfo.loadButton = loadButton;
- attachmentInfo.infoButton = infoButton;
- attachmentInfo.cancelButton = cancelButton;
- attachmentInfo.iconView = attachmentIcon;
-
- updateAttachmentButtons(attachmentInfo);
-
- view.setTag(attachmentInfo);
- openButton.setOnClickListener(this);
- saveButton.setOnClickListener(this);
- loadButton.setOnClickListener(this);
- infoButton.setOnClickListener(this);
- cancelButton.setOnClickListener(this);
-
- attachmentName.setText(attachmentInfo.mName);
- attachmentInfoView.setText(UiUtilities.formatSize(mContext, attachmentInfo.mSize));
-
- mAttachments.addView(view);
- mAttachments.setVisibility(View.VISIBLE);
- }
-
- private MessageViewAttachmentInfo findAttachmentInfoFromView(long attachmentId) {
- for (int i = 0, count = mAttachments.getChildCount(); i < count; i++) {
- MessageViewAttachmentInfo attachmentInfo =
- (MessageViewAttachmentInfo) mAttachments.getChildAt(i).getTag();
- if (attachmentInfo.mId == attachmentId) {
- return attachmentInfo;
- }
- }
- return null;
- }
-
- /**
- * Reload the UI from a provider cursor. {@link LoadMessageTask#onSuccess} calls it.
- *
- * Update the header views, and start loading the body.
- *
- * @param message A copy of the message loaded from the database
- * @param okToFetch If true, and message is not fully loaded, it's OK to fetch from
- * the network. Use false to prevent looping here.
- */
- protected void reloadUiFromMessage(Message message, boolean okToFetch) {
- mMessage = message;
- mAccountId = message.mAccountKey;
-
- mMessageObserver.register(ContentUris.withAppendedId(Message.CONTENT_URI, mMessage.mId));
-
- updateHeaderView(mMessage);
-
- // Handle partially-loaded email, as follows:
- // 1. Check value of message.mFlagLoaded
- // 2. If != LOADED, ask controller to load it
- // 3. Controller callback (after loaded) should trigger LoadBodyTask & LoadAttachmentsTask
- // 4. Else start the loader tasks right away (message already loaded)
- if (okToFetch && message.mFlagLoaded != Message.FLAG_LOADED_COMPLETE) {
- mControllerCallback.getWrappee().setWaitForLoadMessageId(message.mId);
- mController.loadMessageForView(message.mId);
- } else {
- Address[] fromList = Address.unpack(mMessage.mFrom);
- boolean autoShowImages = false;
- for (Address sender : fromList) {
- String email = sender.getAddress();
- if (shouldShowImagesFor(email)) {
- autoShowImages = true;
- break;
- }
- }
- mControllerCallback.getWrappee().setWaitForLoadMessageId(Message.NO_MESSAGE);
- // Ask for body
- new LoadBodyTask(message.mId, autoShowImages).executeParallel();
- }
- }
-
- protected void updateHeaderView(Message message) {
- mSubjectView.setText(message.mSubject);
- final Address from = Address.unpackFirst(message.mFrom);
-
- // Set sender address/display name
- // Note we set " " for empty field, so TextView's won't get squashed.
- // Otherwise their height will be 0, which breaks the layout.
- if (from != null) {
- final String fromFriendly = from.toFriendly();
- final String fromAddress = from.getAddress();
- mFromNameView.setText(fromFriendly);
- mFromAddressView.setText(fromFriendly.equals(fromAddress) ? " " : fromAddress);
- } else {
- mFromNameView.setText(" ");
- mFromAddressView.setText(" ");
- }
- mDateTimeView.setText(DateUtils.getRelativeTimeSpanString(mContext, message.mTimeStamp)
- .toString());
-
- // To/Cc/Bcc
- final Resources res = mContext.getResources();
- final SpannableStringBuilder ssb = new SpannableStringBuilder();
- final String friendlyTo = Address.toFriendly(Address.unpack(message.mTo));
- final String friendlyCc = Address.toFriendly(Address.unpack(message.mCc));
- final String friendlyBcc = Address.toFriendly(Address.unpack(message.mBcc));
-
- if (!TextUtils.isEmpty(friendlyTo)) {
- Utility.appendBold(ssb, res.getString(R.string.message_view_to_label));
- ssb.append(" ");
- ssb.append(friendlyTo);
- }
- if (!TextUtils.isEmpty(friendlyCc)) {
- ssb.append(" ");
- Utility.appendBold(ssb, res.getString(R.string.message_view_cc_label));
- ssb.append(" ");
- ssb.append(friendlyCc);
- }
- if (!TextUtils.isEmpty(friendlyBcc)) {
- ssb.append(" ");
- Utility.appendBold(ssb, res.getString(R.string.message_view_bcc_label));
- ssb.append(" ");
- ssb.append(friendlyBcc);
- }
- mAddressesView.setText(ssb);
- }
-
- /**
- * @return the given date/time in a human readable form. The returned string always have
- * month and day (and year if {@code withYear} is set), so is usually long.
- * Use {@link DateUtils#getRelativeTimeSpanString} instead to save the screen real estate.
- */
- private String formatDate(long millis, boolean withYear) {
- StringBuilder sb = new StringBuilder();
- Formatter formatter = new Formatter(sb);
- DateUtils.formatDateRange(mContext, formatter, millis, millis,
- DateUtils.FORMAT_SHOW_DATE
- | DateUtils.FORMAT_ABBREV_ALL
- | DateUtils.FORMAT_SHOW_TIME
- | (withYear ? DateUtils.FORMAT_SHOW_YEAR : DateUtils.FORMAT_NO_YEAR));
- return sb.toString();
- }
-
- /**
- * Reload the body from the provider cursor. This must only be called from the UI thread.
- *
- * @param bodyText text part
- * @param bodyHtml html part
- *
- * TODO deal with html vs text and many other issues <- WHAT DOES IT MEAN??
- */
- private void reloadUiFromBody(String bodyText, String bodyHtml, boolean autoShowPictures) {
- String text = null;
- mHtmlTextRaw = null;
- boolean hasImages = false;
-
- if (bodyHtml == null) {
- text = bodyText;
- /*
- * Convert the plain text to HTML
- */
- StringBuffer sb = new StringBuffer("<html><body>");
- if (text != null) {
- // Escape any inadvertent HTML in the text message
- text = EmailHtmlUtil.escapeCharacterToDisplay(text);
- // Find any embedded URL's and linkify
- Matcher m = Patterns.WEB_URL.matcher(text);
- while (m.find()) {
- int start = m.start();
- /*
- * WEB_URL_PATTERN may match domain part of email address. To detect
- * this false match, the character just before the matched string
- * should not be '@'.
- */
- if (start == 0 || text.charAt(start - 1) != '@') {
- String url = m.group();
- Matcher proto = WEB_URL_PROTOCOL.matcher(url);
- String link;
- if (proto.find()) {
- // This is work around to force URL protocol part be lower case,
- // because WebView could follow only lower case protocol link.
- link = proto.group().toLowerCase() + url.substring(proto.end());
- } else {
- // Patterns.WEB_URL matches URL without protocol part,
- // so added default protocol to link.
- link = "http://" + url;
- }
- String href = String.format("<a href=\"%s\">%s</a>", link, url);
- m.appendReplacement(sb, href);
- }
- else {
- m.appendReplacement(sb, "$0");
- }
- }
- m.appendTail(sb);
- }
- sb.append("</body></html>");
- text = sb.toString();
- } else {
- text = bodyHtml;
- mHtmlTextRaw = bodyHtml;
- hasImages = IMG_TAG_START_REGEX.matcher(text).find();
- }
-
- // TODO this is not really accurate.
- // - Images aren't the only network resources. (e.g. CSS)
- // - If images are attached to the email and small enough, we download them at once,
- // and won't need network access when they're shown.
- if (hasImages) {
- if (mRestoredPictureLoaded || autoShowPictures) {
- blockNetworkLoads(false);
- addTabFlags(TAB_FLAGS_PICTURE_LOADED); // Set for next onSaveInstanceState
-
- // Make sure to reset the flag -- otherwise this will keep taking effect even after
- // moving to another message.
- mRestoredPictureLoaded = false;
- } else {
- addTabFlags(TAB_FLAGS_HAS_PICTURES);
- }
- }
- setMessageHtml(text);
-
- // Ask for attachments after body
- new LoadAttachmentsTask().executeParallel(mMessage.mId);
-
- mIsMessageLoadedForTest = true;
- }
-
- /**
- * Overrides for WebView behaviors.
- */
- private class CustomWebViewClient extends WebViewClient {
- @Override
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- return mCallback.onUrlInMessageClicked(url);
- }
- }
-
- private View findAttachmentView(long attachmentId) {
- for (int i = 0, count = mAttachments.getChildCount(); i < count; i++) {
- View view = mAttachments.getChildAt(i);
- MessageViewAttachmentInfo attachment = (MessageViewAttachmentInfo) view.getTag();
- if (attachment.mId == attachmentId) {
- return view;
- }
- }
- return null;
- }
-
- private MessageViewAttachmentInfo findAttachmentInfo(long attachmentId) {
- View view = findAttachmentView(attachmentId);
- if (view != null) {
- return (MessageViewAttachmentInfo)view.getTag();
- }
- return null;
- }
-
- /**
- * Controller results listener. We wrap it with {@link ControllerResultUiThreadWrapper},
- * so all methods are called on the UI thread.
- */
- private class ControllerResults extends Controller.Result {
- private long mWaitForLoadMessageId;
-
- public void setWaitForLoadMessageId(long messageId) {
- mWaitForLoadMessageId = messageId;
- }
-
- @Override
- public void loadMessageForViewCallback(MessagingException result, long accountId,
- long messageId, int progress) {
- if (messageId != mWaitForLoadMessageId) {
- // We are not waiting for this message to load, so exit quickly
- return;
- }
- if (result == null) {
- switch (progress) {
- case 0:
- mCallback.onLoadMessageStarted();
- // Loading from network -- show the progress icon.
- showContent(false, true);
- break;
- case 100:
- mWaitForLoadMessageId = -1;
- mCallback.onLoadMessageFinished();
- // reload UI and reload everything else too
- // pass false to LoadMessageTask to prevent looping here
- cancelAllTasks();
- new LoadMessageTask(false).executeParallel();
- break;
- default:
- // do nothing - we don't have a progress bar at this time
- break;
- }
- } else {
- mWaitForLoadMessageId = Message.NO_MESSAGE;
- String error = mContext.getString(R.string.status_network_error);
- mCallback.onLoadMessageError(error);
- resetView();
- }
- }
-
- @Override
- public void loadAttachmentCallback(MessagingException result, long accountId,
- long messageId, long attachmentId, int progress) {
- if (messageId == mMessageId) {
- if (result == null) {
- showAttachmentProgress(attachmentId, progress);
- switch (progress) {
- case 100:
- final MessageViewAttachmentInfo attachmentInfo =
- findAttachmentInfoFromView(attachmentId);
- if (attachmentInfo != null) {
- updatePreviewIcon(attachmentInfo);
- }
- doFinishLoadAttachment(attachmentId);
- break;
- default:
- // do nothing - we don't have a progress bar at this time
- break;
- }
- } else {
- MessageViewAttachmentInfo attachment = findAttachmentInfo(attachmentId);
- if (attachment == null) {
- // Called before LoadAttachmentsTask finishes.
- // (Possible if you quickly close & re-open a message)
- return;
- }
- attachment.cancelButton.setVisibility(View.GONE);
- attachment.loadButton.setVisibility(View.VISIBLE);
- attachment.hideProgress();
-
- final String error;
- if (result.getCause() instanceof IOException) {
- error = mContext.getString(R.string.status_network_error);
- } else {
- error = mContext.getString(
- R.string.message_view_load_attachment_failed_toast,
- attachment.mName);
- }
- mCallback.onLoadMessageError(error);
- }
- }
- }
-
- private void showAttachmentProgress(long attachmentId, int progress) {
- MessageViewAttachmentInfo attachment = findAttachmentInfo(attachmentId);
- if (attachment != null) {
- if (progress == 0) {
- attachment.cancelButton.setVisibility(View.GONE);
- }
- attachment.showProgress(progress);
- }
- }
- }
-
- /**
- * Class to detect update on the current message (e.g. toggle star). When it gets content
- * change notifications, it kicks {@link ReloadMessageTask}.
- */
- private class MessageObserver extends ContentObserver implements Runnable {
- private final Throttle mThrottle;
- private final ContentResolver mContentResolver;
-
- private boolean mRegistered;
-
- public MessageObserver(Handler handler, Context context) {
- super(handler);
- mContentResolver = context.getContentResolver();
- mThrottle = new Throttle("MessageObserver", this, handler);
- }
-
- public void unregister() {
- if (!mRegistered) {
- return;
- }
- mThrottle.cancelScheduledCallback();
- mContentResolver.unregisterContentObserver(this);
- mRegistered = false;
- }
-
- public void register(Uri notifyUri) {
- unregister();
- mContentResolver.registerContentObserver(notifyUri, true, this);
- mRegistered = true;
- }
-
- @Override
- public boolean deliverSelfNotifications() {
- return true;
- }
-
- @Override
- public void onChange(boolean selfChange) {
- if (mRegistered) {
- mThrottle.onEvent();
- }
- }
-
- /** This method is delay-called by {@link Throttle} on the UI thread. */
- @Override
- public void run() {
- // This method is delay-called, so need to make sure if it's still registered.
- if (mRegistered) {
- new ReloadMessageTask().cancelPreviousAndExecuteParallel();
- }
- }
- }
-
- private void updatePreviewIcon(MessageViewAttachmentInfo attachmentInfo) {
- new UpdatePreviewIconTask(attachmentInfo).executeParallel();
- }
-
- private class UpdatePreviewIconTask extends EmailAsyncTask<Void, Void, Bitmap> {
- @SuppressWarnings("hiding")
- private final Context mContext;
- private final MessageViewAttachmentInfo mAttachmentInfo;
-
- public UpdatePreviewIconTask(MessageViewAttachmentInfo attachmentInfo) {
- super(mTaskTracker);
- mContext = getActivity();
- mAttachmentInfo = attachmentInfo;
- }
-
- @Override
- protected Bitmap doInBackground(Void... params) {
- return getPreviewIcon(mContext, mAttachmentInfo);
- }
-
- @Override
- protected void onSuccess(Bitmap result) {
- if (result == null) {
- return;
- }
- mAttachmentInfo.iconView.setImageBitmap(result);
- }
- }
-
- private boolean shouldShowImagesFor(String senderEmail) {
- return Preferences.getPreferences(getActivity()).shouldShowImagesFor(senderEmail);
- }
-
- private void setShowImagesForSender() {
- makeVisible(UiUtilities.getView(getView(), R.id.always_show_pictures_button), false);
- Utility.showToast(getActivity(), R.string.message_view_always_show_pictures_confirmation);
-
- // Force redraw of the container.
- updateTabs(mTabFlags);
-
- Address[] fromList = Address.unpack(mMessage.mFrom);
- Preferences prefs = Preferences.getPreferences(getActivity());
- for (Address sender : fromList) {
- String email = sender.getAddress();
- prefs.setSenderAsTrusted(email);
- }
- }
-
- public boolean isMessageLoadedForTest() {
- return mIsMessageLoadedForTest;
- }
-
- public void clearIsMessageLoadedForTest() {
- mIsMessageLoadedForTest = true;
- }
-}
diff --git a/src/com/android/email/activity/MessagesAdapter.java b/src/com/android/email/activity/MessagesAdapter.java
deleted file mode 100644
index b9b2c2a39..000000000
--- a/src/com/android/email/activity/MessagesAdapter.java
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.content.Context;
-import android.content.Loader;
-import android.database.Cursor;
-import android.database.CursorWrapper;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.CursorAdapter;
-
-import com.android.email.Controller;
-import com.android.email.Email;
-import com.android.email.MessageListContext;
-import com.android.email.ResourceHelper;
-import com.android.email.data.ThrottlingCursorLoader;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.TextUtilities;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.base.Preconditions;
-
-import java.util.HashSet;
-import java.util.Set;
-
-
-/**
- * This class implements the adapter for displaying messages based on cursors.
- */
-/* package */ class MessagesAdapter extends CursorAdapter {
- private static final String STATE_CHECKED_ITEMS =
- "com.android.email.activity.MessagesAdapter.checkedItems";
-
- /* package */ static final String[] MESSAGE_PROJECTION = new String[] {
- EmailContent.RECORD_ID, MessageColumns.MAILBOX_KEY, MessageColumns.ACCOUNT_KEY,
- MessageColumns.DISPLAY_NAME, MessageColumns.SUBJECT, MessageColumns.TIMESTAMP,
- MessageColumns.FLAG_READ, MessageColumns.FLAG_FAVORITE, MessageColumns.FLAG_ATTACHMENT,
- MessageColumns.FLAGS, MessageColumns.SNIPPET
- };
-
- public static final int COLUMN_ID = 0;
- public static final int COLUMN_MAILBOX_KEY = 1;
- public static final int COLUMN_ACCOUNT_KEY = 2;
- public static final int COLUMN_DISPLAY_NAME = 3;
- public static final int COLUMN_SUBJECT = 4;
- public static final int COLUMN_DATE = 5;
- public static final int COLUMN_READ = 6;
- public static final int COLUMN_FAVORITE = 7;
- public static final int COLUMN_ATTACHMENTS = 8;
- public static final int COLUMN_FLAGS = 9;
- public static final int COLUMN_SNIPPET = 10;
-
- private final ResourceHelper mResourceHelper;
-
- /** If true, show color chips. */
- private boolean mShowColorChips;
-
- /** If not null, the query represented by this group of messages */
- private String mQuery;
-
- /**
- * Set of seleced message IDs.
- */
- private final HashSet<Long> mSelectedSet = new HashSet<Long>();
-
- /**
- * Callback from MessageListAdapter. All methods are called on the UI thread.
- */
- public interface Callback {
- /** Called when the use starts/unstars a message */
- void onAdapterFavoriteChanged(MessageListItem itemView, boolean newFavorite);
- /** Called when the user selects/unselects a message */
- void onAdapterSelectedChanged(MessageListItem itemView, boolean newSelected,
- int mSelectedCount);
- }
-
- private final Callback mCallback;
-
- private ThreePaneLayout mLayout;
-
- /**
- * The actual return type from the loader.
- */
- public static class MessagesCursor extends CursorWrapper {
- /** Whether the mailbox is found. */
- public final boolean mIsFound;
- /** {@link Account} that owns the mailbox. Null for combined mailboxes. */
- public final Account mAccount;
- /** {@link Mailbox} for the loaded mailbox. Null for combined mailboxes. */
- public final Mailbox mMailbox;
- /** {@code true} if the account is an EAS account */
- public final boolean mIsEasAccount;
- /** {@code true} if the loaded mailbox can be refreshed. */
- public final boolean mIsRefreshable;
- /** the number of accounts currently configured. */
- public final int mCountTotalAccounts;
-
- private MessagesCursor(Cursor cursor,
- boolean found, Account account, Mailbox mailbox, boolean isEasAccount,
- boolean isRefreshable, int countTotalAccounts) {
- super(cursor);
- mIsFound = found;
- mAccount = account;
- mMailbox = mailbox;
- mIsEasAccount = isEasAccount;
- mIsRefreshable = isRefreshable;
- mCountTotalAccounts = countTotalAccounts;
- }
- }
-
- public MessagesAdapter(Context context, Callback callback) {
- super(context.getApplicationContext(), null, 0 /* no auto requery */);
- mResourceHelper = ResourceHelper.getInstance(context);
- mCallback = callback;
- }
-
- public void setLayout(ThreePaneLayout layout) {
- mLayout = layout;
- }
-
- public void onSaveInstanceState(Bundle outState) {
- outState.putLongArray(STATE_CHECKED_ITEMS, Utility.toPrimitiveLongArray(getSelectedSet()));
- }
-
- public void loadState(Bundle savedInstanceState) {
- Set<Long> checkedset = getSelectedSet();
- checkedset.clear();
- for (long l: savedInstanceState.getLongArray(STATE_CHECKED_ITEMS)) {
- checkedset.add(l);
- }
- notifyDataSetChanged();
- }
-
- /**
- * Set true for combined mailboxes.
- */
- public void setShowColorChips(boolean show) {
- mShowColorChips = show;
- }
-
- public void setQuery(String query) {
- mQuery = query;
- }
-
- public Set<Long> getSelectedSet() {
- return mSelectedSet;
- }
-
- /**
- * Clear the selection. It's preferable to calling {@link Set#clear()} on
- * {@link #getSelectedSet()}, because it also notifies observers.
- */
- public void clearSelection() {
- Set<Long> checkedset = getSelectedSet();
- if (checkedset.size() > 0) {
- checkedset.clear();
- notifyDataSetChanged();
- }
- }
-
- public boolean isSelected(MessageListItem itemView) {
- return getSelectedSet().contains(itemView.mMessageId);
- }
-
- @Override
- public void bindView(View view, Context context, Cursor cursor) {
- // Reset the view (in case it was recycled) and prepare for binding
- MessageListItem itemView = (MessageListItem) view;
- itemView.bindViewInit(this, mLayout);
-
- // TODO: just move thise all to a MessageListItem.bindTo(cursor) so that the fields can
- // be private, and their inter-dependence when they change can be abstracted away.
-
- // Load the public fields in the view (for later use)
- itemView.mMessageId = cursor.getLong(COLUMN_ID);
- itemView.mMailboxId = cursor.getLong(COLUMN_MAILBOX_KEY);
- final long accountId = cursor.getLong(COLUMN_ACCOUNT_KEY);
- itemView.mAccountId = accountId;
-
- boolean isRead = cursor.getInt(COLUMN_READ) != 0;
- boolean readChanged = isRead != itemView.mRead;
- itemView.mRead = isRead;
- itemView.mIsFavorite = cursor.getInt(COLUMN_FAVORITE) != 0;
- final int flags = cursor.getInt(COLUMN_FLAGS);
- itemView.mHasInvite = (flags & Message.FLAG_INCOMING_MEETING_INVITE) != 0;
- itemView.mHasBeenRepliedTo = (flags & Message.FLAG_REPLIED_TO) != 0;
- itemView.mHasBeenForwarded = (flags & Message.FLAG_FORWARDED) != 0;
- itemView.mHasAttachment = cursor.getInt(COLUMN_ATTACHMENTS) != 0;
- itemView.setTimestamp(cursor.getLong(COLUMN_DATE));
- itemView.mSender = cursor.getString(COLUMN_DISPLAY_NAME);
- itemView.setText(
- cursor.getString(COLUMN_SUBJECT), cursor.getString(COLUMN_SNIPPET), readChanged);
- itemView.mColorChipPaint =
- mShowColorChips ? mResourceHelper.getAccountColorPaint(accountId) : null;
-
- if (mQuery != null && itemView.mSnippet != null) {
- itemView.mSnippet =
- TextUtilities.highlightTermsInText(cursor.getString(COLUMN_SNIPPET), mQuery);
- }
- }
-
- @Override
- public View newView(Context context, Cursor cursor, ViewGroup parent) {
- MessageListItem item = new MessageListItem(context);
- item.setVisibility(View.VISIBLE);
- return item;
- }
-
- public void toggleSelected(MessageListItem itemView) {
- updateSelected(itemView, !isSelected(itemView));
- }
-
- /**
- * This is used as a callback from the list items, to set the selected state
- *
- * <p>Must be called on the UI thread.
- *
- * @param itemView the item being changed
- * @param newSelected the new value of the selected flag (checkbox state)
- */
- private void updateSelected(MessageListItem itemView, boolean newSelected) {
- if (newSelected) {
- mSelectedSet.add(itemView.mMessageId);
- } else {
- mSelectedSet.remove(itemView.mMessageId);
- }
- if (mCallback != null) {
- mCallback.onAdapterSelectedChanged(itemView, newSelected, mSelectedSet.size());
- }
- }
-
- /**
- * This is used as a callback from the list items, to set the favorite state
- *
- * <p>Must be called on the UI thread.
- *
- * @param itemView the item being changed
- * @param newFavorite the new value of the favorite flag (star state)
- */
- public void updateFavorite(MessageListItem itemView, boolean newFavorite) {
- changeFavoriteIcon(itemView, newFavorite);
- if (mCallback != null) {
- mCallback.onAdapterFavoriteChanged(itemView, newFavorite);
- }
- }
-
- private void changeFavoriteIcon(MessageListItem view, boolean isFavorite) {
- view.invalidate();
- }
-
- /**
- * Creates the loader for {@link MessageListFragment}.
- *
- * @return always of {@link MessagesCursor}.
- */
- public static Loader<Cursor> createLoader(Context context, MessageListContext listContext) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "MessagesAdapter createLoader listContext=" + listContext);
- }
- return listContext.isSearch()
- ? new SearchCursorLoader(context, listContext)
- : new MessagesCursorLoader(context, listContext);
- }
-
- private static class MessagesCursorLoader extends ThrottlingCursorLoader {
- protected final Context mContext;
- private final long mAccountId;
- private final long mMailboxId;
-
- public MessagesCursorLoader(Context context, MessageListContext listContext) {
- // Initialize with no where clause. We'll set it later.
- super(context, EmailContent.Message.CONTENT_URI,
- MESSAGE_PROJECTION, null, null,
- EmailContent.MessageColumns.TIMESTAMP + " DESC");
- mContext = context;
- mAccountId = listContext.mAccountId;
- mMailboxId = listContext.getMailboxId();
- }
-
- @Override
- public Cursor loadInBackground() {
- // Build the where cause (which can't be done on the UI thread.)
- setSelection(Message.buildMessageListSelection(mContext, mAccountId, mMailboxId));
- // Then do a query to get the cursor
- return loadExtras(super.loadInBackground());
- }
-
- private Cursor loadExtras(Cursor baseCursor) {
- boolean found = false;
- Account account = null;
- Mailbox mailbox = null;
- boolean isEasAccount = false;
- boolean isRefreshable = false;
-
- if (mMailboxId < 0) {
- // Magic mailbox.
- found = true;
- } else {
- mailbox = Mailbox.restoreMailboxWithId(mContext, mMailboxId);
- if (mailbox != null) {
- account = Account.restoreAccountWithId(mContext, mailbox.mAccountKey);
- if (account != null) {
- found = true;
- isEasAccount = account.isEasAccount(mContext) ;
- isRefreshable = Mailbox.isRefreshable(mContext, mMailboxId);
- } else { // Account removed?
- mailbox = null;
- }
- }
- }
- final int countAccounts = EmailContent.count(mContext, Account.CONTENT_URI);
- return wrapCursor(baseCursor, found, account, mailbox, isEasAccount,
- isRefreshable, countAccounts);
- }
-
- /**
- * Wraps a basic cursor containing raw messages with information about the context of
- * the list that's being loaded, such as the account and the mailbox the messages
- * are for.
- * Subclasses may extend this to wrap with additional data.
- */
- protected Cursor wrapCursor(Cursor cursor,
- boolean found, Account account, Mailbox mailbox, boolean isEasAccount,
- boolean isRefreshable, int countTotalAccounts) {
- return new MessagesCursor(cursor, found, account, mailbox, isEasAccount,
- isRefreshable, countTotalAccounts);
- }
- }
-
- public static class SearchResultsCursor extends MessagesCursor {
- private final Mailbox mSearchedMailbox;
- private final int mResultsCount;
- private SearchResultsCursor(Cursor cursor,
- boolean found, Account account, Mailbox mailbox, boolean isEasAccount,
- boolean isRefreshable, int countTotalAccounts,
- Mailbox searchedMailbox, int resultsCount) {
- super(cursor, found, account, mailbox, isEasAccount,
- isRefreshable, countTotalAccounts);
- mSearchedMailbox = searchedMailbox;
- mResultsCount = resultsCount;
- }
-
- /**
- * @return the total number of results that match the given search query. Note that
- * there may not be that many items loaded in the cursor yet.
- */
- public int getResultsCount() {
- return mResultsCount;
- }
-
- public Mailbox getSearchedMailbox() {
- return mSearchedMailbox;
- }
- }
-
- /**
- * A special loader used to perform a search.
- */
- private static class SearchCursorLoader extends MessagesCursorLoader {
- private final MessageListContext mListContext;
- private int mResultsCount = -1;
- private Mailbox mSearchedMailbox = null;
-
- public SearchCursorLoader(Context context, MessageListContext listContext) {
- super(context, listContext);
- Preconditions.checkArgument(listContext.isSearch());
- mListContext = listContext;
- }
-
- @Override
- public Cursor loadInBackground() {
- if (mResultsCount >= 0) {
- // Result count known - the initial search meta data must have completed.
- return super.loadInBackground();
- }
-
- if (mSearchedMailbox == null) {
- mSearchedMailbox = Mailbox.restoreMailboxWithId(
- mContext, mListContext.getSearchedMailbox());
- }
-
- // The search results info hasn't even been loaded yet, so the Controller has not yet
- // initialized the search mailbox properly. Kick off the search first.
- Controller controller = Controller.getInstance(mContext);
- try {
- mResultsCount = controller.searchMessages(
- mListContext.mAccountId, mListContext.getSearchParams());
- } catch (MessagingException e) {
- }
-
- // Return whatever the super would do, now that we know the results are ready.
- // After this point, it should behave as a normal mailbox load for messages.
- return super.loadInBackground();
- }
-
- @Override
- protected Cursor wrapCursor(Cursor cursor,
- boolean found, Account account, Mailbox mailbox, boolean isEasAccount,
- boolean isRefreshable, int countTotalAccounts) {
- return new SearchResultsCursor(cursor, found, account, mailbox, isEasAccount,
- isRefreshable, countTotalAccounts, mSearchedMailbox, mResultsCount);
- }
- }
-}
diff --git a/src/com/android/email/activity/MoveMessageToDialog.java b/src/com/android/email/activity/MoveMessageToDialog.java
deleted file mode 100644
index e1721cf47..000000000
--- a/src/com/android/email/activity/MoveMessageToDialog.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.Fragment;
-import android.app.LoaderManager;
-import android.content.AsyncTaskLoader;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Loader;
-import android.database.Cursor;
-import android.os.Bundle;
-import android.os.Handler;
-import android.util.Log;
-
-import com.android.email.Email;
-import com.android.email.R;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.Utility;
-
-/**
- * "Move (messages) to" dialog. This is a modal dialog and the design is such so that only one is
- * active. If a new instance is created while an existing one is active, the existing one is
- * dismissed.
- *
- * TODO The check logic in MessageCheckerCallback is not efficient. It shouldn't restore full
- * Message objects.
- */
-public class MoveMessageToDialog extends DialogFragment implements DialogInterface.OnClickListener {
- private static final String BUNDLE_MESSAGE_IDS = "message_ids";
-
- private static final int LOADER_ID_MOVE_TO_DIALOG_MAILBOX_LOADER = 1;
- private static final int LOADER_ID_MOVE_TO_DIALOG_MESSAGE_CHECKER = 2;
-
- /** Message IDs passed to {@link #newInstance} */
- private long[] mMessageIds;
- private MailboxMoveToAdapter mAdapter;
-
- /** ID of the account that contains all of the messages to move */
- private long mAccountId;
- /** ID of the mailbox that contains all of the messages to move */
- private long mMailboxId;
-
- private boolean mDestroyed;
-
- /**
- * Callback that target fragments, or the owner activity should implement.
- */
- public interface Callback {
- public void onMoveToMailboxSelected(long newMailboxId, long[] messageIds);
- }
-
- /**
- * Create and return a new instance.
- *
- * @param messageIds IDs of the messages to be moved.
- * @param callbackFragment Fragment that gets a callback. The fragment must implement
- * {@link Callback}.
- */
- public static <T extends Fragment & Callback> MoveMessageToDialog newInstance(long[] messageIds,
- T callbackFragment) {
- if (messageIds.length == 0) {
- throw new IllegalArgumentException();
- }
- if (callbackFragment == null) {
- throw new IllegalArgumentException(); // fail fast
- }
- MoveMessageToDialog dialog = new MoveMessageToDialog();
- Bundle args = new Bundle();
- args.putLongArray(BUNDLE_MESSAGE_IDS, messageIds);
- dialog.setArguments(args);
- dialog.setTargetFragment(callbackFragment, 0);
- return dialog;
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "" + this + " onCreate target=" + getTargetFragment());
- }
- super.onCreate(savedInstanceState);
- mMessageIds = getArguments().getLongArray(BUNDLE_MESSAGE_IDS);
- setStyle(STYLE_NORMAL, android.R.style.Theme_Holo_Light);
- }
-
- @Override
- public void onDestroy() {
- mDestroyed = true;
- super.onDestroy();
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final Activity activity = getActivity();
-
- // Build adapter & dialog
- // Make sure to pass Builder's context to the adapter, so that it'll get the correct theme.
- AlertDialog.Builder builder = new AlertDialog.Builder(activity)
- .setTitle(activity.getResources().getString(R.string.move_to_folder_dialog_title));
-
- mAdapter = new MailboxMoveToAdapter(builder.getContext());
- builder.setSingleChoiceItems(mAdapter, -1, this);
-
- getLoaderManager().initLoader(
- LOADER_ID_MOVE_TO_DIALOG_MESSAGE_CHECKER,
- null, new MessageCheckerCallback());
-
- return builder.create();
- }
-
- @Override
- public void onStart() {
- super.onStart();
-
- if (mAdapter.getCursor() == null) {
- // Data isn't ready - don't show yet.
- getDialog().hide();
- }
- }
-
- /**
- * The active move message dialog. This dialog is fairly modal so it only makes sense to have
- * one instance active, and for debounce purposes, we dismiss any existing ones.
- *
- * Only touched on the UI thread so doesn't require synchronization.
- */
- static MoveMessageToDialog sActiveDialog;
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
- if (sActiveDialog != null) {
- // Something is already attached. Dismiss it!
- sActiveDialog.dismissAsync();
- }
-
- sActiveDialog = this;
- }
-
- @Override
- public void onDetach() {
- super.onDetach();
-
- if (sActiveDialog == this) {
- sActiveDialog = null;
- }
- }
-
- @Override
- public void onClick(DialogInterface dialog, int position) {
- final long mailboxId = mAdapter.getItemId(position);
-
- ((Callback) getTargetFragment()).onMoveToMailboxSelected(mailboxId, mMessageIds);
- dismiss();
- }
-
- /**
- * Delay-call {@link #dismissAllowingStateLoss()} using a {@link Handler}. Calling
- * {@link #dismissAllowingStateLoss()} from {@link LoaderManager.LoaderCallbacks#onLoadFinished}
- * is not allowed, so we use it instead.
- */
- private void dismissAsync() {
- Utility.getMainThreadHandler().post(new Runnable() {
- @Override
- public void run() {
- if (!mDestroyed) {
- dismissAllowingStateLoss();
- }
- }
- });
- }
-
- /**
- * Loader callback for {@link MessageChecker}
- */
- private class MessageCheckerCallback implements LoaderManager.LoaderCallbacks<IdContainer> {
- @Override
- public Loader<IdContainer> onCreateLoader(int id, Bundle args) {
- return new MessageChecker(getActivity(), mMessageIds);
- }
-
- @Override
- public void onLoadFinished(Loader<IdContainer> loader, IdContainer idSet) {
- if (mDestroyed) {
- return;
- }
- // accountId shouldn't be null, but I'm paranoia.
- if (idSet == null || idSet.mAccountId == Account.NO_ACCOUNT
- || idSet.mMailboxId == Mailbox.NO_MAILBOX) {
- // Some of the messages can't be moved. Close the dialog.
- dismissAsync();
- return;
- }
- mAccountId = idSet.mAccountId;
- mMailboxId = idSet.mMailboxId;
- getLoaderManager().initLoader(
- LOADER_ID_MOVE_TO_DIALOG_MAILBOX_LOADER,
- null, new MailboxesLoaderCallbacks());
- }
-
- @Override
- public void onLoaderReset(Loader<IdContainer> loader) {
- }
- }
-
- /**
- * Loader callback for destination mailbox list.
- */
- private class MailboxesLoaderCallbacks implements LoaderManager.LoaderCallbacks<Cursor> {
- @Override
- public Loader<Cursor> onCreateLoader(int id, Bundle args) {
- return MailboxMoveToAdapter.createLoader(getActivity().getApplicationContext(),
- mAccountId, mMailboxId);
- }
-
- @Override
- public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
- if (mDestroyed) {
- return;
- }
- boolean needsShowing = (mAdapter.getCursor() == null);
- mAdapter.swapCursor(data);
-
- // The first time data is loaded, we need to show the dialog.
- if (needsShowing && isAdded()) {
- getDialog().show();
- }
- }
-
- @Override
- public void onLoaderReset(Loader<Cursor> loader) {
- mAdapter.swapCursor(null);
- }
- }
-
- /**
- * A loader that checks if the messages can be moved. If messages can be moved, it returns
- * the account and mailbox IDs where the messages are currently located. If any the messages
- * cannot be moved (such as the messages belong to different accounts), the IDs returned
- * will be {@link Account#NO_ACCOUNT} and {@link Mailbox#NO_MAILBOX}.
- */
- private static class MessageChecker extends AsyncTaskLoader<IdContainer> {
- private final Activity mActivity;
- private final long[] mMessageIds;
-
- public MessageChecker(Activity activity, long[] messageIds) {
- super(activity);
- mActivity = activity;
- mMessageIds = messageIds;
- }
-
- @Override
- public IdContainer loadInBackground() {
- final Context c = getContext();
-
- long accountId = Account.NO_ACCOUNT;
- long mailboxId = Mailbox.NO_MAILBOX;
-
- for (long messageId : mMessageIds) {
- // TODO This shouln't restore a full Message object.
- final Message message = Message.restoreMessageWithId(c, messageId);
- if (message == null) {
- continue; // Skip removed messages.
- }
-
- // First, check account.
- if (accountId == Account.NO_ACCOUNT) {
- // First, check if the account supports move
- accountId = message.mAccountKey;
- if (!Account.restoreAccountWithId(c, accountId).supportsMoveMessages(c)) {
- Utility.showToast(
- mActivity, R.string.cannot_move_protocol_not_supported_toast);
- accountId = Account.NO_ACCOUNT;
- break;
- }
- mailboxId = message.mMailboxKey;
- // Second, check if the mailbox supports move
- if (!Mailbox.restoreMailboxWithId(c, mailboxId).canHaveMessagesMoved()) {
- Utility.showToast(mActivity, R.string.cannot_move_special_mailboxes_toast);
- accountId = Account.NO_ACCOUNT;
- mailboxId = Mailbox.NO_MAILBOX;
- break;
- }
- } else {
- // Subsequent messages; all messages must to belong to the same mailbox
- if (message.mAccountKey != accountId || message.mMailboxKey != mailboxId) {
- Utility.showToast(mActivity, R.string.cannot_move_multiple_accounts_toast);
- accountId = Account.NO_ACCOUNT;
- mailboxId = Mailbox.NO_MAILBOX;
- break;
- }
- }
- }
- return new IdContainer(accountId, mailboxId);
- }
-
- @Override
- protected void onStartLoading() {
- cancelLoad();
- forceLoad();
- }
-
- @Override
- protected void onStopLoading() {
- cancelLoad();
- }
-
- @Override
- protected void onReset() {
- stopLoading();
- }
- }
-
- /** Container for multiple types of IDs */
- private static class IdContainer {
- private final long mAccountId;
- private final long mMailboxId;
-
- private IdContainer(long accountId, long mailboxId) {
- mAccountId = accountId;
- mMailboxId = mailboxId;
- }
- }
-}
diff --git a/src/com/android/email/activity/NfcHandler.java b/src/com/android/email/activity/NfcHandler.java
deleted file mode 100644
index 775ec83d1..000000000
--- a/src/com/android/email/activity/NfcHandler.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.nfc.NdefMessage;
-import android.nfc.NdefRecord;
-import android.nfc.NfcAdapter;
-import android.nfc.NfcEvent;
-import android.text.TextUtils;
-
-import com.android.emailcommon.provider.Account;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-
-/**
- * This class implements sharing the e-mail address of the
- * active account to another device using NFC. NFC sharing is only
- * enabled when the activity is in the foreground and resumed.
- * When an NFC link is established, {@link #createMessage}
- * will be called to create the data to be sent over the link,
- * which is a vCard in this case.
- */
-public class NfcHandler implements NfcAdapter.CreateNdefMessageCallback {
- final UIControllerBase mUiController;
- final Activity mActivity;
-
- String mCurrentEmail;
-
- public static NfcHandler register(UIControllerBase controller, Activity activity) {
- NfcAdapter adapter = NfcAdapter.getDefaultAdapter(activity);
- if (adapter == null) {
- return null; // NFC not available on this device
- }
- NfcHandler nfcHandler = new NfcHandler(controller, activity);
- adapter.setNdefPushMessageCallback(nfcHandler, activity);
- return nfcHandler;
- }
-
- public NfcHandler(UIControllerBase controller, Activity activity) {
- mUiController = controller;
- mActivity = activity;
- }
-
- public void onAccountChanged() {
- if (mUiController.isActualAccountSelected()) {
- final long accountId = mUiController.getActualAccountId();
- final Account account = Account.restoreAccountWithId(mActivity, accountId);
- if (account == null) return;
- mCurrentEmail = account.mEmailAddress;
- } else {
- mCurrentEmail = null;
- }
- }
-
- private static NdefMessage buildMailtoNdef(String address) {
- if (TextUtils.isEmpty(address)) {
- return null;
- }
- byte[] accountBytes;
- try {
- accountBytes = URLEncoder.encode(address, "UTF-8")
- .getBytes("UTF-8");
- } catch (UnsupportedEncodingException e) {
- return null;
- }
- byte[] recordBytes = new byte[accountBytes.length + 1];
- recordBytes[0] = 0x06; // NDEF mailto: prefix
- System.arraycopy(accountBytes, 0, recordBytes, 1, accountBytes.length);
- NdefRecord mailto = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI,
- new byte[0], recordBytes);
- return new NdefMessage(new NdefRecord[] { mailto });
- }
-
- @Override
- public NdefMessage createNdefMessage(NfcEvent event) {
- if (mCurrentEmail != null) {
- return buildMailtoNdef(mCurrentEmail);
- } else {
- return null;
- }
- }
-}
diff --git a/src/com/android/email/activity/RecentMailboxManager.java b/src/com/android/email/activity/RecentMailboxManager.java
deleted file mode 100644
index c11e6fe2f..000000000
--- a/src/com/android/email/activity/RecentMailboxManager.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-
-import com.android.email.Clock;
-import com.android.email.Controller;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.Maps;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-/**
- * Manages recent data for mailboxes.
- */
-public class RecentMailboxManager {
- @VisibleForTesting
- static Clock sClock = Clock.INSTANCE;
- @VisibleForTesting
- static RecentMailboxManager sInstance;
-
- public static String RECENT_MAILBOXES_SORT_ORDER = MailboxColumns.DISPLAY_NAME;
-
- /** The maximum number of results to retrieve */
- private static final int LIMIT_RESULTS = 5;
- /** Query to find the top most recent mailboxes */
- private static final String RECENT_SELECTION =
- MailboxColumns.ID + " IN " +
- "( SELECT " + MailboxColumns.ID
- + " FROM " + Mailbox.TABLE_NAME
- + " WHERE ( " + MailboxColumns.ACCOUNT_KEY + "=? "
- + " AND " + Mailbox.USER_VISIBLE_MAILBOX_SELECTION
- + " AND " + MailboxColumns.TYPE + "!=" + Mailbox.TYPE_INBOX
- + " AND " + MailboxColumns.LAST_TOUCHED_TIME + ">0 )"
- + " ORDER BY " + MailboxColumns.LAST_TOUCHED_TIME + " DESC"
- + " LIMIT ? )";
- /** Similar query to {@link #RECENT_SELECTION}, except, exclude all but user mailboxes */
- private static final String RECENT_SELECTION_WITH_EXCLUSIONS =
- MailboxColumns.ID + " IN " +
- "( SELECT " + MailboxColumns.ID
- + " FROM " + Mailbox.TABLE_NAME
- + " WHERE ( " + MailboxColumns.ACCOUNT_KEY + "=? "
- + " AND " + Mailbox.USER_VISIBLE_MAILBOX_SELECTION
- + " AND " + MailboxColumns.TYPE + "=" + Mailbox.TYPE_MAIL
- + " AND " + MailboxColumns.LAST_TOUCHED_TIME + ">0 )"
- + " ORDER BY " + MailboxColumns.LAST_TOUCHED_TIME + " DESC"
- + " LIMIT ? )";
-
- /** Mailbox types for default "recent mailbox" entries if none exist */
- @VisibleForTesting
- static final int[] DEFAULT_RECENT_TYPES = new int[] {
- Mailbox.TYPE_DRAFTS,
- Mailbox.TYPE_SENT,
- };
-
- private final Context mContext;
- private final HashMap<Long, Boolean> mDefaultRecentsInitialized;
-
- public static synchronized RecentMailboxManager getInstance(Context context) {
- if (sInstance == null) {
- sInstance = new RecentMailboxManager(context);
- }
- return sInstance;
- }
-
- /** Hide constructor */
- private RecentMailboxManager(Context context) {
- mContext = context;
- mDefaultRecentsInitialized = Maps.newHashMap();
- }
-
- /** Updates the specified mailbox's touch time. Returns an async task for test only. */
- public EmailAsyncTask<Void, Void, Void> touch(long accountId, long mailboxId) {
- return fireAndForget(accountId, mailboxId, sClock.getTime());
- }
-
- /**
- * Gets the most recently touched mailboxes for the specified account. If there are no
- * recent mailboxes and withExclusions is {@code false}, default recent mailboxes will
- * be returned.
- * <p><em>WARNING</em>: This method blocks on the database.
- * @param accountId The ID of the account to load the recent list.
- * @param withExclusions If {@code false}, all mailboxes are eligible for the recent list.
- * Otherwise, only user defined mailboxes are eligible for the recent list.
- */
- public ArrayList<Long> getMostRecent(long accountId, boolean withExclusions) {
- ensureDefaultsInitialized(accountId, sClock.getTime());
-
- String selection = withExclusions ? RECENT_SELECTION_WITH_EXCLUSIONS : RECENT_SELECTION;
- ArrayList<Long> returnList = new ArrayList<Long>();
- Cursor cursor = mContext.getContentResolver().query(Mailbox.CONTENT_URI,
- EmailContent.ID_PROJECTION,
- selection,
- new String[] { Long.toString(accountId), Integer.toString(LIMIT_RESULTS) },
- RECENT_MAILBOXES_SORT_ORDER);
- try {
- while (cursor.moveToNext()) {
- returnList.add(cursor.getLong(EmailContent.ID_PROJECTION_COLUMN));
- }
- } finally {
- cursor.close();
- }
- return returnList;
- }
-
- /** Updates the last touched time for the mailbox in the background */
- private EmailAsyncTask<Void, Void, Void> fireAndForget(
- final long accountId, final long mailboxId, final long time) {
- return EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- ensureDefaultsInitialized(accountId, time);
- touchMailboxSynchronous(accountId, mailboxId, time);
- }
- });
- }
-
- private void touchMailboxSynchronous(long accountId, long mailboxId, long time) {
- ContentValues values = new ContentValues();
- values.put(MailboxColumns.LAST_TOUCHED_TIME, time);
- mContext.getContentResolver().update(
- ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId),
- values, null, null);
- }
-
- /**
- * Ensures the default recent mailboxes have been set for this account.
- */
- private synchronized void ensureDefaultsInitialized(long accountId, long time) {
- if (Boolean.TRUE.equals(mDefaultRecentsInitialized.get(accountId))) {
- return;
- }
-
- String[] args = new String[] { Long.toString(accountId), Integer.toString(LIMIT_RESULTS) };
- if (EmailContent.count(mContext, Mailbox.CONTENT_URI, RECENT_SELECTION, args) == 0) {
- // There are no recent mailboxes at all. Populate with default set.
- for (int type : DEFAULT_RECENT_TYPES) {
- long mailbox = Controller.getInstance(mContext).findOrCreateMailboxOfType(
- accountId, type);
- touchMailboxSynchronous(accountId, mailbox, time);
- }
- }
-
- mDefaultRecentsInitialized.put(accountId, true);
- }
-}
diff --git a/src/com/android/email/activity/ShortcutPicker.java b/src/com/android/email/activity/ShortcutPicker.java
deleted file mode 100644
index 94d6f05bb..000000000
--- a/src/com/android/email/activity/ShortcutPicker.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.util.Log;
-import android.view.View;
-import android.view.View.OnClickListener;
-
-import com.android.email.R;
-import com.android.email.activity.ShortcutPickerFragment.AccountShortcutPickerFragment;
-import com.android.email.activity.ShortcutPickerFragment.MailboxShortcutPickerFragment;
-import com.android.email.activity.ShortcutPickerFragment.PickerCallback;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-
-/**
- * This class implements a launcher shortcut for directly accessing a single account.
- */
-public class ShortcutPicker extends Activity implements OnClickListener, PickerCallback {
- /**
- * If true, creates pre-honeycomb style shortcuts. This allows developers to test launching
- * the app from old style shortcuts (which point sat MessageList rather than Welcome) without
- * actually carrying over shortcuts from previous versions.
- */
- private final static boolean TEST_CREATE_OLD_STYLE_SHORTCUT = false; // DO NOT SUBMIT WITH TRUE
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- // TODO Relax this test slightly in order to re-use this activity for widget creation
- if (!Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction())) {
- // finish() immediately if we aren't supposed to be here
- finish();
- return;
- }
-
- // Set handler for the "cancel" button
- setContentView(R.layout.account_shortcut_picker);
- findViewById(R.id.cancel).setOnClickListener(this);
-
- if (getFragmentManager().findFragmentById(R.id.shortcut_list) == null) {
- // Load the account picking fragment if we haven't created a fragment yet
- // NOTE: do not add to history as this will be the first fragment in the flow
- AccountShortcutPickerFragment fragment = new AccountShortcutPickerFragment();
- getFragmentManager().beginTransaction().add(R.id.shortcut_list, fragment).commit();
- }
- }
-
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.cancel:
- finish();
- break;
- }
- }
-
- @Override
- public Integer buildFilter(Account account) {
- if (!Account.isNormalAccount(account.mId)) {
- // Shortcuts for combined accounts can only be for inboxes.
- return MailboxShortcutPickerFragment.FILTER_INBOX_ONLY;
- }
-
- return MailboxShortcutPickerFragment.FILTER_ALLOW_ALL;
- }
-
- @Override
- public void onSelected(Account account, long mailboxId) {
- String shortcutName;
- if (Account.isNormalAccount(account.mId) &&
- (Mailbox.getMailboxType(this, mailboxId) != Mailbox.TYPE_INBOX)) {
- shortcutName = Mailbox.getDisplayName(this, mailboxId);
- } else {
- shortcutName = account.getDisplayName();
- }
- setupShortcut(account, mailboxId, shortcutName);
- finish();
- }
-
- @Override
- public void onMissingData(boolean missingAccount, boolean missingMailbox) {
- // TODO what's the proper handling if the mailbox list is '0'? display toast?
- finish();
- }
-
- /**
- * This function creates a shortcut and returns it to the caller. There are actually two
- * intents that you will send back.
- *
- * The first intent serves as a container for the shortcut and is returned to the launcher by
- * setResult(). This intent must contain three fields:
- *
- * <ul>
- * <li>{@link android.content.Intent#EXTRA_SHORTCUT_INTENT} The shortcut intent.</li>
- * <li>{@link android.content.Intent#EXTRA_SHORTCUT_NAME} The text that will be displayed with
- * the shortcut.</li>
- * <li>{@link android.content.Intent#EXTRA_SHORTCUT_ICON} The shortcut's icon, if provided as a
- * bitmap, <i>or</i> {@link android.content.Intent#EXTRA_SHORTCUT_ICON_RESOURCE} if provided as
- * a drawable resource.</li>
- * </ul>
- *
- * If you use a simple drawable resource, note that you must wrapper it using
- * {@link android.content.Intent.ShortcutIconResource}, as shown below. This is required so
- * that the launcher can access resources that are stored in your application's .apk file. If
- * you return a bitmap, such as a thumbnail, you can simply put the bitmap into the extras
- * bundle using {@link android.content.Intent#EXTRA_SHORTCUT_ICON}.
- *
- * The shortcut intent can be any intent that you wish the launcher to send, when the user
- * clicks on the shortcut. Typically this will be {@link android.content.Intent#ACTION_VIEW}
- * with an appropriate Uri for your content, but any Intent will work here as long as it
- * triggers the desired action within your Activity.
- */
- private void setupShortcut(Account account, long mailboxId, String shortcutName) {
- Activity myActivity = this;
- // First, set up the shortcut intent.
- final Intent shortcutIntent;
- if (TEST_CREATE_OLD_STYLE_SHORTCUT) {
- shortcutIntent = MessageList.createFroyoIntent(myActivity, account);
- Log.d(Logging.LOG_TAG, "Created old style intent: " + shortcutIntent);
- } else {
- // TODO if we add meta-mailboxes/accounts to the database, remove this special case
- if (account.mId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- shortcutIntent = Welcome.createOpenMessageIntent(
- myActivity, account.mId, mailboxId, Message.NO_MESSAGE);
- } else {
- String uuid = account.mCompatibilityUuid;
- shortcutIntent = Welcome.createAccountShortcutIntent(myActivity, uuid, mailboxId);
- }
- }
-
- // Then, set up the container intent (the response to the caller)
- Intent intent = new Intent();
- intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
- intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, shortcutName);
- Parcelable iconResource
- = Intent.ShortcutIconResource.fromContext(myActivity, R.mipmap.ic_launcher_email);
- intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
-
- // Now, return the result to the launcher
- myActivity.setResult(Activity.RESULT_OK, intent);
- }
-}
diff --git a/src/com/android/email/activity/ShortcutPickerFragment.java b/src/com/android/email/activity/ShortcutPickerFragment.java
deleted file mode 100644
index 2cc41abd1..000000000
--- a/src/com/android/email/activity/ShortcutPickerFragment.java
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import com.android.email.R;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.provider.EmailContent.MailboxColumns;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-
-import android.app.Activity;
-import android.app.FragmentTransaction;
-import android.app.ListFragment;
-import android.app.LoaderManager.LoaderCallbacks;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.CursorLoader;
-import android.content.Loader;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.database.MatrixCursor.RowBuilder;
-import android.database.MergeCursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ListView;
-import android.widget.SimpleCursorAdapter;
-
-/**
- * Fragment containing a list of accounts to show during shortcut creation.
- * <p>
- * NOTE: In order to receive callbacks, the activity containing this fragment must implement
- * the {@link PickerCallback} interface.
- */
-public abstract class ShortcutPickerFragment extends ListFragment
- implements OnItemClickListener, LoaderCallbacks<Cursor> {
- /** Callback methods. Enclosing activities must implement to receive fragment notifications. */
- public static interface PickerCallback {
- /** Builds a mailbox filter for the given account. See MailboxShortcutPickerFragment. */
- public Integer buildFilter(Account account);
- /** Invoked when an account and mailbox have been selected. */
- public void onSelected(Account account, long mailboxId);
- /** Required data is missing; either the account and/or mailbox */
- public void onMissingData(boolean missingAccount, boolean missingMailbox);
- }
-
- /** A no-op callback */
- private final PickerCallback EMPTY_CALLBACK = new PickerCallback() {
- @Override public Integer buildFilter(Account account) { return null; }
- @Override public void onSelected(Account account, long mailboxId){ getActivity().finish(); }
- @Override public void onMissingData(boolean missingAccount, boolean missingMailbox) { }
- };
- private final static int LOADER_ID = 0;
- private final static int[] TO_VIEWS = new int[] {
- android.R.id.text1,
- };
-
- PickerCallback mCallback = EMPTY_CALLBACK;
- /** Cursor adapter that provides either the account or mailbox list */
- private SimpleCursorAdapter mAdapter;
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
-
- if (activity instanceof PickerCallback) {
- mCallback = (PickerCallback) activity;
- }
- final String[] fromColumns = getFromColumns();
- mAdapter = new SimpleCursorAdapter(activity,
- android.R.layout.simple_expandable_list_item_1, null, fromColumns, TO_VIEWS, 0);
- setListAdapter(mAdapter);
-
- getLoaderManager().initLoader(LOADER_ID, null, this);
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- ListView listView = getListView();
- listView.setOnItemClickListener(this);
- listView.setItemsCanFocus(false);
- }
-
- @Override
- public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
- mAdapter.swapCursor(data);
- }
-
- @Override
- public void onLoaderReset(Loader<Cursor> loader) {
- mAdapter.swapCursor(null);
- }
-
- /** Returns the cursor columns to map into list */
- abstract String[] getFromColumns();
-
- // TODO if we add meta-accounts to the database, remove this class entirely
- private static final class AccountPickerLoader extends CursorLoader {
- public AccountPickerLoader(Context context, Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder) {
- super(context, uri, projection, selection, selectionArgs, sortOrder);
- }
-
- @Override
- public Cursor loadInBackground() {
- Cursor parentCursor = super.loadInBackground();
- int cursorCount = parentCursor.getCount();
- final Cursor returnCursor;
-
- if (cursorCount > 1) {
- // Only add "All accounts" if there is more than 1 account defined
- MatrixCursor allAccountCursor = new MatrixCursor(getProjection());
- addCombinedAccountRow(allAccountCursor, cursorCount);
- returnCursor = new MergeCursor(new Cursor[] { allAccountCursor, parentCursor });
- } else {
- returnCursor = parentCursor;
- }
- return returnCursor;
- }
-
- /** Adds a row for "All Accounts" into the given cursor */
- private void addCombinedAccountRow(MatrixCursor cursor, int accountCount) {
- Context context = getContext();
- Account account = new Account();
- account.mId = Account.ACCOUNT_ID_COMBINED_VIEW;
- Resources res = context.getResources();
- String countString = res.getQuantityString(R.plurals.picker_combined_view_account_count,
- accountCount, accountCount);
- account.mDisplayName = res.getString(R.string.picker_combined_view_fmt, countString);
- ContentValues values = account.toContentValues();
- RowBuilder row = cursor.newRow();
- for (String rowName : cursor.getColumnNames()) {
- // special case some of the rows ...
- if (AccountColumns.ID.equals(rowName)) {
- row.add(Account.ACCOUNT_ID_COMBINED_VIEW);
- continue;
- } else if (AccountColumns.IS_DEFAULT.equals(rowName)) {
- row.add(0);
- continue;
- }
- row.add(values.get(rowName));
- }
- }
- }
-
- /** Account picker */
- public static class AccountShortcutPickerFragment extends ShortcutPickerFragment {
- private volatile Boolean mLoadFinished = new Boolean(false);
- private final static String[] ACCOUNT_FROM_COLUMNS = new String[] {
- AccountColumns.DISPLAY_NAME,
- };
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- getActivity().setTitle(R.string.account_shortcut_picker_title);
- if (!mLoadFinished) {
- getActivity().setVisible(false);
- }
- }
-
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- Cursor cursor = (Cursor) parent.getItemAtPosition(position);
- selectAccountCursor(cursor, true);
- }
-
- @Override
- public Loader<Cursor> onCreateLoader(int id, Bundle args) {
- Context context = getActivity();
- return new AccountPickerLoader(
- context, Account.CONTENT_URI, Account.CONTENT_PROJECTION, null, null, null);
- }
-
- @Override
- public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
- // if there is only one account, auto-select it
- // No accounts; close the dialog
- if (data.getCount() == 0) {
- mCallback.onMissingData(true, false);
- return;
- }
- if (data.getCount() == 1 && data.moveToFirst()) {
- selectAccountCursor(data, false);
- return;
- }
- super.onLoadFinished(loader, data);
- mLoadFinished = true;
- getActivity().setVisible(true);
- }
-
- @Override
- String[] getFromColumns() {
- return ACCOUNT_FROM_COLUMNS;
- }
-
- /** Selects the account specified by the given cursor */
- private void selectAccountCursor(Cursor cursor, boolean allowBack) {
- Account account = new Account();
- account.restore(cursor);
- ShortcutPickerFragment fragment = MailboxShortcutPickerFragment.newInstance(
- getActivity(), account, mCallback.buildFilter(account));
- FragmentTransaction transaction = getFragmentManager().beginTransaction();
- transaction.replace(R.id.shortcut_list, fragment);
- if (allowBack) {
- transaction.addToBackStack(null);
- }
- transaction.commitAllowingStateLoss();
- }
- }
-
- // TODO if we add meta-mailboxes to the database, remove this class entirely
- private static final class MailboxPickerLoader extends CursorLoader {
- private final long mAccountId;
- private final boolean mAllowUnread;
- public MailboxPickerLoader(Context context, Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder, long accountId, boolean allowUnread) {
- super(context, uri, projection, selection, selectionArgs, sortOrder);
- mAccountId = accountId;
- mAllowUnread = allowUnread;
- }
-
- @Override
- public Cursor loadInBackground() {
- MatrixCursor unreadCursor =
- new MatrixCursor(MailboxShortcutPickerFragment.MATRIX_PROJECTION);
- Context context = getContext();
- if (mAllowUnread) {
- // For the special mailboxes, their ID is < 0. The UI list does not deal with
- // negative values very well, so, add MAX_VALUE to ensure they're positive, but,
- // don't clash with legitimate mailboxes.
- String mailboxName = context.getString(R.string.picker_mailbox_name_all_unread);
- unreadCursor.addRow(
- new Object[] {
- Integer.MAX_VALUE + Mailbox.QUERY_ALL_UNREAD,
- Mailbox.QUERY_ALL_UNREAD,
- mailboxName,
- });
- }
-
- if (mAccountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- // Do something special for the "combined" view
- MatrixCursor combinedMailboxesCursor =
- new MatrixCursor(MailboxShortcutPickerFragment.MATRIX_PROJECTION);
- // For the special mailboxes, their ID is < 0. The UI list does not deal with
- // negative values very well, so, add MAX_VALUE to ensure they're positive, but,
- // don't clash with legitimate mailboxes.
- String mailboxName = context.getString(R.string.picker_mailbox_name_all_inbox);
- combinedMailboxesCursor.addRow(
- new Object[] {
- Integer.MAX_VALUE + Mailbox.QUERY_ALL_INBOXES,
- Mailbox.QUERY_ALL_INBOXES,
- mailboxName
- });
- return new MergeCursor(new Cursor[] { combinedMailboxesCursor, unreadCursor });
- }
-
- // Loading for a regular account; perform a normal load
- return new MergeCursor(new Cursor[] { super.loadInBackground(), unreadCursor });
- }
- }
-
- /** Mailbox picker */
- public static class MailboxShortcutPickerFragment extends ShortcutPickerFragment {
- /** Allow all mailboxes in the mailbox list */
- public static int FILTER_ALLOW_ALL = 0;
- /** Only allow an account's INBOX */
- public static int FILTER_INBOX_ONLY = 1 << 0;
- /** Allow an "unread" mailbox; this is not affected by {@link #FILTER_INBOX_ONLY} */
- public static int FILTER_ALLOW_UNREAD = 1 << 1;
- /** Fragment argument to set filter values */
- static final String ARG_FILTER = "MailboxShortcutPickerFragment.filter";
- static final String ARG_ACCOUNT = "MailboxShortcutPickerFragment.account";
-
- private final static String REAL_ID = "realId";
- private final static String[] MAILBOX_FROM_COLUMNS = new String[] {
- MailboxColumns.DISPLAY_NAME,
- };
- /** Loader projection used for IMAP & POP3 accounts */
- private final static String[] IMAP_PROJECTION = new String [] {
- MailboxColumns.ID, MailboxColumns.ID + " as " + REAL_ID,
- MailboxColumns.SERVER_ID + " as " + MailboxColumns.DISPLAY_NAME
- };
- /** Loader projection used for EAS accounts */
- private final static String[] EAS_PROJECTION = new String [] {
- MailboxColumns.ID, MailboxColumns.ID + " as " + REAL_ID,
- MailboxColumns.DISPLAY_NAME
- };
- /** Loader projection used for a matrix cursor */
- private final static String[] MATRIX_PROJECTION = new String [] {
- MailboxColumns.ID, REAL_ID, MailboxColumns.DISPLAY_NAME
- };
- // TODO #ALL_MAILBOX_SELECTION is identical to MailboxesAdapter#ALL_MAILBOX_SELECTION;
- // create a common selection. Move this to the Mailbox class?
- /** Selection for all visible mailboxes for an account */
- private final static String ALL_MAILBOX_SELECTION = MailboxColumns.ACCOUNT_KEY + "=?" +
- " AND " + Mailbox.USER_VISIBLE_MAILBOX_SELECTION;
- /** Selection for just the INBOX of an account */
- private final static String INBOX_ONLY_SELECTION = ALL_MAILBOX_SELECTION +
- " AND " + MailboxColumns.TYPE + " = " + Mailbox.TYPE_INBOX;
- private volatile Boolean mLoadFinished = new Boolean(false);
- /** The currently selected account */
- private Account mAccount;
- /** The filter values; default to allow all mailboxes */
- private Integer mFilter;
-
- /**
- * Builds a mailbox shortcut picker for the given account.
- */
- public static MailboxShortcutPickerFragment newInstance(
- Context context, Account account, Integer filter) {
-
- MailboxShortcutPickerFragment fragment = new MailboxShortcutPickerFragment();
- Bundle args = new Bundle();
- args.putParcelable(ARG_ACCOUNT, account);
- args.putInt(ARG_FILTER, filter);
- fragment.setArguments(args);
- return fragment;
- }
-
- /** Returns the mailbox filter */
- int getFilter() {
- if (mFilter == null) {
- mFilter = getArguments().getInt(ARG_FILTER, FILTER_ALLOW_ALL);
- }
- return mFilter;
- }
-
- @Override
- public void onAttach(Activity activity) {
- // Need to setup the account first thing
- mAccount = getArguments().getParcelable(ARG_ACCOUNT);
- super.onAttach(activity);
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- getActivity().setTitle(R.string.mailbox_shortcut_picker_title);
- if (!mLoadFinished) {
- getActivity().setVisible(false);
- }
- }
-
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- Cursor cursor = (Cursor) parent.getItemAtPosition(position);
- long mailboxId = cursor.getLong(cursor.getColumnIndex(REAL_ID));
- mCallback.onSelected(mAccount, mailboxId);
- }
-
- @Override
- public Loader<Cursor> onCreateLoader(int id, Bundle args) {
- Context context = getActivity();
- // TODO Create a fully-qualified path name for Exchange accounts [code should also work
- // for MoveMessageToDialog.java]
- HostAuth recvAuth = mAccount.getOrCreateHostAuthRecv(context);
- final String[] projection;
- final String orderBy;
- final String selection;
- if (recvAuth.isEasConnection()) {
- projection = EAS_PROJECTION;
- orderBy = MailboxColumns.DISPLAY_NAME;
- } else {
- projection = IMAP_PROJECTION;
- orderBy = MailboxColumns.SERVER_ID;
- }
- if ((getFilter() & FILTER_INBOX_ONLY) == 0) {
- selection = ALL_MAILBOX_SELECTION;
- } else {
- selection = INBOX_ONLY_SELECTION;
- }
- return new MailboxPickerLoader(
- context, Mailbox.CONTENT_URI, projection, selection,
- new String[] { Long.toString(mAccount.mId) }, orderBy, mAccount.mId,
- (getFilter() & FILTER_ALLOW_UNREAD) != 0);
- }
-
- @Override
- public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
- // No accounts; close the dialog
- if (data.getCount() == 0) {
- mCallback.onMissingData(false, true);
- return;
- }
- // if there is only one mailbox, auto-select it
- if (data.getCount() == 1 && data.moveToFirst()) {
- long mailboxId = data.getLong(data.getColumnIndex(REAL_ID));
- mCallback.onSelected(mAccount, mailboxId);
- return;
- }
- super.onLoadFinished(loader, data);
- mLoadFinished = true;
- getActivity().setVisible(true);
- }
-
- @Override
- String[] getFromColumns() {
- return MAILBOX_FROM_COLUMNS;
- }
- }
-}
diff --git a/src/com/android/email/activity/ThreePaneLayout.java b/src/com/android/email/activity/ThreePaneLayout.java
deleted file mode 100644
index a28b3c8a2..000000000
--- a/src/com/android/email/activity/ThreePaneLayout.java
+++ /dev/null
@@ -1,629 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.animation.Animator;
-import android.animation.ObjectAnimator;
-import android.animation.PropertyValuesHolder;
-import android.animation.TimeInterpolator;
-import android.content.Context;
-import android.content.res.Resources;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.LinearLayout;
-
-import com.android.email.R;
-import com.android.emailcommon.Logging;
-
-/**
- * The "three pane" layout used on tablet.
- *
- * This layout can show up to two panes at any given time, and operates in two different modes.
- * See {@link #isPaneCollapsible()} for details on the two modes.
- *
- * TODO Unit tests, when UX is settled.
- *
- * TODO onVisiblePanesChanged() should be called *AFTER* the animation, not before.
- */
-public class ThreePaneLayout extends LinearLayout implements View.OnClickListener {
- private static final boolean ANIMATION_DEBUG = false; // DON'T SUBMIT WITH true
-
- private static final int ANIMATION_DURATION = ANIMATION_DEBUG ? 1000 : 150;
- private static final TimeInterpolator INTERPOLATOR = new DecelerateInterpolator(1.75f);
-
- /** Uninitialized state -- {@link #changePaneState} hasn't been called yet. */
- private static final int STATE_UNINITIALIZED = -1;
-
- /** Mailbox list + message list both visible. */
- private static final int STATE_LEFT_VISIBLE = 0;
-
- /**
- * A view where the MessageView is visible. The MessageList is visible if
- * {@link #isPaneCollapsible} is false, but is otherwise collapsed and hidden.
- */
- private static final int STATE_RIGHT_VISIBLE = 1;
-
- /**
- * A view where the MessageView is partially visible and a collapsible MessageList on the left
- * has been expanded to be in view. {@link #isPaneCollapsible} must return true for this
- * state to be active.
- */
- private static final int STATE_MIDDLE_EXPANDED = 2;
-
- // Flags for getVisiblePanes()
- public static final int PANE_LEFT = 1 << 2;
- public static final int PANE_MIDDLE = 1 << 1;
- public static final int PANE_RIGHT = 1 << 0;
-
- /** Current pane state. See {@link #changePaneState} */
- private int mPaneState = STATE_UNINITIALIZED;
-
- /** See {@link #changePaneState} and {@link #onFirstSizeChanged} */
- private int mInitialPaneState = STATE_UNINITIALIZED;
-
- private View mLeftPane;
- private View mMiddlePane;
- private View mRightPane;
- private MessageCommandButtonView mMessageCommandButtons;
-
- // Views used only when the left pane is collapsible.
- private View mFoggedGlass;
-
- private boolean mFirstSizeChangedDone;
-
- /** Mailbox list width. Comes from resources. */
- private int mMailboxListWidth;
- /**
- * Message list width, on:
- * - the message list + message view mode, when the left pane is not collapsible
- * - the message view + expanded message list mode, when the left pane is collapsible
- * Comes from resources.
- */
- private int mMessageListWidth;
-
- /** Hold last animator to cancel. */
- private Animator mLastAnimator;
-
- /**
- * Hold last animator listener to cancel. See {@link #startLayoutAnimation} for why
- * we need both {@link #mLastAnimator} and {@link #mLastAnimatorListener}
- */
- private AnimatorListener mLastAnimatorListener;
-
- // 2nd index for {@link #changePaneState}
- private static final int INDEX_VISIBLE = 0;
- private static final int INDEX_INVISIBLE = 1;
- private static final int INDEX_GONE = 2;
-
- // Arrays used in {@link #changePaneState}
- // First index: STATE_*
- // Second index: INDEX_*
- private View[][][] mShowHideViews;
-
- private Callback mCallback = EmptyCallback.INSTANCE;
-
- public interface Callback {
- /** Called when {@link ThreePaneLayout#getVisiblePanes()} has changed. */
- public void onVisiblePanesChanged(int previousVisiblePanes);
- }
-
- private static final class EmptyCallback implements Callback {
- public static final Callback INSTANCE = new EmptyCallback();
-
- @Override public void onVisiblePanesChanged(int previousVisiblePanes) {}
- }
-
- public ThreePaneLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- initView();
- }
-
- public ThreePaneLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- initView();
- }
-
- public ThreePaneLayout(Context context) {
- super(context);
- initView();
- }
-
- /** Perform basic initialization */
- private void initView() {
- setOrientation(LinearLayout.HORIZONTAL); // Always horizontal
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- mLeftPane = findViewById(R.id.left_pane);
- mMiddlePane = findViewById(R.id.middle_pane);
- mMessageCommandButtons =
- (MessageCommandButtonView) findViewById(R.id.message_command_buttons);
-
- mFoggedGlass = findViewById(R.id.fogged_glass);
- if (mFoggedGlass != null) {
- mRightPane = findViewById(R.id.right_pane_with_fog);
- mFoggedGlass.setOnClickListener(this);
- } else {
- mRightPane = findViewById(R.id.right_pane);
- }
-
- if (!isPaneCollapsible()) {
- mShowHideViews = new View[][][] {
- // STATE_LEFT_VISIBLE
- {
- {mLeftPane, mMiddlePane}, // Visible
- {mRightPane}, // Invisible
- {mMessageCommandButtons}, // Gone
- },
- // STATE_RIGHT_VISIBLE
- {
- {mMiddlePane, mMessageCommandButtons, mRightPane}, // Visible
- {mLeftPane}, // Invisible
- {}, // Gone
- },
- // STATE_MIDDLE_EXPANDED
- {
- {}, // Visible
- {}, // Invisible
- {}, // Gone
- },
- };
- } else {
- mShowHideViews = new View[][][] {
- // STATE_LEFT_VISIBLE
- {
- {mLeftPane, mMiddlePane}, // Visible
- {mRightPane, mFoggedGlass}, // Invisible
- {mMessageCommandButtons}, // Gone
- },
- // STATE_RIGHT_VISIBLE
- {
- {mRightPane, mMessageCommandButtons}, // Visible
- {mLeftPane, mMiddlePane, mFoggedGlass}, // Invisible
- {}, // Gone
- },
- // STATE_MIDDLE_EXPANDED
- {
- {mMiddlePane, mRightPane, mMessageCommandButtons, mFoggedGlass}, // Visible
- {mLeftPane}, // Invisible
- {}, // Gone
- },
- };
- }
-
- mInitialPaneState = STATE_LEFT_VISIBLE;
-
- final Resources resources = getResources();
- mMailboxListWidth = getResources().getDimensionPixelSize(
- R.dimen.mailbox_list_width);
- mMessageListWidth = getResources().getDimensionPixelSize(R.dimen.message_list_width);
- }
-
-
- public void setCallback(Callback callback) {
- mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback;
- }
-
- /**
- * Return whether or not the left pane should be collapsible.
- */
- public boolean isPaneCollapsible() {
- return mFoggedGlass != null;
- }
-
- public MessageCommandButtonView getMessageCommandButtons() {
- return mMessageCommandButtons;
- }
-
- @Override
- protected Parcelable onSaveInstanceState() {
- SavedState ss = new SavedState(super.onSaveInstanceState());
- ss.mPaneState = mPaneState;
- return ss;
- }
-
- @Override
- protected void onRestoreInstanceState(Parcelable state) {
- // Called after onFinishInflate()
- SavedState ss = (SavedState) state;
- super.onRestoreInstanceState(ss.getSuperState());
- mInitialPaneState = ss.mPaneState;
- }
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
- if (!mFirstSizeChangedDone) {
- mFirstSizeChangedDone = true;
- onFirstSizeChanged();
- }
- }
-
- /**
- * @return bit flags for visible panes. Combination of {@link #PANE_LEFT}, {@link #PANE_MIDDLE}
- * and {@link #PANE_RIGHT},
- */
- public int getVisiblePanes() {
- int ret = 0;
- if (mLeftPane.getVisibility() == View.VISIBLE) ret |= PANE_LEFT;
- if (mMiddlePane.getVisibility() == View.VISIBLE) ret |= PANE_MIDDLE;
- if (mRightPane.getVisibility() == View.VISIBLE) ret |= PANE_RIGHT;
- return ret;
- }
-
- public boolean isLeftPaneVisible() {
- return mLeftPane.getVisibility() == View.VISIBLE;
- }
- public boolean isMiddlePaneVisible() {
- return mMiddlePane.getVisibility() == View.VISIBLE;
- }
- public boolean isRightPaneVisible() {
- return mRightPane.getVisibility() == View.VISIBLE;
- }
-
- /**
- * Handles the back event.
- *
- */
- public boolean uncollapsePane() {
- if (!isPaneCollapsible()) {
- return false;
- }
-
- if (mPaneState == STATE_RIGHT_VISIBLE) {
- return changePaneState(STATE_MIDDLE_EXPANDED, true);
- } else if (mInitialPaneState == STATE_RIGHT_VISIBLE) {
- mInitialPaneState = STATE_MIDDLE_EXPANDED;
- return true;
- }
-
- return false;
- }
-
- /**
- * Show the left most pane. (i.e. mailbox list)
- */
- public boolean showLeftPane() {
- return changePaneState(STATE_LEFT_VISIBLE, true);
- }
-
- /**
- * Before the first call to {@link #onSizeChanged}, we don't know the width of the view, so we
- * can't layout properly. We just remember all the requests to {@link #changePaneState}
- * until the first {@link #onSizeChanged}, at which point we actually change to the last
- * requested state.
- */
- private void onFirstSizeChanged() {
- if (mInitialPaneState != STATE_UNINITIALIZED) {
- changePaneState(mInitialPaneState, false);
- mInitialPaneState = STATE_UNINITIALIZED;
- }
- }
-
- /**
- * Show the right most pane. (i.e. message view)
- */
- public boolean showRightPane() {
- return changePaneState(STATE_RIGHT_VISIBLE, true);
- }
-
- private boolean changePaneState(int newState, boolean animate) {
- if (!isPaneCollapsible() && (newState == STATE_MIDDLE_EXPANDED)) {
- newState = STATE_RIGHT_VISIBLE;
- }
- if (!mFirstSizeChangedDone) {
- // Before first onSizeChanged(), we don't know the width of the view, so we can't
- // layout properly.
- // Just remember the new state and return.
- mInitialPaneState = newState;
- return false;
- }
- if (newState == mPaneState) {
- return false;
- }
- // Just make sure the first transition doesn't animate.
- if (mPaneState == STATE_UNINITIALIZED) {
- animate = false;
- }
-
- final int previousVisiblePanes = getVisiblePanes();
- mPaneState = newState;
-
- // Animate to the new state.
- // (We still use animator even if animate == false; we just use 0 duration.)
- final int totalWidth = getMeasuredWidth();
-
- final int expectedMailboxLeft;
- final int expectedMessageListWidth;
-
- final String animatorLabel; // for debug purpose
-
- if (!isPaneCollapsible()) {
- setViewWidth(mLeftPane, mMailboxListWidth);
- setViewWidth(mRightPane, totalWidth - mMessageListWidth);
-
- switch (mPaneState) {
- case STATE_LEFT_VISIBLE:
- // mailbox + message list
- animatorLabel = "moving to [mailbox list + message list]";
- expectedMailboxLeft = 0;
- expectedMessageListWidth = totalWidth - mMailboxListWidth;
- break;
- case STATE_RIGHT_VISIBLE:
- // message list + message view
- animatorLabel = "moving to [message list + message view]";
- expectedMailboxLeft = -mMailboxListWidth;
- expectedMessageListWidth = mMessageListWidth;
- break;
- default:
- throw new IllegalStateException();
- }
-
- } else {
- setViewWidth(mLeftPane, mMailboxListWidth);
- setViewWidth(mRightPane, totalWidth);
-
- switch (mPaneState) {
- case STATE_LEFT_VISIBLE:
- // message list + Message view -> mailbox + message list
- animatorLabel = "moving to [mailbox list + message list]";
- expectedMailboxLeft = 0;
- expectedMessageListWidth = totalWidth - mMailboxListWidth;
- break;
- case STATE_MIDDLE_EXPANDED:
- // mailbox + message list -> message list + message view
- animatorLabel = "moving to [message list + message view]";
- expectedMailboxLeft = -mMailboxListWidth;
- expectedMessageListWidth = mMessageListWidth;
- break;
- case STATE_RIGHT_VISIBLE:
- // message view only
- animatorLabel = "moving to [message view]";
- expectedMailboxLeft = -(mMailboxListWidth + mMessageListWidth);
- expectedMessageListWidth = mMessageListWidth;
- break;
- default:
- throw new IllegalStateException();
- }
- }
-
- final View[][] showHideViews = mShowHideViews[mPaneState];
- final AnimatorListener listener = new AnimatorListener(animatorLabel,
- showHideViews[INDEX_VISIBLE],
- showHideViews[INDEX_INVISIBLE],
- showHideViews[INDEX_GONE],
- previousVisiblePanes);
-
- // Animation properties -- mailbox list left and message list width, at the same time.
- startLayoutAnimation(animate ? ANIMATION_DURATION : 0, listener,
- PropertyValuesHolder.ofInt(PROP_MAILBOX_LIST_LEFT,
- getCurrentMailboxLeft(), expectedMailboxLeft),
- PropertyValuesHolder.ofInt(PROP_MESSAGE_LIST_WIDTH,
- getCurrentMessageListWidth(), expectedMessageListWidth)
- );
- return true;
- }
-
- /**
- * @return The ID of the view for the left pane fragment. (i.e. mailbox list)
- */
- public int getLeftPaneId() {
- return R.id.left_pane;
- }
-
- /**
- * @return The ID of the view for the middle pane fragment. (i.e. message list)
- */
- public int getMiddlePaneId() {
- return R.id.middle_pane;
- }
-
- /**
- * @return The ID of the view for the right pane fragment. (i.e. message view)
- */
- public int getRightPaneId() {
- return R.id.right_pane;
- }
-
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.fogged_glass:
- if (!isPaneCollapsible()) {
- return; // Shouldn't happen
- }
- changePaneState(STATE_RIGHT_VISIBLE, true);
- break;
- }
- }
-
- private void setViewWidth(View v, int value) {
- v.getLayoutParams().width = value;
- requestLayout();
- }
-
- private static final String PROP_MAILBOX_LIST_LEFT = "mailboxListLeftAnim";
- private static final String PROP_MESSAGE_LIST_WIDTH = "messageListWidthAnim";
-
- public void setMailboxListLeftAnim(int value) {
- ((ViewGroup.MarginLayoutParams) mLeftPane.getLayoutParams()).leftMargin = value;
- requestLayout();
- }
-
- public void setMessageListWidthAnim(int value) {
- setViewWidth(mMiddlePane, value);
- }
-
- private int getCurrentMailboxLeft() {
- return ((ViewGroup.MarginLayoutParams) mLeftPane.getLayoutParams()).leftMargin;
- }
-
- private int getCurrentMessageListWidth() {
- return mMiddlePane.getLayoutParams().width;
- }
-
- /**
- * Helper method to start animation.
- */
- private void startLayoutAnimation(int duration, AnimatorListener listener,
- PropertyValuesHolder... values) {
- if (mLastAnimator != null) {
- mLastAnimator.cancel();
- }
- if (mLastAnimatorListener != null) {
- if (ANIMATION_DEBUG) {
- Log.w(Logging.LOG_TAG, "Anim: Cancelling last animation: " + mLastAnimator);
- }
- // Animator.cancel() doesn't call listener.cancel() immediately, so sometimes
- // we end up cancelling the previous one *after* starting the next one.
- // Directly tell the listener it's cancelled to avoid that.
- mLastAnimatorListener.cancel();
- }
-
- final ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(
- this, values).setDuration(duration);
- animator.setInterpolator(INTERPOLATOR);
- if (listener != null) {
- animator.addListener(listener);
- }
- mLastAnimator = animator;
- mLastAnimatorListener = listener;
- animator.start();
- }
-
- /**
- * Animation listener.
- *
- * Update the visibility of each pane before/after an animation.
- */
- private class AnimatorListener implements Animator.AnimatorListener {
- private final String mLogLabel;
- private final View[] mViewsVisible;
- private final View[] mViewsInvisible;
- private final View[] mViewsGone;
- private final int mPreviousVisiblePanes;
-
- private boolean mCancelled;
-
- public AnimatorListener(String logLabel, View[] viewsVisible, View[] viewsInvisible,
- View[] viewsGone, int previousVisiblePanes) {
- mLogLabel = logLabel;
- mViewsVisible = viewsVisible;
- mViewsInvisible = viewsInvisible;
- mViewsGone = viewsGone;
- mPreviousVisiblePanes = previousVisiblePanes;
- }
-
- private void log(String message) {
- if (ANIMATION_DEBUG) {
- Log.w(Logging.LOG_TAG, "Anim: " + mLogLabel + "[" + this + "] " + message);
- }
- }
-
- public void cancel() {
- log("cancel");
- mCancelled = true;
- }
-
- /**
- * Show the about-to-become-visible panes before an animation.
- */
- @Override
- public void onAnimationStart(Animator animation) {
- log("start");
- for (View v : mViewsVisible) {
- v.setVisibility(View.VISIBLE);
- }
-
- // TODO These things, making invisible views and calling the visible pane changed
- // callback, should really be done in onAnimationEnd.
- // However, because we may want to initiate a fragment transaction in the callback but
- // by the time animation is done, the activity may be stopped (by user's HOME press),
- // it's not easy to get right. For now, we just do this before the animation.
- for (View v : mViewsInvisible) {
- v.setVisibility(View.INVISIBLE);
- }
- for (View v : mViewsGone) {
- v.setVisibility(View.GONE);
- }
- mCallback.onVisiblePanesChanged(mPreviousVisiblePanes);
- }
-
- @Override
- public void onAnimationRepeat(Animator animation) {
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {
- }
-
- /**
- * Hide the about-to-become-hidden panes after an animation.
- */
- @Override
- public void onAnimationEnd(Animator animation) {
- if (mCancelled) {
- return; // But they shouldn't be hidden when cancelled.
- }
- log("end");
- }
- }
-
- private static class SavedState extends BaseSavedState {
- int mPaneState;
-
- /**
- * Constructor called from {@link ThreePaneLayout#onSaveInstanceState()}
- */
- SavedState(Parcelable superState) {
- super(superState);
- }
-
- /**
- * Constructor called from {@link #CREATOR}
- */
- private SavedState(Parcel in) {
- super(in);
- mPaneState = in.readInt();
- }
-
- @Override
- public void writeToParcel(Parcel out, int flags) {
- super.writeToParcel(out, flags);
- out.writeInt(mPaneState);
- }
-
- public static final Parcelable.Creator<SavedState> CREATOR
- = new Parcelable.Creator<SavedState>() {
- public SavedState createFromParcel(Parcel in) {
- return new SavedState(in);
- }
-
- public SavedState[] newArray(int size) {
- return new SavedState[size];
- }
- };
- }
-}
diff --git a/src/com/android/email/activity/UIControllerBase.java b/src/com/android/email/activity/UIControllerBase.java
deleted file mode 100644
index 15809acd2..000000000
--- a/src/com/android/email/activity/UIControllerBase.java
+++ /dev/null
@@ -1,1040 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-
-import com.android.email.Email;
-import com.android.email.FolderProperties;
-import com.android.email.MessageListContext;
-import com.android.email.Preferences;
-import com.android.email.R;
-import com.android.email.RefreshManager;
-import com.android.email.RequireManualSyncDialog;
-import com.android.email.activity.setup.AccountSettings;
-import com.android.email.activity.setup.MailboxSettings;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.base.Objects;
-import com.google.common.base.Preconditions;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Base class for the UI controller.
- */
-abstract class UIControllerBase implements MailboxListFragment.Callback,
- MessageListFragment.Callback, MessageViewFragment.Callback {
- static final boolean DEBUG_FRAGMENTS = false; // DO NOT SUBMIT WITH TRUE
-
- static final String KEY_LIST_CONTEXT = "UIControllerBase.listContext";
-
- /** The owner activity */
- final EmailActivity mActivity;
- final FragmentManager mFragmentManager;
-
- protected final ActionBarController mActionBarController;
-
- private MessageOrderManager mOrderManager;
- private final MessageOrderManagerCallback mMessageOrderManagerCallback =
- new MessageOrderManagerCallback();
-
- final EmailAsyncTask.Tracker mTaskTracker = new EmailAsyncTask.Tracker();
-
- final RefreshManager mRefreshManager;
-
- /**
- * Fragments that are installed.
- *
- * A fragment is installed in {@link Fragment#onActivityCreated} and uninstalled in
- * {@link Fragment#onDestroyView}, using {@link FragmentInstallable} callbacks.
- *
- * This means fragments in the back stack are *not* installed.
- *
- * We set callbacks to fragments only when they are installed.
- *
- * @see FragmentInstallable
- */
- private MailboxListFragment mMailboxListFragment;
- private MessageListFragment mMessageListFragment;
- private MessageViewFragment mMessageViewFragment;
-
- /**
- * To avoid double-deleting a fragment (which will cause a runtime exception),
- * we put a fragment in this list when we {@link FragmentTransaction#remove(Fragment)} it,
- * and remove from the list when we actually uninstall it.
- */
- private final List<Fragment> mRemovedFragments = new LinkedList<Fragment>();
-
- /**
- * The NfcHandler implements Near Field Communication sharing features
- * whenever the activity is in the foreground.
- */
- private NfcHandler mNfcHandler;
-
- /**
- * The active context for the current MessageList.
- * In some UI layouts such as the one-pane view, the message list may not be visible, but is
- * on the backstack. This list context will still be accessible in those cases.
- *
- * Should be set using {@link #setListContext(MessageListContext)}.
- */
- protected MessageListContext mListContext;
-
- private class RefreshListener implements RefreshManager.Listener {
- private MenuItem mRefreshIcon;
-
- @Override
- public void onMessagingError(final long accountId, long mailboxId, final String message) {
- updateRefreshIcon();
- }
-
- @Override
- public void onRefreshStatusChanged(long accountId, long mailboxId) {
- updateRefreshIcon();
- }
-
- void setRefreshIcon(MenuItem icon) {
- mRefreshIcon = icon;
- updateRefreshIcon();
- }
-
- private void updateRefreshIcon() {
- if (mRefreshIcon == null) {
- return;
- }
-
- if (isRefreshInProgress()) {
- mRefreshIcon.setActionView(R.layout.action_bar_indeterminate_progress);
- } else {
- mRefreshIcon.setActionView(null);
- }
- }
- };
-
- private final RefreshListener mRefreshListener = new RefreshListener();
-
- public UIControllerBase(EmailActivity activity) {
- mActivity = activity;
- mFragmentManager = activity.getFragmentManager();
- mRefreshManager = RefreshManager.getInstance(mActivity);
- mActionBarController = createActionBarController(activity);
- if (DEBUG_FRAGMENTS) {
- FragmentManager.enableDebugLogging(true);
- }
- }
-
- /**
- * Called by the base class to let a subclass create an {@link ActionBarController}.
- */
- protected abstract ActionBarController createActionBarController(Activity activity);
-
- /** @return the layout ID for the activity. */
- public abstract int getLayoutId();
-
- /**
- * Must be called just after the activity sets up the content view. Used to initialize views.
- *
- * (Due to the complexity regarding class/activity initialization order, we can't do this in
- * the constructor.)
- */
- public void onActivityViewReady() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onActivityViewReady");
- }
- }
-
- /**
- * Called at the end of {@link EmailActivity#onCreate}.
- */
- public void onActivityCreated() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onActivityCreated");
- }
- mRefreshManager.registerListener(mRefreshListener);
- mActionBarController.onActivityCreated();
- mNfcHandler = NfcHandler.register(this, mActivity);
- }
-
- /**
- * Handles the {@link android.app.Activity#onStart} callback.
- */
- public void onActivityStart() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onActivityStart");
- }
- if (isMessageViewInstalled()) {
- updateMessageOrderManager();
- }
- }
-
- /**
- * Handles the {@link android.app.Activity#onResume} callback.
- */
- public void onActivityResume() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onActivityResume");
- }
- refreshActionBar();
- if (mNfcHandler != null) {
- mNfcHandler.onAccountChanged(); // workaround for email not set on initial load
- }
- long accountId = getUIAccountId();
- Preferences.getPreferences(mActivity).setLastUsedAccountId(accountId);
- showAccountSpecificWarning(accountId);
- }
-
- /**
- * Handles the {@link android.app.Activity#onPause} callback.
- */
- public void onActivityPause() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onActivityPause");
- }
- }
-
- /**
- * Handles the {@link android.app.Activity#onStop} callback.
- */
- public void onActivityStop() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onActivityStop");
- }
- stopMessageOrderManager();
- }
-
- /**
- * Handles the {@link android.app.Activity#onDestroy} callback.
- */
- public void onActivityDestroy() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onActivityDestroy");
- }
- mActionBarController.onActivityDestroy();
- mRefreshManager.unregisterListener(mRefreshListener);
- mTaskTracker.cancellAllInterrupt();
- }
-
- /**
- * Handles the {@link android.app.Activity#onSaveInstanceState} callback.
- */
- public void onSaveInstanceState(Bundle outState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onSaveInstanceState");
- }
- mActionBarController.onSaveInstanceState(outState);
- outState.putParcelable(KEY_LIST_CONTEXT, mListContext);
- }
-
- /**
- * Handles the {@link android.app.Activity#onRestoreInstanceState} callback.
- */
- public void onRestoreInstanceState(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " restoreInstanceState");
- }
- mActionBarController.onRestoreInstanceState(savedInstanceState);
- mListContext = savedInstanceState.getParcelable(KEY_LIST_CONTEXT);
- }
-
- // MessageViewFragment$Callback
- @Override
- public void onMessageSetUnread() {
- doAutoAdvance();
- }
-
- // MessageViewFragment$Callback
- @Override
- public void onMessageNotExists() {
- doAutoAdvance();
- }
-
- // MessageViewFragment$Callback
- @Override
- public void onRespondedToInvite(int response) {
- doAutoAdvance();
- }
-
- // MessageViewFragment$Callback
- @Override
- public void onBeforeMessageGone() {
- doAutoAdvance();
- }
-
- /**
- * Install a fragment. Must be caleld from the host activity's
- * {@link FragmentInstallable#onInstallFragment}.
- */
- public final void onInstallFragment(Fragment fragment) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onInstallFragment fragment=" + fragment);
- }
- if (fragment instanceof MailboxListFragment) {
- installMailboxListFragment((MailboxListFragment) fragment);
- } else if (fragment instanceof MessageListFragment) {
- installMessageListFragment((MessageListFragment) fragment);
- } else if (fragment instanceof MessageViewFragment) {
- installMessageViewFragment((MessageViewFragment) fragment);
- } else {
- throw new IllegalArgumentException("Tried to install unknown fragment");
- }
- }
-
- /** Install fragment */
- protected void installMailboxListFragment(MailboxListFragment fragment) {
- mMailboxListFragment = fragment;
- mMailboxListFragment.setCallback(this);
-
- // TODO: consolidate this refresh with the one that the Fragment itself does. since
- // the fragment calls setHasOptionsMenu(true) - it invalidates when it gets attached.
- // However the timing is slightly different and leads to a delay in update if this isn't
- // here - investigate why. same for the other installs.
- refreshActionBar();
- }
-
- /** Install fragment */
- protected void installMessageListFragment(MessageListFragment fragment) {
- mMessageListFragment = fragment;
- mMessageListFragment.setCallback(this);
- refreshActionBar();
- }
-
- /** Install fragment */
- protected void installMessageViewFragment(MessageViewFragment fragment) {
- mMessageViewFragment = fragment;
- mMessageViewFragment.setCallback(this);
-
- updateMessageOrderManager();
- refreshActionBar();
- }
-
- /**
- * Uninstall a fragment. Must be caleld from the host activity's
- * {@link FragmentInstallable#onUninstallFragment}.
- */
- public final void onUninstallFragment(Fragment fragment) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " onUninstallFragment fragment=" + fragment);
- }
- mRemovedFragments.remove(fragment);
- if (fragment == mMailboxListFragment) {
- uninstallMailboxListFragment();
- } else if (fragment == mMessageListFragment) {
- uninstallMessageListFragment();
- } else if (fragment == mMessageViewFragment) {
- uninstallMessageViewFragment();
- } else {
- throw new IllegalArgumentException("Tried to uninstall unknown fragment");
- }
- }
-
- /** Uninstall {@link MailboxListFragment} */
- protected void uninstallMailboxListFragment() {
- mMailboxListFragment.setCallback(null);
- mMailboxListFragment = null;
- }
-
- /** Uninstall {@link MessageListFragment} */
- protected void uninstallMessageListFragment() {
- mMessageListFragment.setCallback(null);
- mMessageListFragment = null;
- }
-
- /** Uninstall {@link MessageViewFragment} */
- protected void uninstallMessageViewFragment() {
- mMessageViewFragment.setCallback(null);
- mMessageViewFragment = null;
- }
-
- /**
- * If a {@link Fragment} is not already in {@link #mRemovedFragments},
- * {@link FragmentTransaction#remove} it and add to the list.
- *
- * Do nothing if {@code fragment} is null.
- */
- protected final void removeFragment(FragmentTransaction ft, Fragment fragment) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " removeFragment fragment=" + fragment);
- }
- if (fragment == null) {
- return;
- }
- if (!mRemovedFragments.contains(fragment)) {
- // Remove try/catch when b/4981556 is fixed (framework bug)
- try {
- ft.remove(fragment);
- } catch (IllegalStateException ex) {
- Log.e(Logging.LOG_TAG, "Swalling IllegalStateException due to known bug for "
- + " fragment: " + fragment, ex);
- Log.e(Logging.LOG_TAG, Utility.dumpFragment(fragment));
- }
- addFragmentToRemovalList(fragment);
- }
- }
-
- /**
- * Remove a {@link Fragment} from {@link #mRemovedFragments}. No-op if {@code fragment} is
- * null.
- *
- * {@link #removeMailboxListFragment}, {@link #removeMessageListFragment} and
- * {@link #removeMessageViewFragment} all call this, so subclasses don't have to do this when
- * using them.
- *
- * However, unfortunately, subclasses have to call this manually when popping from the
- * back stack to avoid double-delete.
- */
- protected void addFragmentToRemovalList(Fragment fragment) {
- if (fragment != null) {
- mRemovedFragments.add(fragment);
- }
- }
-
- /**
- * Remove the fragment if it's installed.
- */
- protected FragmentTransaction removeMailboxListFragment(FragmentTransaction ft) {
- removeFragment(ft, mMailboxListFragment);
- return ft;
- }
-
- /**
- * Remove the fragment if it's installed.
- */
- protected FragmentTransaction removeMessageListFragment(FragmentTransaction ft) {
- removeFragment(ft, mMessageListFragment);
- return ft;
- }
-
- /**
- * Remove the fragment if it's installed.
- */
- protected FragmentTransaction removeMessageViewFragment(FragmentTransaction ft) {
- removeFragment(ft, mMessageViewFragment);
- return ft;
- }
-
- /** @return true if a {@link MailboxListFragment} is installed. */
- protected final boolean isMailboxListInstalled() {
- return mMailboxListFragment != null;
- }
-
- /** @return true if a {@link MessageListFragment} is installed. */
- protected final boolean isMessageListInstalled() {
- return mMessageListFragment != null;
- }
-
- /** @return true if a {@link MessageViewFragment} is installed. */
- protected final boolean isMessageViewInstalled() {
- return mMessageViewFragment != null;
- }
-
- /** @return the installed {@link MailboxListFragment} or null. */
- protected final MailboxListFragment getMailboxListFragment() {
- return mMailboxListFragment;
- }
-
- /** @return the installed {@link MessageListFragment} or null. */
- protected final MessageListFragment getMessageListFragment() {
- return mMessageListFragment;
- }
-
- /** @return the installed {@link MessageViewFragment} or null. */
- protected final MessageViewFragment getMessageViewFragment() {
- return mMessageViewFragment;
- }
-
- /**
- * Commit a {@link FragmentTransaction}.
- */
- protected void commitFragmentTransaction(FragmentTransaction ft) {
- if (DEBUG_FRAGMENTS) {
- Log.d(Logging.LOG_TAG, this + " commitFragmentTransaction: " + ft);
- }
- if (!ft.isEmpty()) {
- // NB: there should be no cases in which a transaction is committed after
- // onSaveInstanceState. Unfortunately, the "state loss" check also happens when in
- // LoaderCallbacks.onLoadFinished, and we wish to perform transactions there. The check
- // by the framework is conservative and prevents cases where there are transactions
- // affecting Loader lifecycles - but we have no such cases.
- // TODO: use asynchronous callbacks from loaders to avoid this implicit dependency
- ft.commitAllowingStateLoss();
- mFragmentManager.executePendingTransactions();
- }
- }
-
- /**
- * @return the currently selected account ID, *or* {@link Account#ACCOUNT_ID_COMBINED_VIEW}.
- *
- * @see #getActualAccountId()
- */
- public abstract long getUIAccountId();
-
- /**
- * @return true if an account is selected, or the current view is the combined view.
- */
- public final boolean isAccountSelected() {
- return getUIAccountId() != Account.NO_ACCOUNT;
- }
-
- /**
- * @return if an actual account is selected. (i.e. {@link Account#ACCOUNT_ID_COMBINED_VIEW}
- * is not considered "actual".s)
- */
- public final boolean isActualAccountSelected() {
- return isAccountSelected() && (getUIAccountId() != Account.ACCOUNT_ID_COMBINED_VIEW);
- }
-
- /**
- * @return the currently selected account ID. If the current view is the combined view,
- * it'll return {@link Account#NO_ACCOUNT}.
- *
- * @see #getUIAccountId()
- */
- public final long getActualAccountId() {
- return isActualAccountSelected() ? getUIAccountId() : Account.NO_ACCOUNT;
- }
-
- /**
- * Show the default view for the given account.
- *
- * @param accountId ID of the account to load. Can be {@link Account#ACCOUNT_ID_COMBINED_VIEW}.
- * Must never be {@link Account#NO_ACCOUNT}.
- * @param forceShowInbox If {@code false} and the given account is already selected, do nothing.
- * If {@code false}, we always change the view even if the account is selected.
- */
- public final void switchAccount(long accountId, boolean forceShowInbox) {
-
- if (Account.isSecurityHold(mActivity, accountId)) {
- ActivityHelper.showSecurityHoldDialog(mActivity, accountId);
- mActivity.finish();
- return;
- }
-
- if (accountId == getUIAccountId() && !forceShowInbox) {
- // Do nothing if the account is already selected. Not even going back to the inbox.
- return;
- }
- if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- openMailbox(accountId, Mailbox.QUERY_ALL_INBOXES);
- } else {
- long inboxId = Mailbox.findMailboxOfType(mActivity, accountId, Mailbox.TYPE_INBOX);
- if (inboxId == Mailbox.NO_MAILBOX) {
- // The account doesn't have Inbox yet... Redirect to Welcome and let it wait for
- // the initial sync...
- Log.w(Logging.LOG_TAG, "Account " + accountId +" doesn't have Inbox. Redirecting"
- + " to Welcome...");
- Welcome.actionOpenAccountInbox(mActivity, accountId);
- mActivity.finish();
- } else {
- openMailbox(accountId, inboxId);
- }
- }
- if (mNfcHandler != null) {
- mNfcHandler.onAccountChanged();
- }
- Preferences.getPreferences(mActivity).setLastUsedAccountId(accountId);
- showAccountSpecificWarning(accountId);
- }
-
- /**
- * Returns the id of the parent mailbox used for the mailbox list fragment.
- *
- * IMPORTANT: Do not confuse {@link #getMailboxListMailboxId()} with
- * {@link #getMessageListMailboxId()}
- */
- protected long getMailboxListMailboxId() {
- return isMailboxListInstalled() ? getMailboxListFragment().getSelectedMailboxId()
- : Mailbox.NO_MAILBOX;
- }
-
- /**
- * Returns the id of the mailbox used for the message list fragment.
- *
- * IMPORTANT: Do not confuse {@link #getMailboxListMailboxId()} with
- * {@link #getMessageListMailboxId()}
- */
- protected long getMessageListMailboxId() {
- return isMessageListInstalled() ? getMessageListFragment().getMailboxId()
- : Mailbox.NO_MAILBOX;
- }
-
- /**
- * Shortcut for {@link #open} with {@link Message#NO_MESSAGE}.
- */
- protected final void openMailbox(long accountId, long mailboxId) {
- open(MessageListContext.forMailbox(accountId, mailboxId), Message.NO_MESSAGE);
- }
-
- /**
- * Opens a given list
- * @param listContext the list context for the message list to open
- * @param messageId if specified and not {@link Message#NO_MESSAGE}, will open the message
- * in the message list.
- */
- public final void open(final MessageListContext listContext, final long messageId) {
- setListContext(listContext);
- openInternal(listContext, messageId);
-
- if (listContext.isSearch()) {
- mActionBarController.enterSearchMode(listContext.getSearchParams().mFilter);
- }
- }
-
- /**
- * Sets the internal value of the list context for the message list.
- */
- protected void setListContext(MessageListContext listContext) {
- if (Objects.equal(listContext, mListContext)) {
- return;
- }
-
- if (Email.DEBUG && Logging.DEBUG_LIFECYCLE) {
- Log.i(Logging.LOG_TAG, this + " setListContext: " + listContext);
- }
- mListContext = listContext;
- }
-
- protected abstract void openInternal(
- final MessageListContext listContext, final long messageId);
-
- /**
- * Performs the back action.
- *
- * @param isSystemBackKey <code>true</code> if the system back key was pressed.
- * <code>false</code> if it's caused by the "home" icon click on the action bar.
- */
- public abstract boolean onBackPressed(boolean isSystemBackKey);
-
- public void onSearchStarted() {
- // Show/hide the original search icon.
- mActivity.invalidateOptionsMenu();
- }
-
- /**
- * Must be called from {@link Activity#onSearchRequested()}.
- * This initiates the search entry mode - see {@link #onSearchSubmit} for when the search
- * is actually submitted.
- */
- public void onSearchRequested() {
- long accountId = getActualAccountId();
- boolean accountSearchable = false;
- if (accountId > 0) {
- Account account = Account.restoreAccountWithId(mActivity, accountId);
- if (account != null) {
- String protocol = account.getProtocol(mActivity);
- accountSearchable = (account.mFlags & Account.FLAGS_SUPPORTS_SEARCH) != 0;
- }
- }
-
- if (!accountSearchable) {
- return;
- }
-
- if (isMessageListReady()) {
- mActionBarController.enterSearchMode(null);
- }
- }
-
- /**
- * @return Whether or not a message list is ready and has its initial meta data loaded.
- */
- protected boolean isMessageListReady() {
- return isMessageListInstalled() && getMessageListFragment().hasDataLoaded();
- }
-
- /**
- * Determines the mailbox to search, if a search was to be initiated now.
- * This will return {@code null} if the UI is not focused on any particular mailbox to search
- * on.
- */
- private Mailbox getSearchableMailbox() {
- if (!isMessageListReady()) {
- return null;
- }
- MessageListFragment messageList = getMessageListFragment();
-
- // If already in a search, future searches will search the original mailbox.
- return mListContext.isSearch()
- ? messageList.getSearchedMailbox()
- : messageList.getMailbox();
- }
-
- // TODO: this logic probably needs to be tested in the backends as well, so it may be nice
- // to consolidate this to a centralized place, so that they don't get out of sync.
- /**
- * @return whether or not this account should do a global search instead when a user
- * initiates a search on the given mailbox.
- */
- private static boolean shouldDoGlobalSearch(Account account, Mailbox mailbox) {
- return ((account.mFlags & Account.FLAGS_SUPPORTS_GLOBAL_SEARCH) != 0)
- && (mailbox.mType == Mailbox.TYPE_INBOX);
- }
-
- /**
- * Retrieves the hint text to be shown for when a search entry is being made.
- */
- protected String getSearchHint() {
- if (!isMessageListReady()) {
- return "";
- }
- Account account = getMessageListFragment().getAccount();
- Mailbox mailbox = getSearchableMailbox();
-
- if (mailbox == null) {
- return "";
- }
-
- if (shouldDoGlobalSearch(account, mailbox)) {
- return mActivity.getString(R.string.search_hint);
- }
-
- // Regular mailbox, or IMAP - search within that mailbox.
- String mailboxName = FolderProperties.getInstance(mActivity).getDisplayName(mailbox);
- return String.format(
- mActivity.getString(R.string.search_mailbox_hint),
- mailboxName);
- }
-
- /**
- * Kicks off a search query, if the UI is in a state where a search is possible.
- */
- protected void onSearchSubmit(final String queryTerm) {
- final long accountId = getUIAccountId();
- if (!Account.isNormalAccount(accountId)) {
- return; // Invalid account to search from.
- }
-
- Mailbox searchableMailbox = getSearchableMailbox();
- if (searchableMailbox == null) {
- return;
- }
- final long mailboxId = searchableMailbox.mId;
-
- if (Email.DEBUG) {
- Log.d(Logging.LOG_TAG,
- "Submitting search: [" + queryTerm + "] in mailboxId=" + mailboxId);
- }
-
- mActivity.startActivity(EmailActivity.createSearchIntent(
- mActivity, accountId, mailboxId, queryTerm));
-
-
- // TODO: this causes a slight flicker.
- // A new instance of the activity will sit on top. When the user exits search and
- // returns to this activity, the search box should not be open then.
- mActionBarController.exitSearchMode();
- }
-
- /**
- * Handles exiting of search entry mode.
- */
- protected void onSearchExit() {
- if ((mListContext != null) && mListContext.isSearch()) {
- mActivity.finish();
- } else {
- // Re show the search icon.
- mActivity.invalidateOptionsMenu();
- }
- }
-
- /**
- * Handles the {@link android.app.Activity#onCreateOptionsMenu} callback.
- */
- public boolean onCreateOptionsMenu(MenuInflater inflater, Menu menu) {
- inflater.inflate(R.menu.email_activity_options, menu);
- return true;
- }
-
- /**
- * Handles the {@link android.app.Activity#onPrepareOptionsMenu} callback.
- */
- public boolean onPrepareOptionsMenu(MenuInflater inflater, Menu menu) {
- // Update the refresh button.
- MenuItem item = menu.findItem(R.id.refresh);
- if (isRefreshEnabled()) {
- item.setVisible(true);
- mRefreshListener.setRefreshIcon(item);
- } else {
- item.setVisible(false);
- mRefreshListener.setRefreshIcon(null);
- }
-
- // Deal with protocol-specific menu options.
- boolean mailboxHasServerCounterpart = false;
- boolean accountSearchable = false;
- boolean isEas = false;
-
- if (isMessageListReady()) {
- long accountId = getActualAccountId();
- if (accountId > 0) {
- Account account = Account.restoreAccountWithId(mActivity, accountId);
- if (account != null) {
- String protocol = account.getProtocol(mActivity);
- isEas = HostAuth.SCHEME_EAS.equals(protocol);
- Mailbox mailbox = getMessageListFragment().getMailbox();
- mailboxHasServerCounterpart = (mailbox != null)
- && mailbox.loadsFromServer(protocol);
- accountSearchable = (account.mFlags & Account.FLAGS_SUPPORTS_SEARCH) != 0;
- }
- }
- }
-
- boolean showSearchIcon = !mActionBarController.isInSearchMode()
- && accountSearchable && mailboxHasServerCounterpart;
-
- menu.findItem(R.id.search).setVisible(showSearchIcon);
- menu.findItem(R.id.mailbox_settings).setVisible(isEas && mailboxHasServerCounterpart);
- return true;
- }
-
- /**
- * Handles the {@link android.app.Activity#onOptionsItemSelected} callback.
- *
- * @return true if the option item is handled.
- */
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- // Comes from the action bar when the app icon on the left is pressed.
- // It works like a back press, but it won't close the activity.
- return onBackPressed(false);
- case R.id.compose:
- return onCompose();
- case R.id.refresh:
- onRefresh();
- return true;
- case R.id.account_settings:
- return onAccountSettings();
- case R.id.search:
- onSearchRequested();
- return true;
- case R.id.mailbox_settings:
- final long mailboxId = getMailboxSettingsMailboxId();
- if (mailboxId != Mailbox.NO_MAILBOX) {
- MailboxSettings.start(mActivity, mailboxId);
- }
- return true;
- }
- return false;
- }
-
- /**
- * Opens the message compose activity.
- */
- private boolean onCompose() {
- if (!isAccountSelected()) {
- return false; // this shouldn't really happen
- }
- MessageCompose.actionCompose(mActivity, getActualAccountId());
- return true;
- }
-
- /**
- * Handles the "Settings" option item. Opens the settings activity.
- */
- private boolean onAccountSettings() {
- AccountSettings.actionSettings(mActivity, getActualAccountId());
- return true;
- }
-
- /**
- * @return the ID of the message in focus and visible, if any. Returns
- * {@link Message#NO_MESSAGE} if no message is opened.
- */
- protected long getMessageId() {
- return isMessageViewInstalled()
- ? getMessageViewFragment().getMessageId()
- : Message.NO_MESSAGE;
- }
-
-
- /**
- * @return mailbox ID for "mailbox settings" option.
- */
- protected abstract long getMailboxSettingsMailboxId();
-
- /**
- * Performs "refesh".
- */
- protected abstract void onRefresh();
-
- /**
- * @return true if refresh is in progress for the current mailbox.
- */
- protected abstract boolean isRefreshInProgress();
-
- /**
- * @return true if the UI should enable the "refresh" command.
- */
- protected abstract boolean isRefreshEnabled();
-
- /**
- * Refresh the action bar and menu items, including the "refreshing" icon.
- */
- protected void refreshActionBar() {
- if (mActionBarController != null) {
- mActionBarController.refresh();
- }
- mActivity.invalidateOptionsMenu();
- }
-
- // MessageListFragment.Callback
- @Override
- public void onMailboxNotFound(boolean isFirstLoad) {
- // Something bad happened - the account or mailbox we were looking for was deleted.
- // Just restart and let the entry flow find a good default view.
- if (isFirstLoad) {
- // Only show this if it's the first load (e.g. a shortcut) rather an a return to
- // a mailbox (which might be in a just-deleted account)
- Utility.showToast(mActivity, R.string.toast_mailbox_not_found);
- }
- long accountId = getUIAccountId();
- if (accountId != Account.NO_ACCOUNT) {
- mActivity.startActivity(Welcome.createOpenAccountInboxIntent(mActivity, accountId));
- } else {
- Welcome.actionStart(mActivity);
-
- }
- mActivity.finish();
- }
-
- protected final MessageOrderManager getMessageOrderManager() {
- return mOrderManager;
- }
-
- /** Perform "auto-advance. */
- protected final void doAutoAdvance() {
- switch (Preferences.getPreferences(mActivity).getAutoAdvanceDirection()) {
- case Preferences.AUTO_ADVANCE_NEWER:
- if (moveToNewer()) return;
- break;
- case Preferences.AUTO_ADVANCE_OLDER:
- if (moveToOlder()) return;
- break;
- }
- if (isMessageViewInstalled()) { // We really should have the message view but just in case
- // Go back to mailbox list.
- // Use onBackPressed(), so we'll restore the message view state, such as scroll
- // position.
- // Also make sure to pass false to isSystemBackKey, so on two-pane we don't go back
- // to the collapsed mode.
- onBackPressed(true);
- }
- }
-
- /**
- * Subclass must implement it to enable/disable the newer/older buttons.
- */
- protected abstract void updateNavigationArrows();
-
- protected final boolean moveToOlder() {
- if ((mOrderManager != null) && mOrderManager.moveToOlder()) {
- navigateToMessage(mOrderManager.getCurrentMessageId());
- return true;
- }
- return false;
- }
-
- protected final boolean moveToNewer() {
- if ((mOrderManager != null) && mOrderManager.moveToNewer()) {
- navigateToMessage(mOrderManager.getCurrentMessageId());
- return true;
- }
- return false;
- }
-
- /**
- * Called when the user taps newer/older. Subclass must implement it to open the specified
- * message.
- *
- * It's a bit different from just showing the message view fragment; on one-pane we show the
- * message view fragment but don't want to change back state.
- */
- protected abstract void navigateToMessage(long messageId);
-
- /**
- * Potentially create a new {@link MessageOrderManager}; if it's not already started or if
- * the account has changed, and sync it to the current message.
- */
- private void updateMessageOrderManager() {
- if (!isMessageViewInstalled()) {
- return;
- }
- Preconditions.checkNotNull(mListContext);
-
- if (mOrderManager == null || !mOrderManager.getListContext().equals(mListContext)) {
- stopMessageOrderManager();
- mOrderManager = new MessageOrderManager(
- mActivity, mListContext, mMessageOrderManagerCallback);
- }
- mOrderManager.moveTo(getMessageId());
- updateNavigationArrows();
- }
-
- /**
- * Stop {@link MessageOrderManager}.
- */
- protected final void stopMessageOrderManager() {
- if (mOrderManager != null) {
- mOrderManager.close();
- mOrderManager = null;
- }
- }
-
- private class MessageOrderManagerCallback implements MessageOrderManager.Callback {
- @Override
- public void onMessagesChanged() {
- updateNavigationArrows();
- }
-
- @Override
- public void onMessageNotFound() {
- doAutoAdvance();
- }
- }
-
-
- private void showAccountSpecificWarning(long accountId) {
- if (accountId != Account.NO_ACCOUNT && accountId != Account.NO_ACCOUNT) {
- Account account = Account.restoreAccountWithId(mActivity, accountId);
- if (account != null &&
- Preferences.getPreferences(mActivity)
- .shouldShowRequireManualSync(mActivity, account)) {
- new RequireManualSyncDialog(mActivity, account).show();
- }
- }
- }
-
- @Override
- public String toString() {
- return getClass().getSimpleName(); // Shown on logcat
- }
-}
diff --git a/src/com/android/email/activity/UIControllerOnePane.java b/src/com/android/email/activity/UIControllerOnePane.java
deleted file mode 100644
index b69f92731..000000000
--- a/src/com/android/email/activity/UIControllerOnePane.java
+++ /dev/null
@@ -1,641 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.app.Fragment;
-import android.app.FragmentTransaction;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-
-import com.android.email.Email;
-import com.android.email.MessageListContext;
-import com.android.email.R;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-
-import java.util.Set;
-
-
-/**
- * UI Controller for non x-large devices. Supports a single-pane layout.
- *
- * One one-pane, only at most one fragment can be installed at a time.
- *
- * Note: Always use {@link #commitFragmentTransaction} to operate fragment transactions,
- * so that we can easily switch between synchronous and asynchronous transactions.
- *
- * Major TODOs
- * - TODO Implement callbacks
- */
-class UIControllerOnePane extends UIControllerBase {
- private static final String BUNDLE_KEY_PREVIOUS_FRAGMENT
- = "UIControllerOnePane.PREVIOUS_FRAGMENT";
-
- // Our custom poor-man's back stack which has only one entry at maximum.
- private Fragment mPreviousFragment;
-
- // MailboxListFragment.Callback
- @Override
- public void onAccountSelected(long accountId) {
- // It's from combined view, so "forceShowInbox" doesn't really matter.
- // (We're always switching accounts.)
- switchAccount(accountId, true);
- }
-
- // MailboxListFragment.Callback
- @Override
- public void onMailboxSelected(long accountId, long mailboxId, boolean nestedNavigation) {
- if (nestedNavigation) {
- return; // Nothing to do on 1-pane.
- }
- openMailbox(accountId, mailboxId);
- }
-
- // MailboxListFragment.Callback
- @Override
- public void onParentMailboxChanged() {
- refreshActionBar();
- }
-
- // MessageListFragment.Callback
- @Override
- public void onAdvancingOpAccepted(Set<Long> affectedMessages) {
- // Nothing to do on 1 pane.
- }
-
- // MessageListFragment.Callback
- @Override
- public void onMessageOpen(
- long messageId, long messageMailboxId, long listMailboxId, int type) {
- if (type == MessageListFragment.Callback.TYPE_DRAFT) {
- MessageCompose.actionEditDraft(mActivity, messageId);
- } else {
- open(mListContext, messageId);
- }
- }
-
- // MessageListFragment.Callback
- @Override
- public boolean onDragStarted() {
- // No drag&drop on 1-pane
- return false;
- }
-
- // MessageListFragment.Callback
- @Override
- public void onDragEnded() {
- // No drag&drop on 1-pane
- }
-
- // MessageViewFragment.Callback
- @Override
- public void onForward() {
- MessageCompose.actionForward(mActivity, getMessageId());
- }
-
- // MessageViewFragment.Callback
- @Override
- public void onReply() {
- MessageCompose.actionReply(mActivity, getMessageId(), false);
- }
-
- // MessageViewFragment.Callback
- @Override
- public void onReplyAll() {
- MessageCompose.actionReply(mActivity, getMessageId(), true);
- }
-
- // MessageViewFragment.Callback
- @Override
- public void onCalendarLinkClicked(long epochEventStartTime) {
- ActivityHelper.openCalendar(mActivity, epochEventStartTime);
- }
-
- // MessageViewFragment.Callback
- @Override
- public boolean onUrlInMessageClicked(String url) {
- return ActivityHelper.openUrlInMessage(mActivity, url, getActualAccountId());
- }
-
- // MessageViewFragment.Callback
- @Override
- public void onLoadMessageError(String errorMessage) {
- // TODO Auto-generated method stub
- }
-
- // MessageViewFragment.Callback
- @Override
- public void onLoadMessageFinished() {
- // TODO Auto-generated method stub
- }
-
- // MessageViewFragment.Callback
- @Override
- public void onLoadMessageStarted() {
- // TODO Auto-generated method stub
- }
-
- private boolean isInboxShown() {
- if (!isMessageListInstalled()) {
- return false;
- }
- return getMessageListFragment().isInboxList();
- }
-
- // This is all temporary as we'll have a different action bar controller for 1-pane.
- private class ActionBarControllerCallback implements ActionBarController.Callback {
- @Override
- public int getTitleMode() {
- if (isMailboxListInstalled()) {
- return TITLE_MODE_ACCOUNT_WITH_ALL_FOLDERS_LABEL;
- }
- if (isMessageViewInstalled()) {
- return TITLE_MODE_MESSAGE_SUBJECT;
- }
- return TITLE_MODE_ACCOUNT_WITH_MAILBOX;
- }
-
- public String getMessageSubject() {
- if (isMessageViewInstalled() && getMessageViewFragment().isMessageOpen()) {
- return getMessageViewFragment().getMessage().mSubject;
- } else {
- return null;
- }
- }
-
- @Override
- public boolean shouldShowUp() {
- return isMessageViewInstalled()
- || (isMessageListInstalled() && !isInboxShown())
- || isMailboxListInstalled();
- }
-
- @Override
- public long getUIAccountId() {
- return UIControllerOnePane.this.getUIAccountId();
- }
-
- @Override
- public long getMailboxId() {
- return UIControllerOnePane.this.getMailboxId();
- }
-
- @Override
- public void onMailboxSelected(long accountId, long mailboxId) {
- if (mailboxId == Mailbox.NO_MAILBOX) {
- showAllMailboxes();
- } else {
- openMailbox(accountId, mailboxId);
- }
- }
-
- @Override
- public boolean isAccountSelected() {
- return UIControllerOnePane.this.isAccountSelected();
- }
-
- @Override
- public void onAccountSelected(long accountId) {
- switchAccount(accountId, true); // Always go to inbox
- }
-
- @Override
- public void onNoAccountsFound() {
- Welcome.actionStart(mActivity);
- mActivity.finish();
- }
-
- @Override
- public String getSearchHint() {
- if (!isMessageListInstalled()) {
- return null;
- }
- return UIControllerOnePane.this.getSearchHint();
- }
-
- @Override
- public void onSearchStarted() {
- if (!isMessageListInstalled()) {
- return;
- }
- UIControllerOnePane.this.onSearchStarted();
- }
-
- @Override
- public void onSearchSubmit(String queryTerm) {
- if (!isMessageListInstalled()) {
- return;
- }
- UIControllerOnePane.this.onSearchSubmit(queryTerm);
- }
-
- @Override
- public void onSearchExit() {
- UIControllerOnePane.this.onSearchExit();
- }
- }
-
- public UIControllerOnePane(EmailActivity activity) {
- super(activity);
- }
-
- @Override
- protected ActionBarController createActionBarController(Activity activity) {
-
- // For now, we just reuse the same action bar controller used for 2-pane.
- // We may change it later.
-
- return new ActionBarController(activity, activity.getLoaderManager(),
- activity.getActionBar(), new ActionBarControllerCallback());
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- if (mPreviousFragment != null) {
- mFragmentManager.putFragment(outState,
- BUNDLE_KEY_PREVIOUS_FRAGMENT, mPreviousFragment);
- }
- }
-
- @Override
- public void onRestoreInstanceState(Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
- mPreviousFragment = mFragmentManager.getFragment(savedInstanceState,
- BUNDLE_KEY_PREVIOUS_FRAGMENT);
- }
-
- @Override
- public int getLayoutId() {
- return R.layout.email_activity_one_pane;
- }
-
- @Override
- public long getUIAccountId() {
- if (mListContext != null) {
- return mListContext.mAccountId;
- }
- if (isMailboxListInstalled()) {
- return getMailboxListFragment().getAccountId();
- }
- return Account.NO_ACCOUNT;
- }
-
- private long getMailboxId() {
- if (mListContext != null) {
- return mListContext.getMailboxId();
- }
- return Mailbox.NO_MAILBOX;
- }
-
- @Override
- public boolean onBackPressed(boolean isSystemBackKey) {
- if (Email.DEBUG) {
- // This is VERY important -- no check for DEBUG_LIFECYCLE
- Log.d(Logging.LOG_TAG, this + " onBackPressed: " + isSystemBackKey);
- }
- // The action bar controller has precedence. Must call it first.
- if (mActionBarController.onBackPressed(isSystemBackKey)) {
- return true;
- }
- // If the mailbox list is shown and showing a nested mailbox, let it navigate up first.
- if (isMailboxListInstalled() && getMailboxListFragment().navigateUp()) {
- if (DEBUG_FRAGMENTS) {
- Log.d(Logging.LOG_TAG, this + " Back: back handled by mailbox list");
- }
- return true;
- }
-
- // Custom back stack
- if (shouldPopFromBackStack(isSystemBackKey)) {
- if (DEBUG_FRAGMENTS) {
- Log.d(Logging.LOG_TAG, this + " Back: Popping from back stack");
- }
- popFromBackStack();
- return true;
- }
-
- // No entry in the back stack.
- if (isMessageViewInstalled()) {
- if (DEBUG_FRAGMENTS) {
- Log.d(Logging.LOG_TAG, this + " Back: Message view -> Message List");
- }
- // If the message view is shown, show the "parent" message list.
- // This happens when we get a deep link to a message. (e.g. from a widget)
- openMailbox(mListContext.mAccountId, mListContext.getMailboxId());
- return true;
- } else if (isMailboxListInstalled()) {
- // If the mailbox list is shown, always go back to the inbox.
- switchAccount(getMailboxListFragment().getAccountId(), true /* force show inbox */);
- return true;
- } else if (isMessageListInstalled() && !isInboxShown()) {
- // Non-inbox list. Go to inbox.
- switchAccount(mListContext.mAccountId, true /* force show inbox */);
- return true;
- }
- return false;
- }
-
- @Override
- public void openInternal(final MessageListContext listContext, final long messageId) {
- if (Email.DEBUG) {
- // This is VERY important -- don't check for DEBUG_LIFECYCLE
- Log.i(Logging.LOG_TAG, this + " open " + listContext + " messageId=" + messageId);
- }
-
- if (messageId != Message.NO_MESSAGE) {
- openMessage(messageId);
- } else {
- showFragment(MessageListFragment.newInstance(listContext));
- }
- }
-
- /**
- * @return currently installed {@link Fragment} (1-pane has only one at most), or null if none
- * exists.
- */
- private Fragment getInstalledFragment() {
- if (isMailboxListInstalled()) {
- return getMailboxListFragment();
- } else if (isMessageListInstalled()) {
- return getMessageListFragment();
- } else if (isMessageViewInstalled()) {
- return getMessageViewFragment();
- }
- return null;
- }
-
- /**
- * Show the mailbox list.
- *
- * This is the only way to open the mailbox list on 1-pane.
- * {@link #open(MessageListContext, long)} will only open either the message list or the
- * message view.
- */
- private void openMailboxList(long accountId) {
- setListContext(null);
- showFragment(MailboxListFragment.newInstance(accountId, Mailbox.NO_MAILBOX, false));
- }
-
- private void openMessage(long messageId) {
- showFragment(MessageViewFragment.newInstance(messageId));
- }
-
- /**
- * Push the installed fragment into our custom back stack (or optionally
- * {@link FragmentTransaction#remove} it) and {@link FragmentTransaction#add} {@code fragment}.
- *
- * @param fragment {@link Fragment} to be added.
- *
- * TODO Delay-call the whole method and use the synchronous transaction.
- */
- private void showFragment(Fragment fragment) {
- final FragmentTransaction ft = mFragmentManager.beginTransaction();
- final Fragment installed = getInstalledFragment();
- if ((installed instanceof MessageViewFragment)
- && (fragment instanceof MessageViewFragment)) {
- // Newer/older navigation, auto-advance, etc.
- // In this case we want to keep the backstack untouched, so that after back navigation
- // we can restore the message list, including scroll position and batch selection.
- } else {
- if (DEBUG_FRAGMENTS) {
- Log.i(Logging.LOG_TAG, this + " backstack: [push] " + getInstalledFragment()
- + " -> " + fragment);
- }
- if (mPreviousFragment != null) {
- if (DEBUG_FRAGMENTS) {
- Log.d(Logging.LOG_TAG, this + " showFragment: destroying previous fragment "
- + mPreviousFragment);
- }
- removeFragment(ft, mPreviousFragment);
- mPreviousFragment = null;
- }
- // Remove the current fragment or push it into the backstack.
- if (installed != null) {
- if (installed instanceof MessageViewFragment) {
- // Message view should never be pushed to the backstack.
- if (DEBUG_FRAGMENTS) {
- Log.d(Logging.LOG_TAG, this + " showFragment: removing " + installed);
- }
- ft.remove(installed);
- } else {
- // Other fragments should be pushed.
- mPreviousFragment = installed;
- if (DEBUG_FRAGMENTS) {
- Log.d(Logging.LOG_TAG, this + " showFragment: detaching "
- + mPreviousFragment);
- }
- ft.detach(mPreviousFragment);
- }
- }
- }
- // Show the new one
- if (DEBUG_FRAGMENTS) {
- Log.d(Logging.LOG_TAG, this + " showFragment: replacing with " + fragment);
- }
- ft.replace(R.id.fragment_placeholder, fragment);
- ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
- commitFragmentTransaction(ft);
- }
-
- /**
- * @param isSystemBackKey <code>true</code> if the system back key was pressed.
- * <code>false</code> if it's caused by the "home" icon click on the action bar.
- * @return true if we should pop from our custom back stack.
- */
- private boolean shouldPopFromBackStack(boolean isSystemBackKey) {
- if (mPreviousFragment == null) {
- return false; // Nothing in the back stack
- }
- if (mPreviousFragment instanceof MessageViewFragment) {
- throw new IllegalStateException("Message view should never be in backstack");
- }
- final Fragment installed = getInstalledFragment();
- if (installed == null) {
- // If no fragment is installed right now, do nothing.
- return false;
- }
-
- // Okay now we have 2 fragments; the one in the back stack and the one that's currently
- // installed.
- if (isInboxShown()) {
- // Inbox is the top level list - never go back from here.
- return false;
- }
-
- // Disallow the MailboxList--> non-inbox MessageList transition as the Mailbox list
- // is always considered "higher" than a non-inbox MessageList
- if ((mPreviousFragment instanceof MessageListFragment)
- && (!((MessageListFragment) mPreviousFragment).isInboxList())
- && (installed instanceof MailboxListFragment)) {
- return false;
- }
- return true;
- }
-
- /**
- * Pop from our custom back stack.
- *
- * TODO Delay-call the whole method and use the synchronous transaction.
- */
- private void popFromBackStack() {
- if (mPreviousFragment == null) {
- return;
- }
- final FragmentTransaction ft = mFragmentManager.beginTransaction();
- final Fragment installed = getInstalledFragment();
- if (DEBUG_FRAGMENTS) {
- Log.i(Logging.LOG_TAG, this + " backstack: [pop] " + installed + " -> "
- + mPreviousFragment);
- }
- removeFragment(ft, installed);
-
- // Restore listContext.
- if (mPreviousFragment instanceof MailboxListFragment) {
- setListContext(null);
- } else if (mPreviousFragment instanceof MessageListFragment) {
- setListContext(((MessageListFragment) mPreviousFragment).getListContext());
- } else {
- throw new IllegalStateException("Message view should never be in backstack");
- }
-
- ft.attach(mPreviousFragment);
- ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
- mPreviousFragment = null;
- commitFragmentTransaction(ft);
- return;
- }
-
- private void showAllMailboxes() {
- if (!isAccountSelected()) {
- return; // Can happen because of asynchronous fragment transactions.
- }
-
- openMailboxList(getUIAccountId());
- }
-
- @Override
- protected void installMailboxListFragment(MailboxListFragment fragment) {
- stopMessageOrderManager();
- super.installMailboxListFragment(fragment);
- }
-
- @Override
- protected void installMessageListFragment(MessageListFragment fragment) {
- stopMessageOrderManager();
- super.installMessageListFragment(fragment);
- }
-
- @Override
- protected long getMailboxSettingsMailboxId() {
- return isMessageListInstalled()
- ? getMessageListFragment().getMailboxId()
- : Mailbox.NO_MAILBOX;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(MenuInflater inflater, Menu menu) {
- // First, let the base class do what it has to do.
- super.onPrepareOptionsMenu(inflater, menu);
-
- // Then override
- final boolean messageListVisible = isMessageListInstalled();
- if (!messageListVisible) {
- menu.findItem(R.id.search).setVisible(false);
- menu.findItem(R.id.compose).setVisible(false);
- menu.findItem(R.id.refresh).setVisible(false);
- menu.findItem(R.id.show_all_mailboxes).setVisible(false);
- menu.findItem(R.id.mailbox_settings).setVisible(false);
- }
-
- final boolean messageViewVisible = isMessageViewInstalled();
- if (messageViewVisible) {
- final MessageOrderManager om = getMessageOrderManager();
- menu.findItem(R.id.newer).setVisible(true);
- menu.findItem(R.id.older).setVisible(true);
- // orderManager shouldn't be null when the message view is installed, but just in case..
- menu.findItem(R.id.newer).setEnabled((om != null) && om.canMoveToNewer());
- menu.findItem(R.id.older).setEnabled((om != null) && om.canMoveToOlder());
- }
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.newer:
- moveToNewer();
- return true;
- case R.id.older:
- moveToOlder();
- return true;
- case R.id.show_all_mailboxes:
- showAllMailboxes();
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- protected boolean isRefreshEnabled() {
- // Refreshable only when an actual account is selected, and message view isn't shown.
- // (i.e. only available on the mailbox list or the message view, but not on the combined
- // one)
- if (!isActualAccountSelected() || isMessageViewInstalled()) {
- return false;
- }
- return isMailboxListInstalled() || (mListContext.getMailboxId() > 0);
- }
-
- @Override
- protected void onRefresh() {
- if (!isRefreshEnabled()) {
- return;
- }
- if (isMessageListInstalled()) {
- mRefreshManager.refreshMessageList(getActualAccountId(), getMailboxId(), true);
- } else {
- mRefreshManager.refreshMailboxList(getActualAccountId());
- }
- }
-
- @Override
- protected boolean isRefreshInProgress() {
- if (!isRefreshEnabled()) {
- return false;
- }
- if (isMessageListInstalled()) {
- return mRefreshManager.isMessageListRefreshing(getMailboxId());
- } else {
- return mRefreshManager.isMailboxListRefreshing(getActualAccountId());
- }
- }
-
- @Override protected void navigateToMessage(long messageId) {
- openMessage(messageId);
- }
-
- @Override protected void updateNavigationArrows() {
- refreshActionBar();
- }
-}
diff --git a/src/com/android/email/activity/UIControllerTwoPane.java b/src/com/android/email/activity/UIControllerTwoPane.java
deleted file mode 100644
index a67ba12ea..000000000
--- a/src/com/android/email/activity/UIControllerTwoPane.java
+++ /dev/null
@@ -1,713 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.app.FragmentTransaction;
-import android.content.Context;
-import android.os.Bundle;
-import android.util.Log;
-
-import com.android.email.Clock;
-import com.android.email.Email;
-import com.android.email.MessageListContext;
-import com.android.email.Preferences;
-import com.android.email.R;
-import com.android.email.RefreshManager;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-import java.util.Set;
-
-/**
- * UI Controller for x-large devices. Supports a multi-pane layout.
- *
- * Note: Always use {@link #commitFragmentTransaction} to operate fragment transactions,
- * so that we can easily switch between synchronous and asynchronous transactions.
- */
-class UIControllerTwoPane extends UIControllerBase implements ThreePaneLayout.Callback {
- @VisibleForTesting
- static final int MAILBOX_REFRESH_MIN_INTERVAL = 30 * 1000; // in milliseconds
-
- @VisibleForTesting
- static final int INBOX_AUTO_REFRESH_MIN_INTERVAL = 10 * 1000; // in milliseconds
-
- // Other UI elements
- private ThreePaneLayout mThreePane;
-
- private MessageCommandButtonView mMessageCommandButtons;
-
- public UIControllerTwoPane(EmailActivity activity) {
- super(activity);
- }
-
- @Override
- public int getLayoutId() {
- return R.layout.email_activity_two_pane;
- }
-
- // ThreePaneLayoutCallback
- @Override
- public void onVisiblePanesChanged(int previousVisiblePanes) {
- // If the right pane is gone, remove the message view.
- final int visiblePanes = mThreePane.getVisiblePanes();
-
- if (((visiblePanes & ThreePaneLayout.PANE_RIGHT) == 0) &&
- ((previousVisiblePanes & ThreePaneLayout.PANE_RIGHT) != 0)) {
- // Message view just got hidden
- unselectMessage();
- }
- // Disable CAB when the message list is not visible.
- if (isMessageListInstalled()) {
- getMessageListFragment().onHidden((visiblePanes & ThreePaneLayout.PANE_MIDDLE) == 0);
- }
- refreshActionBar();
- }
-
- // MailboxListFragment$Callback
- @Override
- public void onMailboxSelected(long accountId, long mailboxId, boolean nestedNavigation) {
- setListContext(MessageListContext.forMailbox(accountId, mailboxId));
- if (getMessageListMailboxId() != mListContext.getMailboxId()) {
- updateMessageList(true);
- }
- }
-
- // MailboxListFragment$Callback
- @Override
- public void onAccountSelected(long accountId) {
- // It's from combined view, so "forceShowInbox" doesn't really matter.
- // (We're always switching accounts.)
- switchAccount(accountId, true);
- }
-
- // MailboxListFragment$Callback
- @Override
- public void onParentMailboxChanged() {
- refreshActionBar();
- }
-
- // MessageListFragment$Callback
- @Override
- public void onMessageOpen(long messageId, long messageMailboxId, long listMailboxId,
- int type) {
- if (type == MessageListFragment.Callback.TYPE_DRAFT) {
- MessageCompose.actionEditDraft(mActivity, messageId);
- } else {
- if (getMessageId() != messageId) {
- navigateToMessage(messageId);
- mThreePane.showRightPane();
- }
- }
- }
-
- // MessageListFragment$Callback
- /**
- * Apply the auto-advance policy upon initation of a batch command that could potentially
- * affect the currently selected conversation.
- */
- @Override
- public void onAdvancingOpAccepted(Set<Long> affectedMessages) {
- if (!isMessageViewInstalled()) {
- // Do nothing if message view is not visible.
- return;
- }
-
- final MessageOrderManager orderManager = getMessageOrderManager();
- int autoAdvanceDir = Preferences.getPreferences(mActivity).getAutoAdvanceDirection();
- if ((autoAdvanceDir == Preferences.AUTO_ADVANCE_MESSAGE_LIST) || (orderManager == null)) {
- if (affectedMessages.contains(getMessageId())) {
- goBackToMailbox();
- }
- return;
- }
-
- // Navigate to the first unselected item in the appropriate direction.
- switch (autoAdvanceDir) {
- case Preferences.AUTO_ADVANCE_NEWER:
- while (affectedMessages.contains(orderManager.getCurrentMessageId())) {
- if (!orderManager.moveToNewer()) {
- goBackToMailbox();
- return;
- }
- }
- navigateToMessage(orderManager.getCurrentMessageId());
- break;
-
- case Preferences.AUTO_ADVANCE_OLDER:
- while (affectedMessages.contains(orderManager.getCurrentMessageId())) {
- if (!orderManager.moveToOlder()) {
- goBackToMailbox();
- return;
- }
- }
- navigateToMessage(orderManager.getCurrentMessageId());
- break;
- }
- }
-
- // MessageListFragment$Callback
- @Override
- public boolean onDragStarted() {
- if (Email.DEBUG) {
- Log.i(Logging.LOG_TAG, "Drag started");
- }
-
- if (((mListContext != null) && mListContext.isSearch())
- || !mThreePane.isLeftPaneVisible()) {
- // D&D not allowed.
- return false;
- }
-
- return true;
- }
-
- // MessageListFragment$Callback
- @Override
- public void onDragEnded() {
- if (Email.DEBUG) {
- Log.i(Logging.LOG_TAG, "Drag ended");
- }
- }
-
-
- // MessageViewFragment$Callback
- @Override
- public boolean onUrlInMessageClicked(String url) {
- return ActivityHelper.openUrlInMessage(mActivity, url, getActualAccountId());
- }
-
- // MessageViewFragment$Callback
- @Override
- public void onLoadMessageStarted() {
- }
-
- // MessageViewFragment$Callback
- @Override
- public void onLoadMessageFinished() {
- }
-
- // MessageViewFragment$Callback
- @Override
- public void onLoadMessageError(String errorMessage) {
- }
-
- // MessageViewFragment$Callback
- @Override
- public void onCalendarLinkClicked(long epochEventStartTime) {
- ActivityHelper.openCalendar(mActivity, epochEventStartTime);
- }
-
- // MessageViewFragment$Callback
- @Override
- public void onForward() {
- MessageCompose.actionForward(mActivity, getMessageId());
- }
-
- // MessageViewFragment$Callback
- @Override
- public void onReply() {
- MessageCompose.actionReply(mActivity, getMessageId(), false);
- }
-
- // MessageViewFragment$Callback
- @Override
- public void onReplyAll() {
- MessageCompose.actionReply(mActivity, getMessageId(), true);
- }
-
- /**
- * Must be called just after the activity sets up the content view.
- */
- @Override
- public void onActivityViewReady() {
- super.onActivityViewReady();
-
- // Set up content
- mThreePane = (ThreePaneLayout) mActivity.findViewById(R.id.three_pane);
- mThreePane.setCallback(this);
-
- mMessageCommandButtons = mThreePane.getMessageCommandButtons();
- mMessageCommandButtons.setCallback(new CommandButtonCallback());
- }
-
- @Override
- protected ActionBarController createActionBarController(Activity activity) {
- return new ActionBarController(activity, activity.getLoaderManager(),
- activity.getActionBar(), new ActionBarControllerCallback());
- }
-
- /**
- * @return the currently selected account ID, *or* {@link Account#ACCOUNT_ID_COMBINED_VIEW}.
- *
- * @see #getActualAccountId()
- */
- @Override
- public long getUIAccountId() {
- return isMailboxListInstalled() ? getMailboxListFragment().getAccountId()
- :Account.NO_ACCOUNT;
- }
-
- @Override
- public long getMailboxSettingsMailboxId() {
- return getMessageListMailboxId();
- }
-
- /**
- * @return true if refresh is in progress for the current mailbox.
- */
- @Override
- protected boolean isRefreshInProgress() {
- long messageListMailboxId = getMessageListMailboxId();
- return (messageListMailboxId >= 0)
- && mRefreshManager.isMessageListRefreshing(messageListMailboxId);
- }
-
- /**
- * @return true if the UI should enable the "refresh" command.
- */
- @Override
- protected boolean isRefreshEnabled() {
- return getActualAccountId() != Account.NO_ACCOUNT
- && (mListContext.getMailboxId() > 0);
- }
-
-
- /** {@inheritDoc} */
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- }
-
- /** {@inheritDoc} */
- @Override
- public void onRestoreInstanceState(Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
- }
-
- @Override
- protected void installMessageListFragment(MessageListFragment fragment) {
- super.installMessageListFragment(fragment);
-
- if (isMailboxListInstalled()) {
- getMailboxListFragment().setHighlightedMailbox(fragment.getMailboxId());
- }
- getMessageListFragment().setLayout(mThreePane);
- }
-
- @Override
- protected void installMessageViewFragment(MessageViewFragment fragment) {
- super.installMessageViewFragment(fragment);
-
- if (isMessageListInstalled()) {
- getMessageListFragment().setSelectedMessage(fragment.getMessageId());
- }
- }
-
- @Override
- public void openInternal(final MessageListContext listContext, final long messageId) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " open " + listContext);
- }
-
- final FragmentTransaction ft = mFragmentManager.beginTransaction();
- updateMailboxList(ft, true);
- updateMessageList(ft, true);
-
- if (messageId != Message.NO_MESSAGE) {
- updateMessageView(ft, messageId);
- mThreePane.showRightPane();
- } else if (mListContext.isSearch()) {
- mThreePane.showRightPane();
- mThreePane.uncollapsePane();
- } else {
- mThreePane.showLeftPane();
- }
- commitFragmentTransaction(ft);
- }
-
- /**
- * Loads the given account and optionally selects the given mailbox and message. If the
- * specified account is already selected, no actions will be performed unless
- * <code>forceReload</code> is <code>true</code>.
- *
- * @param ft {@link FragmentTransaction} to use.
- * @param clearDependentPane if true, the message list and the message view will be cleared
- */
- private void updateMailboxList(FragmentTransaction ft, boolean clearDependentPane) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " updateMailboxList " + mListContext);
- }
-
- long accountId = mListContext.mAccountId;
- long mailboxId = mListContext.getMailboxId();
- if ((getUIAccountId() != accountId) || (getMailboxListMailboxId() != mailboxId)) {
- removeMailboxListFragment(ft);
- boolean enableHighlight = !mListContext.isSearch();
- ft.add(mThreePane.getLeftPaneId(),
- MailboxListFragment.newInstance(accountId, mailboxId, enableHighlight));
- }
- if (clearDependentPane) {
- removeMessageListFragment(ft);
- removeMessageViewFragment(ft);
- }
- }
-
- /**
- * Go back to a mailbox list view. If a message view is currently active, it will
- * be hidden.
- */
- private void goBackToMailbox() {
- if (isMessageViewInstalled()) {
- mThreePane.showLeftPane(); // Show mailbox list
- }
- }
-
- /**
- * Show the message list fragment for the given mailbox.
- *
- * @param ft {@link FragmentTransaction} to use.
- */
- private void updateMessageList(FragmentTransaction ft, boolean clearDependentPane) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " updateMessageList " + mListContext);
- }
-
- if (mListContext.getMailboxId() != getMessageListMailboxId()) {
- removeMessageListFragment(ft);
- ft.add(mThreePane.getMiddlePaneId(), MessageListFragment.newInstance(mListContext));
- }
- if (clearDependentPane) {
- removeMessageViewFragment(ft);
- }
- }
-
- /**
- * Shortcut to call {@link #updateMessageList(FragmentTransaction, boolean)} and
- * commit.
- */
- private void updateMessageList(boolean clearDependentPane) {
- FragmentTransaction ft = mFragmentManager.beginTransaction();
- updateMessageList(ft, clearDependentPane);
- commitFragmentTransaction(ft);
- }
-
- /**
- * Show a message on the message view.
- *
- * @param ft {@link FragmentTransaction} to use.
- * @param messageId ID of the mailbox to load. Must never be {@link Message#NO_MESSAGE}.
- */
- private void updateMessageView(FragmentTransaction ft, long messageId) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, this + " updateMessageView messageId=" + messageId);
- }
- if (messageId == Message.NO_MESSAGE) {
- throw new IllegalArgumentException();
- }
-
- if (messageId == getMessageId()) {
- return; // nothing to do.
- }
-
- removeMessageViewFragment(ft);
-
- ft.add(mThreePane.getRightPaneId(), MessageViewFragment.newInstance(messageId));
- }
-
- /**
- * Shortcut to call {@link #updateMessageView(FragmentTransaction, long)} and commit.
- */
- @Override protected void navigateToMessage(long messageId) {
- FragmentTransaction ft = mFragmentManager.beginTransaction();
- updateMessageView(ft, messageId);
- commitFragmentTransaction(ft);
- }
-
- /**
- * Remove the message view if shown.
- */
- private void unselectMessage() {
- commitFragmentTransaction(removeMessageViewFragment(mFragmentManager.beginTransaction()));
- if (isMessageListInstalled()) {
- getMessageListFragment().setSelectedMessage(Message.NO_MESSAGE);
- }
- stopMessageOrderManager();
- }
-
- private class CommandButtonCallback implements MessageCommandButtonView.Callback {
- @Override
- public void onMoveToNewer() {
- moveToNewer();
- }
-
- @Override
- public void onMoveToOlder() {
- moveToOlder();
- }
- }
-
- /**
- * Disable/enable the move-to-newer/older buttons.
- */
- @Override protected void updateNavigationArrows() {
- final MessageOrderManager orderManager = getMessageOrderManager();
- if (orderManager == null) {
- // shouldn't happen, but just in case
- mMessageCommandButtons.enableNavigationButtons(false, false, 0, 0);
- } else {
- mMessageCommandButtons.enableNavigationButtons(
- orderManager.canMoveToNewer(), orderManager.canMoveToOlder(),
- orderManager.getCurrentPosition(), orderManager.getTotalMessageCount());
- }
- }
-
- /** {@inheritDoc} */
- @Override
- public boolean onBackPressed(boolean isSystemBackKey) {
- if (!mThreePane.isPaneCollapsible()) {
- if (mActionBarController.onBackPressed(isSystemBackKey)) {
- return true;
- }
-
- if (mThreePane.showLeftPane()) {
- return true;
- }
- } else {
- // If it's not the system back key, always attempt to uncollapse the left pane first.
- if (!isSystemBackKey && mThreePane.uncollapsePane()) {
- return true;
- }
-
- if (mActionBarController.onBackPressed(isSystemBackKey)) {
- return true;
- }
-
- if (mThreePane.showLeftPane()) {
- return true;
- }
- }
-
- if (isMailboxListInstalled() && getMailboxListFragment().navigateUp()) {
- return true;
- }
- return false;
- }
-
- @Override
- protected void onRefresh() {
- // Cancel previously running instance if any.
- new RefreshTask(mTaskTracker, mActivity, getActualAccountId(),
- getMessageListMailboxId()).cancelPreviousAndExecuteParallel();
- }
-
- /**
- * Class to handle refresh.
- *
- * When the user press "refresh",
- * <ul>
- * <li>Refresh the current mailbox, if it's refreshable. (e.g. don't refresh combined inbox,
- * drafts, etc.
- * <li>Refresh the mailbox list, if it hasn't been refreshed in the last
- * {@link #MAILBOX_REFRESH_MIN_INTERVAL}.
- * <li>Refresh inbox, if it's not the current mailbox and it hasn't been refreshed in the last
- * {@link #INBOX_AUTO_REFRESH_MIN_INTERVAL}.
- * </ul>
- */
- @VisibleForTesting
- static class RefreshTask extends EmailAsyncTask<Void, Void, Boolean> {
- private final Clock mClock;
- private final Context mContext;
- private final long mAccountId;
- private final long mMailboxId;
- private final RefreshManager mRefreshManager;
- @VisibleForTesting
- long mInboxId;
-
- public RefreshTask(EmailAsyncTask.Tracker tracker, Context context, long accountId,
- long mailboxId) {
- this(tracker, context, accountId, mailboxId, Clock.INSTANCE,
- RefreshManager.getInstance(context));
- }
-
- @VisibleForTesting
- RefreshTask(EmailAsyncTask.Tracker tracker, Context context, long accountId,
- long mailboxId, Clock clock, RefreshManager refreshManager) {
- super(tracker);
- mClock = clock;
- mContext = context;
- mRefreshManager = refreshManager;
- mAccountId = accountId;
- mMailboxId = mailboxId;
- }
-
- /**
- * Do DB access on a worker thread.
- */
- @Override
- protected Boolean doInBackground(Void... params) {
- mInboxId = Account.getInboxId(mContext, mAccountId);
- return Mailbox.isRefreshable(mContext, mMailboxId);
- }
-
- /**
- * Do the actual refresh.
- */
- @Override
- protected void onSuccess(Boolean isCurrentMailboxRefreshable) {
- if (isCurrentMailboxRefreshable == null) {
- return;
- }
- if (isCurrentMailboxRefreshable) {
- mRefreshManager.refreshMessageList(mAccountId, mMailboxId, true);
- }
- // Refresh mailbox list
- if (mAccountId != Account.NO_ACCOUNT) {
- if (shouldRefreshMailboxList()) {
- mRefreshManager.refreshMailboxList(mAccountId);
- }
- }
- // Refresh inbox
- if (shouldAutoRefreshInbox()) {
- mRefreshManager.refreshMessageList(mAccountId, mInboxId, true);
- }
- }
-
- /**
- * @return true if the mailbox list of the current account hasn't been refreshed
- * in the last {@link #MAILBOX_REFRESH_MIN_INTERVAL}.
- */
- @VisibleForTesting
- boolean shouldRefreshMailboxList() {
- if (mRefreshManager.isMailboxListRefreshing(mAccountId)) {
- return false;
- }
- final long nextRefreshTime = mRefreshManager.getLastMailboxListRefreshTime(mAccountId)
- + MAILBOX_REFRESH_MIN_INTERVAL;
- if (nextRefreshTime > mClock.getTime()) {
- return false;
- }
- return true;
- }
-
- /**
- * @return true if the inbox of the current account hasn't been refreshed
- * in the last {@link #INBOX_AUTO_REFRESH_MIN_INTERVAL}.
- */
- @VisibleForTesting
- boolean shouldAutoRefreshInbox() {
- if (mInboxId == mMailboxId) {
- return false; // Current ID == inbox. No need to auto-refresh.
- }
- if (mRefreshManager.isMessageListRefreshing(mInboxId)) {
- return false;
- }
- final long nextRefreshTime = mRefreshManager.getLastMessageListRefreshTime(mInboxId)
- + INBOX_AUTO_REFRESH_MIN_INTERVAL;
- if (nextRefreshTime > mClock.getTime()) {
- return false;
- }
- return true;
- }
- }
-
- private class ActionBarControllerCallback implements ActionBarController.Callback {
-
- @Override
- public long getUIAccountId() {
- return UIControllerTwoPane.this.getUIAccountId();
- }
-
- @Override
- public long getMailboxId() {
- return getMessageListMailboxId();
- }
-
- @Override
- public boolean isAccountSelected() {
- return UIControllerTwoPane.this.isAccountSelected();
- }
-
- @Override
- public void onAccountSelected(long accountId) {
- switchAccount(accountId, false);
- }
-
- @Override
- public void onMailboxSelected(long accountId, long mailboxId) {
- openMailbox(accountId, mailboxId);
- }
-
- @Override
- public void onNoAccountsFound() {
- Welcome.actionStart(mActivity);
- mActivity.finish();
- }
-
- @Override
- public int getTitleMode() {
- if (mThreePane.isLeftPaneVisible()) {
- // Mailbox list visible
- return TITLE_MODE_ACCOUNT_NAME_ONLY;
- } else {
- // Mailbox list hidden
- return TITLE_MODE_ACCOUNT_WITH_MAILBOX;
- }
- }
-
- public String getMessageSubject() {
- if (isMessageViewInstalled() && getMessageViewFragment().isMessageOpen()) {
- return getMessageViewFragment().getMessage().mSubject;
- } else {
- return null;
- }
- }
-
- @Override
- public boolean shouldShowUp() {
- final int visiblePanes = mThreePane.getVisiblePanes();
- final boolean leftPaneHidden = ((visiblePanes & ThreePaneLayout.PANE_LEFT) == 0);
- return leftPaneHidden
- || (isMailboxListInstalled() && getMailboxListFragment().canNavigateUp());
- }
-
- @Override
- public String getSearchHint() {
- return UIControllerTwoPane.this.getSearchHint();
- }
-
- @Override
- public void onSearchStarted() {
- UIControllerTwoPane.this.onSearchStarted();
- }
-
- @Override
- public void onSearchSubmit(final String queryTerm) {
- UIControllerTwoPane.this.onSearchSubmit(queryTerm);
- }
-
- @Override
- public void onSearchExit() {
- UIControllerTwoPane.this.onSearchExit();
- }
- }
-}
diff --git a/src/com/android/email/activity/UiUtilities.java b/src/com/android/email/activity/UiUtilities.java
index a91806740..de853d31a 100644
--- a/src/com/android/email/activity/UiUtilities.java
+++ b/src/com/android/email/activity/UiUtilities.java
@@ -16,14 +16,13 @@
package com.android.email.activity;
-import com.android.email.R;
-
import android.app.Activity;
-import android.app.Fragment;
import android.content.Context;
import android.content.res.Resources;
import android.view.View;
+import com.android.email.R;
+
public class UiUtilities {
private UiUtilities() {
}
@@ -125,30 +124,6 @@ public class UiUtilities {
setVisibilitySafe(parent.findViewById(viewId), visibility);
}
- /**
- * Used by an {@link Fragment} to install itself to the host activity.
- *
- * @see FragmentInstallable
- */
- public static void installFragment(Fragment fragment) {
- final Activity a = fragment.getActivity();
- if (a instanceof FragmentInstallable) {
- ((FragmentInstallable) a).onInstallFragment(fragment);
- }
- }
-
- /**
- * Used by an {@link Fragment} to uninstall itself from the host activity.
- *
- * @see FragmentInstallable
- */
- public static void uninstallFragment(Fragment fragment) {
- final Activity a = fragment.getActivity();
- if (a instanceof FragmentInstallable) {
- ((FragmentInstallable) a).onUninstallFragment(fragment);
- }
- }
-
private static int sDebugForcedPaneMode = 0;
/**
@@ -160,17 +135,4 @@ public class UiUtilities {
static void setDebugPaneMode(int paneMode) {
sDebugForcedPaneMode = paneMode;
}
-
- /**
- * @return {@code true} if 2-pane UI should be used. {@code false} otherwise.
- */
- public static boolean useTwoPane(Context context) {
- if (sDebugForcedPaneMode == 1) {
- return false;
- }
- if (sDebugForcedPaneMode == 2) {
- return true;
- }
- return context.getResources().getBoolean(R.bool.use_two_pane);
- }
}
diff --git a/src/com/android/email/activity/Welcome.java b/src/com/android/email/activity/Welcome.java
deleted file mode 100644
index e77746129..000000000
--- a/src/com/android/email/activity/Welcome.java
+++ /dev/null
@@ -1,430 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup.LayoutParams;
-
-import com.android.email.Email;
-import com.android.email.Preferences;
-import com.android.email.R;
-import com.android.email.activity.setup.AccountSettings;
-import com.android.email.activity.setup.AccountSetupBasics;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email.service.MailService;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.EmailAsyncTask;
-import com.android.emailcommon.utility.IntentUtilities;
-import com.android.emailcommon.utility.Utility;
-import com.google.common.annotations.VisibleForTesting;
-
-/**
- * The Welcome activity initializes the application and starts {@link EmailActivity}, or launch
- * {@link AccountSetupBasics} if no accounts are configured.
- *
- * TOOD Show "your messages are on the way" message like gmail does during the inbox lookup.
- */
-public class Welcome extends Activity {
- /*
- * Commands for testing...
- * Open 1 pane
- adb shell am start -a android.intent.action.MAIN \
- -d '"content://ui.email.android.com/view/mailbox"' \
- -e DEBUG_PANE_MODE 1
-
- * Open 2 pane
- adb shell am start -a android.intent.action.MAIN \
- -d '"content://ui.email.android.com/view/mailbox"' \
- -e DEBUG_PANE_MODE 2
-
- * Open an account (ID=1) in 2 pane
- adb shell am start -a android.intent.action.MAIN \
- -d '"content://ui.email.android.com/view/mailbox?ACCOUNT_ID=1"' \
- -e DEBUG_PANE_MODE 2
-
- * Open a message (account id=1, mailbox id=2, message id=3)
- adb shell am start -a android.intent.action.MAIN \
- -d '"content://ui.email.android.com/view/mailbox?ACCOUNT_ID=1&MAILBOX_ID=2&MESSAGE_ID=3"' \
- -e DEBUG_PANE_MODE 2
-
- * Open the combined starred on the combined view
- adb shell am start -a android.intent.action.MAIN \
- -d '"content://ui.email.android.com/view/mailbox?ACCOUNT_ID=1152921504606846976&MAILBOX_ID=-4"' \
- -e DEBUG_PANE_MODE 2
- */
-
- /**
- * Extra for debugging. Set 1 to force one-pane. Set 2 to force two-pane.
- */
- private static final String EXTRA_DEBUG_PANE_MODE = "DEBUG_PANE_MODE";
-
- private static final String VIEW_MAILBOX_INTENT_URL_PATH = "/view/mailbox";
-
- private final EmailAsyncTask.Tracker mTaskTracker = new EmailAsyncTask.Tracker();
-
- private View mWaitingForSyncView;
-
- private long mAccountId;
- private long mMailboxId;
- private long mMessageId;
- private String mAccountUuid;
-
- private MailboxFinder mInboxFinder;
-
- /**
- * Launch this activity. Note: It's assumed that this activity is only called as a means to
- * 'reset' the UI state; Because of this, it is always launched with FLAG_ACTIVITY_CLEAR_TOP,
- * which will drop any other activities on the stack (e.g. AccountFolderList or MessageList).
- */
- public static void actionStart(Activity fromActivity) {
- Intent i = IntentUtilities.createRestartAppIntent(fromActivity, Welcome.class);
- fromActivity.startActivity(i);
- }
-
- /**
- * Create an Intent to open email activity. If <code>accountId</code> is not -1, the
- * specified account will be automatically be opened when the activity starts.
- */
- public static Intent createOpenAccountInboxIntent(Context context, long accountId) {
- final Uri.Builder b = IntentUtilities.createActivityIntentUrlBuilder(
- VIEW_MAILBOX_INTENT_URL_PATH);
- IntentUtilities.setAccountId(b, accountId);
- return IntentUtilities.createRestartAppIntent(b.build());
- }
-
- /**
- * Create an Intent to open a message.
- */
- public static Intent createOpenMessageIntent(Context context, long accountId,
- long mailboxId, long messageId) {
- final Uri.Builder b = IntentUtilities.createActivityIntentUrlBuilder(
- VIEW_MAILBOX_INTENT_URL_PATH);
- IntentUtilities.setAccountId(b, accountId);
- IntentUtilities.setMailboxId(b, mailboxId);
- IntentUtilities.setMessageId(b, messageId);
- return IntentUtilities.createRestartAppIntent(b.build());
- }
-
- /**
- * Open account's inbox.
- */
- public static void actionOpenAccountInbox(Activity fromActivity, long accountId) {
- fromActivity.startActivity(createOpenAccountInboxIntent(fromActivity, accountId));
- }
-
- /**
- * Create an {@link Intent} for account shortcuts. The returned intent stores the account's
- * UUID rather than the account ID, which will be changed after account restore.
- */
- public static Intent createAccountShortcutIntent(Context context, String uuid, long mailboxId) {
- final Uri.Builder b = IntentUtilities.createActivityIntentUrlBuilder(
- VIEW_MAILBOX_INTENT_URL_PATH);
- IntentUtilities.setAccountUuid(b, uuid);
- IntentUtilities.setMailboxId(b, mailboxId);
- return IntentUtilities.createRestartAppIntent(b.build());
- }
-
- /**
- * If the {@link #EXTRA_DEBUG_PANE_MODE} extra is "1" or "2", return 1 or 2 respectively.
- * Otherwise return 0.
- *
- * @see UiUtilities#setDebugPaneMode(int)
- * @see UiUtilities#useTwoPane(Context)
- */
- private static int getDebugPaneMode(Intent i) {
- Bundle extras = i.getExtras();
- if (extras != null) {
- String s = extras.getString(EXTRA_DEBUG_PANE_MODE);
- if ("1".equals(s)) {
- return 1;
- } else if ("2".equals(s)) {
- return 2;
- }
- }
- return 0;
- }
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- ActivityHelper.debugSetWindowFlags(this);
-
- // Because the app could be reloaded (for debugging, etc.), we need to make sure that
- // ExchangeService gets a chance to start. There is no harm to starting it if it has
- // already been started
- // When the service starts, it reconciles EAS accounts.
- // TODO More completely separate ExchangeService from Email app
- EmailServiceUtils.startExchangeService(this);
-
- // Extract parameters from the intent.
- final Intent intent = getIntent();
- mAccountId = IntentUtilities.getAccountIdFromIntent(intent);
- mMailboxId = IntentUtilities.getMailboxIdFromIntent(intent);
- mMessageId = IntentUtilities.getMessageIdFromIntent(intent);
- mAccountUuid = IntentUtilities.getAccountUuidFromIntent(intent);
- UiUtilities.setDebugPaneMode(getDebugPaneMode(intent));
-
- // Reconcile POP/IMAP accounts. EAS accounts are taken care of by ExchangeService.
- if (MailService.hasMismatchInPopImapAccounts(this)) {
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- // Reconciling can be heavy - so do it in the background.
- MailService.reconcilePopImapAccountsSync(Welcome.this);
- resolveAccount();
- }
- });
- } else {
- resolveAccount();
- }
-
- // Reset the "accounts changed" notification, now that we're here
- Email.setNotifyUiAccountsChanged(false);
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Only create the menu if we had to stop and show a loading spinner - otherwise
- // this is a transient activity with no UI.
- if (mInboxFinder == null) {
- return super.onCreateOptionsMenu(menu);
- }
-
- getMenuInflater().inflate(R.menu.welcome, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == R.id.account_settings) {
- AccountSettings.actionSettings(this, mAccountId);
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- protected void onStop() {
- // Cancel all running tasks.
- // (If it's stopping for configuration changes, we just re-do everything on the new
- // instance)
- stopInboxLookup();
- mTaskTracker.cancellAllInterrupt();
-
- super.onStop();
-
- if (!isChangingConfigurations()) {
- // This means the user opened some other app.
- // Just close self and not launch EmailActivity.
- if (Email.DEBUG && Logging.DEBUG_LIFECYCLE) {
- Log.d(Logging.LOG_TAG, "Welcome: Closing self...");
- }
- finish();
- }
- }
-
- /**
- * {@inheritDoc}
- *
- * When launching an activity from {@link Welcome}, we always want to set
- * {@link Intent#FLAG_ACTIVITY_FORWARD_RESULT}.
- */
- @Override
- public void startActivity(Intent intent) {
- intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
- super.startActivity(intent);
- }
-
- /**
- * Stop inbox lookup. This MSUT be called on the UI thread.
- */
- private void stopInboxLookup() {
- if (mInboxFinder != null) {
- mInboxFinder.cancel();
- mInboxFinder = null;
- }
- }
-
- /**
- * Start inbox lookup. This MSUT be called on the UI thread.
- */
- private void startInboxLookup() {
- Log.i(Logging.LOG_TAG, "Inbox not found. Starting mailbox finder...");
- stopInboxLookup(); // Stop if already running -- it shouldn't be but just in case.
- mInboxFinder = new MailboxFinder(this, mAccountId, Mailbox.TYPE_INBOX,
- mMailboxFinderCallback);
- mInboxFinder.startLookup();
-
- // Show "your email will appear shortly" message.
- mWaitingForSyncView = LayoutInflater.from(this).inflate(
- R.layout.waiting_for_sync_message, null);
- addContentView(mWaitingForSyncView, new LayoutParams(
- LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
- invalidateOptionsMenu();
- }
-
- /**
- * Determine which account to open with the given account ID and UUID.
- *
- * @return ID of the account to use.
- */
- @VisibleForTesting
- static long resolveAccountId(Context context, long inputAccountId, String inputUuid) {
- final long accountId;
-
- if (!TextUtils.isEmpty(inputUuid)) {
- // If a UUID is specified, try to use it.
- // If the UUID is invalid, accountId will be NO_ACCOUNT.
- accountId = Account.getAccountIdFromUuid(context, inputUuid);
-
- } else if (inputAccountId != Account.NO_ACCOUNT) {
- // If a valid account ID is specified, just use it.
- if (inputAccountId == Account.ACCOUNT_ID_COMBINED_VIEW
- || Account.isValidId(context, inputAccountId)) {
- accountId = inputAccountId;
- } else {
- accountId = Account.NO_ACCOUNT;
- }
- } else {
- // Neither an accountID or a UUID is specified.
- // Use the last account used, falling back to the default.
- long lastUsedId = Preferences.getPreferences(context).getLastUsedAccountId();
- if (lastUsedId != Account.NO_ACCOUNT) {
- if (!Account.isValidId(context, lastUsedId)) {
- // The last account that was used has since been deleted.
- lastUsedId = Account.NO_ACCOUNT;
- Preferences.getPreferences(context).setLastUsedAccountId(Account.NO_ACCOUNT);
- }
- }
- accountId = (lastUsedId == Account.NO_ACCOUNT)
- ? Account.getDefaultAccountId(context)
- : lastUsedId;
- }
- if (accountId != Account.NO_ACCOUNT) {
- // Okay, the given account is valid.
- return accountId;
- } else {
- // No, it's invalid. Show the warning toast and use the default.
- Utility.showToast(context, R.string.toast_account_not_found);
- return Account.getDefaultAccountId(context);
- }
- }
-
- /**
- * Determine which account to use according to the number of accounts already set up,
- * {@link #mAccountId} and {@link #mAccountUuid}.
- *
- * <pre>
- * 1. If there's no account configured, start account setup.
- * 2. Otherwise detemine which account to open with {@link #resolveAccountId} and
- * 2a. If the account doesn't have inbox yet, start inbox finder.
- * 2b. Otherwise open the main activity.
- * </pre>
- */
- private void resolveAccount() {
- final int numAccount = EmailContent.count(this, Account.CONTENT_URI);
- if (numAccount == 0) {
- AccountSetupBasics.actionNewAccount(this);
- finish();
- return;
- } else {
- mAccountId = resolveAccountId(this, mAccountId, mAccountUuid);
- if (Account.isNormalAccount(mAccountId) &&
- Mailbox.findMailboxOfType(this, mAccountId, Mailbox.TYPE_INBOX)
- == Mailbox.NO_MAILBOX) {
- startInboxLookup();
- return;
- }
- }
- startEmailActivity();
- }
-
- /**
- * Start {@link EmailActivity} using {@link #mAccountId}, {@link #mMailboxId} and
- * {@link #mMessageId}.
- */
- private void startEmailActivity() {
- final Intent i;
- if (mMessageId != Message.NO_MESSAGE) {
- i = EmailActivity.createOpenMessageIntent(this, mAccountId, mMailboxId, mMessageId);
- } else if (mMailboxId != Mailbox.NO_MAILBOX) {
- i = EmailActivity.createOpenMailboxIntent(this, mAccountId, mMailboxId);
- } else {
- i = EmailActivity.createOpenAccountIntent(this, mAccountId);
- }
- startActivity(i);
- finish();
- }
-
- private final MailboxFinder.Callback mMailboxFinderCallback = new MailboxFinder.Callback() {
- // This MUST be called from callback methods.
- private void cleanUp() {
- mInboxFinder = null;
- }
-
- @Override
- public void onAccountNotFound() {
- cleanUp();
- // Account removed? Clear the IDs and restart the task. Which will result in either
- // a) show account setup if there's really no accounts or b) open the default account.
-
- mAccountId = Account.NO_ACCOUNT;
- mMailboxId = Mailbox.NO_MAILBOX;
- mMessageId = Message.NO_MESSAGE;
- mAccountUuid = null;
-
- // Restart the account resolution.
- resolveAccount();
- }
-
- @Override
- public void onMailboxNotFound(long accountId) {
- // Just do the same thing as "account not found".
- onAccountNotFound();
- }
-
- @Override
- public void onAccountSecurityHold(long accountId) {
- cleanUp();
-
- ActivityHelper.showSecurityHoldDialog(Welcome.this, accountId);
- finish();
- }
-
- @Override
- public void onMailboxFound(long accountId, long mailboxId) {
- cleanUp();
-
- // Okay the account has Inbox now. Start the main activity.
- startEmailActivity();
- }
- };
-}
diff --git a/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java b/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java
index 64d4f3d3c..4bcd7c1ec 100644
--- a/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java
+++ b/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java
@@ -78,6 +78,7 @@ public class AccountCheckSettingsFragment extends Fragment {
// Support for UI
private boolean mAttached;
+ private boolean mPaused = false;
private CheckingDialog mCheckingDialog;
private MessagingException mProgressException;
@@ -168,12 +169,19 @@ public class AccountCheckSettingsFragment extends Fragment {
@Override
public void onResume() {
super.onResume();
+ mPaused = false;
if (mState != STATE_START) {
reportProgress(mState, mProgressException);
}
}
+ @Override
+ public void onPause() {
+ super.onPause();
+ mPaused = true;
+ }
+
/**
* This is called when the fragment is going away. It is NOT called
* when the fragment is being propagated between activity instances.
@@ -181,8 +189,10 @@ public class AccountCheckSettingsFragment extends Fragment {
@Override
public void onDestroy() {
super.onDestroy();
- Utility.cancelTaskInterrupt(mAccountCheckTask);
- mAccountCheckTask = null;
+ if (mAccountCheckTask != null) {
+ Utility.cancelTaskInterrupt(mAccountCheckTask);
+ mAccountCheckTask = null;
+ }
}
/**
@@ -206,7 +216,7 @@ public class AccountCheckSettingsFragment extends Fragment {
mProgressException = ex;
// If we are attached, create, recover, and/or update the dialog
- if (mAttached) {
+ if (mAttached && !mPaused) {
FragmentManager fm = getFragmentManager();
switch (newState) {
@@ -469,8 +479,10 @@ public class AccountCheckSettingsFragment extends Fragment {
EmailServiceProxy.VALIDATE_BUNDLE_POLICY_SET));
return new MessagingException(resultCode, mStoreHost);
} else if (resultCode == MessagingException.SECURITY_POLICIES_UNSUPPORTED) {
- String[] data = bundle.getStringArray(
- EmailServiceProxy.VALIDATE_BUNDLE_UNSUPPORTED_POLICIES);
+ Policy policy = (Policy)bundle.getParcelable(
+ EmailServiceProxy.VALIDATE_BUNDLE_POLICY_SET);
+ String unsupported = policy.mProtocolPoliciesUnsupported;
+ String[] data = unsupported.split("" + Policy.POLICY_STRING_DELIMITER);
return new MessagingException(resultCode, mStoreHost, data);
} else if (resultCode != MessagingException.NO_ERROR) {
String errorMessage =
@@ -518,7 +530,7 @@ public class AccountCheckSettingsFragment extends Fragment {
// Return "real" AD results
HostAuth auth = new HostAuth();
auth.setLogin("user", "password");
- auth.setConnection(HostAuth.SCHEME_EAS, "testserver.com", 0);
+ auth.setConnection(HostAuth.LEGACY_SCHEME_EAS, "testserver.com", 0);
return new AutoDiscoverResults(false, auth);
}
if (isCancelled()) return null;
@@ -729,6 +741,7 @@ public class AccountCheckSettingsFragment extends Fragment {
dialog.setButton(DialogInterface.BUTTON_NEGATIVE,
context.getString(R.string.cancel_action),
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
target.onCheckingDialogCancel();
@@ -826,6 +839,7 @@ public class AccountCheckSettingsFragment extends Fragment {
builder.setPositiveButton(
context.getString(android.R.string.ok),
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
target.onEditCertificateOk();
@@ -834,6 +848,7 @@ public class AccountCheckSettingsFragment extends Fragment {
builder.setNegativeButton(
context.getString(android.R.string.cancel),
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
target.onErrorDialogEditButton();
@@ -845,6 +860,7 @@ public class AccountCheckSettingsFragment extends Fragment {
builder.setPositiveButton(
context.getString(R.string.account_setup_failed_dlg_edit_details_action),
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
target.onErrorDialogEditButton();
@@ -901,6 +917,7 @@ public class AccountCheckSettingsFragment extends Fragment {
.setPositiveButton(
context.getString(R.string.okay_action),
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
target.onSecurityRequiredDialogResultOk(true);
@@ -909,6 +926,7 @@ public class AccountCheckSettingsFragment extends Fragment {
.setNegativeButton(
context.getString(R.string.cancel_action),
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
target.onSecurityRequiredDialogResultOk(false);
diff --git a/src/com/android/email/activity/setup/AccountSecurity.java b/src/com/android/email/activity/setup/AccountSecurity.java
index 8c8ce5a62..8b4e20e50 100644
--- a/src/com/android/email/activity/setup/AccountSecurity.java
+++ b/src/com/android/email/activity/setup/AccountSecurity.java
@@ -29,10 +29,10 @@ import android.content.res.Resources;
import android.os.Bundle;
import android.util.Log;
-import com.android.email.Email;
import com.android.email.R;
import com.android.email.SecurityPolicy;
import com.android.email.activity.ActivityHelper;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.utility.Utility;
@@ -51,6 +51,8 @@ import com.android.emailcommon.utility.Utility;
public class AccountSecurity extends Activity {
private static final String TAG = "Email/AccountSecurity";
+ private static final boolean DEBUG = true; // STOPSHIP Don't ship with this set to true
+
private static final String EXTRA_ACCOUNT_ID = "ACCOUNT_ID";
private static final String EXTRA_SHOW_DIALOG = "SHOW_DIALOG";
private static final String EXTRA_PASSWORD_EXPIRING = "EXPIRING";
@@ -91,7 +93,7 @@ public class AccountSecurity extends Activity {
*/
public static Intent actionDevicePasswordExpirationIntent(Context context, long accountId,
boolean expired) {
- Intent intent = new Intent(context, AccountSecurity.class);
+ Intent intent = new ForwardingIntent(context, AccountSecurity.class);
intent.putExtra(EXTRA_ACCOUNT_ID, accountId);
intent.putExtra(expired ? EXTRA_PASSWORD_EXPIRED : EXTRA_PASSWORD_EXPIRING, true);
return intent;
@@ -119,6 +121,7 @@ public class AccountSecurity extends Activity {
finish();
return;
}
+
// Special handling for password expiration events
if (passwordExpiring || passwordExpired) {
FragmentManager fm = getFragmentManager();
@@ -126,6 +129,9 @@ public class AccountSecurity extends Activity {
PasswordExpirationDialog dialog =
PasswordExpirationDialog.newInstance(mAccount.getDisplayName(),
passwordExpired);
+ if (MailActivityEmail.DEBUG || DEBUG) {
+ Log.d(TAG, "Showing password expiration dialog");
+ }
dialog.show(fm, "password_expiration");
}
return;
@@ -139,6 +145,9 @@ public class AccountSecurity extends Activity {
if (fm.findFragmentByTag("security_needed") == null) {
SecurityNeededDialog dialog =
SecurityNeededDialog.newInstance(mAccount.getDisplayName());
+ if (MailActivityEmail.DEBUG || DEBUG) {
+ Log.d(TAG, "Showing security needed dialog");
+ }
dialog.show(fm, "security_needed");
}
} else {
@@ -177,7 +186,7 @@ public class AccountSecurity extends Activity {
// Step 1. Check if we are an active device administrator, and stop here to activate
if (!security.isActiveAdmin()) {
if (mTriedAddAdministrator) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG || DEBUG) {
Log.d(TAG, "Not active admin: repost notification");
}
repostNotification(account, security);
@@ -187,13 +196,13 @@ public class AccountSecurity extends Activity {
// retrieve name of server for the format string
HostAuth hostAuth = HostAuth.restoreHostAuthWithId(this, account.mHostAuthKeyRecv);
if (hostAuth == null) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG || DEBUG) {
Log.d(TAG, "No HostAuth: repost notification");
}
repostNotification(account, security);
finish();
} else {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG || DEBUG) {
Log.d(TAG, "Not active admin: post initial notification");
}
// try to become active - must happen here in activity, to get result
@@ -212,7 +221,7 @@ public class AccountSecurity extends Activity {
// Step 2. Check if the current aggregate security policy is being satisfied by the
// DevicePolicyManager (the current system security level).
if (security.isActive(null)) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG || DEBUG) {
Log.d(TAG, "Security active; clear holds");
}
Account.clearSecurityHoldOnAllAccounts(this);
@@ -231,13 +240,13 @@ public class AccountSecurity extends Activity {
// Step 5. If password is needed, try to have the user set it
if ((inactiveReasons & SecurityPolicy.INACTIVE_NEED_PASSWORD) != 0) {
if (mTriedSetPassword) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG || DEBUG) {
Log.d(TAG, "Password needed; repost notification");
}
repostNotification(account, security);
finish();
} else {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG || DEBUG) {
Log.d(TAG, "Password needed; request it via DPM");
}
mTriedSetPassword = true;
@@ -251,13 +260,13 @@ public class AccountSecurity extends Activity {
// Step 6. If encryption is needed, try to have the user set it
if ((inactiveReasons & SecurityPolicy.INACTIVE_NEED_ENCRYPTION) != 0) {
if (mTriedSetEncryption) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG || DEBUG) {
Log.d(TAG, "Encryption needed; repost notification");
}
repostNotification(account, security);
finish();
} else {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG || DEBUG) {
Log.d(TAG, "Encryption needed; request it via DPM");
}
mTriedSetEncryption = true;
@@ -269,7 +278,7 @@ public class AccountSecurity extends Activity {
}
// Step 7. No problems were found, so clear holds and exit
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG || DEBUG) {
Log.d(TAG, "Policies enforced; clear holds");
}
Account.clearSecurityHoldOnAllAccounts(this);
@@ -323,7 +332,7 @@ public class AccountSecurity extends Activity {
b.setMessage(res.getString(R.string.account_security_dialog_content_fmt, accountName));
b.setPositiveButton(R.string.okay_action, this);
b.setNegativeButton(R.string.cancel_action, this);
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG || DEBUG) {
Log.d(TAG, "Posting security needed dialog");
}
return b.create();
@@ -340,13 +349,13 @@ public class AccountSecurity extends Activity {
}
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG || DEBUG) {
Log.d(TAG, "User accepts; advance to next step");
}
activity.tryAdvanceSecurity(activity.mAccount);
break;
case DialogInterface.BUTTON_NEGATIVE:
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG || DEBUG) {
Log.d(TAG, "User declines; repost notification");
}
activity.repostNotification(
diff --git a/src/com/android/email/activity/setup/AccountServerBaseFragment.java b/src/com/android/email/activity/setup/AccountServerBaseFragment.java
index abc31a135..917200724 100644
--- a/src/com/android/email/activity/setup/AccountServerBaseFragment.java
+++ b/src/com/android/email/activity/setup/AccountServerBaseFragment.java
@@ -142,6 +142,7 @@ public abstract class AccountServerBaseFragment extends Fragment
if (getArguments() != null) {
mSettingsMode = getArguments().getBoolean(BUNDLE_KEY_SETTINGS);
}
+ setHasOptionsMenu(true);
}
/**
@@ -410,6 +411,11 @@ public abstract class AccountServerBaseFragment extends Fragment
return sendChanged || recvChanged;
}
+ public boolean setHostAuthFromAutodiscover(HostAuth hostAuth) {
+ // This is overridden, if necessary
+ return true;
+ }
+
/**
* Save settings after "OK" result from checker. Concrete classes must implement.
* This is called from a worker thread and is allowed to perform DB operations.
diff --git a/src/com/android/email/activity/setup/AccountSettings.java b/src/com/android/email/activity/setup/AccountSettings.java
index a0e117485..23eb17fa9 100644
--- a/src/com/android/email/activity/setup/AccountSettings.java
+++ b/src/com/android/email/activity/setup/AccountSettings.java
@@ -37,16 +37,17 @@ import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
-import com.android.email.Controller;
import com.android.email.R;
import com.android.email.activity.ActivityHelper;
import com.android.email.mail.Sender;
-import com.android.email.mail.Store;
+import com.android.email.provider.EmailProvider;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent.AccountColumns;
import com.android.emailcommon.utility.IntentUtilities;
import com.android.emailcommon.utility.Utility;
+import com.android.mail.providers.Folder;
+import com.android.mail.providers.UIProvider.EditSettingsExtras;
import java.util.List;
@@ -55,7 +56,7 @@ import java.util.List;
*
* This activity uses the following fragments:
* AccountSettingsFragment
- * Account{Incoming/Outgoing/Exchange}Fragment
+ * Account{Incoming/Outgoing}Fragment
* AccountCheckSettingsFragment
* GeneralPreferences
* DebugFragment
@@ -76,6 +77,7 @@ public class AccountSettings extends PreferenceActivity {
private static final String EXTRA_ENABLE_DEBUG = "AccountSettings.enable_debug";
private static final String EXTRA_LOGIN_WARNING_FOR_ACCOUNT = "AccountSettings.for_account";
private static final String EXTRA_TITLE = "AccountSettings.title";
+ public static final String EXTRA_NO_ACCOUNTS = "AccountSettings.no_account";
// Intent extras for launch directly from system account manager
// NOTE: This string must match the one in res/xml/account_preferences.xml
@@ -159,7 +161,7 @@ public class AccountSettings extends PreferenceActivity {
super.onCreate(savedInstanceState);
ActivityHelper.debugSetWindowFlags(this);
- Intent i = getIntent();
+ final Intent i = getIntent();
if (savedInstanceState == null) {
// If we are not restarting from a previous instance, we need to
// figure out the initial prefs to show. (Otherwise, we want to
@@ -169,6 +171,13 @@ public class AccountSettings extends PreferenceActivity {
mGetAccountIdFromAccountTask =
(GetAccountIdFromAccountTask) new GetAccountIdFromAccountTask()
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, i);
+ } else if (i.hasExtra(EditSettingsExtras.EXTRA_FOLDER)) {
+ launchMailboxSettings(i);
+ return;
+ } else if (i.hasExtra(EXTRA_NO_ACCOUNTS)) {
+ AccountSetupBasics.actionNewAccountWithResult(this);
+ finish();
+ return;
} else {
// Otherwise, we're called from within the Email app and look for our extras
mRequestedAccountId = IntentUtilities.getAccountIdFromIntent(i);
@@ -245,11 +254,6 @@ public class AccountSettings extends PreferenceActivity {
}
@Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- return shouldShowNewAccount();
- }
-
- @Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
@@ -307,40 +311,25 @@ public class AccountSettings extends PreferenceActivity {
super.onBackPressed();
}
- /**
- * If the caller requested a specific account to be edited, switch to it. This is a one-shot,
- * so the user is free to edit another account as well.
- */
- @Override
- public Header onGetNewHeader() {
- Header result = mRequestedAccountHeader;
- mRequestedAccountHeader = null;
- return result;
+ private void launchMailboxSettings(Intent intent) {
+ final Folder folder = (Folder)intent.getParcelableExtra(EditSettingsExtras.EXTRA_FOLDER);
+
+ // TODO: determine from the account if we should navigate to the mailbox settings.
+ // See bug 6242668
+
+ // Get the mailbox id from the folder
+ final long mailboxId = Long.parseLong(folder.uri.getPathSegments().get(1));
+
+ MailboxSettings.start(this, mailboxId);
+ finish();
}
+
private void enableDebugMenu() {
mShowDebugMenu = true;
invalidateHeaders();
}
- /**
- * Decide if "add account" should be shown
- */
- private boolean shouldShowNewAccount() {
- // If in single pane mode, only add accounts at top level
- if (!onIsMultiPane()) {
- return hasHeaders();
- } else {
- // If in multi pane mode, only add accounts when showing a top level fragment
- // Note: null is OK; This is the case when we first launch the activity
- if ((mCurrentFragment != null)
- && !(mCurrentFragment instanceof GeneralPreferences)
- && !(mCurrentFragment instanceof DebugFragment)
- && !(mCurrentFragment instanceof AccountSettingsFragment)) return false;
- }
- return true;
- }
-
private void onAddNewAccount() {
AccountSetupBasics.actionNewAccount(this);
}
@@ -589,10 +578,6 @@ public class AccountSettings extends PreferenceActivity {
public void abandonEdit() {
finish();
}
- @Override
- public void deleteAccount(Account account) {
- AccountSettings.this.deleteAccount(account);
- }
}
/**
@@ -659,27 +644,13 @@ public class AccountSettings extends PreferenceActivity {
/**
* Dispatch to edit incoming settings.
- *
- * TODO: Make things less hardwired
*/
public void onIncomingSettings(Account account) {
try {
- Store store = Store.getInstance(account, getApplication());
- if (store != null) {
- Class<? extends android.app.Activity> setting = store.getSettingActivityClass();
- if (setting != null) {
- SetupData.init(SetupData.FLOW_MODE_EDIT, account);
- if (setting.equals(AccountSetupIncoming.class)) {
- startPreferencePanel(AccountSetupIncomingFragment.class.getName(),
- AccountSetupIncomingFragment.getSettingsModeArgs(),
- R.string.account_settings_incoming_label, null, null, 0);
- } else if (setting.equals(AccountSetupExchange.class)) {
- startPreferencePanel(AccountSetupExchangeFragment.class.getName(),
- AccountSetupExchangeFragment.getSettingsModeArgs(),
- R.string.account_settings_incoming_label, null, null, 0);
- }
- }
- }
+ SetupData.init(SetupData.FLOW_MODE_EDIT, account);
+ startPreferencePanel(AccountSetupIncomingFragment.class.getName(),
+ AccountSetupIncomingFragment.getSettingsModeArgs(),
+ R.string.account_settings_incoming_label, null, null, 0);
} catch (Exception e) {
Log.d(Logging.LOG_TAG, "Error while trying to invoke store settings.", e);
}
@@ -712,11 +683,16 @@ public class AccountSettings extends PreferenceActivity {
/**
* Delete the selected account
*/
- public void deleteAccount(Account account) {
+ public void deleteAccount(final Account account) {
// Kick off the work to actually delete the account
- // Delete the account (note, this is async. Would be nice to get a callback.
- Controller.getInstance(this).deleteAccount(account.mId);
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ Uri uri = EmailProvider.uiUri("uiaccount", account.mId);
+ getContentResolver().delete(uri, null, null);
+ }}).start();
+ // TODO: Remove ui glue for unified
// Then update the UI as appropriate:
// If single pane, return to the header list. If multi, rebuild header list
if (onIsMultiPane()) {
@@ -761,7 +737,7 @@ public class AccountSettings extends PreferenceActivity {
* Dialog fragment to show "exit with unsaved changes?" dialog
*/
/* package */ static class UnsavedChangesDialogFragment extends DialogFragment {
- private final static String TAG = "UnsavedChangesDialogFragment";
+ final static String TAG = "UnsavedChangesDialogFragment";
// Argument bundle keys
private final static String BUNDLE_KEY_HEADER = "UnsavedChangesDialogFragment.Header";
@@ -809,6 +785,7 @@ public class AccountSettings extends PreferenceActivity {
.setPositiveButton(
R.string.okay_action,
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
if (isBack) {
activity.forceBack();
diff --git a/src/com/android/email/activity/setup/AccountSettingsEditQuickResponsesFragment.java b/src/com/android/email/activity/setup/AccountSettingsEditQuickResponsesFragment.java
index 776291e55..9e70aebdb 100644
--- a/src/com/android/email/activity/setup/AccountSettingsEditQuickResponsesFragment.java
+++ b/src/com/android/email/activity/setup/AccountSettingsEditQuickResponsesFragment.java
@@ -16,9 +16,9 @@
package com.android.email.activity.setup;
-import com.android.email.Email;
import com.android.email.R;
import com.android.email.activity.UiUtilities;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.EmailContent;
import com.android.emailcommon.provider.Account;
@@ -225,7 +225,7 @@ public class AccountSettingsEditQuickResponsesFragment extends Fragment
@Override
public void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSettingsEditQuickResponsesFragment onCreate");
}
super.onCreate(savedInstanceState);
@@ -238,7 +238,7 @@ public class AccountSettingsEditQuickResponsesFragment extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSettingsEditQuickResponsesFragment onCreateView");
}
int layoutId = R.layout.account_settings_edit_quick_responses_fragment;
diff --git a/src/com/android/email/activity/setup/AccountSettingsFragment.java b/src/com/android/email/activity/setup/AccountSettingsFragment.java
index 7e19076f4..7c5fc74dc 100644
--- a/src/com/android/email/activity/setup/AccountSettingsFragment.java
+++ b/src/com/android/email/activity/setup/AccountSettingsFragment.java
@@ -17,16 +17,11 @@
package com.android.email.activity.setup;
import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.Fragment;
-import android.app.FragmentTransaction;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.SharedPreferences;
+import android.content.res.Resources;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Vibrator;
@@ -35,24 +30,27 @@ import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceCategory;
-import android.preference.PreferenceFragment;
import android.preference.RingtonePreference;
+import android.provider.CalendarContract;
import android.provider.ContactsContract;
import android.text.TextUtils;
import android.util.Log;
-import com.android.email.Email;
import com.android.email.R;
-import com.android.email.mail.Sender;
+import com.android.email.SecurityPolicy;
+import com.android.email.service.EmailServiceUtils;
+import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.AccountManagerTypes;
-import com.android.emailcommon.CalendarProviderStub;
import com.android.emailcommon.Logging;
-import com.android.emailcommon.mail.MessagingException;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent;
import com.android.emailcommon.provider.HostAuth;
+import com.android.emailcommon.provider.Policy;
import com.android.emailcommon.utility.Utility;
+import java.util.ArrayList;
+
/**
* Fragment containing the main logic for account settings. This also calls out to other
* fragments for server settings.
@@ -61,7 +59,8 @@ import com.android.emailcommon.utility.Utility;
* TODO: Can we defer calling addPreferencesFromResource() until after we load the account? This
* could reduce flicker.
*/
-public class AccountSettingsFragment extends PreferenceFragment {
+public class AccountSettingsFragment extends EmailPreferenceFragment
+ implements Preference.OnPreferenceChangeListener {
// Keys used for arguments bundle
private static final String BUNDLE_KEY_ACCOUNT_ID = "AccountSettingsFragment.AccountId";
@@ -81,12 +80,15 @@ public class AccountSettingsFragment extends PreferenceFragment {
private static final String PREFERENCE_VIBRATE_WHEN = "account_settings_vibrate_when";
private static final String PREFERENCE_RINGTONE = "account_ringtone";
private static final String PREFERENCE_CATEGORY_SERVER = "account_servers";
+ private static final String PREFERENCE_CATEGORY_POLICIES = "account_policies";
+ private static final String PREFERENCE_POLICIES_ENFORCED = "policies_enforced";
+ private static final String PREFERENCE_POLICIES_UNSUPPORTED = "policies_unsupported";
+ private static final String PREFERENCE_POLICIES_RETRY_ACCOUNT = "policies_retry_account";
private static final String PREFERENCE_INCOMING = "incoming";
private static final String PREFERENCE_OUTGOING = "outgoing";
private static final String PREFERENCE_SYNC_CONTACTS = "account_sync_contacts";
private static final String PREFERENCE_SYNC_CALENDAR = "account_sync_calendar";
private static final String PREFERENCE_SYNC_EMAIL = "account_sync_email";
- private static final String PREFERENCE_DELETE_ACCOUNT = "delete_account";
// These strings must match account_settings_vibrate_when_* strings in strings.xml
private static final String PREFERENCE_VALUE_VIBRATE_WHEN_ALWAYS = "always";
@@ -131,7 +133,6 @@ public class AccountSettingsFragment extends PreferenceFragment {
public void onIncomingSettings(Account account);
public void onOutgoingSettings(Account account);
public void abandonEdit();
- public void deleteAccount(Account account);
}
private static class EmptyCallback implements Callback {
@@ -141,7 +142,6 @@ public class AccountSettingsFragment extends PreferenceFragment {
@Override public void onIncomingSettings(Account account) {}
@Override public void onOutgoingSettings(Account account) {}
@Override public void abandonEdit() {}
- @Override public void deleteAccount(Account account) {}
}
/**
@@ -170,7 +170,7 @@ public class AccountSettingsFragment extends PreferenceFragment {
*/
@Override
public void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSettingsFragment onCreate");
}
super.onCreate(savedInstanceState);
@@ -194,7 +194,7 @@ public class AccountSettingsFragment extends PreferenceFragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSettingsFragment onActivityCreated");
}
super.onActivityCreated(savedInstanceState);
@@ -205,7 +205,7 @@ public class AccountSettingsFragment extends PreferenceFragment {
*/
@Override
public void onStart() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSettingsFragment onStart");
}
super.onStart();
@@ -224,7 +224,7 @@ public class AccountSettingsFragment extends PreferenceFragment {
*/
@Override
public void onResume() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSettingsFragment onResume");
}
super.onResume();
@@ -253,7 +253,7 @@ public class AccountSettingsFragment extends PreferenceFragment {
@Override
public void onPause() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSettingsFragment onPause");
}
super.onPause();
@@ -267,7 +267,7 @@ public class AccountSettingsFragment extends PreferenceFragment {
*/
@Override
public void onStop() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSettingsFragment onStop");
}
super.onStop();
@@ -275,11 +275,70 @@ public class AccountSettingsFragment extends PreferenceFragment {
}
/**
+ * Listen to all preference changes in this class.
+ * @param preference
+ * @param newValue
+ * @return
+ */
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue){
+ // Can't use a switch here. Falling back to a giant conditional.
+ final String key = preference.getKey();
+ if (key.equals(PREFERENCE_DESCRIPTION)){
+ String summary = newValue.toString().trim();
+ if (TextUtils.isEmpty(summary)) {
+ summary = mAccount.mEmailAddress;
+ }
+ mAccountDescription.setSummary(summary);
+ mAccountDescription.setText(summary);
+ preferenceChanged(PREFERENCE_DESCRIPTION, summary);
+ return false;
+ } else if (key.equals(PREFERENCE_FREQUENCY)) {
+ final String summary = newValue.toString();
+ final int index = mCheckFrequency.findIndexOfValue(summary);
+ mCheckFrequency.setSummary(mCheckFrequency.getEntries()[index]);
+ mCheckFrequency.setValue(summary);
+ preferenceChanged(PREFERENCE_FREQUENCY, newValue);
+ return false;
+ } else if (key.equals(PREFERENCE_SIGNATURE)) {
+ // Clean up signature if it's only whitespace (which is easy to do on a
+ // soft keyboard) but leave whitespace in place otherwise, to give the user
+ // maximum flexibility, e.g. the ability to indent
+ String signature = newValue.toString();
+ if (signature.trim().isEmpty()) {
+ signature = "";
+ }
+ mAccountSignature.setText(signature);
+ preferenceChanged(PREFERENCE_SIGNATURE, signature);
+ return false;
+ } else if (key.equals(PREFERENCE_NAME)) {
+ final String summary = newValue.toString().trim();
+ if (!TextUtils.isEmpty(summary)) {
+ mAccountName.setSummary(summary);
+ mAccountName.setText(summary);
+ preferenceChanged(PREFERENCE_NAME, summary);
+ }
+ return false;
+ } else if (key.equals(PREFERENCE_VIBRATE_WHEN)) {
+ final String vibrateSetting = newValue.toString();
+ final int index = mAccountVibrateWhen.findIndexOfValue(vibrateSetting);
+ mAccountVibrateWhen.setSummary(mAccountVibrateWhen.getEntries()[index]);
+ mAccountVibrateWhen.setValue(vibrateSetting);
+ preferenceChanged(PREFERENCE_VIBRATE_WHEN, newValue);
+ return false;
+ } else {
+ // Default behavior, just indicate that the preferences were written
+ preferenceChanged(key, newValue);
+ return true;
+ }
+ }
+
+ /**
* Called when the fragment is no longer in use.
*/
@Override
public void onDestroy() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSettingsFragment onDestroy");
}
super.onDestroy();
@@ -290,7 +349,7 @@ public class AccountSettingsFragment extends PreferenceFragment {
@Override
public void onSaveInstanceState(Bundle outState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSettingsFragment onSaveInstanceState");
}
super.onSaveInstanceState(outState);
@@ -352,6 +411,52 @@ public class AccountSettingsFragment extends PreferenceFragment {
}
/**
+ * From a Policy, create and return an ArrayList of Strings that describe (simply) those
+ * policies that are supported by the OS. At the moment, the strings are simple (e.g.
+ * "password required"); we should probably add more information (# characters, etc.), though
+ */
+ private ArrayList<String> getSystemPoliciesList(Policy policy) {
+ Resources res = mContext.getResources();
+ ArrayList<String> policies = new ArrayList<String>();
+ if (policy.mPasswordMode != Policy.PASSWORD_MODE_NONE) {
+ policies.add(res.getString(R.string.policy_require_password));
+ }
+ if (policy.mPasswordHistory > 0) {
+ policies.add(res.getString(R.string.policy_password_history));
+ }
+ if (policy.mPasswordExpirationDays > 0) {
+ policies.add(res.getString(R.string.policy_password_expiration));
+ }
+ if (policy.mMaxScreenLockTime > 0) {
+ policies.add(res.getString(R.string.policy_screen_timeout));
+ }
+ if (policy.mDontAllowCamera) {
+ policies.add(res.getString(R.string.policy_dont_allow_camera));
+ }
+ if (policy.mMaxEmailLookback != 0) {
+ policies.add(res.getString(R.string.policy_email_age));
+ }
+ if (policy.mMaxCalendarLookback != 0) {
+ policies.add(res.getString(R.string.policy_calendar_age));
+ }
+ return policies;
+ }
+
+ private void setPolicyListSummary(ArrayList<String> policies, String policiesToAdd,
+ String preferenceName) {
+ Policy.addPolicyStringToList(policiesToAdd, policies);
+ if (policies.size() > 0) {
+ Preference p = findPreference(preferenceName);
+ StringBuilder sb = new StringBuilder();
+ for (String desc: policies) {
+ sb.append(desc);
+ sb.append('\n');
+ }
+ p.setSummary(sb.toString());
+ }
+ }
+
+ /**
* Load account data into preference UI
*/
private void loadSettings() {
@@ -363,20 +468,7 @@ public class AccountSettingsFragment extends PreferenceFragment {
mAccountDescription = (EditTextPreference) findPreference(PREFERENCE_DESCRIPTION);
mAccountDescription.setSummary(mAccount.getDisplayName());
mAccountDescription.setText(mAccount.getDisplayName());
- mAccountDescription.setOnPreferenceChangeListener(
- new Preference.OnPreferenceChangeListener() {
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- String summary = newValue.toString().trim();
- if (TextUtils.isEmpty(summary)) {
- summary = mAccount.mEmailAddress;
- }
- mAccountDescription.setSummary(summary);
- mAccountDescription.setText(summary);
- onPreferenceChanged(PREFERENCE_DESCRIPTION, summary);
- return false;
- }
- }
- );
+ mAccountDescription.setOnPreferenceChangeListener(this);
mAccountName = (EditTextPreference) findPreference(PREFERENCE_NAME);
String senderName = mAccount.getSenderName();
@@ -384,58 +476,20 @@ public class AccountSettingsFragment extends PreferenceFragment {
if (senderName == null) senderName = "";
mAccountName.setSummary(senderName);
mAccountName.setText(senderName);
- mAccountName.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- final String summary = newValue.toString().trim();
- if (!TextUtils.isEmpty(summary)) {
- mAccountName.setSummary(summary);
- mAccountName.setText(summary);
- onPreferenceChanged(PREFERENCE_NAME, summary);
- }
- return false;
- }
- });
+ mAccountName.setOnPreferenceChangeListener(this);
mAccountSignature = (EditTextPreference) findPreference(PREFERENCE_SIGNATURE);
- String signature = mAccount.getSignature();
mAccountSignature.setText(mAccount.getSignature());
- mAccountSignature.setOnPreferenceChangeListener(
- new Preference.OnPreferenceChangeListener() {
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- // Clean up signature if it's only whitespace (which is easy to do on a
- // soft keyboard) but leave whitespace in place otherwise, to give the user
- // maximum flexibility, e.g. the ability to indent
- String signature = newValue.toString();
- if (signature.trim().isEmpty()) {
- signature = "";
- }
- mAccountSignature.setText(signature);
- onPreferenceChanged(PREFERENCE_SIGNATURE, signature);
- return false;
- }
- });
+ mAccountSignature.setOnPreferenceChangeListener(this);
mCheckFrequency = (ListPreference) findPreference(PREFERENCE_FREQUENCY);
-
- // TODO Move protocol into Account to avoid retrieving the HostAuth (implicitly)
String protocol = Account.getProtocol(mContext, mAccount.mId);
- if (HostAuth.SCHEME_EAS.equals(protocol)) {
- mCheckFrequency.setEntries(R.array.account_settings_check_frequency_entries_push);
- mCheckFrequency.setEntryValues(R.array.account_settings_check_frequency_values_push);
- }
-
+ EmailServiceInfo info = EmailServiceUtils.getServiceInfo(mContext, protocol);
+ mCheckFrequency.setEntries(info.syncIntervalStrings);
+ mCheckFrequency.setEntryValues(info.syncIntervals);
mCheckFrequency.setValue(String.valueOf(mAccount.getSyncInterval()));
mCheckFrequency.setSummary(mCheckFrequency.getEntry());
- mCheckFrequency.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- final String summary = newValue.toString();
- int index = mCheckFrequency.findIndexOfValue(summary);
- mCheckFrequency.setSummary(mCheckFrequency.getEntries()[index]);
- mCheckFrequency.setValue(summary);
- onPreferenceChanged(PREFERENCE_FREQUENCY, newValue);
- return false;
- }
- });
+ mCheckFrequency.setOnPreferenceChangeListener(this);
findPreference(PREFERENCE_QUICK_RESPONSES).setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() {
@@ -452,7 +506,7 @@ public class AccountSettingsFragment extends PreferenceFragment {
(PreferenceCategory) findPreference(PREFERENCE_CATEGORY_DATA_USAGE);
mSyncWindow = null;
- if (HostAuth.SCHEME_EAS.equals(protocol)) {
+ if (info.offerLookback) {
mSyncWindow = new ListPreference(mContext);
mSyncWindow.setTitle(R.string.account_setup_options_mail_window_label);
mSyncWindow.setValue(String.valueOf(mAccount.getSyncLookback()));
@@ -462,39 +516,39 @@ public class AccountSettingsFragment extends PreferenceFragment {
// Must correspond to the hole in the XML file that's reserved.
mSyncWindow.setOrder(2);
mSyncWindow.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+ @Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String summary = newValue.toString();
int index = mSyncWindow.findIndexOfValue(summary);
mSyncWindow.setSummary(mSyncWindow.getEntries()[index]);
mSyncWindow.setValue(summary);
- onPreferenceChanged(preference.getKey(), newValue);
+ preferenceChanged(preference.getKey(), newValue);
return false;
}
});
dataUsageCategory.addPreference(mSyncWindow);
}
- // Show "background attachments" for IMAP & EAS - hide it for POP3.
mAccountBackgroundAttachments = (CheckBoxPreference)
findPreference(PREFERENCE_BACKGROUND_ATTACHMENTS);
- if (HostAuth.SCHEME_POP3.equals(mAccount.mHostAuthRecv.mProtocol)) {
+ if (!info.offerAttachmentPreload) {
dataUsageCategory.removePreference(mAccountBackgroundAttachments);
} else {
mAccountBackgroundAttachments.setChecked(
0 != (mAccount.getFlags() & Account.FLAGS_BACKGROUND_ATTACHMENTS));
- mAccountBackgroundAttachments.setOnPreferenceChangeListener(mPreferenceChangeListener);
+ mAccountBackgroundAttachments.setOnPreferenceChangeListener(this);
}
mAccountDefault = (CheckBoxPreference) findPreference(PREFERENCE_DEFAULT);
mAccountDefault.setChecked(mAccount.mId == mDefaultAccountId);
- mAccountDefault.setOnPreferenceChangeListener(mPreferenceChangeListener);
+ mAccountDefault.setOnPreferenceChangeListener(this);
mAccountNotify = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFY);
mAccountNotify.setChecked(0 != (mAccount.getFlags() & Account.FLAGS_NOTIFY_NEW_MAIL));
- mAccountNotify.setOnPreferenceChangeListener(mPreferenceChangeListener);
+ mAccountNotify.setOnPreferenceChangeListener(this);
mAccountRingtone = (RingtonePreference) findPreference(PREFERENCE_RINGTONE);
- mAccountRingtone.setOnPreferenceChangeListener(mPreferenceChangeListener);
+ mAccountRingtone.setOnPreferenceChangeListener(this);
// The following two lines act as a workaround for the RingtonePreference
// which does not let us set/get the value programmatically
@@ -520,18 +574,7 @@ public class AccountSettingsFragment extends PreferenceFragment {
mAccountVibrateWhen.setSummary(mAccountVibrateWhen.getEntries()[index]);
// When the value is changed, update the summary in addition to the setting.
- mAccountVibrateWhen.setOnPreferenceChangeListener(
- new Preference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- final String vibrateSetting = newValue.toString();
- final int index = mAccountVibrateWhen.findIndexOfValue(vibrateSetting);
- mAccountVibrateWhen.setSummary(mAccountVibrateWhen.getEntries()[index]);
- mAccountVibrateWhen.setValue(vibrateSetting);
- onPreferenceChanged(PREFERENCE_VIBRATE_WHEN, newValue);
- return false;
- }
- });
+ mAccountVibrateWhen.setOnPreferenceChangeListener(this);
} else {
// No vibrator present. Remove the preference altogether.
PreferenceCategory notificationsCategory = (PreferenceCategory)
@@ -539,8 +582,49 @@ public class AccountSettingsFragment extends PreferenceFragment {
notificationsCategory.removePreference(mAccountVibrateWhen);
}
+ final Preference retryAccount = findPreference(PREFERENCE_POLICIES_RETRY_ACCOUNT);
+ final PreferenceCategory policiesCategory = (PreferenceCategory) findPreference(
+ PREFERENCE_CATEGORY_POLICIES);
+ if (mAccount.mPolicyKey > 0) {
+ // Make sure we have most recent data from account
+ mAccount.refresh(mContext);
+ Policy policy = Policy.restorePolicyWithId(mContext, mAccount.mPolicyKey);
+ if (policy == null) {
+ // The account has been deleted? Crazy, but not impossible
+ return;
+ }
+ if (policy.mProtocolPoliciesEnforced != null) {
+ ArrayList<String> policies = getSystemPoliciesList(policy);
+ setPolicyListSummary(policies, policy.mProtocolPoliciesEnforced,
+ PREFERENCE_POLICIES_ENFORCED);
+ }
+ if (policy.mProtocolPoliciesUnsupported != null) {
+ ArrayList<String> policies = new ArrayList<String>();
+ setPolicyListSummary(policies, policy.mProtocolPoliciesUnsupported,
+ PREFERENCE_POLICIES_UNSUPPORTED);
+ } else {
+ // Don't show "retry" unless we have unsupported policies
+ policiesCategory.removePreference(retryAccount);
+ }
+ } else {
+ // Remove the category completely if there are no policies
+ getPreferenceScreen().removePreference(policiesCategory);
+ }
+
+ retryAccount.setOnPreferenceClickListener(
+ new Preference.OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ // Release the account
+ SecurityPolicy.setAccountHoldFlag(mContext, mAccount, false);
+ // Remove the preference
+ policiesCategory.removePreference(retryAccount);
+ return true;
+ }
+ });
findPreference(PREFERENCE_INCOMING).setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() {
+ @Override
public boolean onPreferenceClick(Preference preference) {
mAccountDirty = true;
mCallback.onIncomingSettings(mAccount);
@@ -550,19 +634,10 @@ public class AccountSettingsFragment extends PreferenceFragment {
// Hide the outgoing account setup link if it's not activated
Preference prefOutgoing = findPreference(PREFERENCE_OUTGOING);
- boolean showOutgoing = true;
- try {
- Sender sender = Sender.getInstance(mContext, mAccount);
- if (sender != null) {
- Class<? extends android.app.Activity> setting = sender.getSettingActivityClass();
- showOutgoing = (setting != null);
- }
- } catch (MessagingException me) {
- // just leave showOutgoing as true - bias towards showing it, so user can fix it
- }
- if (showOutgoing) {
+ if (info.usesSmtp) {
prefOutgoing.setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() {
+ @Override
public boolean onPreferenceClick(Preference preference) {
mAccountDirty = true;
mCallback.onOutgoingSettings(mAccount);
@@ -578,55 +653,39 @@ public class AccountSettingsFragment extends PreferenceFragment {
mSyncContacts = (CheckBoxPreference) findPreference(PREFERENCE_SYNC_CONTACTS);
mSyncCalendar = (CheckBoxPreference) findPreference(PREFERENCE_SYNC_CALENDAR);
mSyncEmail = (CheckBoxPreference) findPreference(PREFERENCE_SYNC_EMAIL);
- if (mAccount.mHostAuthRecv.mProtocol.equals(HostAuth.SCHEME_EAS)) {
+ if (info.syncContacts || info.syncCalendar) {
android.accounts.Account acct = new android.accounts.Account(mAccount.mEmailAddress,
- AccountManagerTypes.TYPE_EXCHANGE);
- mSyncContacts.setChecked(ContentResolver
- .getSyncAutomatically(acct, ContactsContract.AUTHORITY));
- mSyncContacts.setOnPreferenceChangeListener(mPreferenceChangeListener);
- mSyncCalendar.setChecked(ContentResolver
- .getSyncAutomatically(acct, CalendarProviderStub.AUTHORITY));
- mSyncCalendar.setOnPreferenceChangeListener(mPreferenceChangeListener);
+ info.accountType);
+ if (info.syncContacts) {
+ mSyncContacts.setChecked(ContentResolver
+ .getSyncAutomatically(acct, ContactsContract.AUTHORITY));
+ mSyncContacts.setOnPreferenceChangeListener(this);
+ } else {
+ mSyncContacts.setChecked(false);
+ mSyncContacts.setEnabled(false);
+ }
+ if (info.syncCalendar) {
+ mSyncCalendar.setChecked(ContentResolver
+ .getSyncAutomatically(acct, CalendarContract.AUTHORITY));
+ mSyncCalendar.setOnPreferenceChangeListener(this);
+ } else {
+ mSyncCalendar.setChecked(false);
+ mSyncCalendar.setEnabled(false);
+ }
mSyncEmail.setChecked(ContentResolver
.getSyncAutomatically(acct, EmailContent.AUTHORITY));
- mSyncEmail.setOnPreferenceChangeListener(mPreferenceChangeListener);
+ mSyncEmail.setOnPreferenceChangeListener(this);
} else {
dataUsageCategory.removePreference(mSyncContacts);
dataUsageCategory.removePreference(mSyncCalendar);
dataUsageCategory.removePreference(mSyncEmail);
}
-
- // Temporary home for delete account
- Preference prefDeleteAccount = findPreference(PREFERENCE_DELETE_ACCOUNT);
- prefDeleteAccount.setOnPreferenceClickListener(
- new Preference.OnPreferenceClickListener() {
- public boolean onPreferenceClick(Preference preference) {
- DeleteAccountFragment dialogFragment = DeleteAccountFragment.newInstance(
- mAccount, AccountSettingsFragment.this);
- FragmentTransaction ft = getFragmentManager().beginTransaction();
- ft.addToBackStack(null);
- dialogFragment.show(ft, DeleteAccountFragment.TAG);
- return true;
- }
- });
}
/**
- * Generic onPreferenceChanged listener for the preferences (above) that just need
- * to be written, without extra tweaks
- */
- private final Preference.OnPreferenceChangeListener mPreferenceChangeListener =
- new Preference.OnPreferenceChangeListener() {
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- onPreferenceChanged(preference.getKey(), newValue);
- return true;
- }
- };
-
- /**
* Called any time a preference is changed.
*/
- private void onPreferenceChanged(String preference, Object value) {
+ private void preferenceChanged(String preference, Object value) {
mCallback.onSettingsChanged(mAccount, preference, value);
mSaveOnExit = true;
}
@@ -664,12 +723,14 @@ public class AccountSettingsFragment extends PreferenceFragment {
mAccount.setRingtone(prefs.getString(PREFERENCE_RINGTONE, null));
mAccount.setFlags(newFlags);
- if (mAccount.mHostAuthRecv.mProtocol.equals("eas")) {
+ EmailServiceInfo info =
+ EmailServiceUtils.getServiceInfo(mContext, mAccount.getProtocol(mContext));
+ if (info.syncContacts || info.syncCalendar) {
android.accounts.Account acct = new android.accounts.Account(mAccount.mEmailAddress,
AccountManagerTypes.TYPE_EXCHANGE);
ContentResolver.setSyncAutomatically(acct, ContactsContract.AUTHORITY,
mSyncContacts.isChecked());
- ContentResolver.setSyncAutomatically(acct, CalendarProviderStub.AUTHORITY,
+ ContentResolver.setSyncAutomatically(acct, CalendarContract.AUTHORITY,
mSyncCalendar.isChecked());
ContentResolver.setSyncAutomatically(acct, EmailContent.AUTHORITY,
mSyncEmail.isChecked());
@@ -684,67 +745,7 @@ public class AccountSettingsFragment extends PreferenceFragment {
mAccount.update(mContext, cv);
// Run the remaining changes off-thread
- Email.setServicesEnabledAsync(mContext);
- }
-
- /**
- * Dialog fragment to show "remove account?" dialog
- */
- public static class DeleteAccountFragment extends DialogFragment {
- private final static String TAG = "DeleteAccountFragment";
-
- // Argument bundle keys
- private final static String BUNDLE_KEY_ACCOUNT_NAME = "DeleteAccountFragment.Name";
-
- /**
- * Create the dialog with parameters
- */
- public static DeleteAccountFragment newInstance(Account account, Fragment parentFragment) {
- DeleteAccountFragment f = new DeleteAccountFragment();
- Bundle b = new Bundle();
- b.putString(BUNDLE_KEY_ACCOUNT_NAME, account.getDisplayName());
- f.setArguments(b);
- f.setTargetFragment(parentFragment, 0);
- return f;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- Context context = getActivity();
- final String name = getArguments().getString(BUNDLE_KEY_ACCOUNT_NAME);
-
- return new AlertDialog.Builder(context)
- .setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(R.string.account_delete_dlg_title)
- .setMessage(context.getString(R.string.account_delete_dlg_instructions_fmt, name))
- .setPositiveButton(
- R.string.okay_action,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- Fragment f = getTargetFragment();
- if (f instanceof AccountSettingsFragment) {
- ((AccountSettingsFragment)f).finishDeleteAccount();
- }
- dismiss();
- }
- })
- .setNegativeButton(
- R.string.cancel_action,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- dismiss();
- }
- })
- .create();
- }
- }
-
- /**
- * Callback from delete account dialog - passes the delete command up to the activity
- */
- private void finishDeleteAccount() {
- mSaveOnExit = false;
- mCallback.deleteAccount(mAccount);
+ MailActivityEmail.setServicesEnabledAsync(mContext);
}
public String getAccountEmail() {
diff --git a/src/com/android/email/activity/setup/AccountSettingsUtils.java b/src/com/android/email/activity/setup/AccountSettingsUtils.java
index 9ff519b6c..16e9df148 100644
--- a/src/com/android/email/activity/setup/AccountSettingsUtils.java
+++ b/src/com/android/email/activity/setup/AccountSettingsUtils.java
@@ -16,10 +16,12 @@
package com.android.email.activity.setup;
+import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.res.XmlResourceParser;
import android.text.Editable;
+import android.text.TextUtils;
import android.util.Log;
import android.widget.EditText;
@@ -28,7 +30,10 @@ import com.android.email.VendorPolicyLoader;
import com.android.email.provider.AccountBackupRestore;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
+import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.provider.EmailContent.AccountColumns;
+import com.android.emailcommon.provider.QuickResponse;
+import com.android.emailcommon.utility.Utility;
import com.google.common.annotations.VisibleForTesting;
import java.io.Serializable;
@@ -51,10 +56,26 @@ public class AccountSettingsUtils {
public static void commitSettings(Context context, Account account) {
if (!account.isSaved()) {
account.save(context);
+
+ // Set up default quick responses here...
+ String[] defaultQuickResponses =
+ context.getResources().getStringArray(R.array.default_quick_responses);
+ ContentValues cv = new ContentValues();
+ cv.put(QuickResponse.ACCOUNT_KEY, account.mId);
+ ContentResolver resolver = context.getContentResolver();
+ for (String quickResponse: defaultQuickResponses) {
+ // Allow empty entries (some localizations may not want to have the maximum
+ // number)
+ if (!TextUtils.isEmpty(quickResponse)) {
+ cv.put(QuickResponse.TEXT, quickResponse);
+ resolver.insert(QuickResponse.CONTENT_URI, cv);
+ }
+ }
} else {
ContentValues cv = getAccountContentValues(account);
account.update(context, cv);
}
+
// Update the backup (side copy) of the accounts
AccountBackupRestore.backup(context);
}
@@ -259,35 +280,35 @@ public class AccountSettingsUtils {
*
* Incoming: Prepend "imap" or "pop3" to domain, unless "pop", "pop3",
* "imap", or "mail" are found.
- * Outgoing: Prepend "smtp" if "pop", "pop3", "imap" are found.
- * Leave "mail" as-is.
- * TBD: Are there any useful defaults for exchange?
+ * Outgoing: Prepend "smtp" if domain starts with any in the host prefix array
*
* @param server name as we know it so far
* @param incoming "pop3" or "imap" (or null)
* @param outgoing "smtp" or null
* @return the post-processed name for use in the UI
*/
- public static String inferServerName(String server, String incoming, String outgoing) {
+ public static String inferServerName(Context context, String server, String incoming,
+ String outgoing) {
// Default values cause entire string to be kept, with prepended server string
int keepFirstChar = 0;
int firstDotIndex = server.indexOf('.');
if (firstDotIndex != -1) {
// look at first word and decide what to do
String firstWord = server.substring(0, firstDotIndex).toLowerCase();
- boolean isImapOrPop = "imap".equals(firstWord)
- || "pop3".equals(firstWord) || "pop".equals(firstWord);
+ String[] hostPrefixes =
+ context.getResources().getStringArray(R.array.smtp_host_prefixes);
+ boolean canSubstituteSmtp = Utility.arrayContains(hostPrefixes, firstWord);
boolean isMail = "mail".equals(firstWord);
// Now decide what to do
if (incoming != null) {
// For incoming, we leave imap/pop/pop3/mail alone, or prepend incoming
- if (isImapOrPop || isMail) {
+ if (canSubstituteSmtp || isMail) {
return server;
}
} else {
// For outgoing, replace imap/pop/pop3 with outgoing, leave mail alone, or
// prepend outgoing
- if (isImapOrPop) {
+ if (canSubstituteSmtp) {
keepFirstChar = firstDotIndex + 1;
} else if (isMail) {
return server;
diff --git a/src/com/android/email/activity/setup/AccountSetupAccountType.java b/src/com/android/email/activity/setup/AccountSetupAccountType.java
deleted file mode 100644
index 53f20a9e0..000000000
--- a/src/com/android/email/activity/setup/AccountSetupAccountType.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-
-import com.android.email.R;
-import com.android.email.VendorPolicyLoader;
-import com.android.email.activity.ActivityHelper;
-import com.android.email.activity.UiUtilities;
-import com.android.email.service.EmailServiceUtils;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-
-/**
- * Prompts the user to select an account type. The account type, along with the
- * passed in email address, password and makeDefault are then passed on to the
- * AccountSetupIncoming activity.
- */
-public class AccountSetupAccountType extends AccountSetupActivity implements OnClickListener {
-
- public static void actionSelectAccountType(Activity fromActivity) {
- fromActivity.startActivity(new Intent(fromActivity, AccountSetupAccountType.class));
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityHelper.debugSetWindowFlags(this);
- int flowMode = SetupData.getFlowMode();
-
- // If we're in account setup flow mode, for EAS, skip this screen and "click" EAS
- if (flowMode == SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS) {
- onExchange();
- return;
- }
-
- // Otherwise proceed into this screen
- setContentView(R.layout.account_setup_account_type);
- UiUtilities.getView(this, R.id.pop).setOnClickListener(this);
- UiUtilities.getView(this, R.id.imap).setOnClickListener(this);
- final Button exchangeButton = (Button) UiUtilities.getView(this, R.id.exchange);
- exchangeButton.setVisibility(View.INVISIBLE);
- final Button previousButton = (Button) findViewById(R.id.previous); // xlarge only
- if (previousButton != null) previousButton.setOnClickListener(this);
-
- // TODO If we decide to exclude the Exchange option in POP_IMAP mode, use the following line
- // instead of the line that follows it
- //if (ExchangeUtils.isExchangeAvailable(this) && flowMode != SetupData.FLOW_MODE_POP_IMAP) {
- if (EmailServiceUtils.isExchangeAvailable(this)) {
- exchangeButton.setOnClickListener(this);
- exchangeButton.setVisibility(View.VISIBLE);
- if (VendorPolicyLoader.getInstance(this).useAlternateExchangeStrings()) {
- exchangeButton.setText(
- R.string.account_setup_account_type_exchange_action_alternate);
- }
- }
- // TODO: Dynamic creation of buttons, instead of just hiding things we don't need
- }
-
- /**
- * For POP accounts, we rewrite the username to the full user@domain, and we set the
- * default server name to pop3.domain
- */
- private void onPop() {
- Account account = SetupData.getAccount();
- HostAuth hostAuth = account.mHostAuthRecv;
- hostAuth.mProtocol = HostAuth.SCHEME_POP3;
- hostAuth.mLogin = hostAuth.mLogin + "@" + hostAuth.mAddress;
- hostAuth.mAddress = AccountSettingsUtils.inferServerName(hostAuth.mAddress,
- HostAuth.SCHEME_POP3, null);
- AccountSetupBasics.setFlagsForProtocol(account, HostAuth.SCHEME_POP3);
- SetupData.setCheckSettingsMode(SetupData.CHECK_INCOMING | SetupData.CHECK_OUTGOING);
- AccountSetupIncoming.actionIncomingSettings(this, SetupData.getFlowMode(), account);
- finish();
- }
-
- /**
- * The user has selected an IMAP account type. Try to put together a URI using the entered
- * email address. Also set the mail delete policy here, because there is no UI (for IMAP).
- */
- private void onImap() {
- Account account = SetupData.getAccount();
- HostAuth hostAuth = account.mHostAuthRecv;
- hostAuth.mProtocol = HostAuth.SCHEME_IMAP;
- hostAuth.mLogin = hostAuth.mLogin + "@" + hostAuth.mAddress;
- hostAuth.mAddress = AccountSettingsUtils.inferServerName(hostAuth.mAddress,
- HostAuth.SCHEME_IMAP, null);
- AccountSetupBasics.setFlagsForProtocol(account, HostAuth.SCHEME_IMAP);
- SetupData.setCheckSettingsMode(SetupData.CHECK_INCOMING | SetupData.CHECK_OUTGOING);
- AccountSetupIncoming.actionIncomingSettings(this, SetupData.getFlowMode(), account);
- finish();
- }
-
- /**
- * The user has selected an exchange account type. Set the mail delete policy here, because
- * there is no UI (for exchange), and switch the default sync interval to "push".
- */
- private void onExchange() {
- Account account = SetupData.getAccount();
- HostAuth recvAuth = account.getOrCreateHostAuthRecv(this);
- recvAuth.setConnection(HostAuth.SCHEME_EAS, recvAuth.mAddress, recvAuth.mPort,
- recvAuth.mFlags | HostAuth.FLAG_SSL);
- HostAuth sendAuth = account.getOrCreateHostAuthSend(this);
- sendAuth.setConnection(HostAuth.SCHEME_EAS, sendAuth.mAddress, sendAuth.mPort,
- sendAuth.mFlags | HostAuth.FLAG_SSL);
- AccountSetupBasics.setFlagsForProtocol(account, HostAuth.SCHEME_EAS);
- SetupData.setCheckSettingsMode(SetupData.CHECK_AUTODISCOVER);
- AccountSetupExchange.actionIncomingSettings(this, SetupData.getFlowMode(), account);
- finish();
- }
-
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.pop:
- onPop();
- break;
- case R.id.imap:
- onImap();
- break;
- case R.id.exchange:
- onExchange();
- break;
- case R.id.previous:
- finish();
- break;
- }
- }
-}
diff --git a/src/com/android/email/activity/setup/AccountSetupBasics.java b/src/com/android/email/activity/setup/AccountSetupBasics.java
index cc48a7a7b..506c82706 100644
--- a/src/com/android/email/activity/setup/AccountSetupBasics.java
+++ b/src/com/android/email/activity/setup/AccountSetupBasics.java
@@ -43,11 +43,11 @@ import android.widget.Toast;
import com.android.email.EmailAddressValidator;
import com.android.email.R;
-import com.android.email.VendorPolicyLoader;
import com.android.email.activity.ActivityHelper;
import com.android.email.activity.UiUtilities;
-import com.android.email.activity.Welcome;
import com.android.email.activity.setup.AccountSettingsUtils.Provider;
+import com.android.email.service.EmailServiceUtils;
+import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent;
@@ -99,6 +99,7 @@ public class AccountSetupBasics extends AccountSetupActivity
*/
private static final String ACTION_CREATE_ACCOUNT = "com.android.email.CREATE_ACCOUNT";
private static final String EXTRA_FLOW_MODE = "FLOW_MODE";
+ private static final String EXTRA_FLOW_ACCOUNT_TYPE = "FLOW_ACCOUNT_TYPE";
private static final String EXTRA_CREATE_ACCOUNT_EMAIL = "EMAIL";
private static final String EXTRA_CREATE_ACCOUNT_USER = "USER";
private static final String EXTRA_CREATE_ACCOUNT_INCOMING = "INCOMING";
@@ -111,7 +112,6 @@ public class AccountSetupBasics extends AccountSetupActivity
private static final int DEFAULT_ACCOUNT_CHECK_INTERVAL = 15;
// Support for UI
- private TextView mWelcomeView;
private EditText mEmailView;
private EditText mPasswordView;
private CheckBox mDefaultView;
@@ -132,23 +132,20 @@ public class AccountSetupBasics extends AccountSetupActivity
fromActivity.startActivity(i);
}
- /**
- * This generates setup data that can be used to start a self-contained account creation flow
- * for exchange accounts.
- */
- public static Intent actionSetupExchangeIntent(Context context) {
- Intent i = new Intent(context, AccountSetupBasics.class);
- i.putExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS);
- return i;
+ public static void actionNewAccountWithResult(Activity fromActivity) {
+ Intent i = new ForwardingIntent(fromActivity, AccountSetupBasics.class);
+ i.putExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_NO_ACCOUNTS);
+ fromActivity.startActivity(i);
}
/**
* This generates setup data that can be used to start a self-contained account creation flow
- * for pop/imap accounts.
+ * for exchange accounts.
*/
- public static Intent actionSetupPopImapIntent(Context context) {
+ public static Intent actionGetCreateAccountIntent(Context context, String accountManagerType) {
Intent i = new Intent(context, AccountSetupBasics.class);
- i.putExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_ACCOUNT_MANAGER_POP_IMAP);
+ i.putExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_ACCOUNT_MANAGER);
+ i.putExtra(EXTRA_FLOW_ACCOUNT_TYPE, accountManagerType);
return i;
}
@@ -157,7 +154,7 @@ public class AccountSetupBasics extends AccountSetupActivity
// is not safe, since it's not guaranteed that an Activity will run with the Intent, and
// information can get lost.
- Intent i= new Intent(fromActivity, AccountSetupBasics.class);
+ Intent i= new ForwardingIntent(fromActivity, AccountSetupBasics.class);
// If we're in the "account flow" (from AccountManager), we want to return to the caller
// (in the settings app)
SetupData.init(SetupData.FLOW_MODE_RETURN_TO_CALLER);
@@ -165,10 +162,24 @@ public class AccountSetupBasics extends AccountSetupActivity
fromActivity.startActivity(i);
}
+ public static void actionAccountCreateFinishedWithResult(Activity fromActivity) {
+ // TODO: handle this case - modifying state on SetupData when instantiating an Intent
+ // is not safe, since it's not guaranteed that an Activity will run with the Intent, and
+ // information can get lost.
+
+ Intent i= new ForwardingIntent(fromActivity, AccountSetupBasics.class);
+ // If we're in the "no accounts" flow, we want to return to the caller with a result
+ SetupData.init(SetupData.FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT);
+ i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ fromActivity.startActivity(i);
+ }
+
+ @SuppressWarnings("deprecation")
public static void actionAccountCreateFinished(final Activity fromActivity,
final long accountId) {
Utility.runAsync(new Runnable() {
- public void run() {
+ @Override
+ public void run() {
Intent i = new Intent(fromActivity, AccountSetupBasics.class);
// If we're not in the "account flow" (from AccountManager), we want to show the
// message list for the new inbox
@@ -193,7 +204,7 @@ public class AccountSetupBasics extends AccountSetupActivity
int flowMode = getIntent().getIntExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_UNSPECIFIED);
if (flowMode != SetupData.FLOW_MODE_UNSPECIFIED) {
- SetupData.init(flowMode);
+ SetupData.init(flowMode, getIntent().getStringExtra(EXTRA_FLOW_ACCOUNT_TYPE));
} else {
// TODO: get rid of this case. It's not safe to rely on this global static state. It
// should be specified in the Intent always.
@@ -204,11 +215,20 @@ public class AccountSetupBasics extends AccountSetupActivity
// Return to the caller who initiated account creation
finish();
return;
+ } else if (flowMode == SetupData.FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT) {
+ if (EmailContent.count(this, Account.CONTENT_URI) > 0) {
+ setResult(RESULT_OK);
+ } else {
+ setResult(RESULT_CANCELED);
+ }
+ finish();
+ return;
} else if (flowMode == SetupData.FLOW_MODE_RETURN_TO_MESSAGE_LIST) {
Account account = SetupData.getAccount();
if (account != null && account.mId >= 0) {
// Show the message list for the new account
- Welcome.actionOpenAccountInbox(this, account.mId);
+ //***
+ //Welcome.actionOpenAccountInbox(this, account.mId);
finish();
return;
}
@@ -216,7 +236,6 @@ public class AccountSetupBasics extends AccountSetupActivity
setContentView(R.layout.account_setup_basics);
- mWelcomeView = (TextView) UiUtilities.getView(this, R.id.instructions);
mEmailView = (EditText) UiUtilities.getView(this, R.id.account_email);
mPasswordView = (EditText) UiUtilities.getView(this, R.id.account_password);
mDefaultView = (CheckBox) UiUtilities.getView(this, R.id.account_default);
@@ -229,19 +248,6 @@ public class AccountSetupBasics extends AccountSetupActivity
new DisplayCheckboxTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
boolean manualButtonDisplayed = true;
- boolean alternateStrings = false;
- if (flowMode == SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS) {
- // No need for manual button -> next is appropriate
- manualButtonDisplayed = false;
- // Swap welcome text for EAS-specific text
- alternateStrings = VendorPolicyLoader.getInstance(this).useAlternateExchangeStrings();
- setTitle(alternateStrings
- ? R.string.account_setup_basics_exchange_title_alternate
- : R.string.account_setup_basics_exchange_title);
- mWelcomeView.setText(alternateStrings
- ? R.string.accounts_welcome_exchange_alternate
- : R.string.accounts_welcome_exchange);
- }
// Configure buttons
mManualButton = (Button) UiUtilities.getView(this, R.id.manual_setup);
@@ -373,6 +379,7 @@ public class AccountSetupBasics extends AccountSetupActivity
/**
* Implements TextWatcher
*/
+ @Override
public void afterTextChanged(Editable s) {
validateFields();
}
@@ -380,12 +387,14 @@ public class AccountSetupBasics extends AccountSetupActivity
/**
* Implements TextWatcher
*/
+ @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
/**
* Implements TextWatcher
*/
+ @Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@@ -416,6 +425,7 @@ public class AccountSetupBasics extends AccountSetupActivity
* Callable that returns the username (based on other accounts) or null.
*/
private final Callable<String> mOwnerLookupCallable = new Callable<String>() {
+ @Override
public String call() {
Context context = AccountSetupBasics.this;
String name = null;
@@ -444,6 +454,9 @@ public class AccountSetupBasics extends AccountSetupActivity
HostAuth recvAuth = account.getOrCreateHostAuthRecv(this);
HostAuth.setHostAuthFromString(recvAuth, mProvider.incomingUri);
recvAuth.setLogin(mProvider.incomingUsername, password);
+ EmailServiceInfo info = EmailServiceUtils.getServiceInfo(this, recvAuth.mProtocol);
+ recvAuth.mPort =
+ ((recvAuth.mFlags & HostAuth.FLAG_SSL) != 0) ? info.portSsl : info.port;
HostAuth sendAuth = account.getOrCreateHostAuthSend(this);
HostAuth.setHostAuthFromString(sendAuth, mProvider.outgoingUri);
@@ -514,27 +527,24 @@ public class AccountSetupBasics extends AccountSetupActivity
}
}
-
/**
* When "next" button is clicked
*/
private void onNext() {
// Try auto-configuration from XML providers (unless in EAS mode, we can skip it)
- if (SetupData.getFlowMode() != SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS) {
- String email = mEmailView.getText().toString().trim();
- String[] emailParts = email.split("@");
- String domain = emailParts[1].trim();
- mProvider = AccountSettingsUtils.findProviderForDomain(this, domain);
- if (mProvider != null) {
- if (mProvider.note != null) {
- NoteDialogFragment dialogFragment =
- NoteDialogFragment.newInstance(mProvider.note);
- dialogFragment.show(getFragmentManager(), NoteDialogFragment.TAG);
- } else {
- finishAutoSetup();
- }
- return;
+ String email = mEmailView.getText().toString().trim();
+ String[] emailParts = email.split("@");
+ String domain = emailParts[1].trim();
+ mProvider = AccountSettingsUtils.findProviderForDomain(this, domain);
+ if (mProvider != null) {
+ if (mProvider.note != null) {
+ NoteDialogFragment dialogFragment =
+ NoteDialogFragment.newInstance(mProvider.note);
+ dialogFragment.show(getFragmentManager(), NoteDialogFragment.TAG);
+ } else {
+ finishAutoSetup();
}
+ return;
}
// Can't use auto setup (although EAS accounts may still be able to AutoDiscover)
onManualSetup(true);
@@ -567,16 +577,16 @@ public class AccountSetupBasics extends AccountSetupActivity
Account account = SetupData.getAccount();
HostAuth recvAuth = account.getOrCreateHostAuthRecv(this);
recvAuth.setLogin(user, password);
- recvAuth.setConnection("placeholder", domain, HostAuth.PORT_UNKNOWN, HostAuth.FLAG_NONE);
+ recvAuth.setConnection(null, domain, HostAuth.PORT_UNKNOWN, HostAuth.FLAG_NONE);
HostAuth sendAuth = account.getOrCreateHostAuthSend(this);
sendAuth.setLogin(user, password);
- sendAuth.setConnection("placeholder", domain, HostAuth.PORT_UNKNOWN, HostAuth.FLAG_NONE);
+ sendAuth.setConnection(null, domain, HostAuth.PORT_UNKNOWN, HostAuth.FLAG_NONE);
populateSetupData(getOwnerName(), email, mDefaultView.isChecked());
SetupData.setAllowAutodiscover(allowAutoDiscover);
- AccountSetupAccountType.actionSelectAccountType(this);
+ AccountSetupType.actionSelectAccountType(this);
}
/**
@@ -607,6 +617,17 @@ public class AccountSetupBasics extends AccountSetupActivity
}
}
+ public static void setDefaultsForProtocol(Context context, Account account) {
+ String protocol = account.mHostAuthRecv.mProtocol;
+ if (protocol == null) return;
+ EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, protocol);
+ account.mSyncInterval = info.defaultSyncInterval;
+ account.mSyncLookback = info.defaultLookback;
+ if (info.offerLocalDeletes) {
+ account.setDeletePolicy(info.defaultLocalDeletes);
+ }
+ }
+
/**
* Populate SetupData's account with complete setup info.
*/
@@ -617,31 +638,7 @@ public class AccountSetupBasics extends AccountSetupActivity
account.setDisplayName(senderEmail);
account.setDefaultAccount(isDefault);
SetupData.setDefault(isDefault); // TODO - why duplicated, if already set in account
-
- String protocol = account.mHostAuthRecv.mProtocol;
- setFlagsForProtocol(account, protocol);
- }
-
- /**
- * Sets the account sync, delete, and other misc flags not captured in {@code HostAuth}
- * information for the specified account based on the protocol type.
- */
- @VisibleForTesting
- static void setFlagsForProtocol(Account account, String protocol) {
- if (HostAuth.SCHEME_IMAP.equals(protocol)) {
- // Delete policy must be set explicitly, because IMAP does not provide a UI selection
- // for it.
- account.setDeletePolicy(Account.DELETE_POLICY_ON_DELETE);
- account.mFlags |= Account.FLAGS_SUPPORTS_SEARCH;
- }
-
- if (HostAuth.SCHEME_EAS.equals(protocol)) {
- account.setDeletePolicy(Account.DELETE_POLICY_ON_DELETE);
- account.setSyncInterval(Account.CHECK_INTERVAL_PUSH);
- account.setSyncLookback(SyncWindow.SYNC_WINDOW_AUTO);
- } else {
- account.setSyncInterval(DEFAULT_ACCOUNT_CHECK_INTERVAL);
- }
+ setDefaultsForProtocol(this, account);
}
/**
@@ -701,7 +698,7 @@ public class AccountSetupBasics extends AccountSetupActivity
* Dialog fragment to show "setup note" dialog
*/
public static class NoteDialogFragment extends DialogFragment {
- private final static String TAG = "NoteDialogFragment";
+ final static String TAG = "NoteDialogFragment";
// Argument bundle keys
private final static String BUNDLE_KEY_NOTE = "NoteDialogFragment.Note";
@@ -729,6 +726,7 @@ public class AccountSetupBasics extends AccountSetupActivity
.setPositiveButton(
R.string.okay_action,
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
Activity a = getActivity();
if (a instanceof AccountSetupBasics) {
diff --git a/src/com/android/email/activity/setup/AccountSetupExchange.java b/src/com/android/email/activity/setup/AccountSetupExchange.java
deleted file mode 100644
index 828aeb037..000000000
--- a/src/com/android/email/activity/setup/AccountSetupExchange.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import com.android.email.R;
-import com.android.email.activity.ActivityHelper;
-import com.android.email.activity.UiUtilities;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-
-import android.app.Activity;
-import android.app.FragmentTransaction;
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-
-/**
- * Provides generic setup for Exchange accounts. The following fields are supported:
- *
- * Email Address (from previous setup screen)
- * Server
- * Domain
- * Requires SSL?
- * User (login)
- * Password
- *
- * There are two primary paths through this activity:
- * Edit existing:
- * Load existing values from account into fields
- * When user clicks 'next':
- * Confirm not a duplicate account
- * Try new values (check settings)
- * If new values are OK:
- * Write new values (save to provider)
- * finish() (pop to previous)
- *
- * Creating New:
- * Try Auto-discover to get details from server
- * If Auto-discover reports an authentication failure:
- * finish() (pop to previous, to re-enter username & password)
- * If Auto-discover succeeds:
- * write server's account details into account
- * Load values from account into fields
- * Confirm not a duplicate account
- * Try new values (check settings)
- * If new values are OK:
- * Write new values (save to provider)
- * Proceed to options screen
- * finish() (removes self from back stack)
- */
-public class AccountSetupExchange extends AccountSetupActivity
- implements AccountSetupExchangeFragment.Callback, OnClickListener {
-
- // Keys for savedInstanceState
- private final static String STATE_STARTED_AUTODISCOVERY =
- "AccountSetupExchange.StartedAutoDiscovery";
-
- boolean mStartedAutoDiscovery;
- /* package */ AccountSetupExchangeFragment mFragment;
- private Button mNextButton;
- /* package */ boolean mNextButtonEnabled;
-
- public static void actionIncomingSettings(Activity fromActivity, int mode, Account account) {
- SetupData.setFlowMode(mode);
- SetupData.setAccount(account);
- fromActivity.startActivity(new Intent(fromActivity, AccountSetupExchange.class));
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityHelper.debugSetWindowFlags(this);
- setContentView(R.layout.account_setup_exchange);
-
- mFragment = (AccountSetupExchangeFragment)
- getFragmentManager().findFragmentById(R.id.setup_fragment);
- mFragment.setCallback(this);
-
- mNextButton = (Button) UiUtilities.getView(this, R.id.next);
- mNextButton.setOnClickListener(this);
- UiUtilities.getView(this, R.id.previous).setOnClickListener(this);
-
- // One-shot to launch autodiscovery at the entry to this activity (but not if it restarts)
- mStartedAutoDiscovery = false;
- if (savedInstanceState != null) {
- mStartedAutoDiscovery = savedInstanceState.getBoolean(STATE_STARTED_AUTODISCOVERY);
- }
- if (!mStartedAutoDiscovery) {
- startAutoDiscover();
- }
- }
-
- /**
- * Implements View.OnClickListener
- */
- @Override
- public void onClick(View view) {
- switch (view.getId()) {
- case R.id.next:
- mFragment.onNext();
- break;
- case R.id.previous:
- onBackPressed();
- break;
- }
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putBoolean(STATE_STARTED_AUTODISCOVERY, mStartedAutoDiscovery);
- }
-
- /**
- * If the conditions are right, launch the autodiscover fragment. If it succeeds (even
- * partially) it will prefill the setup fields and we can proceed as if the user entered them.
- *
- * Conditions for skipping:
- * Editing existing account
- * AutoDiscover blocked (used for unit testing only)
- * Username or password not entered yet
- */
- private void startAutoDiscover() {
- // Note that we've started autodiscovery - even if we decide not to do it,
- // this prevents repeating.
- mStartedAutoDiscovery = true;
-
- if (!SetupData.isAllowAutodiscover()) {
- return;
- }
-
- Account account = SetupData.getAccount();
- // If we've got a username and password and we're NOT editing, try autodiscover
- String username = account.mHostAuthRecv.mLogin;
- String password = account.mHostAuthRecv.mPassword;
- if (username != null && password != null) {
- onProceedNext(SetupData.CHECK_AUTODISCOVER, mFragment);
- }
- }
-
- /**
- * Implements AccountCheckSettingsFragment.Callbacks
- *
- * @param result configuration data returned by AD server, or null if no data available
- */
- public void onAutoDiscoverComplete(int result, HostAuth hostAuth) {
- // If authentication failed, exit immediately (to re-enter credentials)
- if (result == AccountCheckSettingsFragment.AUTODISCOVER_AUTHENTICATION) {
- finish();
- return;
- }
-
- // If data was returned, populate the account & populate the UI fields and validate it
- if (result == AccountCheckSettingsFragment.AUTODISCOVER_OK) {
- boolean valid = mFragment.setHostAuthFromAutodiscover(hostAuth);
- if (valid) {
- // "click" next to launch server verification
- mFragment.onNext();
- }
- }
- // Otherwise, proceed into this activity for manual setup
- }
-
- /**
- * Implements AccountServerBaseFragment.Callback
- */
- public void onProceedNext(int checkMode, AccountServerBaseFragment target) {
- AccountCheckSettingsFragment checkerFragment =
- AccountCheckSettingsFragment.newInstance(checkMode, target);
- FragmentTransaction transaction = getFragmentManager().beginTransaction();
- transaction.add(checkerFragment, AccountCheckSettingsFragment.TAG);
- transaction.addToBackStack("back");
- transaction.commit();
- }
-
- /**
- * Implements AccountServerBaseFragment.Callback
- */
- public void onEnableProceedButtons(boolean enable) {
- mNextButtonEnabled = enable;
- mNextButton.setEnabled(enable);
- }
-
- /**
- * Implements AccountServerBaseFragment.Callback
- *
- * If the checked settings are OK, proceed to options screen. If the user rejects security,
- * exit this screen. For all other errors, remain here for editing.
- */
- public void onCheckSettingsComplete(int result, int setupMode) {
- switch (result) {
- case AccountCheckSettingsFragment.CHECK_SETTINGS_OK:
- AccountSetupOptions.actionOptions(this);
- finish();
- break;
- case AccountCheckSettingsFragment.CHECK_SETTINGS_SECURITY_USER_DENY:
- finish();
- break;
- default:
- case AccountCheckSettingsFragment.CHECK_SETTINGS_SERVER_ERROR:
- // Do nothing - remain in this screen
- break;
- }
- }
-}
diff --git a/src/com/android/email/activity/setup/AccountSetupExchangeFragment.java b/src/com/android/email/activity/setup/AccountSetupExchangeFragment.java
deleted file mode 100644
index 1ff5bee73..000000000
--- a/src/com/android/email/activity/setup/AccountSetupExchangeFragment.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.activity.setup;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
-import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.EditText;
-import android.widget.TextView;
-
-import com.android.email.Email;
-import com.android.email.R;
-import com.android.email.activity.UiUtilities;
-import com.android.email.provider.AccountBackupRestore;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email.view.CertificateSelector;
-import com.android.email.view.CertificateSelector.HostCallback;
-import com.android.emailcommon.Device;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.utility.CertificateRequestor;
-import com.android.emailcommon.utility.Utility;
-
-import java.io.IOException;
-
-/**
- * Provides generic setup for Exchange accounts.
- *
- * This fragment is used by AccountSetupExchange (for creating accounts) and by AccountSettingsXL
- * (for editing existing accounts).
- */
-public class AccountSetupExchangeFragment extends AccountServerBaseFragment
- implements OnCheckedChangeListener, HostCallback {
-
- private static final int CERTIFICATE_REQUEST = 0;
- private final static String STATE_KEY_CREDENTIAL = "AccountSetupExchangeFragment.credential";
- private final static String STATE_KEY_LOADED = "AccountSetupExchangeFragment.loaded";
-
- private EditText mUsernameView;
- private EditText mPasswordView;
- private EditText mServerView;
- private CheckBox mSslSecurityView;
- private CheckBox mTrustCertificatesView;
- private CertificateSelector mClientCertificateSelector;
-
- // Support for lifecycle
- private boolean mStarted;
- /* package */ boolean mLoaded;
- private String mCacheLoginCredential;
-
- /**
- * Called to do initial creation of a fragment. This is called after
- * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupExchangeFragment onCreate");
- }
- super.onCreate(savedInstanceState);
-
- if (savedInstanceState != null) {
- mCacheLoginCredential = savedInstanceState.getString(STATE_KEY_CREDENTIAL);
- mLoaded = savedInstanceState.getBoolean(STATE_KEY_LOADED, false);
- }
- mBaseScheme = HostAuth.SCHEME_EAS;
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupExchangeFragment onCreateView");
- }
- int layoutId = mSettingsMode
- ? R.layout.account_settings_exchange_fragment
- : R.layout.account_setup_exchange_fragment;
-
- View view = inflater.inflate(layoutId, container, false);
- final Context context = getActivity();
-
- mUsernameView = UiUtilities.getView(view, R.id.account_username);
- mPasswordView = UiUtilities.getView(view, R.id.account_password);
- mServerView = UiUtilities.getView(view, R.id.account_server);
- mSslSecurityView = UiUtilities.getView(view, R.id.account_ssl);
- mSslSecurityView.setOnCheckedChangeListener(this);
- mTrustCertificatesView = UiUtilities.getView(view, R.id.account_trust_certificates);
- mClientCertificateSelector = UiUtilities.getView(view, R.id.client_certificate_selector);
-
- // Calls validateFields() which enables or disables the Next button
- // based on the fields' validity.
- TextWatcher validationTextWatcher = new TextWatcher() {
- public void afterTextChanged(Editable s) {
- validateFields();
- }
-
- public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
- public void onTextChanged(CharSequence s, int start, int before, int count) { }
- };
- // We're editing an existing account; don't allow modification of the user name
- if (mSettingsMode) {
- makeTextViewUneditable(mUsernameView,
- getString(R.string.account_setup_username_uneditable_error));
- }
- mUsernameView.addTextChangedListener(validationTextWatcher);
- mPasswordView.addTextChangedListener(validationTextWatcher);
- mServerView.addTextChangedListener(validationTextWatcher);
-
- EditText lastView = mServerView;
- lastView.setOnEditorActionListener(mDismissImeOnDoneListener);
-
- String deviceId = "";
- try {
- deviceId = Device.getDeviceId(context);
- } catch (IOException e) {
- // Not required
- }
- ((TextView) UiUtilities.getView(view, R.id.device_id)).setText(deviceId);
-
- // Additional setup only used while in "settings" mode
- onCreateViewSettingsMode(view);
-
- return view;
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupExchangeFragment onActivityCreated");
- }
- super.onActivityCreated(savedInstanceState);
- mClientCertificateSelector.setHostActivity(this);
- }
-
- /**
- * Called when the Fragment is visible to the user.
- */
- @Override
- public void onStart() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupExchangeFragment onStart");
- }
- super.onStart();
- mStarted = true;
- loadSettings(SetupData.getAccount());
- }
-
- /**
- * Called when the fragment is visible to the user and actively running.
- */
- @Override
- public void onResume() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupExchangeFragment onResume");
- }
- super.onResume();
- validateFields();
- }
-
- @Override
- public void onPause() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupExchangeFragment onPause");
- }
- super.onPause();
- }
-
- /**
- * Called when the Fragment is no longer started.
- */
- @Override
- public void onStop() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupExchangeFragment onStop");
- }
- super.onStop();
- mStarted = false;
- }
-
- /**
- * Called when the fragment is no longer in use.
- */
- @Override
- public void onDestroy() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupExchangeFragment onDestroy");
- }
- super.onDestroy();
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(Logging.LOG_TAG, "AccountSetupExchangeFragment onSaveInstanceState");
- }
- super.onSaveInstanceState(outState);
-
- outState.putString(STATE_KEY_CREDENTIAL, mCacheLoginCredential);
- outState.putBoolean(STATE_KEY_LOADED, mLoaded);
- }
-
- /**
- * Activity provides callbacks here. This also triggers loading and setting up the UX
- */
- @Override
- public void setCallback(Callback callback) {
- super.setCallback(callback);
- if (mStarted) {
- loadSettings(SetupData.getAccount());
- }
- }
-
- /**
- * Force the given account settings to be loaded using {@link #loadSettings(Account)}.
- *
- * @return true if the loaded values pass validation
- */
- private boolean forceLoadSettings(Account account) {
- mLoaded = false;
- return loadSettings(account);
- }
-
- /**
- * Load the given account settings into the UI and then ensure the settings are valid.
- * As an optimization, if the settings have already been loaded, the UI will not be
- * updated, but, the account fields will still be validated.
- *
- * @return true if the loaded values pass validation
- */
- /*package*/ boolean loadSettings(Account account) {
- if (mLoaded) return validateFields();
-
- HostAuth hostAuth = account.mHostAuthRecv;
-
- String userName = hostAuth.mLogin;
- if (userName != null) {
- // Add a backslash to the start of the username, but only if the username has no
- // backslash in it.
- if (userName.indexOf('\\') < 0) {
- userName = "\\" + userName;
- }
- mUsernameView.setText(userName);
- }
-
- if (hostAuth.mPassword != null) {
- mPasswordView.setText(hostAuth.mPassword);
- // Since username is uneditable, focus on the next editable field
- if (mSettingsMode) {
- mPasswordView.requestFocus();
- }
- }
-
- String protocol = hostAuth.mProtocol;
- if (protocol == null || !protocol.startsWith("eas")) {
- throw new Error("Unknown account type: " + protocol);
- }
-
- if (hostAuth.mAddress != null) {
- mServerView.setText(hostAuth.mAddress);
- }
-
- boolean ssl = 0 != (hostAuth.mFlags & HostAuth.FLAG_SSL);
- boolean trustCertificates = 0 != (hostAuth.mFlags & HostAuth.FLAG_TRUST_ALL);
- mSslSecurityView.setChecked(ssl);
- mTrustCertificatesView.setChecked(trustCertificates);
- if (hostAuth.mClientCertAlias != null) {
- mClientCertificateSelector.setCertificate(hostAuth.mClientCertAlias);
- }
- onUseSslChanged(ssl);
-
- mLoadedRecvAuth = hostAuth;
- mLoaded = true;
- return validateFields();
- }
-
- private boolean usernameFieldValid(EditText usernameView) {
- return Utility.isTextViewNotEmpty(usernameView) &&
- !usernameView.getText().toString().equals("\\");
- }
-
- /**
- * Check the values in the fields and decide if it makes sense to enable the "next" button
- * @return true if all fields are valid, false if any fields are incomplete
- */
- private boolean validateFields() {
- if (!mLoaded) return false;
- boolean enabled = usernameFieldValid(mUsernameView)
- && Utility.isTextViewNotEmpty(mPasswordView)
- && Utility.isServerNameValid(mServerView);
- enableNextButton(enabled);
-
- // Warn (but don't prevent) if password has leading/trailing spaces
- AccountSettingsUtils.checkPasswordSpaces(mContext, mPasswordView);
-
- return enabled;
- }
-
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- if (buttonView.getId() == R.id.account_ssl) {
- onUseSslChanged(isChecked);
- }
- }
-
- public void onUseSslChanged(boolean useSsl) {
- int mode = useSsl ? View.VISIBLE : View.GONE;
- mTrustCertificatesView.setVisibility(mode);
- UiUtilities.setVisibilitySafe(getView(), R.id.account_trust_certificates_divider, mode);
- mClientCertificateSelector.setVisibility(mode);
- UiUtilities.setVisibilitySafe(getView(), R.id.client_certificate_divider, mode);
- }
-
- @Override
- public void onCheckSettingsComplete(final int result) {
- if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_CLIENT_CERTIFICATE_NEEDED) {
- mSslSecurityView.setChecked(true);
- onCertificateRequested();
- return;
- }
- super.onCheckSettingsComplete(result);
- }
-
-
- /**
- * Entry point from Activity after editing settings and verifying them. Must be FLOW_MODE_EDIT.
- * Blocking - do not call from UI Thread.
- */
- @Override
- public void saveSettingsAfterEdit() {
- Account account = SetupData.getAccount();
- account.mHostAuthRecv.update(mContext, account.mHostAuthRecv.toContentValues());
- account.mHostAuthSend.update(mContext, account.mHostAuthSend.toContentValues());
- // For EAS, notify ExchangeService that the password has changed
- try {
- EmailServiceUtils.getExchangeService(mContext, null).hostChanged(account.mId);
- } catch (RemoteException e) {
- // Nothing to be done if this fails
- }
- // Update the backup (side copy) of the accounts
- AccountBackupRestore.backup(mContext);
- }
-
- /**
- * Entry point from Activity after entering new settings and verifying them. For setup mode.
- */
- @Override
- public void saveSettingsAfterSetup() {
- }
-
- /**
- * Entry point from Activity after entering new settings and verifying them. For setup mode.
- */
- public boolean setHostAuthFromAutodiscover(HostAuth newHostAuth) {
- Account account = SetupData.getAccount();
- account.mHostAuthSend = newHostAuth;
- account.mHostAuthRecv = newHostAuth;
- // Auto discovery may have changed the auth settings; force load them
- return forceLoadSettings(account);
- }
-
- /**
- * Implements AccountCheckSettingsFragment.Callbacks
- */
- @Override
- public void onAutoDiscoverComplete(int result, HostAuth hostAuth) {
- AccountSetupExchange activity = (AccountSetupExchange) getActivity();
- activity.onAutoDiscoverComplete(result, hostAuth);
- }
-
- /**
- * Entry point from Activity, when "next" button is clicked
- */
- @Override
- public void onNext() {
- Account account = SetupData.getAccount();
-
- String userName = mUsernameView.getText().toString().trim();
- if (userName.startsWith("\\")) {
- userName = userName.substring(1);
- }
- mCacheLoginCredential = userName;
- String userPassword = mPasswordView.getText().toString();
-
- int flags = 0;
- if (mSslSecurityView.isChecked()) {
- flags |= HostAuth.FLAG_SSL;
- }
- if (mTrustCertificatesView.isChecked()) {
- flags |= HostAuth.FLAG_TRUST_ALL;
- }
- String certAlias = mClientCertificateSelector.getCertificate();
- String serverAddress = mServerView.getText().toString().trim();
-
- int port = mSslSecurityView.isChecked() ? 443 : 80;
- HostAuth sendAuth = account.getOrCreateHostAuthSend(mContext);
- sendAuth.setLogin(userName, userPassword);
- sendAuth.setConnection(mBaseScheme, serverAddress, port, flags, certAlias);
- sendAuth.mDomain = null;
-
- HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext);
- recvAuth.setLogin(userName, userPassword);
- recvAuth.setConnection(mBaseScheme, serverAddress, port, flags, certAlias);
- recvAuth.mDomain = null;
-
- // Check for a duplicate account (requires async DB work) and if OK, proceed with check
- startDuplicateTaskCheck(account.mId, serverAddress, mCacheLoginCredential,
- SetupData.CHECK_INCOMING);
- }
-
- @Override
- public void onCertificateRequested() {
- Intent intent = new Intent(CertificateRequestor.ACTION_REQUEST_CERT);
- intent.setData(Uri.parse("eas://com.android.emailcommon/certrequest"));
- startActivityForResult(intent, CERTIFICATE_REQUEST);
- }
-
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == CERTIFICATE_REQUEST && resultCode == Activity.RESULT_OK) {
- String certAlias = data.getStringExtra(CertificateRequestor.RESULT_ALIAS);
- if (certAlias != null) {
- mClientCertificateSelector.setCertificate(certAlias);
- }
- }
- }
-
-}
diff --git a/src/com/android/email/activity/setup/AccountSetupIncoming.java b/src/com/android/email/activity/setup/AccountSetupIncoming.java
index ba5a256ca..d17e4ceed 100644
--- a/src/com/android/email/activity/setup/AccountSetupIncoming.java
+++ b/src/com/android/email/activity/setup/AccountSetupIncoming.java
@@ -16,11 +16,6 @@
package com.android.email.activity.setup;
-import com.android.email.R;
-import com.android.email.activity.ActivityHelper;
-import com.android.email.activity.UiUtilities;
-import com.android.emailcommon.provider.Account;
-
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.Intent;
@@ -29,6 +24,14 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
+import com.android.email.R;
+import com.android.email.activity.ActivityHelper;
+import com.android.email.activity.UiUtilities;
+import com.android.email.service.EmailServiceUtils;
+import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
+import com.android.emailcommon.provider.Account;
+import com.android.emailcommon.provider.HostAuth;
+
/**
* Provides setup flow for IMAP/POP accounts.
*
@@ -38,9 +41,15 @@ import android.widget.Button;
public class AccountSetupIncoming extends AccountSetupActivity
implements AccountSetupIncomingFragment.Callback, OnClickListener {
- /* package */ AccountSetupIncomingFragment mFragment;
+ /* package */ AccountServerBaseFragment mFragment;
private Button mNextButton;
/* package */ boolean mNextButtonEnabled;
+ private boolean mStartedAutoDiscovery;
+ private EmailServiceInfo mServiceInfo;
+
+ // Keys for savedInstanceState
+ private final static String STATE_STARTED_AUTODISCOVERY =
+ "AccountSetupExchange.StartedAutoDiscovery";
public static void actionIncomingSettings(Activity fromActivity, int mode, Account account) {
SetupData.setFlowMode(mode);
@@ -52,9 +61,12 @@ public class AccountSetupIncoming extends AccountSetupActivity
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityHelper.debugSetWindowFlags(this);
- setContentView(R.layout.account_setup_incoming);
- mFragment = (AccountSetupIncomingFragment)
+ HostAuth hostAuth = SetupData.getAccount().mHostAuthRecv;
+ mServiceInfo = EmailServiceUtils.getServiceInfo(this, hostAuth.mProtocol);
+
+ setContentView(R.layout.account_setup_incoming);
+ mFragment = (AccountServerBaseFragment)
getFragmentManager().findFragmentById(R.id.setup_fragment);
// Configure fragment
@@ -63,6 +75,17 @@ public class AccountSetupIncoming extends AccountSetupActivity
mNextButton = (Button) UiUtilities.getView(this, R.id.next);
mNextButton.setOnClickListener(this);
UiUtilities.getView(this, R.id.previous).setOnClickListener(this);
+
+ // One-shot to launch autodiscovery at the entry to this activity (but not if it restarts)
+ if (mServiceInfo.usesAutodiscover) {
+ mStartedAutoDiscovery = false;
+ if (savedInstanceState != null) {
+ mStartedAutoDiscovery = savedInstanceState.getBoolean(STATE_STARTED_AUTODISCOVERY);
+ }
+ if (!mStartedAutoDiscovery) {
+ startAutoDiscover();
+ }
+ }
}
/**
@@ -80,6 +103,62 @@ public class AccountSetupIncoming extends AccountSetupActivity
}
}
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putBoolean(STATE_STARTED_AUTODISCOVERY, mStartedAutoDiscovery);
+ }
+
+ /**
+ * If the conditions are right, launch the autodiscover fragment. If it succeeds (even
+ * partially) it will prefill the setup fields and we can proceed as if the user entered them.
+ *
+ * Conditions for skipping:
+ * Editing existing account
+ * AutoDiscover blocked (used for unit testing only)
+ * Username or password not entered yet
+ */
+ private void startAutoDiscover() {
+ // Note that we've started autodiscovery - even if we decide not to do it,
+ // this prevents repeating.
+ mStartedAutoDiscovery = true;
+
+ if (!SetupData.isAllowAutodiscover()) {
+ return;
+ }
+
+ Account account = SetupData.getAccount();
+ // If we've got a username and password and we're NOT editing, try autodiscover
+ String username = account.mHostAuthRecv.mLogin;
+ String password = account.mHostAuthRecv.mPassword;
+ if (username != null && password != null) {
+ onProceedNext(SetupData.CHECK_AUTODISCOVER, mFragment);
+ }
+ }
+
+ /**
+ * Implements AccountCheckSettingsFragment.Callbacks
+ *
+ * @param result configuration data returned by AD server, or null if no data available
+ */
+ public void onAutoDiscoverComplete(int result, HostAuth hostAuth) {
+ // If authentication failed, exit immediately (to re-enter credentials)
+ if (result == AccountCheckSettingsFragment.AUTODISCOVER_AUTHENTICATION) {
+ finish();
+ return;
+ }
+
+ // If data was returned, populate the account & populate the UI fields and validate it
+ if (result == AccountCheckSettingsFragment.AUTODISCOVER_OK) {
+ boolean valid = mFragment.setHostAuthFromAutodiscover(hostAuth);
+ if (valid) {
+ // "click" next to launch server verification
+ mFragment.onNext();
+ }
+ }
+ // Otherwise, proceed into this activity for manual setup
+ }
+
/**
* Implements AccountServerBaseFragment.Callback
*
@@ -109,9 +188,13 @@ public class AccountSetupIncoming extends AccountSetupActivity
*/
public void onCheckSettingsComplete(int result, int setupMode) {
if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
- AccountSetupOutgoing.actionOutgoingSettings(this, SetupData.getFlowMode(),
- SetupData.getAccount());
- finish();
+ if (mServiceInfo.usesSmtp) {
+ AccountSetupOutgoing.actionOutgoingSettings(this, SetupData.getFlowMode(),
+ SetupData.getAccount());
+ } else {
+ AccountSetupOptions.actionOptions(this);
+ finish();
+ }
}
}
}
diff --git a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java
index efd63e367..c91163481 100644
--- a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java
+++ b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java
@@ -18,6 +18,8 @@ package com.android.email.activity.setup;
import android.app.Activity;
import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
@@ -34,32 +36,37 @@ import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
-import com.android.email.Email;
import com.android.email.R;
import com.android.email.activity.UiUtilities;
import com.android.email.provider.AccountBackupRestore;
+import com.android.email.service.EmailServiceUtils;
+import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
+import com.android.email.view.CertificateSelector;
+import com.android.email.view.CertificateSelector.HostCallback;
+import com.android.email2.ui.MailActivityEmail;
+import com.android.emailcommon.Device;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.HostAuth;
+import com.android.emailcommon.utility.CertificateRequestor;
import com.android.emailcommon.utility.Utility;
+import java.io.IOException;
+import java.util.ArrayList;
+
/**
* Provides UI for IMAP/POP account settings.
*
* This fragment is used by AccountSetupIncoming (for creating accounts) and by AccountSettingsXL
* (for editing existing accounts).
*/
-public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
+public class AccountSetupIncomingFragment extends AccountServerBaseFragment
+ implements HostCallback {
+ private static final int CERTIFICATE_REQUEST = 0;
private final static String STATE_KEY_CREDENTIAL = "AccountSetupIncomingFragment.credential";
private final static String STATE_KEY_LOADED = "AccountSetupIncomingFragment.loaded";
- private static final int POP3_PORT_NORMAL = 110;
- private static final int POP3_PORT_SSL = 995;
-
- private static final int IMAP_PORT_NORMAL = 143;
- private static final int IMAP_PORT_SSL = 993;
-
private EditText mUsernameView;
private EditText mPasswordView;
private TextView mServerLabelView;
@@ -69,15 +76,18 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
private TextView mDeletePolicyLabelView;
private Spinner mDeletePolicyView;
private View mImapPathPrefixSectionView;
+ private View mDeviceIdSectionView;
private EditText mImapPathPrefixView;
+ private CertificateSelector mClientCertificateSelector;
// Delete policy as loaded from the device
private int mLoadedDeletePolicy;
// Support for lifecycle
private boolean mStarted;
- private boolean mConfigured;
private boolean mLoaded;
private String mCacheLoginCredential;
+ private HostAuth mRecvAuth;
+ private EmailServiceInfo mServiceInfo;
/**
* Called to do initial creation of a fragment. This is called after
@@ -85,7 +95,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
*/
@Override
public void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onCreate");
}
super.onCreate(savedInstanceState);
@@ -99,7 +109,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onCreateView");
}
int layoutId = mSettingsMode
@@ -109,6 +119,9 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
View view = inflater.inflate(layoutId, container, false);
Context context = getActivity();
+ mRecvAuth = SetupData.getAccount().mHostAuthRecv;
+ mServiceInfo = EmailServiceUtils.getServiceInfo(mContext, mRecvAuth.mProtocol);
+
mUsernameView = (EditText) UiUtilities.getView(view, R.id.account_username);
mPasswordView = (EditText) UiUtilities.getView(view, R.id.account_password);
mServerLabelView = (TextView) UiUtilities.getView(view, R.id.account_server_label);
@@ -119,39 +132,51 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
R.id.account_delete_policy_label);
mDeletePolicyView = (Spinner) UiUtilities.getView(view, R.id.account_delete_policy);
mImapPathPrefixSectionView = UiUtilities.getView(view, R.id.imap_path_prefix_section);
+ mDeviceIdSectionView = UiUtilities.getView(view, R.id.device_id_section);
mImapPathPrefixView = (EditText) UiUtilities.getView(view, R.id.imap_path_prefix);
-
- // Set up spinners
- SpinnerOption securityTypes[] = {
- new SpinnerOption(HostAuth.FLAG_NONE, context.getString(
- R.string.account_setup_incoming_security_none_label)),
- new SpinnerOption(HostAuth.FLAG_SSL, context.getString(
- R.string.account_setup_incoming_security_ssl_label)),
- new SpinnerOption(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, context.getString(
- R.string.account_setup_incoming_security_ssl_trust_certificates_label)),
- new SpinnerOption(HostAuth.FLAG_TLS, context.getString(
- R.string.account_setup_incoming_security_tls_label)),
- new SpinnerOption(HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL, context.getString(
- R.string.account_setup_incoming_security_tls_trust_certificates_label)),
- };
-
- SpinnerOption deletePolicies[] = {
- new SpinnerOption(Account.DELETE_POLICY_NEVER,
- context.getString(R.string.account_setup_incoming_delete_policy_never_label)),
- new SpinnerOption(Account.DELETE_POLICY_ON_DELETE,
- context.getString(R.string.account_setup_incoming_delete_policy_delete_label)),
- };
-
- ArrayAdapter<SpinnerOption> securityTypesAdapter = new ArrayAdapter<SpinnerOption>(context,
- android.R.layout.simple_spinner_item, securityTypes);
+ mClientCertificateSelector = UiUtilities.getView(view, R.id.client_certificate_selector);
+
+ // Set up security type spinner
+ ArrayList<SpinnerOption> securityTypes = new ArrayList<SpinnerOption>();
+ securityTypes.add(
+ new SpinnerOption(HostAuth.FLAG_NONE, context.getString(
+ R.string.account_setup_incoming_security_none_label)));
+ securityTypes.add(
+ new SpinnerOption(HostAuth.FLAG_SSL, context.getString(
+ R.string.account_setup_incoming_security_ssl_label)));
+ securityTypes.add(
+ new SpinnerOption(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, context.getString(
+ R.string.account_setup_incoming_security_ssl_trust_certificates_label)));
+ if (mServiceInfo.offerTls) {
+ securityTypes.add(
+ new SpinnerOption(HostAuth.FLAG_TLS, context.getString(
+ R.string.account_setup_incoming_security_tls_label)));
+ securityTypes.add(
+ new SpinnerOption(HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL,
+ context.getString(
+ R.string.account_setup_incoming_security_tls_trust_certificates_label)));
+ }
+ ArrayAdapter<SpinnerOption> securityTypesAdapter = new ArrayAdapter<SpinnerOption>(
+ context, android.R.layout.simple_spinner_item, securityTypes);
securityTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSecurityTypeView.setAdapter(securityTypesAdapter);
- ArrayAdapter<SpinnerOption> deletePoliciesAdapter = new ArrayAdapter<SpinnerOption>(context,
- android.R.layout.simple_spinner_item, deletePolicies);
- deletePoliciesAdapter.setDropDownViewResource(
- android.R.layout.simple_spinner_dropdown_item);
- mDeletePolicyView.setAdapter(deletePoliciesAdapter);
+ if (mServiceInfo.offerLocalDeletes) {
+ SpinnerOption deletePolicies[] = {
+ new SpinnerOption(Account.DELETE_POLICY_NEVER,
+ context.getString(
+ R.string.account_setup_incoming_delete_policy_never_label)),
+ new SpinnerOption(Account.DELETE_POLICY_ON_DELETE,
+ context.getString(
+ R.string.account_setup_incoming_delete_policy_delete_label)),
+ };
+ ArrayAdapter<SpinnerOption> deletePoliciesAdapter =
+ new ArrayAdapter<SpinnerOption>(context,
+ android.R.layout.simple_spinner_item, deletePolicies);
+ deletePoliciesAdapter.setDropDownViewResource(
+ android.R.layout.simple_spinner_dropdown_item);
+ mDeletePolicyView.setAdapter(deletePoliciesAdapter);
+ }
// Updates the port when the user changes the security type. This allows
// us to show a reasonable default which the user can change.
@@ -193,10 +218,11 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onActivityCreated");
}
super.onActivityCreated(savedInstanceState);
+ mClientCertificateSelector.setHostActivity(this);
}
/**
@@ -204,7 +230,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
*/
@Override
public void onStart() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onStart");
}
super.onStart();
@@ -218,7 +244,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
*/
@Override
public void onResume() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onResume");
}
super.onResume();
@@ -227,7 +253,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
@Override
public void onPause() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onPause");
}
super.onPause();
@@ -238,7 +264,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
*/
@Override
public void onStop() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onStop");
}
super.onStop();
@@ -250,7 +276,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
*/
@Override
public void onDestroy() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onDestroy");
}
super.onDestroy();
@@ -258,7 +284,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
@Override
public void onSaveInstanceState(Bundle outState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onSaveInstanceState");
}
super.onSaveInstanceState(outState);
@@ -283,31 +309,25 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
* Configure the editor for the account type
*/
private void configureEditor() {
- if (mConfigured) return;
Account account = SetupData.getAccount();
if (account == null) {
return;
}
TextView lastView = mImapPathPrefixView;
mBaseScheme = account.mHostAuthRecv.mProtocol;
- if (HostAuth.SCHEME_POP3.equals(mBaseScheme)) {
- mServerLabelView.setText(R.string.account_setup_incoming_pop_server_label);
- mServerView.setContentDescription(
- getResources().getString(R.string.account_setup_incoming_pop_server_label));
+ mServerLabelView.setText(R.string.account_setup_incoming_server_label);
+ mServerView.setContentDescription(getResources().getText(
+ R.string.account_setup_incoming_server_label));
+ if (!mServiceInfo.offerPrefix) {
mImapPathPrefixSectionView.setVisibility(View.GONE);
lastView = mPortView;
- } else if (HostAuth.SCHEME_IMAP.equals(mBaseScheme)) {
- mServerLabelView.setText(R.string.account_setup_incoming_imap_server_label);
- mServerView.setContentDescription(
- getResources().getString(R.string.account_setup_incoming_imap_server_label));
+ }
+ if (!mServiceInfo.offerLocalDeletes) {
mDeletePolicyLabelView.setVisibility(View.GONE);
mDeletePolicyView.setVisibility(View.GONE);
mPortView.setImeOptions(EditorInfo.IME_ACTION_NEXT);
- } else {
- throw new Error("Unknown account type: " + account);
}
lastView.setOnEditorActionListener(mDismissImeOnDoneListener);
- mConfigured = true;
}
/**
@@ -321,6 +341,12 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
String username = recvAuth.mLogin;
if (username != null) {
+ //*** For eas?
+ // Add a backslash to the start of the username, but only if the username has no
+ // backslash in it.
+ //if (userName.indexOf('\\') < 0) {
+ // userName = "\\" + userName;
+ //}
mUsernameView.setText(username);
}
String password = recvAuth.mPassword;
@@ -332,14 +358,11 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
}
}
- if (HostAuth.SCHEME_IMAP.equals(recvAuth.mProtocol)) {
+ if (mServiceInfo.offerPrefix) {
String prefix = recvAuth.mDomain;
if (prefix != null && prefix.length() > 0) {
mImapPathPrefixView.setText(prefix.substring(1));
}
- } else if (!HostAuth.SCHEME_POP3.equals(recvAuth.mProtocol)) {
- // Account must either be IMAP or POP3
- throw new Error("Unknown account type: " + recvAuth.mProtocol);
}
// The delete policy is set for all legacy accounts. For POP3 accounts, the user sets
@@ -350,6 +373,9 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
int flags = recvAuth.mFlags;
flags &= ~HostAuth.FLAG_AUTHENTICATE;
+ if (mServiceInfo.defaultSsl) {
+ flags |= HostAuth.FLAG_SSL;
+ }
SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, flags);
String hostname = recvAuth.mAddress;
@@ -373,7 +399,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
* Check the values in the fields and decide if it makes sense to enable the "next" button
*/
private void validateFields() {
- if (!mConfigured || !mLoaded) return;
+ if (!mLoaded) return;
boolean enabled = Utility.isTextViewNotEmpty(mUsernameView)
&& Utility.isTextViewNotEmpty(mPasswordView)
&& Utility.isServerNameValid(mServerView)
@@ -387,19 +413,39 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
AccountSettingsUtils.checkPasswordSpaces(mContext, mPasswordView);
}
- private int getPortFromSecurityType() {
+ private int getPortFromSecurityType(boolean useSsl) {
+ EmailServiceInfo info = EmailServiceUtils.getServiceInfo(mContext,
+ SetupData.getAccount().mHostAuthRecv.mProtocol);
+ return useSsl ? info.portSsl : info.port;
+ }
+
+ private boolean getSslSelected() {
int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
- boolean useSsl = ((securityType & HostAuth.FLAG_SSL) != 0);
- int port = useSsl ? IMAP_PORT_SSL : IMAP_PORT_NORMAL; // default to IMAP
- if (HostAuth.SCHEME_POP3.equals(mBaseScheme)) {
- port = useSsl ? POP3_PORT_SSL : POP3_PORT_NORMAL;
+ return ((securityType & HostAuth.FLAG_SSL) != 0);
+ }
+
+ public void onUseSslChanged(boolean useSsl) {
+ if (mServiceInfo.offerCerts) {
+ int mode = useSsl ? View.VISIBLE : View.GONE;
+ mClientCertificateSelector.setVisibility(mode);
+ String deviceId = "";
+ try {
+ deviceId = Device.getDeviceId(mContext);
+ } catch (IOException e) {
+ // Not required
+ }
+ ((TextView) UiUtilities.getView(getView(), R.id.device_id)).setText(deviceId);
+
+ mDeviceIdSectionView.setVisibility(mode);
+ //UiUtilities.setVisibilitySafe(getView(), R.id.client_certificate_divider, mode);
}
- return port;
}
private void updatePortFromSecurityType() {
- int port = getPortFromSecurityType();
+ boolean sslSelected = getSslSelected();
+ int port = getPortFromSecurityType(sslSelected);
mPortView.setText(Integer.toString(port));
+ onUseSslChanged(sslSelected);
}
/**
@@ -429,7 +475,8 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
// Set the username and password for the outgoing settings to the username and
// password the user just set for incoming. Use the verified host address to try and
// pick a smarter outgoing address.
- String hostName = AccountSettingsUtils.inferServerName(recvAuth.mAddress, null, "smtp");
+ String hostName =
+ AccountSettingsUtils.inferServerName(mContext, recvAuth.mAddress, null, "smtp");
sendAuth.setLogin(recvAuth.mLogin, recvAuth.mPassword);
sendAuth.setConnection(sendAuth.mProtocol, hostName, sendAuth.mPort, sendAuth.mFlags);
}
@@ -458,12 +505,12 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
try {
serverPort = Integer.parseInt(mPortView.getText().toString().trim());
} catch (NumberFormatException e) {
- serverPort = getPortFromSecurityType();
+ serverPort = getPortFromSecurityType(getSslSelected());
Log.d(Logging.LOG_TAG, "Non-integer server port; using '" + serverPort + "'");
}
int securityType = (Integer) ((SpinnerOption) mSecurityTypeView.getSelectedItem()).value;
recvAuth.setConnection(mBaseScheme, serverAddress, serverPort, securityType);
- if (HostAuth.SCHEME_IMAP.equals(recvAuth.mProtocol)) {
+ if (mServiceInfo.offerPrefix) {
String prefix = mImapPathPrefixView.getText().toString().trim();
recvAuth.mDomain = TextUtils.isEmpty(prefix) ? null : ("/" + prefix);
} else {
@@ -489,4 +536,30 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment {
return deletePolicyChanged || super.haveSettingsChanged();
}
+
+ /**
+ * Implements AccountCheckSettingsFragment.Callbacks
+ */
+ @Override
+ public void onAutoDiscoverComplete(int result, HostAuth hostAuth) {
+ AccountSetupIncoming activity = (AccountSetupIncoming) getActivity();
+ activity.onAutoDiscoverComplete(result, hostAuth);
+ }
+
+ @Override
+ public void onCertificateRequested() {
+ Intent intent = new Intent(CertificateRequestor.ACTION_REQUEST_CERT);
+ intent.setData(Uri.parse("eas://com.android.emailcommon/certrequest"));
+ startActivityForResult(intent, CERTIFICATE_REQUEST);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == CERTIFICATE_REQUEST && resultCode == Activity.RESULT_OK) {
+ String certAlias = data.getStringExtra(CertificateRequestor.RESULT_ALIAS);
+ if (certAlias != null) {
+ mClientCertificateSelector.setCertificate(certAlias);
+ }
+ }
+ }
}
diff --git a/src/com/android/email/activity/setup/AccountSetupNames.java b/src/com/android/email/activity/setup/AccountSetupNames.java
index 94d043b2f..29f45a9b1 100644
--- a/src/com/android/email/activity/setup/AccountSetupNames.java
+++ b/src/com/android/email/activity/setup/AccountSetupNames.java
@@ -37,11 +37,11 @@ import android.widget.EditText;
import com.android.email.R;
import com.android.email.activity.ActivityHelper;
import com.android.email.activity.UiUtilities;
-import com.android.email.activity.Welcome;
import com.android.email.provider.AccountBackupRestore;
+import com.android.email.service.EmailServiceUtils;
+import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent.AccountColumns;
-import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.utility.EmailAsyncTask;
import com.android.emailcommon.utility.Utility;
@@ -56,10 +56,10 @@ public class AccountSetupNames extends AccountSetupActivity implements OnClickLi
private EditText mDescription;
private EditText mName;
private Button mNextButton;
- private boolean mEasAccount = false;
+ private boolean mRequiresName = true;
public static void actionSetNames(Activity fromActivity) {
- fromActivity.startActivity(new Intent(fromActivity, AccountSetupNames.class));
+ fromActivity.startActivity(new ForwardingIntent(fromActivity, AccountSetupNames.class));
}
@Override
@@ -109,8 +109,10 @@ public class AccountSetupNames extends AccountSetupActivity implements OnClickLi
}
// Remember whether we're an EAS account, since it doesn't require the user name field
- mEasAccount = HostAuth.SCHEME_EAS.equals(account.mHostAuthRecv.mProtocol);
- if (mEasAccount) {
+ EmailServiceInfo info =
+ EmailServiceUtils.getServiceInfo(this, account.mHostAuthRecv.mProtocol);
+ if (!info.usesSmtp) {
+ mRequiresName = false;
mName.setVisibility(View.GONE);
accountNameLabel.setVisibility(View.GONE);
} else {
@@ -167,7 +169,7 @@ public class AccountSetupNames extends AccountSetupActivity implements OnClickLi
private void validateFields() {
boolean enableNextButton = true;
// Validation is based only on the "user name" field, not shown for EAS accounts
- if (!mEasAccount) {
+ if (mRequiresName) {
String userName = mName.getText().toString().trim();
if (TextUtils.isEmpty(userName)) {
enableNextButton = false;
@@ -190,7 +192,9 @@ public class AccountSetupNames extends AccountSetupActivity implements OnClickLi
}
private void finishActivity() {
- if (SetupData.getFlowMode() != SetupData.FLOW_MODE_NORMAL) {
+ if (SetupData.getFlowMode() == SetupData.FLOW_MODE_NO_ACCOUNTS) {
+ AccountSetupBasics.actionAccountCreateFinishedWithResult(this);
+ } else if (SetupData.getFlowMode() != SetupData.FLOW_MODE_NORMAL) {
AccountSetupBasics.actionAccountCreateFinishedAccountFlow(this);
} else {
Account account = SetupData.getAccount();
@@ -199,7 +203,8 @@ public class AccountSetupNames extends AccountSetupActivity implements OnClickLi
} else {
// Safety check here; If mAccount is null (due to external issues or bugs)
// just rewind back to Welcome, which can handle any configuration of accounts
- Welcome.actionStart(this);
+ //***
+ //Welcome.actionStart(this);
}
}
finish();
diff --git a/src/com/android/email/activity/setup/AccountSetupOptions.java b/src/com/android/email/activity/setup/AccountSetupOptions.java
index 1a246c9f5..7bd5ea2fe 100644
--- a/src/com/android/email/activity/setup/AccountSetupOptions.java
+++ b/src/com/android/email/activity/setup/AccountSetupOptions.java
@@ -35,12 +35,13 @@ import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.Spinner;
-import com.android.email.Email;
import com.android.email.R;
import com.android.email.activity.ActivityHelper;
import com.android.email.activity.UiUtilities;
import com.android.email.service.EmailServiceUtils;
+import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
import com.android.email.service.MailService;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.HostAuth;
@@ -50,9 +51,6 @@ import com.android.emailcommon.utility.Utility;
import java.io.IOException;
-/**
- * TODO: Cleanup the manipulation of Account.FLAGS_INCOMPLETE and make sure it's never left set.
- */
public class AccountSetupOptions extends AccountSetupActivity implements OnClickListener {
private Spinner mCheckFrequencyView;
@@ -65,6 +63,7 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
private CheckBox mBackgroundAttachmentsView;
private View mAccountSyncWindowRow;
private boolean mDonePressed = false;
+ private EmailServiceInfo mServiceInfo;
public static final int REQUEST_CODE_ACCEPT_POLICIES = 1;
@@ -72,7 +71,7 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
private static final int SYNC_WINDOW_EAS_DEFAULT = SyncWindow.SYNC_WINDOW_AUTO;
public static void actionOptions(Activity fromActivity) {
- fromActivity.startActivity(new Intent(fromActivity, AccountSetupOptions.class));
+ fromActivity.startActivity(new ForwardingIntent(fromActivity, AccountSetupOptions.class));
}
@Override
@@ -96,37 +95,26 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
UiUtilities.getView(this, R.id.next).setOnClickListener(this);
mAccountSyncWindowRow = UiUtilities.getView(this, R.id.account_sync_window_row);
- // Generate spinner entries using XML arrays used by the preferences
- int frequencyValuesId;
- int frequencyEntriesId;
Account account = SetupData.getAccount();
- String protocol = account.mHostAuthRecv.mProtocol;
- boolean eas = HostAuth.SCHEME_EAS.equals(protocol);
- if (eas) {
- frequencyValuesId = R.array.account_settings_check_frequency_values_push;
- frequencyEntriesId = R.array.account_settings_check_frequency_entries_push;
- } else {
- frequencyValuesId = R.array.account_settings_check_frequency_values;
- frequencyEntriesId = R.array.account_settings_check_frequency_entries;
- }
- CharSequence[] frequencyValues = getResources().getTextArray(frequencyValuesId);
- CharSequence[] frequencyEntries = getResources().getTextArray(frequencyEntriesId);
+ mServiceInfo = EmailServiceUtils.getServiceInfo(getApplicationContext(),
+ account.mHostAuthRecv.mProtocol);
+ CharSequence[] frequencyValues = mServiceInfo.syncIntervals;
+ CharSequence[] frequencyEntries = mServiceInfo.syncIntervalStrings;
- // Now create the array used by the Spinner
+ // Now create the array used by the sync interval Spinner
SpinnerOption[] checkFrequencies = new SpinnerOption[frequencyEntries.length];
for (int i = 0; i < frequencyEntries.length; i++) {
checkFrequencies[i] = new SpinnerOption(
Integer.valueOf(frequencyValues[i].toString()), frequencyEntries[i].toString());
}
-
ArrayAdapter<SpinnerOption> checkFrequenciesAdapter = new ArrayAdapter<SpinnerOption>(this,
android.R.layout.simple_spinner_item, checkFrequencies);
checkFrequenciesAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mCheckFrequencyView.setAdapter(checkFrequenciesAdapter);
- if (eas) {
- enableEASSyncWindowSpinner();
+ if (mServiceInfo.offerLookback) {
+ enableLookbackSpinner();
}
// Note: It is OK to use mAccount.mIsDefault here *only* because the account
@@ -138,20 +126,18 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
(account.getFlags() & Account.FLAGS_NOTIFY_NEW_MAIL) != 0);
SpinnerOption.setSpinnerOptionValue(mCheckFrequencyView, account.getSyncInterval());
- // Setup any additional items to support EAS & EAS flow mode
- if (eas) {
- // "also sync contacts" == "true"
+ if (mServiceInfo.syncContacts) {
mSyncContactsView.setVisibility(View.VISIBLE);
mSyncContactsView.setChecked(true);
+ UiUtilities.setVisibilitySafe(this, R.id.account_sync_contacts_divider, View.VISIBLE);
+ }
+ if (mServiceInfo.syncCalendar) {
mSyncCalendarView.setVisibility(View.VISIBLE);
mSyncCalendarView.setChecked(true);
- // Show the associated dividers
- UiUtilities.setVisibilitySafe(this, R.id.account_sync_contacts_divider, View.VISIBLE);
UiUtilities.setVisibilitySafe(this, R.id.account_sync_calendar_divider, View.VISIBLE);
}
- // If we are in POP3, hide the "Background Attachments" mode
- if (HostAuth.SCHEME_POP3.equals(protocol)) {
+ if (!mServiceInfo.offerAttachmentPreload) {
mBackgroundAttachmentsView.setVisibility(View.GONE);
UiUtilities.setVisibilitySafe(this, R.id.account_background_attachments_divider,
View.GONE);
@@ -204,6 +190,7 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
* the account to the database (making it real for the first time.)
* Finally, we call setupAccountManagerAccount(), which will eventually complete via callback.
*/
+ @SuppressWarnings("deprecation")
private void onDone() {
final Account account = SetupData.getAccount();
if (account.isSaved()) {
@@ -236,18 +223,19 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
// Finish setting up the account, and commit it to the database
// Set the incomplete flag here to avoid reconciliation issues in ExchangeService
account.mFlags |= Account.FLAGS_INCOMPLETE;
- boolean calendar = false;
+ if (SetupData.getPolicy() != null) {
+ account.mFlags |= Account.FLAGS_SECURITY_HOLD;
+ account.mPolicy = SetupData.getPolicy();
+ }
boolean contacts = false;
- boolean email = mSyncEmailView.isChecked();
- if (account.mHostAuthRecv.mProtocol.equals("eas")) {
- if (SetupData.getPolicy() != null) {
- account.mFlags |= Account.FLAGS_SECURITY_HOLD;
- account.mPolicy = SetupData.getPolicy();
- }
- // Get flags for contacts/calendar sync
+ if (mServiceInfo.syncContacts) {
contacts = mSyncContactsView.isChecked();
+ }
+ boolean calendar = false;
+ if (mServiceInfo.syncCalendar) {
calendar = mSyncCalendarView.isChecked();
}
+ boolean email = mSyncEmailView.isChecked();
// Finally, write the completed account (for the first time) and then
// install it into the Account manager as well. These are done off-thread.
@@ -271,11 +259,13 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
* This is called at the completion of MailService.setupAccountManagerAccount()
*/
AccountManagerCallback<Bundle> mAccountManagerCallback = new AccountManagerCallback<Bundle>() {
+ @Override
public void run(AccountManagerFuture<Bundle> future) {
try {
Bundle bundle = future.getResult();
bundle.keySet();
AccountSetupOptions.this.runOnUiThread(new Runnable() {
+ @Override
public void run() {
optionsComplete();
}
@@ -298,6 +288,7 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
*/
private void showErrorDialog(final int msgResId, final Object... args) {
runOnUiThread(new Runnable() {
+ @Override
public void run() {
new AlertDialog.Builder(AccountSetupOptions.this)
.setIconAttribute(android.R.attr.alertDialogIcon)
@@ -307,6 +298,7 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
.setPositiveButton(
getString(R.string.account_setup_failed_dlg_edit_details_action),
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
@@ -358,6 +350,7 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
* Enable exchange services
* Move to final setup screen
*/
+ @SuppressWarnings("deprecation")
private void saveAccountAndFinish() {
Utility.runAsync(new Runnable() {
@Override
@@ -368,8 +361,8 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
account.mFlags &= ~Account.FLAGS_SECURITY_HOLD;
AccountSettingsUtils.commitSettings(context, account);
// Start up services based on new account(s)
- Email.setServicesEnabledSync(context);
- EmailServiceUtils.startExchangeService(context);
+ MailActivityEmail.setServicesEnabledSync(context);
+ EmailServiceUtils.startService(context, account.mHostAuthRecv.mProtocol);
// Move to final setup screen
AccountSetupNames.actionSetNames(context);
finish();
@@ -380,7 +373,7 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
/**
* Enable an additional spinner using the arrays normally handled by preferences
*/
- private void enableEASSyncWindowSpinner() {
+ private void enableLookbackSpinner() {
// Show everything
mAccountSyncWindowRow.setVisibility(View.VISIBLE);
diff --git a/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java b/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java
index b903932e6..7564dcf7a 100644
--- a/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java
+++ b/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java
@@ -34,10 +34,10 @@ import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.Spinner;
-import com.android.email.Email;
import com.android.email.R;
import com.android.email.activity.UiUtilities;
import com.android.email.provider.AccountBackupRestore;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.HostAuth;
@@ -74,7 +74,7 @@ public class AccountSetupOutgoingFragment extends AccountServerBaseFragment
*/
@Override
public void onCreate(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onCreate");
}
super.onCreate(savedInstanceState);
@@ -82,13 +82,13 @@ public class AccountSetupOutgoingFragment extends AccountServerBaseFragment
if (savedInstanceState != null) {
mLoaded = savedInstanceState.getBoolean(STATE_KEY_LOADED, false);
}
- mBaseScheme = HostAuth.SCHEME_SMTP;
+ mBaseScheme = HostAuth.LEGACY_SCHEME_SMTP;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onCreateView");
}
int layoutId = mSettingsMode
@@ -160,7 +160,7 @@ public class AccountSetupOutgoingFragment extends AccountServerBaseFragment
@Override
public void onActivityCreated(Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onActivityCreated");
}
super.onActivityCreated(savedInstanceState);
@@ -171,7 +171,7 @@ public class AccountSetupOutgoingFragment extends AccountServerBaseFragment
*/
@Override
public void onStart() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onStart");
}
super.onStart();
@@ -184,7 +184,7 @@ public class AccountSetupOutgoingFragment extends AccountServerBaseFragment
*/
@Override
public void onResume() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onResume");
}
super.onResume();
@@ -193,7 +193,7 @@ public class AccountSetupOutgoingFragment extends AccountServerBaseFragment
@Override
public void onPause() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onPause");
}
super.onPause();
@@ -204,7 +204,7 @@ public class AccountSetupOutgoingFragment extends AccountServerBaseFragment
*/
@Override
public void onStop() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onStop");
}
super.onStop();
@@ -216,7 +216,7 @@ public class AccountSetupOutgoingFragment extends AccountServerBaseFragment
*/
@Override
public void onDestroy() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onDestroy");
}
super.onDestroy();
@@ -224,7 +224,7 @@ public class AccountSetupOutgoingFragment extends AccountServerBaseFragment
@Override
public void onSaveInstanceState(Bundle outState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onSaveInstanceState");
}
super.onSaveInstanceState(outState);
diff --git a/src/com/android/email/activity/setup/DebugFragment.java b/src/com/android/email/activity/setup/DebugFragment.java
index f7cd8d31c..48dd99818 100644
--- a/src/com/android/email/activity/setup/DebugFragment.java
+++ b/src/com/android/email/activity/setup/DebugFragment.java
@@ -16,14 +16,6 @@
package com.android.email.activity.setup;
-import com.android.email.Email;
-import com.android.email.Preferences;
-import com.android.email.R;
-import com.android.email.activity.UiUtilities;
-import com.android.email.service.EmailServiceUtils;
-import com.android.email.service.MailService;
-import com.android.emailcommon.Logging;
-
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
@@ -35,16 +27,20 @@ import android.webkit.WebView;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.TextView;
+
+import com.android.email.Preferences;
+import com.android.email.R;
+import com.android.email.activity.UiUtilities;
+import com.android.email.service.EmailServiceUtils;
+import com.android.email2.ui.MailActivityEmail;
+import com.android.emailcommon.Logging;
public class DebugFragment extends Fragment implements OnCheckedChangeListener,
View.OnClickListener {
- private TextView mVersionView;
private CheckBox mEnableDebugLoggingView;
- private CheckBox mEnableExchangeLoggingView;
- private CheckBox mEnableExchangeFileLoggingView;
+ private CheckBox mEnableVerboseLoggingView;
+ private CheckBox mEnableFileLoggingView;
private CheckBox mInhibitGraphicsAccelerationView;
- private CheckBox mForceOneMinuteRefreshView;
private CheckBox mEnableStrictModeView;
private Preferences mPreferences;
@@ -52,7 +48,7 @@ public class DebugFragment extends Fragment implements OnCheckedChangeListener,
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
+ if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "AccountSetupBasicsFragment onCreateView");
}
View view = inflater.inflate(R.layout.debug, container, false);
@@ -60,43 +56,34 @@ public class DebugFragment extends Fragment implements OnCheckedChangeListener,
Context context = getActivity();
mPreferences = Preferences.getPreferences(context);
- mVersionView = (TextView) UiUtilities.getView(view, R.id.version);
- mVersionView.setText(String.format(context.getString(R.string.debug_version_fmt).toString(),
- context.getString(R.string.build_number)));
-
mEnableDebugLoggingView = (CheckBox) UiUtilities.getView(view, R.id.debug_logging);
- mEnableDebugLoggingView.setChecked(Email.DEBUG);
+ mEnableDebugLoggingView.setChecked(MailActivityEmail.DEBUG);
- mEnableExchangeLoggingView = (CheckBox) UiUtilities.getView(view, R.id.exchange_logging);
- mEnableExchangeFileLoggingView =
- (CheckBox) UiUtilities.getView(view, R.id.exchange_file_logging);
+ mEnableVerboseLoggingView = (CheckBox) UiUtilities.getView(view, R.id.verbose_logging);
+ mEnableFileLoggingView =
+ (CheckBox) UiUtilities.getView(view, R.id.file_logging);
// Note: To prevent recursion while presetting checkboxes, assign all listeners last
mEnableDebugLoggingView.setOnCheckedChangeListener(this);
- boolean exchangeAvailable = EmailServiceUtils.isExchangeAvailable(context);
- if (exchangeAvailable) {
- mEnableExchangeLoggingView.setChecked(Email.DEBUG_EXCHANGE_VERBOSE);
- mEnableExchangeFileLoggingView.setChecked(Email.DEBUG_EXCHANGE_FILE);
- mEnableExchangeLoggingView.setOnCheckedChangeListener(this);
- mEnableExchangeFileLoggingView.setOnCheckedChangeListener(this);
+ if (EmailServiceUtils.areRemoteServicesInstalled(context)) {
+ mEnableVerboseLoggingView.setChecked(MailActivityEmail.DEBUG_VERBOSE);
+ mEnableFileLoggingView.setChecked(MailActivityEmail.DEBUG_FILE);
+ mEnableVerboseLoggingView.setOnCheckedChangeListener(this);
+ mEnableFileLoggingView.setOnCheckedChangeListener(this);
} else {
- mEnableExchangeLoggingView.setVisibility(View.GONE);
- mEnableExchangeFileLoggingView.setVisibility(View.GONE);
+ mEnableVerboseLoggingView.setVisibility(View.GONE);
+ mEnableFileLoggingView.setVisibility(View.GONE);
}
UiUtilities.getView(view, R.id.clear_webview_cache).setOnClickListener(this);
mInhibitGraphicsAccelerationView = (CheckBox)
UiUtilities.getView(view, R.id.debug_disable_graphics_acceleration);
- mInhibitGraphicsAccelerationView.setChecked(Email.sDebugInhibitGraphicsAcceleration);
+ mInhibitGraphicsAccelerationView.setChecked(
+ MailActivityEmail.sDebugInhibitGraphicsAcceleration);
mInhibitGraphicsAccelerationView.setOnCheckedChangeListener(this);
- mForceOneMinuteRefreshView = (CheckBox)
- UiUtilities.getView(view, R.id.debug_force_one_minute_refresh);
- mForceOneMinuteRefreshView.setChecked(mPreferences.getForceOneMinuteRefresh());
- mForceOneMinuteRefreshView.setOnCheckedChangeListener(this);
-
mEnableStrictModeView = (CheckBox)
UiUtilities.getView(view, R.id.debug_enable_strict_mode);
mEnableStrictModeView.setChecked(mPreferences.getEnableStrictMode());
@@ -110,32 +97,28 @@ public class DebugFragment extends Fragment implements OnCheckedChangeListener,
switch (buttonView.getId()) {
case R.id.debug_logging:
mPreferences.setEnableDebugLogging(isChecked);
- Email.DEBUG = isChecked;
- Email.DEBUG_EXCHANGE = isChecked;
+ MailActivityEmail.DEBUG = isChecked;
+ MailActivityEmail.DEBUG_EXCHANGE = isChecked;
break;
- case R.id.exchange_logging:
+ case R.id.verbose_logging:
mPreferences.setEnableExchangeLogging(isChecked);
- Email.DEBUG_EXCHANGE_VERBOSE = isChecked;
+ MailActivityEmail.DEBUG_VERBOSE = isChecked;
break;
- case R.id.exchange_file_logging:
+ case R.id.file_logging:
mPreferences.setEnableExchangeFileLogging(isChecked);
- Email.DEBUG_EXCHANGE_FILE = isChecked;
+ MailActivityEmail.DEBUG_FILE = isChecked;
break;
case R.id.debug_disable_graphics_acceleration:
- Email.sDebugInhibitGraphicsAcceleration = isChecked;
+ MailActivityEmail.sDebugInhibitGraphicsAcceleration = isChecked;
mPreferences.setInhibitGraphicsAcceleration(isChecked);
break;
- case R.id.debug_force_one_minute_refresh:
- mPreferences.setForceOneMinuteRefresh(isChecked);
- MailService.actionReschedule(getActivity());
- break;
case R.id.debug_enable_strict_mode:
mPreferences.setEnableStrictMode(isChecked);
- Email.enableStrictMode(isChecked);
+ MailActivityEmail.enableStrictMode(isChecked);
break;
}
- Email.updateLoggingFlags(getActivity());
+ MailActivityEmail.updateLoggingFlags(getActivity());
}
@Override
diff --git a/src/com/android/email/activity/setup/EditQuickResponseDialog.java b/src/com/android/email/activity/setup/EditQuickResponseDialog.java
index 1a3031429..e3ef21cfb 100644
--- a/src/com/android/email/activity/setup/EditQuickResponseDialog.java
+++ b/src/com/android/email/activity/setup/EditQuickResponseDialog.java
@@ -30,6 +30,8 @@ import android.content.DialogInterface;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
+import android.view.LayoutInflater;
+import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
@@ -71,8 +73,9 @@ public class EditQuickResponseDialog extends DialogFragment
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Context context = getActivity();
mQuickResponse = (QuickResponse) getArguments().getParcelable(QUICK_RESPONSE);
-
- mQuickResponseEditText = new EditText(context);
+ View wrapper = LayoutInflater.from(context)
+ .inflate(R.layout.quick_response_edit_dialog, null);
+ mQuickResponseEditText = (EditText) wrapper.findViewById(R.id.quick_response_text);
if (savedInstanceState != null) {
String quickResponseSavedString =
savedInstanceState.getString(QUICK_RESPONSE_EDITED_STRING);
@@ -87,7 +90,7 @@ public class EditQuickResponseDialog extends DialogFragment
final AlertDialog.Builder b = new AlertDialog.Builder(context);
b.setTitle(getResources().getString(R.string.edit_quick_response_dialog))
- .setView(mQuickResponseEditText)
+ .setView(wrapper)
.setNegativeButton(R.string.cancel_action, this)
.setPositiveButton(R.string.save_action, this);
mDialog = b.create();
diff --git a/src/com/android/email/activity/setup/GeneralPreferences.java b/src/com/android/email/activity/setup/GeneralPreferences.java
index b7c1cee11..0418ea57a 100644
--- a/src/com/android/email/activity/setup/GeneralPreferences.java
+++ b/src/com/android/email/activity/setup/GeneralPreferences.java
@@ -16,31 +16,45 @@
package com.android.email.activity.setup;
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.database.Cursor;
import android.os.Bundle;
+import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
-import android.preference.PreferenceCategory;
import android.preference.Preference.OnPreferenceChangeListener;
-import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
import android.widget.Toast;
import com.android.email.Preferences;
import com.android.email.R;
-import com.android.email.activity.UiUtilities;
+import com.android.email.provider.EmailProvider;
+import com.android.emailcommon.provider.Account;
-public class GeneralPreferences extends PreferenceFragment implements OnPreferenceChangeListener {
-
- private static final String PREFERENCE_CATEGORY_KEY = "category_general_preferences";
+public class GeneralPreferences extends EmailPreferenceFragment implements
+ OnPreferenceChangeListener {
private static final String PREFERENCE_KEY_AUTO_ADVANCE = "auto_advance";
private static final String PREFERENCE_KEY_TEXT_ZOOM = "text_zoom";
- private static final String PREFERENCE_KEY_REPLY_ALL = Preferences.REPLY_ALL;
+ private static final String PREFERENCE_KEY_CONFIRM_DELETE = "confirm_delete";
+ private static final String PREFERENCE_KEY_CONFIRM_SEND = "confirm_send";
+ private static final String PREFERENCE_KEY_HIDE_CHECKBOXES = "hide_checkboxes";
private static final String PREFERENCE_KEY_CLEAR_TRUSTED_SENDERS = "clear_trusted_senders";
private Preferences mPreferences;
private ListPreference mAutoAdvance;
+ /**
+ * TODO: remove this when we've decided for certain that an app setting is unnecessary
+ * (b/5287963)
+ */
+ @Deprecated
private ListPreference mTextZoom;
+ private CheckBoxPreference mConfirmDelete;
+ private CheckBoxPreference mConfirmSend;
+ private CheckBoxPreference mHideCheckboxes;
+
+ private boolean mSettingsChanged = false;
CharSequence[] mSizeSummaries;
@@ -53,23 +67,42 @@ public class GeneralPreferences extends PreferenceFragment implements OnPreferen
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.general_preferences);
- if (UiUtilities.useTwoPane(getActivity())) {
- // "Reply All" should only be shown on phones
- PreferenceCategory pc = (PreferenceCategory) findPreference(PREFERENCE_CATEGORY_KEY);
- pc.removePreference(findPreference(PREFERENCE_KEY_REPLY_ALL));
- }
+ // Merely hide app pref for font size until we're sure it's unnecessary (b/5287963)
+ getPreferenceScreen().removePreference(findPreference(PREFERENCE_KEY_TEXT_ZOOM));
}
@Override
public void onResume() {
loadSettings();
+ mSettingsChanged = false;
super.onResume();
}
@Override
+ public void onPause() {
+ super.onPause();
+ if (mSettingsChanged) {
+ // Notify all account settings listeners
+ ContentResolver resolver = getActivity().getContentResolver();
+ Cursor c = resolver.query(Account.CONTENT_URI, Account.ID_PROJECTION, null, null, null);
+ if (c != null) {
+ try {
+ while (c.moveToNext()) {
+ resolver.notifyChange(ContentUris.withAppendedId(
+ EmailProvider.UIPROVIDER_SETTINGS_NOTIFIER, c.getLong(0)), null);
+ }
+ } finally {
+ c.close();
+ }
+ }
+ }
+ }
+
+ @Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
-
+ // Indicate we need to send notifications to UI
+ mSettingsChanged = true;
if (PREFERENCE_KEY_AUTO_ADVANCE.equals(key)) {
mPreferences.setAutoAdvanceDirection(mAutoAdvance.findIndexOfValue((String) newValue));
return true;
@@ -87,15 +120,23 @@ public class GeneralPreferences extends PreferenceFragment implements OnPreferen
// Guard against monkeys.
return false;
}
-
+ mSettingsChanged = true;
String key = preference.getKey();
if (key.equals(PREFERENCE_KEY_CLEAR_TRUSTED_SENDERS)) {
mPreferences.clearTrustedSenders();
Toast.makeText(
getActivity(), R.string.trusted_senders_cleared, Toast.LENGTH_SHORT).show();
return true;
+ } else if (PREFERENCE_KEY_CONFIRM_DELETE.equals(key)) {
+ mPreferences.setConfirmDelete(mConfirmDelete.isChecked());
+ return true;
+ } else if (PREFERENCE_KEY_CONFIRM_SEND.equals(key)) {
+ mPreferences.setConfirmSend(mConfirmSend.isChecked());
+ return true;
+ } else if (PREFERENCE_KEY_HIDE_CHECKBOXES.equals(key)) {
+ mPreferences.setHideCheckboxes(mHideCheckboxes.isChecked());
+ return true;
}
-
return false;
}
@@ -106,8 +147,14 @@ public class GeneralPreferences extends PreferenceFragment implements OnPreferen
mAutoAdvance.setOnPreferenceChangeListener(this);
mTextZoom = (ListPreference) findPreference(PREFERENCE_KEY_TEXT_ZOOM);
- mTextZoom.setValueIndex(mPreferences.getTextZoom());
- mTextZoom.setOnPreferenceChangeListener(this);
+ if (mTextZoom != null) {
+ mTextZoom.setValueIndex(mPreferences.getTextZoom());
+ mTextZoom.setOnPreferenceChangeListener(this);
+ }
+
+ mConfirmDelete = (CheckBoxPreference) findPreference(PREFERENCE_KEY_CONFIRM_DELETE);
+ mConfirmSend = (CheckBoxPreference) findPreference(PREFERENCE_KEY_CONFIRM_SEND);
+ mHideCheckboxes = (CheckBoxPreference) findPreference(PREFERENCE_KEY_HIDE_CHECKBOXES);
reloadDynamicSummaries();
}
@@ -116,16 +163,18 @@ public class GeneralPreferences extends PreferenceFragment implements OnPreferen
* Reload any preference summaries that are updated dynamically
*/
private void reloadDynamicSummaries() {
- int textZoomIndex = mPreferences.getTextZoom();
- // Update summary - but only load the array once
- if (mSizeSummaries == null) {
- mSizeSummaries = getActivity().getResources()
- .getTextArray(R.array.general_preference_text_zoom_summary_array);
- }
- CharSequence summary = null;
- if (textZoomIndex >= 0 && textZoomIndex < mSizeSummaries.length) {
- summary = mSizeSummaries[textZoomIndex];
+ if (mTextZoom != null) {
+ int textZoomIndex = mPreferences.getTextZoom();
+ // Update summary - but only load the array once
+ if (mSizeSummaries == null) {
+ mSizeSummaries = getActivity().getResources()
+ .getTextArray(R.array.general_preference_text_zoom_summary_array);
+ }
+ CharSequence summary = null;
+ if (textZoomIndex >= 0 && textZoomIndex < mSizeSummaries.length) {
+ summary = mSizeSummaries[textZoomIndex];
+ }
+ mTextZoom.setSummary(summary);
}
- mTextZoom.setSummary(summary);
}
}
diff --git a/src/com/android/email/activity/setup/MailboxSettings.java b/src/com/android/email/activity/setup/MailboxSettings.java
index ca17436f9..e76951c4f 100644
--- a/src/com/android/email/activity/setup/MailboxSettings.java
+++ b/src/com/android/email/activity/setup/MailboxSettings.java
@@ -32,16 +32,14 @@ import android.preference.PreferenceActivity;
import android.util.Log;
import android.view.MenuItem;
-import com.android.email.Email;
-import com.android.email.FolderProperties;
import com.android.email.R;
-import com.android.email.RefreshManager;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.Policy;
import com.android.emailcommon.provider.EmailContent.AccountColumns;
import com.android.emailcommon.provider.EmailContent.MailboxColumns;
import com.android.emailcommon.provider.Mailbox;
+import com.android.emailcommon.provider.Policy;
import com.android.emailcommon.utility.EmailAsyncTask;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
@@ -225,7 +223,7 @@ public class MailboxSettings extends PreferenceActivity {
// Update the title with the mailbox name.
ActionBar actionBar = getActionBar();
- String mailboxName = FolderProperties.getInstance(this).getDisplayName(mMailbox);
+ String mailboxName = mMailbox.mDisplayName;
if (actionBar != null) {
actionBar.setTitle(mailboxName);
actionBar.setSubtitle(getString(R.string.mailbox_settings_activity_title));
@@ -293,7 +291,7 @@ public class MailboxSettings extends PreferenceActivity {
return false;
}
mNeedsSave = true;
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.i(Logging.LOG_TAG, "Setting changed");
}
// In order to set the current entry to the summary, we need to udpate the value
@@ -311,7 +309,7 @@ public class MailboxSettings extends PreferenceActivity {
private void updateObjects() {
final int syncInterval = Integer.valueOf(mSyncIntervalPref.getValue());
final int syncLookback = Integer.valueOf(mSyncLookbackPref.getValue());
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.i(Logging.LOG_TAG, "Updating object: " + syncInterval + "," + syncLookback);
}
if (mMailbox.mType == Mailbox.TYPE_INBOX) {
@@ -369,8 +367,9 @@ public class MailboxSettings extends PreferenceActivity {
@Override
protected void onSuccess(Void result) {
// must be called on the ui thread
- RefreshManager.getInstance(context).refreshMessageList(account.mId, mailbox.mId,
- true);
+ //***
+ //RefreshManager.getInstance(context).refreshMessageList(account.mId, mailbox.mId,
+ // true);
}
}.executeSerial((Void [])null);
}
diff --git a/src/com/android/email/activity/setup/SetupData.java b/src/com/android/email/activity/setup/SetupData.java
index dcc907dad..6ffaf73f1 100644
--- a/src/com/android/email/activity/setup/SetupData.java
+++ b/src/com/android/email/activity/setup/SetupData.java
@@ -16,14 +16,14 @@
package com.android.email.activity.setup;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.Policy;
-
import android.accounts.AccountAuthenticatorResponse;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
+import com.android.emailcommon.provider.Account;
+import com.android.emailcommon.provider.Policy;
+
public class SetupData implements Parcelable {
// The "extra" name for the Bundle saved with SetupData
public static final String EXTRA_SETUP_DATA = "com.android.email.setupdata";
@@ -32,14 +32,15 @@ public class SetupData implements Parcelable {
// Settings -> Accounts
public static final int FLOW_MODE_UNSPECIFIED = -1;
public static final int FLOW_MODE_NORMAL = 0;
- public static final int FLOW_MODE_ACCOUNT_MANAGER_EAS = 1;
- public static final int FLOW_MODE_ACCOUNT_MANAGER_POP_IMAP = 2;
+ public static final int FLOW_MODE_ACCOUNT_MANAGER = 1;
public static final int FLOW_MODE_EDIT = 3;
public static final int FLOW_MODE_FORCE_CREATE = 4;
// The following two modes are used to "pop the stack" and return from the setup flow. We
// either return to the caller (if we're in an account type flow) or go to the message list
public static final int FLOW_MODE_RETURN_TO_CALLER = 5;
public static final int FLOW_MODE_RETURN_TO_MESSAGE_LIST = 6;
+ public static final int FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT = 7;
+ public static final int FLOW_MODE_NO_ACCOUNTS = 8;
// For debug logging
private static final String[] FLOW_MODES = {"normal", "eas", "pop/imap", "edit", "force",
@@ -52,6 +53,7 @@ public class SetupData implements Parcelable {
// All access will be through getters/setters
private int mFlowMode = FLOW_MODE_NORMAL;
+ private String mFlowAccountType;
private Account mAccount;
private String mUsername;
private String mPassword;
@@ -81,6 +83,10 @@ public class SetupData implements Parcelable {
return getInstance().mFlowMode;
}
+ static public String getFlowAccountType() {
+ return getInstance().mFlowAccountType;
+ }
+
static public void setFlowMode(int mFlowMode) {
getInstance().mFlowMode = mFlowMode;
}
@@ -171,6 +177,13 @@ public class SetupData implements Parcelable {
data.mFlowMode = flowMode;
}
+ public static void init(int flowMode, String accountType) {
+ SetupData data = getInstance();
+ data.commonInit();
+ data.mFlowMode = flowMode;
+ data.mFlowAccountType = accountType;
+ }
+
public static void init(int flowMode, Account account) {
SetupData data = getInstance();
data.commonInit();
@@ -191,21 +204,25 @@ public class SetupData implements Parcelable {
}
// Parcelable methods
+ @Override
public int describeContents() {
return 0;
}
public static final Parcelable.Creator<SetupData> CREATOR =
new Parcelable.Creator<SetupData>() {
+ @Override
public SetupData createFromParcel(Parcel in) {
return new SetupData(in);
}
+ @Override
public SetupData[] newArray(int size) {
return new SetupData[size];
}
};
+ @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mFlowMode);
dest.writeParcelable(mAccount, 0);
diff --git a/src/com/android/email/data/ThrottlingCursorLoader.java b/src/com/android/email/data/ThrottlingCursorLoader.java
deleted file mode 100644
index 0f80e4fd5..000000000
--- a/src/com/android/email/data/ThrottlingCursorLoader.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.data;
-
-import com.android.email.Throttle;
-import com.android.emailcommon.Logging;
-
-import android.content.Context;
-import android.content.CursorLoader;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Handler;
-import android.util.Log;
-
-/**
- * A {@link CursorLoader} variant that throttle auto-requery on content changes using
- * {@link Throttle}.
- */
-public class ThrottlingCursorLoader extends CursorLoader {
- private final Throttle mThrottle;
-
- /** Constructor with default timeout */
- public ThrottlingCursorLoader(Context context, Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder) {
- this(context, uri, projection, selection, selectionArgs, sortOrder,
- Throttle.DEFAULT_MIN_TIMEOUT, Throttle.DEFAULT_MAX_TIMEOUT);
- }
-
- /** Constructor that takes custom timeout */
- public ThrottlingCursorLoader(Context context, Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder, int minTimeout, int maxTimeout) {
- super(context, uri, projection, selection, selectionArgs, sortOrder);
-
- Runnable forceLoadRunnable = new Runnable() {
- @Override
- public void run() {
- callSuperOnContentChanged();
- }
- };
- mThrottle = new Throttle(uri.toString(), forceLoadRunnable, new Handler(),
- minTimeout, maxTimeout);
- }
-
- private void debugLog(String message) {
- Log.d(Logging.LOG_TAG, "ThrottlingCursorLoader: [" + getUri() + "] " + message);
- }
-
- @Override
- protected void onStartLoading() {
- if (Throttle.DEBUG) debugLog("startLoading");
- mThrottle.cancelScheduledCallback();
- super.onStartLoading();
- }
-
- @Override
- protected void onForceLoad() {
- if (Throttle.DEBUG) debugLog("forceLoad");
- mThrottle.cancelScheduledCallback();
- super.onForceLoad();
- }
-
- @Override
- protected void onStopLoading() {
- if (Throttle.DEBUG) debugLog("stopLoading");
- mThrottle.cancelScheduledCallback();
- super.onStopLoading();
- }
-
- @Override
- public void onCanceled(Cursor cursor) {
- if (Throttle.DEBUG) debugLog("onCancelled");
- mThrottle.cancelScheduledCallback();
- super.onCanceled(cursor);
- }
-
- @Override
- protected void onReset() {
- if (Throttle.DEBUG) debugLog("onReset");
- mThrottle.cancelScheduledCallback();
- super.onReset();
- }
-
- @Override
- public void onContentChanged() {
- if (Throttle.DEBUG) debugLog("onContentChanged");
-
- mThrottle.onEvent();
- }
-
- private void callSuperOnContentChanged() {
- if (Throttle.DEBUG) debugLog("callSuperOnContentChanged");
- super.onContentChanged();
- }
-}
diff --git a/src/com/android/email/mail/Store.java b/src/com/android/email/mail/Store.java
index bdf90391f..15cf4deb4 100644
--- a/src/com/android/email/mail/Store.java
+++ b/src/com/android/email/mail/Store.java
@@ -20,10 +20,10 @@ import android.content.Context;
import android.os.Bundle;
import android.util.Log;
-import com.android.email.Email;
-import com.android.email.mail.store.ExchangeStore;
import com.android.email.mail.store.ImapStore;
import com.android.email.mail.store.Pop3Store;
+import com.android.email.mail.store.ServiceStore;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
import com.android.emailcommon.mail.Folder;
import com.android.emailcommon.mail.MessagingException;
@@ -58,9 +58,8 @@ public abstract class Store {
new HashMap<String, Class<? extends Store>>();
static {
- sStoreClasses.put(HostAuth.SCHEME_EAS, ExchangeStore.class);
- sStoreClasses.put(HostAuth.SCHEME_IMAP, ImapStore.class);
- sStoreClasses.put(HostAuth.SCHEME_POP3, Pop3Store.class);
+ sStoreClasses.put(HostAuth.LEGACY_SCHEME_IMAP, ImapStore.class);
+ sStoreClasses.put(HostAuth.LEGACY_SCHEME_POP3, Pop3Store.class);
}
/**
@@ -94,6 +93,9 @@ public abstract class Store {
if (store == null) {
Context appContext = context.getApplicationContext();
Class<? extends Store> klass = sStoreClasses.get(hostAuth.mProtocol);
+ if (klass == null) {
+ klass = ServiceStore.class;
+ }
try {
// invoke "newInstance" class method
Method m = klass.getMethod("newInstance", Account.class, Context.class);
@@ -127,15 +129,6 @@ public abstract class Store {
}
/**
- * Get class of SettingActivity for this Store class.
- * @return Activity class that has class method actionEditIncomingSettings().
- */
- public Class<? extends android.app.Activity> getSettingActivityClass() {
- // default SettingActivity class
- return com.android.email.activity.setup.AccountSetupIncoming.class;
- }
-
- /**
* Some protocols require that a sent message be copied (uploaded) into the Sent folder
* while others can take care of it automatically (ideally, on the server). This function
* allows a given store to indicate which mode(s) it supports.
@@ -204,6 +197,6 @@ public abstract class Store {
//mailbox.mSyncTime;
mailbox.mType = type;
//box.mUnreadCount;
- mailbox.mVisibleLimit = Email.VISIBLE_LIMIT_DEFAULT;
+ mailbox.mVisibleLimit = MailActivityEmail.VISIBLE_LIMIT_DEFAULT;
}
}
diff --git a/src/com/android/email/mail/store/ExchangeStore.java b/src/com/android/email/mail/store/ExchangeStore.java
deleted file mode 100644
index 11a02d617..000000000
--- a/src/com/android/email/mail/store/ExchangeStore.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.mail.store;
-
-import android.content.Context;
-
-import com.android.email.mail.Store;
-import com.android.email.service.EmailServiceUtils;
-import com.android.emailcommon.mail.MessagingException;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.service.IEmailService;
-
-/**
- * Our Exchange service does not use the sender/store model.
- */
-public class ExchangeStore extends ServiceStore {
-
- /**
- * Static named constructor.
- */
- public static Store newInstance(Account account, Context context) throws MessagingException {
- return new ExchangeStore(account, context);
- }
-
- /**
- * Creates a new store for the given account.
- */
- public ExchangeStore(Account account, Context context) throws MessagingException {
- super(account, context);
- }
-
- @Override
- public Class<? extends android.app.Activity> getSettingActivityClass() {
- return com.android.email.activity.setup.AccountSetupExchange.class;
- }
-
- @Override
- protected IEmailService getService() {
- return EmailServiceUtils.getExchangeService(mContext, null);
- }
-}
diff --git a/src/com/android/email/mail/store/ImapConnection.java b/src/com/android/email/mail/store/ImapConnection.java
index 0fbf6036f..e83b9fc24 100644
--- a/src/com/android/email/mail/store/ImapConnection.java
+++ b/src/com/android/email/mail/store/ImapConnection.java
@@ -19,7 +19,6 @@ package com.android.email.mail.store;
import android.text.TextUtils;
import android.util.Log;
-import com.android.email.Email;
import com.android.email.mail.Transport;
import com.android.email.mail.store.ImapStore.ImapException;
import com.android.email.mail.store.imap.ImapConstants;
@@ -29,6 +28,7 @@ import com.android.email.mail.store.imap.ImapResponseParser;
import com.android.email.mail.store.imap.ImapUtility;
import com.android.email.mail.transport.DiscourseLogger;
import com.android.email.mail.transport.MailTransport;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
import com.android.emailcommon.mail.AuthenticationFailedException;
import com.android.emailcommon.mail.CertificateValidationException;
@@ -146,7 +146,7 @@ class ImapConnection {
mImapStore.ensurePrefixIsValid();
} catch (SSLException e) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, e.toString());
}
throw new CertificateValidationException(e.getMessage(), e);
@@ -154,7 +154,7 @@ class ImapConnection {
// NOTE: Unlike similar code in POP3, I'm going to rethrow as-is. There is a lot
// of other code here that catches IOException and I don't want to break it.
// This catch is only here to enhance logging of connection-time issues.
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, ioe.toString());
}
throw ioe;
@@ -391,7 +391,7 @@ class ImapConnection {
executeSimpleCommand(mIdPhrase);
} catch (ImapException ie) {
// Log for debugging, but this is not a fatal problem.
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, ie.toString());
}
} catch (IOException ioe) {
@@ -416,7 +416,7 @@ class ImapConnection {
responseList = executeSimpleCommand(ImapConstants.NAMESPACE);
} catch (ImapException ie) {
// Log for debugging, but this is not a fatal problem.
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, ie.toString());
}
} catch (IOException ioe) {
@@ -447,7 +447,7 @@ class ImapConnection {
// options such as SASL
executeSimpleCommand(mLoginPhrase, true);
} catch (ImapException ie) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, ie.toString());
}
throw new AuthenticationFailedException(ie.getAlertText(), ie);
@@ -471,7 +471,7 @@ class ImapConnection {
responseList = executeSimpleCommand(ImapConstants.LIST + " \"\" \"\"");
} catch (ImapException ie) {
// Log for debugging, but this is not a fatal problem.
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, ie.toString());
}
} catch (IOException ioe) {
@@ -504,7 +504,7 @@ class ImapConnection {
// Per RFC requirement (3501-6.2.1) gather new capabilities
return(queryCapabilities());
} else {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "TLS not supported but required");
}
throw new MessagingException(MessagingException.TLS_REQUIRED);
diff --git a/src/com/android/email/mail/store/ImapFolder.java b/src/com/android/email/mail/store/ImapFolder.java
index 98d25c99a..ead78d447 100644
--- a/src/com/android/email/mail/store/ImapFolder.java
+++ b/src/com/android/email/mail/store/ImapFolder.java
@@ -21,7 +21,6 @@ import android.text.TextUtils;
import android.util.Base64DataException;
import android.util.Log;
-import com.android.email.Email;
import com.android.email.mail.store.ImapStore.ImapException;
import com.android.email.mail.store.ImapStore.ImapMessage;
import com.android.email.mail.store.imap.ImapConstants;
@@ -32,6 +31,7 @@ import com.android.email.mail.store.imap.ImapString;
import com.android.email.mail.store.imap.ImapUtility;
import com.android.email.mail.transport.CountingOutputStream;
import com.android.email.mail.transport.EOLConvertingOutputStream;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
import com.android.emailcommon.internet.BinaryTempFileBody;
import com.android.emailcommon.internet.MimeBodyPart;
@@ -643,14 +643,12 @@ class ImapFolder extends Folder {
// Previously used "BODY[..." but this can be confused with "BODY[HEADER..."
// TODO Should we accept "RFC822" as well??
ImapString body = fetchList.getKeyedStringOrEmpty("BODY[]", true);
- String bodyText = body.getString();
InputStream bodyStream = body.getAsStream();
message.parse(bodyStream);
}
if (fetchPart != null && fetchPart.getSize() > 0) {
InputStream bodyStream =
fetchList.getKeyedStringOrEmpty("BODY[", true).getAsStream();
- String contentType = fetchPart.getContentType();
String contentTransferEncoding = fetchPart.getHeader(
MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING)[0];
@@ -696,7 +694,7 @@ class ImapFolder extends Folder {
}
}
} catch (Base64DataException bde) {
- String warning = "\n\n" + Email.getMessageDecodeErrorString();
+ String warning = "\n\n" + MailActivityEmail.getMessageDecodeErrorString();
out.write(warning.getBytes());
} finally {
out.close();
@@ -1110,7 +1108,7 @@ class ImapFolder extends Folder {
}
private MessagingException ioExceptionHandler(ImapConnection connection, IOException ioe) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "IO Exception detected: ", ioe);
}
connection.close();
diff --git a/src/com/android/email/mail/store/ImapStore.java b/src/com/android/email/mail/store/ImapStore.java
index c30405594..a01105d07 100644
--- a/src/com/android/email/mail/store/ImapStore.java
+++ b/src/com/android/email/mail/store/ImapStore.java
@@ -26,6 +26,7 @@ import android.util.Log;
import com.android.email.LegacyConversions;
import com.android.email.Preferences;
+import com.android.email.R;
import com.android.email.VendorPolicyLoader;
import com.android.email.mail.Store;
import com.android.email.mail.Transport;
@@ -106,7 +107,7 @@ public class ImapStore extends Store {
mAccount = account;
HostAuth recvAuth = account.getOrCreateHostAuthRecv(context);
- if (recvAuth == null || !HostAuth.SCHEME_IMAP.equalsIgnoreCase(recvAuth.mProtocol)) {
+ if (recvAuth == null || !HostAuth.LEGACY_SCHEME_IMAP.equalsIgnoreCase(recvAuth.mProtocol)) {
throw new MessagingException("Unsupported protocol");
}
// defaults, which can be changed by security modifiers
@@ -418,8 +419,9 @@ public class ImapStore extends Store {
mailboxes.put(folderName, folder);
}
}
+ String inboxName = mContext.getString(R.string.mailbox_name_display_inbox);
Folder newFolder =
- addMailbox(mContext, mAccount.mId, ImapConstants.INBOX, '\0', true /*selectable*/);
+ addMailbox(mContext, mAccount.mId, inboxName, '\0', true /*selectable*/);
mailboxes.put(ImapConstants.INBOX, (ImapFolder)newFolder);
createHierarchy(mailboxes);
saveMailboxList(mContext, mailboxes);
diff --git a/src/com/android/email/mail/store/Pop3Store.java b/src/com/android/email/mail/store/Pop3Store.java
index b3ee4207c..f78d19762 100644
--- a/src/com/android/email/mail/store/Pop3Store.java
+++ b/src/com/android/email/mail/store/Pop3Store.java
@@ -20,11 +20,11 @@ import android.content.Context;
import android.os.Bundle;
import android.util.Log;
-import com.android.email.Controller;
-import com.android.email.Email;
+import com.android.email.R;
import com.android.email.mail.Store;
import com.android.email.mail.Transport;
import com.android.email.mail.transport.MailTransport;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
import com.android.emailcommon.internet.MimeMessage;
import com.android.emailcommon.mail.AuthenticationFailedException;
@@ -100,7 +100,7 @@ public class Pop3Store extends Store {
mAccount = account;
HostAuth recvAuth = account.getOrCreateHostAuthRecv(context);
- if (recvAuth == null || !HostAuth.SCHEME_POP3.equalsIgnoreCase(recvAuth.mProtocol)) {
+ if (recvAuth == null || !HostAuth.LEGACY_SCHEME_POP3.equalsIgnoreCase(recvAuth.mProtocol)) {
throw new MessagingException("Unsupported protocol");
}
// defaults, which can be changed by security modifiers
@@ -160,8 +160,9 @@ public class Pop3Store extends Store {
@Override
public Folder[] updateFolders() {
- Mailbox mailbox = Mailbox.getMailboxForPath(mContext, mAccount.mId, POP3_MAILBOX_NAME);
- updateMailbox(mailbox, mAccount.mId, POP3_MAILBOX_NAME, '\0', true, Mailbox.TYPE_INBOX);
+ String inboxName = mContext.getString(R.string.mailbox_name_display_inbox);
+ Mailbox mailbox = Mailbox.getMailboxForPath(mContext, mAccount.mId, inboxName);
+ updateMailbox(mailbox, mAccount.mId, inboxName, '\0', true, Mailbox.TYPE_INBOX);
// Force the parent key to be "no mailbox" for the mail POP3 mailbox
mailbox.mParentKey = Mailbox.NO_MAILBOX;
if (mailbox.isSaved()) {
@@ -173,12 +174,43 @@ public class Pop3Store extends Store {
// Build default mailboxes as well, in case they're not already made.
for (int type : DEFAULT_FOLDERS) {
if (Mailbox.findMailboxOfType(mContext, mAccount.mId, type) == Mailbox.NO_MAILBOX) {
- String name = Controller.getMailboxServerName(mContext, type);
+ String name = getMailboxServerName(mContext, type);
Mailbox.newSystemMailbox(mAccount.mId, type, name).save(mContext);
}
}
- return new Folder[] { getFolder(POP3_MAILBOX_NAME) };
+ return new Folder[] { getFolder(inboxName) };
+ }
+
+
+ /**
+ * Returns the server-side name for a specific mailbox.
+ *
+ * @return the resource string corresponding to the mailbox type, empty if not found.
+ */
+ public String getMailboxServerName(Context context, int mailboxType) {
+ int resId = -1;
+ switch (mailboxType) {
+ case Mailbox.TYPE_INBOX:
+ resId = R.string.mailbox_name_server_inbox;
+ break;
+ case Mailbox.TYPE_OUTBOX:
+ resId = R.string.mailbox_name_server_outbox;
+ break;
+ case Mailbox.TYPE_DRAFTS:
+ resId = R.string.mailbox_name_server_drafts;
+ break;
+ case Mailbox.TYPE_TRASH:
+ resId = R.string.mailbox_name_server_trash;
+ break;
+ case Mailbox.TYPE_SENT:
+ resId = R.string.mailbox_name_server_sent;
+ break;
+ case Mailbox.TYPE_JUNK:
+ resId = R.string.mailbox_name_server_junk;
+ break;
+ }
+ return resId != -1 ? context.getString(resId) : "";
}
/**
@@ -256,7 +288,7 @@ public class Pop3Store extends Store {
bundle.putInt(EmailServiceProxy.VALIDATE_BUNDLE_RESULT_CODE, result);
return bundle;
}
-
+
@Override
public synchronized void open(OpenMode mode) throws MessagingException {
if (mTransport.isOpen()) {
@@ -280,7 +312,7 @@ public class Pop3Store extends Store {
executeSimpleCommand("STLS");
mTransport.reopenTls();
} else {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "TLS not supported but required");
}
throw new MessagingException(MessagingException.TLS_REQUIRED);
@@ -291,14 +323,14 @@ public class Pop3Store extends Store {
executeSensitiveCommand("USER " + mUsername, "USER /redacted/");
executeSensitiveCommand("PASS " + mPassword, "PASS /redacted/");
} catch (MessagingException me) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, me.toString());
}
throw new AuthenticationFailedException(null, me);
}
} catch (IOException ioe) {
mTransport.close();
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, ioe.toString());
}
throw new MessagingException(MessagingException.IOERROR, ioe.toString());
@@ -320,7 +352,7 @@ public class Pop3Store extends Store {
}
if (statException != null) {
mTransport.close();
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, statException.toString());
}
throw new MessagingException("POP3 STAT", statException);
@@ -391,7 +423,7 @@ public class Pop3Store extends Store {
indexMsgNums(1, mMessageCount);
} catch (IOException ioe) {
mTransport.close();
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "Unable to index during getMessage " + ioe);
}
throw new MessagingException("getMessages", ioe);
@@ -412,7 +444,7 @@ public class Pop3Store extends Store {
indexMsgNums(start, end);
} catch (IOException ioe) {
mTransport.close();
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, ioe.toString());
}
throw new MessagingException("getMessages", ioe);
@@ -656,7 +688,7 @@ public class Pop3Store extends Store {
}
} catch (IOException ioe) {
mTransport.close();
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, ioe.toString());
}
throw new MessagingException("fetch", ioe);
@@ -691,7 +723,7 @@ public class Pop3Store extends Store {
}
} catch (IOException ioe) {
mTransport.close();
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, ioe.toString());
}
throw new MessagingException("Unable to fetch message", ioe);
@@ -798,7 +830,7 @@ public class Pop3Store extends Store {
if (response != null) {
try {
InputStream in = mTransport.getInputStream();
- if (DEBUG_LOG_RAW_STREAM && Email.DEBUG) {
+ if (DEBUG_LOG_RAW_STREAM && MailActivityEmail.DEBUG) {
in = new LoggingInputStream(in);
}
message.parse(new Pop3ResponseInputStream(in));
@@ -852,7 +884,7 @@ public class Pop3Store extends Store {
}
catch (IOException ioe) {
mTransport.close();
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, ioe.toString());
}
throw new MessagingException("setFlags()", ioe);
diff --git a/src/com/android/email/mail/store/ServiceStore.java b/src/com/android/email/mail/store/ServiceStore.java
index 10d44b0c6..9b9ecf705 100644
--- a/src/com/android/email/mail/store/ServiceStore.java
+++ b/src/com/android/email/mail/store/ServiceStore.java
@@ -21,6 +21,7 @@ import android.os.Bundle;
import android.os.RemoteException;
import com.android.email.mail.Store;
+import com.android.email.service.EmailServiceUtils;
import com.android.emailcommon.mail.MessagingException;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.HostAuth;
@@ -30,11 +31,9 @@ import com.android.emailcommon.service.IEmailService;
/**
* Base class for service-based stores
*/
-public abstract class ServiceStore extends Store {
+public class ServiceStore extends Store {
protected final HostAuth mHostAuth;
- protected abstract IEmailService getService();
-
/**
* Creates a new store for the given account.
*/
@@ -43,6 +42,17 @@ public abstract class ServiceStore extends Store {
mHostAuth = account.getOrCreateHostAuthRecv(mContext);
}
+ /**
+ * Static named constructor.
+ */
+ public static Store newInstance(Account account, Context context) throws MessagingException {
+ return new ServiceStore(account, context);
+ }
+
+ private IEmailService getService() {
+ return EmailServiceUtils.getService(mContext, null, mHostAuth.mProtocol);
+ }
+
@Override
public Bundle checkSettings() throws MessagingException {
/**
diff --git a/src/com/android/email/mail/store/imap/ImapResponseParser.java b/src/com/android/email/mail/store/imap/ImapResponseParser.java
index 6b68c0003..078cf9f76 100644
--- a/src/com/android/email/mail/store/imap/ImapResponseParser.java
+++ b/src/com/android/email/mail/store/imap/ImapResponseParser.java
@@ -16,17 +16,17 @@
package com.android.email.mail.store.imap;
-import com.android.email.Email;
+import android.text.TextUtils;
+import android.util.Log;
+
import com.android.email.FixedLengthInputStream;
import com.android.email.PeekableInputStream;
import com.android.email.mail.transport.DiscourseLogger;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
import com.android.emailcommon.mail.MessagingException;
import com.android.emailcommon.utility.LoggingInputStream;
-import android.text.TextUtils;
-import android.util.Log;
-
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
@@ -40,7 +40,7 @@ public class ImapResponseParser {
/**
* Literal larger than this will be stored in temp file.
*/
- private static final int LITERAL_KEEP_IN_MEMORY_THRESHOLD = 2 * 1024 * 1024;
+ public static final int LITERAL_KEEP_IN_MEMORY_THRESHOLD = 2 * 1024 * 1024;
/** Input stream */
private final PeekableInputStream mIn;
@@ -89,7 +89,7 @@ public class ImapResponseParser {
*/
/* package for test */ ImapResponseParser(InputStream in, DiscourseLogger discourseLogger,
int literalKeepInMemoryThreshold) {
- if (DEBUG_LOG_RAW_STREAM && Email.DEBUG) {
+ if (DEBUG_LOG_RAW_STREAM && MailActivityEmail.DEBUG) {
in = new LoggingInputStream(in);
}
mIn = new PeekableInputStream(in);
@@ -99,7 +99,7 @@ public class ImapResponseParser {
private static IOException newEOSException() {
final String message = "End of stream reached";
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, message);
}
return new IOException(message);
@@ -161,7 +161,7 @@ public class ImapResponseParser {
ImapResponse response = null;
try {
response = parseResponse();
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "<<< " + response.toString());
}
diff --git a/src/com/android/email/mail/store/imap/ImapTempFileLiteral.java b/src/com/android/email/mail/store/imap/ImapTempFileLiteral.java
index 05de6760b..eda1b568e 100644
--- a/src/com/android/email/mail/store/imap/ImapTempFileLiteral.java
+++ b/src/com/android/email/mail/store/imap/ImapTempFileLiteral.java
@@ -16,6 +16,8 @@
package com.android.email.mail.store.imap;
+import android.util.Log;
+
import com.android.email.FixedLengthInputStream;
import com.android.emailcommon.Logging;
import com.android.emailcommon.TempDirectory;
@@ -23,8 +25,6 @@ import com.android.emailcommon.utility.Utility;
import org.apache.commons.io.IOUtils;
-import android.util.Log;
-
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
@@ -88,9 +88,14 @@ public class ImapTempFileLiteral extends ImapString {
public String getString() {
checkNotDestroyed();
try {
- return Utility.fromAscii(IOUtils.toByteArray(getAsStream()));
+ byte[] bytes = IOUtils.toByteArray(getAsStream());
+ // Prevent crash from OOM; we've seen this, but only rarely and not reproducibly
+ if (bytes.length > ImapResponseParser.LITERAL_KEEP_IN_MEMORY_THRESHOLD) {
+ throw new IOException();
+ }
+ return Utility.fromAscii(bytes);
} catch (IOException e) {
- Log.w(Logging.LOG_TAG, "ImapTempFileLiteral: Error while reading temp file");
+ Log.w(Logging.LOG_TAG, "ImapTempFileLiteral: Error while reading temp file", e);
return "";
}
}
diff --git a/src/com/android/email/mail/transport/MailTransport.java b/src/com/android/email/mail/transport/MailTransport.java
index 751be50d6..7f59f46f7 100644
--- a/src/com/android/email/mail/transport/MailTransport.java
+++ b/src/com/android/email/mail/transport/MailTransport.java
@@ -16,8 +16,8 @@
package com.android.email.mail.transport;
-import com.android.email.Email;
import com.android.email.mail.Transport;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
import com.android.emailcommon.mail.CertificateValidationException;
import com.android.emailcommon.mail.MessagingException;
@@ -159,7 +159,7 @@ public class MailTransport implements Transport {
*/
@Override
public void open() throws MessagingException, CertificateValidationException {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "*** " + mDebugLabel + " open " +
getHost() + ":" + String.valueOf(getPort()));
}
@@ -180,12 +180,12 @@ public class MailTransport implements Transport {
mOut = new BufferedOutputStream(mSocket.getOutputStream(), 512);
} catch (SSLException e) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, e.toString());
}
throw new CertificateValidationException(e.getMessage(), e);
} catch (IOException ioe) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, ioe.toString());
}
throw new MessagingException(MessagingException.IOERROR, ioe.toString());
@@ -210,12 +210,12 @@ public class MailTransport implements Transport {
mOut = new BufferedOutputStream(mSocket.getOutputStream(), 512);
} catch (SSLException e) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, e.toString());
}
throw new CertificateValidationException(e.getMessage(), e);
} catch (IOException ioe) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, ioe.toString());
}
throw new MessagingException(MessagingException.IOERROR, ioe.toString());
@@ -316,7 +316,7 @@ public class MailTransport implements Transport {
*/
@Override
public void writeLine(String s, String sensitiveReplacement) throws IOException {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
if (sensitiveReplacement != null && !Logging.DEBUG_SENSITIVE) {
Log.d(Logging.LOG_TAG, ">>> " + sensitiveReplacement);
} else {
@@ -349,11 +349,11 @@ public class MailTransport implements Transport {
sb.append((char)d);
}
}
- if (d == -1 && Email.DEBUG) {
+ if (d == -1 && MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "End of stream reached while trying to read line.");
}
String ret = sb.toString();
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "<<< " + ret);
}
return ret;
diff --git a/src/com/android/email/mail/transport/SmtpSender.java b/src/com/android/email/mail/transport/SmtpSender.java
index a9b13a66f..3ceb3307b 100644
--- a/src/com/android/email/mail/transport/SmtpSender.java
+++ b/src/com/android/email/mail/transport/SmtpSender.java
@@ -20,9 +20,9 @@ import android.content.Context;
import android.util.Base64;
import android.util.Log;
-import com.android.email.Email;
import com.android.email.mail.Sender;
import com.android.email.mail.Transport;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
import com.android.emailcommon.internet.Rfc822Output;
import com.android.emailcommon.mail.Address;
@@ -145,7 +145,7 @@ public class SmtpSender extends Sender {
*/
result = executeSimpleCommand("EHLO " + localHost);
} else {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "TLS not supported but required");
}
throw new MessagingException(MessagingException.TLS_REQUIRED);
@@ -167,19 +167,19 @@ public class SmtpSender extends Sender {
saslAuthLogin(mUsername, mPassword);
}
else {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, "No valid authentication mechanism found.");
}
throw new MessagingException(MessagingException.AUTH_REQUIRED);
}
}
} catch (SSLException e) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, e.toString());
}
throw new CertificateValidationException(e.getMessage(), e);
} catch (IOException ioe) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(Logging.LOG_TAG, ioe.toString());
}
throw new MessagingException(MessagingException.IOERROR, ioe.toString());
diff --git a/src/com/android/email/provider/AccountReconciler.java b/src/com/android/email/provider/AccountReconciler.java
index fec881faa..d564c6623 100644
--- a/src/com/android/email/provider/AccountReconciler.java
+++ b/src/com/android/email/provider/AccountReconciler.java
@@ -21,9 +21,9 @@ import android.accounts.AccountManagerFuture;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.content.Context;
+import android.net.Uri;
import android.util.Log;
-import com.android.email.Controller;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
import com.google.common.annotations.VisibleForTesting;
@@ -119,8 +119,8 @@ public class AccountReconciler {
Log.d(Logging.LOG_TAG,
"Account deleted in AccountManager; deleting from provider: " +
providerAccountName);
- Controller.getInstance(context).deleteAccountSync(providerAccount.mId,
- providerContext);
+ Uri uri = EmailProvider.uiUri("uiaccount", providerAccount.mId);
+ context.getContentResolver().delete(uri, null, null);
}
}
}
diff --git a/src/com/android/email/provider/AttachmentProvider.java b/src/com/android/email/provider/AttachmentProvider.java
index e0133156c..71955851e 100644
--- a/src/com/android/email/provider/AttachmentProvider.java
+++ b/src/com/android/email/provider/AttachmentProvider.java
@@ -142,7 +142,7 @@ public class AttachmentProvider extends ContentProvider {
// based on signature only
if (mode.equals("w")) {
Context context = getContext();
- if (context.checkCallingPermission(EmailContent.PROVIDER_PERMISSION)
+ if (context.checkCallingOrSelfPermission(EmailContent.PROVIDER_PERMISSION)
!= PackageManager.PERMISSION_GRANTED) {
throw new FileNotFoundException();
}
diff --git a/src/com/android/email/provider/ContentCache.java b/src/com/android/email/provider/ContentCache.java
index d18c3ee87..0968fd21a 100644
--- a/src/com/android/email/provider/ContentCache.java
+++ b/src/com/android/email/provider/ContentCache.java
@@ -26,7 +26,7 @@ import android.net.Uri;
import android.util.Log;
import android.util.LruCache;
-import com.android.email.Email;
+import com.android.email2.ui.MailActivityEmail;
import com.google.common.annotations.VisibleForTesting;
import java.util.ArrayList;
@@ -167,7 +167,7 @@ public final class ContentCache {
/**
* For Debugging Only - not efficient
*/
- synchronized Set<HashMap.Entry<T, Integer>> entrySet() {
+ synchronized Set<Map.Entry<T, Integer>> entrySet() {
return mMap.entrySet();
}
}
@@ -184,7 +184,7 @@ public final class ContentCache {
}
/*package*/ int invalidateTokens(String id) {
- if (Email.DEBUG && DEBUG_TOKENS) {
+ if (MailActivityEmail.DEBUG && DEBUG_TOKENS) {
Log.d(mLogTag, "============ Invalidate tokens for: " + id);
}
ArrayList<CacheToken> removeList = new ArrayList<CacheToken>();
@@ -203,7 +203,7 @@ public final class ContentCache {
}
/*package*/ void invalidate() {
- if (Email.DEBUG && DEBUG_TOKENS) {
+ if (MailActivityEmail.DEBUG && DEBUG_TOKENS) {
Log.d(mLogTag, "============ List invalidated");
}
for (CacheToken token: this) {
@@ -214,7 +214,7 @@ public final class ContentCache {
/*package*/ boolean remove(CacheToken token) {
boolean result = super.remove(token);
- if (Email.DEBUG && DEBUG_TOKENS) {
+ if (MailActivityEmail.DEBUG && DEBUG_TOKENS) {
if (result) {
Log.d(mLogTag, "============ Removing token for: " + token.mId);
} else {
@@ -227,7 +227,7 @@ public final class ContentCache {
public CacheToken add(String id) {
CacheToken token = new CacheToken(id);
super.add(token);
- if (Email.DEBUG && DEBUG_TOKENS) {
+ if (MailActivityEmail.DEBUG && DEBUG_TOKENS) {
Log.d(mLogTag, "============ Taking token for: " + token.mId);
}
return token;
@@ -482,14 +482,14 @@ public final class ContentCache {
CacheToken token) {
try {
if (!token.isValid()) {
- if (Email.DEBUG && DEBUG_CACHE) {
+ if (MailActivityEmail.DEBUG && DEBUG_CACHE) {
Log.d(mLogTag, "============ Stale token for " + id);
}
mStats.mStaleCount++;
return c;
}
if (c != null && Arrays.equals(projection, mBaseProjection) && !sLockCache) {
- if (Email.DEBUG && DEBUG_CACHE) {
+ if (MailActivityEmail.DEBUG && DEBUG_CACHE) {
Log.d(mLogTag, "============ Caching cursor for: " + id);
}
// If we've already cached this cursor, invalidate the older one
@@ -513,7 +513,7 @@ public final class ContentCache {
* @return a cursor based on cached values, or null if the row is not cached
*/
public synchronized Cursor getCachedCursor(String id, String[] projection) {
- if (Email.DEBUG && DEBUG_STATISTICS) {
+ if (MailActivityEmail.DEBUG && DEBUG_STATISTICS) {
// Every 200 calls to getCursor, report cache statistics
dumpOnCount(200);
}
@@ -594,7 +594,7 @@ public final class ContentCache {
mLockMap.add(id);
// Invalidate current tokens
int count = mTokenList.invalidateTokens(id);
- if (Email.DEBUG && DEBUG_TOKENS) {
+ if (MailActivityEmail.DEBUG && DEBUG_TOKENS) {
Log.d(mTokenList.mLogTag, "============ Lock invalidated " + count +
" tokens for: " + id);
}
@@ -631,13 +631,13 @@ public final class ContentCache {
private void unlockImpl(String id, ContentValues values, boolean wasLocked) {
Cursor c = get(id);
if (c != null) {
- if (Email.DEBUG && DEBUG_CACHE) {
+ if (MailActivityEmail.DEBUG && DEBUG_CACHE) {
Log.d(mLogTag, "=========== Unlocking cache for: " + id);
}
if (values != null && !sLockCache) {
MatrixCursor cursor = getMatrixCursor(id, mBaseProjection, values);
if (cursor != null) {
- if (Email.DEBUG && DEBUG_CACHE) {
+ if (MailActivityEmail.DEBUG && DEBUG_CACHE) {
Log.d(mLogTag, "=========== Recaching with new values: " + id);
}
cursor.moveToFirst();
diff --git a/src/com/android/email/provider/EmailProvider.java b/src/com/android/email/provider/EmailProvider.java
index bbedfdb26..5a8c6c2af 100644
--- a/src/com/android/email/provider/EmailProvider.java
+++ b/src/com/android/email/provider/EmailProvider.java
@@ -16,36 +16,45 @@
package com.android.email.provider;
-import android.accounts.AccountManager;
+import android.appwidget.AppWidgetManager;
+import android.content.ComponentName;
import android.content.ContentProvider;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
-import android.content.Intent;
import android.content.Context;
+import android.content.Intent;
import android.content.OperationApplicationException;
import android.content.UriMatcher;
import android.database.ContentObserver;
import android.database.Cursor;
+import android.database.CursorWrapper;
import android.database.MatrixCursor;
-import android.database.SQLException;
+import android.database.MergeCursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
-import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
-import android.provider.ContactsContract;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.provider.BaseColumns;
import android.text.TextUtils;
import android.util.Log;
-import com.android.email.Email;
+import com.android.common.content.ProjectionMap;
+import com.android.email.NotificationController;
import com.android.email.Preferences;
+import com.android.email.R;
+import com.android.email.SecurityPolicy;
import com.android.email.provider.ContentCache.CacheToken;
import com.android.email.service.AttachmentDownloadService;
-import com.android.emailcommon.AccountManagerTypes;
-import com.android.emailcommon.CalendarProviderStub;
+import com.android.email.service.EmailServiceUtils;
+import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Logging;
+import com.android.emailcommon.mail.Address;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent;
import com.android.emailcommon.provider.EmailContent.AccountColumns;
@@ -53,18 +62,32 @@ import com.android.emailcommon.provider.EmailContent.Attachment;
import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
import com.android.emailcommon.provider.EmailContent.Body;
import com.android.emailcommon.provider.EmailContent.BodyColumns;
-import com.android.emailcommon.provider.EmailContent.HostAuthColumns;
import com.android.emailcommon.provider.EmailContent.MailboxColumns;
import com.android.emailcommon.provider.EmailContent.Message;
import com.android.emailcommon.provider.EmailContent.MessageColumns;
import com.android.emailcommon.provider.EmailContent.PolicyColumns;
-import com.android.emailcommon.provider.EmailContent.QuickResponseColumns;
import com.android.emailcommon.provider.EmailContent.SyncColumns;
import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.provider.Mailbox;
import com.android.emailcommon.provider.Policy;
import com.android.emailcommon.provider.QuickResponse;
-import com.android.emailcommon.service.LegacyPolicySet;
+import com.android.emailcommon.service.EmailServiceProxy;
+import com.android.emailcommon.service.IEmailService;
+import com.android.emailcommon.service.IEmailServiceCallback;
+import com.android.emailcommon.service.SearchParams;
+import com.android.emailcommon.utility.AttachmentUtilities;
+import com.android.emailcommon.utility.Utility;
+import com.android.mail.providers.UIProvider;
+import com.android.mail.providers.UIProvider.AccountCapabilities;
+import com.android.mail.providers.UIProvider.AccountCursorExtraKeys;
+import com.android.mail.providers.UIProvider.ConversationPriority;
+import com.android.mail.providers.UIProvider.ConversationSendingState;
+import com.android.mail.providers.UIProvider.DraftType;
+import com.android.mail.utils.LogUtils;
+import com.android.mail.utils.MatrixCursorWithExtra;
+import com.android.mail.utils.Utils;
+import com.android.mail.widget.BaseWidgetProvider;
+import com.android.mail.widget.WidgetProvider;
import com.google.common.annotations.VisibleForTesting;
import java.io.File;
@@ -74,11 +97,18 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.regex.Pattern;
+/**
+ * @author mblank
+ *
+ */
public class EmailProvider extends ContentProvider {
private static final String TAG = "EmailProvider";
+ public static final String EMAIL_APP_MIME_TYPE = "application/email-ls";
+
protected static final String DATABASE_NAME = "EmailProvider.db";
protected static final String BODY_DATABASE_NAME = "EmailProviderBody.db";
protected static final String BACKUP_DATABASE_NAME = "EmailProviderBackup.db";
@@ -93,7 +123,7 @@ public class EmailProvider extends ContentProvider {
* is NOT the preferred way of getting notification.
*/
public static final String ACTION_NOTIFY_MESSAGE_LIST_DATASET_CHANGED =
- "com.android.email.MESSAGE_LIST_DATASET_CHANGED";
+ "com.android.email.MESSAGE_LIST_DATASET_CHANGED";
public static final String EMAIL_MESSAGE_MIME_TYPE =
"vnd.android.cursor.item/email-message";
@@ -104,6 +134,10 @@ public class EmailProvider extends ContentProvider {
Uri.parse("content://" + EmailContent.AUTHORITY + "/integrityCheck");
public static final Uri ACCOUNT_BACKUP_URI =
Uri.parse("content://" + EmailContent.AUTHORITY + "/accountBackup");
+ public static final Uri FOLDER_STATUS_URI =
+ Uri.parse("content://" + EmailContent.AUTHORITY + "/status");
+ public static final Uri FOLDER_REFRESH_URI =
+ Uri.parse("content://" + EmailContent.AUTHORITY + "/refresh");
/** Appended to the notification URI for delete operations */
public static final String NOTIFICATION_OP_DELETE = "delete";
@@ -139,47 +173,6 @@ public class EmailProvider extends ContentProvider {
private final ContentCache mCachePolicy =
new ContentCache("Policy", Policy.CONTENT_PROJECTION, MAX_CACHED_ACCOUNTS);
- // Any changes to the database format *must* include update-in-place code.
- // Original version: 3
- // Version 4: Database wipe required; changing AccountManager interface w/Exchange
- // Version 5: Database wipe required; changing AccountManager interface w/Exchange
- // Version 6: Adding Message.mServerTimeStamp column
- // Version 7: Replace the mailbox_delete trigger with a version that removes orphaned messages
- // from the Message_Deletes and Message_Updates tables
- // Version 8: Add security flags column to accounts table
- // Version 9: Add security sync key and signature to accounts table
- // Version 10: Add meeting info to message table
- // Version 11: Add content and flags to attachment table
- // Version 12: Add content_bytes to attachment table. content is deprecated.
- // Version 13: Add messageCount to Mailbox table.
- // Version 14: Add snippet to Message table
- // Version 15: Fix upgrade problem in version 14.
- // Version 16: Add accountKey to Attachment table
- // Version 17: Add parentKey to Mailbox table
- // Version 18: Copy Mailbox.displayName to Mailbox.serverId for all IMAP & POP3 mailboxes.
- // Column Mailbox.serverId is used for the server-side pathname of a mailbox.
- // Version 19: Add Policy table; add policyKey to Account table and trigger to delete an
- // Account's policy when the Account is deleted
- // Version 20: Add new policies to Policy table
- // Version 21: Add lastSeenMessageKey column to Mailbox table
- // Version 22: Upgrade path for IMAP/POP accounts to integrate with AccountManager
- // Version 23: Add column to mailbox table for time of last access
- // Version 24: Add column to hostauth table for client cert alias
- // Version 25: Added QuickResponse table
- // Version 26: Update IMAP accounts to add FLAG_SUPPORTS_SEARCH flag
- // Version 27: Add protocolSearchInfo to Message table
- // Version 28: Add notifiedMessageId and notifiedMessageCount to Account
-
- public static final int DATABASE_VERSION = 28;
-
- // Any changes to the database format *must* include update-in-place code.
- // Original version: 2
- // Version 3: Add "sourceKey" column
- // Version 4: Database wipe required; changing AccountManager interface w/Exchange
- // Version 5: Database wipe required; changing AccountManager interface w/Exchange
- // Version 6: Adding Body.mIntroText column
- public static final int BODY_DATABASE_VERSION = 6;
-
private static final int ACCOUNT_BASE = 0;
private static final int ACCOUNT = ACCOUNT_BASE;
private static final int ACCOUNT_ID = ACCOUNT_BASE + 1;
@@ -187,12 +180,15 @@ public class EmailProvider extends ContentProvider {
private static final int ACCOUNT_RESET_NEW_COUNT = ACCOUNT_BASE + 3;
private static final int ACCOUNT_RESET_NEW_COUNT_ID = ACCOUNT_BASE + 4;
private static final int ACCOUNT_DEFAULT_ID = ACCOUNT_BASE + 5;
+ private static final int ACCOUNT_CHECK = ACCOUNT_BASE + 6;
private static final int MAILBOX_BASE = 0x1000;
private static final int MAILBOX = MAILBOX_BASE;
private static final int MAILBOX_ID = MAILBOX_BASE + 1;
private static final int MAILBOX_ID_FROM_ACCOUNT_AND_TYPE = MAILBOX_BASE + 2;
- private static final int MAILBOX_ID_ADD_TO_FIELD = MAILBOX_BASE + 2;
+ private static final int MAILBOX_ID_ADD_TO_FIELD = MAILBOX_BASE + 3;
+ private static final int MAILBOX_NOTIFICATION = MAILBOX_BASE + 4;
+ private static final int MAILBOX_MOST_RECENT_MESSAGE = MAILBOX_BASE + 5;
private static final int MESSAGE_BASE = 0x2000;
private static final int MESSAGE = MESSAGE_BASE;
@@ -225,8 +221,32 @@ public class EmailProvider extends ContentProvider {
private static final int QUICK_RESPONSE_ID = QUICK_RESPONSE_BASE + 1;
private static final int QUICK_RESPONSE_ACCOUNT_ID = QUICK_RESPONSE_BASE + 2;
+ private static final int UI_BASE = 0x9000;
+ private static final int UI_FOLDERS = UI_BASE;
+ private static final int UI_SUBFOLDERS = UI_BASE + 1;
+ private static final int UI_MESSAGES = UI_BASE + 2;
+ private static final int UI_MESSAGE = UI_BASE + 3;
+ private static final int UI_SENDMAIL = UI_BASE + 4;
+ private static final int UI_UNDO = UI_BASE + 5;
+ private static final int UI_SAVEDRAFT = UI_BASE + 6;
+ private static final int UI_UPDATEDRAFT = UI_BASE + 7;
+ private static final int UI_SENDDRAFT = UI_BASE + 8;
+ private static final int UI_FOLDER_REFRESH = UI_BASE + 9;
+ private static final int UI_FOLDER = UI_BASE + 10;
+ private static final int UI_ACCOUNT = UI_BASE + 11;
+ private static final int UI_ACCTS = UI_BASE + 12;
+ private static final int UI_ATTACHMENTS = UI_BASE + 13;
+ private static final int UI_ATTACHMENT = UI_BASE + 14;
+ private static final int UI_SEARCH = UI_BASE + 15;
+ private static final int UI_ACCOUNT_DATA = UI_BASE + 16;
+ private static final int UI_FOLDER_LOAD_MORE = UI_BASE + 17;
+ private static final int UI_CONVERSATION = UI_BASE + 18;
+ private static final int UI_RECENT_FOLDERS = UI_BASE + 19;
+ private static final int UI_DEFAULT_RECENT_FOLDERS = UI_BASE + 20;
+ private static final int UI_ALL_FOLDERS = UI_BASE + 21;
+
// MUST ALWAYS EQUAL THE LAST OF THE PREVIOUS BASE CONSTANTS
- private static final int LAST_EMAIL_PROVIDER_DB_BASE = QUICK_RESPONSE_BASE;
+ private static final int LAST_EMAIL_PROVIDER_DB_BASE = UI_BASE;
// DO NOT CHANGE BODY_BASE!!
private static final int BODY_BASE = LAST_EMAIL_PROVIDER_DB_BASE + 0x1000;
@@ -247,7 +267,8 @@ public class EmailProvider extends ContentProvider {
Message.DELETED_TABLE_NAME,
Policy.TABLE_NAME,
QuickResponse.TABLE_NAME,
- Body.TABLE_NAME
+ null, // UI
+ Body.TABLE_NAME,
};
// CONTENT_CACHES MUST remain in the order of the BASE constants above
@@ -261,7 +282,8 @@ public class EmailProvider extends ContentProvider {
null, // Deleted message
mCachePolicy,
null, // Quick response
- null // Body
+ null, // Body
+ null // UI
};
// CACHE_PROJECTIONS MUST remain in the order of the BASE constants above
@@ -275,7 +297,8 @@ public class EmailProvider extends ContentProvider {
null, // Deleted message
Policy.CONTENT_PROJECTION,
null, // Quick response
- null // Body
+ null, // Body
+ null // UI
};
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
@@ -309,33 +332,19 @@ public class EmailProvider extends ContentProvider {
private static final String ID_EQUALS = EmailContent.RECORD_ID + "=?";
- private static final String TRIGGER_MAILBOX_DELETE =
- "create trigger mailbox_delete before delete on " + Mailbox.TABLE_NAME +
- " begin" +
- " delete from " + Message.TABLE_NAME +
- " where " + MessageColumns.MAILBOX_KEY + "=old." + EmailContent.RECORD_ID +
- "; delete from " + Message.UPDATED_TABLE_NAME +
- " where " + MessageColumns.MAILBOX_KEY + "=old." + EmailContent.RECORD_ID +
- "; delete from " + Message.DELETED_TABLE_NAME +
- " where " + MessageColumns.MAILBOX_KEY + "=old." + EmailContent.RECORD_ID +
- "; end";
-
- private static final String TRIGGER_ACCOUNT_DELETE =
- "create trigger account_delete before delete on " + Account.TABLE_NAME +
- " begin delete from " + Mailbox.TABLE_NAME +
- " where " + MailboxColumns.ACCOUNT_KEY + "=old." + EmailContent.RECORD_ID +
- "; delete from " + HostAuth.TABLE_NAME +
- " where " + EmailContent.RECORD_ID + "=old." + AccountColumns.HOST_AUTH_KEY_RECV +
- "; delete from " + HostAuth.TABLE_NAME +
- " where " + EmailContent.RECORD_ID + "=old." + AccountColumns.HOST_AUTH_KEY_SEND +
- "; delete from " + Policy.TABLE_NAME +
- " where " + EmailContent.RECORD_ID + "=old." + AccountColumns.POLICY_KEY +
- "; end";
-
private static final ContentValues CONTENT_VALUES_RESET_NEW_MESSAGE_COUNT;
+ private static final ContentValues EMPTY_CONTENT_VALUES = new ContentValues();
public static final String MESSAGE_URI_PARAMETER_MAILBOX_ID = "mailboxId";
+ // For undo handling
+ private int mLastSequence = -1;
+ private ArrayList<ContentProviderOperation> mLastSequenceOps =
+ new ArrayList<ContentProviderOperation>();
+
+ // Query parameter indicating the command came from UIProvider
+ private static final String IS_UIPROVIDER = "is_uiprovider";
+
static {
// Email URI matching table
UriMatcher matcher = sURIMatcher;
@@ -346,6 +355,7 @@ public class EmailProvider extends ContentProvider {
// insert into this URI causes a mailbox to be added to the account
matcher.addURI(EmailContent.AUTHORITY, "account/#", ACCOUNT_ID);
matcher.addURI(EmailContent.AUTHORITY, "account/default", ACCOUNT_DEFAULT_ID);
+ matcher.addURI(EmailContent.AUTHORITY, "accountCheck/#", ACCOUNT_CHECK);
// Special URI to reset the new message count. Only update works, and content values
// will be ignored.
@@ -362,6 +372,10 @@ public class EmailProvider extends ContentProvider {
matcher.addURI(EmailContent.AUTHORITY, "mailbox/#", MAILBOX_ID);
matcher.addURI(EmailContent.AUTHORITY, "mailboxIdFromAccountAndType/#/#",
MAILBOX_ID_FROM_ACCOUNT_AND_TYPE);
+ matcher.addURI(EmailContent.AUTHORITY, "mailboxNotification/#", MAILBOX_NOTIFICATION);
+ matcher.addURI(EmailContent.AUTHORITY, "mailboxMostRecentMessage/#",
+ MAILBOX_MOST_RECENT_MESSAGE);
+
// All messages
matcher.addURI(EmailContent.AUTHORITY, "message", MESSAGE);
// A specific message
@@ -427,6 +441,30 @@ public class EmailProvider extends ContentProvider {
// All quick responses associated with a particular account id
matcher.addURI(EmailContent.AUTHORITY, "quickresponse/account/#",
QUICK_RESPONSE_ACCOUNT_ID);
+
+ matcher.addURI(EmailContent.AUTHORITY, "uifolders/#", UI_FOLDERS);
+ matcher.addURI(EmailContent.AUTHORITY, "uiallfolders/#", UI_ALL_FOLDERS);
+ matcher.addURI(EmailContent.AUTHORITY, "uisubfolders/#", UI_SUBFOLDERS);
+ matcher.addURI(EmailContent.AUTHORITY, "uimessages/#", UI_MESSAGES);
+ matcher.addURI(EmailContent.AUTHORITY, "uimessage/#", UI_MESSAGE);
+ matcher.addURI(EmailContent.AUTHORITY, "uisendmail/#", UI_SENDMAIL);
+ matcher.addURI(EmailContent.AUTHORITY, "uiundo", UI_UNDO);
+ matcher.addURI(EmailContent.AUTHORITY, "uisavedraft/#", UI_SAVEDRAFT);
+ matcher.addURI(EmailContent.AUTHORITY, "uiupdatedraft/#", UI_UPDATEDRAFT);
+ matcher.addURI(EmailContent.AUTHORITY, "uisenddraft/#", UI_SENDDRAFT);
+ matcher.addURI(EmailContent.AUTHORITY, "uirefresh/#", UI_FOLDER_REFRESH);
+ matcher.addURI(EmailContent.AUTHORITY, "uifolder/#", UI_FOLDER);
+ matcher.addURI(EmailContent.AUTHORITY, "uiaccount/#", UI_ACCOUNT);
+ matcher.addURI(EmailContent.AUTHORITY, "uiaccts", UI_ACCTS);
+ matcher.addURI(EmailContent.AUTHORITY, "uiattachments/#", UI_ATTACHMENTS);
+ matcher.addURI(EmailContent.AUTHORITY, "uiattachment/#", UI_ATTACHMENT);
+ matcher.addURI(EmailContent.AUTHORITY, "uisearch/#", UI_SEARCH);
+ matcher.addURI(EmailContent.AUTHORITY, "uiaccountdata/#", UI_ACCOUNT_DATA);
+ matcher.addURI(EmailContent.AUTHORITY, "uiloadmore/#", UI_FOLDER_LOAD_MORE);
+ matcher.addURI(EmailContent.AUTHORITY, "uiconversation/#", UI_CONVERSATION);
+ matcher.addURI(EmailContent.AUTHORITY, "uirecentfolders/#", UI_RECENT_FOLDERS);
+ matcher.addURI(EmailContent.AUTHORITY, "uidefaultrecentfolders/#",
+ UI_DEFAULT_RECENT_FOLDERS);
}
/**
@@ -444,360 +482,23 @@ public class EmailProvider extends ContentProvider {
return match;
}
- /*
- * Internal helper method for index creation.
- * Example:
- * "create index message_" + MessageColumns.FLAG_READ
- * + " on " + Message.TABLE_NAME + " (" + MessageColumns.FLAG_READ + ");"
- */
- /* package */
- static String createIndex(String tableName, String columnName) {
- return "create index " + tableName.toLowerCase() + '_' + columnName
- + " on " + tableName + " (" + columnName + ");";
- }
-
- static void createMessageTable(SQLiteDatabase db) {
- String messageColumns = MessageColumns.DISPLAY_NAME + " text, "
- + MessageColumns.TIMESTAMP + " integer, "
- + MessageColumns.SUBJECT + " text, "
- + MessageColumns.FLAG_READ + " integer, "
- + MessageColumns.FLAG_LOADED + " integer, "
- + MessageColumns.FLAG_FAVORITE + " integer, "
- + MessageColumns.FLAG_ATTACHMENT + " integer, "
- + MessageColumns.FLAGS + " integer, "
- + MessageColumns.CLIENT_ID + " integer, "
- + MessageColumns.MESSAGE_ID + " text, "
- + MessageColumns.MAILBOX_KEY + " integer, "
- + MessageColumns.ACCOUNT_KEY + " integer, "
- + MessageColumns.FROM_LIST + " text, "
- + MessageColumns.TO_LIST + " text, "
- + MessageColumns.CC_LIST + " text, "
- + MessageColumns.BCC_LIST + " text, "
- + MessageColumns.REPLY_TO_LIST + " text, "
- + MessageColumns.MEETING_INFO + " text, "
- + MessageColumns.SNIPPET + " text, "
- + MessageColumns.PROTOCOL_SEARCH_INFO + " text"
- + ");";
-
- // This String and the following String MUST have the same columns, except for the type
- // of those columns!
- String createString = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + SyncColumns.SERVER_ID + " text, "
- + SyncColumns.SERVER_TIMESTAMP + " integer, "
- + messageColumns;
-
- // For the updated and deleted tables, the id is assigned, but we do want to keep track
- // of the ORDER of updates using an autoincrement primary key. We use the DATA column
- // at this point; it has no other function
- String altCreateString = " (" + EmailContent.RECORD_ID + " integer unique, "
- + SyncColumns.SERVER_ID + " text, "
- + SyncColumns.SERVER_TIMESTAMP + " integer, "
- + messageColumns;
-
- // The three tables have the same schema
- db.execSQL("create table " + Message.TABLE_NAME + createString);
- db.execSQL("create table " + Message.UPDATED_TABLE_NAME + altCreateString);
- db.execSQL("create table " + Message.DELETED_TABLE_NAME + altCreateString);
-
- String indexColumns[] = {
- MessageColumns.TIMESTAMP,
- MessageColumns.FLAG_READ,
- MessageColumns.FLAG_LOADED,
- MessageColumns.MAILBOX_KEY,
- SyncColumns.SERVER_ID
- };
-
- for (String columnName : indexColumns) {
- db.execSQL(createIndex(Message.TABLE_NAME, columnName));
- }
-
- // Deleting a Message deletes all associated Attachments
- // Deleting the associated Body cannot be done in a trigger, because the Body is stored
- // in a separate database, and trigger cannot operate on attached databases.
- db.execSQL("create trigger message_delete before delete on " + Message.TABLE_NAME +
- " begin delete from " + Attachment.TABLE_NAME +
- " where " + AttachmentColumns.MESSAGE_KEY + "=old." + EmailContent.RECORD_ID +
- "; end");
-
- // Add triggers to keep unread count accurate per mailbox
-
- // NOTE: SQLite's before triggers are not safe when recursive triggers are involved.
- // Use caution when changing them.
-
- // Insert a message; if flagRead is zero, add to the unread count of the message's mailbox
- db.execSQL("create trigger unread_message_insert before insert on " + Message.TABLE_NAME +
- " when NEW." + MessageColumns.FLAG_READ + "=0" +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT +
- '=' + MailboxColumns.UNREAD_COUNT + "+1" +
- " where " + EmailContent.RECORD_ID + "=NEW." + MessageColumns.MAILBOX_KEY +
- "; end");
-
- // Delete a message; if flagRead is zero, decrement the unread count of the msg's mailbox
- db.execSQL("create trigger unread_message_delete before delete on " + Message.TABLE_NAME +
- " when OLD." + MessageColumns.FLAG_READ + "=0" +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT +
- '=' + MailboxColumns.UNREAD_COUNT + "-1" +
- " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY +
- "; end");
-
- // Change a message's mailbox
- db.execSQL("create trigger unread_message_move before update of " +
- MessageColumns.MAILBOX_KEY + " on " + Message.TABLE_NAME +
- " when OLD." + MessageColumns.FLAG_READ + "=0" +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT +
- '=' + MailboxColumns.UNREAD_COUNT + "-1" +
- " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY +
- "; update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT +
- '=' + MailboxColumns.UNREAD_COUNT + "+1" +
- " where " + EmailContent.RECORD_ID + "=NEW." + MessageColumns.MAILBOX_KEY +
- "; end");
-
- // Change a message's read state
- db.execSQL("create trigger unread_message_read before update of " +
- MessageColumns.FLAG_READ + " on " + Message.TABLE_NAME +
- " when OLD." + MessageColumns.FLAG_READ + "!=NEW." + MessageColumns.FLAG_READ +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT +
- '=' + MailboxColumns.UNREAD_COUNT + "+ case OLD." + MessageColumns.FLAG_READ +
- " when 0 then -1 else 1 end" +
- " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY +
- "; end");
-
- // Add triggers to update message count per mailbox
-
- // Insert a message.
- db.execSQL("create trigger message_count_message_insert after insert on " +
- Message.TABLE_NAME +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT +
- '=' + MailboxColumns.MESSAGE_COUNT + "+1" +
- " where " + EmailContent.RECORD_ID + "=NEW." + MessageColumns.MAILBOX_KEY +
- "; end");
-
- // Delete a message; if flagRead is zero, decrement the unread count of the msg's mailbox
- db.execSQL("create trigger message_count_message_delete after delete on " +
- Message.TABLE_NAME +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT +
- '=' + MailboxColumns.MESSAGE_COUNT + "-1" +
- " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY +
- "; end");
-
- // Change a message's mailbox
- db.execSQL("create trigger message_count_message_move after update of " +
- MessageColumns.MAILBOX_KEY + " on " + Message.TABLE_NAME +
- " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT +
- '=' + MailboxColumns.MESSAGE_COUNT + "-1" +
- " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY +
- "; update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT +
- '=' + MailboxColumns.MESSAGE_COUNT + "+1" +
- " where " + EmailContent.RECORD_ID + "=NEW." + MessageColumns.MAILBOX_KEY +
- "; end");
- }
-
- static void resetMessageTable(SQLiteDatabase db, int oldVersion, int newVersion) {
- try {
- db.execSQL("drop table " + Message.TABLE_NAME);
- db.execSQL("drop table " + Message.UPDATED_TABLE_NAME);
- db.execSQL("drop table " + Message.DELETED_TABLE_NAME);
- } catch (SQLException e) {
- }
- createMessageTable(db);
- }
-
- @SuppressWarnings("deprecation")
- static void createAccountTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + AccountColumns.DISPLAY_NAME + " text, "
- + AccountColumns.EMAIL_ADDRESS + " text, "
- + AccountColumns.SYNC_KEY + " text, "
- + AccountColumns.SYNC_LOOKBACK + " integer, "
- + AccountColumns.SYNC_INTERVAL + " text, "
- + AccountColumns.HOST_AUTH_KEY_RECV + " integer, "
- + AccountColumns.HOST_AUTH_KEY_SEND + " integer, "
- + AccountColumns.FLAGS + " integer, "
- + AccountColumns.IS_DEFAULT + " integer, "
- + AccountColumns.COMPATIBILITY_UUID + " text, "
- + AccountColumns.SENDER_NAME + " text, "
- + AccountColumns.RINGTONE_URI + " text, "
- + AccountColumns.PROTOCOL_VERSION + " text, "
- + AccountColumns.NEW_MESSAGE_COUNT + " integer, "
- + AccountColumns.SECURITY_FLAGS + " integer, "
- + AccountColumns.SECURITY_SYNC_KEY + " text, "
- + AccountColumns.SIGNATURE + " text, "
- + AccountColumns.POLICY_KEY + " integer, "
- + AccountColumns.NOTIFIED_MESSAGE_ID + " integer, "
- + AccountColumns.NOTIFIED_MESSAGE_COUNT + " integer"
- + ");";
- db.execSQL("create table " + Account.TABLE_NAME + s);
- // Deleting an account deletes associated Mailboxes and HostAuth's
- db.execSQL(TRIGGER_ACCOUNT_DELETE);
- }
-
- static void resetAccountTable(SQLiteDatabase db, int oldVersion, int newVersion) {
- try {
- db.execSQL("drop table " + Account.TABLE_NAME);
- } catch (SQLException e) {
- }
- createAccountTable(db);
- }
-
- static void createPolicyTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + PolicyColumns.PASSWORD_MODE + " integer, "
- + PolicyColumns.PASSWORD_MIN_LENGTH + " integer, "
- + PolicyColumns.PASSWORD_EXPIRATION_DAYS + " integer, "
- + PolicyColumns.PASSWORD_HISTORY + " integer, "
- + PolicyColumns.PASSWORD_COMPLEX_CHARS + " integer, "
- + PolicyColumns.PASSWORD_MAX_FAILS + " integer, "
- + PolicyColumns.MAX_SCREEN_LOCK_TIME + " integer, "
- + PolicyColumns.REQUIRE_REMOTE_WIPE + " integer, "
- + PolicyColumns.REQUIRE_ENCRYPTION + " integer, "
- + PolicyColumns.REQUIRE_ENCRYPTION_EXTERNAL + " integer, "
- + PolicyColumns.REQUIRE_MANUAL_SYNC_WHEN_ROAMING + " integer, "
- + PolicyColumns.DONT_ALLOW_CAMERA + " integer, "
- + PolicyColumns.DONT_ALLOW_ATTACHMENTS + " integer, "
- + PolicyColumns.DONT_ALLOW_HTML + " integer, "
- + PolicyColumns.MAX_ATTACHMENT_SIZE + " integer, "
- + PolicyColumns.MAX_TEXT_TRUNCATION_SIZE + " integer, "
- + PolicyColumns.MAX_HTML_TRUNCATION_SIZE + " integer, "
- + PolicyColumns.MAX_EMAIL_LOOKBACK + " integer, "
- + PolicyColumns.MAX_CALENDAR_LOOKBACK + " integer, "
- + PolicyColumns.PASSWORD_RECOVERY_ENABLED + " integer"
- + ");";
- db.execSQL("create table " + Policy.TABLE_NAME + s);
- }
-
- static void createHostAuthTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + HostAuthColumns.PROTOCOL + " text, "
- + HostAuthColumns.ADDRESS + " text, "
- + HostAuthColumns.PORT + " integer, "
- + HostAuthColumns.FLAGS + " integer, "
- + HostAuthColumns.LOGIN + " text, "
- + HostAuthColumns.PASSWORD + " text, "
- + HostAuthColumns.DOMAIN + " text, "
- + HostAuthColumns.ACCOUNT_KEY + " integer,"
- + HostAuthColumns.CLIENT_CERT_ALIAS + " text"
- + ");";
- db.execSQL("create table " + HostAuth.TABLE_NAME + s);
- }
-
- static void resetHostAuthTable(SQLiteDatabase db, int oldVersion, int newVersion) {
- try {
- db.execSQL("drop table " + HostAuth.TABLE_NAME);
- } catch (SQLException e) {
- }
- createHostAuthTable(db);
- }
-
- static void createMailboxTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + MailboxColumns.DISPLAY_NAME + " text, "
- + MailboxColumns.SERVER_ID + " text, "
- + MailboxColumns.PARENT_SERVER_ID + " text, "
- + MailboxColumns.PARENT_KEY + " integer, "
- + MailboxColumns.ACCOUNT_KEY + " integer, "
- + MailboxColumns.TYPE + " integer, "
- + MailboxColumns.DELIMITER + " integer, "
- + MailboxColumns.SYNC_KEY + " text, "
- + MailboxColumns.SYNC_LOOKBACK + " integer, "
- + MailboxColumns.SYNC_INTERVAL + " integer, "
- + MailboxColumns.SYNC_TIME + " integer, "
- + MailboxColumns.UNREAD_COUNT + " integer, "
- + MailboxColumns.FLAG_VISIBLE + " integer, "
- + MailboxColumns.FLAGS + " integer, "
- + MailboxColumns.VISIBLE_LIMIT + " integer, "
- + MailboxColumns.SYNC_STATUS + " text, "
- + MailboxColumns.MESSAGE_COUNT + " integer not null default 0, "
- + MailboxColumns.LAST_SEEN_MESSAGE_KEY + " integer, "
- + MailboxColumns.LAST_TOUCHED_TIME + " integer default 0"
- + ");";
- db.execSQL("create table " + Mailbox.TABLE_NAME + s);
- db.execSQL("create index mailbox_" + MailboxColumns.SERVER_ID
- + " on " + Mailbox.TABLE_NAME + " (" + MailboxColumns.SERVER_ID + ")");
- db.execSQL("create index mailbox_" + MailboxColumns.ACCOUNT_KEY
- + " on " + Mailbox.TABLE_NAME + " (" + MailboxColumns.ACCOUNT_KEY + ")");
- // Deleting a Mailbox deletes associated Messages in all three tables
- db.execSQL(TRIGGER_MAILBOX_DELETE);
- }
-
- static void resetMailboxTable(SQLiteDatabase db, int oldVersion, int newVersion) {
- try {
- db.execSQL("drop table " + Mailbox.TABLE_NAME);
- } catch (SQLException e) {
- }
- createMailboxTable(db);
- }
-
- static void createAttachmentTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + AttachmentColumns.FILENAME + " text, "
- + AttachmentColumns.MIME_TYPE + " text, "
- + AttachmentColumns.SIZE + " integer, "
- + AttachmentColumns.CONTENT_ID + " text, "
- + AttachmentColumns.CONTENT_URI + " text, "
- + AttachmentColumns.MESSAGE_KEY + " integer, "
- + AttachmentColumns.LOCATION + " text, "
- + AttachmentColumns.ENCODING + " text, "
- + AttachmentColumns.CONTENT + " text, "
- + AttachmentColumns.FLAGS + " integer, "
- + AttachmentColumns.CONTENT_BYTES + " blob, "
- + AttachmentColumns.ACCOUNT_KEY + " integer"
- + ");";
- db.execSQL("create table " + Attachment.TABLE_NAME + s);
- db.execSQL(createIndex(Attachment.TABLE_NAME, AttachmentColumns.MESSAGE_KEY));
- }
-
- static void resetAttachmentTable(SQLiteDatabase db, int oldVersion, int newVersion) {
- try {
- db.execSQL("drop table " + Attachment.TABLE_NAME);
- } catch (SQLException e) {
- }
- createAttachmentTable(db);
- }
-
- static void createQuickResponseTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + QuickResponseColumns.TEXT + " text, "
- + QuickResponseColumns.ACCOUNT_KEY + " integer"
- + ");";
- db.execSQL("create table " + QuickResponse.TABLE_NAME + s);
- }
+ private SQLiteDatabase mDatabase;
+ private SQLiteDatabase mBodyDatabase;
- static void createBodyTable(SQLiteDatabase db) {
- String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, "
- + BodyColumns.MESSAGE_KEY + " integer, "
- + BodyColumns.HTML_CONTENT + " text, "
- + BodyColumns.TEXT_CONTENT + " text, "
- + BodyColumns.HTML_REPLY + " text, "
- + BodyColumns.TEXT_REPLY + " text, "
- + BodyColumns.SOURCE_MESSAGE_KEY + " text, "
- + BodyColumns.INTRO_TEXT + " text"
- + ");";
- db.execSQL("create table " + Body.TABLE_NAME + s);
- db.execSQL(createIndex(Body.TABLE_NAME, BodyColumns.MESSAGE_KEY));
+ public static Uri uiUri(String type, long id) {
+ return Uri.parse(uiUriString(type, id));
}
- static void upgradeBodyTable(SQLiteDatabase db, int oldVersion, int newVersion) {
- if (oldVersion < 5) {
- try {
- db.execSQL("drop table " + Body.TABLE_NAME);
- createBodyTable(db);
- } catch (SQLException e) {
- }
- } else if (oldVersion == 5) {
- try {
- db.execSQL("alter table " + Body.TABLE_NAME
- + " add " + BodyColumns.INTRO_TEXT + " text");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProviderBody.db from v5 to v6", e);
- }
- oldVersion = 6;
- }
+ /**
+ * Creates a URI string from a database ID (guaranteed to be unique).
+ * @param type of the resource: uifolder, message, etc.
+ * @param id the id of the resource.
+ * @return
+ */
+ public static String uiUriString(String type, long id) {
+ return "content://" + EmailContent.AUTHORITY + "/" + type + ((id == -1) ? "" : ("/" + id));
}
- private SQLiteDatabase mDatabase;
- private SQLiteDatabase mBodyDatabase;
-
/**
* Orphan record deletion utility. Generates a sqlite statement like:
* delete from <table> where <column> not in (select <foreignColumn> from <foreignTable>)
@@ -828,23 +529,18 @@ public class EmailProvider extends ContentProvider {
// to corruption
checkDatabases();
- DatabaseHelper helper = new DatabaseHelper(context, DATABASE_NAME);
+ DBHelper.DatabaseHelper helper = new DBHelper.DatabaseHelper(context, DATABASE_NAME);
mDatabase = helper.getWritableDatabase();
- mDatabase.setLockingEnabled(true);
- BodyDatabaseHelper bodyHelper = new BodyDatabaseHelper(context, BODY_DATABASE_NAME);
+ DBHelper.BodyDatabaseHelper bodyHelper =
+ new DBHelper.BodyDatabaseHelper(context, BODY_DATABASE_NAME);
mBodyDatabase = bodyHelper.getWritableDatabase();
if (mBodyDatabase != null) {
- mBodyDatabase.setLockingEnabled(true);
String bodyFileName = mBodyDatabase.getPath();
mDatabase.execSQL("attach \"" + bodyFileName + "\" as BodyDatabase");
}
// Restore accounts if the database is corrupted...
restoreIfNeeded(context, mDatabase);
-
- if (Email.DEBUG) {
- Log.d(TAG, "Deleting orphans...");
- }
// Check for any orphaned Messages in the updated/deleted tables
deleteMessageOrphans(mDatabase, Message.UPDATED_TABLE_NAME);
deleteMessageOrphans(mDatabase, Message.DELETED_TABLE_NAME);
@@ -855,18 +551,21 @@ public class EmailProvider extends ContentProvider {
Account.TABLE_NAME);
deleteUnlinked(mDatabase, Policy.TABLE_NAME, PolicyColumns.ID, AccountColumns.POLICY_KEY,
Account.TABLE_NAME);
-
- if (Email.DEBUG) {
- Log.d(TAG, "EmailProvider pre-caching...");
- }
+ initUiProvider();
preCacheData();
- if (Email.DEBUG) {
- Log.d(TAG, "EmailProvider ready.");
- }
return mDatabase;
}
/**
+ * Perform startup actions related to UI
+ */
+ private void initUiProvider() {
+ // Clear mailbox sync status
+ mDatabase.execSQL("update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UI_SYNC_STATUS +
+ "=" + UIProvider.SyncStatus.NO_SYNC);
+ }
+
+ /**
* Pre-cache all of the items in a given table meeting the selection criteria
* @param tableUri the table uri
* @param baseProjection the base projection of that table
@@ -953,7 +652,7 @@ public class EmailProvider extends ContentProvider {
}
/*package*/ static SQLiteDatabase getReadableDatabase(Context context) {
- DatabaseHelper helper = new DatabaseHelper(context, DATABASE_NAME);
+ DBHelper.DatabaseHelper helper = new DBHelper.DatabaseHelper(context, DATABASE_NAME);
return helper.getReadableDatabase();
}
@@ -961,7 +660,7 @@ public class EmailProvider extends ContentProvider {
* Restore user Account and HostAuth data from our backup database
*/
public static void restoreIfNeeded(Context context, SQLiteDatabase mainDatabase) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.w(TAG, "restoreIfNeeded...");
}
// Check for legacy backup
@@ -979,12 +678,17 @@ public class EmailProvider extends ContentProvider {
// If we have accounts, we're done
Cursor c = mainDatabase.query(Account.TABLE_NAME, EmailContent.ID_PROJECTION, null, null,
null, null, null);
- if (c.moveToFirst()) {
- if (Email.DEBUG) {
- Log.w(TAG, "restoreIfNeeded: Account exists.");
+ try {
+ if (c.moveToFirst()) {
+ if (MailActivityEmail.DEBUG) {
+ Log.w(TAG, "restoreIfNeeded: Account exists.");
+ }
+ return; // At least one account exists.
}
- return; // At least one account exists.
+ } finally {
+ c.close();
}
+
restoreAccounts(context, mainDatabase);
}
@@ -1049,318 +753,6 @@ public class EmailProvider extends ContentProvider {
}
}
- private class BodyDatabaseHelper extends SQLiteOpenHelper {
- BodyDatabaseHelper(Context context, String name) {
- super(context, name, null, BODY_DATABASE_VERSION);
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
- Log.d(TAG, "Creating EmailProviderBody database");
- createBodyTable(db);
- }
-
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- upgradeBodyTable(db, oldVersion, newVersion);
- }
-
- @Override
- public void onOpen(SQLiteDatabase db) {
- }
- }
-
- private static class DatabaseHelper extends SQLiteOpenHelper {
- Context mContext;
-
- DatabaseHelper(Context context, String name) {
- super(context, name, null, DATABASE_VERSION);
- mContext = context;
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
- Log.d(TAG, "Creating EmailProvider database");
- // Create all tables here; each class has its own method
- createMessageTable(db);
- createAttachmentTable(db);
- createMailboxTable(db);
- createHostAuthTable(db);
- createAccountTable(db);
- createPolicyTable(db);
- createQuickResponseTable(db);
- }
-
- @Override
- @SuppressWarnings("deprecation")
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- // For versions prior to 5, delete all data
- // Versions >= 5 require that data be preserved!
- if (oldVersion < 5) {
- android.accounts.Account[] accounts = AccountManager.get(mContext)
- .getAccountsByType(AccountManagerTypes.TYPE_EXCHANGE);
- for (android.accounts.Account account: accounts) {
- AccountManager.get(mContext).removeAccount(account, null, null);
- }
- resetMessageTable(db, oldVersion, newVersion);
- resetAttachmentTable(db, oldVersion, newVersion);
- resetMailboxTable(db, oldVersion, newVersion);
- resetHostAuthTable(db, oldVersion, newVersion);
- resetAccountTable(db, oldVersion, newVersion);
- return;
- }
- if (oldVersion == 5) {
- // Message Tables: Add SyncColumns.SERVER_TIMESTAMP
- try {
- db.execSQL("alter table " + Message.TABLE_NAME
- + " add column " + SyncColumns.SERVER_TIMESTAMP + " integer" + ";");
- db.execSQL("alter table " + Message.UPDATED_TABLE_NAME
- + " add column " + SyncColumns.SERVER_TIMESTAMP + " integer" + ";");
- db.execSQL("alter table " + Message.DELETED_TABLE_NAME
- + " add column " + SyncColumns.SERVER_TIMESTAMP + " integer" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from v5 to v6", e);
- }
- oldVersion = 6;
- }
- if (oldVersion == 6) {
- // Use the newer mailbox_delete trigger
- db.execSQL("drop trigger mailbox_delete;");
- db.execSQL(TRIGGER_MAILBOX_DELETE);
- oldVersion = 7;
- }
- if (oldVersion == 7) {
- // add the security (provisioning) column
- try {
- db.execSQL("alter table " + Account.TABLE_NAME
- + " add column " + AccountColumns.SECURITY_FLAGS + " integer" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 7 to 8 " + e);
- }
- oldVersion = 8;
- }
- if (oldVersion == 8) {
- // accounts: add security sync key & user signature columns
- try {
- db.execSQL("alter table " + Account.TABLE_NAME
- + " add column " + AccountColumns.SECURITY_SYNC_KEY + " text" + ";");
- db.execSQL("alter table " + Account.TABLE_NAME
- + " add column " + AccountColumns.SIGNATURE + " text" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 8 to 9 " + e);
- }
- oldVersion = 9;
- }
- if (oldVersion == 9) {
- // Message: add meeting info column into Message tables
- try {
- db.execSQL("alter table " + Message.TABLE_NAME
- + " add column " + MessageColumns.MEETING_INFO + " text" + ";");
- db.execSQL("alter table " + Message.UPDATED_TABLE_NAME
- + " add column " + MessageColumns.MEETING_INFO + " text" + ";");
- db.execSQL("alter table " + Message.DELETED_TABLE_NAME
- + " add column " + MessageColumns.MEETING_INFO + " text" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 9 to 10 " + e);
- }
- oldVersion = 10;
- }
- if (oldVersion == 10) {
- // Attachment: add content and flags columns
- try {
- db.execSQL("alter table " + Attachment.TABLE_NAME
- + " add column " + AttachmentColumns.CONTENT + " text" + ";");
- db.execSQL("alter table " + Attachment.TABLE_NAME
- + " add column " + AttachmentColumns.FLAGS + " integer" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 10 to 11 " + e);
- }
- oldVersion = 11;
- }
- if (oldVersion == 11) {
- // Attachment: add content_bytes
- try {
- db.execSQL("alter table " + Attachment.TABLE_NAME
- + " add column " + AttachmentColumns.CONTENT_BYTES + " blob" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 11 to 12 " + e);
- }
- oldVersion = 12;
- }
- if (oldVersion == 12) {
- try {
- db.execSQL("alter table " + Mailbox.TABLE_NAME
- + " add column " + Mailbox.MESSAGE_COUNT
- +" integer not null default 0" + ";");
- recalculateMessageCount(db);
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 12 to 13 " + e);
- }
- oldVersion = 13;
- }
- if (oldVersion == 13) {
- try {
- db.execSQL("alter table " + Message.TABLE_NAME
- + " add column " + Message.SNIPPET
- +" text" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 13 to 14 " + e);
- }
- oldVersion = 14;
- }
- if (oldVersion == 14) {
- try {
- db.execSQL("alter table " + Message.DELETED_TABLE_NAME
- + " add column " + Message.SNIPPET +" text" + ";");
- db.execSQL("alter table " + Message.UPDATED_TABLE_NAME
- + " add column " + Message.SNIPPET +" text" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 14 to 15 " + e);
- }
- oldVersion = 15;
- }
- if (oldVersion == 15) {
- try {
- db.execSQL("alter table " + Attachment.TABLE_NAME
- + " add column " + Attachment.ACCOUNT_KEY +" integer" + ";");
- // Update all existing attachments to add the accountKey data
- db.execSQL("update " + Attachment.TABLE_NAME + " set " +
- Attachment.ACCOUNT_KEY + "= (SELECT " + Message.TABLE_NAME + "." +
- Message.ACCOUNT_KEY + " from " + Message.TABLE_NAME + " where " +
- Message.TABLE_NAME + "." + Message.RECORD_ID + " = " +
- Attachment.TABLE_NAME + "." + Attachment.MESSAGE_KEY + ")");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 15 to 16 " + e);
- }
- oldVersion = 16;
- }
- if (oldVersion == 16) {
- try {
- db.execSQL("alter table " + Mailbox.TABLE_NAME
- + " add column " + Mailbox.PARENT_KEY + " integer;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 16 to 17 " + e);
- }
- oldVersion = 17;
- }
- if (oldVersion == 17) {
- upgradeFromVersion17ToVersion18(db);
- oldVersion = 18;
- }
- if (oldVersion == 18) {
- try {
- db.execSQL("alter table " + Account.TABLE_NAME
- + " add column " + Account.POLICY_KEY + " integer;");
- db.execSQL("drop trigger account_delete;");
- db.execSQL(TRIGGER_ACCOUNT_DELETE);
- createPolicyTable(db);
- convertPolicyFlagsToPolicyTable(db);
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 18 to 19 " + e);
- }
- oldVersion = 19;
- }
- if (oldVersion == 19) {
- try {
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.REQUIRE_MANUAL_SYNC_WHEN_ROAMING +
- " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.DONT_ALLOW_CAMERA + " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.DONT_ALLOW_ATTACHMENTS + " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.DONT_ALLOW_HTML + " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.MAX_ATTACHMENT_SIZE + " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.MAX_TEXT_TRUNCATION_SIZE +
- " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.MAX_HTML_TRUNCATION_SIZE +
- " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.MAX_EMAIL_LOOKBACK + " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.MAX_CALENDAR_LOOKBACK + " integer;");
- db.execSQL("alter table " + Policy.TABLE_NAME
- + " add column " + PolicyColumns.PASSWORD_RECOVERY_ENABLED +
- " integer;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 19 to 20 " + e);
- }
- oldVersion = 20;
- }
- if (oldVersion == 20) {
- upgradeFromVersion20ToVersion21(db);
- oldVersion = 21;
- }
- if (oldVersion == 21) {
- upgradeFromVersion21ToVersion22(db, mContext);
- oldVersion = 22;
- }
- if (oldVersion == 22) {
- upgradeFromVersion22ToVersion23(db);
- oldVersion = 23;
- }
- if (oldVersion == 23) {
- upgradeFromVersion23ToVersion24(db);
- oldVersion = 24;
- }
- if (oldVersion == 24) {
- upgradeFromVersion24ToVersion25(db);
- oldVersion = 25;
- }
- if (oldVersion == 25) {
- upgradeFromVersion25ToVersion26(db);
- oldVersion = 26;
- }
- if (oldVersion == 26) {
- try {
- db.execSQL("alter table " + Message.TABLE_NAME
- + " add column " + Message.PROTOCOL_SEARCH_INFO + " text;");
- db.execSQL("alter table " + Message.DELETED_TABLE_NAME
- + " add column " + Message.PROTOCOL_SEARCH_INFO +" text" + ";");
- db.execSQL("alter table " + Message.UPDATED_TABLE_NAME
- + " add column " + Message.PROTOCOL_SEARCH_INFO +" text" + ";");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 26 to 27 " + e);
- }
- oldVersion = 27;
- }
- if (oldVersion == 27) {
- try {
- db.execSQL("alter table " + Account.TABLE_NAME
- + " add column " + Account.NOTIFIED_MESSAGE_ID + " integer;");
- db.execSQL("alter table " + Account.TABLE_NAME
- + " add column " + Account.NOTIFIED_MESSAGE_COUNT + " integer;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 27 to 27 " + e);
- }
- oldVersion = 28;
- }
- }
-
- @Override
- public void onOpen(SQLiteDatabase db) {
- }
- }
-
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
final int match = findMatch(uri, "delete");
@@ -1380,7 +772,18 @@ public class EmailProvider extends ContentProvider {
int result = -1;
try {
+ if (match == MESSAGE_ID || match == SYNCED_MESSAGE_ID) {
+ if (!uri.getBooleanQueryParameter(IS_UIPROVIDER, false)) {
+ notifyUIConversation(uri);
+ }
+ }
switch (match) {
+ case UI_MESSAGE:
+ return uiDeleteMessage(uri);
+ case UI_ACCOUNT_DATA:
+ return uiDeleteAccountData(uri);
+ case UI_ACCOUNT:
+ return uiDeleteAccount(uri);
// These are cases in which one or more Messages might get deleted, either by
// cascade or explicitly
case MAILBOX_ID:
@@ -1456,6 +859,12 @@ public class EmailProvider extends ContentProvider {
cache.unlock(id);
}
}
+ if (match == ACCOUNT_ID) {
+ notifyUI(UIPROVIDER_ACCOUNT_NOTIFIER, id);
+ resolver.notifyChange(UIPROVIDER_ACCOUNTS_NOTIFIER, null);
+ } else if (match == MAILBOX_ID) {
+ notifyUI(UIPROVIDER_FOLDER_NOTIFIER, id);
+ }
break;
case ATTACHMENTS_MESSAGE_ID:
// All attachments for the given message
@@ -1578,6 +987,25 @@ public class EmailProvider extends ContentProvider {
}
}
+ private static final Uri UIPROVIDER_CONVERSATION_NOTIFIER =
+ Uri.parse("content://" + UIProvider.AUTHORITY + "/uimessages");
+ private static final Uri UIPROVIDER_FOLDER_NOTIFIER =
+ Uri.parse("content://" + UIProvider.AUTHORITY + "/uifolder");
+ private static final Uri UIPROVIDER_ACCOUNT_NOTIFIER =
+ Uri.parse("content://" + UIProvider.AUTHORITY + "/uiaccount");
+ public static final Uri UIPROVIDER_SETTINGS_NOTIFIER =
+ Uri.parse("content://" + UIProvider.AUTHORITY + "/uisettings");
+ private static final Uri UIPROVIDER_ATTACHMENT_NOTIFIER =
+ Uri.parse("content://" + UIProvider.AUTHORITY + "/uiattachment");
+ private static final Uri UIPROVIDER_ATTACHMENTS_NOTIFIER =
+ Uri.parse("content://" + UIProvider.AUTHORITY + "/uiattachments");
+ private static final Uri UIPROVIDER_ACCOUNTS_NOTIFIER =
+ Uri.parse("content://" + UIProvider.AUTHORITY + "/uiaccts");
+ private static final Uri UIPROVIDER_MESSAGE_NOTIFIER =
+ Uri.parse("content://" + UIProvider.AUTHORITY + "/uimessage");
+ private static final Uri UIPROVIDER_RECENT_FOLDERS_NOTIFIER =
+ Uri.parse("content://" + UIProvider.AUTHORITY + "/uirecentfolders");
+
@Override
public Uri insert(Uri uri, ContentValues values) {
int match = findMatch(uri, "insert");
@@ -1601,6 +1029,10 @@ public class EmailProvider extends ContentProvider {
try {
switch (match) {
+ case UI_SAVEDRAFT:
+ return uiSaveDraft(uri, values);
+ case UI_SENDMAIL:
+ return uiSendMail(uri, values);
// NOTE: It is NOT legal for production code to insert directly into UPDATED_MESSAGE
// or DELETED_MESSAGE; see the comment below for details
case UPDATED_MESSAGE:
@@ -1616,6 +1048,11 @@ public class EmailProvider extends ContentProvider {
longId = db.insert(TABLE_NAMES[table], "foo", values);
resultUri = ContentUris.withAppendedId(uri, longId);
switch(match) {
+ case MESSAGE:
+ if (!uri.getBooleanQueryParameter(IS_UIPROVIDER, false)) {
+ notifyUIConversationMailbox(values.getAsLong(Message.MAILBOX_KEY));
+ }
+ break;
case MAILBOX:
if (values.containsKey(MailboxColumns.TYPE)) {
// Only cache special mailbox types
@@ -1626,6 +1063,11 @@ public class EmailProvider extends ContentProvider {
break;
}
}
+ // Notify the account when a new mailbox is added
+ Long accountId = values.getAsLong(MailboxColumns.ACCOUNT_KEY);
+ if (accountId != null && accountId.longValue() > 0) {
+ notifyUI(UIPROVIDER_ACCOUNT_NOTIFIER, accountId);
+ }
//$FALL-THROUGH$
case ACCOUNT:
case HOSTAUTH:
@@ -1648,14 +1090,15 @@ public class EmailProvider extends ContentProvider {
// would if this weren't allowed.
if (match == UPDATED_MESSAGE || match == DELETED_MESSAGE) {
throw new IllegalArgumentException("Unknown URL " + uri);
- }
- if (match == ATTACHMENT) {
+ } else if (match == ATTACHMENT) {
int flags = 0;
if (values.containsKey(Attachment.FLAGS)) {
flags = values.getAsInteger(Attachment.FLAGS);
}
// Report all new attachments to the download service
mAttachmentService.attachmentChanged(getContext(), longId, flags);
+ } else if (match == ACCOUNT) {
+ resolver.notifyChange(UIPROVIDER_ACCOUNTS_NOTIFIER, null);
}
break;
case MAILBOX_ID:
@@ -1698,6 +1141,7 @@ public class EmailProvider extends ContentProvider {
@Override
public boolean onCreate() {
+ MailActivityEmail.setServicesEnabledAsync(getContext());
checkDatabases();
return false;
}
@@ -1729,12 +1173,11 @@ public class EmailProvider extends ContentProvider {
bodyFile.delete();
}
}
-
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
long time = 0L;
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
time = System.nanoTime();
}
Cursor c = null;
@@ -1783,6 +1226,45 @@ public class EmailProvider extends ContentProvider {
try {
switch (match) {
+ // First, dispatch queries from UnfiedEmail
+ case UI_SEARCH:
+ return uiSearch(uri, projection);
+ case UI_ACCTS:
+ c = uiAccounts(projection);
+ return c;
+ case UI_UNDO:
+ return uiUndo(projection);
+ case UI_SUBFOLDERS:
+ case UI_MESSAGES:
+ case UI_MESSAGE:
+ case UI_FOLDER:
+ case UI_ACCOUNT:
+ case UI_ATTACHMENT:
+ case UI_ATTACHMENTS:
+ case UI_CONVERSATION:
+ case UI_RECENT_FOLDERS:
+ case UI_ALL_FOLDERS:
+ // For now, we don't allow selection criteria within these queries
+ if (selection != null || selectionArgs != null) {
+ throw new IllegalArgumentException("UI queries can't have selection/args");
+ }
+ c = uiQuery(match, uri, projection);
+ return c;
+ case UI_FOLDERS:
+ c = uiFolders(uri, projection);
+ return c;
+ case UI_FOLDER_LOAD_MORE:
+ c = uiFolderLoadMore(uri);
+ return c;
+ case UI_FOLDER_REFRESH:
+ c = uiFolderRefresh(uri);
+ return c;
+ case MAILBOX_NOTIFICATION:
+ c = notificationQuery(uri);
+ return c;
+ case MAILBOX_MOST_RECENT_MESSAGE:
+ c = mostRecentMessageQuery(uri);
+ return c;
case ACCOUNT_DEFAULT_ID:
// Start with a snapshot of the cache
Map<String, Cursor> accountCache = mCacheAccount.getSnapshot();
@@ -1899,7 +1381,7 @@ public class EmailProvider extends ContentProvider {
e.printStackTrace();
throw e;
} finally {
- if (cache != null && c != null && Email.DEBUG) {
+ if (cache != null && c != null && MailActivityEmail.DEBUG) {
cache.recordQueryTime(c, System.nanoTime() - time);
}
if (c == null) {
@@ -1977,72 +1459,84 @@ public class EmailProvider extends ContentProvider {
*/
private static int copyAccountTables(SQLiteDatabase fromDatabase, SQLiteDatabase toDatabase) {
if (fromDatabase == null || toDatabase == null) return -1;
+
+ // Lock both databases; for the "from" database, we don't want anyone changing it from
+ // under us; for the "to" database, we want to make the operation atomic
int copyCount = 0;
+ fromDatabase.beginTransaction();
try {
- // Lock both databases; for the "from" database, we don't want anyone changing it from
- // under us; for the "to" database, we want to make the operation atomic
- fromDatabase.beginTransaction();
toDatabase.beginTransaction();
- // Delete anything hanging around here
- toDatabase.delete(Account.TABLE_NAME, null, null);
- toDatabase.delete(HostAuth.TABLE_NAME, null, null);
- // Get our account cursor
- Cursor c = fromDatabase.query(Account.TABLE_NAME, Account.CONTENT_PROJECTION,
- null, null, null, null, null);
- boolean noErrors = true;
try {
- // Loop through accounts, copying them and associated host auth's
- while (c.moveToNext()) {
- Account account = new Account();
- account.restore(c);
-
- // Clear security sync key and sync key, as these were specific to the state of
- // the account, and we've reset that...
- // Clear policy key so that we can re-establish policies from the server
- // TODO This is pretty EAS specific, but there's a lot of that around
- account.mSecuritySyncKey = null;
- account.mSyncKey = null;
- account.mPolicyKey = 0;
-
- // Copy host auth's and update foreign keys
- HostAuth hostAuth = restoreHostAuth(fromDatabase, account.mHostAuthKeyRecv);
- // The account might have gone away, though very unlikely
- if (hostAuth == null) continue;
- account.mHostAuthKeyRecv = toDatabase.insert(HostAuth.TABLE_NAME, null,
- hostAuth.toContentValues());
- // EAS accounts have no send HostAuth
- if (account.mHostAuthKeySend > 0) {
- hostAuth = restoreHostAuth(fromDatabase, account.mHostAuthKeySend);
- // Belt and suspenders; I can't imagine that this is possible, since we
- // checked the validity of the account above, and the database is now locked
+ // Delete anything hanging around here
+ toDatabase.delete(Account.TABLE_NAME, null, null);
+ toDatabase.delete(HostAuth.TABLE_NAME, null, null);
+
+ // Get our account cursor
+ Cursor c = fromDatabase.query(Account.TABLE_NAME, Account.CONTENT_PROJECTION,
+ null, null, null, null, null);
+ if (c == null) return 0;
+ Log.d(TAG, "fromDatabase accounts: " + c.getCount());
+ try {
+ // Loop through accounts, copying them and associated host auth's
+ while (c.moveToNext()) {
+ Account account = new Account();
+ account.restore(c);
+
+ // Clear security sync key and sync key, as these were specific to the
+ // state of the account, and we've reset that...
+ // Clear policy key so that we can re-establish policies from the server
+ // TODO This is pretty EAS specific, but there's a lot of that around
+ account.mSecuritySyncKey = null;
+ account.mSyncKey = null;
+ account.mPolicyKey = 0;
+
+ // Copy host auth's and update foreign keys
+ HostAuth hostAuth = restoreHostAuth(fromDatabase,
+ account.mHostAuthKeyRecv);
+
+ // The account might have gone away, though very unlikely
if (hostAuth == null) continue;
- account.mHostAuthKeySend = toDatabase.insert(HostAuth.TABLE_NAME, null,
+ account.mHostAuthKeyRecv = toDatabase.insert(HostAuth.TABLE_NAME, null,
hostAuth.toContentValues());
+
+ // EAS accounts have no send HostAuth
+ if (account.mHostAuthKeySend > 0) {
+ hostAuth = restoreHostAuth(fromDatabase, account.mHostAuthKeySend);
+ // Belt and suspenders; I can't imagine that this is possible,
+ // since we checked the validity of the account above, and the
+ // database is now locked
+ if (hostAuth == null) continue;
+ account.mHostAuthKeySend = toDatabase.insert(
+ HostAuth.TABLE_NAME, null, hostAuth.toContentValues());
+ }
+
+ // Now, create the account in the "to" database
+ toDatabase.insert(Account.TABLE_NAME, null, account.toContentValues());
+ copyCount++;
}
- // Now, create the account in the "to" database
- toDatabase.insert(Account.TABLE_NAME, null, account.toContentValues());
- copyCount++;
+ } finally {
+ c.close();
}
- } catch (SQLiteException e) {
- noErrors = false;
- copyCount = -1;
+
+ // Say it's ok to commit
+ toDatabase.setTransactionSuccessful();
} finally {
- fromDatabase.endTransaction();
- if (noErrors) {
- // Say it's ok to commit
- toDatabase.setTransactionSuccessful();
- }
+ // STOPSHIP: Remove logging here and in at endTransaction() below
+ Log.d(TAG, "ending toDatabase transaction; copyCount = " + copyCount);
toDatabase.endTransaction();
- c.close();
}
- } catch (SQLiteException e) {
+ } catch (SQLiteException ex) {
+ Log.w(TAG, "Exception while copying account tables", ex);
copyCount = -1;
+ } finally {
+ Log.d(TAG, "ending fromDatabase transaction; copyCount = " + copyCount);
+ fromDatabase.endTransaction();
}
return copyCount;
}
private static SQLiteDatabase getBackupDatabase(Context context) {
- DatabaseHelper helper = new DatabaseHelper(context, BACKUP_DATABASE_NAME);
+ DBHelper.DatabaseHelper helper = new DBHelper.DatabaseHelper(context, BACKUP_DATABASE_NAME);
return helper.getWritableDatabase();
}
@@ -2050,7 +1544,7 @@ public class EmailProvider extends ContentProvider {
* Backup account data, returning the number of accounts backed up
*/
private static int backupAccounts(Context context, SQLiteDatabase mainDatabase) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "backupAccounts...");
}
SQLiteDatabase backupDatabase = getBackupDatabase(context);
@@ -2058,7 +1552,7 @@ public class EmailProvider extends ContentProvider {
int numBackedUp = copyAccountTables(mainDatabase, backupDatabase);
if (numBackedUp < 0) {
Log.e(TAG, "Account backup failed!");
- } else if (Email.DEBUG) {
+ } else if (MailActivityEmail.DEBUG) {
Log.d(TAG, "Backed up " + numBackedUp + " accounts...");
}
return numBackedUp;
@@ -2073,7 +1567,7 @@ public class EmailProvider extends ContentProvider {
* Restore account data, returning the number of accounts restored
*/
private static int restoreAccounts(Context context, SQLiteDatabase mainDatabase) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "restoreAccounts...");
}
SQLiteDatabase backupDatabase = getBackupDatabase(context);
@@ -2083,7 +1577,7 @@ public class EmailProvider extends ContentProvider {
Log.e(TAG, "Recovered " + numRecovered + " accounts!");
} else if (numRecovered < 0) {
Log.e(TAG, "Account recovery failed?");
- } else if (Email.DEBUG) {
+ } else if (MailActivityEmail.DEBUG) {
Log.d(TAG, "No accounts to restore...");
}
return numRecovered;
@@ -2094,6 +1588,12 @@ public class EmailProvider extends ContentProvider {
}
}
+ // select count(*) from (select count(*) as dupes from Mailbox where accountKey=?
+ // group by serverId) where dupes > 1;
+ private static final String ACCOUNT_INTEGRITY_SQL =
+ "select count(*) from (select count(*) as dupes from " + Mailbox.TABLE_NAME +
+ " where accountKey=? group by " + MailboxColumns.SERVER_ID + ") where dupes > 1";
+
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
// Handle this special case the fastest possible way
@@ -2127,8 +1627,44 @@ public class EmailProvider extends ContentProvider {
String id = "0";
try {
+ if (match == MESSAGE_ID || match == SYNCED_MESSAGE_ID) {
+ if (!uri.getBooleanQueryParameter(IS_UIPROVIDER, false)) {
+ notifyUIConversation(uri);
+ }
+ }
outer:
switch (match) {
+ case UI_FOLDER:
+ return uiUpdateFolder(uri, values);
+ case UI_RECENT_FOLDERS:
+ return uiUpdateRecentFolders(uri, values);
+ case UI_DEFAULT_RECENT_FOLDERS:
+ return uiPopulateRecentFolders(uri);
+ case UI_ATTACHMENT:
+ return uiUpdateAttachment(uri, values);
+ case UI_UPDATEDRAFT:
+ return uiUpdateDraft(uri, values);
+ case UI_SENDDRAFT:
+ return uiSendDraft(uri, values);
+ case UI_MESSAGE:
+ return uiUpdateMessage(uri, values);
+ case ACCOUNT_CHECK:
+ id = uri.getLastPathSegment();
+ // With any error, return 1 (a failure)
+ int res = 1;
+ Cursor ic = null;
+ try {
+ ic = db.rawQuery(ACCOUNT_INTEGRITY_SQL, new String[] {id});
+ if (ic.moveToFirst()) {
+ res = ic.getInt(0);
+ }
+ } finally {
+ if (ic != null) {
+ ic.close();
+ }
+ }
+ // Count of duplicated mailboxes
+ return res;
case MAILBOX_ID_ADD_TO_FIELD:
case ACCOUNT_ID_ADD_TO_FIELD:
id = uri.getPathSegments().get(1);
@@ -2206,11 +1742,27 @@ outer:
}
}
if (match == ATTACHMENT_ID) {
+ long attId = Integer.parseInt(id);
if (values.containsKey(Attachment.FLAGS)) {
int flags = values.getAsInteger(Attachment.FLAGS);
- mAttachmentService.attachmentChanged(getContext(),
- Integer.parseInt(id), flags);
+ mAttachmentService.attachmentChanged(context, attId, flags);
+ }
+ // Notify UI if necessary; there are only two columns we can change that
+ // would be worth a notification
+ if (values.containsKey(AttachmentColumns.UI_STATE) ||
+ values.containsKey(AttachmentColumns.UI_DOWNLOADED_SIZE)) {
+ // Notify on individual attachment
+ notifyUI(UIPROVIDER_ATTACHMENT_NOTIFIER, id);
+ Attachment att = Attachment.restoreAttachmentWithId(context, attId);
+ if (att != null) {
+ // And on owning Message
+ notifyUI(UIPROVIDER_ATTACHMENTS_NOTIFIER, att.mMessageKey);
+ }
}
+ } else if (match == MAILBOX_ID && values.containsKey(Mailbox.UI_SYNC_STATUS)) {
+ notifyUI(UIPROVIDER_FOLDER_NOTIFIER, id);
+ } else if (match == ACCOUNT_ID) {
+ notifyUI(UIPROVIDER_ACCOUNT_NOTIFIER, id);
}
break;
case BODY:
@@ -2385,284 +1937,2131 @@ outer:
}
}
- /** Counts the number of messages in each mailbox, and updates the message count column. */
+ /**
+ * For testing purposes, check whether a given row is cached
+ * @param baseUri the base uri of the EmailContent
+ * @param id the row id of the EmailContent
+ * @return whether or not the row is currently cached
+ */
@VisibleForTesting
- static void recalculateMessageCount(SQLiteDatabase db) {
- db.execSQL("update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT +
- "= (select count(*) from " + Message.TABLE_NAME +
- " where " + Message.MAILBOX_KEY + " = " +
- Mailbox.TABLE_NAME + "." + EmailContent.RECORD_ID + ")");
+ protected boolean isCached(Uri baseUri, long id) {
+ int match = findMatch(baseUri, "isCached");
+ int table = match >> BASE_SHIFT;
+ ContentCache cache = mContentCaches[table];
+ if (cache == null) return false;
+ Cursor cc = cache.get(Long.toString(id));
+ return (cc != null);
}
- @VisibleForTesting
- @SuppressWarnings("deprecation")
- static void convertPolicyFlagsToPolicyTable(SQLiteDatabase db) {
- Cursor c = db.query(Account.TABLE_NAME,
- new String[] {EmailContent.RECORD_ID /*0*/, AccountColumns.SECURITY_FLAGS /*1*/},
- AccountColumns.SECURITY_FLAGS + ">0", null, null, null, null);
- ContentValues cv = new ContentValues();
- String[] args = new String[1];
- while (c.moveToNext()) {
- long securityFlags = c.getLong(1 /*SECURITY_FLAGS*/);
- Policy policy = LegacyPolicySet.flagsToPolicy(securityFlags);
- long policyId = db.insert(Policy.TABLE_NAME, null, policy.toContentValues());
- cv.put(AccountColumns.POLICY_KEY, policyId);
- cv.putNull(AccountColumns.SECURITY_FLAGS);
- args[0] = Long.toString(c.getLong(0 /*RECORD_ID*/));
- db.update(Account.TABLE_NAME, cv, EmailContent.RECORD_ID + "=?", args);
+ public static interface AttachmentService {
+ /**
+ * Notify the service that an attachment has changed.
+ */
+ void attachmentChanged(Context context, long id, int flags);
+ }
+
+ private final AttachmentService DEFAULT_ATTACHMENT_SERVICE = new AttachmentService() {
+ @Override
+ public void attachmentChanged(Context context, long id, int flags) {
+ // The default implementation delegates to the real service.
+ AttachmentDownloadService.attachmentChanged(context, id, flags);
}
+ };
+ private AttachmentService mAttachmentService = DEFAULT_ATTACHMENT_SERVICE;
+
+ /**
+ * Injects a custom attachment service handler. If null is specified, will reset to the
+ * default service.
+ */
+ public void injectAttachmentService(AttachmentService as) {
+ mAttachmentService = (as == null) ? DEFAULT_ATTACHMENT_SERVICE : as;
}
- /** Upgrades the database from v17 to v18 */
- @VisibleForTesting
- static void upgradeFromVersion17ToVersion18(SQLiteDatabase db) {
- // Copy the displayName column to the serverId column. In v18 of the database,
- // we use the serverId for IMAP/POP3 mailboxes instead of overloading the
- // display name.
- //
- // For posterity; this is the command we're executing:
- //sqlite> UPDATE mailbox SET serverid=displayname WHERE mailbox._id in (
- // ...> SELECT mailbox._id FROM mailbox,account,hostauth WHERE
- // ...> (mailbox.parentkey isnull OR mailbox.parentkey=0) AND
- // ...> mailbox.accountkey=account._id AND
- // ...> account.hostauthkeyrecv=hostauth._id AND
- // ...> (hostauth.protocol='imap' OR hostauth.protocol='pop3'));
- try {
- db.execSQL(
- "UPDATE " + Mailbox.TABLE_NAME + " SET "
- + MailboxColumns.SERVER_ID + "=" + MailboxColumns.DISPLAY_NAME
- + " WHERE "
- + Mailbox.TABLE_NAME + "." + MailboxColumns.ID + " IN ( SELECT "
- + Mailbox.TABLE_NAME + "." + MailboxColumns.ID + " FROM "
- + Mailbox.TABLE_NAME + "," + Account.TABLE_NAME + ","
- + HostAuth.TABLE_NAME + " WHERE "
- + "("
- + Mailbox.TABLE_NAME + "." + MailboxColumns.PARENT_KEY + " isnull OR "
- + Mailbox.TABLE_NAME + "." + MailboxColumns.PARENT_KEY + "=0 "
- + ") AND "
- + Mailbox.TABLE_NAME + "." + MailboxColumns.ACCOUNT_KEY + "="
- + Account.TABLE_NAME + "." + AccountColumns.ID + " AND "
- + Account.TABLE_NAME + "." + AccountColumns.HOST_AUTH_KEY_RECV + "="
- + HostAuth.TABLE_NAME + "." + HostAuthColumns.ID + " AND ( "
- + HostAuth.TABLE_NAME + "." + HostAuthColumns.PROTOCOL + "='imap' OR "
- + HostAuth.TABLE_NAME + "." + HostAuthColumns.PROTOCOL + "='pop3' ) )");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 17 to 18 " + e);
- }
- ContentCache.invalidateAllCaches();
- }
-
- /** Upgrades the database from v20 to v21 */
- private static void upgradeFromVersion20ToVersion21(SQLiteDatabase db) {
+ // SELECT DISTINCT Boxes._id, Boxes.unreadCount count(Message._id) from Message,
+ // (SELECT _id, unreadCount, messageCount, lastNotifiedMessageCount, lastNotifiedMessageKey
+ // FROM Mailbox WHERE accountKey=6 AND ((type = 0) OR (syncInterval!=0 AND syncInterval!=-1)))
+ // AS Boxes
+ // WHERE Boxes.messageCount!=Boxes.lastNotifiedMessageCount
+ // OR (Boxes._id=Message.mailboxKey AND Message._id>Boxes.lastNotifiedMessageKey)
+ // TODO: This query can be simplified a bit
+ private static final String NOTIFICATION_QUERY =
+ "SELECT DISTINCT Boxes." + MailboxColumns.ID + ", Boxes." + MailboxColumns.UNREAD_COUNT +
+ ", count(" + Message.TABLE_NAME + "." + MessageColumns.ID + ")" +
+ " FROM " +
+ Message.TABLE_NAME + "," +
+ "(SELECT " + MailboxColumns.ID + "," + MailboxColumns.UNREAD_COUNT + "," +
+ MailboxColumns.MESSAGE_COUNT + "," + MailboxColumns.LAST_NOTIFIED_MESSAGE_COUNT +
+ "," + MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY + " FROM " + Mailbox.TABLE_NAME +
+ " WHERE " + MailboxColumns.ACCOUNT_KEY + "=?" +
+ " AND (" + MailboxColumns.TYPE + "=" + Mailbox.TYPE_INBOX + " OR ("
+ + MailboxColumns.SYNC_INTERVAL + "!=0 AND " +
+ MailboxColumns.SYNC_INTERVAL + "!=-1))) AS Boxes " +
+ "WHERE Boxes." + MailboxColumns.ID + '=' + Message.TABLE_NAME + "." +
+ MessageColumns.MAILBOX_KEY + " AND " + Message.TABLE_NAME + "." +
+ MessageColumns.ID + ">Boxes." + MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY +
+ " AND " + MessageColumns.FLAG_READ + "=0 AND " + MessageColumns.TIMESTAMP + "!=0";
+
+ public Cursor notificationQuery(Uri uri) {
+ SQLiteDatabase db = getDatabase(getContext());
+ String accountId = uri.getLastPathSegment();
+ return db.rawQuery(NOTIFICATION_QUERY, new String[] {accountId});
+ }
+
+ public Cursor mostRecentMessageQuery(Uri uri) {
+ SQLiteDatabase db = getDatabase(getContext());
+ String mailboxId = uri.getLastPathSegment();
+ return db.rawQuery("select max(_id) from Message where mailboxKey=?",
+ new String[] {mailboxId});
+ }
+
+ /**
+ * Support for UnifiedEmail below
+ */
+
+ private static final String NOT_A_DRAFT_STRING =
+ Integer.toString(UIProvider.DraftType.NOT_A_DRAFT);
+
+ private static final String CONVERSATION_FLAGS =
+ "CASE WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_INCOMING_MEETING_INVITE +
+ ") !=0 THEN " + UIProvider.ConversationFlags.CALENDAR_INVITE +
+ " ELSE 0 END + " +
+ "CASE WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_FORWARDED +
+ ") !=0 THEN " + UIProvider.ConversationFlags.FORWARDED +
+ " ELSE 0 END + " +
+ "CASE WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_REPLIED_TO +
+ ") !=0 THEN " + UIProvider.ConversationFlags.REPLIED +
+ " ELSE 0 END";
+
+ /**
+ * Array of pre-defined account colors (legacy colors from old email app)
+ */
+ private static final int[] ACCOUNT_COLORS = new int[] {
+ 0xff71aea7, 0xff621919, 0xff18462f, 0xffbf8e52, 0xff001f79,
+ 0xffa8afc2, 0xff6b64c4, 0xff738359, 0xff9d50a4
+ };
+
+ private static final String CONVERSATION_COLOR =
+ "@CASE (" + MessageColumns.ACCOUNT_KEY + " - 1) % " + ACCOUNT_COLORS.length +
+ " WHEN 0 THEN " + ACCOUNT_COLORS[0] +
+ " WHEN 1 THEN " + ACCOUNT_COLORS[1] +
+ " WHEN 2 THEN " + ACCOUNT_COLORS[2] +
+ " WHEN 3 THEN " + ACCOUNT_COLORS[3] +
+ " WHEN 4 THEN " + ACCOUNT_COLORS[4] +
+ " WHEN 5 THEN " + ACCOUNT_COLORS[5] +
+ " WHEN 6 THEN " + ACCOUNT_COLORS[6] +
+ " WHEN 7 THEN " + ACCOUNT_COLORS[7] +
+ " WHEN 8 THEN " + ACCOUNT_COLORS[8] +
+ " END";
+
+ private static final String ACCOUNT_COLOR =
+ "@CASE (" + AccountColumns.ID + " - 1) % " + ACCOUNT_COLORS.length +
+ " WHEN 0 THEN " + ACCOUNT_COLORS[0] +
+ " WHEN 1 THEN " + ACCOUNT_COLORS[1] +
+ " WHEN 2 THEN " + ACCOUNT_COLORS[2] +
+ " WHEN 3 THEN " + ACCOUNT_COLORS[3] +
+ " WHEN 4 THEN " + ACCOUNT_COLORS[4] +
+ " WHEN 5 THEN " + ACCOUNT_COLORS[5] +
+ " WHEN 6 THEN " + ACCOUNT_COLORS[6] +
+ " WHEN 7 THEN " + ACCOUNT_COLORS[7] +
+ " WHEN 8 THEN " + ACCOUNT_COLORS[8] +
+ " END";
+ /**
+ * Mapping of UIProvider columns to EmailProvider columns for the message list (called the
+ * conversation list in UnifiedEmail)
+ */
+ private static final ProjectionMap sMessageListMap = ProjectionMap.builder()
+ .add(BaseColumns._ID, MessageColumns.ID)
+ .add(UIProvider.ConversationColumns.URI, uriWithId("uimessage"))
+ .add(UIProvider.ConversationColumns.MESSAGE_LIST_URI, uriWithId("uimessage"))
+ .add(UIProvider.ConversationColumns.SUBJECT, MessageColumns.SUBJECT)
+ .add(UIProvider.ConversationColumns.SNIPPET, MessageColumns.SNIPPET)
+ .add(UIProvider.ConversationColumns.SENDER_INFO, MessageColumns.FROM_LIST)
+ .add(UIProvider.ConversationColumns.DATE_RECEIVED_MS, MessageColumns.TIMESTAMP)
+ .add(UIProvider.ConversationColumns.HAS_ATTACHMENTS, MessageColumns.FLAG_ATTACHMENT)
+ .add(UIProvider.ConversationColumns.NUM_MESSAGES, "1")
+ .add(UIProvider.ConversationColumns.NUM_DRAFTS, "0")
+ .add(UIProvider.ConversationColumns.SENDING_STATE,
+ Integer.toString(ConversationSendingState.OTHER))
+ .add(UIProvider.ConversationColumns.PRIORITY, Integer.toString(ConversationPriority.LOW))
+ .add(UIProvider.ConversationColumns.READ, MessageColumns.FLAG_READ)
+ .add(UIProvider.ConversationColumns.STARRED, MessageColumns.FLAG_FAVORITE)
+ .add(UIProvider.ConversationColumns.FOLDER_LIST,
+ "'content://" + EmailContent.AUTHORITY + "/uifolder/' || "
+ + MessageColumns.MAILBOX_KEY)
+ .add(UIProvider.ConversationColumns.FLAGS, CONVERSATION_FLAGS)
+ .add(UIProvider.ConversationColumns.ACCOUNT_URI,
+ "'content://" + EmailContent.AUTHORITY + "/uiaccount/' || "
+ + MessageColumns.ACCOUNT_KEY)
+ .build();
+
+ /**
+ * Generate UIProvider draft type; note the test for "reply all" must come before "reply"
+ */
+ private static final String MESSAGE_DRAFT_TYPE =
+ "CASE WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_TYPE_ORIGINAL +
+ ") !=0 THEN " + UIProvider.DraftType.COMPOSE +
+ " WHEN (" + MessageColumns.FLAGS + "&" + (1<<20) +
+ ") !=0 THEN " + UIProvider.DraftType.REPLY_ALL +
+ " WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_TYPE_REPLY +
+ ") !=0 THEN " + UIProvider.DraftType.REPLY +
+ " WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_TYPE_FORWARD +
+ ") !=0 THEN " + UIProvider.DraftType.FORWARD +
+ " ELSE " + UIProvider.DraftType.NOT_A_DRAFT + " END";
+
+ private static final String MESSAGE_FLAGS =
+ "CASE WHEN (" + MessageColumns.FLAGS + "&" + Message.FLAG_INCOMING_MEETING_INVITE +
+ ") !=0 THEN " + UIProvider.MessageFlags.CALENDAR_INVITE +
+ " ELSE 0 END";
+
+ /**
+ * Mapping of UIProvider columns to EmailProvider columns for a detailed message view in
+ * UnifiedEmail
+ */
+ private static final ProjectionMap sMessageViewMap = ProjectionMap.builder()
+ .add(BaseColumns._ID, Message.TABLE_NAME + "." + EmailContent.MessageColumns.ID)
+ .add(UIProvider.MessageColumns.SERVER_ID, SyncColumns.SERVER_ID)
+ .add(UIProvider.MessageColumns.URI, uriWithFQId("uimessage", Message.TABLE_NAME))
+ .add(UIProvider.MessageColumns.CONVERSATION_ID,
+ uriWithFQId("uimessage", Message.TABLE_NAME))
+ .add(UIProvider.MessageColumns.SUBJECT, EmailContent.MessageColumns.SUBJECT)
+ .add(UIProvider.MessageColumns.SNIPPET, EmailContent.MessageColumns.SNIPPET)
+ .add(UIProvider.MessageColumns.FROM, EmailContent.MessageColumns.FROM_LIST)
+ .add(UIProvider.MessageColumns.TO, EmailContent.MessageColumns.TO_LIST)
+ .add(UIProvider.MessageColumns.CC, EmailContent.MessageColumns.CC_LIST)
+ .add(UIProvider.MessageColumns.BCC, EmailContent.MessageColumns.BCC_LIST)
+ .add(UIProvider.MessageColumns.REPLY_TO, EmailContent.MessageColumns.REPLY_TO_LIST)
+ .add(UIProvider.MessageColumns.DATE_RECEIVED_MS, EmailContent.MessageColumns.TIMESTAMP)
+ .add(UIProvider.MessageColumns.BODY_HTML, Body.HTML_CONTENT)
+ .add(UIProvider.MessageColumns.BODY_TEXT, Body.TEXT_CONTENT)
+ .add(UIProvider.MessageColumns.REF_MESSAGE_ID, "0")
+ .add(UIProvider.MessageColumns.DRAFT_TYPE, NOT_A_DRAFT_STRING)
+ .add(UIProvider.MessageColumns.APPEND_REF_MESSAGE_CONTENT, "0")
+ .add(UIProvider.MessageColumns.HAS_ATTACHMENTS, EmailContent.MessageColumns.FLAG_ATTACHMENT)
+ .add(UIProvider.MessageColumns.ATTACHMENT_LIST_URI,
+ uriWithFQId("uiattachments", Message.TABLE_NAME))
+ .add(UIProvider.MessageColumns.MESSAGE_FLAGS, MESSAGE_FLAGS)
+ .add(UIProvider.MessageColumns.SAVE_MESSAGE_URI,
+ uriWithFQId("uiupdatedraft", Message.TABLE_NAME))
+ .add(UIProvider.MessageColumns.SEND_MESSAGE_URI,
+ uriWithFQId("uisenddraft", Message.TABLE_NAME))
+ .add(UIProvider.MessageColumns.DRAFT_TYPE, MESSAGE_DRAFT_TYPE)
+ .add(UIProvider.MessageColumns.MESSAGE_ACCOUNT_URI,
+ uriWithColumn("account", MessageColumns.ACCOUNT_KEY))
+ .add(UIProvider.MessageColumns.STARRED, EmailContent.MessageColumns.FLAG_FAVORITE)
+ .add(UIProvider.MessageColumns.READ, EmailContent.MessageColumns.FLAG_READ)
+ .build();
+
+ /**
+ * Generate UIProvider folder capabilities from mailbox flags
+ */
+ private static final String FOLDER_CAPABILITIES =
+ "CASE WHEN (" + MailboxColumns.FLAGS + "&" + Mailbox.FLAG_ACCEPTS_MOVED_MAIL +
+ ") !=0 THEN " + UIProvider.FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES +
+ " ELSE 0 END";
+
+ /**
+ * Convert EmailProvider type to UIProvider type
+ */
+ private static final String FOLDER_TYPE = "CASE " + MailboxColumns.TYPE
+ + " WHEN " + Mailbox.TYPE_INBOX + " THEN " + UIProvider.FolderType.INBOX
+ + " WHEN " + Mailbox.TYPE_DRAFTS + " THEN " + UIProvider.FolderType.DRAFT
+ + " WHEN " + Mailbox.TYPE_OUTBOX + " THEN " + UIProvider.FolderType.OUTBOX
+ + " WHEN " + Mailbox.TYPE_SENT + " THEN " + UIProvider.FolderType.SENT
+ + " WHEN " + Mailbox.TYPE_TRASH + " THEN " + UIProvider.FolderType.TRASH
+ + " WHEN " + Mailbox.TYPE_JUNK + " THEN " + UIProvider.FolderType.SPAM
+ + " WHEN " + Mailbox.TYPE_STARRED + " THEN " + UIProvider.FolderType.STARRED
+ + " ELSE " + UIProvider.FolderType.DEFAULT + " END";
+
+ private static final String FOLDER_ICON = "CASE " + MailboxColumns.TYPE
+ + " WHEN " + Mailbox.TYPE_INBOX + " THEN " + R.drawable.ic_folder_inbox_holo_light
+ + " WHEN " + Mailbox.TYPE_DRAFTS + " THEN " + R.drawable.ic_folder_drafts_holo_light
+ + " WHEN " + Mailbox.TYPE_OUTBOX + " THEN " + R.drawable.ic_folder_outbox_holo_light
+ + " WHEN " + Mailbox.TYPE_SENT + " THEN " + R.drawable.ic_folder_sent_holo_light
+ + " WHEN " + Mailbox.TYPE_STARRED + " THEN " + R.drawable.ic_menu_star_holo_light
+ + " ELSE -1 END";
+
+ private static final ProjectionMap sFolderListMap = ProjectionMap.builder()
+ .add(BaseColumns._ID, MailboxColumns.ID)
+ .add(UIProvider.FolderColumns.URI, uriWithId("uifolder"))
+ .add(UIProvider.FolderColumns.NAME, "displayName")
+ .add(UIProvider.FolderColumns.HAS_CHILDREN,
+ MailboxColumns.FLAGS + "&" + Mailbox.FLAG_HAS_CHILDREN)
+ .add(UIProvider.FolderColumns.CAPABILITIES, FOLDER_CAPABILITIES)
+ .add(UIProvider.FolderColumns.SYNC_WINDOW, "3")
+ .add(UIProvider.FolderColumns.CONVERSATION_LIST_URI, uriWithId("uimessages"))
+ .add(UIProvider.FolderColumns.CHILD_FOLDERS_LIST_URI, uriWithId("uisubfolders"))
+ .add(UIProvider.FolderColumns.UNREAD_COUNT, MailboxColumns.UNREAD_COUNT)
+ .add(UIProvider.FolderColumns.TOTAL_COUNT, MailboxColumns.MESSAGE_COUNT)
+ .add(UIProvider.FolderColumns.REFRESH_URI, uriWithId("uirefresh"))
+ .add(UIProvider.FolderColumns.SYNC_STATUS, MailboxColumns.UI_SYNC_STATUS)
+ .add(UIProvider.FolderColumns.LAST_SYNC_RESULT, MailboxColumns.UI_LAST_SYNC_RESULT)
+ .add(UIProvider.FolderColumns.TYPE, FOLDER_TYPE)
+ .add(UIProvider.FolderColumns.ICON_RES_ID, FOLDER_ICON)
+ .add(UIProvider.FolderColumns.HIERARCHICAL_DESC, MailboxColumns.HIERARCHICAL_NAME)
+ .build();
+
+ private static final ProjectionMap sAccountListMap = ProjectionMap.builder()
+ .add(BaseColumns._ID, AccountColumns.ID)
+ .add(UIProvider.AccountColumns.FOLDER_LIST_URI, uriWithId("uifolders"))
+ .add(UIProvider.AccountColumns.FULL_FOLDER_LIST_URI, uriWithId("uiallfolders"))
+ .add(UIProvider.AccountColumns.NAME, AccountColumns.DISPLAY_NAME)
+ .add(UIProvider.AccountColumns.SAVE_DRAFT_URI, uriWithId("uisavedraft"))
+ .add(UIProvider.AccountColumns.SEND_MAIL_URI, uriWithId("uisendmail"))
+ .add(UIProvider.AccountColumns.UNDO_URI,
+ ("'content://" + UIProvider.AUTHORITY + "/uiundo'"))
+ .add(UIProvider.AccountColumns.URI, uriWithId("uiaccount"))
+ .add(UIProvider.AccountColumns.SEARCH_URI, uriWithId("uisearch"))
+ // TODO: Is provider version used?
+ .add(UIProvider.AccountColumns.PROVIDER_VERSION, "1")
+ .add(UIProvider.AccountColumns.SYNC_STATUS, "0")
+ .add(UIProvider.AccountColumns.RECENT_FOLDER_LIST_URI, uriWithId("uirecentfolders"))
+ .add(UIProvider.AccountColumns.DEFAULT_RECENT_FOLDER_LIST_URI,
+ uriWithId("uidefaultrecentfolders"))
+ .add(UIProvider.AccountColumns.SettingsColumns.SIGNATURE, AccountColumns.SIGNATURE)
+ .add(UIProvider.AccountColumns.SettingsColumns.SNAP_HEADERS,
+ Integer.toString(UIProvider.SnapHeaderValue.ALWAYS))
+ .add(UIProvider.AccountColumns.SettingsColumns.REPLY_BEHAVIOR,
+ Integer.toString(UIProvider.DefaultReplyBehavior.REPLY))
+ .add(UIProvider.AccountColumns.SettingsColumns.CONFIRM_ARCHIVE, "0")
+ .build();
+
+ /**
+ * The "ORDER BY" clause for top level folders
+ */
+ private static final String MAILBOX_ORDER_BY = "CASE " + MailboxColumns.TYPE
+ + " WHEN " + Mailbox.TYPE_INBOX + " THEN 0"
+ + " WHEN " + Mailbox.TYPE_DRAFTS + " THEN 1"
+ + " WHEN " + Mailbox.TYPE_OUTBOX + " THEN 2"
+ + " WHEN " + Mailbox.TYPE_SENT + " THEN 3"
+ + " WHEN " + Mailbox.TYPE_TRASH + " THEN 4"
+ + " WHEN " + Mailbox.TYPE_JUNK + " THEN 5"
+ // Other mailboxes (i.e. of Mailbox.TYPE_MAIL) are shown in alphabetical order.
+ + " ELSE 10 END"
+ + " ," + MailboxColumns.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
+
+ /**
+ * Mapping of UIProvider columns to EmailProvider columns for a message's attachments
+ */
+ private static final ProjectionMap sAttachmentMap = ProjectionMap.builder()
+ .add(UIProvider.AttachmentColumns.NAME, AttachmentColumns.FILENAME)
+ .add(UIProvider.AttachmentColumns.SIZE, AttachmentColumns.SIZE)
+ .add(UIProvider.AttachmentColumns.URI, uriWithId("uiattachment"))
+ .add(UIProvider.AttachmentColumns.CONTENT_TYPE, AttachmentColumns.MIME_TYPE)
+ .add(UIProvider.AttachmentColumns.STATE, AttachmentColumns.UI_STATE)
+ .add(UIProvider.AttachmentColumns.DESTINATION, AttachmentColumns.UI_DESTINATION)
+ .add(UIProvider.AttachmentColumns.DOWNLOADED_SIZE, AttachmentColumns.UI_DOWNLOADED_SIZE)
+ .add(UIProvider.AttachmentColumns.CONTENT_URI, AttachmentColumns.CONTENT_URI)
+ .build();
+
+ /**
+ * Generate the SELECT clause using a specified mapping and the original UI projection
+ * @param map the ProjectionMap to use for this projection
+ * @param projection the projection as sent by UnifiedEmail
+ * @param values ContentValues to be used if the ProjectionMap entry is null
+ * @return a StringBuilder containing the SELECT expression for a SQLite query
+ */
+ private StringBuilder genSelect(ProjectionMap map, String[] projection) {
+ return genSelect(map, projection, EMPTY_CONTENT_VALUES);
+ }
+
+ private StringBuilder genSelect(ProjectionMap map, String[] projection, ContentValues values) {
+ StringBuilder sb = new StringBuilder("SELECT ");
+ boolean first = true;
+ for (String column: projection) {
+ if (first) {
+ first = false;
+ } else {
+ sb.append(',');
+ }
+ String val = null;
+ // First look at values; this is an override of default behavior
+ if (values.containsKey(column)) {
+ String value = values.getAsString(column);
+ if (value.startsWith("@")) {
+ val = value.substring(1) + " AS " + column;
+ } else {
+ val = "'" + values.getAsString(column) + "' AS " + column;
+ }
+ } else {
+ // Now, get the standard value for the column from our projection map
+ val = map.get(column);
+ // If we don't have the column, return "NULL AS <column>", and warn
+ if (val == null) {
+ val = "NULL AS " + column;
+ }
+ }
+ sb.append(val);
+ }
+ return sb;
+ }
+
+ /**
+ * Convenience method to create a Uri string given the "type" of query; we append the type
+ * of the query and the id column name (_id)
+ *
+ * @param type the "type" of the query, as defined by our UriMatcher definitions
+ * @return a Uri string
+ */
+ private static String uriWithId(String type) {
+ return uriWithColumn(type, EmailContent.RECORD_ID);
+ }
+
+ /**
+ * Convenience method to create a Uri string given the "type" of query; we append the type
+ * of the query and the passed in column name
+ *
+ * @param type the "type" of the query, as defined by our UriMatcher definitions
+ * @param columnName the column in the table being queried
+ * @return a Uri string
+ */
+ private static String uriWithColumn(String type, String columnName) {
+ return "'content://" + EmailContent.AUTHORITY + "/" + type + "/' || " + columnName;
+ }
+
+ /**
+ * Convenience method to create a Uri string given the "type" of query and the table name to
+ * which it applies; we append the type of the query and the fully qualified (FQ) id column
+ * (i.e. including the table name); we need this for join queries where _id would otherwise
+ * be ambiguous
+ *
+ * @param type the "type" of the query, as defined by our UriMatcher definitions
+ * @param tableName the name of the table whose _id is referred to
+ * @return a Uri string
+ */
+ private static String uriWithFQId(String type, String tableName) {
+ return "'content://" + EmailContent.AUTHORITY + "/" + type + "/' || " + tableName + "._id";
+ }
+
+ // Regex that matches start of img tag. '<(?i)img\s+'.
+ private static final Pattern IMG_TAG_START_REGEX = Pattern.compile("<(?i)img\\s+");
+
+ /**
+ * Generate the "view message" SQLite query, given a projection from UnifiedEmail
+ *
+ * @param uiProjection as passed from UnifiedEmail
+ * @return the SQLite query to be executed on the EmailProvider database
+ */
+ private String genQueryViewMessage(String[] uiProjection, String id) {
+ Context context = getContext();
+ long messageId = Long.parseLong(id);
+ Message msg = Message.restoreMessageWithId(context, messageId);
+ ContentValues values = new ContentValues();
+ if (msg != null) {
+ if (msg.mFlagLoaded == Message.FLAG_LOADED_PARTIAL) {
+ EmailServiceProxy service =
+ EmailServiceUtils.getServiceForAccount(context, null, msg.mAccountKey);
+ try {
+ service.loadMore(messageId);
+ } catch (RemoteException e) {
+ // Nothing to do
+ }
+ }
+ Body body = Body.restoreBodyWithMessageId(context, messageId);
+ if (body != null) {
+ if (body.mHtmlContent != null) {
+ if (IMG_TAG_START_REGEX.matcher(body.mHtmlContent).find()) {
+ values.put(UIProvider.MessageColumns.EMBEDS_EXTERNAL_RESOURCES, 1);
+ }
+ }
+ }
+ Address[] fromList = Address.unpack(msg.mFrom);
+ int autoShowImages = 0;
+ Preferences prefs = Preferences.getPreferences(context);
+ for (Address sender : fromList) {
+ String email = sender.getAddress();
+ if (prefs.shouldShowImagesFor(email)) {
+ autoShowImages = 1;
+ break;
+ }
+ }
+ values.put(UIProvider.MessageColumns.ALWAYS_SHOW_IMAGES, autoShowImages);
+ // Add attachments...
+ Attachment[] atts = Attachment.restoreAttachmentsWithMessageId(context, messageId);
+ if (atts.length > 0) {
+ ArrayList<com.android.mail.providers.Attachment> uiAtts =
+ new ArrayList<com.android.mail.providers.Attachment>();
+ for (Attachment att : atts) {
+ if (att.mContentId != null && att.mContentUri != null) {
+ continue;
+ }
+ com.android.mail.providers.Attachment uiAtt =
+ new com.android.mail.providers.Attachment();
+ uiAtt.name = att.mFileName;
+ uiAtt.contentType = att.mMimeType;
+ uiAtt.size = (int) att.mSize;
+ uiAtt.uri = uiUri("uiattachment", att.mId);
+ uiAtts.add(uiAtt);
+ }
+ values.put(UIProvider.MessageColumns.ATTACHMENTS,
+ com.android.mail.providers.Attachment.toJSONArray(uiAtts));
+ }
+ if (msg.mDraftInfo != 0) {
+ values.put(UIProvider.MessageColumns.APPEND_REF_MESSAGE_CONTENT,
+ (msg.mDraftInfo & Message.DRAFT_INFO_APPEND_REF_MESSAGE) != 0 ? 1 : 0);
+ values.put(UIProvider.MessageColumns.QUOTE_START_POS,
+ msg.mDraftInfo & Message.DRAFT_INFO_QUOTE_POS_MASK);
+ }
+ }
+ if ((msg.mFlags & Message.FLAG_INCOMING_MEETING_INVITE) != 0) {
+ values.put(UIProvider.MessageColumns.EVENT_INTENT_URI,
+ "content://ui.email2.android.com/event/" + msg.mId);
+ }
+ StringBuilder sb = genSelect(sMessageViewMap, uiProjection, values);
+ sb.append(" FROM " + Message.TABLE_NAME + "," + Body.TABLE_NAME + " WHERE " +
+ Body.MESSAGE_KEY + "=" + Message.TABLE_NAME + "." + Message.RECORD_ID + " AND " +
+ Message.TABLE_NAME + "." + Message.RECORD_ID + "=?");
+ return sb.toString();
+ }
+
+ /**
+ * Generate the "message list" SQLite query, given a projection from UnifiedEmail
+ *
+ * @param uiProjection as passed from UnifiedEmail
+ * @return the SQLite query to be executed on the EmailProvider database
+ */
+ private String genQueryMailboxMessages(String[] uiProjection) {
+ StringBuilder sb = genSelect(sMessageListMap, uiProjection);
+ sb.append(" FROM " + Message.TABLE_NAME + " WHERE " + Message.MAILBOX_KEY + "=? ORDER BY " +
+ MessageColumns.TIMESTAMP + " DESC");
+ return sb.toString();
+ }
+
+ /**
+ * Generate various virtual mailbox SQLite queries, given a projection from UnifiedEmail
+ *
+ * @param uiProjection as passed from UnifiedEmail
+ * @param id the id of the virtual mailbox
+ * @return the SQLite query to be executed on the EmailProvider database
+ */
+ private Cursor getVirtualMailboxMessagesCursor(SQLiteDatabase db, String[] uiProjection,
+ long mailboxId) {
+ ContentValues values = new ContentValues();
+ values.put(UIProvider.ConversationColumns.COLOR, CONVERSATION_COLOR);
+ StringBuilder sb = genSelect(sMessageListMap, uiProjection, values);
+ if (isCombinedMailbox(mailboxId)) {
+ switch (getVirtualMailboxType(mailboxId)) {
+ case Mailbox.TYPE_INBOX:
+ sb.append(" FROM " + Message.TABLE_NAME + " WHERE " +
+ MessageColumns.MAILBOX_KEY + " IN (SELECT " + MailboxColumns.ID +
+ " FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.TYPE +
+ "=" + Mailbox.TYPE_INBOX + ") ORDER BY " + MessageColumns.TIMESTAMP +
+ " DESC");
+ break;
+ case Mailbox.TYPE_STARRED:
+ sb.append(" FROM " + Message.TABLE_NAME + " WHERE " +
+ MessageColumns.FLAG_FAVORITE + "=1 ORDER BY " +
+ MessageColumns.TIMESTAMP + " DESC");
+ break;
+ default:
+ throw new IllegalArgumentException("No virtual mailbox for: " + mailboxId);
+ }
+ return db.rawQuery(sb.toString(), null);
+ } else {
+ switch (getVirtualMailboxType(mailboxId)) {
+ case Mailbox.TYPE_STARRED:
+ sb.append(" FROM " + Message.TABLE_NAME + " WHERE " +
+ MessageColumns.ACCOUNT_KEY + "=? AND " +
+ MessageColumns.FLAG_FAVORITE + "=1 ORDER BY " +
+ MessageColumns.TIMESTAMP + " DESC");
+ break;
+ default:
+ throw new IllegalArgumentException("No virtual mailbox for: " + mailboxId);
+ }
+ return db.rawQuery(sb.toString(),
+ new String[] {getVirtualMailboxAccountIdString(mailboxId)});
+ }
+ }
+
+ /**
+ * Generate the "message list" SQLite query, given a projection from UnifiedEmail
+ *
+ * @param uiProjection as passed from UnifiedEmail
+ * @return the SQLite query to be executed on the EmailProvider database
+ */
+ private String genQueryConversation(String[] uiProjection) {
+ StringBuilder sb = genSelect(sMessageListMap, uiProjection);
+ sb.append(" FROM " + Message.TABLE_NAME + " WHERE " + Message.RECORD_ID + "=?");
+ return sb.toString();
+ }
+
+ /**
+ * Generate the "top level folder list" SQLite query, given a projection from UnifiedEmail
+ *
+ * @param uiProjection as passed from UnifiedEmail
+ * @return the SQLite query to be executed on the EmailProvider database
+ */
+ private String genQueryAccountMailboxes(String[] uiProjection) {
+ StringBuilder sb = genSelect(sFolderListMap, uiProjection);
+ sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.ACCOUNT_KEY +
+ "=? AND " + MailboxColumns.TYPE + " < " + Mailbox.TYPE_NOT_EMAIL +
+ " AND " + MailboxColumns.PARENT_KEY + " < 0 ORDER BY ");
+ sb.append(MAILBOX_ORDER_BY);
+ return sb.toString();
+ }
+
+ /**
+ * Generate the "all folders" SQLite query, given a projection from UnifiedEmail. The list is
+ * sorted by the name as it appears in a hierarchical listing
+ *
+ * @param uiProjection as passed from UnifiedEmail
+ * @return the SQLite query to be executed on the EmailProvider database
+ */
+ private String genQueryAccountAllMailboxes(String[] uiProjection) {
+ StringBuilder sb = genSelect(sFolderListMap, uiProjection);
+ // Use a derived column to choose either hierarchicalName or displayName
+ sb.append(", case when " + MailboxColumns.HIERARCHICAL_NAME + " is null then " +
+ MailboxColumns.DISPLAY_NAME + " else " + MailboxColumns.HIERARCHICAL_NAME +
+ " end as h_name");
+ // Order by the derived column
+ sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.ACCOUNT_KEY +
+ "=? AND " + MailboxColumns.TYPE + " < " + Mailbox.TYPE_NOT_EMAIL +
+ " ORDER BY h_name");
+ return sb.toString();
+ }
+
+ /**
+ * Generate the "recent folder list" SQLite query, given a projection from UnifiedEmail
+ *
+ * @param uiProjection as passed from UnifiedEmail
+ * @return the SQLite query to be executed on the EmailProvider database
+ */
+ private String genQueryRecentMailboxes(String[] uiProjection) {
+ StringBuilder sb = genSelect(sFolderListMap, uiProjection);
+ sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.ACCOUNT_KEY +
+ "=? AND " + MailboxColumns.TYPE + " < " + Mailbox.TYPE_NOT_EMAIL +
+ " AND " + MailboxColumns.PARENT_KEY + " < 0 AND " +
+ MailboxColumns.LAST_TOUCHED_TIME + " > 0 ORDER BY " +
+ MailboxColumns.LAST_TOUCHED_TIME + " DESC");
+ return sb.toString();
+ }
+
+ /**
+ * Generate a "single mailbox" SQLite query, given a projection from UnifiedEmail
+ *
+ * @param uiProjection as passed from UnifiedEmail
+ * @return the SQLite query to be executed on the EmailProvider database
+ */
+ private String genQueryMailbox(String[] uiProjection, String id) {
+ long mailboxId = Long.parseLong(id);
+ ContentValues values = new ContentValues();
+ if (mSearchParams != null && mailboxId == mSearchParams.mSearchMailboxId) {
+ // This is the current search mailbox; use the total count
+ values = new ContentValues();
+ values.put(UIProvider.FolderColumns.TOTAL_COUNT, mSearchParams.mTotalCount);
+ // "load more" is valid for search results
+ values.put(UIProvider.FolderColumns.LOAD_MORE_URI,
+ uiUriString("uiloadmore", mailboxId));
+ } else {
+ Context context = getContext();
+ Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
+ // Make sure we can't get NPE if mailbox has disappeared (the result will end up moot)
+ if (mailbox != null) {
+ String protocol = Account.getProtocol(context, mailbox.mAccountKey);
+ EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, protocol);
+ // "load more" is valid for protocols not supporting "lookback"
+ if (info != null && !info.offerLookback) {
+ values.put(UIProvider.FolderColumns.LOAD_MORE_URI,
+ uiUriString("uiloadmore", mailboxId));
+ } else {
+ int caps = UIProvider.FolderCapabilities.SUPPORTS_SETTINGS;
+ if ((mailbox.mFlags & Mailbox.FLAG_ACCEPTS_MOVED_MAIL) != 0) {
+ caps |= UIProvider.FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES;
+ }
+ values.put(UIProvider.FolderColumns.CAPABILITIES, caps);
+ }
+ // For trash, we don't allow undo
+ if (mailbox.mType == Mailbox.TYPE_TRASH) {
+ values.put(UIProvider.FolderColumns.CAPABILITIES,
+ UIProvider.FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES |
+ UIProvider.FolderCapabilities.CAN_HOLD_MAIL |
+ UIProvider.FolderCapabilities.DELETE_ACTION_FINAL);
+ }
+ if (isVirtualMailbox(mailboxId)) {
+ int capa = values.getAsInteger(UIProvider.FolderColumns.CAPABILITIES);
+ values.put(UIProvider.FolderColumns.CAPABILITIES,
+ capa | UIProvider.FolderCapabilities.IS_VIRTUAL);
+ }
+ }
+ }
+ StringBuilder sb = genSelect(sFolderListMap, uiProjection, values);
+ sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.ID + "=?");
+ return sb.toString();
+ }
+
+ private static final Uri BASE_EXTERNAL_URI = Uri.parse("content://ui.email.android.com");
+
+ private static final Uri BASE_EXTERAL_URI2 = Uri.parse("content://ui.email2.android.com");
+
+ private static String getExternalUriString(String segment, String account) {
+ return BASE_EXTERNAL_URI.buildUpon().appendPath(segment)
+ .appendQueryParameter("account", account).build().toString();
+ }
+
+ private static String getExternalUriStringEmail2(String segment, String account) {
+ return BASE_EXTERAL_URI2.buildUpon().appendPath(segment)
+ .appendQueryParameter("account", account).build().toString();
+ }
+
+ /**
+ * Generate a "single account" SQLite query, given a projection from UnifiedEmail
+ *
+ * @param uiProjection as passed from UnifiedEmail
+ * @return the SQLite query to be executed on the EmailProvider database
+ */
+ private String genQueryAccount(String[] uiProjection, String id) {
+ ContentValues values = new ContentValues();
+ long accountId = Long.parseLong(id);
+
+ // Get account capabilities from the service
+ EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(getContext(),
+ mServiceCallback, accountId);
+ int capabilities = 0;
try {
- db.execSQL("alter table " + Mailbox.TABLE_NAME
- + " add column " + Mailbox.LAST_SEEN_MESSAGE_KEY + " integer;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 20 to 21 " + e);
+ capabilities = service.getCapabilities(accountId);
+ } catch (RemoteException e) {
+ }
+ values.put(UIProvider.AccountColumns.CAPABILITIES, capabilities);
+
+ values.put(UIProvider.AccountColumns.SETTINGS_INTENT_URI,
+ getExternalUriString("settings", id));
+ values.put(UIProvider.AccountColumns.COMPOSE_URI,
+ getExternalUriStringEmail2("compose", id));
+ values.put(UIProvider.AccountColumns.MIME_TYPE, EMAIL_APP_MIME_TYPE);
+ values.put(UIProvider.AccountColumns.COLOR, ACCOUNT_COLOR);
+
+ Preferences prefs = Preferences.getPreferences(getContext());
+ values.put(UIProvider.AccountColumns.SettingsColumns.CONFIRM_DELETE,
+ prefs.getConfirmDelete() ? "1" : "0");
+ values.put(UIProvider.AccountColumns.SettingsColumns.CONFIRM_SEND,
+ prefs.getConfirmSend() ? "1" : "0");
+ values.put(UIProvider.AccountColumns.SettingsColumns.HIDE_CHECKBOXES,
+ prefs.getHideCheckboxes() ? "1" : "0");
+ int autoAdvance = prefs.getAutoAdvanceDirection();
+ values.put(UIProvider.AccountColumns.SettingsColumns.AUTO_ADVANCE,
+ autoAdvanceToUiValue(autoAdvance));
+ int textZoom = prefs.getTextZoom();
+ values.put(UIProvider.AccountColumns.SettingsColumns.MESSAGE_TEXT_SIZE,
+ textZoomToUiValue(textZoom));
+ // Set default inbox, if we've got an inbox; otherwise, say initial sync needed
+ long mailboxId = Mailbox.findMailboxOfType(getContext(), accountId, Mailbox.TYPE_INBOX);
+ if (mailboxId != Mailbox.NO_MAILBOX) {
+ values.put(UIProvider.AccountColumns.SettingsColumns.DEFAULT_INBOX,
+ uiUriString("uifolder", mailboxId));
+ values.put(UIProvider.AccountColumns.SYNC_STATUS, UIProvider.SyncStatus.NO_SYNC);
+ } else {
+ values.put(UIProvider.AccountColumns.SYNC_STATUS,
+ UIProvider.SyncStatus.INITIAL_SYNC_NEEDED);
+ }
+
+ StringBuilder sb = genSelect(sAccountListMap, uiProjection, values);
+ sb.append(" FROM " + Account.TABLE_NAME + " WHERE " + AccountColumns.ID + "=?");
+ return sb.toString();
+ }
+
+ private int autoAdvanceToUiValue(int autoAdvance) {
+ switch(autoAdvance) {
+ case Preferences.AUTO_ADVANCE_OLDER:
+ return UIProvider.AutoAdvance.OLDER;
+ case Preferences.AUTO_ADVANCE_NEWER:
+ return UIProvider.AutoAdvance.NEWER;
+ case Preferences.AUTO_ADVANCE_MESSAGE_LIST:
+ default:
+ return UIProvider.AutoAdvance.LIST;
+ }
+ }
+
+ private int textZoomToUiValue(int textZoom) {
+ switch(textZoom) {
+ case Preferences.TEXT_ZOOM_HUGE:
+ return UIProvider.MessageTextSize.HUGE;
+ case Preferences.TEXT_ZOOM_LARGE:
+ return UIProvider.MessageTextSize.LARGE;
+ case Preferences.TEXT_ZOOM_NORMAL:
+ return UIProvider.MessageTextSize.NORMAL;
+ case Preferences.TEXT_ZOOM_SMALL:
+ return UIProvider.MessageTextSize.SMALL;
+ case Preferences.TEXT_ZOOM_TINY:
+ return UIProvider.MessageTextSize.TINY;
+ default:
+ return UIProvider.MessageTextSize.NORMAL;
}
}
/**
- * Upgrade the database from v21 to v22
- * This entails creating AccountManager accounts for all pop3 and imap accounts
+ * Generate a Uri string for a combined mailbox uri
+ * @param type the uri command type (e.g. "uimessages")
+ * @param id the id of the item (e.g. an account, mailbox, or message id)
+ * @return a Uri string
*/
+ private static String combinedUriString(String type, String id) {
+ return "content://" + EmailContent.AUTHORITY + "/" + type + "/" + id;
+ }
- private static final String[] V21_ACCOUNT_PROJECTION =
- new String[] {AccountColumns.HOST_AUTH_KEY_RECV, AccountColumns.EMAIL_ADDRESS};
- private static final int V21_ACCOUNT_RECV = 0;
- private static final int V21_ACCOUNT_EMAIL = 1;
+ private static final long COMBINED_ACCOUNT_ID = 0x10000000;
- private static final String[] V21_HOSTAUTH_PROJECTION =
- new String[] {HostAuthColumns.PROTOCOL, HostAuthColumns.PASSWORD};
- private static final int V21_HOSTAUTH_PROTOCOL = 0;
- private static final int V21_HOSTAUTH_PASSWORD = 1;
+ /**
+ * Generate an id for a combined mailbox of a given type
+ * @param type the mailbox type for the combined mailbox
+ * @return the id, as a String
+ */
+ private static String combinedMailboxId(int type) {
+ return Long.toString(Account.ACCOUNT_ID_COMBINED_VIEW + type);
+ }
- static private void createAccountManagerAccount(Context context, String login,
- String password) {
- AccountManager accountManager = AccountManager.get(context);
- android.accounts.Account amAccount =
- new android.accounts.Account(login, AccountManagerTypes.TYPE_POP_IMAP);
- accountManager.addAccountExplicitly(amAccount, password, null);
- ContentResolver.setIsSyncable(amAccount, EmailContent.AUTHORITY, 1);
- ContentResolver.setSyncAutomatically(amAccount, EmailContent.AUTHORITY, true);
- ContentResolver.setIsSyncable(amAccount, ContactsContract.AUTHORITY, 0);
- ContentResolver.setIsSyncable(amAccount, CalendarProviderStub.AUTHORITY, 0);
+ private static String getVirtualMailboxIdString(long accountId, int type) {
+ return Long.toString(getVirtualMailboxId(accountId, type));
}
- @VisibleForTesting
- static void upgradeFromVersion21ToVersion22(SQLiteDatabase db, Context accountManagerContext) {
+ private static long getVirtualMailboxId(long accountId, int type) {
+ return (accountId << 32) + type;
+ }
+
+ private static boolean isVirtualMailbox(long mailboxId) {
+ return mailboxId >= 0x100000000L;
+ }
+
+ private static boolean isCombinedMailbox(long mailboxId) {
+ return (mailboxId >> 32) == COMBINED_ACCOUNT_ID;
+ }
+
+ private static long getVirtualMailboxAccountId(long mailboxId) {
+ return mailboxId >> 32;
+ }
+
+ private static String getVirtualMailboxAccountIdString(long mailboxId) {
+ return Long.toString(mailboxId >> 32);
+ }
+
+ private static int getVirtualMailboxType(long mailboxId) {
+ return (int)(mailboxId & 0xF);
+ }
+
+ private void addCombinedAccountRow(MatrixCursor mc) {
+ long id = Account.getDefaultAccountId(getContext());
+ if (id == Account.NO_ACCOUNT) return;
+ String idString = Long.toString(id);
+ Object[] values = new Object[UIProvider.ACCOUNTS_PROJECTION.length];
+ values[UIProvider.ACCOUNT_ID_COLUMN] = 0;
+ values[UIProvider.ACCOUNT_CAPABILITIES_COLUMN] =
+ AccountCapabilities.UNDO | AccountCapabilities.SENDING_UNAVAILABLE;
+ values[UIProvider.ACCOUNT_FOLDER_LIST_URI_COLUMN] =
+ combinedUriString("uifolders", COMBINED_ACCOUNT_ID_STRING);
+ values[UIProvider.ACCOUNT_NAME_COLUMN] = getContext().getString(
+ R.string.mailbox_list_account_selector_combined_view);
+ values[UIProvider.ACCOUNT_SAVE_DRAFT_URI_COLUMN] =
+ combinedUriString("uisavedraft", idString);
+ values[UIProvider.ACCOUNT_SEND_MESSAGE_URI_COLUMN] =
+ combinedUriString("uisendmail", idString);
+ values[UIProvider.ACCOUNT_UNDO_URI_COLUMN] =
+ "'content://" + UIProvider.AUTHORITY + "/uiundo'";
+ values[UIProvider.ACCOUNT_URI_COLUMN] =
+ combinedUriString("uiaccount", COMBINED_ACCOUNT_ID_STRING);
+ values[UIProvider.ACCOUNT_MIME_TYPE_COLUMN] = EMAIL_APP_MIME_TYPE;
+ values[UIProvider.ACCOUNT_SETTINGS_INTENT_URI_COLUMN] =
+ getExternalUriString("settings", COMBINED_ACCOUNT_ID_STRING);
+ values[UIProvider.ACCOUNT_COMPOSE_INTENT_URI_COLUMN] =
+ getExternalUriStringEmail2("compose", Long.toString(id));
+
+ // TODO: Get these from default account?
+ Preferences prefs = Preferences.getPreferences(getContext());
+ values[UIProvider.ACCOUNT_SETTINGS_AUTO_ADVANCE_COLUMN] =
+ Integer.toString(UIProvider.AutoAdvance.NEWER);
+ values[UIProvider.ACCOUNT_SETTINGS_MESSAGE_TEXT_SIZE_COLUMN] =
+ Integer.toString(UIProvider.MessageTextSize.NORMAL);
+ values[UIProvider.ACCOUNT_SETTINGS_SNAP_HEADERS_COLUMN] =
+ Integer.toString(UIProvider.SnapHeaderValue.ALWAYS);
+ //.add(UIProvider.SettingsColumns.SIGNATURE, AccountColumns.SIGNATURE)
+ values[UIProvider.ACCOUNT_SETTINGS_REPLY_BEHAVIOR_COLUMN] =
+ Integer.toString(UIProvider.DefaultReplyBehavior.REPLY);
+ values[UIProvider.ACCOUNT_SETTINGS_HIDE_CHECKBOXES_COLUMN] = 0;
+ values[UIProvider.ACCOUNT_SETTINGS_CONFIRM_DELETE_COLUMN] =
+ prefs.getConfirmDelete() ? 1 : 0;
+ values[UIProvider.ACCOUNT_SETTINGS_CONFIRM_ARCHIVE_COLUMN] = 0;
+ values[UIProvider.ACCOUNT_SETTINGS_CONFIRM_SEND_COLUMN] = prefs.getConfirmSend() ? 1 : 0;
+ values[UIProvider.ACCOUNT_SETTINGS_HIDE_CHECKBOXES_COLUMN] =
+ prefs.getHideCheckboxes() ? 1 : 0;
+ values[UIProvider.ACCOUNT_SETTINGS_DEFAULT_INBOX_COLUMN] = combinedUriString("uifolder",
+ combinedMailboxId(Mailbox.TYPE_INBOX));
+
+ mc.addRow(values);
+ }
+
+ private Cursor getVirtualMailboxCursor(long mailboxId) {
+ MatrixCursor mc = new MatrixCursor(UIProvider.FOLDERS_PROJECTION, 1);
+ mc.addRow(getVirtualMailboxRow(getVirtualMailboxAccountId(mailboxId),
+ getVirtualMailboxType(mailboxId)));
+ return mc;
+ }
+
+ private Object[] getVirtualMailboxRow(long accountId, int mailboxType) {
+ String idString = getVirtualMailboxIdString(accountId, mailboxType);
+ Object[] values = new Object[UIProvider.FOLDERS_PROJECTION.length];
+ values[UIProvider.FOLDER_ID_COLUMN] = 0;
+ values[UIProvider.FOLDER_URI_COLUMN] = combinedUriString("uifolder", idString);
+ values[UIProvider.FOLDER_NAME_COLUMN] = getMailboxNameForType(mailboxType);
+ values[UIProvider.FOLDER_HAS_CHILDREN_COLUMN] = 0;
+ values[UIProvider.FOLDER_CAPABILITIES_COLUMN] = UIProvider.FolderCapabilities.IS_VIRTUAL;
+ values[UIProvider.FOLDER_CONVERSATION_LIST_URI_COLUMN] = combinedUriString("uimessages",
+ idString);
+ values[UIProvider.FOLDER_ID_COLUMN] = 0;
+ return values;
+ }
+
+ private Cursor uiAccounts(String[] uiProjection) {
+ Context context = getContext();
+ SQLiteDatabase db = getDatabase(context);
+ Cursor accountIdCursor =
+ db.rawQuery("select _id from " + Account.TABLE_NAME, new String[0]);
+ int numAccounts = accountIdCursor.getCount();
+ boolean combinedAccount = false;
+ if (numAccounts > 1) {
+ combinedAccount = true;
+ numAccounts++;
+ }
+ final Bundle extras = new Bundle();
+ // Email always returns the accurate number of accounts
+ extras.putInt(AccountCursorExtraKeys.ACCOUNTS_LOADED, 1);
+ final MatrixCursor mc =
+ new MatrixCursorWithExtra(uiProjection, accountIdCursor.getCount(), extras);
+ Object[] values = new Object[uiProjection.length];
try {
- // Loop through accounts, looking for pop/imap accounts
- Cursor accountCursor = db.query(Account.TABLE_NAME, V21_ACCOUNT_PROJECTION, null,
- null, null, null, null);
+ if (combinedAccount) {
+ addCombinedAccountRow(mc);
+ }
+ while (accountIdCursor.moveToNext()) {
+ String id = accountIdCursor.getString(0);
+ Cursor accountCursor =
+ db.rawQuery(genQueryAccount(uiProjection, id), new String[] {id});
+ if (accountCursor.moveToNext()) {
+ for (int i = 0; i < uiProjection.length; i++) {
+ values[i] = accountCursor.getString(i);
+ }
+ mc.addRow(values);
+ }
+ accountCursor.close();
+ }
+ } finally {
+ accountIdCursor.close();
+ }
+ mc.setNotificationUri(context.getContentResolver(), UIPROVIDER_ACCOUNTS_NOTIFIER);
+ return mc;
+ }
+
+ /**
+ * Generate the "attachment list" SQLite query, given a projection from UnifiedEmail
+ *
+ * @param uiProjection as passed from UnifiedEmail
+ * @return the SQLite query to be executed on the EmailProvider database
+ */
+ private String genQueryAttachments(String[] uiProjection) {
+ StringBuilder sb = genSelect(sAttachmentMap, uiProjection);
+ sb.append(" FROM " + Attachment.TABLE_NAME + " WHERE " + AttachmentColumns.MESSAGE_KEY +
+ " =? ");
+ return sb.toString();
+ }
+
+ /**
+ * Generate the "single attachment" SQLite query, given a projection from UnifiedEmail
+ *
+ * @param uiProjection as passed from UnifiedEmail
+ * @return the SQLite query to be executed on the EmailProvider database
+ */
+ private String genQueryAttachment(String[] uiProjection) {
+ StringBuilder sb = genSelect(sAttachmentMap, uiProjection);
+ sb.append(" FROM " + Attachment.TABLE_NAME + " WHERE " + AttachmentColumns.ID + " =? ");
+ return sb.toString();
+ }
+
+ /**
+ * Generate the "subfolder list" SQLite query, given a projection from UnifiedEmail
+ *
+ * @param uiProjection as passed from UnifiedEmail
+ * @return the SQLite query to be executed on the EmailProvider database
+ */
+ private String genQuerySubfolders(String[] uiProjection) {
+ StringBuilder sb = genSelect(sFolderListMap, uiProjection);
+ sb.append(" FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.PARENT_KEY +
+ " =? ORDER BY ");
+ sb.append(MAILBOX_ORDER_BY);
+ return sb.toString();
+ }
+
+ private static final String COMBINED_ACCOUNT_ID_STRING = Long.toString(COMBINED_ACCOUNT_ID);
+
+ /**
+ * Returns a cursor over all the folders for a specific URI which corresponds to a single
+ * account.
+ * @param uri
+ * @param uiProjection
+ * @return
+ */
+ private Cursor uiFolders(Uri uri, String[] uiProjection) {
+ Context context = getContext();
+ SQLiteDatabase db = getDatabase(context);
+ String id = uri.getPathSegments().get(1);
+ if (id.equals(COMBINED_ACCOUNT_ID_STRING)) {
+ MatrixCursor mc = new MatrixCursor(UIProvider.FOLDERS_PROJECTION, 2);
+ Object[] row = getVirtualMailboxRow(COMBINED_ACCOUNT_ID, Mailbox.TYPE_INBOX);
+ int numUnread = EmailContent.count(context, Message.CONTENT_URI,
+ MessageColumns.MAILBOX_KEY + " IN (SELECT " + MailboxColumns.ID +
+ " FROM " + Mailbox.TABLE_NAME + " WHERE " + MailboxColumns.TYPE +
+ "=" + Mailbox.TYPE_INBOX + ") AND " + MessageColumns.FLAG_READ + "=0", null);
+ row[UIProvider.FOLDER_UNREAD_COUNT_COLUMN] = numUnread;
+ mc.addRow(row);
+ int numStarred = EmailContent.count(context, Message.CONTENT_URI,
+ MessageColumns.FLAG_FAVORITE + "=1", null);
+ if (numStarred > 0) {
+ row = getVirtualMailboxRow(COMBINED_ACCOUNT_ID, Mailbox.TYPE_STARRED);
+ row[UIProvider.FOLDER_UNREAD_COUNT_COLUMN] = numStarred;
+ mc.addRow(row);
+ }
+ return mc;
+ } else {
+ Cursor c = db.rawQuery(genQueryAccountMailboxes(uiProjection), new String[] {id});
+ int numStarred = EmailContent.count(context, Message.CONTENT_URI,
+ MessageColumns.ACCOUNT_KEY + "=? AND " + MessageColumns.FLAG_FAVORITE + "=1",
+ new String[] {id});
+ if (numStarred == 0) {
+ return c;
+ } else {
+ // Add starred virtual folder to the cursor
+ // Show number of messages as unread count (for backward compatibility)
+ MatrixCursor starCursor = new MatrixCursor(uiProjection, 1);
+ Object[] row = getVirtualMailboxRow(Long.parseLong(id), Mailbox.TYPE_STARRED);
+ row[UIProvider.FOLDER_UNREAD_COUNT_COLUMN] = numStarred;
+ row[UIProvider.FOLDER_ICON_RES_ID_COLUMN] = R.drawable.ic_menu_star_holo_light;
+ starCursor.addRow(row);
+ Cursor[] cursors = new Cursor[] {starCursor, c};
+ return new MergeCursor(cursors);
+ }
+ }
+ }
+
+ /**
+ * Returns an array of the default recent folders for a given URI which is unique for an
+ * account. Some accounts might not have default recent folders, in which case an empty array
+ * is returned.
+ * @param id
+ * @return
+ */
+ private Uri[] defaultRecentFolders(final String id) {
+ final SQLiteDatabase db = getDatabase(getContext());
+ if (id.equals(COMBINED_ACCOUNT_ID_STRING)) {
+ // We don't have default recents for the combined view.
+ return new Uri[0];
+ }
+ // We search for the types we want, and find corresponding IDs.
+ final String[] idAndType = { BaseColumns._ID, UIProvider.FolderColumns.TYPE };
+
+ // Sent, Drafts, and Starred are the default recents.
+ final StringBuilder sb = genSelect(sFolderListMap, idAndType);
+ sb.append(" FROM " + Mailbox.TABLE_NAME
+ + " WHERE " + MailboxColumns.ACCOUNT_KEY + " = " + id
+ + " AND "
+ + MailboxColumns.TYPE + " IN (" + Mailbox.TYPE_SENT +
+ ", " + Mailbox.TYPE_DRAFTS +
+ ", " + Mailbox.TYPE_STARRED
+ + ")");
+ LogUtils.d(TAG, "defaultRecentFolders: Query is %s", sb);
+ final Cursor c = db.rawQuery(sb.toString(), null);
+ if (c == null || c.getCount() <= 0 || !c.moveToFirst()) {
+ return new Uri[0];
+ }
+ // Read all the IDs of the mailboxes, and turn them into URIs.
+ final Uri[] recentFolders = new Uri[c.getCount()];
+ int i = 0;
+ do {
+ final long folderId = c.getLong(0);
+ recentFolders[i] = uiUri("uifolder", folderId);
+ LogUtils.d(TAG, "Default recent folder: %d, with uri %s", folderId, recentFolders[i]);
+ ++i;
+ } while (c.moveToNext());
+ return recentFolders;
+ }
+
+ /**
+ * Wrapper that handles the visibility feature (i.e. the conversation list is visible, so
+ * any pending notifications for the corresponding mailbox should be canceled)
+ */
+ static class VisibilityCursor extends CursorWrapper {
+ private final long mMailboxId;
+ private final Context mContext;
+
+ public VisibilityCursor(Context context, Cursor cursor, long mailboxId) {
+ super(cursor);
+ mMailboxId = mailboxId;
+ mContext = context;
+ }
+
+ @Override
+ public Bundle respond(Bundle params) {
+ final String setVisibilityKey =
+ UIProvider.ConversationCursorCommand.COMMAND_KEY_SET_VISIBILITY;
+ if (params.containsKey(setVisibilityKey)) {
+ final boolean visible = params.getBoolean(setVisibilityKey);
+ if (visible) {
+ NotificationController.getInstance(mContext).cancelNewMessageNotification(
+ mMailboxId);
+ }
+ }
+ // Return success
+ Bundle response = new Bundle();
+ response.putString(setVisibilityKey,
+ UIProvider.ConversationCursorCommand.COMMAND_RESPONSE_OK);
+ return response;
+ }
+ }
+
+ /**
+ * Handle UnifiedEmail queries here (dispatched from query())
+ *
+ * @param match the UriMatcher match for the original uri passed in from UnifiedEmail
+ * @param uri the original uri passed in from UnifiedEmail
+ * @param uiProjection the projection passed in from UnifiedEmail
+ * @return the result Cursor
+ */
+ private Cursor uiQuery(int match, Uri uri, String[] uiProjection) {
+ Context context = getContext();
+ ContentResolver resolver = context.getContentResolver();
+ SQLiteDatabase db = getDatabase(context);
+ // Should we ever return null, or throw an exception??
+ Cursor c = null;
+ String id = uri.getPathSegments().get(1);
+ Uri notifyUri = null;
+ switch(match) {
+ case UI_ALL_FOLDERS:
+ c = db.rawQuery(genQueryAccountAllMailboxes(uiProjection), new String[] {id});
+ break;
+ case UI_RECENT_FOLDERS:
+ c = db.rawQuery(genQueryRecentMailboxes(uiProjection), new String[] {id});
+ notifyUri = UIPROVIDER_RECENT_FOLDERS_NOTIFIER.buildUpon().appendPath(id).build();
+ break;
+ case UI_SUBFOLDERS:
+ c = db.rawQuery(genQuerySubfolders(uiProjection), new String[] {id});
+ break;
+ case UI_MESSAGES:
+ long mailboxId = Long.parseLong(id);
+ if (isVirtualMailbox(mailboxId)) {
+ c = getVirtualMailboxMessagesCursor(db, uiProjection, mailboxId);
+ } else {
+ c = db.rawQuery(genQueryMailboxMessages(uiProjection), new String[] {id});
+ }
+ notifyUri = UIPROVIDER_CONVERSATION_NOTIFIER.buildUpon().appendPath(id).build();
+ c = new VisibilityCursor(context, c, mailboxId);
+ break;
+ case UI_MESSAGE:
+ c = db.rawQuery(genQueryViewMessage(uiProjection, id), new String[] {id});
+ break;
+ case UI_ATTACHMENTS:
+ c = db.rawQuery(genQueryAttachments(uiProjection), new String[] {id});
+ notifyUri = UIPROVIDER_ATTACHMENTS_NOTIFIER.buildUpon().appendPath(id).build();
+ break;
+ case UI_ATTACHMENT:
+ c = db.rawQuery(genQueryAttachment(uiProjection), new String[] {id});
+ notifyUri = UIPROVIDER_ATTACHMENT_NOTIFIER.buildUpon().appendPath(id).build();
+ break;
+ case UI_FOLDER:
+ mailboxId = Long.parseLong(id);
+ if (isVirtualMailbox(mailboxId)) {
+ c = getVirtualMailboxCursor(mailboxId);
+ } else {
+ c = db.rawQuery(genQueryMailbox(uiProjection, id), new String[] {id});
+ notifyUri = UIPROVIDER_FOLDER_NOTIFIER.buildUpon().appendPath(id).build();
+ }
+ break;
+ case UI_ACCOUNT:
+ if (id.equals(COMBINED_ACCOUNT_ID_STRING)) {
+ MatrixCursor mc = new MatrixCursor(UIProvider.ACCOUNTS_PROJECTION, 1);
+ addCombinedAccountRow(mc);
+ c = mc;
+ } else {
+ c = db.rawQuery(genQueryAccount(uiProjection, id), new String[] {id});
+ }
+ notifyUri = UIPROVIDER_ACCOUNT_NOTIFIER.buildUpon().appendPath(id).build();
+ break;
+ case UI_CONVERSATION:
+ c = db.rawQuery(genQueryConversation(uiProjection), new String[] {id});
+ break;
+ }
+ if (notifyUri != null) {
+ c.setNotificationUri(resolver, notifyUri);
+ }
+ return c;
+ }
+
+ /**
+ * Convert a UIProvider attachment to an EmailProvider attachment (for sending); we only need
+ * a few of the fields
+ * @param uiAtt the UIProvider attachment to convert
+ * @return the EmailProvider attachment
+ */
+ private Attachment convertUiAttachmentToAttachment(
+ com.android.mail.providers.Attachment uiAtt) {
+ Attachment att = new Attachment();
+ att.mContentUri = uiAtt.contentUri.toString();
+ att.mFileName = uiAtt.name;
+ att.mMimeType = uiAtt.contentType;
+ att.mSize = uiAtt.size;
+ return att;
+ }
+
+ private String getMailboxNameForType(int mailboxType) {
+ Context context = getContext();
+ int resId;
+ switch (mailboxType) {
+ case Mailbox.TYPE_INBOX:
+ resId = R.string.mailbox_name_server_inbox;
+ break;
+ case Mailbox.TYPE_OUTBOX:
+ resId = R.string.mailbox_name_server_outbox;
+ break;
+ case Mailbox.TYPE_DRAFTS:
+ resId = R.string.mailbox_name_server_drafts;
+ break;
+ case Mailbox.TYPE_TRASH:
+ resId = R.string.mailbox_name_server_trash;
+ break;
+ case Mailbox.TYPE_SENT:
+ resId = R.string.mailbox_name_server_sent;
+ break;
+ case Mailbox.TYPE_JUNK:
+ resId = R.string.mailbox_name_server_junk;
+ break;
+ case Mailbox.TYPE_STARRED:
+ resId = R.string.widget_starred;
+ break;
+ default:
+ throw new IllegalArgumentException("Illegal mailbox type");
+ }
+ return context.getString(resId);
+ }
+
+ /**
+ * Create a mailbox given the account and mailboxType.
+ */
+ private Mailbox createMailbox(long accountId, int mailboxType) {
+ Context context = getContext();
+ Mailbox box = Mailbox.newSystemMailbox(accountId, mailboxType,
+ getMailboxNameForType(mailboxType));
+ // Make sure drafts and save will show up in recents...
+ // If these already exist (from old Email app), they will have touch times
+ switch (mailboxType) {
+ case Mailbox.TYPE_DRAFTS:
+ box.mLastTouchedTime = Mailbox.DRAFTS_DEFAULT_TOUCH_TIME;
+ break;
+ case Mailbox.TYPE_SENT:
+ box.mLastTouchedTime = Mailbox.SENT_DEFAULT_TOUCH_TIME;
+ break;
+ }
+ box.save(context);
+ return box;
+ }
+
+ /**
+ * Given an account name and a mailbox type, return that mailbox, creating it if necessary
+ * @param accountName the account name to use
+ * @param mailboxType the type of mailbox we're trying to find
+ * @return the mailbox of the given type for the account in the uri, or null if not found
+ */
+ private Mailbox getMailboxByAccountIdAndType(String accountId, int mailboxType) {
+ long id = Long.parseLong(accountId);
+ Mailbox mailbox = Mailbox.restoreMailboxOfType(getContext(), id, mailboxType);
+ if (mailbox == null) {
+ mailbox = createMailbox(id, mailboxType);
+ }
+ return mailbox;
+ }
+
+ private Message getMessageFromPathSegments(List<String> pathSegments) {
+ Message msg = null;
+ if (pathSegments.size() > 2) {
+ msg = Message.restoreMessageWithId(getContext(), Long.parseLong(pathSegments.get(2)));
+ }
+ if (msg == null) {
+ msg = new Message();
+ }
+ return msg;
+ }
+ /**
+ * Given a mailbox and the content values for a message, create/save the message in the mailbox
+ * @param mailbox the mailbox to use
+ * @param values the content values that represent message fields
+ * @return the uri of the newly created message
+ */
+ private Uri uiSaveMessage(Message msg, Mailbox mailbox, ContentValues values) {
+ Context context = getContext();
+ // Fill in the message
+ Account account = Account.restoreAccountWithId(context, mailbox.mAccountKey);
+ if (account == null) return null;
+ msg.mFrom = account.mEmailAddress;
+ msg.mTimeStamp = System.currentTimeMillis();
+ msg.mTo = values.getAsString(UIProvider.MessageColumns.TO);
+ msg.mCc = values.getAsString(UIProvider.MessageColumns.CC);
+ msg.mBcc = values.getAsString(UIProvider.MessageColumns.BCC);
+ msg.mSubject = values.getAsString(UIProvider.MessageColumns.SUBJECT);
+ msg.mText = values.getAsString(UIProvider.MessageColumns.BODY_TEXT);
+ msg.mHtml = values.getAsString(UIProvider.MessageColumns.BODY_HTML);
+ msg.mMailboxKey = mailbox.mId;
+ msg.mAccountKey = mailbox.mAccountKey;
+ msg.mDisplayName = msg.mTo;
+ msg.mFlagLoaded = Message.FLAG_LOADED_COMPLETE;
+ msg.mFlagRead = true;
+ Integer quoteStartPos = values.getAsInteger(UIProvider.MessageColumns.QUOTE_START_POS);
+ msg.mQuotedTextStartPos = quoteStartPos == null ? 0 : quoteStartPos;
+ int flags = 0;
+ int draftType = values.getAsInteger(UIProvider.MessageColumns.DRAFT_TYPE);
+ switch(draftType) {
+ case DraftType.FORWARD:
+ flags |= Message.FLAG_TYPE_FORWARD;
+ break;
+ case DraftType.REPLY_ALL:
+ flags |= Message.FLAG_TYPE_REPLY_ALL;
+ // Fall through
+ case DraftType.REPLY:
+ flags |= Message.FLAG_TYPE_REPLY;
+ break;
+ case DraftType.COMPOSE:
+ flags |= Message.FLAG_TYPE_ORIGINAL;
+ break;
+ }
+ msg.mFlags = flags;
+ int draftInfo = 0;
+ if (values.containsKey(UIProvider.MessageColumns.QUOTE_START_POS)) {
+ draftInfo = values.getAsInteger(UIProvider.MessageColumns.QUOTE_START_POS);
+ if (values.getAsInteger(UIProvider.MessageColumns.APPEND_REF_MESSAGE_CONTENT) != 0) {
+ draftInfo |= Message.DRAFT_INFO_APPEND_REF_MESSAGE;
+ }
+ }
+ msg.mDraftInfo = draftInfo;
+ String ref = values.getAsString(UIProvider.MessageColumns.REF_MESSAGE_ID);
+ if (ref != null && msg.mQuotedTextStartPos > 0) {
+ String refId = Uri.parse(ref).getLastPathSegment();
try {
- String[] hostAuthArgs = new String[1];
- while (accountCursor.moveToNext()) {
- hostAuthArgs[0] = accountCursor.getString(V21_ACCOUNT_RECV);
- // Get the "receive" HostAuth for this account
- Cursor hostAuthCursor = db.query(HostAuth.TABLE_NAME,
- V21_HOSTAUTH_PROJECTION, HostAuth.RECORD_ID + "=?", hostAuthArgs,
- null, null, null);
- try {
- if (hostAuthCursor.moveToFirst()) {
- String protocol = hostAuthCursor.getString(V21_HOSTAUTH_PROTOCOL);
- // If this is a pop3 or imap account, create the account manager account
- if (HostAuth.SCHEME_IMAP.equals(protocol) ||
- HostAuth.SCHEME_POP3.equals(protocol)) {
- if (Email.DEBUG) {
- Log.d(TAG, "Create AccountManager account for " + protocol +
- "account: " +
- accountCursor.getString(V21_ACCOUNT_EMAIL));
- }
- createAccountManagerAccount(accountManagerContext,
- accountCursor.getString(V21_ACCOUNT_EMAIL),
- hostAuthCursor.getString(V21_HOSTAUTH_PASSWORD));
- // If an EAS account, make Email sync automatically (equivalent of
- // checking the "Sync Email" box in settings
- } else if (HostAuth.SCHEME_EAS.equals(protocol)) {
- android.accounts.Account amAccount =
- new android.accounts.Account(
- accountCursor.getString(V21_ACCOUNT_EMAIL),
- AccountManagerTypes.TYPE_EXCHANGE);
- ContentResolver.setIsSyncable(amAccount, EmailContent.AUTHORITY, 1);
- ContentResolver.setSyncAutomatically(amAccount,
- EmailContent.AUTHORITY, true);
+ long sourceKey = Long.parseLong(refId);
+ msg.mSourceKey = sourceKey;
+ } catch (NumberFormatException e) {
+ // This will be zero; the default
+ }
+ }
- }
- }
- } finally {
- hostAuthCursor.close();
+ // Get attachments from the ContentValues
+ List<com.android.mail.providers.Attachment> uiAtts =
+ com.android.mail.providers.Attachment.fromJSONArray(
+ values.getAsString(UIProvider.MessageColumns.JOINED_ATTACHMENT_INFOS));
+ ArrayList<Attachment> atts = new ArrayList<Attachment>();
+ boolean hasUnloadedAttachments = false;
+ for (com.android.mail.providers.Attachment uiAtt: uiAtts) {
+ Uri attUri = uiAtt.uri;
+ if (attUri != null && attUri.getAuthority().equals(EmailContent.AUTHORITY)) {
+ // If it's one of ours, retrieve the attachment and add it to the list
+ long attId = Long.parseLong(attUri.getLastPathSegment());
+ Attachment att = Attachment.restoreAttachmentWithId(context, attId);
+ if (att != null) {
+ // We must clone the attachment into a new one for this message; easiest to
+ // use a parcel here
+ Parcel p = Parcel.obtain();
+ att.writeToParcel(p, 0);
+ p.setDataPosition(0);
+ Attachment attClone = new Attachment(p);
+ p.recycle();
+ // Clear the messageKey (this is going to be a new attachment)
+ attClone.mMessageKey = 0;
+ // If we're sending this, it's not loaded, and we're not smart forwarding
+ // add the download flag, so that ADS will start up
+ if (mailbox.mType == Mailbox.TYPE_OUTBOX && att.mContentUri == null &&
+ ((account.mFlags & Account.FLAGS_SUPPORTS_SMART_FORWARD) == 0)) {
+ attClone.mFlags |= Attachment.FLAG_DOWNLOAD_FORWARD;
+ hasUnloadedAttachments = true;
}
+ atts.add(attClone);
}
- } finally {
- accountCursor.close();
+ } else {
+ // Convert external attachment to one of ours and add to the list
+ atts.add(convertUiAttachmentToAttachment(uiAtt));
+ }
+ }
+ if (!atts.isEmpty()) {
+ msg.mAttachments = atts;
+ msg.mFlagAttachment = true;
+ if (hasUnloadedAttachments) {
+ Utility.showToast(context, R.string.message_view_attachment_background_load);
}
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 20 to 21 " + e);
}
+ // Save it or update it...
+ if (!msg.isSaved()) {
+ msg.save(context);
+ } else {
+ // This is tricky due to how messages/attachments are saved; rather than putz with
+ // what's changed, we'll delete/re-add them
+ ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+ // Delete all existing attachments
+ ops.add(ContentProviderOperation.newDelete(
+ ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, msg.mId))
+ .build());
+ // Delete the body
+ ops.add(ContentProviderOperation.newDelete(Body.CONTENT_URI)
+ .withSelection(Body.MESSAGE_KEY + "=?", new String[] {Long.toString(msg.mId)})
+ .build());
+ // Add the ops for the message, atts, and body
+ msg.addSaveOps(ops);
+ // Do it!
+ try {
+ applyBatch(ops);
+ } catch (OperationApplicationException e) {
+ }
+ }
+ if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
+ EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(context,
+ mServiceCallback, mailbox.mAccountKey);
+ try {
+ service.startSync(mailbox.mId, true);
+ } catch (RemoteException e) {
+ }
+ long originalMsgId = msg.mSourceKey;
+ if (originalMsgId != 0) {
+ Message originalMsg = Message.restoreMessageWithId(context, originalMsgId);
+ // If the original message exists, set its forwarded/replied to flags
+ if (originalMsg != null) {
+ ContentValues cv = new ContentValues();
+ flags = originalMsg.mFlags;
+ switch(draftType) {
+ case DraftType.FORWARD:
+ flags |= Message.FLAG_FORWARDED;
+ break;
+ case DraftType.REPLY_ALL:
+ case DraftType.REPLY:
+ flags |= Message.FLAG_REPLIED_TO;
+ break;
+ }
+ cv.put(Message.FLAGS, flags);
+ context.getContentResolver().update(ContentUris.withAppendedId(
+ Message.CONTENT_URI, originalMsgId), cv, null, null);
+ }
+ }
+ }
+ return uiUri("uimessage", msg.mId);
}
- /** Upgrades the database from v22 to v23 */
- private static void upgradeFromVersion22ToVersion23(SQLiteDatabase db) {
+ /**
+ * Create and send the message via the account indicated in the uri
+ * @param uri the incoming uri
+ * @param values the content values that represent message fields
+ * @return the uri of the created message
+ */
+ private Uri uiSendMail(Uri uri, ContentValues values) {
+ List<String> pathSegments = uri.getPathSegments();
+ Mailbox mailbox = getMailboxByAccountIdAndType(pathSegments.get(1), Mailbox.TYPE_OUTBOX);
+ if (mailbox == null) return null;
+ Message msg = getMessageFromPathSegments(pathSegments);
try {
- db.execSQL("alter table " + Mailbox.TABLE_NAME
- + " add column " + Mailbox.LAST_TOUCHED_TIME + " integer default 0;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 22 to 23 " + e);
+ return uiSaveMessage(msg, mailbox, values);
+ } finally {
+ // Kick observers
+ getContext().getContentResolver().notifyChange(Mailbox.CONTENT_URI, null);
}
}
- /** Adds in a column for information about a client certificate to use. */
- private static void upgradeFromVersion23ToVersion24(SQLiteDatabase db) {
- try {
- db.execSQL("alter table " + HostAuth.TABLE_NAME
- + " add column " + HostAuth.CLIENT_CERT_ALIAS + " text;");
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 23 to 24 " + e);
+ /**
+ * Create a message and save it to the drafts folder of the account indicated in the uri
+ * @param uri the incoming uri
+ * @param values the content values that represent message fields
+ * @return the uri of the created message
+ */
+ private Uri uiSaveDraft(Uri uri, ContentValues values) {
+ List<String> pathSegments = uri.getPathSegments();
+ Mailbox mailbox = getMailboxByAccountIdAndType(pathSegments.get(1), Mailbox.TYPE_DRAFTS);
+ if (mailbox == null) return null;
+ Message msg = getMessageFromPathSegments(pathSegments);
+ return uiSaveMessage(msg, mailbox, values);
+ }
+
+ private int uiUpdateDraft(Uri uri, ContentValues values) {
+ Context context = getContext();
+ Message msg = Message.restoreMessageWithId(context,
+ Long.parseLong(uri.getPathSegments().get(1)));
+ if (msg == null) return 0;
+ Mailbox mailbox = Mailbox.restoreMailboxWithId(context, msg.mMailboxKey);
+ if (mailbox == null) return 0;
+ uiSaveMessage(msg, mailbox, values);
+ return 1;
+ }
+
+ private int uiSendDraft(Uri uri, ContentValues values) {
+ Context context = getContext();
+ Message msg = Message.restoreMessageWithId(context,
+ Long.parseLong(uri.getPathSegments().get(1)));
+ if (msg == null) return 0;
+ long mailboxId = Mailbox.findMailboxOfType(context, msg.mAccountKey, Mailbox.TYPE_OUTBOX);
+ if (mailboxId == Mailbox.NO_MAILBOX) return 0;
+ Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
+ if (mailbox == null) return 0;
+ uiSaveMessage(msg, mailbox, values);
+ // Kick observers
+ context.getContentResolver().notifyChange(Mailbox.CONTENT_URI, null);
+ return 1;
+ }
+
+ private void putIntegerLongOrBoolean(ContentValues values, String columnName, Object value) {
+ if (value instanceof Integer) {
+ Integer intValue = (Integer)value;
+ values.put(columnName, intValue);
+ } else if (value instanceof Boolean) {
+ Boolean boolValue = (Boolean)value;
+ values.put(columnName, boolValue ? 1 : 0);
+ } else if (value instanceof Long) {
+ Long longValue = (Long)value;
+ values.put(columnName, longValue);
}
}
- /** Upgrades the database from v24 to v25 by creating table for quick responses */
- private static void upgradeFromVersion24ToVersion25(SQLiteDatabase db) {
- try {
- createQuickResponseTable(db);
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 24 to 25 " + e);
+ /**
+ * Update the timestamps for the folders specified and notifies on the recent folder URI.
+ * @param folders
+ * @return number of folders updated
+ */
+ private int updateTimestamp(final Context context, String id, Uri[] folders){
+ int updated = 0;
+ final long now = System.currentTimeMillis();
+ final ContentResolver resolver = context.getContentResolver();
+ final ContentValues touchValues = new ContentValues();
+ for (int i=0, size=folders.length; i < size; ++i) {
+ touchValues.put(MailboxColumns.LAST_TOUCHED_TIME, now);
+ LogUtils.d(TAG, "updateStamp: %s updated", folders[i]);
+ updated += resolver.update(folders[i], touchValues, null, null);
+ }
+ final Uri toNotify =
+ UIPROVIDER_RECENT_FOLDERS_NOTIFIER.buildUpon().appendPath(id).build();
+ LogUtils.d(TAG, "updateTimestamp: Notifying on %s", toNotify);
+ resolver.notifyChange(toNotify, null);
+ return updated;
+ }
+
+ /**
+ * Updates the recent folders. The values to be updated are specified as ContentValues pairs
+ * of (Folder URI, access timestamp). Returns nonzero if successful, always.
+ * @param uri
+ * @param values
+ * @return nonzero value always.
+ */
+ private int uiUpdateRecentFolders(Uri uri, ContentValues values) {
+ final int numFolders = values.size();
+ final String id = uri.getPathSegments().get(1);
+ final Uri[] folders = new Uri[numFolders];
+ final Context context = getContext();
+ final NotificationController controller = NotificationController.getInstance(context);
+ int i = 0;
+ for (final String uriString: values.keySet()) {
+ folders[i] = Uri.parse(uriString);
+ try {
+ final String mailboxIdString = folders[i].getLastPathSegment();
+ final long mailboxId = Long.parseLong(mailboxIdString);
+ controller.cancelNewMessageNotification(mailboxId);
+ } catch (NumberFormatException e) {
+ // Keep on going...
+ }
}
+ return updateTimestamp(context, id, folders);
}
- private static final String[] V25_ACCOUNT_PROJECTION =
- new String[] {AccountColumns.ID, AccountColumns.FLAGS, AccountColumns.HOST_AUTH_KEY_RECV};
- private static final int V25_ACCOUNT_ID = 0;
- private static final int V25_ACCOUNT_FLAGS = 1;
- private static final int V25_ACCOUNT_RECV = 2;
+ /**
+ * Populates the recent folders according to the design.
+ * @param uri
+ * @return the number of recent folders were populated.
+ */
+ private int uiPopulateRecentFolders(Uri uri) {
+ final Context context = getContext();
+ final String id = uri.getLastPathSegment();
+ final Uri[] recentFolders = defaultRecentFolders(id);
+ final int numFolders = recentFolders.length;
+ if (numFolders <= 0) {
+ return 0;
+ }
+ final int rowsUpdated = updateTimestamp(context, id, recentFolders);
+ LogUtils.d(TAG, "uiPopulateRecentFolders: %d folders changed", rowsUpdated);
+ return rowsUpdated;
+ }
+
+ private int uiUpdateAttachment(Uri uri, ContentValues uiValues) {
+ Integer stateValue = uiValues.getAsInteger(UIProvider.AttachmentColumns.STATE);
+ if (stateValue != null) {
+ // This is a command from UIProvider
+ long attachmentId = Long.parseLong(uri.getLastPathSegment());
+ Context context = getContext();
+ Attachment attachment =
+ Attachment.restoreAttachmentWithId(context, attachmentId);
+ if (attachment == null) {
+ // Went away; ah, well...
+ return 0;
+ }
+ ContentValues values = new ContentValues();
+ switch (stateValue.intValue()) {
+ case UIProvider.AttachmentState.NOT_SAVED:
+ // Set state, try to cancel request
+ values.put(AttachmentColumns.UI_STATE, stateValue);
+ values.put(AttachmentColumns.FLAGS,
+ attachment.mFlags &= ~Attachment.FLAG_DOWNLOAD_USER_REQUEST);
+ attachment.update(context, values);
+ return 1;
+ case UIProvider.AttachmentState.DOWNLOADING:
+ // Set state and destination; request download
+ values.put(AttachmentColumns.UI_STATE, stateValue);
+ Integer destinationValue =
+ uiValues.getAsInteger(UIProvider.AttachmentColumns.DESTINATION);
+ values.put(AttachmentColumns.UI_DESTINATION,
+ destinationValue == null ? 0 : destinationValue);
+ values.put(AttachmentColumns.FLAGS,
+ attachment.mFlags | Attachment.FLAG_DOWNLOAD_USER_REQUEST);
+ attachment.update(context, values);
+ return 1;
+ case UIProvider.AttachmentState.SAVED:
+ // If this is an inline attachment, notify message has changed
+ if (!TextUtils.isEmpty(attachment.mContentId)) {
+ notifyUI(UIPROVIDER_MESSAGE_NOTIFIER, attachment.mMessageKey);
+ }
+ return 1;
+ }
+ }
+ return 0;
+ }
+
+ private int uiUpdateFolder(Uri uri, ContentValues uiValues) {
+ Uri ourUri = convertToEmailProviderUri(uri, Mailbox.CONTENT_URI, true);
+ if (ourUri == null) return 0;
+ ContentValues ourValues = new ContentValues();
+ // This should only be called via update to "recent folders"
+ for (String columnName: uiValues.keySet()) {
+ if (columnName.equals(MailboxColumns.LAST_TOUCHED_TIME)) {
+ ourValues.put(MailboxColumns.LAST_TOUCHED_TIME, uiValues.getAsLong(columnName));
+ }
+ }
+ return update(ourUri, ourValues, null, null);
+ }
- private static final String[] V25_HOSTAUTH_PROJECTION = new String[] {HostAuthColumns.PROTOCOL};
- private static final int V25_HOSTAUTH_PROTOCOL = 0;
+ private ContentValues convertUiMessageValues(Message message, ContentValues values) {
+ ContentValues ourValues = new ContentValues();
+ for (String columnName: values.keySet()) {
+ Object val = values.get(columnName);
+ if (columnName.equals(UIProvider.ConversationColumns.STARRED)) {
+ putIntegerLongOrBoolean(ourValues, MessageColumns.FLAG_FAVORITE, val);
+ } else if (columnName.equals(UIProvider.ConversationColumns.READ)) {
+ putIntegerLongOrBoolean(ourValues, MessageColumns.FLAG_READ, val);
+ } else if (columnName.equals(MessageColumns.MAILBOX_KEY)) {
+ putIntegerLongOrBoolean(ourValues, MessageColumns.MAILBOX_KEY, val);
+ } else if (columnName.equals(UIProvider.ConversationColumns.FOLDER_LIST)) {
+ // Convert from folder list uri to mailbox key
+ Uri uri = Uri.parse((String)val);
+ Long mailboxId = Long.parseLong(uri.getLastPathSegment());
+ putIntegerLongOrBoolean(ourValues, MessageColumns.MAILBOX_KEY, mailboxId);
+ } else if (columnName.equals(UIProvider.ConversationColumns.RAW_FOLDERS)) {
+ // Ignore; this is updated by the FOLDER_LIST update above.
+ } else if (columnName.equals(UIProvider.MessageColumns.ALWAYS_SHOW_IMAGES)) {
+ Address[] fromList = Address.unpack(message.mFrom);
+ Preferences prefs = Preferences.getPreferences(getContext());
+ for (Address sender : fromList) {
+ String email = sender.getAddress();
+ prefs.setSenderAsTrusted(email);
+ }
+ } else {
+ throw new IllegalArgumentException("Can't update " + columnName + " in message");
+ }
+ }
+ return ourValues;
+ }
- /** Upgrades the database from v25 to v26 by adding FLAG_SUPPORTS_SEARCH to IMAP accounts */
- private static void upgradeFromVersion25ToVersion26(SQLiteDatabase db) {
+ private Uri convertToEmailProviderUri(Uri uri, Uri newBaseUri, boolean asProvider) {
+ String idString = uri.getLastPathSegment();
try {
- // Loop through accounts, looking for imap accounts
- Cursor accountCursor = db.query(Account.TABLE_NAME, V25_ACCOUNT_PROJECTION, null,
- null, null, null, null);
- ContentValues cv = new ContentValues();
+ long id = Long.parseLong(idString);
+ Uri ourUri = ContentUris.withAppendedId(newBaseUri, id);
+ if (asProvider) {
+ ourUri = ourUri.buildUpon().appendQueryParameter(IS_UIPROVIDER, "true").build();
+ }
+ return ourUri;
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+
+ private Message getMessageFromLastSegment(Uri uri) {
+ long messageId = Long.parseLong(uri.getLastPathSegment());
+ return Message.restoreMessageWithId(getContext(), messageId);
+ }
+
+ /**
+ * Add an undo operation for the current sequence; if the sequence is newer than what we've had,
+ * clear out the undo list and start over
+ * @param uri the uri we're working on
+ * @param op the ContentProviderOperation to perform upon undo
+ */
+ private void addToSequence(Uri uri, ContentProviderOperation op) {
+ String sequenceString = uri.getQueryParameter(UIProvider.SEQUENCE_QUERY_PARAMETER);
+ if (sequenceString != null) {
+ int sequence = Integer.parseInt(sequenceString);
+ if (sequence > mLastSequence) {
+ // Reset sequence
+ mLastSequenceOps.clear();
+ mLastSequence = sequence;
+ }
+ // TODO: Need something to indicate a change isn't ready (undoable)
+ mLastSequenceOps.add(op);
+ }
+ }
+
+ // TODO: This should depend on flags on the mailbox...
+ private boolean uploadsToServer(Context context, Mailbox m) {
+ if (m.mType == Mailbox.TYPE_DRAFTS || m.mType == Mailbox.TYPE_OUTBOX ||
+ m.mType == Mailbox.TYPE_SEARCH) {
+ return false;
+ }
+ String protocol = Account.getProtocol(context, m.mAccountKey);
+ EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, protocol);
+ return (info != null && info.syncChanges);
+ }
+
+ private int uiUpdateMessage(Uri uri, ContentValues values) {
+ Context context = getContext();
+ Message msg = getMessageFromLastSegment(uri);
+ if (msg == null) return 0;
+ Mailbox mailbox = Mailbox.restoreMailboxWithId(context, msg.mMailboxKey);
+ if (mailbox == null) return 0;
+ Uri ourBaseUri = uploadsToServer(context, mailbox) ? Message.SYNCED_CONTENT_URI :
+ Message.CONTENT_URI;
+ Uri ourUri = convertToEmailProviderUri(uri, ourBaseUri, true);
+ if (ourUri == null) return 0;
+
+ // Special case - meeting response
+ if (values.containsKey(UIProvider.MessageOperations.RESPOND_COLUMN)) {
+ EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(context,
+ mServiceCallback, mailbox.mAccountKey);
try {
- String[] hostAuthArgs = new String[1];
- while (accountCursor.moveToNext()) {
- hostAuthArgs[0] = accountCursor.getString(V25_ACCOUNT_RECV);
- // Get the "receive" HostAuth for this account
- Cursor hostAuthCursor = db.query(HostAuth.TABLE_NAME,
- V25_HOSTAUTH_PROJECTION, HostAuth.RECORD_ID + "=?", hostAuthArgs,
- null, null, null);
- try {
- if (hostAuthCursor.moveToFirst()) {
- String protocol = hostAuthCursor.getString(V25_HOSTAUTH_PROTOCOL);
- // If this is an imap account, add the search flag
- if (HostAuth.SCHEME_IMAP.equals(protocol)) {
- String id = accountCursor.getString(V25_ACCOUNT_ID);
- int flags = accountCursor.getInt(V25_ACCOUNT_FLAGS);
- cv.put(AccountColumns.FLAGS, flags | Account.FLAGS_SUPPORTS_SEARCH);
- db.update(Account.TABLE_NAME, cv, Account.RECORD_ID + "=?",
- new String[] {id});
- }
- }
- } finally {
- hostAuthCursor.close();
- }
+ service.sendMeetingResponse(msg.mId,
+ values.getAsInteger(UIProvider.MessageOperations.RESPOND_COLUMN));
+ // Delete the message immediately
+ uiDeleteMessage(uri);
+ Utility.showToast(context, R.string.confirm_response);
+ // Notify box has changed so the deletion is reflected in the UI
+ notifyUIConversationMailbox(mailbox.mId);
+ } catch (RemoteException e) {
+ }
+ return 1;
+ }
+
+ ContentValues undoValues = new ContentValues();
+ ContentValues ourValues = convertUiMessageValues(msg, values);
+ for (String columnName: ourValues.keySet()) {
+ if (columnName.equals(MessageColumns.MAILBOX_KEY)) {
+ undoValues.put(MessageColumns.MAILBOX_KEY, msg.mMailboxKey);
+ } else if (columnName.equals(MessageColumns.FLAG_READ)) {
+ undoValues.put(MessageColumns.FLAG_READ, msg.mFlagRead);
+ } else if (columnName.equals(MessageColumns.FLAG_FAVORITE)) {
+ undoValues.put(MessageColumns.FLAG_FAVORITE, msg.mFlagFavorite);
+ }
+ }
+ if (undoValues == null || undoValues.size() == 0) {
+ return -1;
+ }
+ ContentProviderOperation op =
+ ContentProviderOperation.newUpdate(convertToEmailProviderUri(
+ uri, ourBaseUri, false))
+ .withValues(undoValues)
+ .build();
+ addToSequence(uri, op);
+ return update(ourUri, ourValues, null, null);
+ }
+
+ private int uiDeleteMessage(Uri uri) {
+ Context context = getContext();
+ Message msg = getMessageFromLastSegment(uri);
+ if (msg == null) return 0;
+ Mailbox mailbox = Mailbox.restoreMailboxWithId(context, msg.mMailboxKey);
+ if (mailbox == null) return 0;
+ if (mailbox.mType == Mailbox.TYPE_TRASH || mailbox.mType == Mailbox.TYPE_DRAFTS) {
+ // We actually delete these, including attachments
+ AttachmentUtilities.deleteAllAttachmentFiles(context, msg.mAccountKey, msg.mId);
+ notifyUI(UIPROVIDER_FOLDER_NOTIFIER, mailbox.mId);
+ return context.getContentResolver().delete(
+ ContentUris.withAppendedId(Message.CONTENT_URI, msg.mId), null, null);
+ }
+ Mailbox trashMailbox =
+ Mailbox.restoreMailboxOfType(context, msg.mAccountKey, Mailbox.TYPE_TRASH);
+ if (trashMailbox == null) return 0;
+ ContentValues values = new ContentValues();
+ values.put(MessageColumns.MAILBOX_KEY, trashMailbox.mId);
+ notifyUI(UIPROVIDER_FOLDER_NOTIFIER, mailbox.mId);
+ return uiUpdateMessage(uri, values);
+ }
+
+ private Cursor uiUndo(String[] projection) {
+ // First see if we have any operations saved
+ // TODO: Make sure seq matches
+ if (!mLastSequenceOps.isEmpty()) {
+ try {
+ // TODO Always use this projection? Or what's passed in?
+ // Not sure if UI wants it, but I'm making a cursor of convo uri's
+ MatrixCursor c = new MatrixCursor(
+ new String[] {UIProvider.ConversationColumns.URI},
+ mLastSequenceOps.size());
+ for (ContentProviderOperation op: mLastSequenceOps) {
+ c.addRow(new String[] {op.getUri().toString()});
}
- } finally {
- accountCursor.close();
+ // Just apply the batch and we're done!
+ applyBatch(mLastSequenceOps);
+ // But clear the operations
+ mLastSequenceOps.clear();
+ // Tell the UI there are changes
+ ContentResolver resolver = getContext().getContentResolver();
+ resolver.notifyChange(UIPROVIDER_CONVERSATION_NOTIFIER, null);
+ resolver.notifyChange(UIPROVIDER_FOLDER_NOTIFIER, null);
+ return c;
+ } catch (OperationApplicationException e) {
}
- } catch (SQLException e) {
- // Shouldn't be needed unless we're debugging and interrupt the process
- Log.w(TAG, "Exception upgrading EmailProvider.db from 25 to 26 " + e);
}
+ return new MatrixCursor(projection, 0);
}
- /**
- * For testing purposes, check whether a given row is cached
- * @param baseUri the base uri of the EmailContent
- * @param id the row id of the EmailContent
- * @return whether or not the row is currently cached
+ private void notifyUIConversation(Uri uri) {
+ String id = uri.getLastPathSegment();
+ Message msg = Message.restoreMessageWithId(getContext(), Long.parseLong(id));
+ if (msg != null) {
+ notifyUIConversationMailbox(msg.mMailboxKey);
+ }
+ }
+
+ /**
+ * Notify about the Mailbox id passed in
+ * @param id the Mailbox id to be notified
*/
- @VisibleForTesting
- protected boolean isCached(Uri baseUri, long id) {
- int match = findMatch(baseUri, "isCached");
- int table = match >> BASE_SHIFT;
- ContentCache cache = mContentCaches[table];
- if (cache == null) return false;
- Cursor cc = cache.get(Long.toString(id));
- return (cc != null);
+ private void notifyUIConversationMailbox(long id) {
+ notifyUI(UIPROVIDER_CONVERSATION_NOTIFIER, Long.toString(id));
+ Mailbox mailbox = Mailbox.restoreMailboxWithId(getContext(), id);
+ // Notify combined inbox...
+ if (mailbox.mType == Mailbox.TYPE_INBOX) {
+ notifyUI(UIPROVIDER_CONVERSATION_NOTIFIER,
+ EmailProvider.combinedMailboxId(Mailbox.TYPE_INBOX));
+ }
+ notifyWidgets(id);
}
- public static interface AttachmentService {
- /**
- * Notify the service that an attachment has changed.
- */
- void attachmentChanged(Context context, long id, int flags);
+ private void notifyUI(Uri uri, String id) {
+ Uri notifyUri = uri.buildUpon().appendPath(id).build();
+ getContext().getContentResolver().notifyChange(notifyUri, null);
}
- private final AttachmentService DEFAULT_ATTACHMENT_SERVICE = new AttachmentService() {
+ private void notifyUI(Uri uri, long id) {
+ notifyUI(uri, Long.toString(id));
+ }
+
+ /**
+ * Support for services and service notifications
+ */
+
+ private final IEmailServiceCallback.Stub mServiceCallback =
+ new IEmailServiceCallback.Stub() {
+
@Override
- public void attachmentChanged(Context context, long id, int flags) {
- // The default implementation delegates to the real service.
- AttachmentDownloadService.attachmentChanged(context, id, flags);
+ public void syncMailboxListStatus(long accountId, int statusCode, int progress)
+ throws RemoteException {
+ }
+
+ @Override
+ public void syncMailboxStatus(long mailboxId, int statusCode, int progress)
+ throws RemoteException {
+ // We'll get callbacks here from the services, which we'll pass back to the UI
+ Uri uri = ContentUris.withAppendedId(FOLDER_STATUS_URI, mailboxId);
+ EmailProvider.this.getContext().getContentResolver().notifyChange(uri, null);
+ }
+
+ @Override
+ public void loadAttachmentStatus(long messageId, long attachmentId, int statusCode,
+ int progress) throws RemoteException {
+ }
+
+ @Override
+ public void sendMessageStatus(long messageId, String subject, int statusCode, int progress)
+ throws RemoteException {
+ }
+
+ @Override
+ public void loadMessageStatus(long messageId, int statusCode, int progress)
+ throws RemoteException {
}
};
- private AttachmentService mAttachmentService = DEFAULT_ATTACHMENT_SERVICE;
+
+ private Cursor uiFolderRefresh(Uri uri) {
+ Context context = getContext();
+ String idString = uri.getLastPathSegment();
+ long id = Long.parseLong(idString);
+ Mailbox mailbox = Mailbox.restoreMailboxWithId(context, id);
+ if (mailbox == null) return null;
+ EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(context,
+ mServiceCallback, mailbox.mAccountKey);
+ try {
+ service.startSync(id, true);
+ } catch (RemoteException e) {
+ }
+ return null;
+ }
+
+ //Number of additional messages to load when a user selects "Load more..." in POP/IMAP boxes
+ public static final int VISIBLE_LIMIT_INCREMENT = 10;
+ //Number of additional messages to load when a user selects "Load more..." in a search
+ public static final int SEARCH_MORE_INCREMENT = 10;
+
+ private Cursor uiFolderLoadMore(Uri uri) {
+ Context context = getContext();
+ String idString = uri.getLastPathSegment();
+ long id = Long.parseLong(idString);
+ Mailbox mailbox = Mailbox.restoreMailboxWithId(context, id);
+ if (mailbox == null) return null;
+ if (mailbox.mType == Mailbox.TYPE_SEARCH) {
+ // Ask for 10 more messages
+ mSearchParams.mOffset += SEARCH_MORE_INCREMENT;
+ runSearchQuery(context, mailbox.mAccountKey, id);
+ } else {
+ ContentValues values = new ContentValues();
+ values.put(EmailContent.FIELD_COLUMN_NAME, MailboxColumns.VISIBLE_LIMIT);
+ values.put(EmailContent.ADD_COLUMN_NAME, VISIBLE_LIMIT_INCREMENT);
+ Uri mailboxUri = ContentUris.withAppendedId(Mailbox.ADD_TO_FIELD_URI, id);
+ // Increase the limit
+ context.getContentResolver().update(mailboxUri, values, null, null);
+ // And order a refresh
+ uiFolderRefresh(uri);
+ }
+ return null;
+ }
+
+ private static final String SEARCH_MAILBOX_SERVER_ID = "__search_mailbox__";
+ private SearchParams mSearchParams;
/**
- * Injects a custom attachment service handler. If null is specified, will reset to the
- * default service.
+ * Returns the search mailbox for the specified account, creating one if necessary
+ * @return the search mailbox for the passed in account
*/
- public void injectAttachmentService(AttachmentService as) {
- mAttachmentService = (as == null) ? DEFAULT_ATTACHMENT_SERVICE : as;
+ private Mailbox getSearchMailbox(long accountId) {
+ Context context = getContext();
+ Mailbox m = Mailbox.restoreMailboxOfType(context, accountId, Mailbox.TYPE_SEARCH);
+ if (m == null) {
+ m = new Mailbox();
+ m.mAccountKey = accountId;
+ m.mServerId = SEARCH_MAILBOX_SERVER_ID;
+ m.mFlagVisible = false;
+ m.mDisplayName = SEARCH_MAILBOX_SERVER_ID;
+ m.mSyncInterval = Mailbox.CHECK_INTERVAL_NEVER;
+ m.mType = Mailbox.TYPE_SEARCH;
+ m.mFlags = Mailbox.FLAG_HOLDS_MAIL;
+ m.mParentKey = Mailbox.NO_MAILBOX;
+ m.save(context);
+ }
+ return m;
+ }
+
+ private void runSearchQuery(final Context context, final long accountId,
+ final long searchMailboxId) {
+ // Start the search running in the background
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(context,
+ mServiceCallback, accountId);
+ if (service != null) {
+ try {
+ // Save away the total count
+ mSearchParams.mTotalCount = service.searchMessages(accountId,
+ mSearchParams, searchMailboxId);
+ //Log.d(TAG, "TotalCount to UI: " + mSearchParams.mTotalCount);
+ notifyUI(UIPROVIDER_FOLDER_NOTIFIER, searchMailboxId);
+ } catch (RemoteException e) {
+ Log.e("searchMessages", "RemoteException", e);
+ }
+ }
+ } finally {
+ }
+ }}).start();
+
+ }
+
+ // TODO: Handle searching for more...
+ private Cursor uiSearch(Uri uri, String[] projection) {
+ final long accountId = Long.parseLong(uri.getLastPathSegment());
+
+ // TODO: Check the actual mailbox
+ Mailbox inbox = Mailbox.restoreMailboxOfType(getContext(), accountId, Mailbox.TYPE_INBOX);
+ if (inbox == null) return null;
+
+ String filter = uri.getQueryParameter(UIProvider.SearchQueryParameters.QUERY);
+ if (filter == null) {
+ throw new IllegalArgumentException("No query parameter in search query");
+ }
+
+ // Find/create our search mailbox
+ Mailbox searchMailbox = getSearchMailbox(accountId);
+ final long searchMailboxId = searchMailbox.mId;
+
+ mSearchParams = new SearchParams(inbox.mId, filter, searchMailboxId);
+
+ final Context context = getContext();
+ if (mSearchParams.mOffset == 0) {
+ // Delete existing contents of search mailbox
+ ContentResolver resolver = context.getContentResolver();
+ resolver.delete(Message.CONTENT_URI, Message.MAILBOX_KEY + "=" + searchMailboxId,
+ null);
+ ContentValues cv = new ContentValues();
+ // For now, use the actual query as the name of the mailbox
+ cv.put(Mailbox.DISPLAY_NAME, mSearchParams.mFilter);
+ resolver.update(ContentUris.withAppendedId(Mailbox.CONTENT_URI, searchMailboxId),
+ cv, null, null);
+ }
+
+ // Start the search running in the background
+ runSearchQuery(context, accountId, searchMailboxId);
+
+ // This will look just like a "normal" folder
+ return uiQuery(UI_FOLDER, ContentUris.withAppendedId(Mailbox.CONTENT_URI,
+ searchMailbox.mId), projection);
+ }
+
+ private static final String MAILBOXES_FOR_ACCOUNT_SELECTION = MailboxColumns.ACCOUNT_KEY + "=?";
+ private static final String MAILBOXES_FOR_ACCOUNT_EXCEPT_ACCOUNT_MAILBOX_SELECTION =
+ MAILBOXES_FOR_ACCOUNT_SELECTION + " AND " + MailboxColumns.TYPE + "!=" +
+ Mailbox.TYPE_EAS_ACCOUNT_MAILBOX;
+ private static final String MESSAGES_FOR_ACCOUNT_SELECTION = MessageColumns.ACCOUNT_KEY + "=?";
+
+ /**
+ * Delete an account and clean it up
+ */
+ private int uiDeleteAccount(Uri uri) {
+ Context context = getContext();
+ long accountId = Long.parseLong(uri.getLastPathSegment());
+ try {
+ // Get the account URI.
+ final Account account = Account.restoreAccountWithId(context, accountId);
+ if (account == null) {
+ return 0; // Already deleted?
+ }
+
+ deleteAccountData(context, accountId);
+
+ // Now delete the account itself
+ uri = ContentUris.withAppendedId(Account.CONTENT_URI, accountId);
+ context.getContentResolver().delete(uri, null, null);
+
+ // Clean up
+ AccountBackupRestore.backup(context);
+ SecurityPolicy.getInstance(context).reducePolicies();
+ MailActivityEmail.setServicesEnabledSync(context);
+ return 1;
+ } catch (Exception e) {
+ Log.w(Logging.LOG_TAG, "Exception while deleting account", e);
+ }
+ return 0;
+ }
+
+ private int uiDeleteAccountData(Uri uri) {
+ Context context = getContext();
+ long accountId = Long.parseLong(uri.getLastPathSegment());
+ // Get the account URI.
+ final Account account = Account.restoreAccountWithId(context, accountId);
+ if (account == null) {
+ return 0; // Already deleted?
+ }
+ deleteAccountData(context, accountId);
+ return 1;
+ }
+
+ private void deleteAccountData(Context context, long accountId) {
+ // Delete synced attachments
+ AttachmentUtilities.deleteAllAccountAttachmentFiles(context, accountId);
+
+ // Delete synced email, leaving only an empty inbox. We do this in two phases:
+ // 1. Delete all non-inbox mailboxes (which will delete all of their messages)
+ // 2. Delete all remaining messages (which will be the inbox messages)
+ ContentResolver resolver = context.getContentResolver();
+ String[] accountIdArgs = new String[] { Long.toString(accountId) };
+ resolver.delete(Mailbox.CONTENT_URI,
+ MAILBOXES_FOR_ACCOUNT_EXCEPT_ACCOUNT_MAILBOX_SELECTION,
+ accountIdArgs);
+ resolver.delete(Message.CONTENT_URI, MESSAGES_FOR_ACCOUNT_SELECTION, accountIdArgs);
+
+ // Delete sync keys on remaining items
+ ContentValues cv = new ContentValues();
+ cv.putNull(Account.SYNC_KEY);
+ resolver.update(Account.CONTENT_URI, cv, Account.ID_SELECTION, accountIdArgs);
+ cv.clear();
+ cv.putNull(Mailbox.SYNC_KEY);
+ resolver.update(Mailbox.CONTENT_URI, cv,
+ MAILBOXES_FOR_ACCOUNT_SELECTION, accountIdArgs);
+
+ // Delete PIM data (contacts, calendar), stop syncs, etc. if applicable
+ IEmailService service = EmailServiceUtils.getServiceForAccount(context, null, accountId);
+ if (service != null) {
+ try {
+ service.deleteAccountPIMData(accountId);
+ } catch (RemoteException e) {
+ // Can't do anything about this
+ }
+ }
+ }
+
+ private int[] mSavedWidgetIds = new int[0];
+ private ArrayList<Long> mWidgetNotifyMailboxes = new ArrayList<Long>();
+ private AppWidgetManager mAppWidgetManager;
+ private ComponentName mEmailComponent;
+
+ private void notifyWidgets(long mailboxId) {
+ Context context = getContext();
+ // Lazily initialize these
+ if (mAppWidgetManager == null) {
+ mAppWidgetManager = AppWidgetManager.getInstance(context);
+ mEmailComponent = new ComponentName(context, WidgetProvider.PROVIDER_NAME);
+ }
+
+ // See if we have to populate our array of mailboxes used in widgets
+ int[] widgetIds = mAppWidgetManager.getAppWidgetIds(mEmailComponent);
+ if (!Arrays.equals(widgetIds, mSavedWidgetIds)) {
+ mSavedWidgetIds = widgetIds;
+ String[][] widgetInfos = BaseWidgetProvider.getWidgetInfo(context, widgetIds);
+ // widgetInfo now has pairs of account uri/folder uri
+ mWidgetNotifyMailboxes.clear();
+ for (String[] widgetInfo: widgetInfos) {
+ try {
+ if (widgetInfo == null) continue;
+ long id = Long.parseLong(Uri.parse(widgetInfo[1]).getLastPathSegment());
+ if (!isCombinedMailbox(id)) {
+ // For a regular mailbox, just add it to the list
+ if (!mWidgetNotifyMailboxes.contains(id)) {
+ mWidgetNotifyMailboxes.add(id);
+ }
+ } else {
+ switch (getVirtualMailboxType(id)) {
+ // We only handle the combined inbox in widgets
+ case Mailbox.TYPE_INBOX:
+ Cursor c = query(Mailbox.CONTENT_URI, Mailbox.ID_PROJECTION,
+ MailboxColumns.TYPE + "=?",
+ new String[] {Integer.toString(Mailbox.TYPE_INBOX)}, null);
+ try {
+ while (c.moveToNext()) {
+ mWidgetNotifyMailboxes.add(
+ c.getLong(Mailbox.ID_PROJECTION_COLUMN));
+ }
+ } finally {
+ c.close();
+ }
+ break;
+ }
+ }
+ } catch (NumberFormatException e) {
+ // Move along
+ }
+ }
+ }
+
+ // If our mailbox needs to be notified, do so...
+ if (mWidgetNotifyMailboxes.contains(mailboxId)) {
+ Intent intent = new Intent(Utils.ACTION_NOTIFY_DATASET_CHANGED);
+ intent.putExtra(Utils.EXTRA_FOLDER_URI, uiUri("uifolder", mailboxId));
+ intent.setType(EMAIL_APP_MIME_TYPE);
+ context.sendBroadcast(intent);
+ }
}
}
diff --git a/src/com/android/email/provider/WidgetProvider.java b/src/com/android/email/provider/WidgetProvider.java
deleted file mode 100644
index 0f6731b8b..000000000
--- a/src/com/android/email/provider/WidgetProvider.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.provider;
-
-import android.app.Service;
-import android.appwidget.AppWidgetManager;
-import android.appwidget.AppWidgetProvider;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.util.Log;
-import android.widget.RemoteViewsService;
-
-import com.android.email.Email;
-import com.android.email.R;
-import com.android.email.widget.EmailWidget;
-import com.android.email.widget.WidgetManager;
-import com.android.emailcommon.Logging;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-public class WidgetProvider extends AppWidgetProvider {
- @Override
- public void onEnabled(final Context context) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(EmailWidget.TAG, "onEnabled");
- }
- super.onEnabled(context);
- }
-
- @Override
- public void onDisabled(Context context) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(EmailWidget.TAG, "onDisabled");
- }
- context.stopService(new Intent(context, WidgetService.class));
- super.onDisabled(context);
- }
-
- @Override
- public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(EmailWidget.TAG, "onUpdate");
- }
- super.onUpdate(context, appWidgetManager, appWidgetIds);
- WidgetManager.getInstance().updateWidgets(context, appWidgetIds);
- }
-
- @Override
- public void onDeleted(Context context, int[] appWidgetIds) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(EmailWidget.TAG, "onDeleted");
- }
- WidgetManager.getInstance().deleteWidgets(context, appWidgetIds);
- super.onDeleted(context, appWidgetIds);
- }
-
- @Override
- public void onReceive(final Context context, Intent intent) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(EmailWidget.TAG, "onReceive");
- }
- super.onReceive(context, intent);
-
- if (EmailProvider.ACTION_NOTIFY_MESSAGE_LIST_DATASET_CHANGED.equals(intent.getAction())) {
- // Retrieve the list of current widgets.
- final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
- final ComponentName component = new ComponentName(context, WidgetProvider.class);
- final int[] widgetIds = appWidgetManager.getAppWidgetIds(component);
-
- // Ideally, this would only call notify AppWidgetViewDataChanged for the widgets, where
- // the account had the change, but the current intent doesn't include this information.
-
- // Calling notifyAppWidgetViewDataChanged will cause onDataSetChanged() to be called
- // on the RemoteViewsService.RemoteViewsFactory, starting the service if necessary.
- appWidgetManager.notifyAppWidgetViewDataChanged(widgetIds, R.id.message_list);
- }
- }
-
- /**
- * We use the WidgetService for two purposes:
- * 1) To provide a widget factory for RemoteViews, and
- * 2) Catch our command Uri's (i.e. take actions on user clicks) and let EmailWidget
- * handle them.
- */
- public static class WidgetService extends RemoteViewsService {
- @Override
- public RemoteViewsFactory onGetViewFactory(Intent intent) {
- // Which widget do we want (nice alliteration, huh?)
- int widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
- if (widgetId == -1) return null;
- // Find the existing widget or create it
- return WidgetManager.getInstance().getOrCreateWidget(this, widgetId);
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- if (intent.getData() != null) {
- // EmailWidget creates intents, so it knows how to handle them.
- EmailWidget.processIntent(this, intent);
- }
- return Service.START_NOT_STICKY;
- }
-
- @Override
- protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
- WidgetManager.getInstance().dump(fd, writer, args);
- }
- }
- }
diff --git a/src/com/android/email/service/AccountService.java b/src/com/android/email/service/AccountService.java
index 88bd6461b..9ca434ee2 100644
--- a/src/com/android/email/service/AccountService.java
+++ b/src/com/android/email/service/AccountService.java
@@ -24,14 +24,15 @@ import android.database.Cursor;
import android.os.Bundle;
import android.os.IBinder;
-import com.android.email.Email;
import com.android.email.NotificationController;
import com.android.email.ResourceHelper;
import com.android.email.VendorPolicyLoader;
import com.android.email.provider.AccountReconciler;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.Configuration;
import com.android.emailcommon.Device;
import com.android.emailcommon.provider.Account;
+import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.service.IAccountService;
import com.android.emailcommon.utility.EmailAsyncTask;
@@ -103,10 +104,10 @@ public class AccountService extends Service {
EmailAsyncTask.runAsyncSerial(new Runnable() {
@Override
public void run() {
- // Make sure the service is properly running (re: lifecycle)
- EmailServiceUtils.startExchangeService(mContext);
+ // Make sure remote services are running (re: lifecycle)
+ EmailServiceUtils.startRemoteServices(mContext);
// Send current logging flags
- Email.updateLoggingFlags(mContext);
+ MailActivityEmail.updateLoggingFlags(mContext);
}});
return Device.getDeviceId(mContext);
} catch (IOException e) {
diff --git a/src/com/android/email/service/AttachmentDownloadService.java b/src/com/android/email/service/AttachmentDownloadService.java
index 18468fbb1..e86e03f37 100644
--- a/src/com/android/email/service/AttachmentDownloadService.java
+++ b/src/com/android/email/service/AttachmentDownloadService.java
@@ -33,13 +33,13 @@ import android.text.format.DateUtils;
import android.util.Log;
import com.android.email.AttachmentInfo;
-import com.android.email.Controller.ControllerService;
-import com.android.email.Email;
import com.android.email.EmailConnectivityManager;
import com.android.email.NotificationController;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent;
import com.android.emailcommon.provider.EmailContent.Attachment;
+import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
import com.android.emailcommon.provider.EmailContent.Message;
import com.android.emailcommon.service.EmailServiceProxy;
import com.android.emailcommon.service.EmailServiceStatus;
@@ -62,7 +62,7 @@ public class AttachmentDownloadService extends Service implements Runnable {
// Our idle time, waiting for notifications; this is something of a failsafe
private static final int PROCESS_QUEUE_WAIT_TIME = 30 * ((int)DateUtils.MINUTE_IN_MILLIS);
// How often our watchdog checks for callback timeouts
- private static final int WATCHDOG_CHECK_INTERVAL = 15 * ((int)DateUtils.SECOND_IN_MILLIS);
+ private static final int WATCHDOG_CHECK_INTERVAL = 20 * ((int)DateUtils.SECOND_IN_MILLIS);
// How long we'll wait for a callback before canceling a download and retrying
private static final int CALLBACK_TIMEOUT = 30 * ((int)DateUtils.SECOND_IN_MILLIS);
// Try to download an attachment in the background this many times before giving up
@@ -155,6 +155,7 @@ public class AttachmentDownloadService extends Service implements Runnable {
@Override
public void onReceive(final Context context, Intent intent) {
new Thread(new Runnable() {
+ @Override
public void run() {
watchdogAlarm();
}
@@ -234,7 +235,6 @@ public class AttachmentDownloadService extends Service implements Runnable {
/*package*/ class DownloadSet extends TreeSet<DownloadRequest> {
private static final long serialVersionUID = 1L;
private PendingIntent mWatchdogPendingIntent;
- private AlarmManager mAlarmManager;
/*package*/ DownloadSet(Comparator<? super DownloadRequest> comparator) {
super(comparator);
@@ -256,14 +256,14 @@ public class AttachmentDownloadService extends Service implements Runnable {
DownloadRequest req = findDownloadRequest(att.mId);
long priority = getPriority(att);
if (priority == PRIORITY_NONE) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "== Attachment changed: " + att.mId);
}
// In this case, there is no download priority for this attachment
if (req != null) {
// If it exists in the map, remove it
// NOTE: We don't yet support deleting downloads in progress
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "== Attachment " + att.mId + " was in queue, removing");
}
remove(req);
@@ -278,7 +278,7 @@ public class AttachmentDownloadService extends Service implements Runnable {
}
// If the request already existed, we'll update the priority (so that the time is
// up-to-date); otherwise, we create a new request
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "== Download queued for attachment " + att.mId + ", class " +
req.priority + ", priority time " + req.time);
}
@@ -313,7 +313,7 @@ public class AttachmentDownloadService extends Service implements Runnable {
* the limit on maximum downloads
*/
/*package*/ synchronized void processQueue() {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "== Checking attachment queue, " + mDownloadSet.size() + " entries");
}
@@ -324,13 +324,14 @@ public class AttachmentDownloadService extends Service implements Runnable {
DownloadRequest req = iterator.next();
// Enforce per-account limit here
if (downloadsForAccount(req.accountId) >= MAX_SIMULTANEOUS_DOWNLOADS_PER_ACCOUNT) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "== Skip #" + req.attachmentId + "; maxed for acct #" +
req.accountId);
}
continue;
+ } else if (Attachment.restoreAttachmentWithId(mContext, req.attachmentId) == null) {
+ continue;
}
-
if (!req.inProgress) {
mDownloadSet.tryStartDownload(req);
}
@@ -351,25 +352,28 @@ public class AttachmentDownloadService extends Service implements Runnable {
// We'll load up the newest 25 attachments that aren't loaded or queued
Uri lookupUri = EmailContent.uriWithLimit(Attachment.CONTENT_URI,
MAX_ATTACHMENTS_TO_CHECK);
- Cursor c = mContext.getContentResolver().query(lookupUri, AttachmentInfo.PROJECTION,
+ Cursor c = mContext.getContentResolver().query(lookupUri,
+ Attachment.CONTENT_PROJECTION,
EmailContent.Attachment.PRECACHE_INBOX_SELECTION,
null, Attachment.RECORD_ID + " DESC");
File cacheDir = mContext.getCacheDir();
try {
while (c.moveToNext()) {
- long accountKey = c.getLong(AttachmentInfo.COLUMN_ACCOUNT_KEY);
- long id = c.getLong(AttachmentInfo.COLUMN_ID);
- Account account = Account.restoreAccountWithId(mContext, accountKey);
+ Attachment att = new Attachment();
+ att.restore(c);
+ Account account = Account.restoreAccountWithId(mContext, att.mAccountKey);
if (account == null) {
// Clean up this orphaned attachment; there's no point in keeping it
// around; then try to find another one
- EmailContent.delete(mContext, Attachment.CONTENT_URI, id);
- } else if (canPrefetchForAccount(account, cacheDir)) {
+ EmailContent.delete(mContext, Attachment.CONTENT_URI, att.mId);
+ } else {
// Check that the attachment meets system requirements for download
- AttachmentInfo info = new AttachmentInfo(mContext, c);
+ AttachmentInfo info = new AttachmentInfo(mContext, att);
if (info.isEligibleForDownload()) {
- Attachment att = Attachment.restoreAttachmentWithId(mContext, id);
- if (att != null) {
+ // Either the account must be able to prefetch or this must be
+ // an inline attachment
+ if (att.mContentId != null ||
+ (canPrefetchForAccount(account, cacheDir))) {
Integer tryCount;
tryCount = mAttachmentFailureMap.get(att.mId);
if (tryCount != null && tryCount > MAX_DOWNLOAD_RETRIES) {
@@ -405,20 +409,13 @@ public class AttachmentDownloadService extends Service implements Runnable {
return count;
}
- private void cancelWatchdogAlarm() {
- if (mAlarmManager != null && mWatchdogPendingIntent != null) {
- mAlarmManager.cancel(mWatchdogPendingIntent);
- }
- }
-
/**
* Watchdog for downloads; we use this in case we are hanging on a download, which might
* have failed silently (the connection dropped, for example)
*/
private void onWatchdogAlarm() {
- // If our service instance is gone, just leave (but cancel alarm first!)
+ // If our service instance is gone, just leave
if (mStop) {
- cancelWatchdogAlarm();
return;
}
long now = System.currentTimeMillis();
@@ -426,20 +423,23 @@ public class AttachmentDownloadService extends Service implements Runnable {
// Check how long it's been since receiving a callback
long timeSinceCallback = now - req.lastCallbackTime;
if (timeSinceCallback > CALLBACK_TIMEOUT) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "== Download of " + req.attachmentId + " timed out");
}
cancelDownload(req);
}
}
- // If there are downloads in progress, reset alarm
- if (mDownloadsInProgress.isEmpty()) {
- cancelWatchdogAlarm();
- }
// Check whether we can start new downloads...
if (mConnectivityManager != null && mConnectivityManager.hasConnectivity()) {
processQueue();
}
+ // If there are downloads in progress, reset alarm
+ if (!mDownloadsInProgress.isEmpty()) {
+ if (MailActivityEmail.DEBUG) {
+ Log.d(TAG, "Reschedule watchdog...");
+ }
+ setWatchdogAlarm();
+ }
}
/**
@@ -449,18 +449,18 @@ public class AttachmentDownloadService extends Service implements Runnable {
* @return whether or not the download was started
*/
/*package*/ synchronized boolean tryStartDownload(DownloadRequest req) {
- Intent intent = getServiceIntentForAccount(req.accountId);
- if (intent == null) return false;
+ EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(
+ AttachmentDownloadService.this, mServiceCallback, req.accountId);
// Do not download the same attachment multiple times
boolean alreadyInProgress = mDownloadsInProgress.get(req.attachmentId) != null;
if (alreadyInProgress) return false;
try {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, ">> Starting download for attachment #" + req.attachmentId);
}
- startDownload(intent, req);
+ startDownload(service, req);
} catch (RemoteException e) {
// TODO: Consider whether we need to do more in this case...
// For now, fix up our data to reflect the failure
@@ -473,36 +473,34 @@ public class AttachmentDownloadService extends Service implements Runnable {
return mDownloadsInProgress.get(attachmentId);
}
+ private void setWatchdogAlarm() {
+ // Lazily initialize the pending intent
+ if (mWatchdogPendingIntent == null) {
+ Intent intent = new Intent(mContext, Watchdog.class);
+ mWatchdogPendingIntent =
+ PendingIntent.getBroadcast(mContext, 0, intent, 0);
+ }
+ // Set the alarm
+ AlarmManager am = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
+ am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + WATCHDOG_CHECK_INTERVAL,
+ mWatchdogPendingIntent);
+ }
+
/**
* Do the work of starting an attachment download using the EmailService interface, and
* set our watchdog alarm
*
- * @param serviceClass the class that will attempt the download
+ * @param serviceClass the service handling the download
* @param req the DownloadRequest
* @throws RemoteException
*/
- private void startDownload(Intent intent, DownloadRequest req)
+ private void startDownload(EmailServiceProxy service, DownloadRequest req)
throws RemoteException {
req.startTime = System.currentTimeMillis();
req.inProgress = true;
mDownloadsInProgress.put(req.attachmentId, req);
- EmailServiceProxy proxy =
- new EmailServiceProxy(mContext, intent, mServiceCallback);
- proxy.loadAttachment(req.attachmentId, req.priority != PRIORITY_FOREGROUND);
- // Lazily initialize our (reusable) pending intent
- if (mWatchdogPendingIntent == null) {
- createWatchdogPendingIntent(mContext);
- }
- // Set the alarm
- mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
- System.currentTimeMillis() + WATCHDOG_CHECK_INTERVAL, WATCHDOG_CHECK_INTERVAL,
- mWatchdogPendingIntent);
- }
-
- /*package*/ void createWatchdogPendingIntent(Context context) {
- Intent alarmIntent = new Intent(context, Watchdog.class);
- mWatchdogPendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
- mAlarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
+ service.loadAttachment(req.attachmentId, req.priority != PRIORITY_FOREGROUND);
+ setWatchdogAlarm();
}
private void cancelDownload(DownloadRequest req) {
@@ -538,7 +536,7 @@ public class AttachmentDownloadService extends Service implements Runnable {
DownloadRequest req = mDownloadSet.findDownloadRequest(attachmentId);
if (statusCode == EmailServiceStatus.CONNECTION_ERROR) {
// If this needs to be retried, just process the queue again
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "== The download for attachment #" + attachmentId +
" will be retried");
}
@@ -553,7 +551,7 @@ public class AttachmentDownloadService extends Service implements Runnable {
if (req != null) {
remove(req);
}
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
long secs = 0;
if (req != null) {
secs = (System.currentTimeMillis() - req.time) / 1000;
@@ -589,10 +587,16 @@ public class AttachmentDownloadService extends Service implements Runnable {
// try to send pending mail now (as mediated by MailService)
if ((req != null) &&
!Utility.hasUnloadedAttachments(mContext, attachment.mMessageKey)) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "== Downloads finished for outgoing msg #" + req.messageId);
}
- MailService.actionSendPendingMail(mContext, req.accountId);
+ EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(
+ mContext, null, accountId);
+ try {
+ service.sendMail(accountId);
+ } catch (RemoteException e) {
+ // We tried
+ }
}
}
if (statusCode == EmailServiceStatus.MESSAGE_NOT_FOUND) {
@@ -652,12 +656,13 @@ public class AttachmentDownloadService extends Service implements Runnable {
* single callback that's defined by the EmailServiceCallback interface.
*/
private class ServiceCallback extends IEmailServiceCallback.Stub {
+ @Override
public void loadAttachmentStatus(long messageId, long attachmentId, int statusCode,
int progress) {
// Record status and progress
DownloadRequest req = mDownloadSet.getDownloadInProgress(attachmentId);
if (req != null) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
String code;
switch(statusCode) {
case EmailServiceStatus.SUCCESS: code = "Success"; break;
@@ -673,6 +678,15 @@ public class AttachmentDownloadService extends Service implements Runnable {
req.lastStatusCode = statusCode;
req.lastProgress = progress;
req.lastCallbackTime = System.currentTimeMillis();
+ Attachment attachment = Attachment.restoreAttachmentWithId(mContext, attachmentId);
+ if (attachment != null && statusCode == EmailServiceStatus.IN_PROGRESS) {
+ ContentValues values = new ContentValues();
+ values.put(AttachmentColumns.UI_DOWNLOADED_SIZE,
+ attachment.mSize * progress / 100);
+ // Update UIProvider with updated download size
+ // Individual services will set contentUri and state when finished
+ attachment.update(mContext, values);
+ }
}
switch (statusCode) {
case EmailServiceStatus.IN_PROGRESS:
@@ -684,40 +698,24 @@ public class AttachmentDownloadService extends Service implements Runnable {
}
@Override
- public void sendMessageStatus(long messageId, String subject, int statusCode, int progress)
+ public void syncMailboxListStatus(long accountId, int statusCode, int progress)
throws RemoteException {
}
@Override
- public void syncMailboxListStatus(long accountId, int statusCode, int progress)
+ public void syncMailboxStatus(long mailboxId, int statusCode, int progress)
throws RemoteException {
}
@Override
- public void syncMailboxStatus(long mailboxId, int statusCode, int progress)
+ public void sendMessageStatus(long messageId, String subject, int statusCode, int progress)
throws RemoteException {
}
- }
- /**
- * Return an Intent to be used used based on the account type of the provided account id. We
- * cache the results to avoid repeated database access
- * @param accountId the id of the account
- * @return the Intent to be used for the account or null (if the account no longer exists)
- */
- private synchronized Intent getServiceIntentForAccount(long accountId) {
- // TODO: We should have some more data-driven way of determining the service intent.
- Intent serviceIntent = mAccountServiceMap.get(accountId);
- if (serviceIntent == null) {
- String protocol = Account.getProtocol(mContext, accountId);
- if (protocol == null) return null;
- serviceIntent = new Intent(mContext, ControllerService.class);
- if (protocol.equals("eas")) {
- serviceIntent = new Intent(EmailServiceProxy.EXCHANGE_INTENT);
- }
- mAccountServiceMap.put(accountId, serviceIntent);
+ @Override
+ public void loadMessageStatus(long messageId, int statusCode, int progress)
+ throws RemoteException {
}
- return serviceIntent;
}
/*package*/ void addServiceIntentForTest(long accountId, Intent intent) {
@@ -739,7 +737,7 @@ public class AttachmentDownloadService extends Service implements Runnable {
/*package*/ boolean dequeue(long attachmentId) {
DownloadRequest req = mDownloadSet.findDownloadRequest(attachmentId);
if (req != null) {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, "Dequeued attachmentId: " + attachmentId);
}
mDownloadSet.remove(req);
@@ -801,6 +799,7 @@ public class AttachmentDownloadService extends Service implements Runnable {
*/
public static void attachmentChanged(final Context context, final long id, final int flags) {
Utility.runAsync(new Runnable() {
+ @Override
public void run() {
Attachment attachment = Attachment.restoreAttachmentWithId(context, id);
if (attachment != null) {
@@ -859,7 +858,7 @@ public class AttachmentDownloadService extends Service implements Runnable {
if (accountStorage < perAccountMaxStorage) {
return true;
} else {
- if (Email.DEBUG) {
+ if (MailActivityEmail.DEBUG) {
Log.d(TAG, ">> Prefetch not allowed for account " + account.mId + "; used " +
accountStorage + ", limit " + perAccountMaxStorage);
}
@@ -867,6 +866,7 @@ public class AttachmentDownloadService extends Service implements Runnable {
}
}
+ @Override
public void run() {
// These fields are only used within the service thread
mContext = this;
diff --git a/src/com/android/email/service/EasAuthenticatorService.java b/src/com/android/email/service/EasAuthenticatorService.java
index 11a16bbe3..4dbca7f0c 100644
--- a/src/com/android/email/service/EasAuthenticatorService.java
+++ b/src/com/android/email/service/EasAuthenticatorService.java
@@ -16,149 +16,8 @@
package com.android.email.service;
-import com.android.email.activity.setup.AccountSetupBasics;
-import com.android.emailcommon.AccountManagerTypes;
-import com.android.emailcommon.CalendarProviderStub;
-import com.android.emailcommon.provider.EmailContent;
-
-import android.accounts.AbstractAccountAuthenticator;
-import android.accounts.Account;
-import android.accounts.AccountAuthenticatorResponse;
-import android.accounts.AccountManager;
-import android.accounts.NetworkErrorException;
-import android.app.Service;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.provider.ContactsContract;
-
/**
- * A very basic authenticator service for EAS. At the moment, it has no UI hooks. When called
- * with addAccount, it simply adds the account to AccountManager directly with a username and
- * password.
+ * This service needs to be declared separately from the base service
*/
-public class EasAuthenticatorService extends Service {
- public static final String OPTIONS_USERNAME = "username";
- public static final String OPTIONS_PASSWORD = "password";
- public static final String OPTIONS_CONTACTS_SYNC_ENABLED = "contacts";
- public static final String OPTIONS_CALENDAR_SYNC_ENABLED = "calendar";
- public static final String OPTIONS_EMAIL_SYNC_ENABLED = "email";
-
- class EasAuthenticator extends AbstractAccountAuthenticator {
- private Context mContext;
-
- public EasAuthenticator(Context context) {
- super(context);
- mContext = context;
- }
-
- @Override
- public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
- String authTokenType, String[] requiredFeatures, Bundle options)
- throws NetworkErrorException {
- // There are two cases here:
- // 1) We are called with a username/password; this comes from the traditional email
- // app UI; we simply create the account and return the proper bundle
- if (options != null && options.containsKey(OPTIONS_PASSWORD)
- && options.containsKey(OPTIONS_USERNAME)) {
- final Account account = new Account(options.getString(OPTIONS_USERNAME),
- AccountManagerTypes.TYPE_EXCHANGE);
- AccountManager.get(EasAuthenticatorService.this).addAccountExplicitly(
- account, options.getString(OPTIONS_PASSWORD), null);
-
- // Set up contacts syncing. ExchangeService will use info from ContentResolver
- // to determine syncability of Contacts for Exchange
- boolean syncContacts = false;
- if (options.containsKey(OPTIONS_CONTACTS_SYNC_ENABLED) &&
- options.getBoolean(OPTIONS_CONTACTS_SYNC_ENABLED)) {
- syncContacts = true;
- }
- ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 1);
- ContentResolver.setSyncAutomatically(account, ContactsContract.AUTHORITY,
- syncContacts);
-
- // Set up calendar syncing, as above
- boolean syncCalendar = false;
- if (options.containsKey(OPTIONS_CALENDAR_SYNC_ENABLED) &&
- options.getBoolean(OPTIONS_CALENDAR_SYNC_ENABLED)) {
- syncCalendar = true;
- }
- ContentResolver.setIsSyncable(account, CalendarProviderStub.AUTHORITY, 1);
- ContentResolver.setSyncAutomatically(account, CalendarProviderStub.AUTHORITY,
- syncCalendar);
-
- // Set up email syncing, as above
- boolean syncEmail = false;
- if (options.containsKey(OPTIONS_EMAIL_SYNC_ENABLED) &&
- options.getBoolean(OPTIONS_EMAIL_SYNC_ENABLED)) {
- syncEmail = true;
- }
- ContentResolver.setIsSyncable(account, EmailContent.AUTHORITY, 1);
- ContentResolver.setSyncAutomatically(account, EmailContent.AUTHORITY,
- syncEmail);
-
- Bundle b = new Bundle();
- b.putString(AccountManager.KEY_ACCOUNT_NAME, options.getString(OPTIONS_USERNAME));
- b.putString(AccountManager.KEY_ACCOUNT_TYPE, AccountManagerTypes.TYPE_EXCHANGE);
- return b;
- // 2) The other case is that we're creating a new account from an Account manager
- // activity. In this case, we add an intent that will be used to gather the
- // account information...
- } else {
- Bundle b = new Bundle();
- Intent intent =
- AccountSetupBasics.actionSetupExchangeIntent(EasAuthenticatorService.this);
- intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
- b.putParcelable(AccountManager.KEY_INTENT, intent);
- return b;
- }
- }
-
- @Override
- public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account,
- Bundle options) {
- return null;
- }
-
- @Override
- public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
- return null;
- }
-
- @Override
- public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
- String authTokenType, Bundle loginOptions) throws NetworkErrorException {
- return null;
- }
-
- @Override
- public String getAuthTokenLabel(String authTokenType) {
- // null means we don't have compartmentalized authtoken types
- return null;
- }
-
- @Override
- public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account,
- String[] features) throws NetworkErrorException {
- return null;
- }
-
- @Override
- public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account,
- String authTokenType, Bundle loginOptions) {
- return null;
- }
-
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- if (AccountManager.ACTION_AUTHENTICATOR_INTENT.equals(intent.getAction())) {
- return new EasAuthenticator(this).getIBinder();
- } else {
- return null;
- }
- }
+public class EasAuthenticatorService extends AuthenticatorService {
}
diff --git a/src/com/android/email/service/EasAuthenticatorServiceAlternate.java b/src/com/android/email/service/EasAuthenticatorServiceAlternate.java
index 2c8d47263..28d8fb72f 100644
--- a/src/com/android/email/service/EasAuthenticatorServiceAlternate.java
+++ b/src/com/android/email/service/EasAuthenticatorServiceAlternate.java
@@ -17,11 +17,7 @@
package com.android.email.service;
/**
- * {@link EasAuthenticatorService} used with the alternative label.
- *
- * <p>Functionality wise, it's a 100% clone of {@link EasAuthenticatorService}, but in order to
- * independently disable/enable each service we need to give it a different class name.
+ * This service needs to be declared separately from the base service
*/
-public class EasAuthenticatorServiceAlternate extends EasAuthenticatorService {
-
+public class EasAuthenticatorServiceAlternate extends AuthenticatorService {
}
diff --git a/src/com/android/email/service/EasTestAuthenticatorService.java b/src/com/android/email/service/EasTestAuthenticatorService.java
index 23906a506..cdb213fac 100644
--- a/src/com/android/email/service/EasTestAuthenticatorService.java
+++ b/src/com/android/email/service/EasTestAuthenticatorService.java
@@ -67,7 +67,8 @@ public class EasTestAuthenticatorService extends Service {
} else {
Bundle b = new Bundle();
Intent intent =
- AccountSetupBasics.actionSetupExchangeIntent(EasTestAuthenticatorService.this);
+ AccountSetupBasics.actionGetCreateAccountIntent(
+ EasTestAuthenticatorService.this, accountType);
intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
b.putParcelable(AccountManager.KEY_INTENT, intent);
return b;
diff --git a/src/com/android/email/service/EmailBroadcastProcessorService.java b/src/com/android/email/service/EmailBroadcastProcessorService.java
index bfd4f3f33..a3d2ec05f 100644
--- a/src/com/android/email/service/EmailBroadcastProcessorService.java
+++ b/src/com/android/email/service/EmailBroadcastProcessorService.java
@@ -29,7 +29,7 @@ import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
-import com.android.email.Email;
+import com.android.email.NotificationController;
import com.android.email.Preferences;
import com.android.email.SecurityPolicy;
import com.android.email.VendorPolicyLoader;
@@ -64,6 +64,10 @@ public class EmailBroadcastProcessorService extends IntentService {
private static final String ACTION_DEVICE_POLICY_ADMIN = "com.android.email.devicepolicy";
private static final String EXTRA_DEVICE_POLICY_ADMIN = "message_code";
+ // Broadcast received to initiate new message notification updates
+ public static final String ACTION_NOTIFY_NEW_MAIL =
+ "com.android.mail.action.update_notification";
+
public EmailBroadcastProcessorService() {
// Class name will be the thread name.
super(EmailBroadcastProcessorService.class.getName());
@@ -106,19 +110,13 @@ public class EmailBroadcastProcessorService extends IntentService {
if (Intent.ACTION_BOOT_COMPLETED.equals(broadcastAction)) {
onBootCompleted();
-
- // TODO: Do a better job when we get ACTION_DEVICE_STORAGE_LOW.
- // The code below came from very old code....
- } else if (Intent.ACTION_DEVICE_STORAGE_LOW.equals(broadcastAction)) {
- // Stop IMAP/POP3 poll.
- MailService.actionCancel(this);
- } else if (Intent.ACTION_DEVICE_STORAGE_OK.equals(broadcastAction)) {
- enableComponentsIfNecessary();
} else if (ACTION_SECRET_CODE.equals(broadcastAction)
&& SECRET_CODE_HOST_DEBUG_SCREEN.equals(broadcastIntent.getData().getHost())) {
AccountSettings.actionSettingsWithDebug(this);
} else if (AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION.equals(broadcastAction)) {
onSystemAccountChanged();
+ } else if (ACTION_NOTIFY_NEW_MAIL.equals(broadcastAction)) {
+ NotificationController.notifyNewMail(this, broadcastIntent);
}
} else if (ACTION_DEVICE_POLICY_ADMIN.equals(action)) {
int message = intent.getIntExtra(EXTRA_DEVICE_POLICY_ADMIN, -1);
@@ -126,24 +124,14 @@ public class EmailBroadcastProcessorService extends IntentService {
}
}
- private void enableComponentsIfNecessary() {
- if (Email.setServicesEnabledSync(this)) {
- // At least one account exists.
- // TODO probably we should check if it's a POP/IMAP account.
- MailService.actionReschedule(this);
- }
- }
-
/**
* Handles {@link Intent#ACTION_BOOT_COMPLETED}. Called on a worker thread.
*/
private void onBootCompleted() {
performOneTimeInitialization();
- enableComponentsIfNecessary();
-
- // Starts the service for Exchange, if supported.
- EmailServiceUtils.startExchangeService(this);
+ // Starts remote services, if any
+ EmailServiceUtils.startRemoteServices(this);
}
private void performOneTimeInitialization() {
@@ -189,7 +177,7 @@ public class EmailBroadcastProcessorService extends IntentService {
while (c.moveToNext()) {
long recvAuthKey = c.getLong(Account.CONTENT_HOST_AUTH_KEY_RECV_COLUMN);
HostAuth recvAuth = HostAuth.restoreHostAuthWithId(context, recvAuthKey);
- if (HostAuth.SCHEME_IMAP.equals(recvAuth.mProtocol)) {
+ if (HostAuth.LEGACY_SCHEME_IMAP.equals(recvAuth.mProtocol)) {
int flags = c.getInt(Account.CONTENT_FLAGS_COLUMN);
flags &= ~Account.FLAGS_DELETE_POLICY_MASK;
flags |= Account.DELETE_POLICY_ON_DELETE << Account.FLAGS_DELETE_POLICY_SHIFT;
@@ -217,8 +205,7 @@ public class EmailBroadcastProcessorService extends IntentService {
Log.i(Logging.LOG_TAG, "System accounts updated.");
MailService.reconcilePopImapAccountsSync(this);
- // If the exchange service wasn't already running, starting it will cause exchange account
- // reconciliation to be performed. The service stops itself it there are no EAS accounts.
- EmailServiceUtils.startExchangeService(this);
+ // Start any remote services
+ EmailServiceUtils.startRemoteServices(this);
}
}
diff --git a/src/com/android/email/service/EmailServiceUtils.java b/src/com/android/email/service/EmailServiceUtils.java
index 38e35195d..6c40cda8c 100644
--- a/src/com/android/email/service/EmailServiceUtils.java
+++ b/src/com/android/email/service/EmailServiceUtils.java
@@ -19,138 +19,359 @@ package com.android.email.service;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
+import android.util.Log;
+import com.android.email.R;
import com.android.emailcommon.Api;
+import com.android.emailcommon.Logging;
+import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.service.EmailServiceProxy;
import com.android.emailcommon.service.IEmailService;
import com.android.emailcommon.service.IEmailServiceCallback;
import com.android.emailcommon.service.SearchParams;
+import com.android.emailcommon.service.SyncWindow;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
/**
* Utility functions for EmailService support.
*/
public class EmailServiceUtils {
+ private static final ArrayList<EmailServiceInfo> sServiceList =
+ new ArrayList<EmailServiceInfo>();
+
/**
- * Starts an EmailService by name
+ * Starts an EmailService by protocol
*/
- public static void startService(Context context, String intentAction) {
- context.startService(new Intent(intentAction));
+ public static void startService(Context context, String protocol) {
+ EmailServiceInfo info = getServiceInfo(context, protocol);
+ if (info != null && info.intentAction != null) {
+ context.startService(new Intent(info.intentAction));
+ }
}
/**
- * Returns an {@link IEmailService} for the service; otherwise returns an empty
- * {@link IEmailService} implementation.
- *
- * @param context
- * @param callback Object to get callback, or can be null
+ * Starts all remote services
*/
- public static IEmailService getService(Context context, String intentAction,
- IEmailServiceCallback callback) {
- return new EmailServiceProxy(context, intentAction, callback);
+ public static void startRemoteServices(Context context) {
+ for (EmailServiceInfo info: getServiceInfoList(context)) {
+ if (info.intentAction != null) {
+ context.startService(new Intent(info.intentAction));
+ }
+ }
+ }
+
+ /**
+ * Returns whether or not remote services are present on device
+ */
+ public static boolean areRemoteServicesInstalled(Context context) {
+ for (EmailServiceInfo info: getServiceInfoList(context)) {
+ if (info.intentAction != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Starts all remote services
+ */
+ public static void setRemoteServicesLogging(Context context, int debugBits) {
+ for (EmailServiceInfo info: getServiceInfoList(context)) {
+ if (info.intentAction != null) {
+ EmailServiceProxy service =
+ EmailServiceUtils.getService(context, null, info.protocol);
+ if (service != null) {
+ try {
+ service.setLogging(debugBits);
+ } catch (RemoteException e) {
+ // Move along, nothing to see
+ }
+ }
+ }
+ }
}
/**
* Determine if the EmailService is available
*/
- public static boolean isServiceAvailable(Context context, String intentAction) {
- return new EmailServiceProxy(context, intentAction, null).test();
+ public static boolean isServiceAvailable(Context context, String protocol) {
+ EmailServiceInfo info = getServiceInfo(context, protocol);
+ if (info == null) return false;
+ if (info.klass != null) return true;
+ return new EmailServiceProxy(context, info.intentAction, null).test();
+ }
+
+ /**
+ * For a given account id, return a service proxy if applicable, or null.
+ *
+ * @param accountId the message of interest
+ * @result service proxy, or null if n/a
+ */
+ public static EmailServiceProxy getServiceForAccount(Context context,
+ IEmailServiceCallback callback, long accountId) {
+ return getService(context, callback, Account.getProtocol(context, accountId));
+ }
+
+ /**
+ * Holder of service information (currently just name and class/intent); if there is a class
+ * member, this is a (local, i.e. same process) service; otherwise, this is a remote service
+ */
+ public static class EmailServiceInfo {
+ public String protocol;
+ public String name;
+ public String accountType;
+ Class<? extends Service> klass;
+ String intentAction;
+ public int port;
+ public int portSsl;
+ public boolean defaultSsl;
+ public boolean offerTls;
+ public boolean offerCerts;
+ public boolean usesSmtp;
+ public boolean offerLocalDeletes;
+ public int defaultLocalDeletes;
+ public boolean offerPrefix;
+ public boolean usesAutodiscover;
+ public boolean offerLookback;
+ public int defaultLookback;
+ public boolean syncChanges;
+ public boolean syncContacts;
+ public boolean syncCalendar;
+ public boolean offerAttachmentPreload;
+ public CharSequence[] syncIntervalStrings;
+ public CharSequence[] syncIntervals;
+ public int defaultSyncInterval;
+
+ public String toString() {
+ StringBuilder sb = new StringBuilder("Protocol: ");
+ sb.append(protocol);
+ sb.append(", ");
+ sb.append(klass != null ? "Local" : "Remote");
+ return sb.toString();
+ }
}
- public static void startExchangeService(Context context) {
- startService(context, EmailServiceProxy.EXCHANGE_INTENT);
+ public static EmailServiceProxy getService(Context context, IEmailServiceCallback callback,
+ String protocol) {
+ // Handle the degenerate case here (account might have been deleted)
+ if (protocol == null) {
+ Log.w(Logging.LOG_TAG, "Returning NullService for " + protocol);
+ return new EmailServiceProxy(context, NullService.class, null);
+ }
+ EmailServiceInfo info = getServiceInfo(context, protocol);
+ if (info.klass != null) {
+ return new EmailServiceProxy(context, info.klass, callback);
+ } else {
+ return new EmailServiceProxy(context, info.intentAction, callback);
+ }
}
- public static IEmailService getExchangeService(Context context,
- IEmailServiceCallback callback) {
- return getService(context, EmailServiceProxy.EXCHANGE_INTENT, callback);
+ public static EmailServiceInfo getServiceInfo(Context context, String protocol) {
+ if (sServiceList.isEmpty()) {
+ findServices(context);
+ }
+ for (EmailServiceInfo info: sServiceList) {
+ if (info.protocol.equals(protocol)) {
+ return info;
+ }
+ }
+ return null;
}
- public static boolean isExchangeAvailable(Context context) {
- return isServiceAvailable(context, EmailServiceProxy.EXCHANGE_INTENT);
+ public static List<EmailServiceInfo> getServiceInfoList(Context context) {
+ if (sServiceList.isEmpty()) {
+ findServices(context);
+ }
+ return sServiceList;
}
/**
- * An empty {@link IEmailService} implementation which is used instead of
- * {@link com.android.exchange.ExchangeService} on the build with no exchange support.
- *
- * <p>In theory, the service in question isn't used on the no-exchange-support build,
- * because we won't have any exchange accounts in that case, so we wouldn't have to have this
- * class. However, there are a few places we do use the service even if there's no exchange
- * accounts (e.g. setLogging), so this class is added for safety and simplicity.
+ * Parse services.xml file to find our available email services
*/
- public static class NullEmailService extends Service implements IEmailService {
- public static final NullEmailService INSTANCE = new NullEmailService();
+ @SuppressWarnings("unchecked")
+ private static void findServices(Context context) {
+ try {
+ Resources res = context.getResources();
+ XmlResourceParser xml = res.getXml(R.xml.services);
+ int xmlEventType;
+ // walk through senders.xml file.
+ while ((xmlEventType = xml.next()) != XmlResourceParser.END_DOCUMENT) {
+ if (xmlEventType == XmlResourceParser.START_TAG &&
+ "emailservice".equals(xml.getName())) {
+ EmailServiceInfo info = new EmailServiceInfo();
+ TypedArray ta = res.obtainAttributes(xml, R.styleable.EmailServiceInfo);
+ info.protocol = ta.getString(R.styleable.EmailServiceInfo_protocol);
+ info.name = ta.getString(R.styleable.EmailServiceInfo_name);
+ String klass = ta.getString(R.styleable.EmailServiceInfo_serviceClass);
+ info.intentAction = ta.getString(R.styleable.EmailServiceInfo_intent);
+ info.accountType = ta.getString(R.styleable.EmailServiceInfo_accountType);
+ info.defaultSsl = ta.getBoolean(R.styleable.EmailServiceInfo_defaultSsl, false);
+ info.port = ta.getInteger(R.styleable.EmailServiceInfo_port, 0);
+ info.portSsl = ta.getInteger(R.styleable.EmailServiceInfo_portSsl, 0);
+ info.offerTls = ta.getBoolean(R.styleable.EmailServiceInfo_offerTls, false);
+ info.offerCerts = ta.getBoolean(R.styleable.EmailServiceInfo_offerCerts, false);
+ info.offerLocalDeletes =
+ ta.getBoolean(R.styleable.EmailServiceInfo_offerLocalDeletes, false);
+ info.defaultLocalDeletes =
+ ta.getInteger(R.styleable.EmailServiceInfo_defaultLocalDeletes,
+ Account.DELETE_POLICY_ON_DELETE);
+ info.offerPrefix =
+ ta.getBoolean(R.styleable.EmailServiceInfo_offerPrefix, false);
+ info.usesSmtp = ta.getBoolean(R.styleable.EmailServiceInfo_usesSmtp, false);
+ info.usesAutodiscover =
+ ta.getBoolean(R.styleable.EmailServiceInfo_usesAutodiscover, false);
+ info.offerLookback =
+ ta.getBoolean(R.styleable.EmailServiceInfo_offerLookback, false);
+ info.defaultLookback =
+ ta.getInteger(R.styleable.EmailServiceInfo_defaultLookback,
+ SyncWindow.SYNC_WINDOW_3_DAYS);
+ info.syncChanges =
+ ta.getBoolean(R.styleable.EmailServiceInfo_syncChanges, false);
+ info.syncContacts =
+ ta.getBoolean(R.styleable.EmailServiceInfo_syncContacts, false);
+ info.syncCalendar =
+ ta.getBoolean(R.styleable.EmailServiceInfo_syncCalendar, false);
+ info.offerAttachmentPreload =
+ ta.getBoolean(R.styleable.EmailServiceInfo_offerAttachmentPreload, false);
+ info.syncIntervalStrings =
+ ta.getTextArray(R.styleable.EmailServiceInfo_syncIntervalStrings);
+ info.syncIntervals =
+ ta.getTextArray(R.styleable.EmailServiceInfo_syncIntervals);
+ info.defaultSyncInterval =
+ ta.getInteger(R.styleable.EmailServiceInfo_defaultSyncInterval, 15);
- public int getApiLevel() {
- return Api.LEVEL;
+ // Must have either "class" (local) or "intent" (remote)
+ if (klass != null) {
+ try {
+ info.klass = (Class<? extends Service>) Class.forName(klass);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalStateException(
+ "Class not found in service descriptor: " + klass);
+ }
+ }
+ if (info.klass == null && info.intentAction == null) {
+ throw new IllegalStateException(
+ "No class or intent action specified in service descriptor");
+ }
+ if (info.klass != null && info.intentAction != null) {
+ throw new IllegalStateException(
+ "Both class and intent action specified in service descriptor");
+ }
+ sServiceList.add(info);
+ }
+ }
+ } catch (XmlPullParserException e) {
+ // ignore
+ } catch (IOException e) {
+ // ignore
}
+ }
- public Bundle autoDiscover(String userName, String password) throws RemoteException {
- return Bundle.EMPTY;
+ /**
+ * A no-op service that can be returned for non-existent/null protocols
+ */
+ class NullService implements IEmailService {
+ @Override
+ public IBinder asBinder() {
+ return null;
}
- public boolean createFolder(long accountId, String name) throws RemoteException {
- return false;
+ @Override
+ public Bundle validate(HostAuth hostauth) throws RemoteException {
+ return null;
}
- public boolean deleteFolder(long accountId, String name) throws RemoteException {
- return false;
+ @Override
+ public void startSync(long mailboxId, boolean userRequest) throws RemoteException {
}
- public void hostChanged(long accountId) throws RemoteException {
+ @Override
+ public void stopSync(long mailboxId) throws RemoteException {
}
+ @Override
+ public void loadMore(long messageId) throws RemoteException {
+ }
+
+ @Override
public void loadAttachment(long attachmentId, boolean background) throws RemoteException {
}
- public void loadMore(long messageId) throws RemoteException {
+ @Override
+ public void updateFolderList(long accountId) throws RemoteException {
}
- public boolean renameFolder(long accountId, String oldName, String newName)
- throws RemoteException {
+ @Override
+ public boolean createFolder(long accountId, String name) throws RemoteException {
return false;
}
- public void sendMeetingResponse(long messageId, int response) throws RemoteException {
+ @Override
+ public boolean deleteFolder(long accountId, String name) throws RemoteException {
+ return false;
}
- public void setCallback(IEmailServiceCallback cb) throws RemoteException {
+ @Override
+ public boolean renameFolder(long accountId, String oldName, String newName)
+ throws RemoteException {
+ return false;
}
- public void setLogging(int flags) throws RemoteException {
+ @Override
+ public void setCallback(IEmailServiceCallback cb) throws RemoteException {
}
- public void startSync(long mailboxId, boolean userRequest) throws RemoteException {
+ @Override
+ public void setLogging(int on) throws RemoteException {
}
- public void stopSync(long mailboxId) throws RemoteException {
+ @Override
+ public void hostChanged(long accountId) throws RemoteException {
}
- public void updateFolderList(long accountId) throws RemoteException {
+ @Override
+ public Bundle autoDiscover(String userName, String password) throws RemoteException {
+ return null;
}
- public Bundle validate(HostAuth hostAuth) throws RemoteException {
- return null;
+ @Override
+ public void sendMeetingResponse(long messageId, int response) throws RemoteException {
}
+ @Override
public void deleteAccountPIMData(long accountId) throws RemoteException {
}
- public int searchMessages(long accountId, SearchParams searchParams, long destMailboxId) {
+ @Override
+ public int getApiLevel() throws RemoteException {
+ return Api.LEVEL;
+ }
+
+ @Override
+ public int searchMessages(long accountId, SearchParams params, long destMailboxId)
+ throws RemoteException {
return 0;
}
- public IBinder asBinder() {
- return null;
+ @Override
+ public void sendMail(long accountId) throws RemoteException {
}
@Override
- public IBinder onBind(Intent intent) {
- return null;
+ public int getCapabilities(long accountId) throws RemoteException {
+ return 0;
}
}
}
diff --git a/src/com/android/email/service/MailService.java b/src/com/android/email/service/MailService.java
index 4b3f31a54..48cf9d2aa 100644
--- a/src/com/android/email/service/MailService.java
+++ b/src/com/android/email/service/MailService.java
@@ -18,121 +18,30 @@ package com.android.email.service;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
-import android.app.AlarmManager;
-import android.app.PendingIntent;
import android.app.Service;
-import android.content.ContentResolver;
-import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
-import android.content.SyncStatusObserver;
import android.database.Cursor;
-import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
-import android.os.SystemClock;
-import android.text.TextUtils;
-import android.util.Log;
-import com.android.email.Controller;
-import com.android.email.Email;
-import com.android.email.Preferences;
import com.android.email.SingleRunningTask;
import com.android.email.provider.AccountReconciler;
+import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
+import com.android.email2.ui.MailActivityEmail;
import com.android.emailcommon.AccountManagerTypes;
-import com.android.emailcommon.mail.MessagingException;
import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.provider.Mailbox;
import com.android.emailcommon.utility.EmailAsyncTask;
import com.google.common.annotations.VisibleForTesting;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
/**
- * Background service for refreshing non-push email accounts.
- *
- * TODO: Convert to IntentService to move *all* work off the UI thread, serialize work, and avoid
- * possible problems with out-of-order startId processing.
+ * Legacy service, now used mainly for account reconciliation
*/
public class MailService extends Service {
- private static final String LOG_TAG = "Email-MailService";
-
- private static final String ACTION_CHECK_MAIL =
- "com.android.email.intent.action.MAIL_SERVICE_WAKEUP";
- private static final String ACTION_RESCHEDULE =
- "com.android.email.intent.action.MAIL_SERVICE_RESCHEDULE";
- private static final String ACTION_CANCEL =
- "com.android.email.intent.action.MAIL_SERVICE_CANCEL";
- private static final String ACTION_SEND_PENDING_MAIL =
- "com.android.email.intent.action.MAIL_SERVICE_SEND_PENDING";
- private static final String ACTION_DELETE_EXCHANGE_ACCOUNTS =
- "com.android.email.intent.action.MAIL_SERVICE_DELETE_EXCHANGE_ACCOUNTS";
-
- private static final String EXTRA_ACCOUNT = "com.android.email.intent.extra.ACCOUNT";
- private static final String EXTRA_ACCOUNT_INFO = "com.android.email.intent.extra.ACCOUNT_INFO";
- private static final String EXTRA_DEBUG_WATCHDOG = "com.android.email.intent.extra.WATCHDOG";
-
- /** Time between watchdog checks; in milliseconds */
- private static final long WATCHDOG_DELAY = 10 * 60 * 1000; // 10 minutes
-
- /** Sentinel value asking to update mSyncReports if it's currently empty */
- @VisibleForTesting
- static final int SYNC_REPORTS_ALL_ACCOUNTS_IF_EMPTY = -1;
- /** Sentinel value asking that mSyncReports be rebuilt */
- @VisibleForTesting
- static final int SYNC_REPORTS_RESET = -2;
-
- @VisibleForTesting
- Controller mController;
- private final Controller.Result mControllerCallback = new ControllerResults();
- private ContentResolver mContentResolver;
- private Context mContext;
-
- private int mStartId;
-
- /**
- * Access must be synchronized, because there are accesses from the Controller callback
- */
- /*package*/ static HashMap<Long,AccountSyncReport> mSyncReports =
- new HashMap<Long,AccountSyncReport>();
-
- public static void actionReschedule(Context context) {
- Intent i = new Intent();
- i.setClass(context, MailService.class);
- i.setAction(MailService.ACTION_RESCHEDULE);
- context.startService(i);
- }
-
- public static void actionCancel(Context context) {
- Intent i = new Intent();
- i.setClass(context, MailService.class);
- i.setAction(MailService.ACTION_CANCEL);
- context.startService(i);
- }
-
- public static void actionDeleteExchangeAccounts(Context context) {
- Intent i = new Intent();
- i.setClass(context, MailService.class);
- i.setAction(MailService.ACTION_DELETE_EXCHANGE_ACCOUNTS);
- context.startService(i);
- }
-
- /**
- * Entry point for AttachmentDownloadService to ask that pending mail be sent
- * @param context the caller's context
- * @param accountId the account whose pending mail should be sent
- */
- public static void actionSendPendingMail(Context context, long accountId) {
- Intent i = new Intent();
- i.setClass(context, MailService.class);
- i.setAction(MailService.ACTION_SEND_PENDING_MAIL);
- i.putExtra(MailService.EXTRA_ACCOUNT, accountId);
- context.startService(i);
- }
@Override
public int onStartCommand(final Intent intent, int flags, final int startId) {
@@ -145,126 +54,8 @@ public class MailService extends Service {
}
});
- // TODO this needs to be passed through the controller and back to us
- mStartId = startId;
- String action = intent.getAction();
- final long accountId = intent.getLongExtra(EXTRA_ACCOUNT, -1);
-
- mController = Controller.getInstance(this);
- mController.addResultCallback(mControllerCallback);
- mContentResolver = getContentResolver();
- mContext = this;
-
- final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
-
- if (ACTION_CHECK_MAIL.equals(action)) {
- // DB access required to satisfy this intent, so offload from UI thread
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- // If we have the data, restore the last-sync-times for each account
- // These are cached in the wakeup intent in case the process was killed.
- restoreSyncReports(intent);
-
- // Sync a specific account if given
- if (Email.DEBUG) {
- Log.d(LOG_TAG, "action: check mail for id=" + accountId);
- }
- if (accountId >= 0) {
- setWatchdog(accountId, alarmManager);
- }
-
- // Start sync if account is given && auto-sync is allowed
- boolean syncStarted = false;
- if (accountId != -1 && ContentResolver.getMasterSyncAutomatically()) {
- synchronized(mSyncReports) {
- for (AccountSyncReport report: mSyncReports.values()) {
- if (report.accountId == accountId) {
- if (report.syncEnabled) {
- syncStarted = syncOneAccount(mController, accountId,
- startId);
- }
- break;
- }
- }
- }
- }
-
- // Reschedule if we didn't start sync.
- if (!syncStarted) {
- // Prevent runaway on the current account by pretending it updated
- if (accountId != -1) {
- updateAccountReport(accountId, 0);
- }
- // Find next account to sync, and reschedule
- reschedule(alarmManager);
- // Stop the service, unless actually syncing (which will stop the service)
- stopSelf(startId);
- }
- }
- });
- }
- else if (ACTION_CANCEL.equals(action)) {
- if (Email.DEBUG) {
- Log.d(LOG_TAG, "action: cancel");
- }
- cancel();
- stopSelf(startId);
- }
- else if (ACTION_DELETE_EXCHANGE_ACCOUNTS.equals(action)) {
- if (Email.DEBUG) {
- Log.d(LOG_TAG, "action: delete exchange accounts");
- }
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- Cursor c = mContentResolver.query(Account.CONTENT_URI, Account.ID_PROJECTION,
- null, null, null);
- try {
- while (c.moveToNext()) {
- long accountId = c.getLong(Account.ID_PROJECTION_COLUMN);
- if ("eas".equals(Account.getProtocol(mContext, accountId))) {
- // Always log this
- Log.d(LOG_TAG, "Deleting EAS account: " + accountId);
- mController.deleteAccountSync(accountId, mContext);
- }
- }
- } finally {
- c.close();
- }
- }
- });
- stopSelf(startId);
- }
- else if (ACTION_SEND_PENDING_MAIL.equals(action)) {
- if (Email.DEBUG) {
- Log.d(LOG_TAG, "action: send pending mail");
- }
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- mController.sendPendingMessages(accountId);
- }
- });
- stopSelf(startId);
- }
- else if (ACTION_RESCHEDULE.equals(action)) {
- if (Email.DEBUG) {
- Log.d(LOG_TAG, "action: reschedule");
- }
- // DB access required to satisfy this intent, so offload from UI thread
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- // When called externally, we refresh the sync reports table to pick up
- // any changes in the account list or account settings
- refreshSyncReports();
- // Finally, scan for the next needing update, and set an alarm for it
- reschedule(alarmManager);
- stopSelf(startId);
- }
- });
- }
+ // Make sure our services are running, if necessary
+ MailActivityEmail.setServicesEnabledAsync(this);
// Returning START_NOT_STICKY means that if a mail check is killed (e.g. due to memory
// pressure, there will be no explicit restart. This is OK; Note that we set a watchdog
@@ -278,390 +69,6 @@ public class MailService extends Service {
return null;
}
- @Override
- public void onDestroy() {
- super.onDestroy();
- Controller.getInstance(getApplication()).removeResultCallback(mControllerCallback);
- }
-
- private void cancel() {
- AlarmManager alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
- PendingIntent pi = createAlarmIntent(-1, null, false);
- alarmMgr.cancel(pi);
- }
-
- /**
- * Refresh the sync reports, to pick up any changes in the account list or account settings.
- */
- private void refreshSyncReports() {
- synchronized (mSyncReports) {
- // Make shallow copy of sync reports so we can recover the prev sync times
- HashMap<Long,AccountSyncReport> oldSyncReports =
- new HashMap<Long,AccountSyncReport>(mSyncReports);
-
- // Delete the sync reports to force a refresh from live account db data
- setupSyncReportsLocked(SYNC_REPORTS_RESET, this);
-
- // Restore prev-sync & next-sync times for any reports in the new list
- for (AccountSyncReport newReport : mSyncReports.values()) {
- AccountSyncReport oldReport = oldSyncReports.get(newReport.accountId);
- if (oldReport != null) {
- newReport.prevSyncTime = oldReport.prevSyncTime;
- newReport.setNextSyncTime();
- }
- }
- }
- }
-
- /**
- * Create and send an alarm with the entire list. This also sends a list of known last-sync
- * times with the alarm, so if we are killed between alarms, we don't lose this info.
- *
- * @param alarmMgr passed in so we can mock for testing.
- */
- private void reschedule(AlarmManager alarmMgr) {
- // restore the reports if lost
- setupSyncReports(SYNC_REPORTS_ALL_ACCOUNTS_IF_EMPTY);
- synchronized (mSyncReports) {
- int numAccounts = mSyncReports.size();
- long[] accountInfo = new long[numAccounts * 2]; // pairs of { accountId, lastSync }
- int accountInfoIndex = 0;
-
- long nextCheckTime = Long.MAX_VALUE;
- AccountSyncReport nextAccount = null;
- long timeNow = SystemClock.elapsedRealtime();
-
- for (AccountSyncReport report : mSyncReports.values()) {
- if (report.syncInterval <= 0) { // no timed checks - skip
- continue;
- }
- long prevSyncTime = report.prevSyncTime;
- long nextSyncTime = report.nextSyncTime;
-
- // select next account to sync
- if ((prevSyncTime == 0) || (nextSyncTime < timeNow)) { // never checked, or overdue
- nextCheckTime = 0;
- nextAccount = report;
- } else if (nextSyncTime < nextCheckTime) { // next to be checked
- nextCheckTime = nextSyncTime;
- nextAccount = report;
- }
- // collect last-sync-times for all accounts
- // this is using pairs of {long,long} to simplify passing in a bundle
- accountInfo[accountInfoIndex++] = report.accountId;
- accountInfo[accountInfoIndex++] = report.prevSyncTime;
- }
-
- // Clear out any unused elements in the array
- while (accountInfoIndex < accountInfo.length) {
- accountInfo[accountInfoIndex++] = -1;
- }
-
- // set/clear alarm as needed
- long idToCheck = (nextAccount == null) ? -1 : nextAccount.accountId;
- PendingIntent pi = createAlarmIntent(idToCheck, accountInfo, false);
-
- if (nextAccount == null) {
- alarmMgr.cancel(pi);
- if (Email.DEBUG) {
- Log.d(LOG_TAG, "reschedule: alarm cancel - no account to check");
- }
- } else {
- alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextCheckTime, pi);
- if (Email.DEBUG) {
- Log.d(LOG_TAG, "reschedule: alarm set at " + nextCheckTime
- + " for " + nextAccount);
- }
- }
- }
- }
-
- /**
- * Create a watchdog alarm and set it. This is used in case a mail check fails (e.g. we are
- * killed by the system due to memory pressure.) Normally, a mail check will complete and
- * the watchdog will be replaced by the call to reschedule().
- * @param accountId the account we were trying to check
- * @param alarmMgr system alarm manager
- */
- private void setWatchdog(long accountId, AlarmManager alarmMgr) {
- PendingIntent pi = createAlarmIntent(accountId, null, true);
- long timeNow = SystemClock.elapsedRealtime();
- long nextCheckTime = timeNow + WATCHDOG_DELAY;
- alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextCheckTime, pi);
- }
-
- /**
- * Return a pending intent for use by this alarm. Most of the fields must be the same
- * (in order for the intent to be recognized by the alarm manager) but the extras can
- * be different, and are passed in here as parameters.
- */
- private PendingIntent createAlarmIntent(long checkId, long[] accountInfo, boolean isWatchdog) {
- Intent i = new Intent();
- i.setClass(this, MailService.class);
- i.setAction(ACTION_CHECK_MAIL);
- i.putExtra(EXTRA_ACCOUNT, checkId);
- i.putExtra(EXTRA_ACCOUNT_INFO, accountInfo);
- if (isWatchdog) {
- i.putExtra(EXTRA_DEBUG_WATCHDOG, true);
- }
- PendingIntent pi = PendingIntent.getService(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
- return pi;
- }
-
- /**
- * Start a controller sync for a specific account
- *
- * @param controller The controller to do the sync work
- * @param checkAccountId the account Id to try and check
- * @param startId the id of this service launch
- * @return true if mail checking has started, false if it could not (e.g. bad account id)
- */
- private boolean syncOneAccount(Controller controller, long checkAccountId, int startId) {
- long inboxId = Mailbox.findMailboxOfType(this, checkAccountId, Mailbox.TYPE_INBOX);
- if (inboxId == Mailbox.NO_MAILBOX) {
- return false;
- } else {
- controller.serviceCheckMail(checkAccountId, inboxId, startId);
- return true;
- }
- }
-
- /**
- * Note: Times are relative to SystemClock.elapsedRealtime()
- *
- * TODO: Look more closely at syncEnabled and see if we can simply coalesce it into
- * syncInterval (e.g. if !syncEnabled, set syncInterval to -1).
- */
- @VisibleForTesting
- static class AccountSyncReport {
- long accountId;
- /** The time of the last sync, or, {@code 0}, the last sync time is unknown. */
- long prevSyncTime;
- /** The time of the next sync. If {@code 0}, sync ASAP. If {@code 1}, don't sync. */
- long nextSyncTime;
- /** Minimum time between syncs; in minutes. */
- int syncInterval;
- /** If {@code true}, auto sync is enabled. */
- boolean syncEnabled;
-
- /**
- * Sets the next sync time using the previous sync time and sync interval.
- */
- private void setNextSyncTime() {
- if (syncInterval > 0 && prevSyncTime != 0) {
- nextSyncTime = prevSyncTime + (syncInterval * 1000 * 60);
- }
- }
-
- @Override
- public String toString() {
- return "id=" + accountId + " prevSync=" + prevSyncTime + " nextSync=" + nextSyncTime;
- }
- }
-
- /**
- * scan accounts to create a list of { acct, prev sync, next sync, #new }
- * use this to create a fresh copy. assumes all accounts need sync
- *
- * @param accountId -1 will rebuild the list if empty. other values will force loading
- * of a single account (e.g if it was created after the original list population)
- */
- private void setupSyncReports(long accountId) {
- synchronized (mSyncReports) {
- setupSyncReportsLocked(accountId, mContext);
- }
- }
-
- /**
- * Handle the work of setupSyncReports. Must be synchronized on mSyncReports.
- */
- @VisibleForTesting
- void setupSyncReportsLocked(long accountId, Context context) {
- ContentResolver resolver = context.getContentResolver();
- if (accountId == SYNC_REPORTS_RESET) {
- // For test purposes, force refresh of mSyncReports
- mSyncReports.clear();
- accountId = SYNC_REPORTS_ALL_ACCOUNTS_IF_EMPTY;
- } else if (accountId == SYNC_REPORTS_ALL_ACCOUNTS_IF_EMPTY) {
- // -1 == reload the list if empty, otherwise exit immediately
- if (mSyncReports.size() > 0) {
- return;
- }
- } else {
- // load a single account if it doesn't already have a sync record
- if (mSyncReports.containsKey(accountId)) {
- return;
- }
- }
-
- // setup to add a single account or all accounts
- Uri uri;
- if (accountId == SYNC_REPORTS_ALL_ACCOUNTS_IF_EMPTY) {
- uri = Account.CONTENT_URI;
- } else {
- uri = ContentUris.withAppendedId(Account.CONTENT_URI, accountId);
- }
-
- final boolean oneMinuteRefresh
- = Preferences.getPreferences(this).getForceOneMinuteRefresh();
- if (oneMinuteRefresh) {
- Log.w(LOG_TAG, "One-minute refresh enabled.");
- }
-
- // We use a full projection here because we'll restore each account object from it
- Cursor c = resolver.query(uri, Account.CONTENT_PROJECTION, null, null, null);
- try {
- while (c.moveToNext()) {
- Account account = Account.getContent(c, Account.class);
- // The following sanity checks are primarily for the sake of ignoring non-user
- // accounts that may have been left behind e.g. by failed unit tests.
- // Properly-formed accounts will always pass these simple checks.
- if (TextUtils.isEmpty(account.mEmailAddress)
- || account.mHostAuthKeyRecv <= 0
- || account.mHostAuthKeySend <= 0) {
- continue;
- }
-
- // The account is OK, so proceed
- AccountSyncReport report = new AccountSyncReport();
- int syncInterval = account.mSyncInterval;
-
- // If we're not using MessagingController (EAS at this point), don't schedule syncs
- if (!mController.isMessagingController(account.mId)) {
- syncInterval = Account.CHECK_INTERVAL_NEVER;
- } else if (oneMinuteRefresh && syncInterval >= 0) {
- syncInterval = 1;
- }
-
- report.accountId = account.mId;
- report.prevSyncTime = 0;
- report.nextSyncTime = (syncInterval > 0) ? 0 : -1; // 0 == ASAP -1 == no sync
-
- report.syncInterval = syncInterval;
-
- // See if the account is enabled for sync in AccountManager
- android.accounts.Account accountManagerAccount =
- new android.accounts.Account(account.mEmailAddress,
- AccountManagerTypes.TYPE_POP_IMAP);
- report.syncEnabled = ContentResolver.getSyncAutomatically(accountManagerAccount,
- EmailContent.AUTHORITY);
-
- // TODO lookup # new in inbox
- mSyncReports.put(report.accountId, report);
- }
- } finally {
- c.close();
- }
- }
-
- /**
- * Update list with a single account's sync times and unread count
- *
- * @param accountId the account being updated
- * @param newCount the number of new messages, or -1 if not being reported (don't update)
- * @return the report for the updated account, or null if it doesn't exist (e.g. deleted)
- */
- private AccountSyncReport updateAccountReport(long accountId, int newCount) {
- // restore the reports if lost
- setupSyncReports(accountId);
- synchronized (mSyncReports) {
- AccountSyncReport report = mSyncReports.get(accountId);
- if (report == null) {
- // discard result - there is no longer an account with this id
- Log.d(LOG_TAG, "No account to update for id=" + Long.toString(accountId));
- return null;
- }
-
- // report found - update it (note - editing the report while in-place in the hashmap)
- report.prevSyncTime = SystemClock.elapsedRealtime();
- report.setNextSyncTime();
- if (Email.DEBUG) {
- Log.d(LOG_TAG, "update account " + report.toString());
- }
- return report;
- }
- }
-
- /**
- * when we receive an alarm, update the account sync reports list if necessary
- * this will be the case when if we have restarted the process and lost the data
- * in the global.
- *
- * @param restoreIntent the intent with the list
- */
- private void restoreSyncReports(Intent restoreIntent) {
- // restore the reports if lost
- setupSyncReports(SYNC_REPORTS_ALL_ACCOUNTS_IF_EMPTY);
- synchronized (mSyncReports) {
- long[] accountInfo = restoreIntent.getLongArrayExtra(EXTRA_ACCOUNT_INFO);
- if (accountInfo == null) {
- Log.d(LOG_TAG, "no data in intent to restore");
- return;
- }
- int accountInfoIndex = 0;
- int accountInfoLimit = accountInfo.length;
- while (accountInfoIndex < accountInfoLimit) {
- long accountId = accountInfo[accountInfoIndex++];
- long prevSync = accountInfo[accountInfoIndex++];
- AccountSyncReport report = mSyncReports.get(accountId);
- if (report != null) {
- if (report.prevSyncTime == 0) {
- report.prevSyncTime = prevSync;
- report.setNextSyncTime();
- }
- }
- }
- }
- }
-
- class ControllerResults extends Controller.Result {
- @Override
- public void updateMailboxCallback(MessagingException result, long accountId,
- long mailboxId, int progress, int numNewMessages,
- ArrayList<Long> addedMessages) {
- // First, look for authentication failures and notify
- //checkAuthenticationStatus(result, accountId);
- if (result != null || progress == 100) {
- // We only track the inbox here in the service - ignore other mailboxes
- long inboxId = Mailbox.findMailboxOfType(MailService.this,
- accountId, Mailbox.TYPE_INBOX);
- if (mailboxId == inboxId) {
- if (progress == 100) {
- updateAccountReport(accountId, numNewMessages);
- } else {
- updateAccountReport(accountId, -1);
- }
- }
- }
- }
-
- @Override
- public void serviceCheckMailCallback(MessagingException result, long accountId,
- long mailboxId, int progress, long tag) {
- if (result != null || progress == 100) {
- if (result != null) {
- // the checkmail ended in an error. force an update of the refresh
- // time, so we don't just spin on this account
- updateAccountReport(accountId, -1);
- }
- AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
- reschedule(alarmManager);
- int serviceId = mStartId;
- if (tag != 0) {
- serviceId = (int) tag;
- }
- stopSelf(serviceId);
- }
- }
- }
-
- public class EmailSyncStatusObserver implements SyncStatusObserver {
- @Override
- public void onStatusChanged(int which) {
- // We ignore the argument (we can only get called in one case - when settings change)
- }
- }
-
public static ArrayList<Account> getPopImapAccountList(Context context) {
ArrayList<Account> providerAccounts = new ArrayList<Account>();
Cursor c = context.getContentResolver().query(Account.CONTENT_URI, Account.ID_PROJECTION,
@@ -670,7 +77,8 @@ public class MailService extends Service {
while (c.moveToNext()) {
long accountId = c.getLong(Account.CONTENT_ID_COLUMN);
String protocol = Account.getProtocol(context, accountId);
- if ((protocol != null) && ("pop3".equals(protocol) || "imap".equals(protocol))) {
+ EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, protocol);
+ if ((info != null) && info.accountType.equals(AccountManagerTypes.TYPE_POP_IMAP)) {
Account account = Account.restoreAccountWithId(context, accountId);
if (account != null) {
providerAccounts.add(account);
@@ -742,10 +150,8 @@ public class MailService extends Service {
options.putBoolean(EasAuthenticatorService.OPTIONS_CONTACTS_SYNC_ENABLED, contacts);
options.putBoolean(EasAuthenticatorService.OPTIONS_CALENDAR_SYNC_ENABLED, calendar);
options.putBoolean(EasAuthenticatorService.OPTIONS_EMAIL_SYNC_ENABLED, email);
- String accountType = hostAuthRecv.mProtocol.equals("eas") ?
- AccountManagerTypes.TYPE_EXCHANGE :
- AccountManagerTypes.TYPE_POP_IMAP;
- AccountManager.get(context).addAccount(accountType, null, null, options, null, callback,
- null);
+ EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, hostAuthRecv.mProtocol);
+ AccountManager.get(context).addAccount(info.accountType, null, null, options, null,
+ callback, null);
}
}
diff --git a/src/com/android/email/service/PolicyService.java b/src/com/android/email/service/PolicyService.java
index a97f65954..2394eedd7 100644
--- a/src/com/android/email/service/PolicyService.java
+++ b/src/com/android/email/service/PolicyService.java
@@ -16,15 +16,15 @@
package com.android.email.service;
-import com.android.email.SecurityPolicy;
-import com.android.emailcommon.provider.Policy;
-import com.android.emailcommon.service.IPolicyService;
-
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
+import com.android.email.SecurityPolicy;
+import com.android.emailcommon.provider.Policy;
+import com.android.emailcommon.service.IPolicyService;
+
public class PolicyService extends Service {
private SecurityPolicy mSecurityPolicy;
@@ -35,32 +35,16 @@ public class PolicyService extends Service {
return mSecurityPolicy.isActive(policy);
}
- public void policiesRequired(long accountId) {
- mSecurityPolicy.policiesRequired(accountId);
- }
-
- public void policiesUpdated(long accountId) {
- mSecurityPolicy.policiesUpdated(accountId);
- }
-
public void setAccountHoldFlag(long accountId, boolean newState) {
SecurityPolicy.setAccountHoldFlag(mContext, accountId, newState);
}
- public boolean isActiveAdmin() {
- return mSecurityPolicy.isActiveAdmin();
- }
-
public void remoteWipe() {
mSecurityPolicy.remoteWipe();
}
- public boolean isSupported(Policy policy) {
- return mSecurityPolicy.isSupported(policy);
- }
-
- public Policy clearUnsupportedPolicies(Policy policy) {
- return mSecurityPolicy.clearUnsupportedPolicies(policy);
+ public void setAccountPolicy(long accountId, Policy policy, String securityKey) {
+ mSecurityPolicy.setAccountPolicy(accountId, policy, securityKey);
}
};
diff --git a/src/com/android/email/service/PopImapAuthenticatorService.java b/src/com/android/email/service/PopImapAuthenticatorService.java
index 9cfbec535..b829be1f3 100644
--- a/src/com/android/email/service/PopImapAuthenticatorService.java
+++ b/src/com/android/email/service/PopImapAuthenticatorService.java
@@ -16,127 +16,8 @@
package com.android.email.service;
-import com.android.email.activity.setup.AccountSetupBasics;
-import com.android.emailcommon.AccountManagerTypes;
-import com.android.emailcommon.CalendarProviderStub;
-import com.android.emailcommon.provider.EmailContent;
-
-import android.accounts.AbstractAccountAuthenticator;
-import android.accounts.Account;
-import android.accounts.AccountAuthenticatorResponse;
-import android.accounts.AccountManager;
-import android.accounts.NetworkErrorException;
-import android.app.Service;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.provider.ContactsContract;
-
/**
- * A very basic authenticator service for POP/IMAP. At the moment, it has no UI hooks. When called
- * with addAccount, it simply adds the account to AccountManager directly with a username and
- * password.
+ * This service needs to be declared separately from the base service
*/
-public class PopImapAuthenticatorService extends Service {
- public static final String OPTIONS_USERNAME = "username";
- public static final String OPTIONS_PASSWORD = "password";
- public static final String OPTIONS_CONTACTS_SYNC_ENABLED = "contacts";
- public static final String OPTIONS_CALENDAR_SYNC_ENABLED = "calendar";
- public static final String OPTIONS_EMAIL_SYNC_ENABLED = "email";
-
- class PopImapAuthenticator extends AbstractAccountAuthenticator {
-
- public PopImapAuthenticator(Context context) {
- super(context);
- }
-
- @Override
- public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
- String authTokenType, String[] requiredFeatures, Bundle options)
- throws NetworkErrorException {
- // There are two cases here:
- // 1) We are called with a username/password; this comes from the traditional email
- // app UI; we simply create the account and return the proper bundle
- if (options != null && options.containsKey(OPTIONS_PASSWORD)
- && options.containsKey(OPTIONS_USERNAME)) {
- final Account account = new Account(options.getString(OPTIONS_USERNAME),
- AccountManagerTypes.TYPE_POP_IMAP);
- AccountManager.get(PopImapAuthenticatorService.this).addAccountExplicitly(
- account, options.getString(OPTIONS_PASSWORD), null);
-
- // Set up email syncing
- boolean syncEmail = false;
- if (options.containsKey(OPTIONS_EMAIL_SYNC_ENABLED) &&
- options.getBoolean(OPTIONS_EMAIL_SYNC_ENABLED)) {
- syncEmail = true;
- }
- ContentResolver.setIsSyncable(account, EmailContent.AUTHORITY, 1);
- ContentResolver.setSyncAutomatically(account, EmailContent.AUTHORITY, syncEmail);
- ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);
- ContentResolver.setIsSyncable(account, CalendarProviderStub.AUTHORITY, 0);
-
- Bundle b = new Bundle();
- b.putString(AccountManager.KEY_ACCOUNT_NAME, options.getString(OPTIONS_USERNAME));
- b.putString(AccountManager.KEY_ACCOUNT_TYPE, AccountManagerTypes.TYPE_POP_IMAP);
- return b;
- // 2) The other case is that we're creating a new account from an Account manager
- // activity. In this case, we add an intent that will be used to gather the
- // account information...
- } else {
- Bundle b = new Bundle();
- Intent intent =
- AccountSetupBasics.actionSetupPopImapIntent(PopImapAuthenticatorService.this);
- intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
- b.putParcelable(AccountManager.KEY_INTENT, intent);
- return b;
- }
- }
-
- @Override
- public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account,
- Bundle options) {
- return null;
- }
-
- @Override
- public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
- return null;
- }
-
- @Override
- public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
- String authTokenType, Bundle loginOptions) throws NetworkErrorException {
- return null;
- }
-
- @Override
- public String getAuthTokenLabel(String authTokenType) {
- // null means we don't have compartmentalized authtoken types
- return null;
- }
-
- @Override
- public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account,
- String[] features) throws NetworkErrorException {
- return null;
- }
-
- @Override
- public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account,
- String authTokenType, Bundle loginOptions) {
- return null;
- }
-
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- if (AccountManager.ACTION_AUTHENTICATOR_INTENT.equals(intent.getAction())) {
- return new PopImapAuthenticator(this).getIBinder();
- } else {
- return null;
- }
- }
+public class PopImapAuthenticatorService extends AuthenticatorService {
}
diff --git a/src/com/android/email/service/PopImapSyncAdapterService.java b/src/com/android/email/service/PopImapSyncAdapterService.java
index ac47bbab5..9a1f185e6 100644
--- a/src/com/android/email/service/PopImapSyncAdapterService.java
+++ b/src/com/android/email/service/PopImapSyncAdapterService.java
@@ -16,24 +16,33 @@
package com.android.email.service;
-import android.accounts.Account;
import android.accounts.OperationCanceledException;
import android.app.Service;
import android.content.AbstractThreadedSyncAdapter;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.SyncResult;
import android.database.Cursor;
+import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
-import com.android.email.Controller;
+import com.android.emailcommon.TempDirectory;
+import com.android.emailcommon.mail.MessagingException;
+import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent;
import com.android.emailcommon.provider.EmailContent.AccountColumns;
+import com.android.emailcommon.provider.EmailContent.Message;
+import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.provider.Mailbox;
+import com.android.emailcommon.service.EmailServiceProxy;
+
+import java.util.ArrayList;
public class PopImapSyncAdapterService extends Service {
private static final String TAG = "PopImapSyncAdapterService";
@@ -53,7 +62,7 @@ public class PopImapSyncAdapterService extends Service {
}
@Override
- public void onPerformSync(Account account, Bundle extras,
+ public void onPerformSync(android.accounts.Account account, Bundle extras,
String authority, ContentProviderClient provider, SyncResult syncResult) {
try {
PopImapSyncAdapterService.performSync(mContext, account, extras,
@@ -79,28 +88,163 @@ public class PopImapSyncAdapterService extends Service {
}
/**
+ * @return whether or not this mailbox retrieves its data from the server (as opposed to just
+ * a local mailbox that is never synced).
+ */
+ public static boolean loadsFromServer(Mailbox m, String protocol) {
+ if (HostAuth.LEGACY_SCHEME_IMAP.equals(protocol)) {
+ // TODO: actually use a sync flag when creating the mailboxes. Right now we use an
+ // approximation for IMAP.
+ return m.mType != Mailbox.TYPE_DRAFTS
+ && m.mType != Mailbox.TYPE_OUTBOX
+ && m.mType != Mailbox.TYPE_SEARCH;
+
+ } else if (HostAuth.LEGACY_SCHEME_POP3.equals(protocol)) {
+ return Mailbox.TYPE_INBOX == m.mType;
+ }
+
+ return false;
+ }
+
+ private static void sync(Context context, long mailboxId, SyncResult syncResult,
+ boolean uiRefresh) {
+ TempDirectory.setTempDirectory(context);
+ Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
+ if (mailbox == null) return;
+ Account account = Account.restoreAccountWithId(context, mailbox.mAccountKey);
+ if (account == null) return;
+ ContentResolver resolver = context.getContentResolver();
+ String protocol = account.getProtocol(context);
+ if ((mailbox.mType != Mailbox.TYPE_OUTBOX) && !loadsFromServer(mailbox, protocol)) {
+ // This is an update to a message in a non-syncing mailbox; delete this from the
+ // updates table and return
+ resolver.delete(Message.UPDATED_CONTENT_URI, Message.MAILBOX_KEY + "=?",
+ new String[] {Long.toString(mailbox.mId)});
+ return;
+ }
+ Log.d(TAG, "Mailbox: " + mailbox.mDisplayName);
+
+ Uri mailboxUri = ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId);
+ ContentValues values = new ContentValues();
+ // Set mailbox sync state
+ values.put(Mailbox.UI_SYNC_STATUS,
+ uiRefresh ? EmailContent.SYNC_STATUS_USER : EmailContent.SYNC_STATUS_BACKGROUND);
+ resolver.update(mailboxUri, values, null, null);
+ try {
+ try {
+ if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
+ EmailServiceStub.sendMailImpl(context, account.mId);
+ } else if (protocol.equals(HostAuth.LEGACY_SCHEME_IMAP)) {
+ ImapService.synchronizeMailboxSynchronous(context, account, mailbox);
+ } else {
+ Pop3Service.synchronizeMailboxSynchronous(context, account, mailbox);
+ }
+ } catch (MessagingException e) {
+ int cause = e.getExceptionType();
+ switch(cause) {
+ case MessagingException.IOERROR:
+ syncResult.stats.numIoExceptions++;
+ break;
+ case MessagingException.AUTHENTICATION_FAILED:
+ syncResult.stats.numAuthExceptions++;
+ break;
+ }
+ }
+ } finally {
+ // Always clear our sync state
+ values.put(Mailbox.UI_SYNC_STATUS, EmailContent.SYNC_STATUS_NONE);
+ resolver.update(mailboxUri, values, null, null);
+ }
+ }
+
+ /**
* Partial integration with system SyncManager; we initiate manual syncs upon request
*/
- private static void performSync(Context context, Account account, Bundle extras,
- String authority, ContentProviderClient provider, SyncResult syncResult)
- throws OperationCanceledException {
- if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false)) {
- String emailAddress = account.name;
- // Find an EmailProvider account with the Account's email address
- Cursor c = context.getContentResolver().query(
- com.android.emailcommon.provider.Account.CONTENT_URI,
- EmailContent.ID_PROJECTION, AccountColumns.EMAIL_ADDRESS + "=?",
- new String[] {emailAddress}, null);
- if (c.moveToNext()) {
- // If we have one, find the inbox and start it syncing
- long accountId = c.getLong(EmailContent.ID_PROJECTION_COLUMN);
- long mailboxId = Mailbox.findMailboxOfType(context, accountId,
- Mailbox.TYPE_INBOX);
- if (mailboxId > 0) {
- Log.d(TAG, "Starting manual sync for account " + emailAddress);
- Controller.getInstance(context).updateMailbox(accountId, mailboxId, false);
+ private static void performSync(Context context, android.accounts.Account account,
+ Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult)
+ throws OperationCanceledException {
+ // Find an EmailProvider account with the Account's email address
+ Cursor c = null;
+ try {
+ c = provider.query(com.android.emailcommon.provider.Account.CONTENT_URI,
+ Account.CONTENT_PROJECTION, AccountColumns.EMAIL_ADDRESS + "=?",
+ new String[] {account.name}, null);
+ if (c != null && c.moveToNext()) {
+ Account acct = new Account();
+ acct.restore(c);
+ if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD)) {
+ Log.d(TAG, "Upload sync request for " + acct.mDisplayName);
+ // See if any boxes have mail...
+ ArrayList<Long> mailboxesToUpdate;
+ Cursor updatesCursor = provider.query(Message.UPDATED_CONTENT_URI,
+ new String[] {Message.MAILBOX_KEY},
+ Message.ACCOUNT_KEY + "=?",
+ new String[] {Long.toString(acct.mId)},
+ null);
+ try {
+ if ((updatesCursor == null) || (updatesCursor.getCount() == 0)) return;
+ mailboxesToUpdate = new ArrayList<Long>();
+ while (updatesCursor.moveToNext()) {
+ Long mailboxId = updatesCursor.getLong(0);
+ if (!mailboxesToUpdate.contains(mailboxId)) {
+ mailboxesToUpdate.add(mailboxId);
+ }
+ }
+ } finally {
+ if (updatesCursor != null) {
+ updatesCursor.close();
+ }
+ }
+ for (long mailboxId: mailboxesToUpdate) {
+ sync(context, mailboxId, syncResult, false);
+ }
+ } else {
+ Log.d(TAG, "Sync request for " + acct.mDisplayName);
+ Log.d(TAG, extras.toString());
+ long mailboxId = extras.getLong(EmailServiceStub.SYNC_EXTRA_MAILBOX_ID,
+ Mailbox.NO_MAILBOX);
+ boolean isInbox = false;
+ if (mailboxId == Mailbox.NO_MAILBOX) {
+ mailboxId = Mailbox.findMailboxOfType(context, acct.mId,
+ Mailbox.TYPE_INBOX);
+ if (mailboxId == Mailbox.NO_MAILBOX) {
+ // Update folders?
+ EmailServiceProxy service =
+ EmailServiceUtils.getServiceForAccount(context, null, acct.mId);
+ service.updateFolderList(acct.mId);
+ }
+ isInbox = true;
+ }
+ if (mailboxId == Mailbox.NO_MAILBOX) return;
+ boolean uiRefresh =
+ extras.getBoolean(ContentResolver.SYNC_EXTRAS_FORCE, false);
+ sync(context, mailboxId, syncResult, uiRefresh);
+
+ // Outbox is a special case here
+ Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
+ if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
+ return;
+ }
+
+ // Convert from minutes to seconds
+ int syncFrequency = acct.mSyncInterval * 60;
+ // Values < 0 are for "never" or "push"; 0 is undefined
+ if (syncFrequency <= 0) return;
+ Bundle ex = new Bundle();
+ if (!isInbox) {
+ ex.putLong(EmailServiceStub.SYNC_EXTRA_MAILBOX_ID, mailboxId);
+ }
+ Log.d(TAG, "Setting periodic sync for " + acct.mDisplayName + ": " +
+ syncFrequency + " seconds");
+ ContentResolver.addPeriodicSync(account, authority, ex, syncFrequency);
}
}
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (c != null) {
+ c.close();
+ }
}
}
} \ No newline at end of file
diff --git a/src/com/android/email/view/NonLockingScrollView.java b/src/com/android/email/view/NonLockingScrollView.java
deleted file mode 100644
index 832136c89..000000000
--- a/src/com/android/email/view/NonLockingScrollView.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.email.view;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.webkit.WebView;
-import android.widget.ScrollView;
-
-import java.util.ArrayList;
-
-/**
- * A {@link ScrollView} that will never lock scrolling in a particular direction.
- *
- * Usually ScrollView will capture all touch events once a drag has begun. In some cases,
- * we want to delegate those touches to children as normal, even in the middle of a drag. This is
- * useful when there are childviews like a WebView tha handles scrolling in the horizontal direction
- * even while the ScrollView drags vertically.
- *
- * This is only tested to work for ScrollViews where the content scrolls in one direction.
- */
-public class NonLockingScrollView extends ScrollView {
- public NonLockingScrollView(Context context) {
- super(context);
- }
- public NonLockingScrollView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- public NonLockingScrollView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- /**
- * Whether or not the contents of this view is being dragged by one of the children in
- * {@link #mChildrenNeedingAllTouches}.
- */
- private boolean mInCustomDrag = false;
-
- /**
- * The list of children who should always receive touch events, and not have them intercepted.
- */
- private final ArrayList<View> mChildrenNeedingAllTouches = new ArrayList<View>();
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- final int action = ev.getActionMasked();
- final boolean isUp = action == MotionEvent.ACTION_UP;
-
- if (isUp && mInCustomDrag) {
- // An up event after a drag should be intercepted so that child views don't handle
- // click events falsely after a drag.
- mInCustomDrag = false;
- onTouchEvent(ev);
- return true;
- }
-
- if (!mInCustomDrag && !isEventOverChild(ev, mChildrenNeedingAllTouches)) {
- return super.onInterceptTouchEvent(ev);
- }
-
- // Note the normal scrollview implementation is to intercept all touch events after it has
- // detected a drag starting. We will handle this ourselves.
- mInCustomDrag = super.onInterceptTouchEvent(ev);
- if (mInCustomDrag) {
- onTouchEvent(ev);
- }
-
- // Don't intercept events - pass them on to children as normal.
- return false;
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- excludeChildrenFromInterceptions(this);
- }
-
- /**
- * Traverses the view tree for {@link WebView}s so they can be excluded from touch
- * interceptions and receive all events.
- */
- private void excludeChildrenFromInterceptions(View node) {
- // If additional types of children should be excluded (e.g. horizontal scrolling banners),
- // this needs to be modified accordingly.
- if (node instanceof WebView) {
- mChildrenNeedingAllTouches.add(node);
- } else if (node instanceof ViewGroup) {
- ViewGroup viewGroup = (ViewGroup) node;
- final int childCount = viewGroup.getChildCount();
- for (int i = 0; i < childCount; i++) {
- final View child = viewGroup.getChildAt(i);
- excludeChildrenFromInterceptions(child);
- }
- }
- }
-
- private static final Rect sHitFrame = new Rect();
- private static boolean isEventOverChild(MotionEvent ev, ArrayList<View> children) {
- final int actionIndex = ev.getActionIndex();
- final float x = ev.getX(actionIndex);
- final float y = ev.getY(actionIndex);
-
- for (View child : children) {
- if (!canViewReceivePointerEvents(child)) {
- continue;
- }
- child.getHitRect(sHitFrame);
-
- // child can receive the motion event.
- if (sHitFrame.contains((int) x, (int) y)) {
- return true;
- }
- }
- return false;
- }
-
- private static boolean canViewReceivePointerEvents(View child) {
- return child.getVisibility() == VISIBLE || (child.getAnimation() != null);
- }
-}
diff --git a/src/com/android/email/view/RigidWebView.java b/src/com/android/email/view/RigidWebView.java
deleted file mode 100644
index 1b31c08f2..000000000
--- a/src/com/android/email/view/RigidWebView.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.email.view;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.webkit.WebView;
-
-import com.android.email.Clock;
-import com.android.email.Email;
-import com.android.email.Throttle;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.utility.Utility;
-
-/**
- * A custom WebView that is robust to rapid resize events in sequence.
- *
- * This is useful for a WebView which needs to have a layout of {@code WRAP_CONTENT}, since any
- * contents with percent-based height will force the WebView to infinitely expand (or shrink).
- */
-public class RigidWebView extends WebView {
-
- public RigidWebView(Context context) {
- super(context);
- }
- public RigidWebView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- public RigidWebView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- private static final int MIN_RESIZE_INTERVAL = 200;
- private static final int MAX_RESIZE_INTERVAL = 300;
- private final Clock mClock = Clock.INSTANCE;
-
- private final Throttle mThrottle = new Throttle(getClass().getName(),
- new Runnable() {
- @Override public void run() {
- performSizeChangeDelayed();
- }
- }, Utility.getMainThreadHandler(),
- MIN_RESIZE_INTERVAL, MAX_RESIZE_INTERVAL);
-
- private int mRealWidth;
- private int mRealHeight;
- private boolean mIgnoreNext;
- private long mLastSizeChangeTime = -1;
-
- @Override
- protected void onSizeChanged(int w, int h, int ow, int oh) {
- mRealWidth = w;
- mRealHeight = h;
- long now = mClock.getTime();
- boolean recentlySized = (now - mLastSizeChangeTime < MIN_RESIZE_INTERVAL);
-
- // It's known that the previous resize event may cause a resize event immediately. If
- // this happens sufficiently close to the last resize event, drop it on the floor.
- if (mIgnoreNext) {
- mIgnoreNext = false;
- if (recentlySized) {
- if (Email.DEBUG) {
- Log.w(Logging.LOG_TAG, "Supressing size change in RigidWebView");
- }
- return;
- }
- }
-
- if (recentlySized) {
- mThrottle.onEvent();
- } else {
- // It's been a sufficiently long time - just perform the resize as normal. This should
- // be the normal code path.
- performSizeChange(ow, oh);
- }
- }
-
- private void performSizeChange(int ow, int oh) {
- super.onSizeChanged(mRealWidth, mRealHeight, ow, oh);
- mLastSizeChangeTime = mClock.getTime();
- }
-
- private void performSizeChangeDelayed() {
- mIgnoreNext = true;
- performSizeChange(getWidth(), getHeight());
- }
-}
diff --git a/src/com/android/email/view/SizeBoundingFrameLayout.java b/src/com/android/email/view/SizeBoundingFrameLayout.java
deleted file mode 100644
index b1e709a0c..000000000
--- a/src/com/android/email/view/SizeBoundingFrameLayout.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.view;
-
-import com.android.email.R;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.util.AttributeSet;
-import android.widget.FrameLayout;
-
-/**
- * A {@link FrameLayout} with the max width/height.
- */
-public class SizeBoundingFrameLayout extends FrameLayout {
- public static final int DIMENSION_DEFAULT = -1; // unspecified
-
- private int mMaxWidth = DIMENSION_DEFAULT;
- private int mMaxHeight = DIMENSION_DEFAULT;
-
- public SizeBoundingFrameLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- initFromAttributeSet(context, attrs);
- }
-
- public SizeBoundingFrameLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- initFromAttributeSet(context, attrs);
- }
-
- public SizeBoundingFrameLayout(Context context) {
- super(context);
- }
-
- private void initFromAttributeSet(Context c, AttributeSet attrs) {
- TypedArray a = c.obtainStyledAttributes(attrs,
- R.styleable.SizeBoundingFrameLayout_attributes);
- mMaxWidth = a.getDimensionPixelSize(
- R.styleable.SizeBoundingFrameLayout_attributes_maxWidth, DIMENSION_DEFAULT);
- mMaxHeight = a.getDimensionPixelSize(
- R.styleable.SizeBoundingFrameLayout_attributes_maxHeight, DIMENSION_DEFAULT);
- a.recycle();
- }
-
- /** Set the max width. Use {@link #DIMENSION_DEFAULT} for unspecified. */
- public void setMaxWidth(int maxWidth) {
- mMaxWidth = maxWidth;
- requestLayout();
- invalidate();
- }
-
- public int getMaxWidth() {
- return mMaxWidth;
- }
-
- /** Set the max height. Use {@link #DIMENSION_DEFAULT} for unspecified. */
- public void setMaxHeight(int maxHeight) {
- mMaxHeight = maxHeight;
- requestLayout();
- invalidate();
- }
-
- public int getMaxHeight() {
- return mMaxHeight;
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int widthMode = MeasureSpec.getMode(widthMeasureSpec);
- int heightMode = MeasureSpec.getMode(heightMeasureSpec);
- int widthSize = MeasureSpec.getSize(widthMeasureSpec);
- int heightSize = MeasureSpec.getSize(heightMeasureSpec);
-
- // Limit the size, unless MeasureSpec.EXACTLY
- if (mMaxWidth >= 0) {
- switch (widthMode) {
- case MeasureSpec.AT_MOST:
- widthSize = Math.min(widthSize, mMaxWidth);
- break;
- case MeasureSpec.UNSPECIFIED:
- widthMode = MeasureSpec.AT_MOST;
- widthSize = mMaxWidth;
- break;
- }
- }
-
- if (mMaxHeight >= 0) {
- switch (heightMode) {
- case MeasureSpec.AT_MOST:
- heightSize = Math.min(heightSize, mMaxHeight);
- break;
- case MeasureSpec.UNSPECIFIED:
- heightMode = MeasureSpec.AT_MOST;
- heightSize = mMaxHeight;
- break;
- }
- }
- super.onMeasure(MeasureSpec.makeMeasureSpec(widthSize, widthMode),
- MeasureSpec.makeMeasureSpec(heightSize, heightMode));
- }
-}
diff --git a/src/com/android/email/widget/EmailWidget.java b/src/com/android/email/widget/EmailWidget.java
deleted file mode 100644
index 67a82f570..000000000
--- a/src/com/android/email/widget/EmailWidget.java
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.widget;
-
-import android.app.PendingIntent;
-import android.appwidget.AppWidgetManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.Loader;
-import android.content.Loader.OnLoadCompleteListener;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.graphics.Typeface;
-import android.net.Uri;
-import android.net.Uri.Builder;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.SpannableStringBuilder;
-import android.text.TextUtils;
-import android.text.format.DateUtils;
-import android.text.style.AbsoluteSizeSpan;
-import android.text.style.ForegroundColorSpan;
-import android.text.style.StyleSpan;
-import android.util.Log;
-import android.view.View;
-import android.widget.RemoteViews;
-import android.widget.RemoteViewsService;
-
-import com.android.email.Email;
-import com.android.email.R;
-import com.android.email.ResourceHelper;
-import com.android.email.activity.MessageCompose;
-import com.android.email.activity.UiUtilities;
-import com.android.email.activity.Welcome;
-import com.android.email.provider.WidgetProvider.WidgetService;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.utility.EmailAsyncTask;
-
-import java.util.List;
-
-/**
- * The email widget.
- * <p><em>NOTE</em>: All methods must be called on the UI thread so synchronization is NOT required
- * in this class)
- */
-public class EmailWidget implements RemoteViewsService.RemoteViewsFactory,
- OnLoadCompleteListener<Cursor> {
- public static final String TAG = "EmailWidget";
-
- /**
- * When handling clicks in a widget ListView, a single PendingIntent template is provided to
- * RemoteViews, and the individual "on click" actions are distinguished via a "fillInIntent"
- * on each list element; when a click is received, this "fillInIntent" is merged with the
- * PendingIntent using Intent.fillIn(). Since this mechanism does NOT preserve the Extras
- * Bundle, we instead encode information about the action (e.g. view, reply, etc.) and its
- * arguments (e.g. messageId, mailboxId, etc.) in an Uri which is added to the Intent via
- * Intent.setDataAndType()
- *
- * The mime type MUST be set in the Intent, even though we do not use it; therefore, it's value
- * is entirely arbitrary.
- *
- * Our "command" Uri is NOT used by the system in any manner, and is therefore constrained only
- * in the requirement that it be syntactically valid.
- *
- * We use the following convention for our commands:
- * widget://command/<command>/<arg1>[/<arg2>]
- */
- private static final String WIDGET_DATA_MIME_TYPE = "com.android.email/widget_data";
-
- private static final Uri COMMAND_URI = Uri.parse("widget://command");
-
- // Command names and Uri's built upon COMMAND_URI
- private static final String COMMAND_NAME_VIEW_MESSAGE = "view_message";
- private static final Uri COMMAND_URI_VIEW_MESSAGE =
- COMMAND_URI.buildUpon().appendPath(COMMAND_NAME_VIEW_MESSAGE).build();
-
- // TODO Can this be moved to the loader and made a database 'LIMIT'?
- private static final int MAX_MESSAGE_LIST_COUNT = 25;
-
- private static String sSubjectSnippetDivider;
- private static int sSenderFontSize;
- private static int sSubjectFontSize;
- private static int sDateFontSize;
- private static int sDefaultTextColor;
- private static int sLightTextColor;
-
- private final Context mContext;
- private final AppWidgetManager mWidgetManager;
-
- // The widget identifier
- private final int mWidgetId;
-
- // The widget's loader (derived from ThrottlingCursorLoader)
- private final EmailWidgetLoader mLoader;
- private final ResourceHelper mResourceHelper;
-
- /** The account ID of this widget. May be {@link Account#ACCOUNT_ID_COMBINED_VIEW}. */
- private long mAccountId = Account.NO_ACCOUNT;
- /** The display name of this account */
- private String mAccountName;
- /** The display name of this mailbox */
- private String mMailboxName;
-
- /**
- * The cursor for the messages, with some extra info such as the number of accounts.
- *
- * Note this cursor can be closed any time by the loader. Always use {@link #isCursorValid()}
- * before touching its contents.
- */
- private EmailWidgetLoader.WidgetCursor mCursor;
-
- public EmailWidget(Context context, int _widgetId) {
- super();
- if (Email.DEBUG) {
- Log.d(TAG, "Creating EmailWidget with id = " + _widgetId);
- }
- mContext = context.getApplicationContext();
- mWidgetManager = AppWidgetManager.getInstance(mContext);
-
- mWidgetId = _widgetId;
- mLoader = new EmailWidgetLoader(mContext);
- mLoader.registerListener(0, this);
- if (sSubjectSnippetDivider == null) {
- // Initialize string, color, dimension resources
- Resources res = mContext.getResources();
- sSubjectSnippetDivider =
- res.getString(R.string.message_list_subject_snippet_divider);
- sSenderFontSize = res.getDimensionPixelSize(R.dimen.widget_senders_font_size);
- sSubjectFontSize = res.getDimensionPixelSize(R.dimen.widget_subject_font_size);
- sDateFontSize = res.getDimensionPixelSize(R.dimen.widget_date_font_size);
- sDefaultTextColor = res.getColor(R.color.widget_default_text_color);
- sDefaultTextColor = res.getColor(R.color.widget_default_text_color);
- sLightTextColor = res.getColor(R.color.widget_light_text_color);
- }
- mResourceHelper = ResourceHelper.getInstance(mContext);
- }
-
- /**
- * Start loading the data. At this point nothing on the widget changes -- the current view
- * will remain valid until the loader loads the latest data.
- */
- public void start() {
- long accountId = WidgetManager.loadAccountIdPref(mContext, mWidgetId);
- long mailboxId = WidgetManager.loadMailboxIdPref(mContext, mWidgetId);
- // Legacy support; if preferences haven't been saved for this widget, load something
- if (accountId == Account.NO_ACCOUNT) {
- accountId = Account.ACCOUNT_ID_COMBINED_VIEW;
- mailboxId = Mailbox.QUERY_ALL_INBOXES;
- }
- mAccountId = accountId;
- mLoader.load(mAccountId, mailboxId);
- }
-
- /**
- * Resets the data in the widget and forces a reload.
- */
- public void reset() {
- mLoader.reset();
- start();
- }
-
- private boolean isCursorValid() {
- return mCursor != null && !mCursor.isClosed();
- }
-
- /**
- * Called when the loader finished loading data. Update the widget.
- */
- @Override
- public void onLoadComplete(Loader<Cursor> loader, Cursor cursor) {
- mCursor = (EmailWidgetLoader.WidgetCursor) cursor; // Save away the cursor
- mAccountName = mCursor.getAccountName();
- mMailboxName = mCursor.getMailboxName();
- updateHeader();
- mWidgetManager.notifyAppWidgetViewDataChanged(mWidgetId, R.id.message_list);
- }
-
- /**
- * Convenience method for creating an onClickPendingIntent that launches another activity
- * directly.
- *
- * @param views The RemoteViews we're inflating
- * @param buttonId the id of the button view
- * @param intent The intent to be used when launching the activity
- */
- private void setActivityIntent(RemoteViews views, int buttonId, Intent intent) {
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // just in case intent comes without it
- PendingIntent pendingIntent =
- PendingIntent.getActivity(mContext, (int) mAccountId, intent,
- PendingIntent.FLAG_UPDATE_CURRENT);
- views.setOnClickPendingIntent(buttonId, pendingIntent);
- }
-
- /**
- * Convenience method for constructing a fillInIntent for a given list view element.
- * Appends the command and any arguments to a base Uri.
- *
- * @param views the RemoteViews we are inflating
- * @param viewId the id of the view
- * @param baseUri the base uri for the command
- * @param args any arguments to the command
- */
- private void setFillInIntent(RemoteViews views, int viewId, Uri baseUri, String ... args) {
- Intent intent = new Intent();
- Builder builder = baseUri.buildUpon();
- for (String arg: args) {
- builder.appendPath(arg);
- }
- intent.setDataAndType(builder.build(), WIDGET_DATA_MIME_TYPE);
- views.setOnClickFillInIntent(viewId, intent);
- }
-
- /**
- * Called back by {@link com.android.email.provider.WidgetProvider.WidgetService} to
- * handle intents created by remote views.
- */
- public static boolean processIntent(Context context, Intent intent) {
- final Uri data = intent.getData();
- if (data == null) {
- return false;
- }
- List<String> pathSegments = data.getPathSegments();
- // Our path segments are <command>, <arg1> [, <arg2>]
- // First, a quick check of Uri validity
- if (pathSegments.size() < 2) {
- throw new IllegalArgumentException();
- }
- String command = pathSegments.get(0);
- // Ignore unknown action names
- try {
- final long arg1 = Long.parseLong(pathSegments.get(1));
- if (EmailWidget.COMMAND_NAME_VIEW_MESSAGE.equals(command)) {
- // "view", <message id>, <mailbox id>
- openMessage(context, Long.parseLong(pathSegments.get(2)), arg1);
- }
- } catch (NumberFormatException e) {
- // Shouldn't happen as we construct all of the Uri's
- return false;
- }
- return true;
- }
-
- private static void openMessage(final Context context, final long mailboxId,
- final long messageId) {
- EmailAsyncTask.runAsyncParallel(new Runnable() {
- @Override
- public void run() {
- Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
- if (mailbox == null) return;
- context.startActivity(Welcome.createOpenMessageIntent(context, mailbox.mAccountKey,
- mailboxId, messageId));
- }
- });
- }
-
- private void setTextViewTextAndDesc(RemoteViews views, final int id, String text) {
- views.setTextViewText(id, text);
- views.setContentDescription(id, text);
- }
-
- private void setupTitleAndCount(RemoteViews views) {
- // Set up the title (view type + count of messages)
- setTextViewTextAndDesc(views, R.id.widget_title, mMailboxName);
- views.setViewVisibility(R.id.widget_tap, View.VISIBLE);
- setTextViewTextAndDesc(views, R.id.widget_tap, mAccountName);
- String count = "";
- if (isCursorValid()) {
- count = UiUtilities.getMessageCountForUi(mContext, mCursor.getMessageCount(), false);
- }
- setTextViewTextAndDesc(views, R.id.widget_count, count);
- }
-
- /**
- * Update the "header" of the widget (i.e. everything that doesn't include the scrolling
- * message list)
- */
- private void updateHeader() {
- if (Email.DEBUG) {
- Log.d(TAG, "#updateHeader(); widgetId: " + mWidgetId);
- }
-
- // Get the widget layout
- RemoteViews views =
- new RemoteViews(mContext.getPackageName(), R.layout.widget);
-
- // Set up the list with an adapter
- Intent intent = new Intent(mContext, WidgetService.class);
- intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mWidgetId);
- intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
- views.setRemoteAdapter(R.id.message_list, intent);
-
- setupTitleAndCount(views);
-
- if (isCursorValid()) {
- // Show compose icon & message list
- if (mAccountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- // Don't allow compose for "combined" view
- views.setViewVisibility(R.id.widget_compose, View.INVISIBLE);
- } else {
- views.setViewVisibility(R.id.widget_compose, View.VISIBLE);
- }
- views.setViewVisibility(R.id.message_list, View.VISIBLE);
- views.setViewVisibility(R.id.tap_to_configure, View.GONE);
- // Create click intent for "compose email" target
- intent = MessageCompose.getMessageComposeIntent(mContext, mAccountId);
- intent.putExtra(MessageCompose.EXTRA_FROM_WIDGET, true);
- setActivityIntent(views, R.id.widget_compose, intent);
- // Create click intent for logo to open inbox
- intent = Welcome.createOpenAccountInboxIntent(mContext, mAccountId);
- setActivityIntent(views, R.id.widget_logo, intent);
- } else {
- // TODO This really should never happen ... probably can remove the else block
- // Hide compose icon & show "touch to configure" text
- views.setViewVisibility(R.id.widget_compose, View.INVISIBLE);
- views.setViewVisibility(R.id.message_list, View.GONE);
- views.setViewVisibility(R.id.tap_to_configure, View.VISIBLE);
- // Create click intent for "touch to configure" target
- intent = Welcome.createOpenAccountInboxIntent(mContext, -1);
- setActivityIntent(views, R.id.tap_to_configure, intent);
- }
-
- // Use a bare intent for our template; we need to fill everything in
- intent = new Intent(mContext, WidgetService.class);
- PendingIntent pendingIntent = PendingIntent.getService(mContext, 0, intent,
- PendingIntent.FLAG_UPDATE_CURRENT);
- views.setPendingIntentTemplate(R.id.message_list, pendingIntent);
-
- // And finally update the widget
- mWidgetManager.updateAppWidget(mWidgetId, views);
- }
-
- /**
- * Add size and color styling to text
- *
- * @param text the text to style
- * @param size the font size for this text
- * @param color the color for this text
- * @return a CharSequence quitable for use in RemoteViews.setTextViewText()
- */
- private CharSequence addStyle(CharSequence text, int size, int color) {
- SpannableStringBuilder builder = new SpannableStringBuilder(text);
- builder.setSpan(
- new AbsoluteSizeSpan(size), 0, text.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- if (color != 0) {
- builder.setSpan(new ForegroundColorSpan(color), 0, text.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- return builder;
- }
-
- /**
- * Create styled text for our combination subject and snippet
- *
- * @param subject the message's subject (or null)
- * @param snippet the message's snippet (or null)
- * @param read whether or not the message is read
- * @return a CharSequence suitable for use in RemoteViews.setTextViewText()
- */
- private CharSequence getStyledSubjectSnippet(String subject, String snippet, boolean read) {
- SpannableStringBuilder ssb = new SpannableStringBuilder();
- boolean hasSubject = false;
- if (!TextUtils.isEmpty(subject)) {
- SpannableString ss = new SpannableString(subject);
- ss.setSpan(new StyleSpan(read ? Typeface.NORMAL : Typeface.BOLD), 0, ss.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- ss.setSpan(new ForegroundColorSpan(sDefaultTextColor), 0, ss.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- ssb.append(ss);
- hasSubject = true;
- }
- if (!TextUtils.isEmpty(snippet)) {
- if (hasSubject) {
- ssb.append(sSubjectSnippetDivider);
- }
- SpannableString ss = new SpannableString(snippet);
- ss.setSpan(new ForegroundColorSpan(sLightTextColor), 0, snippet.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- ssb.append(ss);
- }
- return addStyle(ssb, sSubjectFontSize, 0);
- }
-
- @Override
- public RemoteViews getViewAt(int position) {
- // Use the cursor to set up the widget
- if (!isCursorValid() || !mCursor.moveToPosition(position)) {
- return getLoadingView();
- }
- RemoteViews views =
- new RemoteViews(mContext.getPackageName(), R.layout.widget_list_item);
- boolean isUnread = mCursor.getInt(EmailWidgetLoader.WIDGET_COLUMN_FLAG_READ) != 1;
- int drawableId = R.drawable.conversation_read_selector;
- if (isUnread) {
- drawableId = R.drawable.conversation_unread_selector;
- }
- views.setInt(R.id.widget_message, "setBackgroundResource", drawableId);
-
- // Add style to sender
- String rawSender =
- mCursor.isNull(EmailWidgetLoader.WIDGET_COLUMN_DISPLAY_NAME)
- ? "" // an empty string
- : mCursor.getString(EmailWidgetLoader.WIDGET_COLUMN_DISPLAY_NAME);
- SpannableStringBuilder from = new SpannableStringBuilder(rawSender);
- from.setSpan(
- isUnread ? new StyleSpan(Typeface.BOLD) : new StyleSpan(Typeface.NORMAL), 0,
- from.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- CharSequence styledFrom = addStyle(from, sSenderFontSize, sDefaultTextColor);
- views.setTextViewText(R.id.widget_from, styledFrom);
- views.setContentDescription(R.id.widget_from, rawSender);
-
- long timestamp = mCursor.getLong(EmailWidgetLoader.WIDGET_COLUMN_TIMESTAMP);
- // Get a nicely formatted date string (relative to today)
- String date = DateUtils.getRelativeTimeSpanString(mContext, timestamp).toString();
- // Add style to date
- CharSequence styledDate = addStyle(date, sDateFontSize, sDefaultTextColor);
- views.setTextViewText(R.id.widget_date, styledDate);
- views.setContentDescription(R.id.widget_date, date);
-
- // Add style to subject/snippet
- String subject = mCursor.getString(EmailWidgetLoader.WIDGET_COLUMN_SUBJECT);
- String snippet = mCursor.getString(EmailWidgetLoader.WIDGET_COLUMN_SNIPPET);
- CharSequence subjectAndSnippet = getStyledSubjectSnippet(subject, snippet, !isUnread);
- views.setTextViewText(R.id.widget_subject, subjectAndSnippet);
- views.setContentDescription(R.id.widget_subject, subject);
-
- int messageFlags = mCursor.getInt(EmailWidgetLoader.WIDGET_COLUMN_FLAGS);
- boolean hasInvite = (messageFlags & Message.FLAG_INCOMING_MEETING_INVITE) != 0;
- views.setViewVisibility(R.id.widget_invite, hasInvite ? View.VISIBLE : View.GONE);
-
- boolean hasAttachment =
- mCursor.getInt(EmailWidgetLoader.WIDGET_COLUMN_FLAG_ATTACHMENT) != 0;
- views.setViewVisibility(R.id.widget_attachment,
- hasAttachment ? View.VISIBLE : View.GONE);
-
- if (mAccountId != Account.ACCOUNT_ID_COMBINED_VIEW) {
- views.setViewVisibility(R.id.color_chip, View.INVISIBLE);
- } else {
- long accountId = mCursor.getLong(EmailWidgetLoader.WIDGET_COLUMN_ACCOUNT_KEY);
- int colorId = mResourceHelper.getAccountColorId(accountId);
- if (colorId != ResourceHelper.UNDEFINED_RESOURCE_ID) {
- // Color defined by resource ID, so, use it
- views.setViewVisibility(R.id.color_chip, View.VISIBLE);
- views.setImageViewResource(R.id.color_chip, colorId);
- } else {
- // Color not defined by resource ID, nothing we can do, so, hide the chip
- views.setViewVisibility(R.id.color_chip, View.INVISIBLE);
- }
- }
-
- // Set button intents for view, reply, and delete
- String messageId = mCursor.getString(EmailWidgetLoader.WIDGET_COLUMN_ID);
- String mailboxId = mCursor.getString(EmailWidgetLoader.WIDGET_COLUMN_MAILBOX_KEY);
- setFillInIntent(views, R.id.widget_message, COMMAND_URI_VIEW_MESSAGE,
- messageId, mailboxId);
-
- return views;
- }
-
- @Override
- public int getCount() {
- if (!isCursorValid()) return 0;
- return Math.min(mCursor.getCount(), MAX_MESSAGE_LIST_COUNT);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public RemoteViews getLoadingView() {
- RemoteViews view = new RemoteViews(mContext.getPackageName(), R.layout.widget_loading);
- view.setTextViewText(R.id.loading_text, mContext.getString(R.string.widget_loading));
- return view;
- }
-
- @Override
- public int getViewTypeCount() {
- // Regular list view and the "loading" view
- return 2;
- }
-
- @Override
- public boolean hasStableIds() {
- return true;
- }
-
- @Override
- public void onDataSetChanged() {
- // Note: we are not doing anything special in onDataSetChanged(). Since this service has
- // a reference to a loader that will keep itself updated, if the service is running, it
- // shouldn't be necessary to for the query to be run again. If the service hadn't been
- // running, the act of starting the service will also start the loader.
- }
-
- public void onDeleted() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(TAG, "#onDeleted(); widgetId: " + mWidgetId);
- }
-
- if (mLoader != null) {
- mLoader.reset();
- }
- }
-
- @Override
- public void onDestroy() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(TAG, "#onDestroy(); widgetId: " + mWidgetId);
- }
-
- if (mLoader != null) {
- mLoader.reset();
- }
- }
-
- @Override
- public void onCreate() {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(TAG, "#onCreate(); widgetId: " + mWidgetId);
- }
- }
-
- @Override
- public String toString() {
- return "View=" + mAccountName;
- }
-}
diff --git a/src/com/android/email/widget/EmailWidgetLoader.java b/src/com/android/email/widget/EmailWidgetLoader.java
deleted file mode 100644
index 71e36082d..000000000
--- a/src/com/android/email/widget/EmailWidgetLoader.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.widget;
-
-import com.android.email.R;
-import com.android.email.data.ThrottlingCursorLoader;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.EmailContent;
-import com.android.emailcommon.provider.EmailContent.Message;
-import com.android.emailcommon.provider.EmailContent.MessageColumns;
-import com.android.emailcommon.provider.Mailbox;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.database.CursorWrapper;
-
-/**
- * Loader for {@link EmailWidget}.
- *
- * This loader not only loads the messages, but also:
- * - The number of accounts.
- * - The message count shown in the widget header.
- * It's currently just the same as the message count, but this will be updated to the unread
- * counts for inboxes.
- */
-class EmailWidgetLoader extends ThrottlingCursorLoader {
- private static final String SORT_TIMESTAMP_DESCENDING = MessageColumns.TIMESTAMP + " DESC";
-
- // The projection to be used by the WidgetLoader
- private static final String[] WIDGET_PROJECTION = new String[] {
- EmailContent.RECORD_ID, MessageColumns.DISPLAY_NAME, MessageColumns.TIMESTAMP,
- MessageColumns.SUBJECT, MessageColumns.FLAG_READ, MessageColumns.FLAG_FAVORITE,
- MessageColumns.FLAG_ATTACHMENT, MessageColumns.MAILBOX_KEY, MessageColumns.SNIPPET,
- MessageColumns.ACCOUNT_KEY, MessageColumns.FLAGS
- };
- public static final int WIDGET_COLUMN_ID = 0;
- public static final int WIDGET_COLUMN_DISPLAY_NAME = 1;
- public static final int WIDGET_COLUMN_TIMESTAMP = 2;
- public static final int WIDGET_COLUMN_SUBJECT = 3;
- public static final int WIDGET_COLUMN_FLAG_READ = 4;
- public static final int WIDGET_COLUMN_FLAG_FAVORITE = 5;
- public static final int WIDGET_COLUMN_FLAG_ATTACHMENT = 6;
- public static final int WIDGET_COLUMN_MAILBOX_KEY = 7;
- public static final int WIDGET_COLUMN_SNIPPET = 8;
- public static final int WIDGET_COLUMN_ACCOUNT_KEY = 9;
- public static final int WIDGET_COLUMN_FLAGS = 10;
-
- private long mAccountId;
- private long mMailboxId;
-
- /**
- * Cursor data specifically for use by the Email widget. Contains a cursor of messages in
- * addition to a message count and account name. The later elements were opportunistically
- * placed in this cursor. We could have defined multiple loaders for these items.
- */
- static class WidgetCursor extends CursorWrapper {
- private final int mMessageCount;
- private final String mAccountName;
- private final String mMailboxName;
-
- public WidgetCursor(Cursor cursor, int messageCount, String accountName,
- String mailboxName) {
- super(cursor);
- mMessageCount = messageCount;
- mAccountName = accountName;
- mMailboxName = mailboxName;
- }
-
- /**
- * Gets the count to be shown on the widget header. If the currently viewed mailbox ID is
- * not {@link Mailbox#QUERY_ALL_FAVORITES}, it is the unread count, which is different from
- * number of records returned by {@link #getCount()}.
- */
- public int getMessageCount() {
- return mMessageCount;
- }
- /** Gets the display name of the account */
- public String getAccountName() {
- return mAccountName;
- }
- /** Gets the display name of the mailbox */
- public String getMailboxName() {
- return mMailboxName;
- }
- }
-
- private final Context mContext;
-
- EmailWidgetLoader(Context context) {
- super(context, Message.CONTENT_URI, WIDGET_PROJECTION, null,
- null, SORT_TIMESTAMP_DESCENDING);
- mContext = context;
- }
-
- @Override
- public Cursor loadInBackground() {
- final Cursor messagesCursor = super.loadInBackground();
-
- // Reset the notification Uri to our Message table notifier URI
- messagesCursor.setNotificationUri(mContext.getContentResolver(), Message.NOTIFIER_URI);
-
- final int messageCount;
- if (mMailboxId != Mailbox.QUERY_ALL_FAVORITES) {
- String selection = "(" + getSelection() + " ) AND " + MessageColumns.FLAG_READ + " = 0";
- messageCount = EmailContent.count(mContext, Message.CONTENT_URI, selection,
- getSelectionArgs());
- } else {
- // Just use the number of all messages shown.
- messageCount = messagesCursor.getCount();
- }
- Account account = Account.restoreAccountWithId(mContext, mAccountId);
- final String accountName;
- if (account != null) {
- accountName = account.mDisplayName;
- } else {
- if (mAccountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- int accountCount = EmailContent.count(mContext, Account.CONTENT_URI);
- Resources res = mContext.getResources();
- String countString =
- res.getQuantityString(R.plurals.picker_combined_view_account_count,
- accountCount, accountCount);
- accountName = res.getString(R.string.picker_combined_view_fmt, countString);
- } else {
- // TODO What to use here? "unknown"? Account is real, but, doesn't exist.
- accountName = null;
- }
- }
- final String mailboxName;
- if (mMailboxId > 0) {
- Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, mMailboxId);
- if (mailbox != null) {
- mailboxName = mailbox.mDisplayName; // regular mailbox
- } else {
- // TODO What use here? "unknown"? Mailbox is "real", but, doesn't exist.
- mailboxName = null;
- }
- } else {
- if (mMailboxId == Mailbox.QUERY_ALL_INBOXES) {
- mailboxName = mContext.getString(R.string.picker_mailbox_name_all_inbox);
- } else { // default to all unread for the account's inbox
- mailboxName = mContext.getString(R.string.picker_mailbox_name_all_unread);
- }
- }
-
- return new WidgetCursor(messagesCursor, messageCount, accountName, mailboxName);
- }
-
- /**
- * Stop any pending load, reset selection parameters, and start loading.
- *
- * Must be called from the UI thread
- *
- * @param accountId The ID of the account. May be {@link Account#ACCOUNT_ID_COMBINED_VIEW}.
- * @param mailboxId The mailbox to load; may either be a real mailbox or the pseudo mailbox
- * {@link Mailbox#QUERY_ALL_INBOXES} or {@link Mailbox#QUERY_ALL_UNREAD}. If it's
- * neither of these pseudo mailboxes, {@link Mailbox#QUERY_ALL_UNREAD} will be used.
- */
- void load(long accountId, long mailboxId) {
- reset();
- mAccountId = accountId;
- mMailboxId = mailboxId;
- setSelectionAndArgs();
- startLoading();
- }
-
- /** Sets the loader's selection and arguments depending upon the account and mailbox */
- private void setSelectionAndArgs() {
- if (mAccountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
- if (mMailboxId == Mailbox.QUERY_ALL_INBOXES) {
- setSelection(Message.ALL_INBOX_SELECTION);
- } else { // default to all unread
- setSelection(Message.ALL_UNREAD_SELECTION);
- }
- setSelectionArgs(null);
- } else {
- if (mMailboxId > 0L) {
- // Simple mailbox selection
- setSelection(
- MessageColumns.ACCOUNT_KEY + "=? AND " +
- MessageColumns.MAILBOX_KEY + "=?");
- setSelectionArgs(
- new String[] { Long.toString(mAccountId), Long.toString(mMailboxId) });
- } else {
- if (mMailboxId == Mailbox.QUERY_ALL_INBOXES) {
- setSelection(Message.PER_ACCOUNT_INBOX_SELECTION);
- } else { // default to all unread for the account's inbox
- setSelection(Message.PER_ACCOUNT_UNREAD_SELECTION);
- }
- setSelectionArgs(new String[] { Long.toString(mAccountId) });
- }
- }
- }
-}
diff --git a/src/com/android/email/widget/WidgetConfiguration.java b/src/com/android/email/widget/WidgetConfiguration.java
deleted file mode 100644
index 34d260ae1..000000000
--- a/src/com/android/email/widget/WidgetConfiguration.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.widget;
-
-import android.app.Activity;
-import android.appwidget.AppWidgetManager;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.view.View.OnClickListener;
-
-import com.android.email.Email;
-import com.android.email.R;
-import com.android.email.activity.ShortcutPickerFragment.AccountShortcutPickerFragment;
-import com.android.email.activity.ShortcutPickerFragment.MailboxShortcutPickerFragment;
-import com.android.email.activity.ShortcutPickerFragment.PickerCallback;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.HostAuth;
-import com.android.emailcommon.utility.Utility;
-
-/**
- * Activity to configure the Email widget.
- */
-public class WidgetConfiguration extends Activity implements OnClickListener, PickerCallback {
- /** ID of the newly created application widget */
- private int mAppWidgetId;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setResult(RESULT_CANCELED);
- if (Email.DEBUG) {
- Log.i(Logging.LOG_TAG, "WidgetConfiguration initiated");
- }
- if (!AppWidgetManager.ACTION_APPWIDGET_CONFIGURE.equals(getIntent().getAction())) {
- // finish() immediately if we aren't supposed to be here
- finish();
- return;
- }
-
- Intent intent = getIntent();
- Bundle extras = intent.getExtras();
- if (extras != null) {
- mAppWidgetId = extras.getInt(
- AppWidgetManager.EXTRA_APPWIDGET_ID,
- AppWidgetManager.INVALID_APPWIDGET_ID);
- }
-
- // Set handler for the "cancel" button
- setContentView(R.layout.account_shortcut_picker);
- findViewById(R.id.cancel).setOnClickListener(this);
-
- if (getFragmentManager().findFragmentById(R.id.shortcut_list) == null) {
- // Load the account picking fragment if we haven't created a fragment yet
- // NOTE: do not add to history as this will be the first fragment in the flow
- AccountShortcutPickerFragment fragment = new AccountShortcutPickerFragment();
- getFragmentManager().beginTransaction().add(R.id.shortcut_list, fragment).commit();
- }
- }
-
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.cancel:
- finish();
- break;
- }
- }
-
- @Override
- public Integer buildFilter(Account account) {
- if (!Account.isNormalAccount(account.mId)) {
- return MailboxShortcutPickerFragment.FILTER_INBOX_ONLY
- | MailboxShortcutPickerFragment.FILTER_ALLOW_UNREAD;
- }
-
- // We can't synced non-Inbox mailboxes for non-EAS accounts, so they don't sync
- // right now and it doesn't make sense to put them in a widget.
- return HostAuth.SCHEME_EAS.equals(account.getProtocol(this))
- ? MailboxShortcutPickerFragment.FILTER_ALLOW_ALL
- : MailboxShortcutPickerFragment.FILTER_INBOX_ONLY;
- }
-
- @Override
- public void onSelected(Account account, long mailboxId) {
- setupWidget(account, mailboxId);
- finish();
- }
-
- @Override
- public void onMissingData(boolean missingAccount, boolean missingMailbox) {
- if (Email.DEBUG) {
- Log.i(Logging.LOG_TAG, "WidgetConfiguration exited abnormally. Probably no accounts.");
- }
- Utility.showToast(this, R.string.widget_no_accounts);
- finish();
- }
-
- private void setupWidget(Account account, long mailboxId) {
- // save user selected preferences & create initial widget view
- WidgetManager.saveWidgetPrefs(this, mAppWidgetId, account.mId, mailboxId);
- WidgetManager.getInstance().getOrCreateWidget(this, mAppWidgetId).start();
-
- // Return "OK" result; make sure we pass along the original widget ID
- Intent resultValue = new Intent();
- resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
- setResult(RESULT_OK, resultValue);
- }
-}
diff --git a/src/com/android/email/widget/WidgetManager.java b/src/com/android/email/widget/WidgetManager.java
deleted file mode 100644
index d2cb17133..000000000
--- a/src/com/android/email/widget/WidgetManager.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.email.widget;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.util.Log;
-
-import com.android.email.Email;
-import com.android.emailcommon.Logging;
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.Mailbox;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Class that maintains references to all widgets.
- */
-public class WidgetManager {
- private static final String PREFS_NAME = "com.android.email.widget.WidgetManager";
- private static final String ACCOUNT_ID_PREFIX = "accountId_";
- private static final String MAILBOX_ID_PREFIX = "mailboxId_";
-
- private final static WidgetManager sInstance = new WidgetManager();
-
- // Widget ID -> Widget
- private final static Map<Integer, EmailWidget> mWidgets =
- new ConcurrentHashMap<Integer, EmailWidget>();
-
- private WidgetManager() {
- }
-
- public static WidgetManager getInstance() {
- return sInstance;
- }
-
- public synchronized void createWidgets(Context context, int[] widgetIds) {
- for (int widgetId : widgetIds) {
- getOrCreateWidget(context, widgetId);
- }
- }
-
- public synchronized void deleteWidgets(Context context, int[] widgetIds) {
- for (int widgetId : widgetIds) {
- // Find the widget in the map
- final EmailWidget widget = WidgetManager.getInstance().get(widgetId);
- if (widget != null) {
- // Stop loading and remove the widget from the map
- widget.onDeleted();
- }
- remove(context, widgetId);
- }
- }
-
- public synchronized void updateWidgets(Context context, int[] widgetIds) {
- for (int widgetId : widgetIds) {
- // Find the widget in the map
- final EmailWidget widget = WidgetManager.getInstance().get(widgetId);
- if (widget != null) {
- widget.reset();
- } else {
- getOrCreateWidget(context, widgetId);
- }
- }
- }
-
- public synchronized EmailWidget getOrCreateWidget(Context context, int widgetId) {
- EmailWidget widget = WidgetManager.getInstance().get(widgetId);
- if (widget == null) {
- if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
- Log.d(EmailWidget.TAG, "Create email widget; ID: " + widgetId);
- }
- widget = new EmailWidget(context, widgetId);
- put(widgetId, widget);
- widget.start();
- }
- return widget;
- }
-
- private EmailWidget get(int widgetId) {
- return mWidgets.get(widgetId);
- }
-
- private void put(int widgetId, EmailWidget widget) {
- mWidgets.put(widgetId, widget);
- }
-
- private void remove(Context context, int widgetId) {
- mWidgets.remove(widgetId);
- WidgetManager.removeWidgetPrefs(context, widgetId);
- }
-
- public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
- int n = 0;
- for (EmailWidget widget : mWidgets.values()) {
- writer.println("Widget #" + (++n));
- writer.println(" " + widget.toString());
- }
- }
-
- /** Saves shared preferences for the given widget */
- static void saveWidgetPrefs(Context context, int appWidgetId, long accountId, long mailboxId) {
- SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
- prefs.edit()
- .putLong(ACCOUNT_ID_PREFIX + appWidgetId, accountId)
- .putLong(MAILBOX_ID_PREFIX + appWidgetId, mailboxId)
- .commit(); // preferences must be committed before we return
- }
-
- /** Removes shared preferences for the given widget */
- static void removeWidgetPrefs(Context context, int appWidgetId) {
- SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
- SharedPreferences.Editor editor = prefs.edit();
- for (String key : prefs.getAll().keySet()) {
- if (key.endsWith("_" + appWidgetId)) {
- editor.remove(key);
- }
- }
- editor.apply(); // just want to clean up; don't care when preferences are actually removed
- }
-
- /**
- * Returns the saved account ID for the given widget. Otherwise, {@link Account#NO_ACCOUNT} if
- * the account ID was not previously saved.
- */
- static long loadAccountIdPref(Context context, int appWidgetId) {
- SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
- long accountId = prefs.getLong(ACCOUNT_ID_PREFIX + appWidgetId, Account.NO_ACCOUNT);
- return accountId;
- }
-
- /**
- * Returns the saved mailbox ID for the given widget. Otherwise, {@link Mailbox#NO_MAILBOX} if
- * the mailbox ID was not previously saved.
- */
- static long loadMailboxIdPref(Context context, int appWidgetId) {
- SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
- long mailboxId = prefs.getLong(MAILBOX_ID_PREFIX + appWidgetId, Mailbox.NO_MAILBOX);
- return mailboxId;
- }
-}
diff --git a/tests/Android.mk b/tests/Android.mk
deleted file mode 100644
index 29f51720c..000000000
--- a/tests/Android.mk
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2008, The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# We only want this apk build for tests.
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_JAVA_LIBRARIES := android.test.runner
-
-# Include all test java files.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-# Notice that we don't have to include the src files of Email because, by
-# running the tests using an instrumentation targeting Email, we
-# automatically get all of its classes loaded into our environment.
-
-LOCAL_PACKAGE_NAME := EmailTests
-
-LOCAL_INSTRUMENTATION_FOR := Email
-
-include $(BUILD_PACKAGE)